summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Bícha <jbicha@ubuntu.com>2023-09-18 08:58:28 -0400
committerJeremy Bícha <jbicha@ubuntu.com>2023-09-18 08:58:28 -0400
commit36a44c6d096210b56c8c2ea82d47e818cf38ee0b (patch)
treebf899d5eff24f61337a24f62408292a23bdc8c79
Import gnome-music_45.0.orig.tar.xz
[dgit import orig gnome-music_45.0.orig.tar.xz]
-rw-r--r--.gitignore86
-rw-r--r--.gitlab-ci.yml38
-rw-r--r--.gitlab/issue_templates/default.md40
-rw-r--r--.gitmodules3
-rw-r--r--LICENSE351
-rw-r--r--NEWS2585
-rw-r--r--README.md213
-rw-r--r--data/icons/hicolor/scalable/apps/org.gnome.Music.Devel.svg108
-rw-r--r--data/icons/hicolor/scalable/apps/org.gnome.Music.svg36
-rw-r--r--data/icons/hicolor/symbolic/apps/org.gnome.Music-symbolic.svg28
-rw-r--r--data/icons/music-artist-symbolic.svg1
-rw-r--r--data/icons/music-playlist-symbolic.svg1
-rw-r--r--data/icons/welcome-music.svg551
-rw-r--r--data/meson.build84
-rw-r--r--data/org.gnome.Music.appdata.xml.in.in201
-rw-r--r--data/org.gnome.Music.desktop.in.in13
-rw-r--r--data/org.gnome.Music.gresource.xml42
-rw-r--r--data/org.gnome.Music.gschema.xml42
-rw-r--r--data/screenshots/gnome-music-1.pngbin0 -> 811486 bytes
-rw-r--r--data/screenshots/gnome-music-2.pngbin0 -> 174805 bytes
-rw-r--r--data/screenshots/gnome-music-3.pngbin0 -> 252608 bytes
-rw-r--r--data/screenshots/gnome-music-4.pngbin0 -> 106184 bytes
-rw-r--r--data/style.css128
-rw-r--r--data/ui/AlbumCover.ui63
-rw-r--r--data/ui/AlbumCoverListItem.ui50
-rw-r--r--data/ui/AlbumWidget.ui142
-rw-r--r--data/ui/AlbumsView.ui38
-rw-r--r--data/ui/AppMenu.ui84
-rw-r--r--data/ui/ArtistAlbumsWidget.ui20
-rw-r--r--data/ui/ArtistSearchTile.ui50
-rw-r--r--data/ui/ArtistTile.ui30
-rw-r--r--data/ui/ArtistsView.ui27
-rw-r--r--data/ui/DiscBox.ui36
-rw-r--r--data/ui/DiscListItem.ui29
-rw-r--r--data/ui/EmptyView.ui48
-rw-r--r--data/ui/HeaderBar.ui92
-rw-r--r--data/ui/LastfmDialog.ui62
-rw-r--r--data/ui/PlayerToolbar.ui203
-rw-r--r--data/ui/PlaylistControls.ui129
-rw-r--r--data/ui/PlaylistDialog.ui234
-rw-r--r--data/ui/PlaylistDialogRow.ui28
-rw-r--r--data/ui/PlaylistTile.ui33
-rw-r--r--data/ui/PlaylistsView.ui25
-rw-r--r--data/ui/PlaylistsWidget.ui36
-rw-r--r--data/ui/SearchHeaderBar.ui45
-rw-r--r--data/ui/SearchView.ui212
-rw-r--r--data/ui/SelectionBarMenuButton.ui22
-rw-r--r--data/ui/SelectionToolbar.ui16
-rw-r--r--data/ui/SongListItem.ui72
-rw-r--r--data/ui/SongWidget.ui207
-rw-r--r--data/ui/SongWidgetMenu.ui23
-rw-r--r--data/ui/SongsView.ui27
-rw-r--r--data/ui/TwoLineTip.ui23
-rw-r--r--data/ui/Window.ui54
-rw-r--r--data/ui/help-overlay.ui111
-rw-r--r--gnome-music.doap32
-rwxr-xr-xgnome-music.in110
-rw-r--r--gnomemusic/__init__.py0
-rw-r--r--gnomemusic/about.py258
-rw-r--r--gnomemusic/albumart.py82
-rw-r--r--gnomemusic/application.py249
-rw-r--r--gnomemusic/artistart.py73
-rw-r--r--gnomemusic/asyncqueue.py120
-rw-r--r--gnomemusic/corealbum.py173
-rw-r--r--gnomemusic/coreartist.py142
-rw-r--r--gnomemusic/coredisc.py112
-rw-r--r--gnomemusic/coregrilo.py302
-rw-r--r--gnomemusic/coremodel.py522
-rw-r--r--gnomemusic/coreselection.py50
-rw-r--r--gnomemusic/coresong.py189
-rw-r--r--gnomemusic/coverpaintable.py215
-rw-r--r--gnomemusic/embeddedart.py230
-rw-r--r--gnomemusic/fileexistsasync.py62
-rw-r--r--gnomemusic/griloartqueue.py104
-rw-r--r--gnomemusic/grilowrappers/__init__.py0
-rw-r--r--gnomemusic/grilowrappers/grlsearchwrapper.py111
-rw-r--r--gnomemusic/grilowrappers/grltrackerplaylists.py1168
-rw-r--r--gnomemusic/grilowrappers/grltrackerwrapper.py1331
-rw-r--r--gnomemusic/gstplayer.py431
-rw-r--r--gnomemusic/inhibitsuspend.py84
-rw-r--r--gnomemusic/mediaartloader.py119
-rw-r--r--gnomemusic/mpris.py876
-rw-r--r--gnomemusic/musiclogger.py105
-rw-r--r--gnomemusic/notificationmanager.py71
-rw-r--r--gnomemusic/pauseonsuspend.py132
-rw-r--r--gnomemusic/player.py660
-rw-r--r--gnomemusic/playlisttoast.py75
-rw-r--r--gnomemusic/scrobbler.py479
-rw-r--r--gnomemusic/search.py47
-rw-r--r--gnomemusic/songart.py79
-rw-r--r--gnomemusic/songtoast.py85
-rw-r--r--gnomemusic/storeart.py167
-rw-r--r--gnomemusic/texturecache.py172
-rw-r--r--gnomemusic/trackerwrapper.py305
-rw-r--r--gnomemusic/utils.py213
-rw-r--r--gnomemusic/views/__init__.py0
-rw-r--r--gnomemusic/views/albumsview.py262
-rw-r--r--gnomemusic/views/artistsview.py160
-rw-r--r--gnomemusic/views/emptyview.py149
-rw-r--r--gnomemusic/views/playlistsview.py162
-rw-r--r--gnomemusic/views/searchview.py401
-rw-r--r--gnomemusic/views/songsview.py269
-rw-r--r--gnomemusic/widgets/__init__.py0
-rw-r--r--gnomemusic/widgets/aboutdialog.py35
-rw-r--r--gnomemusic/widgets/albumcover.py115
-rw-r--r--gnomemusic/widgets/albumwidget.py341
-rw-r--r--gnomemusic/widgets/appmenu.py82
-rw-r--r--gnomemusic/widgets/artistalbumswidget.py119
-rw-r--r--gnomemusic/widgets/artistsearchtile.py102
-rw-r--r--gnomemusic/widgets/artisttile.py82
-rw-r--r--gnomemusic/widgets/discbox.py116
-rw-r--r--gnomemusic/widgets/headerbar.py259
-rw-r--r--gnomemusic/widgets/lastfmdialog.py77
-rw-r--r--gnomemusic/widgets/playertoolbar.py209
-rw-r--r--gnomemusic/widgets/playlistcontrols.py186
-rw-r--r--gnomemusic/widgets/playlistdialog.py137
-rw-r--r--gnomemusic/widgets/playlistdialogrow.py53
-rw-r--r--gnomemusic/widgets/playlistswidget.py137
-rw-r--r--gnomemusic/widgets/playlisttile.py56
-rw-r--r--gnomemusic/widgets/searchheaderbar.py215
-rw-r--r--gnomemusic/widgets/selectiontoolbar.py57
-rw-r--r--gnomemusic/widgets/smoothscale.py193
-rw-r--r--gnomemusic/widgets/songwidget.py337
-rw-r--r--gnomemusic/widgets/songwidgetmenu.py140
-rw-r--r--gnomemusic/widgets/starimage.py74
-rw-r--r--gnomemusic/widgets/twolinetip.py49
-rw-r--r--gnomemusic/window.py507
-rw-r--r--gnomemusic/windowplacement.py90
-rw-r--r--help/C/figures/org.gnome.Music.svg36
-rw-r--r--help/C/index.page34
-rw-r--r--help/C/introduction.page26
-rw-r--r--help/C/legal.xml8
-rw-r--r--help/C/play-music.page40
-rw-r--r--help/C/playlist-create-albums.page81
-rw-r--r--help/C/playlist-create-artists.page57
-rw-r--r--help/C/playlist-create-songs.page55
-rw-r--r--help/C/playlist-delete.page39
-rw-r--r--help/C/playlist-remove-songs.page42
-rw-r--r--help/C/playlist-repeat.page35
-rw-r--r--help/C/playlist-shuffle.page27
-rw-r--r--help/C/search.page28
-rw-r--r--help/LINGUAS23
-rw-r--r--help/ca/ca.po459
-rw-r--r--help/cs/cs.po454
-rw-r--r--help/da/da.po450
-rw-r--r--help/de/de.po462
-rw-r--r--help/el/el.po466
-rw-r--r--help/es/es.po468
-rw-r--r--help/eu/eu.po411
-rw-r--r--help/fr/fr.po470
-rw-r--r--help/gl/gl.po464
-rw-r--r--help/hr/hr.po449
-rw-r--r--help/hu/hu.po460
-rw-r--r--help/id/id.po446
-rw-r--r--help/it/it.po448
-rw-r--r--help/ko/ko.po439
-rw-r--r--help/meson.build17
-rw-r--r--help/nl/nl.po453
-rw-r--r--help/pl/pl.po451
-rw-r--r--help/pt_BR/pt_BR.po459
-rw-r--r--help/ro/ro.po453
-rw-r--r--help/ru/ru.po459
-rw-r--r--help/sv/sv.po444
-rw-r--r--help/tr/tr.po456
-rw-r--r--help/uk/uk.po458
-rw-r--r--help/zh_CN/zh_CN.po418
-rw-r--r--meson.build120
-rw-r--r--meson_options.txt9
-rw-r--r--org.gnome.Music.json147
-rw-r--r--po/LINGUAS67
-rw-r--r--po/POTFILES.in45
-rw-r--r--po/POTFILES.skip4
-rw-r--r--po/ab.po4683
-rw-r--r--po/af.po270
-rw-r--r--po/an.po471
-rw-r--r--po/ar.po384
-rw-r--r--po/as.po399
-rw-r--r--po/be.po659
-rw-r--r--po/bg.po584
-rw-r--r--po/bs.po445
-rw-r--r--po/ca.po584
-rw-r--r--po/ca@valencia.po628
-rw-r--r--po/cs.po584
-rw-r--r--po/da.po693
-rw-r--r--po/de.po747
-rw-r--r--po/el.po821
-rw-r--r--po/en_GB.po816
-rw-r--r--po/eo.po683
-rw-r--r--po/es.po858
-rw-r--r--po/et.po232
-rw-r--r--po/eu.po694
-rw-r--r--po/fa.po785
-rw-r--r--po/fi.po754
-rw-r--r--po/fr.po621
-rw-r--r--po/fur.po777
-rw-r--r--po/fy.po622
-rw-r--r--po/ga.po226
-rw-r--r--po/gd.po652
-rw-r--r--po/gl.po693
-rw-r--r--po/he.po799
-rw-r--r--po/hr.po748
-rw-r--r--po/hu.po579
-rw-r--r--po/id.po741
-rw-r--r--po/is.po758
-rw-r--r--po/it.po591
-rw-r--r--po/ja.po645
-rw-r--r--po/ka.po576
-rw-r--r--po/kk.po766
-rw-r--r--po/kn.po293
-rw-r--r--po/ko.po755
-rw-r--r--po/lt.po786
-rw-r--r--po/lv.po744
-rw-r--r--po/meson.build1
-rw-r--r--po/mjw.po584
-rw-r--r--po/ml.po661
-rw-r--r--po/ms.po616
-rw-r--r--po/nb.po596
-rw-r--r--po/ne.po643
-rw-r--r--po/nl.po788
-rw-r--r--po/oc.po753
-rw-r--r--po/pa.po792
-rw-r--r--po/pl.po584
-rw-r--r--po/pt.po781
-rw-r--r--po/pt_BR.po587
-rw-r--r--po/ro.po776
-rw-r--r--po/ru.po654
-rw-r--r--po/sk.po798
-rw-r--r--po/sl.po939
-rw-r--r--po/sr.po791
-rw-r--r--po/sr@latin.po650
-rw-r--r--po/sv.po776
-rw-r--r--po/ta.po273
-rw-r--r--po/te.po339
-rw-r--r--po/tg.po531
-rw-r--r--po/tr.po578
-rw-r--r--po/uk.po695
-rw-r--r--po/vi.po742
-rw-r--r--po/zh_CN.po786
-rw-r--r--po/zh_HK.po325
-rw-r--r--po/zh_TW.po788
-rw-r--r--subprojects/.gitignore1
-rw-r--r--subprojects/grilo-plugins.wrap4
-rw-r--r--subprojects/grilo.wrap4
-rw-r--r--subprojects/shared-modules/CODEOWNERS21
-rw-r--r--subprojects/shared-modules/README.md38
-rw-r--r--subprojects/shared-modules/SDL/SDL-1.2.15.json40
-rw-r--r--subprojects/shared-modules/SDL/SDL_Pango-0.1.2-API-adds.patch118
-rw-r--r--subprojects/shared-modules/SDL/SDL_image-1.2.12.json19
-rw-r--r--subprojects/shared-modules/SDL/SDL_mixer-1.2.12.json22
-rw-r--r--subprojects/shared-modules/SDL/SDL_net-1.2.8.json19
-rw-r--r--subprojects/shared-modules/SDL/SDL_pango-0.1.2.json23
-rw-r--r--subprojects/shared-modules/SDL/SDL_ttf-2.0.11.json22
-rw-r--r--subprojects/shared-modules/SDL/sdl-check-for-SDL_VIDEO_X11_BACKINGSTORE.patch24
-rw-r--r--subprojects/shared-modules/SDL/sdl-libx11-build.patch59
-rw-r--r--subprojects/shared-modules/SDL/sdl12-compat.json14
-rw-r--r--subprojects/shared-modules/cld2/CMakeLists.txt155
-rw-r--r--subprojects/shared-modules/cld2/cld2.json24
-rw-r--r--subprojects/shared-modules/clutter/clutter.json69
-rw-r--r--subprojects/shared-modules/dbus-glib/dbus-glib.json23
-rw-r--r--subprojects/shared-modules/glew/glew.json30
-rw-r--r--subprojects/shared-modules/glu/glu-9.json12
-rw-r--r--subprojects/shared-modules/gtk2/arc-gtk2-theme-Replace-Inkscape-dependency-with-rsvg-convert.patch180
-rw-r--r--subprojects/shared-modules/gtk2/gtk2-common-themes.json250
-rw-r--r--subprojects/shared-modules/gtk2/gtk2-fix-crash-in-show-uri.patch30
-rw-r--r--subprojects/shared-modules/gtk2/gtk2-use-adwaita-theme.patch80
-rw-r--r--subprojects/shared-modules/gtk2/gtk2.json112
-rw-r--r--subprojects/shared-modules/gtk2/murrine-engine-fix-crash.patch12
-rw-r--r--subprojects/shared-modules/gudev/gudev.json33
-rw-r--r--subprojects/shared-modules/gzdoom/description.patch18
-rw-r--r--subprojects/shared-modules/gzdoom/gzdoom.json50
-rw-r--r--subprojects/shared-modules/intltool/intltool-0.51.json15
-rw-r--r--subprojects/shared-modules/intltool/intltool-perl5.26-regex-fixes.patch59
-rw-r--r--subprojects/shared-modules/lame/lame-3.99.5.json37
-rw-r--r--subprojects/shared-modules/lame/lame-ansi2knr2devnull.patch43
-rw-r--r--subprojects/shared-modules/lame/lame-gtk1-ac-directives.patch205
-rw-r--r--subprojects/shared-modules/lame/lame-msse.patch17
-rw-r--r--subprojects/shared-modules/lame/lame-tinfo.patch23
-rw-r--r--subprojects/shared-modules/libappindicator/Makefile10
-rw-r--r--subprojects/shared-modules/libappindicator/libappindicator-fix-crash-from-incorrect-signal-emission.patch74
-rw-r--r--subprojects/shared-modules/libappindicator/libappindicator-fix-crash-iterating-icon-themes.patch11
-rw-r--r--subprojects/shared-modules/libappindicator/libappindicator-ftbfs.patch20
-rw-r--r--subprojects/shared-modules/libappindicator/libappindicator-gtk2-12.10.json130
-rw-r--r--subprojects/shared-modules/libappindicator/libappindicator-gtk3-12.10.json130
-rw-r--r--subprojects/shared-modules/libappindicator/libappindicator-gtk3-introspection-12.10.json130
-rw-r--r--subprojects/shared-modules/libappindicator/libappindicator-no-python.patch888
-rw-r--r--subprojects/shared-modules/libappindicator/libappindicator.json.in130
-rw-r--r--subprojects/shared-modules/libcanberra/0001-gtk-Don-t-assume-all-GdkDisplays-are-GdkX11Displays-.patch123
-rw-r--r--subprojects/shared-modules/libcanberra/libcanberra.json35
-rw-r--r--subprojects/shared-modules/libmad/Provide-Thumb-2-alternative-code-for-MAD_F_MLN.diff34
-rw-r--r--subprojects/shared-modules/libmad/libmad-0.15.1b-cflags-O2.patch12
-rw-r--r--subprojects/shared-modules/libmad/libmad-0.15.1b-cflags.patch146
-rw-r--r--subprojects/shared-modules/libmad/libmad-0.15.1b-multiarch.patch37
-rw-r--r--subprojects/shared-modules/libmad/libmad-0.15.1b-ppc.patch13
-rw-r--r--subprojects/shared-modules/libmad/libmad.json49
-rw-r--r--subprojects/shared-modules/libmad/libmad.thumb.diff12
-rw-r--r--subprojects/shared-modules/libmad/mad.pc11
-rw-r--r--subprojects/shared-modules/libsecret/libsecret.json23
-rw-r--r--subprojects/shared-modules/libusb/libusb.json19
-rw-r--r--subprojects/shared-modules/linux-audio/dssi.json29
-rw-r--r--subprojects/shared-modules/linux-audio/fftw3f-static.json44
-rw-r--r--subprojects/shared-modules/linux-audio/fftw3f.json41
-rw-r--r--subprojects/shared-modules/linux-audio/fluidsynth2-static.json27
-rw-r--r--subprojects/shared-modules/linux-audio/fluidsynth2.json21
-rw-r--r--subprojects/shared-modules/linux-audio/jack2.json23
-rw-r--r--subprojects/shared-modules/linux-audio/ladspa.json17
-rw-r--r--subprojects/shared-modules/linux-audio/lash.json41
-rw-r--r--subprojects/shared-modules/linux-audio/libinstpatch.json17
-rw-r--r--subprojects/shared-modules/linux-audio/liblo-static.json25
-rw-r--r--subprojects/shared-modules/linux-audio/liblo.json17
-rw-r--r--subprojects/shared-modules/linux-audio/lilv.json100
-rw-r--r--subprojects/shared-modules/linux-audio/lrdf.json50
-rw-r--r--subprojects/shared-modules/linux-audio/lv2.json26
-rw-r--r--subprojects/shared-modules/linux-audio/patches/lash-0.5.3-no-static-lib.patch10
-rw-r--r--subprojects/shared-modules/linux-audio/patches/lash-configure.patch11
-rw-r--r--subprojects/shared-modules/linux-audio/patches/lash-gcc47.patch11
-rw-r--r--subprojects/shared-modules/linux-audio/patches/lash-linking.patch90
-rw-r--r--subprojects/shared-modules/linux-audio/patches/stk-install.sh54
-rw-r--r--subprojects/shared-modules/linux-audio/stk.json28
-rw-r--r--subprojects/shared-modules/lua5.1/lua-5.1.5-so.patch43
-rw-r--r--subprojects/shared-modules/lua5.1/lua-5.1.5.json38
-rw-r--r--subprojects/shared-modules/lua5.3/lua-5.3.5.json46
-rw-r--r--subprojects/shared-modules/lua5.3/lua.pc.in8
-rw-r--r--subprojects/shared-modules/lua5.3/makefile-add-liblua.so-rule.patch47
-rw-r--r--subprojects/shared-modules/lua5.4/lua-5.4.json44
-rw-r--r--subprojects/shared-modules/lua5.4/lua.pc.in8
-rw-r--r--subprojects/shared-modules/lua5.4/makefile-add-liblua.so-rule.patch42
-rw-r--r--subprojects/shared-modules/mac/mac.json19
-rw-r--r--subprojects/shared-modules/physfs/physfs.json18
-rw-r--r--subprojects/shared-modules/pygame/audiofile-gcc6.patch21
-rw-r--r--subprojects/shared-modules/pygame/fluidsynth-no-rawmidi.patch69
-rw-r--r--subprojects/shared-modules/pygame/portmidi-no-java.patch105
-rw-r--r--subprojects/shared-modules/pygame/pygame-1.9.6.json112
-rw-r--r--subprojects/shared-modules/pygtk/pygtk.json107
-rw-r--r--subprojects/shared-modules/pygtk/pygtk.patch39
-rw-r--r--subprojects/shared-modules/python2.7/python-2.7.json52
-rw-r--r--subprojects/shared-modules/qt4/disable-sslv3.patch54
-rw-r--r--subprojects/shared-modules/qt4/fixgcc11.patch11
-rw-r--r--subprojects/shared-modules/qt4/fixgcc9.patch31
-rw-r--r--subprojects/shared-modules/qt4/qt4-4.8.7-minimal.json118
-rw-r--r--subprojects/shared-modules/qt4/qt4-aarch64.patch514
-rw-r--r--subprojects/shared-modules/qt4/qt4-openssl-1.1.patch409
-rw-r--r--subprojects/shared-modules/smpeg/smpeg-0.4.5.json45
-rw-r--r--subprojects/shared-modules/smpeg/smpeg-am-prog-as.patch12
-rw-r--r--subprojects/shared-modules/smpeg/smpeg-export-mpegaudio-class.patch17
-rw-r--r--subprojects/shared-modules/smpeg/smpeg-gcc6.patch40
-rw-r--r--subprojects/shared-modules/smpeg/smpeg-no-gtk.patch37
-rw-r--r--subprojects/shared-modules/vorbisgain/0001-temp_files.patch75
-rw-r--r--subprojects/shared-modules/vorbisgain/0002-errno.patch33
-rw-r--r--subprojects/shared-modules/vorbisgain/0003-manpage.patch248
-rw-r--r--subprojects/shared-modules/vorbisgain/0004-vorbisgain_mtime.patch183
-rw-r--r--subprojects/shared-modules/vorbisgain/0005-double_fclose.patch21
-rw-r--r--subprojects/shared-modules/vorbisgain/0006-manpage_hyphens.patch56
-rw-r--r--subprojects/shared-modules/vorbisgain/0007-recursively_spelling.patch14
-rw-r--r--subprojects/shared-modules/vorbisgain/0008-manpage_recursion_mistake.patch23
-rw-r--r--subprojects/shared-modules/vorbisgain/0009-hardening.patch13
-rw-r--r--subprojects/shared-modules/vorbisgain/0010-fclose.patch13
-rw-r--r--subprojects/shared-modules/vorbisgain/README.md23
-rw-r--r--subprojects/shared-modules/vorbisgain/vorbisgain_0.37-2.json29
358 files changed, 87499 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..ff4b7f4c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,86 @@
+*~
+builddir/
+/*.bak
+/*.lo
+/*.o
+/*.orig
+/*.rej
+/*.tab.c
+/*~
+/.*.sw[nop]
+/.deps
+/.dirstamp
+/.gitignore
+/.libs
+/.mypy_cache
+/AUTHORS
+/ABOUT-NLS
+/GPATH
+/GRTAGS
+/GSYMS
+/GTAGS
+/ID
+/INSTALL
+/Makefile
+/Makefile.in
+/TAGS
+/_build
+/_libs
+/aclocal.m4
+/autom4te.cache
+/autoscan.log
+/compile
+/config.cache
+/config.guess
+/config.h
+/config.h.in
+/config.log
+/config.lt
+/config.rpath
+/config.status
+/config.status.lineno
+/config.sub
+/configure
+/configure.lineno
+/configure.scan
+/depcomp
+/install-sh
+/libtool
+/ltmain.sh
+/m4
+/missing
+/mkinstalldirs
+/po/*.gmo
+/po/*.mo
+/po/Makefile
+/po/Makefile.in
+/po/Makefile.in.in
+/po/POTFILES
+/po/gnome-music.pot
+/po/stamp-it
+/so_locations
+/stamp-h1
+/tags
+/gnome-music/*.pyc
+/gnome-music/Makefile
+/gnome-music/Makefile.in
+/py-compile
+*.tar.xz
+*.desktop
+*.gresource
+*.compiled
+data/Makefile
+data/Makefile.in
+*.patch
+*.pyc
+Makefile
+gnome-music
+*.valid
+/gnomemusic/Makefile.in
+/data/AboutDialog.ui
+/data/gnome-music.appdata.xml
+/help/Makefile.in
+/help/**/*.page
+/help/**/*.mo
+/help/**/*.stamp
+/help/**/legal.xml
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 00000000..5a22033a
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,38 @@
+include: 'https://gitlab.gnome.org/GNOME/citemplates/raw/master/flatpak/flatpak_ci_initiative.yml'
+
+stages:
+ - check
+ - build-flatpak
+ - deploy
+
+variables:
+ BUNDLE: "gnome-music-dev.flatpak"
+ GIT_SUBMODULE_STRATEGY: normal
+
+flatpak:
+ extends: .flatpak
+ stage: build-flatpak
+ variables:
+ APP_ID: "org.gnome.Music.Devel"
+ FLATPAK_MODULE: "gnome-music"
+ MANIFEST_PATH: "org.gnome.Music.json"
+ RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
+
+nightly:
+ extends: .publish_nightly
+ dependencies:
+ - flatpak
+
+flake8:
+ stage: check
+ image: registry.fedoraproject.org/fedora:latest
+ script:
+ - dnf install -y python3-flake8
+ - flake8 --ignore E402,W503 --show-source gnomemusic/
+
+mypy:
+ stage: check
+ image: registry.fedoraproject.org/fedora:latest
+ script:
+ - dnf install -y python3-mypy
+ - mypy --ignore-missing-imports --disallow-incomplete-defs gnomemusic
diff --git a/.gitlab/issue_templates/default.md b/.gitlab/issue_templates/default.md
new file mode 100644
index 00000000..e312ce03
--- /dev/null
+++ b/.gitlab/issue_templates/default.md
@@ -0,0 +1,40 @@
+## Description
+
+[Description of the bug or feature]
+
+
+## Steps To Reproduce
+
+- Step 1
+- Step 2
+- Step 3
+
+
+## Expected Behaviour
+
+[What you expected to happen]
+
+
+## Actual Behaviour
+
+[What actually happened]
+
+
+## Specifications
+
+Gnome Music Version:
+
+Desktop Environment:
+
+Wayland or Xorg:
+
+Flatpak or Native:
+
+Tracker Version:
+
+Grilo Version:
+
+
+## Additional Information
+
+
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..6f6409cc
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "subprojects/shared-modules"]
+ path = subprojects/shared-modules
+ url = https://github.com/flathub/shared-modules.git
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..2dc06fe3
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,351 @@
+# This GPL license have a exception clause added, see at the bottom of file
+# for details.
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
+The GNOME Music authors hereby grant permission for non-GPL compatible
+GStreamer plugins to be used and distributed together with GStreamer and
+GNOME Music. This permission is above and beyond the permissions granted
+by the GPL license by which GNOME Music is covered. If you modify this
+code, you may extend this exception to your version of the code, but you
+are not obligated to do so. If you do not wish to do so, delete this
+exception statement from your version.
+
diff --git a/NEWS b/NEWS
new file mode 100644
index 00000000..72beeed6
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,2585 @@
+Overview of changes in 45.0
+===========================
+
+• Minor quality of life improvements
+
+Thanks to our contributors this release:
+ Carlos Garnacho
+ Jean Felder
+ Harold Knowlden
+ Marinus Schraal
+
+Updated or added translations:
+ Abkhazian
+ Romanian
+ Italian
+ Turkish
+ British English
+ French
+ Hungarian
+ German
+ Hebrew
+ Ukrainian
+ Greek
+ Slovenian
+ Belarusian
+ Russian
+ Portuguese
+ Chinese (China)
+ Polish
+ Finnish
+ Spanish
+ Indonesian
+ Galician
+ Basque
+ Occitan
+ Georgian
+ Kazakh
+ Swedish
+ Czech
+ Punjabi
+ Korean
+ Dutch
+ Lithuanian
+ Danish
+ Catalan
+ Latvian
+
+
+Overview of changes in 44.0
+===========================
+
+• Update appdata for the 44.0 release
+
+Overview of changes in 44.rc
+============================
+
+• Shortcuts menu cleanups
+• Misc focus fixes in album widgets
+• Decrease memory usage in SongsView
+
+Bugs Fixed:
+ SongView popup is a memory hog (#495)
+ Shuffle on/off mixup (#543)
+ Default template for issues (#525)
+
+Thanks to our contributors this release:
+ Andre Klapper
+ Automeris Naranja
+ Ezike Ebuka
+ Jean Felder
+ Marinus Schraal
+ Sabri Ünal
+
+
+Overview of changes in 44.beta
+==============================
+
+• Make shuffle shuffle again
+• Fix time display in RTL languages
+• Port to soup 3
+• Port about to AdwAboutWindow
+• No longer mismatch art on scrolling
+• Fix async queue block on fresh art retrieval
+• Use new GNOME Settings app id in flatpak
+• Fix welcome image rendering
+
+Bugs fixed:
+ Rework ArtStack to handle cycling widgets better (#500)
+ Shuffle broken in Music 42 (#515)
+ Time is reversed in RTL (#509)
+
+Thanks to our contributors this release:
+ Carlos Garnacho
+ Christopher Davis
+ Georges Basile Stavracas Neto
+ Jean Felder
+ Marinus Schraal
+ Yosef Or Boczko
+
+Updated or added translations:
+ Abkhazian
+ Basque
+ Belarusian
+ Brazilian Portuguese
+ Bulgarian
+ Catalan
+ Chinese (China)
+ Chinese (Taiwan)
+ Croatian
+ Czech
+ Danish
+ Dutch
+ Finnish
+ French
+ Friulian
+ Galician
+ Georgian
+ German
+ Greek
+ Hebrew
+ Hungarian
+ Icelandic
+ Indonesian
+ Kazakh
+ Korean
+ Latvian
+ Lithuanian
+ Nepali
+ Occitan
+ Persian
+ Polish
+ Portuguese
+ Russian
+ Serbian
+ Slovak
+ Slovenian
+ Spanish
+ Swedish
+ Turkish
+ Ukrainian
+
+
+Overview of changes in 42.0
+===========================
+
+• GTK-4 regression fixes
+
+Bugs fixed:
+ App title untranslated (#510)
+
+Thanks to our contributors this release:
+ Fabian Bornschein
+ Georges Basile Stavracas Neto
+ Jean Felder
+ Marinus Schraal
+ Sophie Herold
+
+Updated translations:
+ Ukrainian
+ Portuguese
+ Brazilian Portuguese
+ Indonesian
+ Catalan
+ Russian
+ Chinese (China)
+ Lithuanian
+ Hebrew
+ Czech
+ Persian
+ French
+ Turkish
+ Finnish
+ Spanish
+ Galician
+ Slovak
+ Slovenian
+ Polish
+ Basque
+ Swedish
+ Korean
+ Croatian
+ Danish
+ Bulgarian
+ Hungarian
+ Kazakh
+ Japanese
+ Serbian
+ German
+ Occitan
+ Norwegian Bokmål
+ Italian
+
+
+Overview of changes in 42.beta
+==============================
+
+• Port to GTK-4
+• Dark mode switching
+
+Bugs fixed:
+ Fix slow startup (!923)
+
+Thanks to our contributors this release:
+ Christopher Davis
+ Jakub Steiner
+ Jean Felder
+ Koushik Sahu
+ Marinus Schraal
+ Michael Catanzaro
+ Sam Hewitt
+ Sophie Herold
+
+Updated translations:
+ Danish
+ Icelandic
+ Swedish
+ Russian
+ Indonesian
+ Catalan
+ Friulian
+ Latvian
+ Frisian
+ Bulgarian
+ Serbian
+ Vietnamese
+
+
+Overview of changes in 41.0
+===========================
+
+Updated translations:
+ Basque
+ Spanish
+ Croatian
+ German
+ Occitan
+ Danish
+ Polish
+ Hungarian
+ Hebrew
+ Dutch
+ Belarusian
+ Turkish
+
+Overview of changes in 41.rc
+============================
+
+• Touch-ups for the new design
+• Async improvements
+
+Bugs fixed:
+ Fix duplicated playlist song removal (#469)
+ Fix flowbox selection state (#460)
+
+Thanks to our contributors this release:
+ Marinus Schraal
+ Mpho Jele
+
+Updated translations:
+ Indonesian
+ Ukrainian
+ Swedish
+ Czech
+ Spanish
+ Basque
+ Catalan
+ Brazilian Portuguese
+ Galician
+ Finnish
+ British English
+ Kazakh
+ Slovenian
+ Slovak
+ Frisian
+ French
+ Korean
+ Persian
+ Greek
+ Lithuanian
+ Romanian
+ Chinese (China)
+
+Overview of changes in 41.beta
+==============================
+
+• Implemented much of the new design mockups
+• Update initial state art
+
+Thanks to our contributors this release:
+ Christopher Davis
+ Georges Basile Stavracas Neto
+ Jakub Steiner
+ Jean Felder
+ Lucy Coleclough
+ Marinus Schraal
+ Rafael Coelho
+ Sabri Ünal
+ Vineet Reddy
+
+Updated translations:
+ Vietnamese
+ Hebrew
+ Dutch
+ Ukrainian
+ Swedish
+ Occitan
+ Spanish
+ Indonesian
+ Russian
+ Slovenian
+ Romanian
+ Brazilian Portuguese
+ German
+ Turkish
+ Catalan
+ Friulian
+ Chinese (China)
+ Portuguese
+
+Added translation:
+ Frisian
+
+
+Overview of changes in 40.0
+===========================
+
+• Update appdata for the 40.0 release
+
+Overview of changes in 40.rc
+============================
+
+• Improve startup loading
+• Misc playlist handling fixes
+• Use publication date instead of creation date for songs
+
+Bugs fixed:
+ Scrobbling crash (#412, !769)
+ Fix artist queries to retrieve art (!773)
+ Ignore redundant Tracker delete events (!781)
+ Fix album selection checkboxes style (#414)
+ Fix playlist deletion (!793, !813)
+ adding songs to favorite crashes the app (#441)
+ GNOME Music crashes during startup: discbox is None (#430)
+ Crash when creating a playlist containing a quotation mark (#447)
+
+Thanks to our contributors this release:
+ James A. Baker
+ Jean Felder
+ Marinus Schraal
+ Yann Delaby
+
+Updated translation:
+ British English
+ Catalan
+ Chinese (Taiwan)
+ Danish
+ Friulian
+ Galician
+ Hebrew
+ Norwegian Bokmål
+ Punjabi
+ Romanian
+ Slovak
+
+Overview of changes in 3.38.0
+=============================
+
+Updated translations:
+ Danish
+ Greek
+ Hungarian
+ Italian
+ Latvian
+ Portuguese
+
+Overview of changes in 3.37.92
+==============================
+
+* Port to Tracker 3
+* Art retrieval complete rework
+* Flatpak cleanups and updates
+
+Bugs fixed:
+ gnome-music gets stuck when next button is pressed when current song is about to finish (#375)
+ Selection mode search doesn't work (#405)
+ Selecting an album in albums view in selection mode randomly deselects other albums (#406)
+ Selection mode only works for artists during search (#407)
+ Music crashed if gnome-online-accounts is unavailable (#410)
+ MPRIS playlist fixes (!741)
+ Gracefully handle locale.{bind,}textdomain not being available (!735)
+
+Thanks to our contributors this release:
+ Adam Blanchet
+ Carlos Garnacho
+ Chinmay Gurjar
+ Jean Felder
+ Marinus Schraal
+ Piotr Drąg
+ Rasmus Thomsen
+ Sam Thursfield
+ Simon McVittie
+
+Updated translation:
+ Basque
+ Brazilian Portuguese
+ Catalan
+ Chinese (China)
+ Croatian
+ Czech
+ Dutch
+ Finnish
+ French
+ Friulian
+ Galician
+ German
+ Indonesian
+ Japanese
+ Kazakh
+ Korean
+ Lithuanian
+ Persian
+ Polish
+ Serbian
+ Slovak
+ Slovenian
+ Spanish
+ Swedish
+ Turkish
+ Ukrainian
+
+Overview of changes in 3.37.3
+=============================
+
+Bugs fixed:
+ pauseonsuspend: Fix calls to MusicLogger.warning() (!724)
+ Duplication of menu bar (#387)
+ High CPU usage (#360)
+ Bind more SongWidget properties (!663)
+
+Thanks to our contributors this release:
+ Evan Nehring
+ Jean Felder
+ Marinus Schraal
+ Nils Reuße
+
+Updated translation:
+ Kazakh
+
+Overview of changes in 3.37.2
+=============================
+
+* Use Gtk.Template for all the Views and remove BaseView
+* Prefer Albumartist field for artist search
+* Change Artist view selection from artist to song
+* Extend Gtk.Template usage for Window
+* Deinitialize Grilo on shutdown
+* Music now explicitly depends on Pango 1.44 or above
+* Flatpak cleanups and updates
+* Various widgets style and code cleanups
+
+Bugs fixed:
+ Artist view should support music selection (#26)
+ In-app notifications need to be dismissable (#259)
+ Stop using show_all (#320)
+ Crash while searching due to bugs in searchview.py (#372)
+ Crash on start: object 'AttrFontFeatures' has no attribute 'new' (#374)
+ Wrong song count in favourite playlist (#376)
+ Please stop changing the module search path (#377)
+ Use libsoup for art retrieval (#378)
+ Music crashes on 'check_smart_playlist_change' call (#382)
+
+Thanks to our contributors this release:
+ Ashwani Singh Tanwar
+ Atharva Veer
+ Chinmay Gurjar
+ Erik Inkinen
+ Evan Nehring
+ Jean Felder
+ Marinus Schraal
+ Weifang Lai
+
+Added translations:
+ Ukrainian
+
+Updated translations:
+ Catalan
+ Chinese (China)
+ Chinese (Taiwan)
+ Hebrew
+ Norwegian Bokmål
+ Romanian
+ Russian
+ Slovak
+ Slovenian
+ Ukrainian
+
+Overview of changes in 3.36.0
+=============================
+
+Updated translations:
+ Italian
+ German
+ Dutch
+
+Overview of changes in 3.35.92
+==============================
+
+• Restore smart playlists update
+• Improve Tracker content tracking
+• Flatpak cleanups and updates
+
+Bugs fixed:
+ Properly load Grilo Tracker plugin (!650)
+ Stop a deleted playlist if it is playing (!661)
+ Misc playlists fixes (!654)
+ Flatpak: remove unused dleyna support (!644)
+ flatpak assorted fixes (!645)
+
+Thanks to our contributors this release:
+ Georges Basile Stavracas Neto
+ Jackson Campolattaro
+ Marinus Schraal
+ Jean Felder
+
+Updated translations:
+ Brazilian Portuguese
+ British English
+ Catalan
+ Chinese (Taiwan)
+ Croatian
+ Czech
+ Danish
+ Finnish
+ French
+ Galician
+ Hungarian
+ Korean
+ Indonesian
+ Lithuanian
+ Persian
+ Polish
+ Serbian
+ Spanish
+ Swedish
+ Turkish
+
+Overview of changes in 3.35.91.1
+================================
+
+Bug fixed:
+ Possible crash on warning (!643)
+
+Overview of changes in 3.35.91
+==============================
+
+• Use natural order for sorting
+• Expose Last.fm scrobbler in the UI
+• Add local runtime cache for scrobbling
+• Add GLib style logging and remove old logging and debug switch
+
+Bugs fixed:
+ Sort albums title containing digits numerically (#22)
+ PlaylistsView: select the next playlist on deletion (#359)
+ Expose scrobbling support (#218)
+ Switching to playlist gives an empty view (#348)
+ Use tabular numbers for song duration (!623)
+ Crash after select all items (#364)
+ Deleting an empty playlist crashes (#365)
+ Disable selection button in Playlist View while searching (#366)
+ Help overlay remove Ctrl+F1 shortcut (!643)
+
+Thanks to our contributors this release:
+ Use Alexander Mikhaylenko
+ Chinmay Gurjar
+ Jean Felder
+ Marinus Schraal
+ Sabri Ünal
+
+Translation added:
+ Malay
+
+Updated translations:
+ Greek
+ Indonesian
+ Spanish
+ Slovak
+ Chinese (Taiwan)
+ Finnish
+ Friulian
+ Brazilian Portuguese
+ Italian
+ Swedish
+ Croatian
+ Persian
+ Lithuanian
+ Japanese
+ Basque
+ French
+ Turkish
+ Czech
+ British English
+ Serbian
+ Galician
+
+Overview of changes in 3.35.3
+=============================
+
+* Improve Tracker content tracking
+* Update appdate screenshots
+
+Bugs fixed:
+ F1 key is not opening help page (#353)
+ Play on empty playlist crashes Music (#354,#355)
+ Crash when pressing Alt+Left in SearchView (#357)
+ Update the appdata screenshots (#327)
+
+Thanks to our contributors this release:
+ Ishaan Shah
+ Jean Felder
+ Marinus Schraal
+
+Added translations:
+ Basque
+ Indonesian
+
+Updated translations:
+ Chinese (Taiwan)
+ Ukranian
+ Brazilian Portuguese
+ Galician
+
+Overview of changes in 3.35.2
+=============================
+
+* Album Covers are now loaded on demand
+* Use MusicBrainz identifiers to download album covers
+* Restore support for "Album Artist" tag
+* Disable online search by default
+* Restore MPRIS playlist support and misc MPRIS cleanups
+* Playlist fixes
+* Bring back loading notifications
+* Nightly application icon
+
+Bugs fixed:
+ Fix a crash in Last.fm support (#328)
+ GNOME shell MPRIS controls are not visible (#332)
+ PlayerToolbar can become invisible (#335)
+ Issues when resizing window below apparent minimum width (#337)
+ GNOME music crashes after creating a huge amount of threads (#312)
+ GNOME Music crashes if xdg_music_dir is not set (#338)
+ group artists with a feat or an original artist under the same artist (#331)
+ Songs Not in ~/Music Show Up In Search (#317)
+ Fix visual glitches (#300)
+ Use pkglibdir for gfmlibdir (!509)
+ Limit smartplaylist content to XDG Music dir (#311)
+ Crash when removing GOA account (#145)
+ Model fixes (!557, !552, !533, !499)
+ Fix icon rendering issues (!543)
+ Selection fixes (!528)
+ Restore the development style (!563)
+
+Thanks to our contributors this release:
+ Jean Felder
+ Sam Hewitt
+ Marinus Schraal
+ Jan Alexander Steffens
+ Jakub Steiner
+ Sumaid Syed
+ Sam Thursfield
+
+Added translations:
+ Tamil
+
+Translations updated:
+ Catalan
+ Danish
+ Dutch
+ Friulian
+ Persian
+ Spanish
+
+Overview of changes in 3.34.0
+=============================
+
+This release marks the first stable release after a invasive rewrite of Music
+internals and may still be rough around the edges. Regressions and known issues
+are kept track of in #299, further issue reports are welcome.
+
+* A flatpak issue with cover art retrieval was fixed
+
+Thanks to our contributors this release:
+ Jean Felder
+
+Tranlations updated:
+ Japanese
+ Italian
+
+Overview of changes in 3.33.92
+==============================
+
+This release contains even more bug fixes and cleanups following the core
+rewrite. Regressions and known issues are kept track of in #299, further testing
+and issue reports are welcome.
+
+Thanks to our contributors this release:
+ Hugo Posnic
+ Piotr Drąg
+ Jean Felder
+ Marinus Schraal
+
+Translations updated:
+ Indonesian
+ Karb
+ Basque
+ Swedish
+ Finnish
+ Romanian
+ Lithuanian
+ Spanish
+ Catalan
+ Polish
+ Serbian
+ German
+ Latvian
+ Slovenian
+ Hungarian
+ Galician
+ Korean
+ British English
+ Turkish
+ French
+ Greek
+ Catalan
+ Brazilian Portuguese
+ Czech
+ Croatian
+
+Overview of changes in 3.33.90
+==============================
+
+This release contains a lot of bug fixes following the rewrite of the core of
+Music. This work is not yet complete, but the overall state should be
+improved. Regressions and known issues are kept track of in #299. Further
+reports are welcome.
+
+Some other things were worked on as well:
+* Search view rewrite and style update
+* Display an empty view if Tracker version is outdated
+
+Thanks to our contributors this release:
+ Piotr Drąg
+ Jean Felder
+ Marinus Schraal
+
+Added translations:
+ Karbi
+
+Translations updated:
+ Portuguese
+ Basque
+ Spanish
+ Romanian
+ Swedish
+
+Overview of changes in 3.33.4
+=============================
+
+This release contains a rewrite of the core of Music. This work is not yet
+complete, but should be in a usable state. Regressions and known issues are
+kept track of in #299. Further reports are welcome.
+
+Some other things were worked on as well:
+* Support gapless playback
+* MPRIS support rewrite
+* Playlists rewrite
+
+Thanks to our contributors this release:
+ Georgers Basile Stavracas Neto
+ Jean Felder
+ Jesus Bermudez Velazquez
+ Marinus Schraal
+
+Translations updated:
+ Hungarian
+ Greek
+ Dutch
+ Croatian
+ Swedish
+ Slovenian
+ Icelandic
+
+Overview of changes in 3.33.2
+=============================
+
+* Improve Smooth progressbar support
+* Improve display of information for songs with no tags
+* Select a random song at launch when playing a playlist in shuffle mode
+* AppData tags update (initiative #8)
+* MPRIS misc cleanups
+* Lots of general cleanups
+
+Bugs fixed:
+ gnome-music crashes on startup (#105)
+ Stop using GtkBox:padding, GtkBox:fill and GtkBox:expand (#215)
+ Do not rely on Tracker generated metadata (#223)
+ MPRIS2 reports wrong .desktop file name (#263)
+ Crash with mouse 'back' button (#265)
+ Repeat song not working on Gnome Music 3.32.0 (#266)
+ Order of search and select buttons incorrect (#270)
+ flatpak nightly: Clicking on MPRIS player launches wrong version (#273)
+ Incorrect timeline (progress bar) position for m4a file (#274)
+ HeaderBar in selection mode has the search/cancel button order wrong (#275)
+ Repeat All Does Not Repeat Single Songs From Search (#278)
+ Resuming Playback Actually Restarts Song (#280)
+
+Thanks to our contributors this release:
+ Christopher Davis
+ Reuben Dsouza
+ Bilal Elmoussaoui
+ Jean Felder
+ Andre Klapper
+ Kalev Lember
+ Marinus Schraal
+ Veerasamy Sevagen
+ Georges Basile Stavracas Neto
+ Sumaid Syed
+
+Translation updated:
+ Chinese (China)
+ Chinese (Taiwan)
+ Croatian
+ Esperanto
+ Friulian
+ Hungarian
+ Indonesian
+ Italian
+ Polish
+ Portuguese (Brazil)
+ Romanian
+ Spanish
+ Swedish
+
+Overview of changes in 3.32.0
+=============================
+
+Translations updated:
+ Finnish
+ Catalan
+ French
+
+Overview of changes in 3.31.92
+==============================
+
+Bugs fixed:
+ Fix initial state graphics in dark mode (#258)
+
+Thanks to our contributors this release:
+ Tjipke van der Heide
+ Veerasamy Sevagen
+
+Translations updated:
+ Turkish
+ Finnish
+ Icelandic
+ Dutch
+ Lithuanian
+ Basque
+ Brazilian Portuguese
+ Korean
+ Italian
+ Russian
+ Serbian
+ Friulian
+ German
+ Vietnamese
+ Latvian
+
+Overview of changes in 3.31.91
+==============================
+
+* Show an empty view when Tracker is unavailable
+
+Bugs fixed:
+ Play correct song while paused (#256)
+ Show a warning when Tracker is not available (#165)
+ Cannot cancel 'All' sources in search via button (#92)
+ Crashes when trying to play any song (#244)
+ Crash while tracks are being loaded (#252)
+
+Thanks to our contributors this release:
+ Jean Felder
+ Marinus Schraal
+ Sagar Lakhani
+
+Translations updated:
+ Czech
+ Polish
+ Spanish
+ Romanian
+ Hungarian
+ Swedish
+ Indonesian
+ Slovenian
+ Galician
+ Kazakh
+ Danish
+ Chinese (Taiwan)
+
+Overview of changes in 3.31.90
+==============================
+
+* Add pause on suspend
+* Rework and cleanup MPRIS a lot
+* Use new Adwaita devel styling
+* Partial port to Gtk.EventController
+* Set error style on searchbar entry if applicable
+
+Bugs fixed:
+ Limit composer length (#222)
+ Fix keyboard shortcuts (#238)
+ Correct MPRIS positioning (#227)
+ Fix playlist renaming (#248)
+ Fix Tracker criticals (#251)
+ Fix popover positioning (#214)
+ Pause when suspending (#68)
+ Add error state for searchbar entry (#228)
+
+Thanks to our contributors this release:
+ Christophe van den Abbeele
+ Christopher Davis
+ Harry Xie
+ Jean Felder
+ Jordan Petridis
+ Marinus Schraal
+ Mohanna Datta Yelugoti
+ Nikolay Yanchuk
+
+Translations updated:
+ Czech
+ Slovenian
+ Esperanto
+ Spanish
+ French
+ Greek
+ Friulian
+ Swedish
+ Hungarian
+ Galician
+ Romanian
+ Indonesian
+ Italian
+ Finnish
+ Turkish
+ Polish
+ Catalan
+ Hungarian
+
+Overview of changes in 3.31.1
+=============================
+
+* Replace app menu with Primary menu (initiative #4)
+* Add TheAudioDB for coverart lookup
+* Dark mode fixes
+* Fix crash on opening help
+* New app icon (initiative #2)
+* Flatpak fixes
+
+Bugs fixed:
+ Fix checkbox selection (!245)
+ Set application id correctly (!241)
+ Add The AudioDB support (!247)
+ Fix search dissapearing on return from child (!253)
+ Clean up data dir (#193)
+ mpris: Prevent crash from play call with no playlist (!255)
+ application: Fix crash on opening help (#22)
+ Darkmode fixes (!269,!271)
+ repeat-mode fixes (!274)
+ Restart remote cover lookup on source availability (!284)
+ ui: Change arrow menu button icons (#233)
+
+Thanks to our contributors this release:
+ Christopher Davis
+ Islam Bahnasy
+ Jakub Steiner
+ Jean Felder
+ Marinus Schraal
+ Shivansh Handa
+ Tapasweni Pathak
+
+Translations updated:
+ Serbian
+
+Overview of changes in 3.30.0
+=============================
+
+Translations updated:
+ Galician
+ Hungarian
+ Vietnamese
+ Latvian
+ Croatian
+ Danish
+
+Overview of changes in 3.29.92
+==============================
+
+* Make static playlists more reliable
+* Populate views on demand (improves startup)
+* Fix player toolbar song/artist order
+* Switch view navigation from <Ctrl> to <Alt>
+* Add tooltips in more places
+* Style treeview stars
+* Lots of cleanups and reliability fixes
+
+Bugs fixed:
+ Fix Flatpak delayed loading (!239)
+ Style treeview stars with CSS (!238)
+ Use alt instead of ctrl for navigating tabs (#198)
+ Do not allow view switching in all modes (!237)
+ Introduce loading state (!233)
+ grilo: Fix crash when Tracker is not (yet) loaded (!230)
+ Populate views when opened (!232)
+ views: Fix now-playing icon display (#203)
+ On last play done, first song gets notified (#60)
+ Shuffle shouldn't replay songs (#154)
+ playlistview: improvements and bugfixes (!227,!229)
+ meson: Do not add version suffix on default build (!228)
+
+Thanks to our contributors this release:
+ Jean Felder
+ Marinus Schraal
+
+Translations updated:
+ Swedish
+ Friulian
+ Brazilian Portuguese
+ Finnish
+ Icelandic
+ Romanian
+ Kazakh
+ Korean
+ Indonesian
+ Italian
+
+Overview of changes in 3.29.91
+==============================
+
+* Finished moving the existing ui to use Gtk.Template
+* Added some minor transitions going to selection-mode
+* Add OARS tag
+* Reword application description
+
+Bugs fixed:
+ Wait for last album to load (#174)
+ appdata: Add OARS tag & reword description (!177)
+ disable sidebar stack transition (!206)
+ playlistview: Add translator context to Play menu (!211)
+ add GOA dependency (#212)
+ use Gtk.Template for AlbumCover (#183)
+ tarball fails to build (#211)
+ use Gtk.Template for About dialog (#183)
+ App-bundles selection-mode headerbar color incorrect (#208)
+ Use Gdk.Event accessors (#213)
+ Add SidebarRow widget (!221)
+ use Gtk.Template for Searchbar and move to widgets (!226)
+
+Thanks to our contributors this release:
+ Alexander Mikhaylenko
+ Jean Felder
+ Jordan Petridis
+ Marinus Schraal
+ Nick Richards
+ Piotr Drąg
+ Tyler Garcia
+
+Translations updated:
+ Spanish
+ Slovenian
+ German
+ Polish
+ Turkish
+ Czech
+ Lithuanian
+ Chinese (Taiwan)
+ Greek
+
+Overview of changes in 3.29.90
+==============================
+
+* Lots of widgets ported to use Gtk.Template
+* Added development app bundles to CI
+* Codebase wide cleanups and refactoring
+* Port sidebars away from libgd views
+
+Bugs fixed:
+ Using keyboard reveals the playerbar in in selection mode (#197)
+ High contrast theme not folled for sidebars (#37)
+ Right click to select Albums is inconsistent (#89)
+ Flatpak + CI devops (#185)
+ Music goes into an endless loop (#200)
+ artistalbumswidget: missing attribute artist (#199)
+ searchmode: Leaving selection mode with Escape dismisses search results (#195)
+ Hard transition when entering selection mode (#27)
+
+Thanks to our contributors this release:
+ Apostol Bakalov
+ Jean Felder
+ Jordan Petridis
+ Marinus Schraal
+ Piotr Drąg
+
+Translations updated:
+ Czech
+ Chinese (China)
+ Spanish
+ Chinese (Taiwan)
+ Romanian
+ Friulian
+ Catalan
+ Slovenian
+ German
+ French
+ Greek
+
+Overview of changes in 3.29.2.1
+===============================
+
+* Add release commit to dist tarball
+
+Overview of changes in 3.29.2
+=============================
+
+* Update appdata
+* Fix issue with untranslated UI elements
+* CI use flake8 instead of pep8 & pyflakes
+* CI generate flatpak bundles for every commit and MR
+* Use libsoup for http requests
+* Use CSS styling instead of widget attributes
+* Merge emptystate views
+* Add optional suspend inhibition gsetting
+* Cleanup and split of Player and Toolbar classes
+* Numerous miscellaneous cleanups
+
+Bugs fixed:
+ Partly untranslated user interface (#169)
+ albumartcache: Do not close non-existing stream on error (!95)
+ albumartcache: Fix possible lookup loop (!95)
+ albumartcache: Do not send two signals on error (!95)
+ Minor optimizations (!138)
+ flatpak: Enable MPRIS and GNOME media keys (!129)
+ notificationspopup: Fix source not found warning (!131)
+ Ellipsized songs in Artists View are improperly aligned (#173)
+ Fix notification calls on startup (!147)
+ grilo: Fix audio check (!159)
+ AlbumsView: Fix runtime updates still triggering
+ [playlist dialog] implement empty state dialog (#74)
+ Default search does not search in composer field (#140)
+ SearchView does not use the same model as other views (#160)
+ Use CSS style instead of html markup to color text (#163)
+ Fix Running Length label translation in AlbumViewWidget (#177)
+ local searchtag not removed when doing non-local searches (#130)
+ Replace requests usage with libsoup (#144)
+ Use DzlBoldingLabel for TrackWidget (#178)
+ player: Add optional inhibition of system suspend (#182)
+ Pressing escape when renaming a playlist does not cancel rename (#188)
+
+Thanks to our contributors this release:
+ Ashwin Mohan
+ Apostol Bakalov
+ Jean Felder
+ Marinus Schraal
+ Adrian Solom
+ Juan José González
+ Bruce Cowan
+ Alexander Mikhaylenko
+ Subhadip Jana
+ Georges Basile Stavracas
+ Piotr Drąg
+
+Translations updated:
+ Danish
+ Croatian
+ Greek
+ British English
+ Turkish
+ Russian
+ Slovenian
+ Romanian
+ Friulian
+ Czech
+ Indonesian
+ Spanish
+
+Overview of changes in 3.27.92
+==============================
+
+* Port to Meson
+* Lots of fixes to the flatpak json
+* Fixes to playlists behaviour
+* Fix some shortcut logic
+* Fix issue with bluetooth headset input
+* Delayed loading of covers in albumsview to decrease startup time
+* Lots of general cleanups
+* Update to latest libgd
+
+Bugs fixed:
+ Music won't build from flatpak (#138)
+ Disable last.fm scrobbling if Music is disabled in GOA (#139)
+ playlistview: Remove obsolete column renderer (!61)
+ albumsview: Use correct checkbox style (!68)
+ playlistview: Only show icons for playing playlists (#149)
+ query: Filter out on-disk playlist formats (#72, #151)
+ Replace logger.warn with logger.warning (#153)
+ Switch to meson build system (#1)
+ window: Handle Gdk Audio keys (#93)
+ window: Restore selection popup functionality (#152)
+ meson: Add fallback in case XDG_DATA_DIRS is not set (!85)
+ Deleting a playlist does not stop the player (#156)
+ Follow up searches do not trigger an actual search (#148)
+ Changing playlist resets player model (#136)
+
+Thanks to our contributors this release:
+ Benoît Legat
+ Bilal Elmoussaoui
+ Georges Basile Stavracas Neto
+ Janne Körkkö
+ Jean Felder
+ Marinus Schraal
+
+Translations updated:
+ Swedish
+ Spanish
+ Friulian
+ Polish
+ Indonesian
+ Catalan
+ Chinese (Taiwan)
+ Brazilian Portuguese
+ Galician
+ Croatian
+ Finnish
+ Dutch
+ German
+ Hungarian
+ Slovak
+ Serbian
+ Korean
+ Croatian
+ Italian
+ Czech
+ French
+ Vietnamese
+ Scottish Gaelic
+ Lithuanian
+ Kazakh
+ Latvian
+
+Overview of changes in 3.27.90
+==============================
+
+* Lots of cleanup/refactoring
+* Moved to Gitlab
+* Add album scrobbling
+* Dropped some more libgd use
+* Add context menu to interact with playlist items
+* Drag and drop reorder in playlists
+* Add album scrobbling
+* Rework notifications
+* Rework art cache
+* CI fixes
+* Last bits of HiDPI support
+
+Bugs fixed:
+ Clicking on cancel button from selection bar crashses music (#142)
+ Crashed when trying to play music over UPnP (#46)
+ Playlists are not displayed (#127)
+ Fix deprecated accelerator call (#2)
+ Crash during startup in albumart lookup (#121)
+ Use stack for covers in player (#55)
+ Finish HiDPI support (#65)
+ Scale art more efficiently (#81)
+ Playlist not deleted after close (#106)
+ Allow undo on playlist track removal (#50)
+ Fix artist/album search return all songs (#4)
+ Replace deprecated override_color call (#3)
+ Allow access to host cache from flatpak (!15)
+ Reset song to clean on new playlist (#135)
+ Use context menu on playlist tracks (#48)
+ Replace deprecated add_accelerator call (#2)
+ Console spam on startup related to Spotify (#132)
+
+Thanks to our contributors this release:
+ Alberto Fanjul
+ Felipe Borges
+ Gyanesh Malhotra
+ Jean Felder
+ Marinus Schraal
+ Subhadip Jana
+
+Translations updated:
+ German
+ Polish
+ Friulian
+ Indonesian
+ Finnish
+ Swedish
+ Catalan
+ Hungarian
+ Esperanto
+
+Overview of changes in 3.27.4
+=============================
+
+Bugs fixed:
+ Migrate from intltool to gettext (#787272)
+ Add appstream metadata to non-deprecated location (#790869)
+ Playlist ordering in views (#772090)
+ Fix style of GdTaggedEntry (#791077)
+ PEP-8 fixes & cleanups (#791481,!7,!9,!10,!17,!18)
+ Update libgd (!8)
+ Fixes to navigating back (#777238)
+ Enable mouse button for navigating back (#771934)
+ Fix constructor deprecation warning (#790127)
+ Fix PyGObject deprecation warning (#788701)
+ Fix order in method call (!21)
+ Fix log decorator order (!22)
+ Use python3 style super() calls (!16)
+ DiscListBoxWidget update favourites (!23)
+ Add the ability to rename playlists (!11)
+ Update README.md (!12)
+
+Thanks to our contributors this release:
+ Abhinav Singh
+ Florian Darfeuille
+ Jean Felder
+ Jeremy Bicha
+ Kainaat Singh
+ Marinus Schraal
+ Niels De Graef
+ Phil Dawson
+ Piotr Drąg
+ Sambhav Kothari
+
+Translations updated:
+ Dutch
+ Romanian
+ Icelandic
+ Persian
+ Catalan (Valencian)
+ German
+ Czech
+ Friulian
+ Norwegian bokmål
+ Croatian
+ Indonesian
+ Serbian
+ Swedish
+
+Overview of changes in 3.26.0
+=============================
+
+Translations updated:
+ Catalan
+ French
+ Romanian
+ Danish
+
+Overview of changes in 3.25.92
+==============================
+
+Bugs fixed:
+ 786454 Wrong player.set_playlist call in albumwidget.py
+ 780548 Problem scrolling albums on wayland
+ 709073 Different icon in System Settings Sound pane
+
+Thanks to our contributors this release:
+ Jan-Michael Brummer
+ Jean Felder
+ Marinus Schraal
+ Robert Greener
+
+Translations updated:
+ Croatian
+ Italian
+ Danish
+ Vietnamese
+
+Overview of changes in 3.25.91
+==============================
+
+Bugs fixed:
+ 786541 Add missing logger imports
+ 786315 Make the playlist button a circle
+
+Thanks to our contributors this release:
+ Jean Felder
+ Jordan Petridis
+
+Translations updated:
+ Polish
+ French
+
+Overview of changes in 3.25.90
+==============================
+
+* Limit concurrent loading of coverart
+* Fixes to appdata
+* Use tracker:title-order for sorting
+
+Bugs fixed:
+ 783466 query: Use tracker:title-order() SPARQL function for title sorting
+ 785697 Remove comments from org.gnome.Music.json
+
+Thanks to our contributors this release:
+ Carlos Garnacho
+ Felipe Borges
+ Georges Basile Stavracas Neto
+ Kalev Lember
+ Marinus Schraal
+ Piotr Drąg
+
+Translations updated:
+ Turkish
+ Croatian
+ Czech
+ Malayalam
+
+Overview of changes in 3.25.4
+=============================
+
+* Build: depend on libtracker-sparql-2.0
+* Add Flatpak manifest
+* Mark forgotten string for translation
+
+Bugs fixed:
+ 776668 fix minor seek stutter
+ 774500 refactor gnome-music.in to be more readable
+ 781684 playlistview artist field incorrect
+ 777346 allow seek using arrow keys
+ 781754 fix media-player-keys bus name
+
+Thanks to our contributors this release:
+ Abhinav Singh
+ Carlos Garnacho
+ Carlos Soriano
+ Felipe Borges
+ Marinus Schraal
+ Pablo Palácios
+ Piotr Drąg
+
+Translations updated:
+ Belarusian
+ Slovenian
+ Polish
+ Indonesian
+
+
+Overview of changes in 3.24.1.1
+===============================
+
+* Revert desktop file rename
+* In turn revert Flatpak manifest addition
+
+Overview of changes in 3.24.1
+=============================
+
+* Add Flatpak manifest
+* Fix crashers
+* Up Grilo requirements
+
+Bugs fixed:
+ 780523 playlist dialog shows the playlist that is going to be deleted
+ 779905 build: Add a first version of Flatpak manifest
+
+Thanks to our contributors this release:
+ Abhinav Singh
+ Carlos Soriano
+ Marinus Schraal
+
+Translations updated:
+ Portuguese
+ Norwegian bokmål
+ Greek
+ Croatian
+
+Overview of changes in 3.24.0
+=============================
+
+Translations updated:
+ Russian
+ Latvian
+ Brazilian Portuguese
+
+Overview of changes in 3.23.92
+==============================
+
+* Code cleanups
+* Local art retrieval added
+* AppData screenshots updated
+
+Bugs fixed:
+ 779013 only one (older) screenshot in appdata file
+ 779585 Window is wider than 1024px
+ 777041 Unexpected behaviour of playlist notification actions, sometimes
+ deletes, sometimes not
+ 776668 double click on seek bar pauses the songs
+ 779052 MPRIS TrackList GoTo Method Crashes gnome-music
+ 779584 Handle coverart extraction in gnome-music
+
+Thanks to our contributors this release:
+ Abhinav Singh
+ Andreas Nilsson
+ Carlos Garnacho
+ Marinus Schraal
+
+Translations updated:
+ Hungarian
+ Slovak
+ Serbian
+ Galician
+ Lithuanian
+ Italian
+ Czech
+ Polish
+ Danish
+ Scottish Gaelic
+ Occitan
+ French
+ Korean
+ Indonesian
+ Basque
+ Icelandic
+ Swedish
+ Chinese (Taiwan)
+ Finnish
+
+Overview of changes in 3.23.91
+==============================
+
+* Code cleanups
+
+Bugs fixed:
+ 774470 Use song instead of track in the source codebase
+ 774449 Cleanup baseview.py
+
+Thanks to our contributors this release:
+ Marinus Schraal
+ Rashi Sah
+ Suyash Garg
+
+Translations updated:
+ Finnish
+ Kazakh
+ Danish
+ Norwegian bokmål
+ Slovak
+ Polish
+ Basque
+ Indonesian
+ Italian
+ Hungarian
+ Catalan
+ Friulian
+ Ukrainian
+ German
+ Brazilian Portuguese
+ Serbian
+ Spanish
+
+Overview of changes in 3.23.90
+==============================
+
+* Empty-state added for playlist dialog
+* Cleanups
+
+Bugs fixed:
+ 772089 [playlist dialog] implement empty state dialog
+ 776680 'Select All' doesn't have an action in Artists tab
+ 777541 Crashes as soon as trying to play a song
+ 777219 PEP 8 fix : application.py
+
+Thanks to our contributors this release:
+ Abhinav Singh
+ Alberto Fanjul
+ Marinus Schraal
+ Yash Singh
+
+Translations updated:
+ Czech
+ Indonesian
+ German
+ Turkish
+ Catalan
+ Polish
+ Slovak
+ Friulian
+
+Overview of changes in 3.23.4
+=============================
+
+* Revamp notifications and drop GdNotification
+* More cleanups
+
+Bugs fixed:
+ 776157 Improve notifications' interaction
+ 776849 Gnome-music crashes on clicking "select all" in album
+ 777127 Pressing back after no search results from single album view leads to
+ force close
+ 777235 Pressing back button when searching through a subview, should turn
+ search off and go back
+ 777216 PEP 8 fix : __init__.py
+ 776673 Recompile resources when builddir is not same as srcdir
+ 772975 In a playlist repeatSong/shuffle/repeatSong take effect from the next
+ song
+
+Thanks to our contributors this release:
+ Abhinav Singh
+ Alberto Fanjul
+ Georges Basile Stavracas Neto
+ Marinus Schraal
+ Sambhav Kothari
+
+Translations updated:
+ Finnish
+ Kazakh
+ Spanish
+
+Overview of changes in 3.23.3
+=============================
+
+* Start to use Grilo for storing metadata
+* Rework starring widget
+* DistListBox improvements
+* Stop walking directories for no reason
+* Finish move to tracker async calls
+
+Bugs fixed:
+ 774754 Use correct Grilo property for favourite tracking
+ 772689 Use tracker async queries
+ 775759 create_playlists cursor_callback method has a TypeError
+ 775930 Correct error variable names
+
+Thanks to our contributors:
+ Carlos Garnacho
+ Georges Basile Stavracas Neto
+ Marinus Schraal
+ Sambhav Kothari
+ Yash Singh
+
+Translations updated:
+ German
+ Hungarian
+ Russian
+
+Overview of changes in 3.23.2
+=============================
+
+* Rely on Cairo for cover scaling
+* Smooth progressbar
+* Make more tracker calls async
+* General cleanups
+* Tackle long-standing issues with album separation
+
+Bugs fixed:
+ 773478 artistviews: pep cleanup
+ 772263 Use unicode in translatable strings
+ 772698 async work
+ 774260 handle optional album-artist in queries
+ 774481 Add missing license header to gnome-music.in
+ 773769 songsview: pep cleanup
+ 772628 player: make progress scale move smoothly
+
+Thanks to our contributors:
+ Carlos Garnacho
+ Clayton G. Hobbs
+ Marinus Schraal
+ Pablo Palácios
+ Piotr Drąg
+ Suyash Garg
+ Yash Singh
+
+Translation updated:
+ Czech
+ Friulian
+ Hungarian
+ Norwegian bokmål
+ Slovenian
+
+Overview of changes in 3.23.1
+=============================
+
+* Rework art lookup
+* Add HiDPI support (90% done)
+* Add mnemonics
+* Rework about dialog
+* Split up views & widgets
+* Rework the album widgets
+* Show multi-disc albums as such
+* Make playlist retrieval non-blocking
+* Add composer label & search
+
+Bugs fixed:
+ 761185 Help should use tag when referring to application names
+ 771348 Use | as I18N separator
+ 772403 Album art: also consider height when scaling
+ 765476 Crashes upon opening with a GLib error
+ 719452 Provide proper output if gobject-introspection-devel is missing
+ 773192 Fix playlists loading time
+ 705094 Display more details on Album view
+ 750827 Album views - if an album has multiple disks, group tracks by disk
+ 761891 Weird interaction selection mode + favourites
+
+Thanks to our contributors:
+ Carlos Garnacho
+ Georges Basile Stavracas Neto
+ Konstantin PospelovSebastian Rasmussen
+ Marinus Schraal
+ Sebastian Rasmussen
+
+Translation updated:
+ Basque
+ Chinese (simplified)
+ Chinese (Taiwan)
+ Czech
+ Danish
+ Friulian
+ German
+ Italian
+ Swedish
+
+Overview of changes in 3.22.0
+=============================
+
+* Update mainters in doap
+
+Translations updated:
+ Ukrainian
+ Catalan
+ Scottish Gaelic
+ Persian
+
+Overview of changes in 3.21.92
+==============================
+
+* Fix keyboard play/pause handling
+* Remove top separator in song lists
+* Do not remove static playlists on Delete keypress
+
+Bugs fixes:
+ 771249 Static playlists should not be removed using the Delete key
+ 770178 Remove the first Songs row separator
+ 754096 Space doesn't always toggle pause/play
+
+Thanks to our contributors:
+ Konstantin Pospelov
+ Marinus Schraal
+ Yash Singh
+
+Translations updated:
+ Danish
+ Greek
+ Latvian
+ Galician
+ Swedish
+ Hebrew
+ Vietnamese
+ British English
+ Lithuanian
+ Kazakh
+ Korean
+ Friulian
+ Serbian
+
+Overview of changes in 3.21.90
+==============================
+
+* New keyboard shortcuts and a shortcuts window to go with it
+* Move to cleanup the codebase style (PEP-8) & use docstrings, see README
+* Better sorting in albums and artists view
+* Playlist dialog enhanced with a 'new playlist' entry
+* Move to GtkFlowBox for albums view, a significant performance improvement
+
+Bugs fixed:
+ 761502 Include playlists from Music dir only & order static playlists on top
+ 766115 Return songs only once
+ 746447 Require tracker 1.8 for titled playlists
+ 765609 Fix mpris repeatmode
+ 761625 Cleanup artist/author ambiguity
+ 747953 Don't leak information over http through Grilo & unregister sources
+ 754700 Require Grilo 0.3.1 and use the album-artist key if available
+ 742531 Ignore punctuation when sorting albums and artists, requires tracker 1.9
+ 758637 Implement new keyboard shortcuts
+ 757833 Add GtkShortcut window
+ 769774 Fix sidelist shadow
+ 769772 Use GtkSearchBar for the searchbar + misc fixes
+ 744834 Add new playlist entry to playlist dialog + misc fixes
+ 760164 Use GtkFlowBox for albums view
+
+Thanks to our contributors:
+ Billy Barrow
+ Carlos Garnacho
+ Divyanshu Vishwakarma
+ Elias Entrup
+ Evandro Giovanini
+ Felipe Borges
+ Gaurav Narula
+ Georges Basile Stavracas Neto
+ Kevin Haller
+ Marinus Schraal
+
+Translations updated:
+ Occitan
+ Catalan
+ Spanish
+ French
+ Friulian
+ Slovak
+ Czech
+ Indonesian
+ Brazilian Portuguese
+ German
+ Hungarian
+ Finnish
+ Polish
+ Portuguese
+
+Overview of changes in 3.20.2
+=============================
+
+Bugs fixed:
+ 705069 Port to Gio GDBUS API
+ 763618 Clarify jhbuild instructions in README
+ 755089 Emit playback-status-changed after playlist ends
+ 744820 Accept response on row-activated in Playlist Dialog
+ 765598 Bump Gtk+ minimum version to 3.19.3
+ 761961 Stop the player when destroying window
+
+Translations updated:
+ Swedish
+ Friulian
+ Esperanto
+ Brazilian Portuguese
+ Occitan
+
+Overview of changes in 3.20.0
+=============================
+
+Translations updated:
+ Danish
+ Hungarian
+
+Overview of changes in 3.19.92
+==============================
+
+Bugs fixed:
+ 762821 Update Grilo plugin ranks to 0.3 format
+ 761941 Fix Pango critical warnings on searchbar
+ 761890 Check if visible child is ArtistsAlbumsWidget on search toggle
+ 763304 Don't assume that nmm:MusicPieces will have a nie:url in playlists
+ 744821 Properly de/activate select button on PlaylistDialog when navigating w/ arrow keys
+ 744831 Fix crash while deleting multiple playlists
+ a173f2 Update libgd
+
+Translations updated:
+ Occitan
+ Korean
+ Slovenian
+ French
+
+Special thanks to the new contributors:
+ Gaurav Narula
+ Marinus Schraal
+ Prashant Tyagi
+ Saiful B. Khan
+
+Overview of changes in 3.19.91
+==============================
+
+Bugs fixed:
+ 744829 No more duplicate playlists on the sidebar
+ 762406 More Grilo 0.3 transition fixes
+ 762265 No more notifications on track changes
+
+Translations updated:
+ Slovak
+ Occitan
+ Ukrainian
+
+Overview of changes in 3.19.90
+==============================
+
+Bugs fixed:
+ 761173 Update tracker queries to sparql 1.1 syntax
+ 760170 Fix check button appearance on AlbumWidget
+ 760170 Fix check buttons appearance in Songs and Playlist view
+ 736463 Reposition the scrollbar in the search window
+ 760171 Resized songs list for better viewing in large window
+
+Translations updated:
+ Latvian
+ Bulgarian
+
+Overview of changes in 3.19.4
+=============================
+
+Bugs fixed:
+ Let GtkApplication automatically load the app-menu
+ Refactor the way we connect menu actions
+ 758942 Use grilo 0.3 for GNOME 3.20
+ 758942 Fix deprecation warnings in GTK+
+ Update libgd from master
+ Scale the playlist name to match the mockups
+ 759024 Use the path of the filter model in search results
+ 739924 Make search find strings with accents
+ 759882 Fix warnings when switching between stack pages
+ Add symbolic icon
+ 760033 Make albumart fetching truly asynchronous
+ 760033 Defer serialization of default icon
+ 760033 Set model on the view after all insertions happened
+ 760033 Remove check for dup jobs
+ 760033 Don't add items on idle
+ 760033 Depend on Tracker >= 1.7.1
+ 759587 Rework songs, artists, playlists, and albums queries
+ Pass width/height during pixbuf loading
+ 751163 Restrict music catalog to the Music folder
+ 760381 Use GIO async APIs to download cover art
+ 734958 Increase the maximum width of the artist and track name
+
+Translations updated:
+ Spanish
+ Slovenian
+
+Overview of changes in 3.18.2
+=============================
+
+Bugs fixed:
+ 755601 Fix styling for entry tags (libgd)
+ 756256 Fix XML tag in help
+ 746446 Reset app title to Music after leaving album view
+ 756330 Fix crashes when coming back from search view
+ 757227 Fix missing toolbar when coming back from search result g
+
+Translations updated:
+ Serbian
+ German
+ Greek
+ Czech
+ Basque
+ Lithuanian
+ Hungarian
+
+Overview of changes in 3.18.0
+=============================
+
+Translations updated:
+ Danish
+ Swedish
+
+
+Overview of changes in 3.17.92
+=============================
+
+Bugs fixed:
+ 744827 Empty stars in 'Search' view
+ 754654 Fixes for staticmethod definitions
+ 754702 Search drop-down doesn't show the right default source
+ 754836 Toggling search of when on a albumWidget doesn't make search view disappear
+ 754977 gnomemusic/widgets.py using depreciated PARAM_READWRITE
+
+Translations updated:
+ Added Icelandic
+ Finnish update
+ Fix FSF address in Polish
+ French
+ Kazakh
+ Korean
+ Lithuanian
+ Turkish
+ Persian
+
+
+Overview of changes in 3.17.91
+=============================
+
+Bugs fixed:
+ 738516 Tags in search textbox are broken
+
+Translations updated:
+ Chinese (Taiwan)
+ French
+ Galician s
+ German
+ Greek
+ Indonesian
+ Italian
+ Polish
+ Update Catalan transation
+
+
+Overview of changes in 3.17.90
+=============================
+
+Bugs fixed:
+ 744658 Playlists sidebar - border is cut off
+ 753488 Clicking on artist on search results does nothing
+
+Translations updated:
+ Brazilian Portuguese
+ Czech
+ Fix Portuguese desktop keywords
+ Friulian
+ Norwegian bokmål
+ Turkish
+
+
+Overview of changes in 3.17.4
+=============================
+
+Bugs fixed:
+ 705070 Last.fm/libre.fm integration
+ 747233 Remove "All Artists"
+ 752591 Convert margin_right to margin_end
+ 752592 Trivial code formatting cleanups
+
+Several deprecations were removed
+More performance improvements
+Translations updated
+
+
+Overview of changes in 3.17.3
+=============================
+
+Bugs fixed:
+ 743362 Give a nicer welcome
+ 744464 No results screen for Search
+ 747749 Cant't play favourite song in Album view
+ 748375 #!/bin/bash in autogen.sh
+ 749981 Tracks outside Music and Downloads are displayed in playlists
+
+Translations updated:
+ Added Occitan
+ Dutch 316
+ Esperanto
+ Fix to Catalan
+ Greek
+ Norwegian bokmål
+ Slovak
+ Spanish
+ Tajik
+ Turkish
+ l10n: Update Japanese
+ update zh_CN
+
+
+Overview of changes in 3.16.0
+=============================
+
+Translations updated:
+ Basque language
+ Finnish update
+ Fix a syntax error in desktop file keywords Bosnian
+ Indonesian
+ Tajik
+ Update Aragonese
+ Update Catalan
+
+
+Overview of changes in 3.15.92
+=============================
+
+* Bug fix release
+
+Bugs fixed:
+ 744657 Loading in-app notification gets stuck
+ 745646 Improve sorting of "songs" view
+ 745647 shuffleHistory fixes
+ 745648 Song view elements jump around
+ 745650 Not Enough Space Given For Track Titles in Album View
+
+Translations updated:
+ Added Bosnian
+ Danish
+ German
+ Korean
+ Polish
+ Serbian
+ Slovenian
+ Swedish
+ Turkish
+ l10n: Update Japanese
+
+
+Overview of changes in 3.15.91
+=============================
+
+* Bug fix release
+
+Bugs fixed:
+ 705852 Now playing indicator is lost on switching views / artists / artist albums
+ 729377 Convert menu of gear button in the Playlists view into a popover
+ 729525 Show a loading animation when Add to Playlist is clicked in Albums and Artists view
+ 743310 Updates to Smart Playlist functionality in 3.15.4
+ 743883 Refresh Playlists/Songs view when star toggled
+ 743884 Protect smart playlists
+ 743901 Favorite Playlist and Starring implementation
+ 744005 stars in Album/Artist/Search views
+ 744655 Loading in-app notification is malformed
+ 744807 Last song on album view keeps repeating in "mix/no repeat" mode
+ 744832 Undo playlist delete --> reinsert at previous position
+
+Translations updated:
+ Basque language
+ Brazilian Portuguese
+ Chinese (Taiwan)
+ Czech
+ Fix German desktop file keyword
+ French
+ Galician s
+ Greek
+ Hebrew
+ Hungarian
+ Italian
+ Kazakh
+ Lithuanian
+ Norwegian bokmål from Åka Sikrom
+ Russian
+ Slovak
+ Spanish
+ Swedish
+ Ukrainian
+ Update Aragonese
+
+
+Overview of changes in 3.15.90
+=============================
+
+* New smart playlist - Favourite tracks, all views updated to allow
+ making a track favourite
+* All Artists is not selected by default - improves performance
+* All smart playlists now retyurn max 50 items
+* Playlists menu now uses popover
+* Notification appears on loading operations
+* Favourite songs are now displayed on search view
+* GStreamer discoverer performance fixes from garnacho
+* Minor UI fixes
+
+
+* Bugs fixed:
+ 744005 stars in Album/Artist/Search views
+ 729525 Show a loading animation when Add to Playlist is clicked in Albums and Artists view
+ 729377 Convert menu of gear button in the Playlists view into a popover
+ 743310 Updates to Smart Playlist functionality in 3.15.4
+
+
+* Updated translations and help files
+
+Overview of changes in 3.15.4
+=============================
+
+* Smart playlists - Most Played, Never Played, Recently Played
+ The list is not yet final, stay tuned. Note that we use Last.fm's way
+ to count song as 'played' - more than 40% of song content should be played.
+* Chunked loading was removed - scrolling should be faster
+* Content is now hidden before fully loaded - notification on the progress will
+ land in master in next version.
+* Playlists are remvoed after time out, removal can be undone
+* Dependency cnahge: libmediaart-2.0.pc is now required
+* Replaygain tags are now supported
+* Overall performance fixes
+
+* Bugs fixed:
+ 729376 New Playlist in application menu doesn't do anything
+ 704257 Visible content loading
+ 742603 Regression: empty covers are oversized in playbar, still 'in-progress' on artists view
+ 742451 Support Undo when removing playlists
+ 733686 Gnome music will not launch
+ 726459 Crash on playlist tabs when new media has been scanned
+ 702519 Smart playlists
+ 742800 Playlist broken due to typo
+ 742123 Hitting 'cancel' while creating new playlist crashes program
+ 731613 gnome-music-3.12.2 fails to start if xdg default directories are not created
+ 742011 Query: add a/an to articles
+ 730269 ReplayGain support?
+
+* Updated translations and help files
+
+Overview of changes in 3.15.2
+=============================
+
+* Better thread handling while fetching album art
+* Some UI/UX goodies
+* Notification can now be disabled
+* 'The' (and translation) is not disregarded during sorting
+* MPRIS improvements
+
+* Bugs fixed:
+ 736925 Remove deprecation warnings from AlbumWidget.ui
+ 737142 Remove remaining gtk deprecation warnings
+ 737571 No covers loaded on libmediaart 0.6.0
+ 736241 Prefer embedded album art over downloaded
+ 732151 High CPU and sluggish performance
+ 733473 Use "Alt + left arrow" to navigate back
+ 738465 Have a dconf switch to disable notifications
+ 731392 Nicer empty state
+ 729378 Disregard "The" in titles
+ 734513 play/pause is activated twice when pressing spacebar and play/pause button is active/selected
+ 729309 Add support for MPRIS Playlists
+ 740211 Add support for MPRIS TrackList
+ 740212 Bump MPRIS support to 2.2
+ 740330 Album view - music icons are badly rendered
+ 740524 Missing license headers in playlists.py and searchbar.py
+ 731639 The pictures have different proportions, influencing the effect of alignment
+ 729459 under Artists, tracks in the same album are very far apart from each other
+ 740490 Music "forgets" search string, but search results remain
+
+* Updated translations and help files
+
+Overview of changes in 3.14.0
+=============================
+
+* Updated translations and help files
+
+Overview of changes in 3.13.92
+=============================
+
+* Bugs fixed:
+ 735890 Fix the icons in RTL with new GTK+
+
+* Updated translations and help files
+
+Overview of changes in 3.13.90
+=============================
+
+* Ported to GtkActionbBar - now requires GTK+ 3.12
+* Correct icoin is displayed for playlist menu (https://wiki.gnome.org/Initiatives/GnomeGoals/GearIcons)
+* Better search UI
+* HighContrast icons
+* Improved Back navigation
+* Notifications now behave correctly when paused and less flicker
+
+* Bugs fixed:
+ 734786 center the search results
+ 734404 Missing high contrast icon
+ 734122 unable to switch to all albums view after return from search view
+ 734117 Pause button does not change to play button in the notification
+ 732150 Remove custom player bar styling
+ 732951 Don't use emblem-system-symbolic
+
+* Updated translations and help files
+
+
+Overview of changes in 3.13.4
+=============================
+
+* Bump python3 requirement to 3.3 (due to str.casefold)
+
+* Bugs fixed:
+ 733095 Seeking in track above 36 minutes leads to crash
+
+* Updated translations and help files
+
+
+Overview of changes in 3.13.3
+=============================
+
+* Playlists are now stored in Tracker
+* Back button now returns back to Search if available
+
+* Bugs fixed:
+ 707461 add man page
+ 729311 Use Tracker to save Playlists
+ 728254 Incorrect item is removed in playlists if it has duplicates
+ 728255 Don't show playlists in Songs
+ 728330 Crash when the name of the new playlist contains special characters
+
+* Updated translations and help files
+
+
+Overview of changes in 3.13.2
+=============================
+
+* Improved search with source and match type selection
+* Remote sources support: Jamendo, Magnatune, UPnP/DLNA
+* Player bar now looks better when window is small
+
+* Bugs fixed:
+ 729100 Media art in notifications is blank instead of symbolic when media art is not found
+ 729102 Notification doesn't show up when media art doesn't exist
+ 728255 Don't show playlists in Songs
+ 725949 gnome-music buttons have no tooltips
+ 728407 Enabling selection mode via right-click doesn't work inside albums in Albums view
+ 729521 Albums list in Artists view shouldn't be sensitive when in selection mode
+ 706948 Only show music from my ~/Music folder
+ 699807 PlayerToolbar - artist and track name can shrink to nothing
+ 730205 AttributeError: 'Stack' object has no attribute 'get_child_by_name'
+ 726713 Update of songs interferes with selection mode
+
+* Updated translations and help files
+
+
+Overview of changes in 3.13.1
+=============================
+
+* Thumbnail fetching was reworked. now should be much faster
+* New dependency: libmediaart
+* Updated playlist UI
+* Now requires GTK 3.10
+* Shuffle menu is now a popover
+* Load More button was removed
+
+* Bugs fixed:
+ 724627 Playlists UX review
+ 726721 Some tracks are identified as 'MediaVideo' and crash in various places
+ 727444 gnome-music crashed with OSError in_on_source_added(): [Errno 5] I/O error
+ 727522 Accelerator for Select All doesn't work
+ 728323 Set the icon name of the window as "gnome-music"
+ 724112 Crashes when cannot connect to tracker
+ 702565 Load cover art on scroll in Albums and Artists view
+ 699832 Replace Load More with autoloading on pressure
+ 729096 Media art is not shown in MPRIS clients
+
+* Updated translations and help files
+
+
+Overview of changes in 3.11.92
+=============================
+
+* Improved and tranlated help
+* Space now plays/pauses the current song
+* Minor UI updates to playlists
+
+
+* Bugs fixed:
+ 707454 Space switches to next item
+ 724627 Make select button insensitive while creating New Playlist
+ 725904 Tracks don't appear in artists view for albums that have many tracks
+
+
+* Updated translations
+
+Overview of changes in 3.11.91
+=============================
+
+* Initial help infrastructure
+* More info is printed if the track cannot be played
+* Last 10 played tracks are stored in shuffle history
+* Other minor improvements and bug fixes
+
+
+* Bugs fixed:
+ 707744 Song is being replayed when paused
+ 724228 Remove 'now playing' from the app menu
+ 707457 Restart current track when Previous button was clicked and position is more than 3 seconds
+ 725355 Do not crash if we happen to come across a filename we can't decode
+ 723942 Search on keypress function opens search bar even when pressing any key
+ 724954 Selecting all albums is not visible at first
+ 707376 Set the position of the view scrollbar to current song when a song is changed
+
+
+* Updated translations:
+ Spanish
+ Norwegian bokmål
+ Tajik
+ Czech
+ Brazilian Portuguese
+ Hebrew
+ Chinese
+ Lithuanian
+ Italian
+ Hungarian
+ Finnish
+
+Overview of changes in 3.11.90
+=============================
+
+* Initial playlists support
+* Filter-as-you-type
+* Misc fixes and improvements
+
+
+* Bugs fixed:
+ 700022 app no longer fits half maximized
+ 721297 Shuffle is not random enough
+ 723765 Static spinner superimposed over album artwork
+ 708154 Crash when Search button is toggled on No Music view
+ 724027 theme: actionbar has a doubleborder
+ 724025 searchbar isn't styled properly
+ 724016 don't segment artist list sidebar
+ 721595 Typing should trigger a search
+ 723750 The stack switcher is gone when run gnome-music with GTK+ 3.11
+ 709234 Music cannot be run via ssh forwarding
+
+
+* Added translations:
+ Aragonese
+ Esperanto
+
+* Updated translations:
+ Hebrew
+ Lithuanian
+ Traditional Chinese
+ Norwegian bokmål
+ Turkish
+ Finnish
+ Czech
+ Greek
+ Brazilian Portuguese
+ Galician
+ Chinese simplified
+ Slovenian
+ German
+ Italian
+ Spanish
+ Tajik
+
+
+Overview of changes in 3.11.2
+=============================
+
+* Exit selection mode on pressing Esc
+* Pep8 compatibility
+* Broken AppData file was removed from sources
+
+* Bugs fixed:
+ 707590 Fix app menu accelerator conflict
+ 708279 Make the cancel button as center vertically
+ 709033 Album Cover art not displayed in the notifications
+ 707399 Add translator comment to not translate GSettings values
+ 705853 Enter selection mode on right-click
+ 707633 Save window position, size and maximization state
+ 709465 Update position while switching songs
+
+* Added translations:
+ Afrikaans
+ Catalan (Valencian)
+ Malayalam
+ Telugu
+
+* Updated translations:
+ Norwegian bokmål
+ Turkish
+ Persian
+ Simplified Chinese
+ Slovenian
+ Tajik
+ Spanish
+ Galician
+ Greek
+ Dutch
+
+
+Overview of changes in 3.10.0
+=============================
+
+* Added translations:
+ Estonian
+ Belarusian
+
+* Updated translations:
+ Assamese
+ Portuguese
+ Latvian
+ Slovak
+ Ukrainian
+ Traditional Chinese
+ Catalan
+ Kannada
+ Indonesian
+ Hebrew
+
+
+Overview of changes in 3.9.92
+=============================
+
+* Added AppData description
+
+* Icons are now RTL-compatible
+
+* Notifications appear during the playback
+
+* All views can be filtered via search button or Ctrl+F shortcut
+
+* URLs with no FileDataObject (*.cue) are now filtered
+
+* Fixed MPRIS commands: close, play, thumbnail display
+
+* Songs view now displays 'Unknown Album' for tracks with no album set
+
+* Gnome Music notifies about startup
+
+
+* Bugs fixed:
+ 702377 Add support for notifications
+ 703303 Music doesn't properly tell MPRIS clients that the song is replayed when in repeat song mode
+ 706576 Repeat/Shuffle icons should have RTL variants
+ 707388 Add AppData description
+ 707632 MPRIS Close command is broken
+ 707824 No notification when Music starts
+ 707937 freeze-break branch | Crash when try to start song
+ 707938 gnome-music crashes with TypeError: Argument 0 does not allow None as a value
+ 708102 Thumbnail no longer shows up in MPRIS clients
+ 708103 Playing default playlist is broken
+ 708116 Crash in notification when the current track gets hidden while searching
+ 708117 Use RTL variants of buttons in notifications on RTL languages
+ 708159 Empty album column when an album title is unknown
+
+* Added translations:
+ Basque
+ British English
+ Catalan
+ Danish
+ Dutch
+ French
+ Indonesian
+ Korean
+ Latvian
+ Traditional Chinese
+
+* Updated translations:
+ Brazilian Portuguese
+ Czech
+ Finnish
+ Galician
+ German
+ Hungarian
+ Italian
+ Lithuanian
+ Norwegian bokmål
+ Polish
+ Russian
+ Serbian
+ Slovak
+ Slovenian
+ Spanish
+ Tajik
+
+
+Overview of changes in 3.9.91
+=============================
+
+* All songs will now be loaded in Songs view after switching to it
+ for the first time
+
+* First song in Songs view will play if Play is executed in MPRIS and
+ there is no current playlist
+
+* The URIs are now discovered asynchronously, to make loading songs
+ faster
+
+* An error icon will now show up when the file is deleted
+
+* The message when no music files are found is now more verbose
+
+* Bugs fixed:
+ 700776 Licensing problems
+ 705855 Crash when attempting to get properties over DBus
+ 706019 Don't use the discoverer if we don't care of the results
+ 706294 Duration in Albums view increases every time an album is se...
+ 706353 About box changes size when license button is toggled on, l...
+ 706457 Invalid copyright headers
+ 706533 More explanation when Music says "No Music Found"
+ 706800 Cancel button in toolbar shouldn't be emphasized
+ 706947 Can't shuffle my entire library without clicking "load more...
+
+* Added translations:
+ Irish
+ Tajik
+
+* Updated translations:
+ Brazilian Portuguese
+ Czech
+ Galician
+ Italian
+ Lithuanian
+ Norwegian bokmål
+ Polish
+ Slovak
+ Slovenian
+ Spanish
+
+
+Overview of changes in 3.9.90
+=============================
+
+* Initial release
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..6abac74c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,213 @@
+Music is the GNOME music playing application.
+
+# Where can I find more?
+
+Music has a wiki page at https://wiki.gnome.org/Apps/Music.
+
+You can join the developers on IRC: [#gnome-music](irc://irc.libera.chat/gnome-music) on [Libera Chat](https://wiki.gnome.org/GettingInTouch/IRC).
+
+# Join the development
+
+Follow the [GNOME Newcomers guide](https://wiki.gnome.org/Newcomers/) and choose Music as your project. There are bugs labeled for newcomers, which should provide an easy entry point. Of course, feel free to pick something more challenging. Pick bugs if you can, not feature requests. The goal is to make the current Music experience sound & stable and only then extend it's functionality.
+
+## Build Music
+
+Music uses the [meson](http://mesonbuild.com/) build system. Use the following commands to build Music from the source directory:
+
+```sh
+$ meson _build
+$ cd _build
+$ ninja
+```
+
+Then you can either run in the build dir by running:
+
+```sh
+$ ./local-music
+```
+
+You can also install Music system-wide by running:
+
+```sh
+$ ninja install
+```
+
+## Debugging
+
+GNOME Music uses [GLib logging facilities](https://developer.gnome.org/glib/stable/glib-running.html) to print debug messages. It can be activated by setting the `G_MESSAGES_DEBUG` environment variable:
+
+```sh
+G_MESSAGES_DEBUG=org.gnome.Music gnome-music
+```
+
+## Coding style
+
+GNOME Music is written in Python and adheres to the coding style described in the python style guide [PEP-8](https://www.python.org/dev/peps/pep-0008/).
+
+Docstrings adhere to [PEP-257](https://www.python.org/dev/peps/pep-0257/). The content of docstrings uses the [Sphinx markup style](http://www.sphinx-doc.org/). Docstrings should be added to all (new) public functions.
+
+Take note of the following rules as a basic style guide, but when in doubt consult PEP-8.
+
+### Line length
+
+>>>
+Limit all lines to a maximum of 79 characters.
+
+For flowing long blocks of text with fewer structural restrictions (docstrings or comments), the line length should be limited to 72 characters.
+>>>
+
+### Indentation
+
+Music uses hanging indents when the lines get too long.
+
+>>>
+When using a hanging indent the following should be considered; there should be no arguments on the first line and further indentation should be used to clearly distinguish itself as a continuation line.
+>>>
+
+```python
+# More indentation included to distinguish this from the rest.
+def long_function_name(
+ var_one, var_two, var_three,
+ var_four):
+ print(var_one)
+
+# Hanging indents should add a level.
+foo = long_function_name(
+ var_one, var_two,
+ var_three, var_four)
+```
+
+### Line break before a binary operator
+
+```python
+# Yes: easy to match operators with operands
+income = (gross_wages
+ + taxable_interest
+ + (dividends - qualified_dividends)
+ - ira_deduction
+ - student_loan_interest)
+
+# Add some extra indentation on the conditional continuation line.
+if (this_is_one_thing
+ and that_is_another_thing):
+ do_something()
+```
+
+### Class internals
+
+All non-public classwide variables or methods should be prepended with an underscore.
+>>>
+_single_leading_underscore: weak "internal use" indicator. E.g. from M import * does not import objects whose name starts with an underscore.
+>>>
+
+### Type checking
+
+Post 3.38 Music is starting to use type checking for all new code. This means that all arguments, returns values and variables have defined types and these types are checked for errors during the CI phase. Music uses [mypy](http://www.mypy-lang.org/) for the type checking pass.
+
+The specific syntax is best learned from the code already adapted ([coresong.py](gnomemusic/coresong.py), [grltrackerwrapper.py](gnomemusic/grilowrappers/grltrackerwrapper.py)) or online sources, note that Music uses the annotation style. A simple example follows.
+
+###### Old
+```python
+x = []
+
+x.append(1)
+```
+
+###### New
+```python
+from typing import List
+
+x: List[int] = []
+
+x.append(1)
+```
+
+#### Properties
+
+Mypy does not currently support PyGObject properties. This means property setters need to be forceibly ignored.
+
+```python
+@GObject.Property(type=bool, default=False)
+def selected(self) -> bool:
+ return self._selected
+
+@selected.setter # type: ignore
+def selected(self, value: bool) -> None:
+ self._selected = value
+```
+
+### PyGObject specifics
+
+#### Properties
+
+Most objects in Music are derived from GObject and have properties. Use [PyGObject properties](https://pygobject.readthedocs.io/en/latest/guide/api/properties.html) through decorator usage if you add properties to your code.
+
+Short form for simple properties:
+
+```python
+selected = GObject.Property(type=bool, default=False)
+```
+
+With method definition if more control is needed:
+
+```python
+@GObject.Property(type=bool, default=False)
+def selection_mode(self):
+ return self._selection_mode
+
+@selection_mode.setter
+def selection_mode(self, value):
+ self._selection_mode = value
+```
+
+Manipulate and refer to GObject properties with the *props* attribute to set them apart from regular python attributes:
+
+```python
+is_selected = object.props.selected
+
+object.props.selection_mode = True
+```
+
+##### Multi-word properties
+
+Note that GObject multi-word properties are separated by `-` as in `'selection-mode'`, however Python does not allow `-` in variable or method names. So these are translated to `_` instead. You might find both `'selection-mode'` and `selection_mode` in the code (depending on how they are used), but they refer to the same property.
+
+#### Templates
+
+Music uses ui templates extensively for building the user interface. The basic usage in Python is as follows, with the `widget.ui` file being a regular GTK template:
+
+```python
+@Gtk.Template(resource_path="/org/gnome/Music/widget.ui")
+class Widget(Gtk.Widget):
+
+ __gtype_name__ = "Widget"
+
+ _button = Gtk.Template.Child()
+
+ @Gtk.Template.Callback()
+ def _on_button_clicked(self, klass):
+ pass
+```
+
+## Commit messages
+
+Music is fairly strict on the format and contents of commit messages. New contributors often struggle with this.
+
+The GNOME wiki has a good [intro](https://wiki.gnome.org/Git/CommitMessages) on what a proper commit message is and this is a **must read** for first-time contributors.
+
+It is always recommended to look at other Music commit messages as well to get an idea of what a good commit message is specific to Music.
+
+It should look somewhat like:
+
+>>>
+tag: Short explanation
+
+Problem in some detail.
+Implemented fix.
+
+Closes: #issuenr
+>>>
+
+## Merge requests
+
+When opening a Merge Request, please enable the [_'Allow commits from members who can merge to the target branch'_](https://docs.gitlab.com/ee/user/project/merge_requests/allow_collaboration.html) checkbox. This allows the Music maintainers to help out on the Merge Request as needed.
diff --git a/data/icons/hicolor/scalable/apps/org.gnome.Music.Devel.svg b/data/icons/hicolor/scalable/apps/org.gnome.Music.Devel.svg
new file mode 100644
index 00000000..b1291f2f
--- /dev/null
+++ b/data/icons/hicolor/scalable/apps/org.gnome.Music.Devel.svg
@@ -0,0 +1,108 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128">
+ <defs>
+ <linearGradient id="o" gradientUnits="userSpaceOnUse" x1="116.205" y1="238" x2="600.205" y2="-316.08" gradientTransform="translate(0 -172)">
+ <stop offset="0" stop-color="#b2d1e9"/>
+ <stop offset=".136" stop-color="#c0c6cd"/>
+ <stop offset=".453" stop-color="#d2dee8"/>
+ <stop offset=".72" stop-color="#bfc5ce"/>
+ <stop offset=".937" stop-color="#dbe2e8"/>
+ <stop offset="1" stop-color="#e4e6e8"/>
+ </linearGradient>
+ <linearGradient id="q" gradientUnits="userSpaceOnUse" x1="99.846" y1="91.301" x2="431.139" y2="91.301" gradientTransform="rotate(90 47.387 40.864) scale(.26563)">
+ <stop offset="0" stop-color="#f6d32d"/>
+ <stop offset="1" stop-color="#f9f06b"/>
+ </linearGradient>
+ <linearGradient id="e" gradientUnits="userSpaceOnUse" x1="116.205" y1="238" x2="600.205" y2="-316.08" gradientTransform="translate(0 -172)">
+ <stop offset="0" stop-color="#b2d1e9"/>
+ <stop offset=".136" stop-color="#c0c6cd"/>
+ <stop offset=".453" stop-color="#d2dee8"/>
+ <stop offset=".72" stop-color="#bfc5ce"/>
+ <stop offset=".937" stop-color="#dbe2e8"/>
+ <stop offset="1" stop-color="#e4e6e8"/>
+ </linearGradient>
+ <linearGradient id="f" gradientUnits="userSpaceOnUse" x1="116.205" y1="238" x2="600.205" y2="-316.08" gradientTransform="translate(0 -172)">
+ <stop offset="0" stop-color="#b2d1e9"/>
+ <stop offset=".136" stop-color="#c0c6cd"/>
+ <stop offset=".453" stop-color="#d2dee8"/>
+ <stop offset=".72" stop-color="#bfc5ce"/>
+ <stop offset=".937" stop-color="#dbe2e8"/>
+ <stop offset="1" stop-color="#e4e6e8"/>
+ </linearGradient>
+ <linearGradient id="g" gradientUnits="userSpaceOnUse" x1="99.846" y1="91.301" x2="431.139" y2="91.301" gradientTransform="rotate(90 47.387 40.864) scale(.26563)">
+ <stop offset="0" stop-color="#f6d32d"/>
+ <stop offset="1" stop-color="#f9f06b"/>
+ </linearGradient>
+ <linearGradient id="j" gradientUnits="userSpaceOnUse" x1="300" y1="235" x2="428" y2="235" gradientTransform="matrix(0 .37 -.98462 0 295.385 -30.36)">
+ <stop offset="0" stop-color="#f9f06b"/>
+ <stop offset="1" stop-color="#f5c211"/>
+ </linearGradient>
+ <linearGradient id="p" gradientUnits="userSpaceOnUse" x1="116.205" y1="238" x2="600.205" y2="-316.08" gradientTransform="translate(0 -172)">
+ <stop offset="0" stop-color="#b2d1e9"/>
+ <stop offset=".136" stop-color="#c0c6cd"/>
+ <stop offset=".453" stop-color="#d2dee8"/>
+ <stop offset=".72" stop-color="#bfc5ce"/>
+ <stop offset=".937" stop-color="#dbe2e8"/>
+ <stop offset="1" stop-color="#e4e6e8"/>
+ </linearGradient>
+ <clipPath id="i">
+ <path d="M0 0h128v128H0z"/>
+ </clipPath>
+ <clipPath id="d">
+ <path d="M0 0h128v128H0z"/>
+ </clipPath>
+ <clipPath id="k">
+ <path d="M0 0h128v128H0z"/>
+ </clipPath>
+ <clipPath id="a">
+ <path d="M0 0h128v128H0z"/>
+ </clipPath>
+ <g id="n" clip-path="url(#a)" filter="url(#b)">
+ <use xlink:href="#c"/>
+ </g>
+ <g id="c" clip-path="url(#d)">
+ <path d="M20 12h88a8 8 0 018 8v88a8 8 0 01-8 8H20a8 8 0 01-8-8V20a8 8 0 018-8zm0 0" fill="url(#e)"/>
+ <path d="M124 64c0 33.137-26.863 60-60 60S4 97.137 4 64 30.863 4 64 4s60 26.863 60 60zm0 0" fill="url(#f)"/>
+ <path d="M116 64c0 28.719-23.281 52-52 52S12 92.719 12 64c0-28.723 23.281-52.004 52-52.004S116 35.277 116 64zm0 0"/>
+ <path d="M112 64c0 26.508-21.492 48-48 48S16 90.508 16 64c0-26.512 21.492-48.004 48-48.004S112 37.488 112 64zm0 0" fill="#2a2a3b"/>
+ <path d="M64 108c-24.3 0-44-19.7-44-44s19.7-44 44-44 44 19.7 44 44-19.7 44-44 44zm0 0" fill="url(#g)"/>
+ <path d="M84 64c0 11.047-8.953 20-20 20s-20-8.953-20-20 8.953-20.004 20-20.004S84 52.953 84 64zm0 0"/>
+ <path d="M79.453 59.86c2.29 8.535-2.777 17.308-11.312 19.597-8.536 2.285-17.309-2.781-19.594-11.316-2.29-8.536 2.777-17.309 11.312-19.598 8.536-2.285 17.309 2.781 19.594 11.316zm0 0" fill="url(#h)"/>
+ <path d="M24 106c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm84 0c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm0-84c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm-84 0c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm0 0"/>
+ </g>
+ <g id="l" clip-path="url(#i)">
+ <path d="M128 80.64V128H0V80.64zm0 0" fill="url(#j)"/>
+ <path d="M13.309 80.64L60.664 128H81.88L34.52 80.64zm42.421 0L103.094 128h21.215L76.945 80.64zm42.43 0L128 110.48V89.27l-8.629-8.63zM0 88.548v21.215L18.238 128h21.215zm0 0"/>
+ </g>
+ <g id="s" clip-path="url(#k)">
+ <use xlink:href="#l" mask="url(#m)"/>
+ </g>
+ <radialGradient id="h" gradientUnits="userSpaceOnUse" cx="273.943" cy="67.198" fx="273.943" fy="67.198" r="56" gradientTransform="matrix(.25657 -.06875 .06875 .2566 -10.396 58.824)">
+ <stop offset="0" stop-color="#fff"/>
+ <stop offset="1" stop-color="#c4c5c3"/>
+ </radialGradient>
+ <radialGradient id="r" gradientUnits="userSpaceOnUse" cx="273.943" cy="67.198" fx="273.943" fy="67.198" r="56" gradientTransform="matrix(.25657 -.06875 .06875 .2566 -10.396 58.824)">
+ <stop offset="0" stop-color="#fff"/>
+ <stop offset="1" stop-color="#c4c5c3"/>
+ </radialGradient>
+ <mask id="t">
+ <use xlink:href="#n"/>
+ </mask>
+ <mask id="m">
+ <g filter="url(#b)">
+ <path fill-opacity=".8" d="M0 0h128v128H0z"/>
+ </g>
+ </mask>
+ <filter id="b" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feColorMatrix in="SourceGraphic" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+ </filter>
+ </defs>
+ <path d="M20 12h88a8 8 0 018 8v88a8 8 0 01-8 8H20a8 8 0 01-8-8V20a8 8 0 018-8zm0 0" fill="url(#o)"/>
+ <path d="M124 64c0 33.137-26.863 60-60 60S4 97.137 4 64 30.863 4 64 4s60 26.863 60 60zm0 0" fill="url(#p)"/>
+ <path d="M116 64c0 28.719-23.281 52-52 52S12 92.719 12 64c0-28.723 23.281-52.004 52-52.004S116 35.277 116 64zm0 0"/>
+ <path d="M112 64c0 26.508-21.492 48-48 48S16 90.508 16 64c0-26.512 21.492-48.004 48-48.004S112 37.488 112 64zm0 0" fill="#2a2a3b"/>
+ <path d="M64 108c-24.3 0-44-19.7-44-44s19.7-44 44-44 44 19.7 44 44-19.7 44-44 44zm0 0" fill="url(#q)"/>
+ <path d="M84 64c0 11.047-8.953 20-20 20s-20-8.953-20-20 8.953-20.004 20-20.004S84 52.953 84 64zm0 0"/>
+ <path d="M79.453 59.86c2.29 8.535-2.777 17.308-11.312 19.597-8.536 2.285-17.309-2.781-19.594-11.316-2.29-8.536 2.777-17.309 11.312-19.598 8.536-2.285 17.309 2.781 19.594 11.316zm0 0" fill="url(#r)"/>
+ <path d="M24 106c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm84 0c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm0-84c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm-84 0c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm0 0"/>
+ <use xlink:href="#s" mask="url(#t)"/>
+</svg>
diff --git a/data/icons/hicolor/scalable/apps/org.gnome.Music.svg b/data/icons/hicolor/scalable/apps/org.gnome.Music.svg
new file mode 100644
index 00000000..2bc77446
--- /dev/null
+++ b/data/icons/hicolor/scalable/apps/org.gnome.Music.svg
@@ -0,0 +1,36 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128" width="128">
+ <defs>
+ <linearGradient gradientTransform="translate(0 -172)" y2="-316.08" x2="600.205" y1="238" x1="116.205" gradientUnits="userSpaceOnUse" id="a">
+ <stop stop-color="#b2d1e9" offset="0"/>
+ <stop stop-color="#c0c6cd" offset=".136"/>
+ <stop stop-color="#d2dee8" offset=".453"/>
+ <stop stop-color="#bfc5ce" offset=".72"/>
+ <stop stop-color="#dbe2e8" offset=".937"/>
+ <stop stop-color="#e4e6e8" offset="1"/>
+ </linearGradient>
+ <linearGradient gradientTransform="translate(0 -172)" y2="-316.08" x2="600.205" y1="238" x1="116.205" gradientUnits="userSpaceOnUse" id="b">
+ <stop stop-color="#b2d1e9" offset="0"/>
+ <stop stop-color="#c0c6cd" offset=".136"/>
+ <stop stop-color="#d2dee8" offset=".453"/>
+ <stop stop-color="#bfc5ce" offset=".72"/>
+ <stop stop-color="#dbe2e8" offset=".937"/>
+ <stop stop-color="#e4e6e8" offset="1"/>
+ </linearGradient>
+ <linearGradient gradientTransform="rotate(90 47.387 40.864) scale(.26563)" y2="91.301" x2="431.139" y1="91.301" x1="99.846" gradientUnits="userSpaceOnUse" id="c">
+ <stop stop-color="#f6d32d" offset="0"/>
+ <stop stop-color="#f9f06b" offset="1"/>
+ </linearGradient>
+ <radialGradient gradientTransform="matrix(.25657 -.06875 .06875 .2566 -10.396 58.824)" r="56" fy="67.198" fx="273.943" cy="67.198" cx="273.943" gradientUnits="userSpaceOnUse" id="d">
+ <stop stop-color="#fff" offset="0"/>
+ <stop stop-color="#c4c5c3" offset="1"/>
+ </radialGradient>
+ </defs>
+ <path fill="url(#a)" d="M20 12h88a8 8 0 018 8v88a8 8 0 01-8 8H20a8 8 0 01-8-8V20a8 8 0 018-8zm0 0"/>
+ <path fill="url(#b)" d="M124 64c0 33.137-26.863 60-60 60S4 97.137 4 64 30.863 4 64 4s60 26.863 60 60zm0 0"/>
+ <path d="M116 64c0 28.719-23.281 52-52 52S12 92.719 12 64c0-28.723 23.281-52.004 52-52.004S116 35.277 116 64zm0 0"/>
+ <path fill="#2a2a3b" d="M112 64c0 26.508-21.492 48-48 48S16 90.508 16 64c0-26.512 21.492-48.004 48-48.004S112 37.488 112 64zm0 0"/>
+ <path fill="url(#c)" d="M64 108c-24.3 0-44-19.7-44-44s19.7-44 44-44 44 19.7 44 44-19.7 44-44 44zm0 0"/>
+ <path d="M84 64c0 11.047-8.953 20-20 20s-20-8.953-20-20 8.953-20.004 20-20.004S84 52.953 84 64zm0 0"/>
+ <path fill="url(#d)" d="M79.453 59.86c2.29 8.535-2.777 17.308-11.312 19.597-8.536 2.285-17.309-2.781-19.594-11.316-2.29-8.536 2.777-17.309 11.312-19.598 8.536-2.285 17.309 2.781 19.594 11.316zm0 0"/>
+ <path d="M24 106c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm84 0c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm0-84c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm-84 0c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm0 0"/>
+</svg>
diff --git a/data/icons/hicolor/symbolic/apps/org.gnome.Music-symbolic.svg b/data/icons/hicolor/symbolic/apps/org.gnome.Music-symbolic.svg
new file mode 100644
index 00000000..95db22b2
--- /dev/null
+++ b/data/icons/hicolor/symbolic/apps/org.gnome.Music-symbolic.svg
@@ -0,0 +1,28 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='gnome-music-symbolic.svg' height='16.000021' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.5 r10040' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-20.161588' inkscape:cy='0.43776036' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='8'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-142px' originy='-341.99998px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='apps' style='display:inline' transform='translate(-383.0002,125)'>
+
+ <path inkscape:connector-curvature='0' d='m 391.0002,-125 c -4.40643,0 -8,3.59357 -8,8 0,4.40643 3.59357,8 8,8 4.40643,0 8,-3.59357 8,-8 0,-4.40643 -3.59357,-8 -8,-8 z m 0,2 c 3.32555,0 6,2.67445 6,6 0,3.32555 -2.67445,6 -6,6 -3.32555,0 -6,-2.67445 -6,-6 0,-3.32555 2.67445,-6 6,-6 z' id='path3869' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path sodipodi:cx='1.2423376' sodipodi:cy='1.3786418' d='m 2.0387079,1.3786418 a 0.79637027,0.79637027 0 1 1 -1.59274058,0 0.79637027,0.79637027 0 1 1 1.59274058,0 z' id='path9013' sodipodi:rx='0.79637027' sodipodi:ry='0.79637027' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.883546,0,0,1.883546,382.1602,-126.09672)' sodipodi:type='arc'/>
+ <path sodipodi:cx='1.2423376' sodipodi:cy='1.3786418' d='m 2.0387079,1.3786418 a 0.79637027,0.79637027 0 1 1 -1.59274058,0 0.79637027,0.79637027 0 1 1 1.59274058,0 z' id='path9013-9' sodipodi:rx='0.79637027' sodipodi:ry='0.79637027' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.8835459,0,0,1.8835459,395.1602,-126.09672)' sodipodi:type='arc'/>
+ <path sodipodi:cx='1.2423376' sodipodi:cy='1.3786418' d='m 2.0387079,1.3786418 a 0.79637027,0.79637027 0 1 1 -1.59274058,0 0.79637027,0.79637027 0 1 1 1.59274058,0 z' id='path9013-5' sodipodi:rx='0.79637027' sodipodi:ry='0.79637027' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.8835459,0,0,1.8835459,382.1602,-113.09671)' sodipodi:type='arc'/>
+ <path sodipodi:cx='1.2423376' sodipodi:cy='1.3786418' d='m 2.0387079,1.3786418 a 0.79637027,0.79637027 0 1 1 -1.59274058,0 0.79637027,0.79637027 0 1 1 1.59274058,0 z' id='path9013-9-1' sodipodi:rx='0.79637027' sodipodi:ry='0.79637027' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.883546,0,0,1.883546,395.1602,-113.09671)' sodipodi:type='arc'/>
+ <path sodipodi:cx='1.2423376' sodipodi:cy='1.3786418' d='m 2.0387079,1.3786418 a 0.79637027,0.79637027 0 1 1 -1.59274058,0 0.79637027,0.79637027 0 1 1 1.59274058,0 z' id='path9013-7' sodipodi:rx='0.79637027' sodipodi:ry='0.79637027' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(3.7670919,0,0,3.7670919,386.3202,-122.19345)' sodipodi:type='arc'/>
+ </g>
+</svg>
diff --git a/data/icons/music-artist-symbolic.svg b/data/icons/music-artist-symbolic.svg
new file mode 100644
index 00000000..e42973f1
--- /dev/null
+++ b/data/icons/music-artist-symbolic.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 2a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM6.5 9A4.49 4.49 0 0 0 2 13.5v.5c0 1 1 1 1 1h6.188A2.935 2.935 0 0 1 9 14c0-1.645 1.355-3 3-3V9.756A4.485 4.485 0 0 0 9.5 9h-3zM13 9v3.27a2 2 0 0 0-1-.27 2 2 0 0 0-2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2v-3h2V9h-3z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/music-playlist-symbolic.svg b/data/icons/music-playlist-symbolic.svg
new file mode 100644
index 00000000..7f80d5fb
--- /dev/null
+++ b/data/icons/music-playlist-symbolic.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#241f31" d="M3 3v2h10V3H3zm0 4v2h7.979V7H3zm9 0v3.27a2 2 0 0 0-1-.27 2 2 0 0 0-2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2V9h2V7h-3zm-9 4v2h5.01L8 11H3z"/></svg> \ No newline at end of file
diff --git a/data/icons/welcome-music.svg b/data/icons/welcome-music.svg
new file mode 100644
index 00000000..e8c9ed18
--- /dev/null
+++ b/data/icons/welcome-music.svg
@@ -0,0 +1,551 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ height="600"
+ width="800"
+ version="1.1"
+ id="svg181"
+ sodipodi:docname="welcome-music.svg"
+ inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview183"
+ pagecolor="#ffffff"
+ bordercolor="#999999"
+ borderopacity="1"
+ inkscape:pageshadow="0"
+ inkscape:pageopacity="0"
+ inkscape:pagecheckerboard="0"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="284.5"
+ inkscape:cy="485"
+ inkscape:window-width="3840"
+ inkscape:window-height="2091"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg181" />
+ <defs
+ id="defs57">
+ <linearGradient
+ id="d">
+ <stop
+ style="stop-color:#bfbebc;stop-opacity:1"
+ offset="0"
+ id="stop2" />
+ <stop
+ style="stop-color:#9f9e9b;stop-opacity:.94509804"
+ offset=".854"
+ id="stop4" />
+ <stop
+ style="stop-color:#b8b7b4;stop-opacity:.93725497"
+ offset="1"
+ id="stop6" />
+ </linearGradient>
+ <linearGradient
+ id="e">
+ <stop
+ style="stop-color:#555458;stop-opacity:1"
+ offset="0"
+ id="stop9" />
+ <stop
+ style="stop-color:#77767b;stop-opacity:1"
+ offset="1"
+ id="stop11" />
+ </linearGradient>
+ <linearGradient
+ id="c">
+ <stop
+ style="stop-color:#5e5c64;stop-opacity:1"
+ offset="0"
+ id="stop14" />
+ <stop
+ style="stop-color:#737178;stop-opacity:1"
+ offset=".033"
+ id="stop16" />
+ <stop
+ style="stop-color:#64626a;stop-opacity:1"
+ offset=".103"
+ id="stop18" />
+ <stop
+ style="stop-color:#5e5c64;stop-opacity:1"
+ offset=".613"
+ id="stop20" />
+ <stop
+ style="stop-color:#5d5a63;stop-opacity:1"
+ offset=".729"
+ id="stop22" />
+ <stop
+ style="stop-color:#4a494f;stop-opacity:1"
+ offset="1"
+ id="stop24" />
+ </linearGradient>
+ <linearGradient
+ id="b">
+ <stop
+ style="stop-color:#5e5c64;stop-opacity:1"
+ offset="0"
+ id="stop27" />
+ <stop
+ style="stop-color:#65636a;stop-opacity:1"
+ offset=".033"
+ id="stop29" />
+ <stop
+ style="stop-color:#4c4a51;stop-opacity:1"
+ offset=".103"
+ id="stop31" />
+ <stop
+ style="stop-color:#4e4d53;stop-opacity:1"
+ offset=".708"
+ id="stop33" />
+ <stop
+ style="stop-color:#525057;stop-opacity:1"
+ offset=".832"
+ id="stop35" />
+ <stop
+ style="stop-color:#38373c;stop-opacity:1"
+ offset="1"
+ id="stop37" />
+ </linearGradient>
+ <linearGradient
+ xlink:href="#a"
+ id="f"
+ x1="59.779999"
+ y1="600.52698"
+ x2="1130.7271"
+ y2="600.52698"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="a">
+ <stop
+ style="stop-color:#2ec27e;stop-opacity:1"
+ offset="0"
+ id="stop41" />
+ <stop
+ style="stop-color:#62a0ea;stop-opacity:1"
+ offset="1"
+ id="stop43" />
+ </linearGradient>
+ <linearGradient
+ xlink:href="#b"
+ id="i"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(230,179)"
+ x1="605.07397"
+ y1="363.14801"
+ x2="689.59003"
+ y2="363.14801" />
+ <linearGradient
+ xlink:href="#c"
+ id="j"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(230,179)"
+ x1="604.91302"
+ y1="412.03699"
+ x2="695.55603"
+ y2="412.03699" />
+ <radialGradient
+ xlink:href="#d"
+ id="k"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.23242,0,0,1.23242,103.628,87.555)"
+ cx="543.71802"
+ cy="393.44299"
+ fx="543.71802"
+ fy="393.44299"
+ r="50" />
+ <radialGradient
+ xlink:href="#e"
+ id="l"
+ cx="545"
+ cy="387.793"
+ fx="545"
+ fy="387.793"
+ r="29.997"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.18529,0,0,2.18529,-415.981,-290.826)" />
+ <radialGradient
+ xlink:href="#d"
+ id="m"
+ cx="543.71802"
+ cy="393.44299"
+ fx="543.71802"
+ fy="393.44299"
+ r="50"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.23242,0,0,1.23242,103.628,87.555)" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="g">
+ <rect
+ ry="32"
+ rx="32"
+ y="-116"
+ x="32.5"
+ height="320"
+ width="447"
+ style="opacity:1;fill:#fb8c14;fill-opacity:1;stroke:none;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:4, 2;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect51" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="h">
+ <path
+ style="opacity:1;fill:#949390;fill-opacity:1;stroke:none;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:11.2;stroke-opacity:1"
+ d="m 208,4 h 96 v 48 h -96 z"
+ id="path54" />
+ </clipPath>
+ </defs>
+ <g
+ transform="matrix(0.6666321,0,0,0.66706216,21.101698,-82.283362)"
+ style="display:inline"
+ id="g179">
+ <path
+ style="display:inline;fill:url(#f);fill-opacity:1;stroke:none;stroke-width:2.68319;stroke-linejoin:round;stop-color:#000000"
+ d="m 830.003,275.638 v 107.317 a 13.27,13.27 135 0 1 -13.27,13.27 h -0.291 a 13.27,13.27 45 0 1 -13.271,-13.27 26.977,26.977 45 0 0 -26.977,-26.977 26.832,26.832 134.69 0 0 -26.687,26.977 v 123.14 a 13.27,13.27 135 0 1 -13.27,13.27 h -0.291 a 13.27,13.27 45 0 1 -13.27,-13.27 v -17.44 a 24,24 45 0 0 -24,-24 h -5.664 a 24,24 135 0 0 -24,24 v 23.093 a 13.27,13.27 135 0 1 -13.271,13.27 h -0.29 a 13.27,13.27 45 0 1 -13.271,-13.27 v -51.275 a 24,24 45 0 0 -24,-24 h -5.664 a 24,24 135 0 0 -24,24 v 2.978 a 13.27,13.27 135 0 1 -13.27,13.27 h -0.291 a 13.27,13.27 45 0 1 -13.271,-13.27 V 342.707 A 26.977,26.977 45 0 0 534.707,315.73 26.832,26.832 134.69 0 0 508.02,342.707 v 67.08 a 13.27,13.27 135 0 1 -13.27,13.27 h -0.291 a 13.27,13.27 45 0 1 -13.27,-13.27 26.977,26.977 45 0 0 -26.978,-26.977 26.832,26.832 134.69 0 0 -26.686,26.977 13.27,13.27 135 0 1 -13.271,13.27 h -0.29 a 13.27,13.27 45 0 1 -13.271,-13.27 v -134.16 a 26.977,26.977 45 0 0 -26.978,-26.977 26.832,26.832 134.69 0 0 -26.686,26.977 v 93.912 a 13.27,13.27 135 0 1 -13.27,13.27 h -0.291 a 13.27,13.27 45 0 1 -13.271,-13.27 26.977,26.977 45 0 0 -26.977,-26.977 26.832,26.832 134.69 0 0 -26.687,26.977 v 80.496 a 13.27,13.27 135 0 1 -13.27,13.27 h -0.291 a 13.27,13.27 45 0 1 -13.27,-13.27 26.977,26.977 45 0 0 -26.978,-26.978 26.832,26.832 134.69 0 0 -26.686,26.978 v 53.663 a 13.27,13.27 135 0 1 -13.271,13.271 h -0.29 a 13.27,13.27 45 0 1 -13.271,-13.27 26.977,26.977 45 0 0 -26.978,-26.978 26.832,26.832 134.69 0 0 -26.686,26.977 22.861,22.861 137.566 0 1 -23.999,21.94 L 53.847,525.32 a 23.726,23.726 135.328 0 0 -23.998,23.725 24.049,24.049 45.036 0 0 24,24.03 l 27.693,0.078 a 24.068,24.068 45.08 0 1 24,24.068 v 0.071 a 26.977,26.977 45 0 0 26.977,26.977 26.832,26.832 134.69 0 0 26.687,-26.977 13.257,13.257 135.059 0 1 13.27,-13.243 h 0.29 a 13.27,13.27 45 0 1 13.272,13.27 v 53.664 a 26.977,26.977 45 0 0 26.977,26.977 26.832,26.832 134.69 0 0 26.686,-26.977 13.27,13.27 135 0 1 13.271,-13.27 h 0.29 a 13.27,13.27 45 0 1 13.271,13.27 v 80.496 a 26.977,26.977 45 0 0 26.977,26.977 26.832,26.832 134.69 0 0 26.687,-26.977 13.27,13.27 135 0 1 13.27,-13.27 h 0.291 a 13.27,13.27 45 0 1 13.27,13.27 v 93.911 a 26.977,26.977 45 0 0 26.978,26.978 26.832,26.832 134.69 0 0 26.687,-26.978 V 691.231 a 13.27,13.27 135 0 1 13.27,-13.27 h 0.29 a 13.27,13.27 45 0 1 13.272,13.27 26.977,26.977 45 0 0 26.977,26.977 26.832,26.832 134.69 0 0 26.686,-26.977 13.27,13.27 135 0 1 13.271,-13.27 h 0.29 a 13.27,13.27 45 0 1 13.271,13.27 v 67.08 a 26.977,26.977 45 0 0 26.977,26.977 26.832,26.832 134.69 0 0 26.687,-26.977 V 637.567 a 13.27,13.27 135 0 1 13.27,-13.27 h 0.291 a 13.27,13.27 45 0 1 13.27,13.27 26.977,26.977 45 0 0 26.978,26.977 26.832,26.832 134.69 0 0 26.687,-26.977 V 589.27 A 13.27,13.27 135 0 1 655.45,576 h 0.29 a 13.27,13.27 45 0 1 13.272,13.27 26.977,26.977 45 0 0 26.977,26.977 26.832,26.832 134.69 0 0 26.686,-26.977 13.27,13.27 135 0 1 13.271,-13.27 h 0.29 a 13.27,13.27 45 0 1 13.271,13.27 v 128.793 a 26.977,26.977 45 0 0 26.977,26.977 26.832,26.832 134.69 0 0 26.687,-26.977 13.27,13.27 135 0 1 13.27,-13.27 h 0.291 a 13.27,13.27 45 0 1 13.27,13.27 v 81.891 a 26.977,26.977 45 0 0 26.978,26.978 26.832,26.832 134.69 0 0 26.687,-26.978 v -93.911 a 13.27,13.27 135 0 1 13.27,-13.27 h 0.29 a 13.27,13.27 45 0 1 13.272,13.27 26.977,26.977 45 0 0 26.977,26.977 26.832,26.832 134.69 0 0 26.686,-26.977 V 597.319 a 13.27,13.27 135 0 1 13.271,-13.27 h 0.29 a 13.27,13.27 45 0 1 13.271,13.27 26.977,26.977 45 0 0 26.977,26.978 26.832,26.832 134.69 0 0 26.687,-26.978 v -0.274 a 23.935,23.935 135.077 0 1 24,-23.935 l 17.247,0.047 a 23.935,23.935 135.077 0 0 24,-23.936 23.62,23.62 44.117 0 0 -24,-23.271 l -17.247,0.026 a 23.963,23.963 44.956 0 1 -24,-23.963 26.148,26.148 43.153 0 0 -26.977,-25.292 26.832,26.832 134.69 0 0 -26.687,26.977 13.27,13.27 135 0 1 -13.27,13.271 h -0.291 a 13.27,13.27 45 0 1 -13.27,-13.27 V 369.549 A 26.977,26.977 45 0 0 937.185,342.572 26.832,26.832 134.69 0 0 910.5,369.55 13.27,13.27 135 0 1 897.229,382.821 h -0.29 a 13.27,13.27 45 0 1 -13.271,-13.27 v -93.912 a 26.977,26.977 45 0 0 -26.978,-26.977 26.832,26.832 134.69 0 0 -26.686,26.977 z"
+ id="path59" />
+ <g
+ style="display:inline;enable-background:new"
+ transform="matrix(-1.76362,0,0,-1.76362,-682.748,759.448)"
+ id="g91">
+ <rect
+ ry="8"
+ rx="8"
+ y="217.77499"
+ x="-686.78699"
+ height="80"
+ width="111.75"
+ style="display:inline;opacity:1;fill:#d5d3cf;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ id="rect61" />
+ <rect
+ ry="4"
+ rx="4"
+ y="225.77499"
+ x="-678.91199"
+ height="56"
+ width="96"
+ style="display:inline;opacity:1;fill:#ed333b;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ id="rect63" />
+ <rect
+ ry="7.9879999"
+ rx="7.9879999"
+ y="245.77499"
+ x="-658.90002"
+ height="15.975"
+ width="55.974998"
+ style="display:inline;opacity:1;fill:#d5d3cf;fill-opacity:1;stroke:#d5d3cf;stroke-width:8;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:11.2;stroke-opacity:1;enable-background:new"
+ id="rect65" />
+ <circle
+ r="7.9879999"
+ cy="253.76199"
+ cx="-650.91199"
+ style="display:inline;opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ id="circle67" />
+ <circle
+ style="display:inline;opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ cx="-610.91199"
+ cy="253.76199"
+ r="7.9879999"
+ id="circle69" />
+ <g
+ transform="matrix(0.25,0,0,0.25,-694.912,246.775)"
+ style="display:inline;fill:#949390;fill-opacity:1;stroke:#949390;stroke-opacity:1;enable-background:new"
+ clip-path="url(#g)"
+ id="g73">
+ <path
+ style="fill:#949390;fill-opacity:1;stroke:#949390;stroke-width:32;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="M 128,236 H 384 L 352,140 H 160 Z"
+ id="path71" />
+ </g>
+ <g
+ transform="matrix(0.25,0,0,0.25,-694.912,246.775)"
+ style="display:inline;fill:#424048;fill-opacity:1;enable-background:new"
+ id="g83">
+ <circle
+ style="opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:32;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:4, 2;stroke-dashoffset:0;stroke-opacity:1"
+ cx="56"
+ cy="-92"
+ r="8"
+ id="circle75" />
+ <circle
+ r="8"
+ cy="164"
+ cx="56"
+ style="opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:32;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:4, 2;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle77" />
+ <circle
+ r="8"
+ cy="-92"
+ cx="456"
+ style="opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:32;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:4, 2;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle79" />
+ <circle
+ style="opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:32;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:4, 2;stroke-dashoffset:0;stroke-opacity:1"
+ cx="456"
+ cy="164"
+ r="8"
+ id="circle81" />
+ </g>
+ <path
+ style="display:inline;opacity:1;fill:#949390;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:11.2;stroke-opacity:1;enable-background:new"
+ d="m -636.912,247.775 h 12 v 11.975 h -12 z"
+ id="path85" />
+ <path
+ style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:11.2;stroke-opacity:1;enable-background:new"
+ d="m -678.912,231.775 h 96 v 4 h -96 z m 0,40 h 96 v 4 h -96 z"
+ id="path87" />
+ <path
+ d="m -686.787,285.775 v 4 c 0,4.432 3.568,8 8,8 h 95.75 c 4.432,0 8,-3.568 8,-8 v -4 c 0,4.432 -3.568,8 -8,8 h -95.75 c -4.432,0 -8,-3.568 -8,-8 z"
+ style="display:inline;opacity:1;fill:#f3f7fb;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ id="path89" />
+ </g>
+ <g
+ style="display:inline;enable-background:new"
+ transform="matrix(0,1.76362,-1.76362,0,764.466,1146.99)"
+ id="g125">
+ <rect
+ ry="8"
+ rx="8"
+ y="273.77499"
+ x="-424.78699"
+ height="24"
+ width="112"
+ style="display:inline;opacity:1;fill:#1a5fb4;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ id="rect93" />
+ <rect
+ style="display:inline;opacity:1;fill:#62a0ea;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ width="112"
+ height="76"
+ x="-424.78699"
+ y="217.77499"
+ rx="8"
+ ry="8"
+ id="rect95" />
+ <path
+ style="display:inline;fill:#3584e4;fill-opacity:1;stroke:#3584e4;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
+ d="m -396.787,291.775 h 56 l -4,-10 h -48 z"
+ id="path97" />
+ <g
+ transform="translate(-432.787,21.775)"
+ style="display:inline;enable-background:new"
+ id="g107">
+ <circle
+ r="2"
+ cy="202"
+ cx="14"
+ style="display:inline;opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ id="circle99" />
+ <circle
+ style="display:inline;opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ cx="14"
+ cy="266"
+ r="2"
+ id="circle101" />
+ <circle
+ style="display:inline;opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ cx="114"
+ cy="202"
+ r="2"
+ id="circle103" />
+ <circle
+ r="2"
+ cy="266"
+ cx="114"
+ style="display:inline;opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ id="circle105" />
+ </g>
+ <path
+ style="display:inline;opacity:1;fill:#1a5fb4;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ d="m -400.787,291.775 h 64 v 6 h -64 z"
+ id="path109" />
+ <path
+ style="display:inline;opacity:1;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ d="m -408.787,225.775 h 80 l 8,8 v 44 h -96 v -44 z"
+ id="path111" />
+ <g
+ transform="translate(-432.787,21.775)"
+ style="display:inline;enable-background:new"
+ id="g123">
+ <path
+ style="display:inline;opacity:1;fill:#424048;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ d="m 16,218 h 96 v 28 H 16 Z"
+ id="path113" />
+ <circle
+ r="6"
+ cy="232"
+ cx="40"
+ style="display:inline;opacity:1;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ id="circle115" />
+ <circle
+ style="display:inline;opacity:1;fill:#f6f5f4;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 0.5;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ cx="88"
+ cy="232"
+ r="6"
+ id="circle117" />
+ <path
+ style="display:inline;opacity:1;fill:#949390;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:11.2;stroke-opacity:1;enable-background:new"
+ d="m 52,226 h 24 v 12 H 52 Z"
+ id="path119" />
+ <path
+ d="M 272,28 C 272,89.856 221.856,140 160,140 98.144,140 48,89.856 48,28 48,-33.856 98.144,-84 160,-84 c 61.856,0 112,50.144 112,112 z"
+ clip-path="url(#h)"
+ style="display:inline;opacity:0.5;fill:#424048;fill-opacity:1;stroke:none;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:4, 2;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
+ transform="matrix(0.25,0,0,0.25,0,225)"
+ id="path121" />
+ </g>
+ </g>
+ <g
+ transform="matrix(2.52414,0,0,2.52414,-1317.014,-691.54)"
+ id="g171">
+ <ellipse
+ style="display:inline;fill:#494949;fill-opacity:1;stroke:none;stroke-width:2.00885;stroke-linejoin:round;stop-color:#000000"
+ cx="775"
+ cy="519.48499"
+ rx="50"
+ ry="50.444"
+ id="ellipse127" />
+ <path
+ style="display:inline;fill:#3f3f3f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linejoin:round;stop-color:#000000"
+ d="m 810,508 h 55 v 30 h -55 z"
+ id="path129" />
+ <circle
+ style="display:inline;fill:#3f3f3f;fill-opacity:1;stroke:none;stroke-width:2;stroke-linejoin:round;stop-color:#000000"
+ cx="775"
+ cy="521.92902"
+ r="50"
+ id="circle131" />
+ <circle
+ style="display:inline;fill:#373737;fill-opacity:1;stroke:none;stroke-width:1.19986;stroke-linejoin:round;stop-color:#000000"
+ cx="775"
+ cy="521.797"
+ r="29.997"
+ id="circle133" />
+ <path
+ style="display:inline;fill:#3f3f3f;fill-opacity:1;stroke:none;stroke-width:1.74773;stroke-linejoin:round;stop-color:#000000"
+ d="m 823,568 h 42 v 30 h -42 c 3.187,-9.984 2.097,-19.99 0,-30 z"
+ id="path135" />
+ <rect
+ style="display:inline;fill:#231e30;fill-opacity:1;stroke:none;stroke-width:2.08893;stroke-linejoin:round;stop-color:#000000"
+ width="55"
+ height="60"
+ x="835"
+ y="553"
+ rx="7.428"
+ ry="8.1029997"
+ id="rect137" />
+ <path
+ style="display:inline;fill:url(#i);fill-opacity:1;stroke:none;stroke-width:1.90693;stroke-linejoin:round;stop-color:#000000"
+ d="m 842.427,498 c -4.115,0 -7.427,3 -7.427,3 v 40.248 c 0,0.307 0.03,0.605 0.074,0.9 A 5,5 0 0 0 840,548 h 56.28 A 23.644,23.644 0 0 1 920,571.719 V 578 a 5,5 0 0 0 10,0 v -6.281 c 0,-7.1 -2.223,-13.699 -6,-19.145 V 522 l -19,-18 h -15.05 c -0.409,-3.384 -3.543,-6 -7.378,-6 z"
+ id="path139" />
+ <path
+ style="font-variation-settings:normal;display:inline;vector-effect:none;fill:url(#j);fill-opacity:1;stroke:none;stroke-width:1.90693;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
+ d="m 930,528 c 0,19.8 -14.91,28.063 -30,28 h -65 v 52 a 5,5 0 0 0 5,5 h 60 c 14.912,0 30,-14.913 30,-30 v -5 z"
+ id="path141" />
+ <path
+ style="font-variation-settings:normal;display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#6d6b75;stroke-width:10;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
+ d="m 840,501 h 56.281 A 28.718,28.718 45 0 1 925,529.718 27.527,27.527 137.537 0 1 896.28,556 H 840"
+ id="path143" />
+ <path
+ style="font-variation-settings:normal;display:inline;vector-effect:none;fill:#777777;fill-opacity:1;stroke:none;stroke-width:1.90693;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
+ d="m 823,508 h 12 v 1 h -12 z"
+ id="path145" />
+ <path
+ style="display:inline;fill:none;stroke:#c061cb;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 805,409 h 90.145 A 19.855,19.855 45 0 1 915,428.855 17.658,17.658 142.664 0 1 895.145,444 H 694.249 a 17.418,17.418 135 0 0 -17.418,17.418 V 571.582 A 17.418,17.418 45 0 0 694.249,589 h 51.463"
+ id="path147" />
+ <rect
+ style="display:inline;fill:#613583;stroke:none;stroke-width:2;stroke-linejoin:round;stop-color:#000000"
+ width="28"
+ height="10"
+ x="788"
+ y="404"
+ rx="5"
+ ry="5"
+ id="rect149" />
+ <rect
+ style="display:inline;fill:#deddda;stroke:none;stroke-width:2;stroke-linejoin:round;stop-color:#000000"
+ width="18"
+ height="4"
+ x="775"
+ y="407"
+ rx="2"
+ ry="2"
+ id="rect151" />
+ <circle
+ style="display:inline;fill:#deddda;stroke:none;stroke-width:1.39585;stroke-linejoin:round;stop-color:#000000"
+ cx="778.33801"
+ cy="409"
+ r="3.49"
+ id="circle153" />
+ <path
+ style="display:inline;fill:#dadad9;fill-opacity:1;stroke:none;stroke-width:0.761396px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 776.41,406.07 -1.714,0.888 a 2.313,2.313 89.617 0 0 0.028,4.12 l 1.755,0.881 a 0.355,0.355 147.997 0 0 0.514,-0.321 l -0.059,-5.254 a 0.359,0.359 30.978 0 0 -0.523,-0.314 z"
+ id="path155" />
+ <path
+ style="display:inline;fill:#241f31;fill-opacity:1;stroke:none;stroke-width:2;stroke-linejoin:round;stop-color:#000000"
+ d="m 782.95,407 a 2,2 0 0 0 -0.478,0.07 2,2 0 0 1 1.475,1.93 2,2 0 0 1 -1.47,1.93 2,2 0 0 0 0.523,0.07 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.05,0 z m 3.05,0 a 2,2 0 0 0 -0.479,0.07 2,2 0 0 1 1.475,1.93 2,2 0 0 1 -1.47,1.93 2,2 0 0 0 0.523,0.07 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 2,2 0 0 0 -0.05,0 z"
+ id="path157" />
+ <circle
+ style="display:inline;fill:#5d5d5d;fill-opacity:1;stroke:none;stroke-width:2;stroke-linejoin:round;stop-color:#000000"
+ cx="775"
+ cy="576.79901"
+ r="50"
+ id="circle159" />
+ <circle
+ style="display:inline;fill:url(#k);fill-opacity:1;stroke:none;stroke-width:2;stroke-linejoin:round;stop-color:#000000"
+ cx="775"
+ cy="584.04797"
+ r="50"
+ id="circle161" />
+ <circle
+ style="display:inline;fill:url(#l);fill-opacity:1;stroke:none;stroke-width:1.19986;stroke-linejoin:round;stop-color:#000000"
+ cx="775"
+ cy="584.04797"
+ r="29.997"
+ id="circle163" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:url(#m);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
+ d="m 765,549 c 2.655,11.465 4,23.232 4,35 0,11.768 -1.345,23.535 -4,35 h 20 a 155.291,155.291 0 0 1 -4,-35 c 0,-11.768 1.345,-23.535 4,-35 z"
+ id="path165" />
+ <path
+ style="display:inline;fill:none;fill-opacity:1;stroke:#a6a6a6;stroke-width:1.89499;stroke-linejoin:round;stroke-opacity:1;stop-color:#000000"
+ d="m 741.5,550.549 a 47.375,47.375 0 0 1 66.999,0"
+ id="path167" />
+ <path
+ style="font-variation-settings:normal;display:inline;vector-effect:none;fill:#777777;fill-opacity:1;stroke:none;stroke-width:1.90693;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000"
+ d="m 823,567 h 12 v 1 h -12 z"
+ id="path169" />
+ </g>
+ <rect
+ style="fill:#949390;fill-opacity:1;stroke:none;stroke-width:56.7699;stroke-linecap:round;stroke-linejoin:round;stop-color:#000000"
+ width="13.246"
+ height="3.7850001"
+ x="373.78799"
+ y="236.38699"
+ rx="0"
+ ry="0"
+ id="rect173" />
+ <rect
+ style="fill:#949390;fill-opacity:1;stroke:none;stroke-width:111.494;stroke-linecap:round;stroke-linejoin:round;stop-color:#000000"
+ width="51.092999"
+ height="3.7850001"
+ x="407.85001"
+ y="236.38699"
+ rx="0"
+ ry="0"
+ id="rect175" />
+ <rect
+ style="fill:#949390;fill-opacity:1;stroke:none;stroke-width:56.7699;stroke-linecap:round;stroke-linejoin:round;stop-color:#000000"
+ width="13.246"
+ height="3.7850001"
+ x="472.189"
+ y="236.38699"
+ rx="0"
+ ry="0"
+ id="rect177" />
+ </g>
+</svg>
diff --git a/data/meson.build b/data/meson.build
new file mode 100644
index 00000000..7b364dc5
--- /dev/null
+++ b/data/meson.build
@@ -0,0 +1,84 @@
+# Compiling the resources
+# about_dialog is defined in data/ui/meson.build to generate the output file in that directory
+gnome.compile_resources(
+ PROJECT_RDNN_NAME,
+ PROJECT_RDNN_NAME + '.gresource.xml',
+ gresource_bundle: true,
+ source_dir: meson.current_build_dir(),
+ install_dir: PKGDATA_DIR,
+ install: true
+)
+
+schema_src = PROJECT_RDNN_NAME + '.gschema.xml'
+gnome.compile_schemas(build_by_default: true, depend_files: files(schema_src))
+
+# Installing the schema file
+install_data(
+ schema_src,
+ install_dir: join_paths(get_option('datadir'), 'glib-2.0/schemas')
+)
+
+# Merging the translations with the desktop file
+desktop_conf = configuration_data()
+desktop_conf.set('icon', APPLICATION_ID)
+i18n.merge_file(
+ type: 'desktop',
+ input: configure_file(
+ output: PROJECT_RDNN_NAME + '.desktop.in',
+ input: PROJECT_RDNN_NAME + '.desktop.in.in',
+ configuration: desktop_conf),
+ output: APPLICATION_ID + '.desktop',
+ po_dir: join_paths(meson.project_source_root(), 'po'),
+ install: true,
+ install_dir: join_paths(get_option('prefix'), get_option('datadir'), 'applications')
+)
+
+# Validating the desktop file
+desktop_file_validate = find_program('desktop-file-validate', required:false)
+if desktop_file_validate.found()
+ test (
+ 'Validate desktop file',
+ desktop_file_validate,
+ args: join_paths(meson.current_build_dir (), APPLICATION_ID + '.desktop')
+ )
+endif
+
+# Merging the translations with the appdata file
+appdata_conf = configuration_data()
+appdata_conf.set('appid', APPLICATION_ID)
+appdata_conf.set('package_url', PACKAGE_URL)
+appdata_conf.set('package_url_bug', PACKAGE_URL_BUG)
+i18n.merge_file(
+ input: configure_file(
+ output: PROJECT_RDNN_NAME + '.appdata.xml.in',
+ input: PROJECT_RDNN_NAME + '.appdata.xml.in.in',
+ configuration: appdata_conf
+ ),
+ output: APPLICATION_ID + '.appdata.xml',
+ po_dir: join_paths(meson.project_source_root(), 'po'),
+ install: true,
+ install_dir: join_paths(get_option('prefix'), get_option('datadir'), 'metainfo')
+)
+
+# Validating the appdata file
+appstream_util = find_program('appstream-util', required: false)
+if appstream_util.found()
+ test (
+ 'Validate appdata file',
+ appstream_util,
+ args: ['validate-relax', '--nonet', join_paths(meson.current_build_dir (), APPLICATION_ID + '.appdata.xml')]
+ )
+endif
+
+# Installing the default icon
+install_data(
+ join_paths('icons/hicolor/scalable/apps', APPLICATION_ID + '.svg'),
+ install_dir: join_paths(get_option('prefix'), get_option('datadir'), 'icons/hicolor/scalable/apps')
+)
+
+# Installing the symbolic icon
+install_data(
+ join_paths('icons/hicolor/symbolic/apps', PROJECT_RDNN_NAME + '-symbolic.svg'),
+ install_dir: join_paths(get_option('prefix'), get_option('datadir'), 'icons/hicolor/symbolic/apps'),
+ rename: '@0@-symbolic.svg'.format(APPLICATION_ID)
+)
diff --git a/data/org.gnome.Music.appdata.xml.in.in b/data/org.gnome.Music.appdata.xml.in.in
new file mode 100644
index 00000000..b307b930
--- /dev/null
+++ b/data/org.gnome.Music.appdata.xml.in.in
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component type="desktop-application">
+ <id>@appid@.desktop</id>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-2.0+ and LGPL-2.0+ and CC-BY-SA-4.0</project_license>
+ <name>Music</name>
+ <summary>Play and organize your music collection</summary>
+ <description>
+ <p>
+ An easy and pleasant way to play your music.
+ </p>
+ <p>
+ Find tracks in your local collection, use automatically generated playlists or curate a fresh one.
+ </p>
+ </description>
+ <screenshots>
+ <screenshot type="default">
+ <image type="source">https://gitlab.gnome.org/GNOME/gnome-music/raw/HEAD/data/screenshots/gnome-music-1.png</image>
+ </screenshot>
+ <screenshot>
+ <image type="source">https://gitlab.gnome.org/GNOME/gnome-music/raw/HEAD/data/screenshots/gnome-music-2.png</image>
+ </screenshot>
+ <screenshot>
+ <image type="source">https://gitlab.gnome.org/GNOME/gnome-music/raw/HEAD/data/screenshots/gnome-music-3.png</image>
+ </screenshot>
+ <screenshot>
+ <image type="source">https://gitlab.gnome.org/GNOME/gnome-music/raw/HEAD/data/screenshots/gnome-music-4.png</image>
+ </screenshot>
+ </screenshots>
+ <releases>
+ <release version="45.0" date="2023-09-16">
+ <description>
+ <p>Minor quality of life improvements</p>
+ </description>
+ </release>
+ <release version="44.0" date="2023-03-22">
+ <description>
+ <p>
+ First stable release for GNOME 44. This version mostly consists
+ of stability improvements. There are also some notable
+ improvements:
+ </p>
+ <ul>
+ <li>Port to soup 3</li>
+ <li>Fix shuffle</li>
+ <li>Decrease memory usage in SongsView</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release version="42.1" date="2022-04-25">
+ <description>
+ <ul>
+ <li>Make shuffle shuffle again</li>
+ <li>Fix time display in RTL languages</li>
+ <li>No longer mismatch art on scrolling</li>
+ <li>Fix async queue block on fresh art retrieval</li>
+ </ul>
+ </description>
+ </release>
+ <release version="42.0" date="2022-03-20">
+ <description>
+ <p>
+ Music has been ported to GTK-4. This brings some performance
+ improvements for larger collections.
+ </p>
+ </description>
+ </release>
+ <release version="41.0" date="2021-09-18">
+ <description>
+ <p>
+ This version brings an updated design with even more focus on the
+ content. Under the hood there have been improvements to the
+ responsiveness, especially during application start.
+ </p>
+ </description>
+ </release>
+ <release version="40.0" date="2021-03-21">
+ <description>
+ <p>
+ First stable release for GNOME 40. This version mostly consists
+ of stability improvements. There are also some notable
+ improvements:
+ </p>
+ <ul>
+ <li>Improve startup loading</li>
+ <li>Use publication date instead of creation date for songs</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release version="3.38.0" date="2020-09-14">
+ <description>
+ <p>
+ First stable release for GNOME 3.38. This version does not rely on
+ Tracker running on the host. There are also some notable
+ improvements:
+ </p>
+ <ul>
+ <li>Port to Tracker version 3</li>
+ <li>Prefer Albumartist field for artist search</li>
+ <li>Change Artist view selection from artist to song</li>
+ <li>Lots of general cleanups and bugfixes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release version="3.36.0" date="2020-03-07">
+ <description>
+ <p>
+ First stable release for GNOME 3.36. Besides a general focus on
+ stability there are some notable improvements:
+ </p>
+ <ul>
+ <li>Restore smart playlists update</li>
+ <li>Expose Last.fm scrobbler in the UI</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release version="3.35.92" date="2020-03-02" type="development">
+ <description>
+ <p>
+ This is an unstable release in the 3.35 development series,
+ with the following improvements:
+ </p>
+ <ul>
+ <li>Restore smart playlists update</li>
+ <li>Improve Tracker content tracking</li>
+ <li>Flatpak cleanups and updates</li>
+ <li>Lots of general cleanups and bugfixes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release version="3.35.91" date="2020-02-15" type="development">
+ <description>
+ <p>
+ This is an unstable release in the 3.33 development series,
+ with the following improvements:
+ </p>
+ <ul>
+ <li>Use natural order for sorting</li>
+ <li>Expose Last.fm scrobbler in the UI</li>
+ <li>Add a local runtime cache for scrobbling</li>
+ <li>Lots of general cleanups and bugfixes</li>
+ </ul>
+ <p>This release also updates and adds translations.</p>
+ </description>
+ </release>
+ <release version="3.35.3" date="2020-01-05" type="development">
+ <description>
+ <p>
+ This is an unstable release in the 3.33 development series,
+ with the following improvements:
+ </p>
+ <ul>
+ <li>Improve Tracker content tracking</li>
+ <li>Update screenshots</li>
+ <li>Fix a few crashers</li>
+ <li>Lots of general cleanups</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release version="3.33.2" date="2019-05-20" type="development">
+ <description>
+ <p>
+ This is an unstable release in the 3.33 development series,
+ with the following improvements:
+ </p>
+ <ul>
+ <li>Improve Smooth progressbar support</li>
+ <li>Improve display of information for songs with no tags</li>
+ <li>Select a random song at launch when playing a playlist in shuffle mode</li>
+ <li>AppData tags update</li>
+ <li>Fix crash with mouse 'back' button</li>
+ <li>MPRIS misc cleanups</li>
+ <li>Lots of general cleanups</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release version="3.32.0" date="2019-03-13" />
+ </releases>
+ <project_group>GNOME</project_group>
+ <developer_name>The GNOME Music developers</developer_name>
+ <launchable type="desktop-id">@appid@.desktop</launchable>
+ <url type="homepage">@package_url@</url>
+ <url type="bugtracker">@package_url_bug@</url>
+ <url type="donation">https://www.gnome.org/friends/</url>
+ <url type="help">https://help.gnome.org/users/gnome-music/stable/</url>
+ <kudos>
+ <kudo>HiDpiIcon</kudo>
+ <kudo>ModernToolkit</kudo>
+ <kudo>UserDocs</kudo>
+ </kudos>
+ <update_contact>mschraal@gnome.org</update_contact>
+ <translation type="gettext">@appid@</translation>
+ <content_rating type="oars-1.1" />
+</component>
diff --git a/data/org.gnome.Music.desktop.in.in b/data/org.gnome.Music.desktop.in.in
new file mode 100644
index 00000000..62dfd398
--- /dev/null
+++ b/data/org.gnome.Music.desktop.in.in
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Name=Music
+GenericName=Music Player
+Comment=Play and organize your music collection
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=@icon@
+Exec=gnome-music
+Terminal=false
+Type=Application
+Categories=GNOME;GTK;AudioVideo;Player;Audio;
+# Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=Music;Player;
+StartupNotify=true
diff --git a/data/org.gnome.Music.gresource.xml b/data/org.gnome.Music.gresource.xml
new file mode 100644
index 00000000..77029c6d
--- /dev/null
+++ b/data/org.gnome.Music.gresource.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/Music">
+ <file alias="gtk/help-overlay.ui" preprocess="xml-stripblanks">ui/help-overlay.ui</file>
+ <file>style.css</file>
+ <file>icons/welcome-music.svg</file>
+ <file preprocess="xml-stripblanks">ui/AlbumCover.ui</file>
+ <file preprocess="xml-stripblanks">ui/AlbumCoverListItem.ui</file>
+ <file preprocess="xml-stripblanks">ui/AlbumWidget.ui</file>
+ <file preprocess="xml-stripblanks">ui/AlbumsView.ui</file>
+ <file preprocess="xml-stripblanks">ui/ArtistAlbumsWidget.ui</file>
+ <file preprocess="xml-stripblanks">ui/ArtistSearchTile.ui</file>
+ <file preprocess="xml-stripblanks">ui/AppMenu.ui</file>
+ <file preprocess="xml-stripblanks">ui/ArtistsView.ui</file>
+ <file preprocess="xml-stripblanks">ui/ArtistTile.ui</file>
+ <file preprocess="xml-stripblanks">ui/DiscBox.ui</file>
+ <file preprocess="xml-stripblanks">ui/EmptyView.ui</file>
+ <file preprocess="xml-stripblanks">ui/HeaderBar.ui</file>
+ <file preprocess="xml-stripblanks">ui/LastfmDialog.ui</file>
+ <file preprocess="xml-stripblanks">ui/PlayerToolbar.ui</file>
+ <file preprocess="xml-stripblanks">ui/PlaylistControls.ui</file>
+ <file preprocess="xml-stripblanks">ui/PlaylistDialog.ui</file>
+ <file preprocess="xml-stripblanks">ui/PlaylistDialogRow.ui</file>
+ <file preprocess="xml-stripblanks">ui/PlaylistsView.ui</file>
+ <file preprocess="xml-stripblanks">ui/PlaylistsWidget.ui</file>
+ <file preprocess="xml-stripblanks">ui/PlaylistTile.ui</file>
+ <file preprocess="xml-stripblanks">ui/SearchHeaderBar.ui</file>
+ <file preprocess="xml-stripblanks">ui/SearchView.ui</file>
+ <file preprocess="xml-stripblanks">ui/SelectionBarMenuButton.ui</file>
+ <file preprocess="xml-stripblanks">ui/SelectionToolbar.ui</file>
+ <file preprocess="xml-stripblanks">ui/SongListItem.ui</file>
+ <file preprocess="xml-stripblanks">ui/SongsView.ui</file>
+ <file preprocess="xml-stripblanks">ui/SongWidget.ui</file>
+ <file preprocess="xml-stripblanks">ui/SongWidgetMenu.ui</file>
+ <file preprocess="xml-stripblanks">ui/TwoLineTip.ui</file>
+ <file preprocess="xml-stripblanks">ui/Window.ui</file>
+ </gresource>
+ <gresource prefix="/org/gnome/Music/icons/scalable/actions">
+ <file alias="music-playlist-symbolic.svg">icons/music-playlist-symbolic.svg</file>
+ <file alias="music-artist-symbolic.svg">icons/music-artist-symbolic.svg</file>
+ </gresource>
+</gresources>
diff --git a/data/org.gnome.Music.gschema.xml b/data/org.gnome.Music.gschema.xml
new file mode 100644
index 00000000..d92cf230
--- /dev/null
+++ b/data/org.gnome.Music.gschema.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schemalist>
+ <enum id="org.gnome.Music.RepeatMode">
+ <value nick="none" value="0"/>
+ <value nick="song" value="1"/>
+ <value nick="all" value="2"/>
+ <value nick="shuffle" value="3"/>
+ </enum>
+ <schema path="/org/gnome/Music/" id="org.gnome.Music" gettext-domain="org.gnome.Music">
+ <key type="ai" name="window-size">
+ <default>[768, 600]</default>
+ <summary>Window size</summary>
+ <description>Window size (width and height).</description>
+ </key>
+ <key type="b" name="window-maximized">
+ <default>true</default>
+ <summary>Window maximized</summary>
+ <description>Window maximized state.</description>
+ </key>
+ <key enum="org.gnome.Music.RepeatMode" name="repeat">
+ <default>'none'</default>
+ <summary>Playback repeat mode</summary>
+ <!-- Translators: Don't translate allowed values, just the description in the brackets -->
+ <description>Value identifies whether to repeat or randomize playback through the collection. Allowed values are: “none” (repeat and shuffle are off), “song” (repeat current song), “all” (repeat playlist, no shuffle), “shuffle” (shuffle playlist, presumes repeat all).</description>
+ </key>
+ <key type="b" name="replaygain">
+ <default>false</default>
+ <summary>Enable ReplayGain</summary>
+ <description>Enables or disables ReplayGain for albums</description>
+ </key>
+ <key type="b" name="inhibit-suspend">
+ <default>false</default>
+ <summary>Inhibit system suspend</summary>
+ <description>Enables or disables inhibiting system suspend while playing music</description>
+ </key>
+ <key type="b" name="lastfm-report">
+ <default>false</default>
+ <summary>Report music history to Last.fm</summary>
+ <description>Enables or disables sending scrobbles and the “currently playing” info to Last.fm.</description>
+ </key>
+ </schema>
+</schemalist>
diff --git a/data/screenshots/gnome-music-1.png b/data/screenshots/gnome-music-1.png
new file mode 100644
index 00000000..be5016ae
--- /dev/null
+++ b/data/screenshots/gnome-music-1.png
Binary files differ
diff --git a/data/screenshots/gnome-music-2.png b/data/screenshots/gnome-music-2.png
new file mode 100644
index 00000000..789a15f2
--- /dev/null
+++ b/data/screenshots/gnome-music-2.png
Binary files differ
diff --git a/data/screenshots/gnome-music-3.png b/data/screenshots/gnome-music-3.png
new file mode 100644
index 00000000..54e3f849
--- /dev/null
+++ b/data/screenshots/gnome-music-3.png
Binary files differ
diff --git a/data/screenshots/gnome-music-4.png b/data/screenshots/gnome-music-4.png
new file mode 100644
index 00000000..dd08501c
--- /dev/null
+++ b/data/screenshots/gnome-music-4.png
Binary files differ
diff --git a/data/style.css b/data/style.css
new file mode 100644
index 00000000..f7bf1021
--- /dev/null
+++ b/data/style.css
@@ -0,0 +1,128 @@
+/* AlbumCover */
+.albumcover-title-label {
+ color: @theme_fg_color;
+}
+
+.albumcover-artist-label {
+ font-size: smaller;
+ color: @theme_fg_color;
+}
+
+/* AlbumsView */
+
+#albums gridview {
+ padding: 18px;
+}
+
+#albums gridview > child {
+ margin: 9px;
+ padding: 6px;
+}
+
+/* By default in Adwaita dark this is not transparent */
+.tile {
+ background-color: transparent;
+}
+
+.playlist-icon {
+ padding: 10px;
+ border-radius: 50%;
+ background-color: alpha(@theme_fg_color, 0.1);
+}
+
+.disc-label {
+ color: alpha(@theme_fg_color, 0.8);
+ padding: 12px 0;
+}
+
+/* PlayerToolbar */
+
+.smooth-scale {
+ padding-top: 0px;
+ padding-bottom: 0px;
+}
+
+/* We use background-image as a workaround on the StarImage widget to
+ enable transitions between the non-starred and starred icons. */
+.star {
+ background-image: -gtk-icontheme('non-starred-symbolic');
+ color: alpha(@theme_fg_color, 0.3);
+ transition: 100ms linear;
+}
+
+.star:hover {
+ color: alpha(@theme_fg_color, 0.6);
+}
+
+.star:selected {
+ background-image: -gtk-icontheme('starred-symbolic');
+ color: @theme_selected_bg_color;
+ transition: 100ms linear;
+}
+
+.grey-image {
+ color: alpha(@theme_fg_color, 0.3);
+}
+
+/* Used in AlbumWidget and ArtistAlbumsWidget */
+.playing-song-label {
+ font-weight: bold;
+}
+
+/* TwoLineTip */
+.tooltip-title {
+ font-weight: bold;
+}
+
+.playlistdialog-row:selected {
+ color: @theme_fg_color;
+ background-color: @theme_insensitive_bg_color;
+}
+
+.playlistdialog-row:selected label {
+ color: @theme_text_color;
+}
+
+/* SearchView */
+.search-header {
+ font-weight: bold;
+}
+
+/* dnd icon for SongWidget */
+.drag-handle {
+ color: alpha(@theme_fg_color, 0.4);
+}
+
+.drag-handle:backdrop {
+ color: alpha(@theme_unfocused_fg_color, 0.4);
+}
+
+/* Last.fm dialog */
+.lastfm-status-label {
+ font-weight: bold;
+}
+
+/* SongsView */
+/* boxed-list style does not work for
+GtkListView at the moment */
+.songs-list {
+ border-left: 1px solid @borders;
+ border-right: 1px solid @borders;
+ border-top: 1px solid @borders;
+}
+
+.songs-list:first-child {
+ border-top-left-radius: 12px;
+ border-top-right-radius: 12px;
+}
+
+.songs-list:last-child {
+ border-bottom-left-radius: 12px;
+ border-bottom-right-radius: 12px;
+}
+
+/* SongWidget and SongsView rows*/
+.songwidget,
+.songs-list row {
+ padding: 12px;
+}
diff --git a/data/ui/AlbumCover.ui b/data/ui/AlbumCover.ui
new file mode 100644
index 00000000..32c3ed17
--- /dev/null
+++ b/data/ui/AlbumCover.ui
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="AlbumCover" parent="GtkFlowBoxChild">
+ <child>
+ <object class="GtkBox">
+ <property name="focusable">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="valign">start</property>
+ <property name="orientation">vertical</property>
+ <signal name="query-tooltip" handler="_on_tooltip_query"/>
+ <child>
+ <object class="GtkOverlay">
+ <property name="focusable">False</property>
+ <property name="margin-bottom">4</property>
+ <child>
+ <object class="GtkImage" id="_cover_image">
+ <property name="focusable">False</property>
+ <property name="vexpand">True</property>
+ <property name="valign">end</property>
+ <property name="halign">center</property>
+ </object>
+ </child>
+ <child type="overlay">
+ <object class="GtkCheckButton" id="_check">
+ <property name="focusable">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">end</property>
+ <style>
+ <class name="selection-mode"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_title_label">
+ <property name="focusable">False</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="ellipsize">middle</property>
+ <property name="max_width_chars">20</property>
+ <property name="lines">2</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_artist_label">
+ <property name="focusable">False</property>
+ <property name="ellipsize">middle</property>
+ <property name="max_width_chars">20</property>
+ <style>
+ <class name="albumcover-artist-label"/>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <style>
+ <class name="tile"/>
+ </style>
+ </template>
+</interface>
diff --git a/data/ui/AlbumCoverListItem.ui b/data/ui/AlbumCoverListItem.ui
new file mode 100644
index 00000000..8fa7acce
--- /dev/null
+++ b/data/ui/AlbumCoverListItem.ui
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkBox" id="_album_cover">
+ <property name="has_tooltip">True</property>
+ <property name="valign">start</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkOverlay">
+ <property name="margin-bottom">6</property>
+ <child>
+ <object class="GtkImage" id="_cover_image">
+ <property name="vexpand">True</property>
+ <property name="valign">center</property>
+ <property name="halign">center</property>
+ </object>
+ </child>
+ <child type="overlay">
+ <object class="GtkCheckButton" id="_check">
+ <property name="visible">False</property>
+ <property name="halign">end</property>
+ <property name="valign">end</property>
+ <style>
+ <class name="selection-mode"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="ellipsize">middle</property>
+ <property name="max_width_chars">20</property>
+ <property name="lines">2</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_artist_label">
+ <property name="ellipsize">middle</property>
+ <property name="max_width_chars">20</property>
+ <style>
+ <class name="albumcover-artist-label"/>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/data/ui/AlbumWidget.ui b/data/ui/AlbumWidget.ui
new file mode 100644
index 00000000..0dc30d0f
--- /dev/null
+++ b/data/ui/AlbumWidget.ui
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="AlbumWidget" parent="AdwBin">
+ <child>
+ <object class="AdwClamp">
+ <property name="margin-bottom">48</property>
+ <property name="margin-top">48</property>
+ <property name="maximum-size">1000</property>
+ <child>
+ <object class="GtkBox">
+ <property name="halign">fill</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="albumInfo">
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">32</property>
+ <child>
+ <object class="GtkImage" id="_cover_image">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="albumDetails">
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">18</property>
+ <child>
+ <object class="GtkLabel" id="_title_label">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <property name="ellipsize">middle</property>
+ <property name="margin-bottom">18</property>
+ <style>
+ <class name="title-1"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_artist_label">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <property name="ellipsize">middle</property>
+ <property name="margin-bottom">12</property>
+ <style>
+ <class name="title-3"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_released_label">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <property name="use_markup">True</property>
+ <property name="margin-bottom">12</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_composer_label">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <property name="ellipsize">end</property>
+ <property name="margin-bottom">12</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkButton" id="_play_button">
+ <property name="width-request">44</property>
+ <property name="height-request">44</property>
+ <property name="icon-name">media-playback-start-symbolic</property>
+ <property name="tooltip-text" translatable="yes">Play</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="_on_play_button_clicked" swapped="no"/>
+ <style>
+ <class name="circular"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="_menu_button">
+ <property name="width-request">44</property>
+ <property name="height-request">44</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="focus_on_click">False</property>
+ <property name="menu-model">album_menu</property>
+ <property name="direction">none</property>
+ <property name="icon_name">view-more-symbolic</property>
+ <style>
+ <class name="circular"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox" id="_disc_list_box">
+ <property name="focusable">False</property>
+ <property name="margin-top">48</property>
+ <property name="selection_mode">0</property>
+ <style>
+ <class name="background"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+ <menu id="album_menu">
+ <item>
+ <attribute name="label" translatable="yes">_Play</attribute>
+ <attribute name="action">album.play</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Add to _Favorite Songs</attribute>
+ <attribute name="action">album.add_favorites</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Add to Playlist…</attribute>
+ <attribute name="action">album.add_playlist</attribute>
+ </item>
+ </menu>
+</interface>
diff --git a/data/ui/AlbumsView.ui b/data/ui/AlbumsView.ui
new file mode 100644
index 00000000..5523af53
--- /dev/null
+++ b/data/ui/AlbumsView.ui
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <template class="AlbumsView" parent="GtkStack">
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">grid</property>
+ <property name="child">
+ <object class="GtkScrolledWindow" id="_scrolled_window">
+ <child>
+ <object class="GtkGridView" id="_gridview">
+ <property name="max-columns">10</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">widget</property>
+ <property name="child">
+ <object class="GtkScrolledWindow" id="_album_scrolled_window">
+ <property name="focusable">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="scroll-to-focus">True</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/AppMenu.ui b/data/ui/AppMenu.ui
new file mode 100644
index 00000000..70f9e7f5
--- /dev/null
+++ b/data/ui/AppMenu.ui
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="AppMenu" parent="GtkPopover">
+ <property name="focusable">False</property>
+ <style>
+ <class name="menu"/>
+ </style>
+ <child>
+ <object class="GtkBox">
+ <property name="focusable">False</property>
+ <property name="margin-bottom">6</property>
+ <property name="margin-end">6</property>
+ <property name="margin-start">6</property>
+ <property name="margin-top">6</property>
+ <property name="spacing">6</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkModelButton" id="lastfm_account_button">
+ <property name="focusable">False</property>
+ <property name="halign">fill</property>
+ <property name="hexpand">False</property>
+ <property name="action_name">app.lastfm-configure</property>
+ <property name="text" translatable="yes">Last.fm Account</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="_lastfm_box">
+ <property name="margin-end">5</property>
+ <property name="visible">False</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="focusable">False</property>
+ <property name="margin-end">12</property>
+ <property name="halign">start</property>
+ <property name="hexpand">False</property>
+ <property name="label" translatable="yes">Report Music Listening</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="_lastfm_switch">
+ <property name="focusable">True</property>
+ <property name="halign">end</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator">
+ </object>
+ </child>
+ <child>
+ <object class="GtkModelButton" id="_keyboard_shortcuts_model_button">
+ <property name="halign">fill</property>
+ <property name="hexpand">False</property>
+ <property name="focusable">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">win.show-help-overlay</property>
+ <property name="text" translatable="yes">_Keyboard Shortcuts</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkModelButton" id="_help_model_button">
+ <property name="halign">fill</property>
+ <property name="hexpand">False</property>
+ <property name="focusable">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">app.help</property>
+ <property name="text" translatable="yes">_Help</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkModelButton" id="_about_model_button">
+ <property name="halign">fill</property>
+ <property name="hexpand">False</property>
+ <property name="focusable">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">app.about</property>
+ <property name="text" translatable="yes">_About Music</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/ArtistAlbumsWidget.ui b/data/ui/ArtistAlbumsWidget.ui
new file mode 100644
index 00000000..f38c85b9
--- /dev/null
+++ b/data/ui/ArtistAlbumsWidget.ui
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <template class="ArtistAlbumsWidget" parent="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">1000</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkListBox" id="_listbox">
+ <style>
+ <class name="background"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/ArtistSearchTile.ui b/data/ui/ArtistSearchTile.ui
new file mode 100644
index 00000000..e95d950f
--- /dev/null
+++ b/data/ui/ArtistSearchTile.ui
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="ArtistSearchTile" parent="GtkFlowBoxChild">
+ <child>
+ <object class="GtkBox">
+ <property name="has_tooltip">True</property>
+ <property name="valign">start</property>
+ <property name="orientation">vertical</property>
+ <signal name="query-tooltip" handler="_on_tooltip_query" swapped="no"/>
+ <child>
+ <object class="GtkOverlay">
+ <property name="margin-bottom">4</property>
+ <child>
+ <object class="GtkImage" id="_cover_image">
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkGestureClick">
+ <signal name="released" handler="_on_artist_event" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="overlay">
+ <object class="GtkCheckButton" id="_check">
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">end</property>
+ <style>
+ <class name="selection-mode"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_artist_label">
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="ellipsize">middle</property>
+ <property name="max_width_chars">20</property>
+ <property name="lines">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <style>
+ <class name="tile"/>
+ </style>
+ </template>
+</interface>
diff --git a/data/ui/ArtistTile.ui b/data/ui/ArtistTile.ui
new file mode 100644
index 00000000..e10f2b76
--- /dev/null
+++ b/data/ui/ArtistTile.ui
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="ArtistTile" parent="GtkBox">
+ <property name="focusable">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="margin-start">10</property>
+ <child>
+ <object class="GtkImage" id="_cover_image">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_label">
+ <property name="focusable">False</property>
+ <property name="ellipsize">end</property>
+ <property name="halign">start</property>
+ <property name="hexpand">False</property>
+ <property name="margin-bottom">16</property>
+ <property name="margin-end">10</property>
+ <property name="margin-start">10</property>
+ <property name="margin-top">16</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/ArtistsView.ui b/data/ui/ArtistsView.ui
new file mode 100644
index 00000000..8053288f
--- /dev/null
+++ b/data/ui/ArtistsView.ui
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <template class="ArtistsView" parent="GtkPaned">
+ <property name="shrink-start-child">0</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="width_request">220</property>
+ <child>
+ <object class="GtkListView" id="_sidebar">
+ <property name="single-click-activate">True</property>
+ <signal name="activate" handler="_on_artist_activated" swapped="no"/>
+ <style>
+ <class name="navigation-sidebar"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="_artist_view">
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/DiscBox.ui b/data/ui/DiscBox.ui
new file mode 100644
index 00000000..4899ecf8
--- /dev/null
+++ b/data/ui/DiscBox.ui
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <template parent="GtkListBoxRow" class="DiscBox">
+ <property name="focusable">False</property>
+ <property name="activatable">False</property>
+ <property name="selectable">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="focusable">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="_disc_label">
+ <property name="focusable">False</property>
+ <property name="halign">fill</property>
+ <property name="xalign">0.0</property>
+ <style>
+ <class name="disc-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox" id="_list_box">
+ <property name="focusable">False</property>
+ <property name="valign">start</property>
+ <property name="selection_mode">none</property>
+ <signal name="row-activated" handler="_song_activated" swapped="no"/>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/DiscListItem.ui b/data/ui/DiscListItem.ui
new file mode 100644
index 00000000..dd3c85f3
--- /dev/null
+++ b/data/ui/DiscListItem.ui
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="4.0"/>
+ <template class="DiscListItem" parent="GtkListItem">
+ <property name="child">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <binding name="label">
+ <lookup name="disc_nr" type="CoreDisc">
+ <lookup name="item">GtkListItem</lookup>
+ </lookup>
+ </binding>
+ </object>
+ </child>
+ <child>
+ <object class="DiscBox" id="_disc_box">
+ <binding name="model">
+ <lookup name="model" type="CoreDisc">
+ <lookup name="item">GtkListItem</lookup>
+ </lookup>
+ </binding>
+ </object>
+ </child>
+ </object>
+ </property>
+ </template>
+</interface>
diff --git a/data/ui/EmptyView.ui b/data/ui/EmptyView.ui
new file mode 100644
index 00000000..ea571e10
--- /dev/null
+++ b/data/ui/EmptyView.ui
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="EmptyView" parent="GtkStack">
+ <property name="visible">False</property>
+ <child>
+ <object class="AdwStatusPage" id="_status_page">
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="icon_name">emblem-music-symbolic</property>
+ </object>
+ </child>
+ </template>
+ <object class="AdwClamp" id="_initial_state">
+ <property name="maximum-size">620</property>
+ <property name="tightening-threshold">500</property>
+ <child>
+ <object class="GtkBox">
+ <property name="valign">start</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkPicture">
+ <property name="can-shrink">true</property>
+ <property name="keep-aspect-ratio">true</property>
+ <property name="file">resource:///org/gnome/Music/icons/welcome-music.svg</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_title_label">
+ <property name="justify">center</property>
+ <property name="label" translatable="yes">Welcome to Music</property>
+ <style>
+ <class name="title-1"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_description_label">
+ <property name="justify">center</property>
+ <property name="use-markup">True</property>
+ <style>
+ <class name="body"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/data/ui/HeaderBar.ui b/data/ui/HeaderBar.ui
new file mode 100644
index 00000000..7064e406
--- /dev/null
+++ b/data/ui/HeaderBar.ui
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="HeaderBar" parent="AdwBin">
+ <child>
+ <object class="AdwHeaderBar" id="_headerbar">
+ <property name="vexpand">False</property>
+ <style>
+ <class name="titlebar"/>
+ </style>
+ <child type="end">
+ <object class="GtkMenuButton" id="_menu_button">
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <property name="icon-name">open-menu-symbolic</property>
+ <property name="primary">True</property>
+ <property name="tooltip_text" translatable="yes">Menu</property>
+ </object>
+ </child>
+ <child type="end">
+ <object class="GtkToggleButton" id="_select_button">
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <property name="icon-name">selection-mode-symbolic</property>
+ <property name="tooltip_text" translatable="yes">Select</property>
+ </object>
+ </child>
+ <child type="end">
+ <object class="GtkButton" id="_cancel_button">
+ <property name="visible">False</property>
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="use_underline">True</property>
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <signal name="clicked" handler="_on_cancel_button_clicked" swapped="no"/>
+ </object>
+ </child>
+ <child type="end">
+ <object class="GtkToggleButton" id="_search_button">
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <property name="icon-name">edit-find-symbolic</property>
+ <property name="tooltip_text" translatable="yes">Search</property>
+ </object>
+ </child>
+ <child type="start">
+ <object class="GtkButton" id="_back_button">
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <property name="icon-name">go-previous-symbolic</property>
+ <property name="tooltip_text" translatable="yes">Back</property>
+ <signal name="clicked" handler="_on_back_button_clicked" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+ <object class="GtkBox" id="_label_title_box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="_label_title">
+ <property name="single-line-mode">True</property>
+ <property name="ellipsize">end</property>
+ <property name="width-chars">5</property>
+ <property name="vexpand">True</property>
+ <property name="yalign">1.0</property>
+ <style>
+ <class name="title"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_label_subtitle">
+ <property name="single-line-mode">True</property>
+ <property name="ellipsize">end</property>
+ <property name="width-chars">5</property>
+ <property name="vexpand">True</property>
+ <property name="yalign">0.0</property>
+ <style>
+ <class name="subtitle"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="size1">
+ <property name="mode">vertical</property>
+ <widgets>
+ <widget name="_search_button"/>
+ <widget name="_cancel_button"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/data/ui/LastfmDialog.ui b/data/ui/LastfmDialog.ui
new file mode 100644
index 00000000..926c7872
--- /dev/null
+++ b/data/ui/LastfmDialog.ui
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="LastfmDialog" parent="GtkDialog">
+ <property name="focusable">False</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="modal">True</property>
+ <property name="resizable">False</property>
+ <property name="title" translatable="yes">Last.fm Account</property>
+ <property name="valign">start</property>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="margin-bottom">16</property>
+ <property name="margin-end">16</property>
+ <property name="margin-start">16</property>
+ <property name="margin-top">16</property>
+ <property name="orientation">vertical</property>
+ <property name="valign">start</property>
+ <child>
+ <object class="GtkLabel" id="introduction_label">
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Last.fm is a music discovery service that gives you personalised recommendations based on the music you listen to.</property>
+ <property name="margin-bottom">16</property>
+ <property name="max_width_chars">60</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_status_label">
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Music Reporting Not Setup</property>
+ <property name="margin-bottom">8</property>
+ <property name="max_width_chars">60</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ <style>
+ <class name="lastfm-status-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_action_label">
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Login to your Last.fm account to report your music listening.</property>
+ <property name="margin-bottom">12</property>
+ <property name="max_width_chars">60</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="_action_button">
+ <signal name="clicked" handler="_on_action_button_clicked" swapped="no"/>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Login</property>
+ <property name="margin-bottom">8</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/PlayerToolbar.ui b/data/ui/PlayerToolbar.ui
new file mode 100644
index 00000000..39616b80
--- /dev/null
+++ b/data/ui/PlayerToolbar.ui
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <template class="PlayerToolbar" parent="GtkActionBar">
+ <property name="focusable">False</property>
+ <property name="revealed">False</property>
+ <child>
+ <object class="GtkBox" id="_song_info_box">
+ <property name="focusable">False</property>
+ <property name="halign">center</property>
+ <property name="has_tooltip">True</property>
+ <property name="valign">center</property>
+ <property name="spacing">8</property>
+ <property name="margin-bottom">6</property>
+ <property name="margin-end">6</property>
+ <property name="margin-start">6</property>
+ <property name="margin-top">6</property>
+ <signal name="query-tooltip" handler="_on_tooltip_query"/>
+ <child>
+ <object class="GtkImage" id="_cover_image">
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="nowplaying_labels">
+ <property name="focusable">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <property name="homogeneous">True</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkLabel" id="_title_label">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <property name="ellipsize">middle</property>
+ <property name="max_width_chars">28</property>
+ <attributes>
+ <attribute name="weight" value="bold" />
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_artist_label">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <property name="ellipsize">middle</property>
+ <property name="max_width_chars">28</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="center">
+ <object class="GtkBox" id="_buttons_and_scale">
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="focusable">False</property>
+ <property name="margin-bottom">6</property>
+ <property name="margin-end">6</property>
+ <property name="margin-start">6</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkBox" id="buttons">
+ <property name="focusable">False</property>
+ <property name="halign">center</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkButton" id="_prev_button">
+ <property name="sensitive">False</property>
+ <property name="focusable">True</property>
+ <property name="receives_default">True</property>
+ <property name="icon_name">media-skip-backward-symbolic</property>
+ <property name="tooltip_text" translatable="yes">Previous</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="_on_prev_button_clicked" swapped="no"/>
+ <style>
+ <class name="circular"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="_play_button">
+ <property name="sensitive">False</property>
+ <property name="focusable">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Play</property>
+ <signal name="clicked" handler="_on_play_button_clicked" swapped="no"/>
+ <style>
+ <class name="pill"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="_play_pause_image">
+ <property name="icon_name">media-playback-start-symbolic</property>
+ <property name="icon_size">2</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="_next_button">
+ <property name="sensitive">False</property>
+ <property name="focusable">True</property>
+ <property name="receives_default">True</property>
+ <property name="icon_name">media-skip-forward-symbolic</property>
+ <property name="tooltip_text" translatable="yes">Next</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="_on_next_button_clicked" swapped="no"/>
+ <style>
+ <class name="circular"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">1000</property>
+ <child>
+ <object class="GtkBox" id="scale_and_timer">
+ <property name="orientation">horizontal</property>
+ <property name="focusable">False</property>
+ <property name="margin_top">12</property>
+ <child>
+ <object class="GtkLabel" id="_progress_time_label">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="label">0∶00</property>
+ <attributes>
+ <attribute name="font-features" value="tnum=1"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="SmoothScale" id="_progress_scale">
+ <property name="focusable">True</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="draw_value">False</property>
+ <signal name = "value-changed" handler="_on_progress_value_changed" swapped="no"/>
+ <style>
+ <class name="smooth-scale"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_duration_label">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="label">0∶00</property>
+ <attributes>
+ <attribute name="font-features" value="tnum=1"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="end">
+ <object class="GtkBox" id="menuBox">
+ <property name="height_request">34</property>
+ <property name="focusable">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin-bottom">6</property>
+ <property name="margin-end">6</property>
+ <property name="margin-start">6</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkMenuButton" id="_repeat_menu_button">
+ <property name="focusable">True</property>
+ <property name="receives_default">True</property>
+ <child>
+ <object class="GtkBox" id="replayBox">
+ <property name="focusable">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkImage" id="_repeat_image">
+ <property name="focusable">False</property>
+ <property name="icon_name">media-playlist-consecutive-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage" id="downArrow">
+ <property name="focusable">False</property>
+ <property name="icon_name">pan-down-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/PlaylistControls.ui b/data/ui/PlaylistControls.ui
new file mode 100644
index 00000000..04ea750b
--- /dev/null
+++ b/data/ui/PlaylistControls.ui
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <menu id="playlistMenu">
+ <item>
+ <attribute name="label" translatable="yes">_Play</attribute>
+ <attribute name="action">win.playlist_play</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Delete</attribute>
+ <attribute name="action">win.playlist_delete</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Rename…</attribute>
+ <attribute name="action">win.playlist_rename</attribute>
+ </item>
+ </menu>
+ <template class="PlaylistControls" parent="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="focusable">False</property>
+ <property name="margin-top">30</property>
+ <child>
+ <object class="GtkStack" id="_name_stack">
+ <child>
+ <object class="GtkLabel" id="_name_label">
+ <property name="focusable">False</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Playlist Name</property>
+ <property name="ellipsize">middle</property>
+ <property name="margin-bottom">10</property>
+ <style>
+ <class name="title-1"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">renaming_dialog</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <style>
+ <class name="linked"/>
+ </style>
+ <child>
+ <object class="GtkEntry" id="_rename_entry">
+ <child>
+ <object class="GtkEventControllerKey" id="_rename_controller">
+ <signal name="key-pressed" handler="_on_rename_entry_key_pressed" swapped="no"/>
+ </object>
+ </child>
+ <property name="focusable">True</property>
+ <property name="receives_default">True</property>
+ <signal name="activate" handler="_on_playlist_renamed" swapped="no"/>
+ <signal name="changed" handler="_on_rename_entry_changed" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="_rename_done_button">
+ <property name="focusable">True</property>
+ <property name="receives_default">True</property>
+ <property name="label" translatable="yes">_Done</property>
+ <property name="use_underline">True</property>
+ <property name="sensitive">True</property>
+ <signal name="clicked" handler="_on_playlist_renamed" swapped="no" />
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_songs_count_label">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <property name="label"></property>
+ <property name="margin-bottom">4</property>
+ <style>
+ <class name="body"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">12</property>
+ <property name="margin-top">18</property>
+ <property name="margin-bottom">8</property>
+ <child>
+ <object class="GtkButton" id="_play_button">
+ <property name="height-request">44</property>
+ <property name="width-request">44</property>
+ <property name="focusable">True</property>
+ <property name="receives-default">True</property>
+ <property name="icon_name">media-playback-start-symbolic</property>
+ <property name="tooltip-text" translatable="yes">Play</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="_on_play_button_clicked" swapped="no"/>
+ <style>
+ <class name="circular"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="_menubutton">
+ <property name="height-request">44</property>
+ <property name="width-request">44</property>
+ <property name="focusable">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="focus_on_click">False</property>
+ <property name="menu-model">playlistMenu</property>
+ <property name="direction">none</property>
+ <property name="icon_name">view-more-symbolic</property>
+ <style>
+ <class name="circular"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/PlaylistDialog.ui b/data/ui/PlaylistDialog.ui
new file mode 100644
index 00000000..51e58c87
--- /dev/null
+++ b/data/ui/PlaylistDialog.ui
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <template class="PlaylistDialog" parent="GtkDialog">
+ <property name="width_request">400</property>
+ <property name="height_request">500</property>
+ <property name="focusable">False</property>
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <child internal-child="content_area">
+ <object class="GtkBox" id="dialog-vbox">
+ <property name="focusable">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkStack" id="_add_playlist_stack">
+ <property name="focusable">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="transition_duration">250</property>
+ <child>
+ <object class="GtkBox" id="_empty_box">
+ <property name="visible">False</property>
+ <property name="focusable">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox">
+ <property name="focusable">False</property>
+ <property name="orientation">vertical</property>
+ <property name="valign">fill</property>
+ <property name="vexpand">True</property>
+ <property name="margin-bottom">18</property>
+ <property name="margin-end">18</property>
+ <property name="margin-start">18</property>
+ <property name="margin-top">18</property>
+ <child>
+ <object class="GtkImage" id="image">
+ <property name="focusable">False</property>
+ <property name="valign">center</property>
+ <property name="pixel_size">100</property>
+ <property name="icon_name">emblem-music-symbolic</property>
+ <property name="icon_size">0</property>
+ <property name="margin-bottom">16</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="grey-image"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="focusable">False</property>
+ <property name="label" translatable="yes">Enter a name for your first playlist</property>
+ <property name="valign">end</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="_first_playlist_entry">
+ <property name="width_request">300</property>
+ <property name="height_request">10</property>
+ <property name="focusable">True</property>
+ <property name="halign">center</property>
+ <property name="margin-bottom">16</property>
+ <property name="margin-end">18</property>
+ <property name="margin-start">18</property>
+ <property name="margin-top">18</property>
+ <signal name="activate" handler="_on_editing_done" swapped="no"/>
+ <signal name="changed" handler="_on_add_playlist_entry_changed" swapped="no"/>
+ <child>
+ <object class="GtkEventControllerFocus">
+ <signal name="enter" handler="_on_add_playlist_entry_focused" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="_first_playlist_button">
+ <property name="label" translatable="yes">C_reate</property>
+ <property name="use_underline">True</property>
+ <property name="width_request">120</property>
+ <property name="height_request">25</property>
+ <property name="sensitive">False</property>
+ <property name="focusable">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin-bottom">20</property>
+ <property name="margin-end">18</property>
+ <property name="margin-start">18</property>
+ <property name="margin-top">10</property>
+ <signal name="clicked" handler="_on_editing_done" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="focusable">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="_normal_box">
+ <property name="visible">False</property>
+ <property name="focusable">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow">
+ <property name="focusable">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="scroll-to-focus">True</property>
+ <child>
+ <object class="GtkListBox" id="_listbox">
+ <property name="focusable">True</property>
+ <property name="selection_mode">single</property>
+ <property name="valign">start</property>
+ <signal name="selected-rows-changed" handler="_on_selected_rows_changed" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="focusable">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkSeparator">
+ <property name="focusable">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="new-playlist-hbox">
+ <property name="focusable">False</property>
+ <property name="margin-bottom">6</property>
+ <property name="margin-end">6</property>
+ <property name="margin-start">6</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkEntry" id="_new_playlist_entry">
+ <property name="focusable">True</property>
+ <property name="hexpand">True</property>
+ <property name="placeholder_text" translatable="yes">New Playlist…</property>
+ <signal name="activate" handler="_on_editing_done" swapped="no"/>
+ <signal name="changed" handler="_on_add_playlist_entry_changed" swapped="no"/>
+ <style>
+ <class name="linked"/>
+ </style>
+ <child>
+ <object class="GtkEventControllerFocus">
+ <signal name="enter" handler="_on_add_playlist_entry_focused" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="_new_playlist_button">
+ <property name="label" translatable="yes">Add</property>
+ <property name="sensitive">False</property>
+ <property name="focusable">True</property>
+ <property name="receives_default">False</property>
+ <signal name="clicked" handler="_on_editing_done" swapped="no"/>
+ <style>
+ <class name="suggested-action"/>
+ <class name="linked"/>
+ </style>
+ </object>
+ </child>
+ <style>
+ <class name="linked"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="focusable">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="focusable">False</property>
+ <property name="visible">False</property>
+ </object>
+ </child>
+ </template>
+ <object class="GtkHeaderBar" id="_title_bar">
+ <property name="focusable">False</property>
+ <property name="show_title_buttons">False</property>
+ <property name="title-widget">
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">Add to Playlist</property>
+ <property name="single-line-mode">True</property>
+ <property name="ellipsize">end</property>
+ <property name="width-chars">5</property>
+ <style>
+ <class name="title"/>
+ </style>
+ </object>
+ </property>
+ <child>
+ <object class="GtkButton" id="_cancel_button">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="use_underline">True</property>
+ <property name="focusable">False</property>
+ <property name="receives_default">False</property>
+ <signal name="clicked" handler="_on_cancel_button_clicked" swapped="no"/>
+ </object>
+ </child>
+ <child type="end">
+ <object class="GtkButton" id="_select_button">
+ <property name="label" translatable="yes">_Add</property>
+ <property name="sensitive">False</property>
+ <property name="use_underline">True</property>
+ <property name="focusable">False</property>
+ <property name="receives_default">False</property>
+ <signal name="clicked" handler="_on_selection" swapped="no"/>
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/data/ui/PlaylistDialogRow.ui b/data/ui/PlaylistDialogRow.ui
new file mode 100644
index 00000000..c9c96175
--- /dev/null
+++ b/data/ui/PlaylistDialogRow.ui
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="PlaylistDialogRow" parent="GtkListBoxRow">
+ <style>
+ <class name="playlistdialog-row"/>
+ </style>
+ <child>
+ <object class="GtkBox" id="hbox">
+ <child>
+ <object class="GtkLabel" id="_label">
+ <property name="ellipsize">end</property>
+ <property name="margin-bottom">8</property>
+ <property name="margin-end">8</property>
+ <property name="margin-start">8</property>
+ <property name="margin-top">8</property>
+ <property name="xalign">0.0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage" id="_selection_icon">
+ <property name="icon-name">selection-mode-symbolic</property>
+ <property name="icon-size">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/PlaylistTile.ui b/data/ui/PlaylistTile.ui
new file mode 100644
index 00000000..2375857f
--- /dev/null
+++ b/data/ui/PlaylistTile.ui
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="PlaylistTile" parent="GtkListBoxRow">
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="margin-start">10</property>
+ <child>
+ <object class="GtkImage" id="_icon">
+ <property name="focusable">False</property>
+ <property name="icon-size">normal</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="playlist-icon"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_label">
+ <property name="focusable">False</property>
+ <property name="ellipsize">end</property>
+ <property name="halign">start</property>
+ <property name="hexpand">False</property>
+ <property name="margin-bottom">16</property>
+ <property name="margin-end">10</property>
+ <property name="margin-start">10</property>
+ <property name="margin-top">16</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/PlaylistsView.ui b/data/ui/PlaylistsView.ui
new file mode 100644
index 00000000..a1ac17fc
--- /dev/null
+++ b/data/ui/PlaylistsView.ui
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="PlaylistsView" parent="GtkPaned">
+ <property name="shrink-start-child">0</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="width-request">220</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="scroll-to-focus">True</property>
+ <child>
+ <object class="GtkListBox" id="_sidebar">
+ <property name="selection-mode">single</property>
+ <signal name="row-activated" handler="_on_playlist_activated" swapped="no"/>
+ <style>
+ <class name="navigation-sidebar"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/PlaylistsWidget.ui b/data/ui/PlaylistsWidget.ui
new file mode 100644
index 00000000..7a9e3cfb
--- /dev/null
+++ b/data/ui/PlaylistsWidget.ui
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="PlaylistsWidget" parent="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">1000</property>
+ <child>
+ <object class="PlaylistControls" id="_pl_ctrls">
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="playlist-container">
+ <property name="vexpand">True</property>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">1000</property>
+ <property name="valign">start</property>
+ <child>
+ <object class="GtkListBox" id="_songs_list">
+ <property name="margin-bottom">20</property>
+ <property name="margin-top">20</property>
+ <signal name="row-activated" handler="_on_song_activated" swapped="no"/>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/SearchHeaderBar.ui b/data/ui/SearchHeaderBar.ui
new file mode 100644
index 00000000..d8dec507
--- /dev/null
+++ b/data/ui/SearchHeaderBar.ui
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="SearchHeaderBar" parent="AdwBin">
+ <child>
+ <object class="AdwHeaderBar" id="_headerbar">
+ <property name="vexpand">False</property>
+ <style>
+ <class name="titlebar"/>
+ </style>
+ <child type="end">
+ <object class="GtkToggleButton" id="_select_button">
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <property name="icon-name">selection-mode-symbolic</property>
+ <property name="tooltip_text" translatable="yes">Select</property>
+ </object>
+ </child>
+ <child type="end">
+ <object class="GtkButton" id="_cancel_button">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="use_underline">True</property>
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <signal name="clicked" handler="_on_cancel_button_clicked" swapped="no"/>
+ </object>
+ </child>
+ <child type="end">
+ <object class="GtkToggleButton" id="_search_button">
+ <property name="valign">center</property>
+ <property name="sensitive">True</property>
+ <property name="icon-name">edit-find-symbolic</property>
+ <property name="tooltip_text" translatable="yes">Search</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+ <object class="GtkSizeGroup" id="size1">
+ <property name="mode">vertical</property>
+ <widgets>
+ <widget name="_search_button"/>
+ <widget name="_cancel_button"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/data/ui/SearchView.ui b/data/ui/SearchView.ui
new file mode 100644
index 00000000..8a2af34b
--- /dev/null
+++ b/data/ui/SearchView.ui
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="SearchView" parent="GtkStack">
+ <child>
+ <object class="GtkScrolledWindow" id="_search_results">
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="scroll-to-focus">True</property>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">1600</property>
+ <child>
+ <object class="GtkBox" id="container">
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="margin-bottom">20</property>
+ <property name="margin-end">120</property>
+ <property name="margin-start">120</property>
+ <property name="margin-top">20</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="_artist_header">
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="homogeneous">True</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Artists</property>
+ <style>
+ <class name="search-header"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="_view_all_artists">
+ <property name="halign">end</property>
+ <property name="label" translatable="yes">View All</property>
+ <property name="icon-name">go-next-symbolic</property>
+ <signal name="clicked" handler="_on_all_artists_clicked" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFlowBox" id="_artist_flowbox">
+ <property name="column_spacing">6</property>
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="homogeneous">True</property>
+ <property name="margin-bottom">18</property>
+ <property name="margin-top">18</property>
+ <property name="max-children-per-line">6</property>
+ <property name="min-children-per-line">1</property>
+ <property name="row_spacing">12</property>
+ <property name="selection-mode">none</property>
+ <property name="valign">start</property>
+ <signal name="child-activated" handler="_on_artist_activated" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="_album_header">
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="homogeneous">True</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Albums</property>
+ <style>
+ <class name="search-header"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="_view_all_albums">
+ <property name="halign">end</property>
+ <property name="label" translatable="yes">View All</property>
+ <property name="icon_name">go-next-symbolic</property>
+ <signal name="clicked" handler="_on_all_albums_clicked" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFlowBox" id="_album_flowbox">
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="valign">start</property>
+ <property name="homogeneous">True</property>
+ <property name="min_children_per_line">1</property>
+ <property name="max_children_per_line">6</property>
+ <property name="margin-bottom">18</property>
+ <property name="margin-top">18</property>
+ <property name="row_spacing">12</property>
+ <property name="column_spacing">6</property>
+ <property name="selection_mode">none</property>
+ <signal name="child-activated" handler="_on_album_activated" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="_songs_header">
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="homogeneous">True</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Songs</property>
+ <style>
+ <class name="search-header"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox" id="_songs_listbox">
+ <property name="margin-top">20</property>
+ <signal name="row-activated" handler="_song_activated" swapped="no"/>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="_all_search_results">
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="scroll-to-focus">True</property>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">1600</property>
+ <child>
+ <object class="GtkBox">
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="margin-bottom">20</property>
+ <property name="margin-end">120</property>
+ <property name="margin-start">120</property>
+ <property name="margin-top">20</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFlowBox" id="_artist_all_flowbox">
+ <property name="column_spacing">6</property>
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="homogeneous">True</property>
+ <property name="margin-bottom">18</property>
+ <property name="margin-top">18</property>
+ <property name="max-children-per-line">6</property>
+ <property name="min-children-per-line">1</property>
+ <property name="row_spacing">12</property>
+ <property name="selection-mode">none</property>
+ <property name="valign">start</property>
+ <signal name="child-activated" handler="_on_artist_activated" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFlowBox" id="_album_all_flowbox">
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="valign">start</property>
+ <property name="homogeneous">True</property>
+ <property name="min_children_per_line">1</property>
+ <property name="max_children_per_line">6</property>
+ <property name="margin-bottom">18</property>
+ <property name="margin-top">18</property>
+ <property name="row_spacing">12</property>
+ <property name="column_spacing">6</property>
+ <property name="selection_mode">none</property>
+ <signal name="child-activated" handler="_on_album_activated" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="_scrolled_album_widget">
+ <property name="hscrollbar_policy">never</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="scroll-to-focus">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/SelectionBarMenuButton.ui b/data/ui/SelectionBarMenuButton.ui
new file mode 100644
index 00000000..6787651b
--- /dev/null
+++ b/data/ui/SelectionBarMenuButton.ui
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.4"/>
+ <menu id="selection-menu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Select All</attribute>
+ <attribute name="action">win.select_all</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Select None</attribute>
+ <attribute name="action">win.deselect_all</attribute>
+ </item>
+ </section>
+ </menu>
+ <template class="SelectionBarMenuButton" parent="GtkMenuButton">
+ <property name="always-show-arrow">True</property>
+ <property name="focusable">True</property>
+ <property name="label" translatable="yes">Click on items to select them</property>
+ <property name="menu-model">selection-menu</property>
+ </template>
+</interface>
diff --git a/data/ui/SelectionToolbar.ui b/data/ui/SelectionToolbar.ui
new file mode 100644
index 00000000..852b7367
--- /dev/null
+++ b/data/ui/SelectionToolbar.ui
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="SelectionToolbar" parent="GtkActionBar">
+ <property name="visible">False</property>
+ <property name="focusable">False</property>
+ <child>
+ <object class="GtkButton" id="_add_to_playlist_button">
+ <property name="label" translatable="yes">_Add to Playlist</property>
+ <property name="use_underline">True</property>
+ <property name="focusable">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="_on_add_to_playlist_button_clicked" swapped="no"/>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/SongListItem.ui b/data/ui/SongListItem.ui
new file mode 100644
index 00000000..3d906d61
--- /dev/null
+++ b/data/ui/SongListItem.ui
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="4.0"/>
+ <object class="GtkBox" id="_song_box">
+ <property name="focusable">False</property>
+ <property name="valign">start</property>
+ <child>
+ <object class="GtkCheckButton" id="_check">
+ <property name="visible">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="_title_label">
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="ellipsize">end</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_album_label">
+ <property name="ellipsize">end</property>
+ <property name="halign">start</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_artist_label">
+ <property name="ellipsize">end</property>
+ <property name="halign">start</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_duration_label">
+ <property name="halign">start</property>
+ <property name="single_line_mode">True</property>
+ <property name="width_chars">5</property>
+ <property name="xalign">1.0</property>
+ <attributes>
+ <attribute name="font-features" value="tnum=1"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="_star_box">
+ <property name="focusable">0</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="StarImage" id="_star_image">
+ <property name="focusable">False</property>
+ <property name="valign">center</property>
+ <property name="margin-end">12</property>
+ <property name="margin-start">12</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="_menu_button">
+ <property name="focusable">True</property>
+ <property name="icon-name">view-more-symbolic</property>
+ <style>
+ <class name="flat"/>
+ </style>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/data/ui/SongWidget.ui b/data/ui/SongWidget.ui
new file mode 100644
index 00000000..050f3b08
--- /dev/null
+++ b/data/ui/SongWidget.ui
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <template class="SongWidget" parent="GtkListBoxRow">
+ <property name="selectable">False</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="focusable">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkImage" id="_dnd_icon">
+ <property name="visible">False</property>
+ <property name="icon-name">list-drag-handle-symbolic</property>
+ <style>
+ <class name="drag-handle"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="width_request">48</property>
+ <property name="focusable">False</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkImage" id="_play_icon">
+ <property name="focusable">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="_select_button">
+ <property name="focusable">False</property>
+ <property name="receives_default">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_number_label">
+ <property name="focusable">False</property>
+ <property name="halign">end</property>
+ <property name="justify">right</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="title_box">
+ <property name="focusable">False</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkLabel" id="_title_label">
+ <property name="focusable">False</property>
+ <property name="xalign">0</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="ellipsize">end</property>
+ <property name="max_width_chars">90</property>
+ <property name="justify">fill</property>
+ <property name="margin-start">9</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="_artist_box">
+ <property name="visible">False</property>
+ <property name="focusable">False</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkLabel" id="_artist_label">
+ <property name="focusable">False</property>
+ <property name="xalign">0</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="ellipsize">end</property>
+ <property name="max_width_chars">90</property>
+ <property name="justify">fill</property>
+ <property name="margin-start">9</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="_album_duration_box">
+ <property name="focusable">False</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="_album_label">
+ <property name="visible">False</property>
+ <property name="focusable">False</property>
+ <property name="xalign">0</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="ellipsize">end</property>
+ <property name="max_width_chars">90</property>
+ <property name="justify">fill</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_duration_label">
+ <property name="focusable">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="single_line_mode">True</property>
+ <attributes>
+ <attribute name="font-features" value="tnum=1"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStack" id="_star_stack">
+ <property name="focusable">False</property>
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">star</property>
+ <property name="child">
+ <object class="GtkBox" id="_star_box">
+ <property name="focusable">0</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkGestureClick">
+ <property name="button">1</property>
+ <property name="propagation-phase">capture</property>
+ <signal name="released" handler="_on_star_toggle" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEventControllerMotion">
+ <signal name="enter" handler="_on_star_hover" swapped="no"/>
+ <signal name="leave" handler="_on_star_unhover" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="StarImage" id="_star_image">
+ <property name="focusable">False</property>
+ <property name="valign">center</property>
+ <property name="margin-end">12</property>
+ <property name="margin-start">12</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">empty</property>
+ <property name="child">
+ <object class="GtkBox"/>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="_menu_button">
+ <property name="visible">False</property>
+ <property name="focusable">True</property>
+ <property name="icon-name">view-more-symbolic</property>
+ <style>
+ <class name="flat"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGestureClick">
+ <property name="button">1</property>
+ <signal name="released" handler="_on_click" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkDragSource" id="_drag_source">
+ <property name="actions">move</property>
+ <property name="propagation-phase">none</property>
+ <signal name="prepare" handler="_on_drag_prepare" swapped="no"/>
+ <signal name="drag-begin" handler="_on_drag_begin" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkDropTarget">
+ <property name="actions">move</property>
+ <property name="formats">SongWidget</property>
+ <property name="preload">True</property>
+ <signal name="drop" handler="_on_drop" swapped="no"/>
+ </object>
+ </child>
+ <style>
+ <class name="songwidget"/>
+ </style>
+ </template>
+ <object class="GtkSizeGroup" id="_size_group">
+ <property name="mode">horizontal</property>
+ <widgets>
+ <widget name="title_box"/>
+ <widget name="_artist_box"/>
+ <widget name="_album_duration_box"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/data/ui/SongWidgetMenu.ui b/data/ui/SongWidgetMenu.ui
new file mode 100644
index 00000000..17c7a34a
--- /dev/null
+++ b/data/ui/SongWidgetMenu.ui
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="SongWidgetMenu" parent="GtkPopoverMenu">
+ <property name="autohide">True</property>
+ <property name="position">bottom</property>
+ <property name="visible">False</property>
+ <property name="menu-model">song-menu</property>
+ </template>
+ <menu id="song-menu">
+ <item>
+ <attribute name="label" translatable="yes">_Play</attribute>
+ <attribute name="action">songwidget.play</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Add to Playlist…</attribute>
+ <attribute name="action">songwidget.add_playlist</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Remove from Playlist</attribute>
+ <attribute name="action">songwidget.remove_playlist</attribute>
+ </item>
+ </menu>
+</interface>
diff --git a/data/ui/SongsView.ui b/data/ui/SongsView.ui
new file mode 100644
index 00000000..c2dc2126
--- /dev/null
+++ b/data/ui/SongsView.ui
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <template class="SongsView" parent="GtkBox">
+ <property name="margin-bottom">48</property>
+ <property name="margin-top">48</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <child>
+ <object class="AdwClampScrollable" id="_adw_clamp_scrollable">
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="maximum-size">1000</property>
+ <child>
+ <object class="GtkListView" id="_listview">
+ <property name="show-separators">True</property>
+ <style>
+ <class name="songs-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/TwoLineTip.ui b/data/ui/TwoLineTip.ui
new file mode 100644
index 00000000..2ebece59
--- /dev/null
+++ b/data/ui/TwoLineTip.ui
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="TwoLineTip" parent="GtkBox">
+ <property name="focusable">False</property>
+ <property name="vexpand">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="_title_label">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ <style>
+ <class name="tooltip-title"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="_subtitle_label">
+ <property name="focusable">False</property>
+ <property name="halign">start</property>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/Window.ui b/data/ui/Window.ui
new file mode 100644
index 00000000..9c9b80bc
--- /dev/null
+++ b/data/ui/Window.ui
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="Window" parent="AdwApplicationWindow">
+ <property name="default-height">500</property>
+ <property name="default-width">300</property>
+ <child>
+ <object class="GtkEventControllerKey">
+ <property name="propagation-phase">capture</property>
+ <signal name="key-pressed" handler="_on_key_press" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="AdwToastOverlay" id="_toast_overlay">
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkStack" id="_headerbar_stack">
+ <property name="transition-type">crossfade</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkOverlay" id="_overlay">
+ <property name="vexpand">True</property>
+ <child>
+ <object class="AdwViewStack" id="_stack">
+ <property name="focusable">False</property>
+ <property name="hhomogeneous">False</property>
+ <property name="vhomogeneous">False</property>
+ </object>
+ </child>
+ <child type="overlay">
+ <object class="GtkProgressBar" id="_loading_progress">
+ <property name="valign">start</property>
+ <property name="visible">False</property>
+ <style>
+ <class name="osd"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="SelectionToolbar" id="_selection_toolbar"/>
+ </child>
+ <child>
+ <object class="PlayerToolbar" id="_player_toolbar"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/help-overlay.ui b/data/ui/help-overlay.ui
new file mode 100644
index 00000000..809063b7
--- /dev/null
+++ b/data/ui/help-overlay.ui
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <object class="GtkShortcutsWindow" id="help_overlay">
+ <property name="modal">True</property>
+ <child>
+ <object class="GtkShortcutsSection">
+ <property name="section-name">shortcuts</property>
+ <property name="max-height">17</property>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="title" translatable="yes" context="shortcut window">General</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Close window</property>
+ <property name="action-name">app.quit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Search</property>
+ <property name="accelerator">&lt;Primary&gt;F</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Help</property>
+ <property name="action-name">app.help</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Shortcuts</property>
+ <property name="action-name">win.show-help-overlay</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="title" translatable="yes" context="shortcut window">Playback</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Play/Pause</property>
+ <property name="accelerator">&lt;Ctrl&gt;space</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Next song</property>
+ <property name="accelerator">&lt;Ctrl&gt;N</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Previous song</property>
+ <property name="accelerator">&lt;Ctrl&gt;B</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Toggle repeat</property>
+ <property name="accelerator">&lt;Ctrl&gt;R</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Toggle shuffle</property>
+ <property name="accelerator">&lt;Ctrl&gt;S</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="title" translatable="yes" context="shortcut window">Navigation</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Go to Albums</property>
+ <property name="accelerator">&lt;Alt&gt;1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Go to Artists</property>
+ <property name="accelerator">&lt;Alt&gt;2</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Go to Songs</property>
+ <property name="accelerator">&lt;Alt&gt;3</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Go to Playlists</property>
+ <property name="accelerator">&lt;Alt&gt;4</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="title" translatable="yes" context="shortcut window">Go back</property>
+ <property name="accelerator">&lt;Alt&gt;Left</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/gnome-music.doap b/gnome-music.doap
new file mode 100644
index 00000000..1fb9cdcc
--- /dev/null
+++ b/gnome-music.doap
@@ -0,0 +1,32 @@
+<Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+ xmlns:foaf="http://xmlns.com/foaf/0.1/"
+ xmlns:gnome="http://api.gnome.org/doap-extensions#"
+ xmlns="http://usefulinc.com/ns/doap#">
+
+ <name xml:lang="en">gnome-music</name>
+ <shortdesc xml:lang="en">Music player and management application</shortdesc>
+ <description>Music is the new GNOME music playing application.</description>
+
+ <homepage rdf:resource="https://wiki.gnome.org/Apps/Music" />
+ <download-page rdf:resource="https://download.gnome.org/sources/gnome-music/" />
+ <bug-database rdf:resource="https://gitlab.gnome.org/GNOME/gnome-music/issues" />
+
+ <category rdf:resource="http://api.gnome.org/doap-extensions#apps" />
+ <programming-language>Python</programming-language>
+
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Marinus Schraal</foaf:name>
+ <foaf:mbox rdf:resource="mailto:mschraal@gnome.org" />
+ <gnome:userid>mschraal</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Jean Felder</foaf:name>
+ <foaf:mbox rdf:resource="mailto:jfelder@gnome.org" />
+ <gnome:userid>jfelder</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+</Project>
diff --git a/gnome-music.in b/gnome-music.in
new file mode 100755
index 00000000..7f69c1b0
--- /dev/null
+++ b/gnome-music.in
@@ -0,0 +1,110 @@
+#!/usr/bin/env python3
+# Copyright © 2018 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import gettext
+import locale
+import os
+import signal
+import sys
+
+_LOCAL = @local_build@
+
+if _LOCAL:
+ # In the local use case, use gnomemusic module from the sourcetree
+ sys.path.insert(1, '@pythondir@')
+
+ # In the local use case the installed schemas go in <builddir>/data
+ os.environ["XDG_DATA_DIRS"] = '@schemasdir@:' + os.environ.get("XDG_DATA_DIRS", "")
+
+import gi
+
+gi.require_version("Adw", "1")
+gi.require_version('Gtk', '4.0')
+gi.require_version('GIRepository', '2.0')
+gi.require_version('Gst', '1.0')
+from gi.repository import Adw, GIRepository, Gio, Gtk, Gst
+
+Gst.init(None)
+Adw.init()
+
+LOCALE_DIR = '@localedir@'
+PKGDATA_DIR = '@pkgdatadir@'
+VERSION = '@version@'
+
+def set_exception_hook():
+ """Configures sys.excepthook to enforce Gtk application exiting."""
+
+ def new_hook(etype, evalue, etb):
+ old_hook(etype, evalue, etb)
+ while Gtk.main_level():
+ Gtk.main_quit()
+ sys.exit()
+
+ old_hook = sys.excepthook
+ sys.excepthook = new_hook
+
+def set_internationalization():
+ """Sets application internationalization."""
+ try:
+ locale.bindtextdomain('@application_id@', LOCALE_DIR)
+ locale.textdomain('@application_id@')
+ except AttributeError as e:
+ # Python built without gettext support does not have
+ # bindtextdomain() and textdomain().
+ print(
+ "Could not bind the gettext translation domain. Some"
+ " translations will not work. Error:\n{}".format(e))
+
+ gettext.bindtextdomain('@application_id@', LOCALE_DIR)
+ gettext.textdomain('@application_id@')
+
+
+def set_resources():
+ """Sets application ressource file."""
+ resource = Gio.resource_load(
+ os.path.join(PKGDATA_DIR, '@rdnn_name@.gresource'))
+ Gio.Resource._register(resource) # nopep8
+
+
+def run_application():
+ """Runs GNOME Music application and returns its exit code."""
+ from gnomemusic.application import Application
+
+ app = Application('@application_id@', VERSION)
+ signal.signal(signal.SIGINT, signal.SIG_DFL)
+ return app.run(sys.argv)
+
+
+def main():
+ """Sets environment and runs GNOME Music."""
+ # set_exception_hook()
+ set_internationalization()
+ set_resources()
+ return run_application()
+
+if __name__ == '__main__':
+ if _LOCAL:
+ print('Running from source tree, using local files.')
+ sys.exit(main())
diff --git a/gnomemusic/__init__.py b/gnomemusic/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/gnomemusic/__init__.py
diff --git a/gnomemusic/about.py b/gnomemusic/about.py
new file mode 100644
index 00000000..1d6a708b
--- /dev/null
+++ b/gnomemusic/about.py
@@ -0,0 +1,258 @@
+# aboutwindow.py
+#
+# Copyright 2022 Christopher Davis <christopherdavis@gnome.org>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+from gettext import gettext as _
+
+from gi.repository import Adw, Gtk
+
+
+def show_about(app_id, version, parent):
+ developers = [
+ "Abhinav Singh",
+ "Adam Blanchet",
+ "Adrian Solom",
+ "Alberto Fanjul",
+ "Alexander Mikhaylenko",
+ "Andre Klapper",
+ "Andreas Nilsson",
+ "Apostol Bakalov",
+ "Arnel A. Borja",
+ "Ashwani Singh Tanwar",
+ "Ashwin Mohan",
+ "Atharva Veer",
+ "Automeris Naranja",
+ "Benoît Legat",
+ "Bilal Elmoussaoui",
+ "Billy Barrow",
+ "Bruce Cowan",
+ "Carlos Garnacho",
+ "Carlos Soriano",
+ "Chinmay Gurjar",
+ "Christophe van den Abbeele",
+ "Christopher Davis",
+ "Clayton G. Hobbs",
+ "Divyanshu Vishwakarma",
+ "Eslam Mostafa",
+ "Elias Entrup",
+ "Erik Inkinen",
+ "Evan Nehring",
+ "Evandro Giovanini",
+ "Ezike Ebuka",
+ "Fabiano Fidêncio",
+ "Felipe Borges",
+ "Florian Darfeuille",
+ "Gaurav Narula",
+ "Georges Basile Stavracas Neto",
+ "Guillaume Quintard",
+ "Gyanesh Malhotra",
+ "Harry Xie",
+ "Hugo Posnic",
+ "Ishaan Shah",
+ "Islam Bahnasy",
+ "Jakub Steiner",
+ "James A. Baker",
+ "Jan Alexander Steffens",
+ "Janne Körkkö",
+ "Jan-Michael Brummer",
+ "Jean Felder",
+ "Jeremy Bicha",
+ "Jesus Bermudez Velazquez",
+ "Jordan Petridis",
+ "Juan José González",
+ "Juan Suarez",
+ "Kainaat Singh",
+ "Kalev Lember",
+ "Kevin Haller",
+ "Konstantin Pospelov",
+ "Koushik Sahu",
+ "Lucy Coleclough",
+ "Marinus Schraal",
+ "Michael Catanzaro",
+ "Mohanna Datta Yelugoti",
+ "Nick Richards",
+ "Niels De Graef",
+ "Nikolay Yanchuk",
+ "Nils Reuße",
+ "Pablo Palácios",
+ "Phil Dawson",
+ "Piotr Drąg",
+ "Prashant Tyagi",
+ "Rafael Coelho",
+ "Rashi Sah",
+ "Rasmus Thomsen",
+ "Reuben Dsouza",
+ "Robert Greener",
+ "Sabri Ünal",
+ "Sagar Lakhani",
+ "Sai Suman Prayaga",
+ "Sam Hewitt",
+ "Sam Thursfield",
+ "Sambhav Kothari",
+ "Seif Lotfy",
+ "Shivani Poddar",
+ "Shivansh Handa",
+ "Simon McVittie",
+ "Sophie Herold",
+ "Subhadip Jana",
+ "Sumaid Syed",
+ "Suyash Garg",
+ "Tapasweni Pathak",
+ "Taylor Garcia",
+ "Tjipke van der Heide",
+ "Vadim Rutkovsky",
+ "Veerasamy Sevagen",
+ "Vineet Reddy",
+ "Weifang Lai",
+ "Yann Delaby",
+ "Yash Singh",
+ "Yosef Or Boczko"
+ ]
+
+ designers = [
+ "Allan Day",
+ "Jakub Steiner",
+ "William Jon McCann"
+ ]
+
+ translators = [
+ "Adolfo Jayme Barrientos",
+ "அருள்ராஜன் அ லை",
+ "A S Alam",
+ "Alain Lojewski",
+ "Alan Mortensen",
+ "Aleksandr Melman",
+ "Alexander Shopov",
+ "Alexandre Franke",
+ "Alexey Rubtsov",
+ "Anders Jonsson",
+ "Andika Triwidada",
+ "Anish Sheela",
+ "Arash Mousavi",
+ "Asier Sarasua Garmendia",
+ "Ask Hjorth Larsen",
+ "Aurimas Černius",
+ "Balázs Meskó",
+ "Balázs Úr",
+ "Baurzhan Muftakhidinov",
+ "Bruce Cowan",
+ "Boyuan Yang",
+ "Carmen Bianca Bakker",
+ "Cédric Valmary",
+ "Chao-Hsiung Liao",
+ "Charles Monzat",
+ "Cheng Lu",
+ "Cheng-Chia Tseng",
+ "Claude Paroz",
+ "Danial Behzadi",
+ "Daniel Korostil",
+ "Daniel Mustieles García",
+ "Daniel Șerbănescu",
+ "David King",
+ "Dušan Kazik",
+ "Efstathios Iosifidis",
+ "Emin Tufan Çetin",
+ "Enrico Nicoletto",
+ "Fábio Nogueira",
+ "Fabio Tomat",
+ "Florentina Mușat",
+ "Fran Diéguez",
+ "Furkan Tokaç",
+ "Gábor Kelemen",
+ "Gil Forcada Codinachs",
+ "Goran Vidović",
+ "Guillaume Bernard",
+ "Henrique Machado Campos",
+ "Hugo Carvalho",
+ "Inaki Larranaga Murgoitio",
+ "Jiri Grönroos",
+ "Joe Hansen",
+ "Jor Teron",
+ "Jordi Mas",
+ "Juliano Camargo",
+ "Julien Humbert",
+ "Justin van Steijn",
+ "Kjartan Maraas",
+ "Kristjan Schmidt",
+ "Kukuh Syafaat",
+ "Leônidas Araújo",
+ "Luna Jernberg",
+ "Марко Костић",
+ "Marek Černocký",
+ "Mario Blättermann",
+ "Matej Urbančič",
+ "Matheus Barbosa",
+ "Milo Casagrande",
+ "Mingcong Bai",
+ "Mpho Jele",
+ "Мирослав Николић",
+ "Милош Поповић",
+ "Nart Tlisha",
+ "Nathan Follens",
+ "Osman Karagöz",
+ "Pawan Chitrakar",
+ "Petr Kovář",
+ "Philipp Kiemle",
+ "Piotr Drąg",
+ "Quentin Pagès",
+ "Rafael Fontenelle",
+ "Rodrigo Lledó Milanca",
+ "Rūdolfs Mazurs",
+ "Ryuta Fujii",
+ "Rūdolfs Mazurs",
+ "Sabri Ünal",
+ "Sebastian Rasmussen",
+ "Seong-ho Cho",
+ "Stas Solovey",
+ "Sveinn í Felli",
+ "Tiago Santos",
+ "Tim Sabsch",
+ "Tjipke van der Heide",
+ "Tom Tryfonidis",
+ "Trần Ngọc Quân",
+ "Vasil Pupkin",
+ "Vinzenz Vietzke",
+ "Xavi Ivars",
+ "Yaron Shahrabani",
+ "Yi-Jyun Pan",
+ "Yosef Or Boczko",
+ "Yuras Shumovich",
+ "Yuri Chornoivan",
+ "Yuri Myasoedov",
+ "Zander Brown",
+ "Zmicer Turok",
+ "Zurab Kargareteli"
+ ]
+
+ about = Adw.AboutWindow(
+ application_name=_("Music"),
+ application_icon=app_id,
+ developer_name=_("The GNOME Project"),
+ transient_for=parent,
+ developers=developers,
+ designers=designers,
+ translator_credits=_("translator-credits"),
+ version=version,
+ website="https://wiki.gnome.org/Apps/Music",
+ issue_url="https://gitlab.gnome.org/GNOME/gnome-music/-/issues/new",
+ copyright=_("Copyright The GNOME Music Developers"),
+ license_type=Gtk.License.GPL_2_0)
+
+ about.add_credit_section(_("Translated by"), translators)
+
+ about.present()
diff --git a/gnomemusic/albumart.py b/gnomemusic/albumart.py
new file mode 100644
index 00000000..6e3348df
--- /dev/null
+++ b/gnomemusic/albumart.py
@@ -0,0 +1,82 @@
+# Copyright 2020 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import gi
+gi.require_version("MediaArt", "2.0")
+from gi.repository import GObject, MediaArt
+
+from gnomemusic.asyncqueue import AsyncQueue
+from gnomemusic.embeddedart import EmbeddedArt
+from gnomemusic.fileexistsasync import FileExistsAsync
+from gnomemusic.griloartqueue import GriloArtQueue
+from gnomemusic.utils import CoreObjectType
+
+
+class AlbumArt(GObject.GObject):
+ """AlbumArt retrieval object
+ """
+
+ _async_queue = AsyncQueue("AlbumArt")
+
+ def __init__(self, application, corealbum):
+ """Initialize AlbumArt
+
+ :param Application application: The application object
+ :param CoreAlbum corealbum: The corealbum to use
+ """
+ super().__init__()
+
+ self._corealbum = corealbum
+ self._coregrilo = application.props.coregrilo
+ self._album = self._corealbum.props.title
+ self._artist = self._corealbum.props.artist
+
+ self._grilo_art_queue = GriloArtQueue(application)
+
+ self._in_cache()
+
+ def _on_embedded_art_found(self, embeddedart, found):
+ if found:
+ self._in_cache()
+ else:
+ self._grilo_art_queue.queue(self._corealbum, CoreObjectType.ALBUM)
+
+ def _in_cache(self):
+ success, thumb_file = MediaArt.get_file(
+ self._artist, self._album, "album")
+ if not success:
+ return
+
+ def on_file_exists_async_finished(obj, result):
+ if result:
+ self._corealbum.props.thumbnail = thumb_file.get_uri()
+ else:
+ embedded = EmbeddedArt()
+ embedded.connect("art-found", self._on_embedded_art_found)
+ embedded.query(self._corealbum, self._album)
+
+ file_exists_async = FileExistsAsync()
+ file_exists_async.connect(
+ "finished", on_file_exists_async_finished)
+ self._async_queue.queue(file_exists_async, thumb_file)
diff --git a/gnomemusic/application.py b/gnomemusic/application.py
new file mode 100644
index 00000000..dc6cbe18
--- /dev/null
+++ b/gnomemusic/application.py
@@ -0,0 +1,249 @@
+# Copyright (c) 2013 Arnel A. Borja <kyoushuu@yahoo.com>
+# Copyright (c) 2013 Vadim Rutkovsky <vrutkovs@redhat.com>
+# Copyright (c) 2013 Lubosz Sarnecki <lubosz@gmail.com>
+# Copyright (c) 2013 Guillaume Quintard <guillaume.quintard@gmail.com>
+# Copyright (c) 2013 Felipe Borges <felipe10borges@gmail.com>
+# Copyright (c) 2013 Eslam Mostafa <cseslam@gmail.com>
+# Copyright (c) 2013 Shivani Poddar <shivani.poddar92@gmail.com>
+# Copyright (c) 2013 Sai Suman Prayaga <suman.sai14@gmail.com>
+# Copyright (c) 2013 Seif Lotfy <seif@lotfy.com>
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from typing import Optional
+from gettext import gettext as _
+
+from gi.repository import Adw, Gtk, Gio, GLib, Gdk, GObject
+
+from gnomemusic.about import show_about
+from gnomemusic.coregrilo import CoreGrilo
+from gnomemusic.coremodel import CoreModel
+from gnomemusic.coreselection import CoreSelection
+from gnomemusic.inhibitsuspend import InhibitSuspend
+from gnomemusic.mpris import MPRIS
+from gnomemusic.musiclogger import MusicLogger
+from gnomemusic.notificationmanager import NotificationManager
+from gnomemusic.pauseonsuspend import PauseOnSuspend
+from gnomemusic.player import Player
+from gnomemusic.scrobbler import LastFmScrobbler
+from gnomemusic.search import Search
+from gnomemusic.widgets.lastfmdialog import LastfmDialog
+from gnomemusic.window import Window
+
+
+class Application(Adw.Application):
+
+ def __init__(self, application_id, version):
+ super().__init__(
+ application_id=application_id,
+ flags=Gio.ApplicationFlags.FLAGS_NONE)
+ self.props.resource_base_path = "/org/gnome/Music"
+ GLib.set_application_name(_("Music"))
+ GLib.set_prgname(application_id)
+ GLib.setenv("PULSE_PROP_media.role", "music", True)
+
+ self._version = version
+ self._window = None
+
+ self._log = MusicLogger()
+ self._search = Search()
+
+ self._notificationmanager = NotificationManager(self)
+ self._coreselection = CoreSelection()
+ self._coremodel = CoreModel(self)
+ # Order is important: CoreGrilo initializes the Grilo sources,
+ # which in turn use CoreModel & CoreSelection extensively.
+ self._coregrilo = CoreGrilo(self)
+
+ self._settings = Gio.Settings.new('org.gnome.Music')
+ self._lastfm_scrobbler = LastFmScrobbler(self)
+ self._player = Player(self)
+
+ self._lastfm_dialog: Optional[LastfmDialog] = None
+
+ InhibitSuspend(self)
+ PauseOnSuspend(self._player)
+
+ @GObject.Property(
+ type=CoreGrilo, default=None, flags=GObject.ParamFlags.READABLE)
+ def coregrilo(self):
+ """Get application-wide CoreGrilo instance.
+
+ :returns: The grilo wrapper
+ :rtype: CoreGrilo
+ """
+ return self._coregrilo
+
+ @GObject.Property(
+ type=MusicLogger, default=None, flags=GObject.ParamFlags.READABLE)
+ def log(self):
+ """Get application-wide logging facility.
+
+ :returns: the logger
+ :rtype: MusicLogger
+ """
+ return self._log
+
+ @GObject.Property(
+ type=Player, default=None, flags=GObject.ParamFlags.READABLE)
+ def player(self):
+ """Get application-wide music player.
+
+ :returns: the player
+ :rtype: Player
+ """
+ return self._player
+
+ @GObject.Property(
+ type=Gio.Settings, flags=GObject.ParamFlags.READABLE)
+ def settings(self):
+ """Get application-wide settings.
+
+ :returns: settings
+ :rtype: Gio.settings
+ """
+ return self._settings
+
+ @GObject.Property(
+ type=CoreModel, flags=GObject.ParamFlags.READABLE)
+ def coremodel(self):
+ """Get class providing all listmodels.
+
+ :returns: List model provider class
+ :rtype: CoreModel
+ """
+ return self._coremodel
+
+ @GObject.Property(
+ type=CoreSelection, flags=GObject.ParamFlags.READABLE)
+ def coreselection(self):
+ """Get selection object.
+
+ :returns: Object containing all selection info
+ :rtype: CoreSelection
+ """
+ return self._coreselection
+
+ @GObject.Property(type=LastFmScrobbler, flags=GObject.ParamFlags.READABLE)
+ def lastfm_scrobbler(self):
+ """Get Last.fm scrobbler.
+
+ :returns: Last.fm scrobbler
+ :rtype: LastFmScrobbler
+ """
+ return self._lastfm_scrobbler
+
+ @GObject.Property(type=Window, flags=GObject.ParamFlags.READABLE)
+ def window(self):
+ """Get main window.
+
+ :returns: Main window.
+ :rtype: Window
+ """
+ return self._window
+
+ @GObject.Property(
+ type=Search, flags=GObject.ParamFlags.READABLE)
+ def search(self):
+ """Get class providing search logic.
+
+ :returns: List model provider class
+ :rtype: Search
+ """
+ return self._search
+
+ @GObject.Property(
+ type=NotificationManager, flags=GObject.ParamFlags.READABLE)
+ def notificationmanager(self):
+ """Get notification manager
+
+ :returns: notification manager
+ :rtype: NotificationManager
+ """
+ return self._notificationmanager
+
+ def _set_actions(self):
+ action_entries = [
+ ('about', self._about, None),
+ ("help", self._help, ("app.help", ["F1"])),
+ ("lastfm-configure", self._lastfm_account, None),
+ ("quit", self._quit, ("app.quit", ["<Ctrl>Q"]))
+ ]
+
+ for action, callback, accel in action_entries:
+ simple_action = Gio.SimpleAction.new(action, None)
+ simple_action.connect('activate', callback)
+ self.add_action(simple_action)
+ if accel is not None:
+ self.set_accels_for_action(*accel)
+
+ def _help(self, action: Gio.Action, param: Optional[GLib.Variant]) -> None:
+
+ def show_uri_cb(parent: Gtk.Window, result: Gio.AsyncResult) -> None:
+ try:
+ Gtk.show_uri_full_finish(parent, result)
+ except GLib.Error:
+ self._log.message("Help handler not available.")
+
+ Gtk.show_uri_full(
+ self._window, "help:gnome-music", Gdk.CURRENT_TIME, None,
+ show_uri_cb)
+
+ def _lastfm_account(
+ self, action: Gio.SimpleAction,
+ param: Optional[GLib.Variant]) -> None:
+
+ def on_response(dialog: LastfmDialog, response_id: int) -> None:
+ if not self._lastfm_dialog:
+ return
+
+ self._lastfm_dialog.destroy()
+ self._lastfm_dialog = None
+
+ self._lastfm_dialog = LastfmDialog(
+ self._window, self._lastfm_scrobbler)
+ self._lastfm_dialog.connect("response", on_response)
+ self._lastfm_dialog.present()
+
+ def _about(self, action, param):
+ show_about(self.props.application_id, self._version, self._window)
+
+ def do_startup(self):
+ Adw.Application.do_startup(self)
+ Adw.StyleManager.get_default().set_color_scheme(
+ Adw.ColorScheme.PREFER_LIGHT)
+ self._set_actions()
+
+ def _quit(self, action=None, param=None):
+ self._window.destroy()
+
+ def do_activate(self):
+ if not self._window:
+ self._window = Window(self)
+ self.notify("window")
+ self._window.set_default_icon_name(self.props.application_id)
+ if self.props.application_id == "org.gnome.Music.Devel":
+ self._window.get_style_context().add_class('devel')
+ MPRIS(self)
+
+ self._window.present()
diff --git a/gnomemusic/artistart.py b/gnomemusic/artistart.py
new file mode 100644
index 00000000..c9360658
--- /dev/null
+++ b/gnomemusic/artistart.py
@@ -0,0 +1,73 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import gi
+gi.require_version("MediaArt", "2.0")
+from gi.repository import GObject, MediaArt
+
+from gnomemusic.asyncqueue import AsyncQueue
+from gnomemusic.fileexistsasync import FileExistsAsync
+from gnomemusic.griloartqueue import GriloArtQueue
+from gnomemusic.utils import CoreObjectType
+
+
+class ArtistArt(GObject.GObject):
+ """Artist art retrieval object
+ """
+
+ _async_queue = AsyncQueue("ArtistArt")
+
+ def __init__(self, application, coreartist):
+ """Initialize.
+
+ :param Application application: The application object
+ :param CoreArtist coreartist: The coreartist to use
+ """
+ super().__init__()
+
+ self._coreartist = coreartist
+ self._coregrilo = application.props.coregrilo
+ self._artist = self._coreartist.props.artist
+
+ self._grilo_art_queue = GriloArtQueue(application)
+
+ self._in_cache()
+
+ def _in_cache(self):
+ success, thumb_file = MediaArt.get_file(self._artist, None, "artist")
+
+ if not success:
+ return
+
+ def on_file_exists_async_finished(obj, result):
+ if result:
+ self._coreartist.props.thumbnail = thumb_file.get_uri()
+ else:
+ self._grilo_art_queue.queue(
+ self._coreartist, CoreObjectType.ARTIST)
+
+ file_exists_async = FileExistsAsync()
+ file_exists_async.connect(
+ "finished", on_file_exists_async_finished)
+ self._async_queue.queue(file_exists_async, thumb_file)
diff --git a/gnomemusic/asyncqueue.py b/gnomemusic/asyncqueue.py
new file mode 100644
index 00000000..6658c103
--- /dev/null
+++ b/gnomemusic/asyncqueue.py
@@ -0,0 +1,120 @@
+# Copyright 2021 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from typing import Any, Dict, Optional, Tuple
+import time
+
+from gi.repository import GObject, GLib
+
+from gnomemusic.musiclogger import MusicLogger
+
+
+class AsyncQueue(GObject.GObject):
+ """Queue async classes
+
+ Allows for queueing async class calls and limit the amount of
+ concurrent async operations ongoing. This to alleviate the
+ pressure of having numerous ongoing async tasks that do IO or
+ networking.
+
+ A queued class must have a `start` function which starts the
+ async task and a `finished` signal, which indicates it is done.
+ The signal may be used by the caller and have an arbitrary
+ number and type of arguments.
+ The query function's first argument should be the async class and
+ may have an arbitrary number of arguments following.
+ """
+
+ def __init__(self, queue_name: Optional[str] = None) -> None:
+ """Initialize AsyncQueue
+
+ :param str queue_name: The user facing name of this queue or
+ None for the generic class identifier
+ """
+ super().__init__()
+
+ self._async_pool: Dict[int, Tuple] = {}
+ self._async_active_pool: Dict[int, Tuple] = {}
+ self._async_data: Dict[object, Tuple[int, float]] = {}
+ self._log = MusicLogger()
+ self._max_async = 40
+ self._queue_name = queue_name if queue_name else self
+ self._timeout_id = 0
+
+ def queue(self, *args: Any) -> None:
+ """Queue an async call
+
+ :param *args: The first item should be an async class, the
+ following arbitrary numbers of arguments are to be passed
+ to the `start` call of the given class.
+ See the class doc for more information.
+ """
+ async_obj_id = id(args[0])
+
+ if async_obj_id in self._async_active_pool:
+ obj = args[0]
+ handler_id, _ = self._async_data.pop(obj)
+ obj.disconnect(handler_id)
+ self._async_active_pool.pop(id(obj))
+ elif async_obj_id in self._async_pool:
+ self._async_pool.pop(async_obj_id)
+
+ self._async_pool[async_obj_id] = (args)
+
+ if self._timeout_id == 0:
+ self._timeout_id = GLib.timeout_add(100, self._dispatch)
+
+ def _dispatch(self) -> bool:
+ tick = time.time()
+
+ while len(self._async_active_pool) < self._max_async:
+ if len(self._async_pool) == 0:
+ self._timeout_id = 0
+ return GLib.SOURCE_REMOVE
+
+ async_obj_id = list(self._async_pool.keys())[0]
+ async_task_args = self._async_pool.pop(async_obj_id)
+ async_obj = async_task_args[0]
+ self._async_active_pool[async_obj_id] = async_task_args
+
+ self._async_data[async_obj] = (
+ async_obj.connect("finished", self._on_async_finished),
+ tick)
+ async_obj.start(*async_task_args[1:])
+
+ self._log.debug(
+ f"{self._queue_name}: "
+ f"{len(self._async_active_pool)} active task(s)"
+ f"with {len(self._async_pool)} remaining")
+
+ return GLib.SOURCE_CONTINUE
+
+ def _on_async_finished(
+ self, obj: Any, *signal_args: Any) -> None:
+ handler_id, tick = self._async_data.pop(obj)
+ t = (time.time() - tick) * 1000
+ self._log.debug(f"{self._queue_name}: {t:.2f} ms task")
+
+ obj.disconnect(handler_id)
+ self._async_active_pool.pop(id(obj))
diff --git a/gnomemusic/corealbum.py b/gnomemusic/corealbum.py
new file mode 100644
index 00000000..dca42dc8
--- /dev/null
+++ b/gnomemusic/corealbum.py
@@ -0,0 +1,173 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+
+import gi
+gi.require_versions({"Grl": "0.3"})
+from gi.repository import Gio, Grl, Gtk, GObject
+
+import gnomemusic.utils as utils
+
+from gnomemusic.albumart import AlbumArt
+
+
+class CoreAlbum(GObject.GObject):
+ """Exposes a Grl.Media with relevant data as properties
+ """
+
+ __gtype_name__ = "CoreAlbum"
+
+ artist = GObject.Property(type=str)
+ composer = GObject.Property(type=str, default=None)
+ duration = GObject.Property(type=int, default=0)
+ media = GObject.Property(type=Grl.Media)
+ title = GObject.Property(type=str)
+ url = GObject.Property(type=str)
+ year = GObject.Property(type=str, default=None)
+
+ def __init__(self, application, media):
+ """Initiate the CoreAlbum object
+
+ :param Application application: The application object
+ :param Grl.Media media: A media object
+ """
+ super().__init__()
+
+ self._application = application
+ self._coregrilo = application.props.coregrilo
+ self._model = None
+ self._selected = False
+ self._thumbnail = None
+
+ self.update(media)
+
+ def update(self, media):
+ """Update the CoreAlbum object with new info
+
+ :param Grl.Media media: A media object
+ """
+ self.props.media = media
+ self.props.artist = utils.get_artist_name(media)
+ self.props.composer = media.get_composer()
+ self.props.title = utils.get_media_title(media)
+ self.props.url = media.get_url()
+ self.props.year = utils.get_media_year(media)
+
+ def _get_album_model(self):
+ disc_model = Gio.ListStore()
+ disc_model_sort = Gtk.SortListModel.new(disc_model)
+
+ def _disc_order_sort(disc_a, disc_b, data=None):
+ order = disc_a.props.disc_nr - disc_b.props.disc_nr
+ if order < 0:
+ return Gtk.Ordering.SMALLER
+ elif order > 0:
+ return Gtk.Ordering.LARGER
+ else:
+ return Gtk.Ordering.EQUAL
+
+ disc_sorter = Gtk.CustomSorter()
+ disc_sorter.set_sort_func(_disc_order_sort)
+ disc_model_sort.set_sorter(disc_sorter)
+
+ self._coregrilo.get_album_discs(self.props.media, disc_model)
+
+ return disc_model_sort
+
+ @GObject.Property(
+ type=Gtk.SortListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def model(self):
+ if self._model is None:
+ self._model = self._get_album_model()
+ self._model.connect("items-changed", self._on_list_items_changed)
+ self._model.items_changed(0, 0, self._model.get_n_items())
+
+ return self._model
+
+ def _on_list_items_changed(self, model, position, removed, added):
+ with self.freeze_notify():
+ for coredisc in model:
+ coredisc.props.selected = self.props.selected
+
+ if added > 0:
+ for i in range(added):
+ coredisc = model[position + i]
+ coredisc.connect(
+ "notify::duration", self._on_duration_changed)
+
+ def _on_duration_changed(self, coredisc, duration):
+ duration = 0
+
+ for coredisc in self.props.model:
+ duration += coredisc.props.duration
+
+ self.props.duration = duration
+
+ @GObject.Property(type=bool, default=False)
+ def selected(self):
+ return self._selected
+
+ @selected.setter # type: ignore
+ def selected(self, value):
+ if value == self._selected:
+ return
+
+ self._selected = value
+
+ # The model is loaded on-demand, so the first time the model is
+ # returned it can still be empty. This is problem for returning
+ # a selection. Trigger loading of the model here if a selection
+ # is requested, it will trigger the filled model update as
+ # well.
+ self.props.model.items_changed(0, 0, 0)
+
+ @GObject.Property(type=str, default=None)
+ def thumbnail(self):
+ """Album art thumbnail retrieval
+
+ :return: The album art uri or "generic"
+ :rtype: string
+ """
+ if self._thumbnail is None:
+ self._thumbnail = "generic"
+ AlbumArt(self._application, self)
+
+ return self._thumbnail
+
+ @thumbnail.setter # type: ignore
+ def thumbnail(self, value):
+ """Album art thumbnail setter
+
+ :param string value: uri or "generic"
+ """
+ self._thumbnail = value
+
+ if self._thumbnail != "generic":
+ self.props.media.set_thumbnail(self._thumbnail)
+
+ @GObject.Property(type=object, flags=GObject.ParamFlags.READABLE)
+ def corealbum(self) -> CoreAlbum:
+ return self
diff --git a/gnomemusic/coreartist.py b/gnomemusic/coreartist.py
new file mode 100644
index 00000000..b8d8521b
--- /dev/null
+++ b/gnomemusic/coreartist.py
@@ -0,0 +1,142 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import gi
+gi.require_versions({"Grl": "0.3"})
+from gi.repository import Grl, Gtk, GObject
+
+from gnomemusic.artistart import ArtistArt
+import gnomemusic.utils as utils
+
+
+class CoreArtist(GObject.GObject):
+ """Exposes a Grl.Media with relevant data as properties
+ """
+
+ artist = GObject.Property(type=str)
+ media = GObject.Property(type=Grl.Media)
+
+ def __init__(self, application, media):
+ """Initiate the CoreArtist object
+
+ :param Application application: The application object
+ :param Grl.Media media: A media object
+ """
+ super().__init__()
+
+ self._application = application
+ self._coregrilo = application.props.coregrilo
+ self._coremodel = application.props.coremodel
+ self._model = None
+ self._selected = False
+ self._thumbnail = None
+
+ self.update(media)
+
+ def update(self, media):
+ self.props.media = media
+ self.props.artist = utils.get_artist_name(media)
+
+ def _get_artist_album_model(self):
+ albums_model_filter = Gtk.FilterListModel.new(
+ self._coremodel.props.albums)
+ albums_model_filter.set_filter(Gtk.AnyFilter())
+
+ albums_model_sort = Gtk.SortListModel.new(albums_model_filter)
+
+ self._coregrilo.get_artist_albums(
+ self.props.media, albums_model_filter)
+
+ def _album_sort(album_a, album_b, data=None):
+ year_a = album_a.props.year
+ year_b = album_b.props.year
+ if None in [year_a, year_b]:
+ return Gtk.Ordering.EQUAL
+ elif year_a > year_b:
+ return Gtk.Ordering.LARGER
+ elif year_a < year_b:
+ return Gtk.Ordering.SMALLER
+ else:
+ return Gtk.Ordering.EQUAL
+
+ albums_sorter = Gtk.CustomSorter()
+ albums_sorter.set_sort_func(_album_sort)
+ albums_model_sort.set_sorter(albums_sorter)
+
+ return albums_model_sort
+
+ @GObject.Property(type=Gtk.SortListModel, default=None)
+ def model(self):
+ if self._model is None:
+ self._model = self._get_artist_album_model()
+ self._model.connect("items-changed", self._on_items_changed)
+
+ return self._model
+
+ def _on_items_changed(self, model, pos, removed, added):
+ with self.freeze_notify():
+ for corealbum in self._model:
+ corealbum.props.selected = self.props.selected
+
+ @GObject.Property(type=bool, default=False)
+ def selected(self):
+ return self._selected
+
+ @selected.setter # type: ignore
+ def selected(self, value):
+ if value == self._selected:
+ return
+
+ self._selected = value
+
+ # The model is loaded on-demand, so the first time the model is
+ # returned it can still be empty. This is problem for returning
+ # a selection. Trigger loading of the model here if a selection
+ # is requested, it will trigger the filled model update as
+ # well.
+ self.props.model.items_changed(0, 0, 0)
+
+ @GObject.Property(type=str, default=None)
+ def thumbnail(self):
+ """Artist art thumbnail retrieval
+
+ :return: The artist art uri or "generic"
+ :rtype: string
+ """
+ if self._thumbnail is None:
+ self._thumbnail = "generic"
+ ArtistArt(self._application, self)
+
+ return self._thumbnail
+
+ @thumbnail.setter # type: ignore
+ def thumbnail(self, value):
+ """Artist art thumbnail setter
+
+ :param string value: uri or "generic"
+ """
+ self._thumbnail = value
+
+ if self._thumbnail != "generic":
+ self.props.media.set_thumbnail(self._thumbnail)
diff --git a/gnomemusic/coredisc.py b/gnomemusic/coredisc.py
new file mode 100644
index 00000000..ece33ba2
--- /dev/null
+++ b/gnomemusic/coredisc.py
@@ -0,0 +1,112 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import GObject, Gio, Grl, Gtk
+
+
+class CoreDisc(GObject.GObject):
+
+ __gtype_name__ = "CoreDisc"
+
+ disc_nr = GObject.Property(type=int, default=0)
+ duration = GObject.Property(type=int, default=None)
+ media = GObject.Property(type=Grl.Media, default=None)
+
+ def __init__(self, application, media, nr):
+ """Initialize a CoreDisc object
+
+ :param Application application: The application object
+ :param Grl.Media media: A media object
+ :param int nr: The disc number to create an object for
+ """
+ super().__init__()
+
+ self._coregrilo = application.props.coregrilo
+ self._coremodel = application.props.coremodel
+ self._filter_model = None
+ self._log = application.props.log
+ self._model = None
+ self._selected = False
+
+ self.update(media)
+ self.props.disc_nr = nr
+
+ def update(self, media):
+ self.props.media = media
+
+ @GObject.Property(type=Gio.ListModel, default=None)
+ def model(self):
+ def _disc_sort(song_a, song_b, data=None):
+ order = song_a.props.track_number - song_b.props.track_number
+ if order < 0:
+ return Gtk.Ordering.SMALLER
+ elif order > 0:
+ return Gtk.Ordering.LARGER
+ else:
+ return Gtk.Ordering.EQUAL
+
+ if self._model is None:
+ self._filter_model = Gtk.FilterListModel.new(
+ self._coremodel.props.songs)
+ self._filter_model.set_filter(Gtk.AnyFilter())
+
+ self._model = Gtk.SortListModel.new(self._filter_model)
+ disc_sorter = Gtk.CustomSorter()
+ disc_sorter.set_sort_func(_disc_sort)
+ self._model.set_sorter(disc_sorter)
+
+ self._model.connect("items-changed", self._on_disc_changed)
+
+ self._coregrilo.get_album_disc(
+ self.props.media, self.props.disc_nr, self._filter_model)
+
+ return self._model
+
+ def _on_disc_changed(self, model, position, removed, added):
+ with self.freeze_notify():
+ duration = 0
+ for coresong in model:
+ coresong.props.selected = self._selected
+ duration += coresong.props.duration
+
+ self.props.duration = duration
+
+ @GObject.Property(
+ type=bool, default=False, flags=GObject.ParamFlags.READWRITE)
+ def selected(self):
+ return self._selected
+
+ @selected.setter # type: ignore
+ def selected(self, value):
+ if value == self._selected:
+ return
+
+ self._selected = value
+
+ # The model is loaded on-demand, so the first time the model is
+ # returned it can still be empty. This is problem for returning
+ # a selection. Trigger loading of the model here if a selection
+ # is requested, it will trigger the filled model update as
+ # well.
+ self.props.model.items_changed(0, 0, 0)
diff --git a/gnomemusic/coregrilo.py b/gnomemusic/coregrilo.py
new file mode 100644
index 00000000..e5c17aca
--- /dev/null
+++ b/gnomemusic/coregrilo.py
@@ -0,0 +1,302 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import weakref
+
+import gi
+gi.require_version("Grl", "0.3")
+from gi.repository import Grl, GLib, GObject, Gtk
+
+from gnomemusic.grilowrappers.grlsearchwrapper import GrlSearchWrapper
+from gnomemusic.grilowrappers.grltrackerwrapper import GrlTrackerWrapper
+from gnomemusic.trackerwrapper import TrackerState, TrackerWrapper
+
+
+class CoreGrilo(GObject.GObject):
+
+ _blocklist = [
+ 'grl-bookmarks',
+ 'grl-filesystem',
+ 'grl-itunes-podcast',
+ 'grl-metadata-store',
+ 'grl-podcasts'
+ ]
+
+ _grl_plugin_ranks = ("grl-musicbrainz-coverart:3,"
+ "grl-lastfm-cover:2,"
+ "grl-theaudiodb-cover:1")
+
+ _theaudiodb_api_key = "195003"
+
+ cover_sources = GObject.Property(type=bool, default=False)
+ tracker_available = GObject.Property(type=int)
+
+ def __init__(self, application):
+ """Initiate the CoreGrilo object
+
+ :param Application application: The Application instance to use
+ """
+ super().__init__()
+
+ self._application = application
+ self._coremodel = self._application.props.coremodel
+ self._coreselection = application.props.coreselection
+ self._log = application.props.log
+ self._search_wrappers = {}
+ self._thumbnail_sources = []
+ self._thumbnail_sources_timeout = None
+ self._wrappers = {}
+
+ self._tracker_wrapper = TrackerWrapper(application)
+ self._tracker_wrapper.bind_property(
+ "tracker-available", self, "tracker-available",
+ GObject.BindingFlags.SYNC_CREATE)
+
+ GLib.setenv("GRL_PLUGIN_RANKS", self._grl_plugin_ranks, True)
+
+ Grl.init(None)
+
+ self._registry = Grl.Registry.get_default()
+ config = Grl.Config.new("grl-lua-factory", "grl-theaudiodb-cover")
+ config.set_api_key(self._theaudiodb_api_key)
+ self._registry.add_config(config)
+
+ self._registry.connect('source-added', self._on_source_added)
+ self._registry.connect('source-removed', self._on_source_removed)
+
+ self._registry.load_all_plugins(False)
+
+ tracker_available_state = self._tracker_wrapper.props.tracker_available
+ if tracker_available_state != TrackerState.AVAILABLE:
+ self._tracker_wrapper.connect(
+ "notify::tracker-available",
+ self._on_tracker_available_changed)
+ else:
+ self._on_tracker_available_changed(None, None)
+
+ for plugin in self._registry.get_plugins(False):
+ plugin_id = plugin.get_id()
+ # Activate the Tracker plugin only when TrackerWrapper
+ # is available by listening to the tracker-available
+ # property, so skip it here.
+ if plugin_id != "grl-tracker3":
+ try:
+ self._registry.activate_plugin_by_id(plugin_id)
+ except GLib.GError:
+ self._log.debug(
+ "Failed to activate {} plugin.".format(plugin_id))
+
+ weakref.finalize(self, Grl.deinit)
+
+ def _on_tracker_available_changed(self, klass, value):
+ # FIXME:No removal support yet.
+ new_state = self._tracker_wrapper.props.tracker_available
+ if new_state == TrackerState.AVAILABLE:
+ config = Grl.Config.new("grl-tracker3", "grl-tracker3-source")
+ config.set_string(
+ "miner-service", self._tracker_wrapper.props.miner_fs_busname)
+ config.set_string(
+ "store-path", self._tracker_wrapper.cache_directory())
+ self._registry.add_config(config)
+
+ self._registry.activate_plugin_by_id("grl-tracker3")
+
+ def _on_source_added(self, registry, source):
+
+ def _trigger_art_update():
+ self._thumbnail_sources_timeout = None
+ if len(self._thumbnail_sources) > 0:
+ self.props.cover_sources = True
+
+ return GLib.SOURCE_REMOVE
+
+ if ("net:plaintext" in source.get_tags()
+ or source.props.source_id in self._blocklist):
+ try:
+ registry.unregister_source(source)
+ except GLib.GError:
+ self._log.warning(
+ "Failed to unregister {}".format(source.props.source_id))
+ return
+
+ if Grl.METADATA_KEY_THUMBNAIL in source.supported_keys():
+ self._thumbnail_sources.append(source)
+ if not self._thumbnail_sources_timeout:
+ # Aggregate sources being added, for example when the
+ # network comes online.
+ self._thumbnail_sources_timeout = GLib.timeout_add_seconds(
+ 5, _trigger_art_update)
+
+ if (source.props.source_id == "grl-tracker3-source"
+ and self._tracker_wrapper.location_filter() is not None):
+ new_wrapper = GrlTrackerWrapper(
+ source, self._application, self._tracker_wrapper)
+ self._wrappers[source.props.source_id] = new_wrapper
+ self._log.debug("Adding wrapper {}".format(new_wrapper))
+ music_dir = GLib.get_user_special_dir(
+ GLib.UserDirectory.DIRECTORY_MUSIC)
+ self._log.debug("XDG Music dir is: {}".format(music_dir))
+ elif (source.props.source_id not in self._search_wrappers.keys()
+ and source.props.source_id not in self._wrappers.keys()
+ and source.props.source_id != "grl-tracker3-source"
+ and source.get_supported_media() & Grl.MediaType.AUDIO
+ and source.supported_operations() & Grl.SupportedOps.SEARCH
+ and "net:internet" not in source.props.source_tags):
+ self._search_wrappers[source.props.source_id] = GrlSearchWrapper(
+ source, self._application)
+ self._log.debug("Adding search source {}".format(source))
+
+ def _on_source_removed(self, registry, source):
+ # FIXME: Handle removing sources.
+ self._log.debug("Removed source {}".format(source.props.source_id))
+
+ # FIXME: Only removes search sources atm.
+ self._search_wrappers.pop(source.props.source_id, None)
+
+ def get_artist_albums(self, media, filter_model):
+ """Get all album by an artist
+
+ :param Grl.Media media: A Grilo Media item that represents Artist
+ :param Gtk.FilterListModel filter_model: The model to fill
+ """
+ source = media.get_source()
+ self._wrappers[source].get_artist_albums(media, filter_model)
+
+ def get_album_discs(self, media, disc_model):
+ """Get all discs from an album
+
+ :param Grl.Media media: A Grilo Media item that represents Album
+ :param Gtk.SortListModel disc_model: The model to fill
+ """
+ source = media.get_source()
+ self._wrappers[source].get_album_discs(media, disc_model)
+
+ def get_album_disc(
+ self, media: Grl.Media, discnr: int,
+ model: Gtk.FilterListModel) -> None:
+ """Get all songs from an album disc
+
+ :param Grl.Media media: An album
+ :param int discnr: The disc number
+ :param Gtk.FilterListModel model: The model to fill
+ """
+ source = media.get_source()
+ self._wrappers[source].get_album_disc(media, discnr, model)
+
+ def writeback(self, media, key):
+ """Store the values associated with the key.
+
+ :param Grl.Media media: A Grilo media item
+ :param int key: a Grilo metadata key
+ """
+ def _store_metadata_cb(source, media, failed_keys, data, error):
+ if error is not None:
+ self._log.warning(
+ "Error {}: {}".format(error.domain, error.message))
+ if failed_keys:
+ self._log.warning("Unable to update {}".format(failed_keys))
+
+ for wrapper in self._wrappers.values():
+ if media.get_source() == wrapper.source.props.source_id:
+ wrapper.props.source.store_metadata(
+ media, [key], Grl.WriteFlags.NORMAL, _store_metadata_cb,
+ None)
+ break
+
+ def writeback_tracker(self, media, tag):
+ """Use Tracker queries to update tags.
+
+ The tags are associated with a Tracker resource
+ (song, album, artist or external resource), so they can cannot
+ be updated with grilo writeback support.
+
+ :param Grl.Media media: A Grilo media item
+ :param str tag: tag to update
+ """
+ self._tracker_wrapper.update_tag(media, tag)
+
+ def search(self, text):
+ for wrapper in self._wrappers.values():
+ wrapper.search(text)
+ for wrapper in self._search_wrappers.values():
+ wrapper.search(text)
+
+ def get_song_art(self, coresong, storeart=None):
+ """Retrieve song art for the given CoreSong
+
+ :param CoreSong coresong: CoreSong to retrieve art for
+ :param StoreArt storeart: StoreArt instance or None
+ """
+ if "grl-tracker3-source" in self._wrappers:
+ self._wrappers["grl-tracker3-source"].get_song_art(
+ coresong, storeart)
+
+ def get_album_art(self, corealbum, storeart=None):
+ """Retrieve album art for the given CoreAlbum
+
+ :param CoreAlbum corealbum: CoreAlbum to retrieve art for
+ :param StoreArt storeart: StoreArt instance or None
+ """
+ if "grl-tracker3-source" in self._wrappers:
+ self._wrappers["grl-tracker3-source"].get_album_art(
+ corealbum, storeart)
+
+ def get_artist_art(self, coreartist, storeart=None):
+ """Retrieve artist art for the given CoreArtist
+
+ :param CoreArtist coreartist: CoreArtist to retrieve art for
+ :param StoreArt storeart: StoreArt instance or None
+ """
+ if "grl-tracker3-source" in self._wrappers:
+ self._wrappers["grl-tracker3-source"].get_artist_art(
+ coreartist, storeart)
+
+ def stage_playlist_deletion(self, playlist):
+ """Prepares playlist deletion.
+
+ :param Playlist playlist: playlist
+ """
+ if "grl-tracker3-source" in self._wrappers:
+ self._wrappers["grl-tracker3-source"].stage_playlist_deletion(
+ playlist)
+
+ def finish_playlist_deletion(self, playlist, deleted):
+ """Finishes playlist deletion.
+
+ :param Playlist playlist: playlist
+ :param bool deleted: indicates if the playlist has been deleted
+ """
+ if "grl-tracker3-source" in self._wrappers:
+ self._wrappers["grl-tracker3-source"].finish_playlist_deletion(
+ playlist, deleted)
+
+ def create_playlist(self, playlist_title, callback):
+ """Creates a new user playlist.
+
+ :param str playlist_title: playlist title
+ :param callback: function to perform once, the playlist is created
+ """
+ if "grl-tracker3-source" in self._wrappers:
+ self._wrappers["grl-tracker3-source"].create_playlist(
+ playlist_title, callback)
diff --git a/gnomemusic/coremodel.py b/gnomemusic/coremodel.py
new file mode 100644
index 00000000..2ab5a59c
--- /dev/null
+++ b/gnomemusic/coremodel.py
@@ -0,0 +1,522 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from typing import Any, Optional, Union
+import typing
+
+from gi.repository import GLib, GObject, Gio, Gtk
+
+from gnomemusic.corealbum import CoreAlbum
+from gnomemusic.coreartist import CoreArtist
+from gnomemusic.coresong import CoreSong
+from gnomemusic.grilowrappers.grltrackerplaylists import Playlist
+from gnomemusic.player import PlayerPlaylist
+from gnomemusic.widgets.songwidget import SongWidget
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.search import Search
+import gnomemusic.utils as utils
+
+
+class CoreModel(GObject.GObject):
+ """Provides all the global list models used in Music
+
+ Music is using a hierarchy of data objects with list models to
+ contain the information about the users available music. This
+ hierarchy is filled mainly through Grilo, with the exception of
+ playlists which are a Tracker only feature.
+
+ There are three main models: one for artists, one for albums and
+ one for songs. The data objects within these are CoreArtist,
+ CoreAlbum and CoreSong respectively. These models are flattened
+ list models filled by the wrappers.
+
+ The object hierarchy is as follows.
+
+ CoreArtist -> CoreAlbum -> CoreDisc -> CoreSong
+
+ Playlists are a Tracker only feature and do not use the three
+ main models directly.
+
+ GrlTrackerPlaylists -> Playlist -> CoreSong
+
+ The Player playlist is a copy of the relevant playlist, built by
+ using the components described above as needed.
+ """
+
+ __gsignals__ = {
+ "playlist-loaded": (GObject.SignalFlags.RUN_FIRST, None, (int,)),
+ "smart-playlist-change": (GObject.SignalFlags.RUN_FIRST, None, ())
+ }
+
+ songs_available = GObject.Property(type=bool, default=False)
+
+ _recent_size = 21
+
+ def __init__(self, application: Application) -> None:
+ """Initiate the CoreModel object
+
+ :param Application application: The Application instance to use
+ """
+ super().__init__()
+
+ self._application = application
+ self._flatten_model: Optional[Gtk.FlattenListModel] = None
+ self._player_signal_id = 0
+ self._current_playlist_model: Optional[Union[
+ Gtk.FlattenListModel, Gtk.SortListModel, Gio.ListModel]] = None
+ self._previous_playlist_model: Optional[Union[
+ Gtk.FlattenListModel, Gtk.SortListModel, Gio.ListModel]] = None
+
+ self._songs_model_proxy: Gio.ListStore = Gio.ListStore.new(
+ Gio.ListModel)
+ self._flatten_songs_model = Gtk.FlattenListModel.new(
+ self._songs_model_proxy)
+ self._songs_model = Gtk.SortListModel.new(self._flatten_songs_model)
+ sorter = Gtk.CustomSorter()
+ sorter.set_sort_func(self._songs_sort)
+ self._songs_model.props.incremental = True
+ self._songs_model.set_sorter(sorter)
+
+ self._albums_model_proxy: Gio.ListStore = Gio.ListStore.new(
+ Gio.ListModel)
+ self._albums_model: Gtk.FlattenListModel = Gtk.FlattenListModel.new(
+ self._albums_model_proxy)
+ self._albums_model_sort: Gtk.SortListModel = Gtk.SortListModel.new(
+ self._albums_model)
+ albums_sorter = Gtk.CustomSorter()
+ albums_sorter.set_sort_func(self._albums_sort)
+ self._albums_model_sort.set_sorter(albums_sorter)
+
+ self._artists_model_proxy: Gio.ListStore = Gio.ListStore.new(
+ Gio.ListModel)
+ self._artists_model: Gtk.FlattenListModel = Gtk.FlattenListModel.new(
+ self._artists_model_proxy)
+ self._artists_model_sort: Gtk.SortListModel = Gtk.SortListModel.new(
+ self._artists_model)
+ artists_sorter = Gtk.CustomSorter()
+ artists_sorter.set_sort_func(self._artist_sort)
+ self._artists_model_sort.set_sorter(artists_sorter)
+
+ self._playlist_model: Gio.ListStore = Gio.ListStore.new(CoreSong)
+ self._playlist_model_sort: Gtk.SortListModel = Gtk.SortListModel.new(
+ self._playlist_model)
+ self._playlist_model_recent: Gtk.SliceListModel = (
+ Gtk.SliceListModel.new(
+ self._playlist_model_sort, 0, self._recent_size))
+ self._active_core_object: Optional[Union[
+ CoreAlbum, CoreArtist, Playlist]] = None
+
+ self._songs_search_proxy: Gio.ListStore = Gio.ListStore.new(
+ Gtk.FilterListModel)
+ self._songs_search_flatten: Gtk.FlattenListModel = (
+ Gtk.FlattenListModel())
+ self._songs_search_flatten.set_model(self._songs_search_proxy)
+
+ self._albums_search_proxy: Gio.Liststore = Gio.ListStore.new(
+ Gtk.FilterListModel)
+ self._albums_search_flatten: Gtk.FlattenListModel = (
+ Gtk.FlattenListModel())
+ self._albums_search_flatten.set_model(self._albums_search_proxy)
+ self._albums_search_filter: Gtk.FilterListModel = (
+ Gtk.FilterListModel.new(Gtk.AnyFilter()))
+
+ self._artists_search_proxy: Gio.Liststore = Gio.ListStore.new(
+ Gtk.FilterListModel)
+ self._artists_search_flatten: Gtk.FlattenListModel = (
+ Gtk.FlattenListModel())
+ self._artists_search_flatten.set_model(self._artists_search_proxy)
+ self._artists_search_filter: Gtk.FilterListModel = (
+ Gtk.FilterListModel.new(Gtk.AnyFilter()))
+
+ self._playlists_model: Gio.ListStore = Gio.ListStore.new(Playlist)
+ self._playlists_model_filter: Gtk.FilterListModel = (
+ Gtk.FilterListModel.new(self._playlists_model))
+ self._playlists_model_sort: Gtk.SortListModel = Gtk.SortListModel.new(
+ self._playlists_model_filter)
+ playlists_sorter = Gtk.CustomSorter()
+ playlists_sorter.set_sort_func(self._playlists_sort)
+ self._playlists_model_sort.set_sorter(playlists_sorter)
+
+ self._user_playlists_model_filter: Gtk.FilterListModel = (
+ Gtk.FilterListModel.new(self._playlists_model))
+ self._user_playlists_model_sort: Gtk.SortListModel = (
+ Gtk.SortListModel.new(self._user_playlists_model_filter))
+ user_playlists_sorter = Gtk.CustomSorter()
+ user_playlists_sorter.set_sort_func(self._playlists_sort)
+ self._user_playlists_model_sort.set_sorter(user_playlists_sorter)
+
+ self._search: Search = application.props.search
+
+ self._songs_model.connect(
+ "items-changed", self._on_songs_items_changed)
+
+ def _on_songs_items_changed(self, model, position, removed, added):
+ available = self.props.songs_available
+ now_available = model.get_n_items() > 0
+
+ if available == now_available:
+ return
+
+ if model.get_n_items() > 0:
+ self.props.songs_available = True
+ else:
+ self.props.songs_available = False
+
+ def _songs_sort(
+ self, song_a: CoreSong, song_b: CoreSong, data: Any = None) -> int:
+ title_a = song_a.props.title
+ title_b = song_b.props.title
+ song_cmp = (utils.normalize_caseless(title_a)
+ == utils.normalize_caseless(title_b))
+ if not song_cmp:
+ return utils.natural_sort_names(title_a, title_b)
+
+ artist_a = song_a.props.artist
+ artist_b = song_b.props.artist
+ artist_cmp = (utils.normalize_caseless(artist_a)
+ == utils.normalize_caseless(artist_b))
+ if not artist_cmp:
+ return utils.natural_sort_names(artist_a, artist_b)
+
+ return utils.natural_sort_names(song_a.props.album, song_b.props.album)
+
+ def _albums_sort(self, album_a, album_b, data=None):
+ return utils.natural_sort_names(
+ album_a.props.title, album_b.props.title)
+
+ def _artist_sort(self, artist_a, artist_b, data=None):
+ return utils.natural_sort_names(
+ artist_a.props.artist, artist_b.props.artist)
+
+ def _playlists_sort(self, playlist_a, playlist_b, data=None):
+ if playlist_a.props.is_smart:
+ if not playlist_b.props.is_smart:
+ return Gtk.Ordering.SMALLER
+ return utils.natural_sort_names(
+ playlist_a.props.title, playlist_b.props.title)
+
+ if playlist_b.props.is_smart:
+ return Gtk.Ordering.LARGER
+
+ date_compare = GLib.DateTime.compare(
+ playlist_b.props.creation_date, playlist_a.props.creation_date)
+ if date_compare == -1:
+ return Gtk.Ordering.SMALLER
+ elif date_compare == 1:
+ return Gtk.Ordering.LARGER
+ else:
+ return Gtk.Ordering.EQUAL
+
+ def _set_player_model(self, playlist_type, model):
+ """Set the model for PlayerPlaylist to use
+
+ This fills playlist model based on the playlist type and model
+ given. This builds a separate model to stay alive and play
+ while the user navigates other views.
+
+ :param PlaylistType playlist_type: The type of the playlist
+ :param Gio.ListStore model: The base model for the player model
+ """
+ if model is self._previous_playlist_model:
+ for song in self._playlist_model:
+ if song.props.state == SongWidget.State.PLAYING:
+ song.props.state = SongWidget.State.PLAYED
+
+ self.emit("playlist-loaded", playlist_type)
+ return
+
+ def _bind_song_properties(model_song, player_song):
+ model_song.bind_property(
+ "state", player_song, "state",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+
+ def _on_items_changed(model, position, removed, added):
+ songs_list = []
+ if added > 0:
+ for i in list(range(added)):
+ coresong = model[position + i]
+ song = CoreSong(self._application, coresong.props.media)
+ _bind_song_properties(coresong, song)
+ songs_list.append(song)
+
+ self._playlist_model.splice(position, removed, songs_list)
+
+ played_states = [SongWidget.State.PLAYING, SongWidget.State.PLAYED]
+ for song in self._playlist_model:
+ if song.props.state in played_states:
+ song.props.state = SongWidget.State.UNPLAYED
+
+ if self._player_signal_id != 0:
+ self._current_playlist_model.disconnect(self._player_signal_id)
+ self._player_signal_id = 0
+ self._current_playlist_model = None
+
+ songs_added = []
+
+ if playlist_type == PlayerPlaylist.Type.ALBUM:
+ proxy_model = Gio.ListStore.new(Gio.ListModel)
+
+ for disc in model:
+ proxy_model.append(disc.props.model)
+
+ self._flatten_model = Gtk.FlattenListModel.new(proxy_model)
+ self._current_playlist_model = self._flatten_model
+
+ for model_song in self._flatten_model:
+ song = CoreSong(self._application, model_song.props.media)
+ _bind_song_properties(model_song, song)
+ songs_added.append(song)
+
+ elif playlist_type == PlayerPlaylist.Type.ARTIST:
+ proxy_model = Gio.ListStore.new(Gio.ListModel)
+
+ for artist_album in model:
+ for disc in artist_album.model:
+ proxy_model.append(disc.props.model)
+
+ self._flatten_model = Gtk.FlattenListModel.new(proxy_model)
+ self._current_playlist_model = self._flatten_model
+
+ for model_song in self._flatten_model:
+ song = CoreSong(self._application, model_song.props.media)
+ _bind_song_properties(model_song, song)
+ songs_added.append(song)
+
+ elif playlist_type == PlayerPlaylist.Type.SONGS:
+ self._current_playlist_model = self._songs_model
+
+ for song in self._songs_model:
+ songs_added.append(song)
+
+ if song.props.state == SongWidget.State.PLAYING:
+ song.props.state = SongWidget.State.PLAYED
+
+ elif playlist_type == PlayerPlaylist.Type.SEARCH_RESULT:
+ self._current_playlist_model = self._songs_search_flatten
+
+ for song in self._songs_search_flatten:
+ songs_added.append(song)
+
+ elif playlist_type == PlayerPlaylist.Type.PLAYLIST:
+ self._current_playlist_model = model
+
+ for model_song in model:
+ song = CoreSong(self._application, model_song.props.media)
+ _bind_song_properties(model_song, song)
+ songs_added.append(song)
+
+ self._playlist_model.splice(
+ 0, self._playlist_model.get_n_items(), songs_added)
+
+ if self._current_playlist_model is not None:
+ self._player_signal_id = self._current_playlist_model.connect(
+ "items-changed", _on_items_changed)
+ self._previous_playlist_model = model
+
+ self.emit("playlist-loaded", playlist_type)
+
+ @GObject.Property(default=None)
+ def active_core_object(self):
+ """Get the current playing core object
+ (album, artist, playlist, search result or song).
+
+ :returns: current media
+ :rtype: CoreObject
+ """
+ return self._active_core_object
+
+ @active_core_object.setter # type: ignore
+ def active_core_object(self, value):
+ """Set the current playing core object
+ (album, artist, playlist, search result or song).
+
+ :param CoreObject value: new core object to play
+ """
+ self._active_core_object = value
+ if isinstance(value, CoreAlbum):
+ playlist_type = PlayerPlaylist.Type.ALBUM
+ model = value.props.model
+ elif isinstance(value, CoreArtist):
+ playlist_type = PlayerPlaylist.Type.ARTIST
+ model = value.props.model
+ elif isinstance(value, Playlist):
+ playlist_type = PlayerPlaylist.Type.PLAYLIST
+ model = value.props.model
+ # If the search is active, it means that the search view is visible,
+ # so the player playlist is a list of songs from the search result.
+ # Otherwise, it's a list of songs from the songs view.
+ elif self._search.props.search_mode_active:
+ playlist_type = PlayerPlaylist.Type.SEARCH_RESULT
+ model = self._songs_search_flatten
+ else:
+ playlist_type = PlayerPlaylist.Type.SONGS
+ model = self._songs_model
+
+ self._set_player_model(playlist_type, model)
+
+ @GObject.Property(
+ type=Gio.ListStore, default=None, flags=GObject.ParamFlags.READABLE)
+ def songs(self):
+ return self._songs_model
+
+ @GObject.Property(
+ type=Gtk.FlattenListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def songs_proxy(self):
+ return self._songs_model_proxy
+
+ @GObject.Property(
+ type=Gio.ListStore, default=None, flags=GObject.ParamFlags.READABLE)
+ def albums(self):
+ return self._albums_model
+
+ @GObject.Property(
+ type=Gtk.FlattenListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def albums_proxy(self):
+ return self._albums_model_proxy
+
+ @GObject.Property(
+ type=Gio.ListStore, default=None, flags=GObject.ParamFlags.READABLE)
+ def artists(self):
+ return self._artists_model
+
+ @GObject.Property(
+ type=Gtk.FlattenListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def artists_proxy(self):
+ return self._artists_model_proxy
+
+ @GObject.Property(
+ type=Gio.ListStore, default=None, flags=GObject.ParamFlags.READABLE)
+ def playlist(self):
+ return self._playlist_model
+
+ @GObject.Property(
+ type=Gtk.SortListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def albums_sort(self):
+ return self._albums_model_sort
+
+ @GObject.Property(
+ type=Gtk.SortListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def artists_sort(self):
+ return self._artists_model_sort
+
+ @GObject.Property(
+ type=Gtk.SortListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def playlist_sort(self):
+ return self._playlist_model_sort
+
+ @GObject.Property(
+ type=Gtk.SliceListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def recent_playlist(self):
+ return self._playlist_model_recent
+
+ @GObject.Property(
+ type=int, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def recent_playlist_size(self):
+ return self._recent_size // 2
+
+ @GObject.Property(
+ type=Gtk.FilterListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def songs_search(self):
+ return self._songs_search_flatten
+
+ @GObject.Property(
+ type=Gio.ListStore, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def songs_search_proxy(self):
+ return self._songs_search_proxy
+
+ @GObject.Property(
+ type=Gtk.FlattenListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def albums_search(self) -> Gtk.FlattenListModel:
+ return self._albums_search_flatten
+
+ @GObject.Property(
+ type=Gtk.FilterListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def albums_search_filter(self):
+ return self._albums_search_filter
+
+ @GObject.Property(
+ type=Gio.ListStore, default=None, flags=GObject.ParamFlags.READABLE)
+ def albums_search_proxy(self) -> Gio.ListStore:
+ return self._albums_search_proxy
+
+ @GObject.Property(
+ type=Gtk.FlattenListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def artists_search(self) -> Gtk.FlattenListModel:
+ return self._artists_search_flatten
+
+ @GObject.Property(
+ type=Gtk.FilterListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def artists_search_filter(self):
+ return self._artists_search_filter
+
+ @GObject.Property(
+ type=Gio.ListStore, default=None, flags=GObject.ParamFlags.READABLE)
+ def artists_search_proxy(self) -> Gio.ListStore:
+ return self._artists_search_proxy
+
+ @GObject.Property(
+ type=Gio.ListStore, default=None, flags=GObject.ParamFlags.READABLE)
+ def playlists(self):
+ return self._playlists_model
+
+ @GObject.Property(
+ type=Gtk.SortListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def playlists_sort(self):
+ return self._playlists_model_sort
+
+ @GObject.Property(
+ type=Gtk.SortListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def playlists_filter(self):
+ return self._playlists_model_filter
+
+ @GObject.Property(
+ type=Gtk.SortListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def user_playlists_sort(self):
+ return self._user_playlists_model_sort
+
+ @GObject.Property(
+ type=Gtk.SortListModel, default=None,
+ flags=GObject.ParamFlags.READABLE)
+ def user_playlists_filter(self):
+ return self._user_playlists_model_filter
diff --git a/gnomemusic/coreselection.py b/gnomemusic/coreselection.py
new file mode 100644
index 00000000..de3b1077
--- /dev/null
+++ b/gnomemusic/coreselection.py
@@ -0,0 +1,50 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import GObject
+
+
+class CoreSelection(GObject.GObject):
+
+ selected_songs_count = GObject.Property(type=int, default=0)
+
+ def __init__(self):
+ super().__init__()
+
+ self._selected_songs = []
+
+ def update_selection(self, coresong, value):
+ if coresong.props.selected:
+ self.props.selected_songs.append(coresong)
+ else:
+ try:
+ self.props.selected_songs.remove(coresong)
+ except ValueError:
+ pass
+
+ self.props.selected_songs_count = len(self.props.selected_songs)
+
+ @GObject.Property
+ def selected_songs(self):
+ return self._selected_songs
diff --git a/gnomemusic/coresong.py b/gnomemusic/coresong.py
new file mode 100644
index 00000000..585f28e8
--- /dev/null
+++ b/gnomemusic/coresong.py
@@ -0,0 +1,189 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from enum import IntEnum
+from random import randint
+from typing import Optional
+import typing
+
+import gi
+gi.require_version('Grl', '0.3')
+from gi.repository import Grl, GLib, GObject
+
+from gnomemusic.songart import SongArt
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.coregrilo import CoreGrilo
+ from gnomemusic.coreselection import CoreSelection
+import gnomemusic.utils as utils
+
+
+class CoreSong(GObject.GObject):
+ """Exposes a Grl.Media with relevant data as properties
+ """
+
+ __gtype_name__ = "CoreSong"
+
+ album = GObject.Property(type=str)
+ album_disc_number = GObject.Property(type=int)
+ artist = GObject.Property(type=str)
+ duration = GObject.Property(type=int)
+ media = GObject.Property(type=Grl.Media)
+ grlid = GObject.Property(type=str, default=None)
+ play_count = GObject.Property(type=int)
+ shuffle_pos = GObject.Property(type=int)
+ state = GObject.Property() # FIXME: How to set an IntEnum type?
+ title = GObject.Property(type=str)
+ track_number = GObject.Property(type=int)
+ url = GObject.Property(type=str)
+ validation = GObject.Property() # FIXME: How to set an IntEnum type?
+
+ class Validation(IntEnum):
+ """Enum for song validation"""
+ PENDING: int = 0
+ IN_PROGRESS: int = 1
+ FAILED: int = 2
+ SUCCEEDED: int = 3
+
+ def __init__(self, application: Application, media: Grl.Media) -> None:
+ """Initiate the CoreSong object
+
+ :param Application application: The application object
+ :param Grl.Media media: A media object
+ """
+ super().__init__()
+
+ self._application: Application = application
+ self._coregrilo: CoreGrilo = application.props.coregrilo
+ self._coreselection: CoreSelection = application.props.coreselection
+ self._favorite: bool = False
+ self._selected: bool = False
+ self._thumbnail: Optional[str] = None
+
+ self.props.grlid = media.get_source() + media.get_id()
+ self._is_tracker: bool = media.get_source() == "grl-tracker3-source"
+ self.props.validation = CoreSong.Validation.PENDING
+ self.update(media)
+ self.update_shuffle_pos()
+
+ def __eq__(self, other: object) -> bool:
+ return (isinstance(other, CoreSong)
+ and other.props.media.get_id() == self.props.media.get_id())
+
+ @GObject.Property(
+ type=bool, default=False, flags=GObject.ParamFlags.READABLE)
+ def is_tracker(self) -> bool:
+ return self._is_tracker
+
+ @GObject.Property(type=bool, default=False)
+ def favorite(self) -> bool:
+ return self._favorite
+
+ @favorite.setter # type: ignore
+ def favorite(self, favorite: bool) -> None:
+ if not self._is_tracker:
+ return
+
+ self._favorite = favorite
+
+ # FIXME: Circular trigger, can probably be solved more neatly.
+ old_fav: bool = self.props.media.get_favourite()
+ if old_fav == self._favorite:
+ return
+
+ self.props.media.set_favourite(self._favorite)
+ self._coregrilo.writeback_tracker(
+ self.props.media, "favorite")
+
+ @GObject.Property(type=bool, default=False)
+ def selected(self) -> bool:
+ return self._selected
+
+ @selected.setter # type: ignore
+ def selected(self, value: bool) -> None:
+ if not self._is_tracker:
+ return
+
+ if self._selected == value:
+ return
+
+ self._selected = value
+ self._coreselection.update_selection(self, self._selected)
+
+ @GObject.Property(type=str, default=None)
+ def thumbnail(self) -> str:
+ """Song art thumbnail retrieval
+
+ :return: The song art uri or "generic"
+ :rtype: string
+ """
+ if self._thumbnail is None:
+ self._thumbnail = "generic"
+ SongArt(self._application, self)
+
+ return self._thumbnail
+
+ @thumbnail.setter # type: ignore
+ def thumbnail(self, value: str) -> None:
+ """Song art thumbnail setter
+
+ :param string value: uri or "generic"
+ """
+ self._thumbnail = value
+
+ if self._thumbnail != "generic":
+ self.props.media.set_thumbnail(self._thumbnail)
+
+ def update(self, media: Grl.Media) -> None:
+ self.props.media = media
+ self.props.album = utils.get_album_title(media)
+ self.props.album_disc_number = media.get_album_disc_number()
+ self.props.artist = utils.get_artist_name(media)
+ self.props.duration = media.get_duration()
+ self.props.favorite = media.get_favourite()
+ self.props.play_count = media.get_play_count()
+ self.props.title = utils.get_media_title(media)
+ self.props.track_number = media.get_track_number()
+ self.props.url = media.get_url()
+
+ def bump_play_count(self) -> None:
+ if not self._is_tracker:
+ return
+
+ self.props.media.set_play_count(self.props.play_count + 1)
+ self._coregrilo.writeback_tracker(
+ self.props.media, "play-count")
+
+ def set_last_played(self) -> None:
+ if not self._is_tracker:
+ return
+
+ self.props.media.set_last_played(GLib.DateTime.new_now_utc())
+ self._coregrilo.writeback_tracker(
+ self.props.media, "last-played")
+
+ def update_shuffle_pos(self) -> None:
+ """Randomizes the shuffle position of this song"""
+ self.props.shuffle_pos = randint(1, 1_000_000)
diff --git a/gnomemusic/coverpaintable.py b/gnomemusic/coverpaintable.py
new file mode 100644
index 00000000..3a2d1238
--- /dev/null
+++ b/gnomemusic/coverpaintable.py
@@ -0,0 +1,215 @@
+# Copyright 2022 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from typing import Optional, Union
+import typing
+
+import gi
+gi.require_versions({"Gdk": "4.0", "Gtk": "4.0", "Gsk": "4.0"})
+from gi.repository import Adw, Gsk, Gtk, GObject, Graphene, Gdk
+
+from gnomemusic.texturecache import TextureCache
+from gnomemusic.utils import ArtSize, DefaultIconType
+if typing.TYPE_CHECKING:
+ from gnomemusic.corealbum import CoreAlbum
+ from gnomemusic.coreartist import CoreArtist
+ from gnomemusic.coresong import CoreSong
+
+if typing.TYPE_CHECKING:
+ CoreObject = Union[CoreAlbum, CoreArtist, CoreSong]
+
+
+class CoverPaintable(GObject.GObject, Gdk.Paintable):
+ """An album/artist cover or placeholder
+
+ Provides the full looks. Rounded corners for albums and round for
+ artists.
+ """
+
+ __gtype_name__ = "CoverPaintable"
+
+ def __init__(
+ self, widget: Gtk.Widget, art_size: ArtSize,
+ icon_type: DefaultIconType) -> None:
+ """Initiliaze CoverPaintable
+
+ :param Gtk.Widget widget: Widget using the cover
+ :param ArtSize art_size: Size of the cover
+ :param DefaultIconType icon_type: Type of cover
+ """
+ super().__init__()
+
+ self._art_size = art_size
+ self._coreobject: Optional[CoreObject] = None
+ self._icon_theme = Gtk.IconTheme.new().get_for_display(
+ widget.get_display())
+ self._icon_type = icon_type
+ self._style_manager = Adw.StyleManager.get_default()
+ self._texture = None
+ self._texture_cache = TextureCache()
+ self._thumbnail_id = 0
+ self._widget = widget
+
+ self._style_manager.connect("notify::dark", self._on_dark_changed)
+
+ def do_snapshot(self, snapshot: Gtk.Snapshot, w: int, h: int) -> None:
+ if self._icon_type == DefaultIconType.ARTIST:
+ radius = 90.0
+ elif self._art_size == ArtSize.SMALL:
+ radius = 4.5
+ else:
+ radius = 9.0
+
+ w_s = w
+ h_s = h
+ if self._texture is not None:
+ ratio = self._texture.get_height() / self._texture.get_width()
+ # Scale down the image according to the biggest axis
+ if ratio > 1:
+ w = int(w / ratio)
+ else:
+ h = int(h * ratio)
+
+ rect = Graphene.Rect().init((w_s - w) / 2, (h_s - h) / 2, w, h)
+ rounded_rect = Gsk.RoundedRect()
+ rounded_rect.init_from_rect(rect, radius)
+ snapshot.push_rounded_clip(rounded_rect)
+
+ if self._texture is not None:
+ snapshot.append_texture(self._texture, rect)
+ else:
+ i_s = 1 / 3 # Icon scale
+ icon_pt = self._icon_theme.lookup_icon(
+ self._icon_type.value, None, w * i_s,
+ self._widget.props.scale_factor, 0, 0)
+
+ bg_color = Gdk.RGBA()
+ bg_color.parse("rgba(95%, 95%, 95%, 1)")
+ if self._style_manager.props.dark:
+ bg_color.parse("rgba(30%, 30%, 30%, 1)")
+
+ snapshot.append_color(bg_color, Graphene.Rect().init(0, 0, w, h))
+ snapshot.translate(
+ Graphene.Point().init(
+ (w / 2) - (w * (i_s / 2)), (h / 2) - (h * (i_s / 2))))
+ snapshot.push_opacity(0.7)
+ icon_pt.snapshot(snapshot, w * i_s, h * i_s)
+ snapshot.pop()
+
+ snapshot.pop()
+
+ def _on_dark_changed(
+ self, style_manager: Adw.StyleManager,
+ pspec: GObject.ParamSpecBoolean) -> None:
+ if self._texture is not None:
+ return
+
+ self.invalidate_contents()
+
+ @GObject.Property(type=object, default=None)
+ def coreobject(self) -> Optional[CoreObject]:
+ """Get the current core object in use
+
+ :returns: The corrent coreobject
+ :rtype: Union[CoreAlbum, CoreArtist, CoreSong] or None
+ """
+ return self._coreobject
+
+ @coreobject.setter # type: ignore
+ def coreobject(self, coreobject: CoreObject) -> None:
+ """Update the coreobject used for CoverPaintable
+
+ :param Union[CoreAlbum, CoreArtist, CoreSong] coreobject:
+ The coreobject to set
+ """
+ if coreobject is self._coreobject:
+ return
+
+ self._texture_cache.clear_pending_lookup_callback()
+
+ if self._texture:
+ self._texture = None
+ self.invalidate_contents()
+
+ if self._thumbnail_id != 0:
+ self._coreobject.disconnect(self._thumbnail_id)
+ self._thumbnail_id = 0
+
+ self._coreobject = coreobject
+ self._thumbnail_id = self._coreobject.connect(
+ "notify::thumbnail", self._on_thumbnail_changed)
+
+ if self._coreobject.props.thumbnail is not None:
+ self._on_thumbnail_changed(self._coreobject, None)
+
+ def _on_thumbnail_changed(
+ self, coreobject: CoreObject,
+ uri: GObject.ParamSpecString) -> None:
+ thumbnail_uri = coreobject.props.thumbnail
+
+ if thumbnail_uri == "generic":
+ self._texture = None
+ self.invalidate_contents()
+ return
+
+ self._texture_cache.connect("texture", self._on_texture_cache)
+ self._texture_cache.lookup(thumbnail_uri)
+
+ def _on_texture_cache(
+ self, texture_cache: TextureCache, texture: Gdk.Texture) -> None:
+ if texture == self._texture:
+ return
+
+ self._texture = texture
+ self.invalidate_contents()
+
+ @GObject.Property(type=object, flags=GObject.ParamFlags.READWRITE)
+ def icon_type(self) -> DefaultIconType:
+ """Icon type of the cover
+
+ :returns: The type of the default icon
+ :rtype: DefaultIconType
+ """
+ return self._icon_type
+
+ @icon_type.setter # type: ignore
+ def icon_type(self, value: DefaultIconType) -> None:
+ """Set the cover icon type
+
+ :param DefaultIconType value: The default icon type for the
+ cover
+ """
+ self._icon_type = value
+
+ self.invalidate_contents()
+
+ def do_get_flags(self) -> Gdk.PaintableFlags:
+ return Gdk.PaintableFlags.SIZE
+
+ def do_get_intrinsic_height(self) -> int:
+ return self._art_size.height
+
+ def do_get_intrinsic_width(self) -> int:
+ return self._art_size.width
diff --git a/gnomemusic/embeddedart.py b/gnomemusic/embeddedart.py
new file mode 100644
index 00000000..ec3e7932
--- /dev/null
+++ b/gnomemusic/embeddedart.py
@@ -0,0 +1,230 @@
+# Copyright 2020 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import gi
+gi.require_versions({"GstPbutils": "1.0", "GstTag": "1.0", "MediaArt": "2.0"})
+from gi.repository import (
+ GLib, GObject, MediaArt, GdkPixbuf, Gio, Gst, GstTag, GstPbutils)
+
+from gnomemusic.musiclogger import MusicLogger
+
+
+class EmbeddedArt(GObject.GObject):
+ """Lookup local art
+
+ 1. Embedded art using GStreamer
+ 2. Available in the directory using MediaArt
+ """
+
+ _log = MusicLogger()
+
+ __gsignals__ = {
+ "art-found": (GObject.SignalFlags.RUN_FIRST, None, (bool, ))
+ }
+
+ def __init__(self):
+ """Initialize EmbeddedArt
+ """
+ super().__init__()
+
+ try:
+ Gst.init(None)
+ GstPbutils.pb_utils_init()
+ except GLib.Error as error:
+ self._log.warning(
+ "Error: {}, {}".format(error.domain, error.message))
+ return
+
+ self._media_art = MediaArt.Process.new()
+
+ self._album = None
+ self._artist = None
+ self._coreobject = None
+ self._file = None
+
+ def query(self, coreobject, title):
+ """Start the local query
+
+ :param coreobject: The CoreAlbum or CoreSong to search art for
+ :param str title: The album title for the CoreAlbum or CoreSong
+ """
+ self._album = title
+ self._artist = coreobject.props.artist
+ self._coreobject = coreobject
+
+ try:
+ if coreobject.props.url is None:
+ self.emit("art-found", False)
+ return
+ except AttributeError:
+ self.emit("art-found", False)
+ return
+
+ try:
+ discoverer = GstPbutils.Discoverer.new(Gst.SECOND)
+ except GLib.Error as error:
+ self._log.warning(
+ "Error: {}, {}".format(error.domain, error.message))
+ self._lookup_cover_in_directory()
+ return
+
+ discoverer.connect("discovered", self._discovered)
+ discoverer.start()
+
+ success, file = MediaArt.get_file(self._artist, self._album, "album")
+
+ if not success:
+ self.emit("art-found", False)
+ discoverer.stop()
+ return
+
+ self._file = file
+
+ success = discoverer.discover_uri_async(self._coreobject.props.url)
+
+ if not success:
+ self._log.warning("Could not add url to discoverer.")
+ self.emit("art-found", False)
+ discoverer.stop()
+ return
+
+ def _discovered(self, discoverer, info, error):
+ tags = info.get_tags()
+ index = 0
+
+ if (error is not None
+ or tags is None):
+ if error:
+ self._log.warning("Discoverer error: {}, {}".format(
+ Gst.CoreError(error.code), error.message))
+ discoverer.stop()
+ self.emit("art-found", False)
+ return
+
+ while True:
+ success, sample = tags.get_sample_index(Gst.TAG_IMAGE, index)
+ if not success:
+ break
+ index += 1
+ struct = sample.get_info()
+ if struct is None:
+ break
+ success, image_type = struct.get_enum(
+ "image-type", GstTag.TagImageType)
+ if not success:
+ continue
+ if image_type not in [
+ GstTag.TagImageType.UNDEFINED,
+ GstTag.TagImageType.FRONT_COVER]:
+ continue
+
+ buf = sample.get_buffer()
+ success, map_info = buf.map(Gst.MapFlags.READ)
+ if not success:
+ continue
+
+ istream = Gio.MemoryInputStream.new_from_data(map_info.data)
+ GdkPixbuf.Pixbuf.new_from_stream_async(
+ istream, None, self._pixbuf_from_stream_finished)
+ discoverer.stop()
+ return
+
+ discoverer.stop()
+ self._lookup_cover_in_directory()
+
+ def _pixbuf_from_stream_finished(
+ self, stream: Gio.MemoryInputStream,
+ result: Gio.AsyncResult) -> None:
+ try:
+ pixbuf = GdkPixbuf.Pixbuf.new_from_stream_finish(result)
+ except GLib.Error as error:
+ self._log.warning(f"Error: {error.domain}, {error.message}")
+ self._lookup_cover_in_directory()
+ else:
+ self._file.create_async(
+ Gio.FileCreateFlags.NONE, GLib.PRIORITY_DEFAULT_IDLE, None,
+ self._output_stream_created, pixbuf)
+ finally:
+ stream.close_async(
+ GLib.PRIORITY_DEFAULT_IDLE, None, self._stream_closed)
+
+ def _output_stream_created(
+ self, stream: Gio.FileOutputStream, result: Gio.AsyncResult,
+ pixbuf: GdkPixbuf.Pixbuf) -> None:
+ try:
+ output_stream = stream.create_finish(result)
+ except GLib.Error as error:
+ # File already exists.
+ self._log.info(f"Error: {error.domain}, {error.message}")
+ self.emit("art-found", True)
+ else:
+ pixbuf.save_to_streamv_async(
+ output_stream, "jpeg", None, None, None,
+ self._output_stream_saved, output_stream)
+
+ def _output_stream_saved(
+ self, pixbuf: GdkPixbuf.Pixbuf, result: Gio.AsyncResult,
+ output_stream: Gio.FileOutputStream) -> None:
+ try:
+ pixbuf.save_to_stream_finish(result)
+ except GLib.Error as error:
+ self._log.warning(f"Error: {error.domain}, {error.message}")
+ self._lookup_cover_in_directory()
+ else:
+ self.emit("art-found", True)
+ finally:
+ output_stream.close_async(
+ GLib.PRIORITY_DEFAULT_IDLE, None, self._stream_closed)
+
+ def _stream_closed(
+ self, stream: Gio.OutputStream, result: Gio.AsyncResult) -> None:
+ try:
+ stream.close_finish(result)
+ except GLib.Error as error:
+ self._log.warning(f"Error: {error.domain}, {error.message}")
+
+ def _lookup_cover_in_directory(self):
+ # Find local art in cover.jpeg files.
+ self._media_art.uri_async(
+ MediaArt.Type.ALBUM, MediaArt.ProcessFlags.NONE,
+ self._coreobject.props.url, self._artist, self._album,
+ GLib.PRIORITY_DEFAULT_IDLE, None, self._uri_async_cb, None)
+
+ def _uri_async_cb(self, src, result, data):
+ try:
+ success = self._media_art.uri_finish(result)
+ if success:
+ self.emit("art-found", True)
+ return
+ except GLib.Error as error:
+ if MediaArt.Error(error.code) == MediaArt.Error.SYMLINK_FAILED:
+ # This error indicates that the coverart has already
+ # been linked by another concurrent lookup.
+ self.emit("art-found", True)
+ return
+ else:
+ self._log.warning("Error: {}, {}".format(
+ MediaArt.Error(error.code), error.message))
+
+ self.emit("art-found", False)
diff --git a/gnomemusic/fileexistsasync.py b/gnomemusic/fileexistsasync.py
new file mode 100644
index 00000000..3433f160
--- /dev/null
+++ b/gnomemusic/fileexistsasync.py
@@ -0,0 +1,62 @@
+# Copyright 2021 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import GLib, GObject, Gio
+
+
+class FileExistsAsync(GObject.GObject):
+ """Gio.File.file_exists async variant
+ """
+
+ __gtype_name__ = "FileExistsAsync"
+
+ __gsignals__ = {
+ "finished": (GObject.SignalFlags.RUN_FIRST, None, (bool, ))
+ }
+
+ def __init__(self) -> None:
+ """Initialize FileExistsAsync
+ """
+ super().__init__()
+
+ def start(self, thumb_file: Gio.File) -> None:
+ """Start async file_exists lookup
+
+ :param Gio.File thumb_file: File to check
+ """
+ thumb_file.query_info_async(
+ Gio.FILE_ATTRIBUTE_STANDARD_TYPE, Gio.FileQueryInfoFlags.NONE,
+ GLib.PRIORITY_DEFAULT_IDLE, None, self._on_query_info_finished)
+
+ def _on_query_info_finished(
+ self, thumb_file: Gio.File, res: Gio.AsyncResult) -> None:
+ exists = True
+ try:
+ thumb_file.query_info_finish(res)
+ except GLib.Error:
+ # This indicates that the file has not been created, so
+ # there is no art in the MediaArt cache.
+ exists = False
+
+ self.emit("finished", exists)
diff --git a/gnomemusic/griloartqueue.py b/gnomemusic/griloartqueue.py
new file mode 100644
index 00000000..71c4d48d
--- /dev/null
+++ b/gnomemusic/griloartqueue.py
@@ -0,0 +1,104 @@
+# Copyright 2022 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from typing import Dict, List, Union
+import typing
+
+from gi.repository import GLib, GObject
+
+from gnomemusic.storeart import StoreArt
+from gnomemusic.utils import CoreObjectType
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.corealbum import CoreAlbum
+ from gnomemusic.coreartist import CoreArtist
+ from gnomemusic.coresong import CoreSong
+ CoreObject = Union[CoreAlbum, CoreArtist, CoreSong]
+
+
+class GriloArtQueue(GObject.GObject):
+ """Queue for Grilo art lookup
+
+ Grilo remote art lookup is quite taxing when done in parallel. This
+ class runs the lookup queries serialized.
+ """
+
+ __gtype_name__ = "GriloArtQueue"
+
+ _queue: Dict[CoreObject, CoreObjectType] = {}
+ _active_queue: List[CoreObject] = []
+
+ def __init__(self, application: Application) -> None:
+ """Initialize GriloArtQueue
+
+ :param Application application: The application instance
+ """
+ super().__init__()
+
+ self._coregrilo = application.props.coregrilo
+
+ self._timeout_id = 0
+
+ def queue(
+ self, coreobject: CoreObject,
+ coreobjecttype: CoreObjectType) -> None:
+ """Queue Grilo art lookup for the coreobject
+
+ :param coreobject: Core object to retrieve art for
+ :param CoreObjectType coreobjecttype: The CoreObjectType
+ """
+ if coreobject not in [self._queue.keys(), self._active_queue]:
+ self._queue[coreobject] = coreobjecttype
+
+ if self._timeout_id == 0:
+ self._timeout_id = GLib.timeout_add(100, self._dispatch)
+
+ def _dispatch(self) -> bool:
+ if len(self._queue) == 0:
+ self._timeout_id = 0
+ return GLib.SOURCE_REMOVE
+
+ if len(self._active_queue) > 0:
+ return GLib.SOURCE_CONTINUE
+
+ coreobject, coreobjecttype = self._queue.popitem()
+
+ storeart = StoreArt()
+ storeart.connect("finished", self._on_async_finished, coreobject)
+ if coreobjecttype == CoreObjectType.ARTIST:
+ self._coregrilo.get_artist_art(coreobject, storeart)
+ elif coreobjecttype == CoreObjectType.ALBUM:
+ self._coregrilo.get_album_art(coreobject, storeart)
+ elif coreobjecttype == CoreObjectType.SONG:
+ self._coregrilo.get_song_art(coreobject, storeart)
+
+ self._active_queue.append(coreobject)
+
+ return GLib.SOURCE_CONTINUE
+
+ def _on_async_finished(
+ self, storeart: StoreArt, coreobject: CoreObject) -> None:
+ if coreobject in self._active_queue:
+ self._active_queue.remove(coreobject)
diff --git a/gnomemusic/grilowrappers/__init__.py b/gnomemusic/grilowrappers/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/gnomemusic/grilowrappers/__init__.py
diff --git a/gnomemusic/grilowrappers/grlsearchwrapper.py b/gnomemusic/grilowrappers/grlsearchwrapper.py
new file mode 100644
index 00000000..9db9149e
--- /dev/null
+++ b/gnomemusic/grilowrappers/grlsearchwrapper.py
@@ -0,0 +1,111 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import gi
+gi.require_versions({"Grl": "0.3"})
+from gi.repository import Gio, Grl, Gtk, GObject
+
+from gnomemusic.coresong import CoreSong
+
+
+class GrlSearchWrapper(GObject.GObject):
+ """Wrapper for a generic Grilo source search.
+
+ Grilo has -besides source specific queries- an option to do a
+ generic source search, if the source supports it. This class wraps
+ such a search.
+ """
+
+ METADATA_KEYS = [
+ Grl.METADATA_KEY_ALBUM,
+ Grl.METADATA_KEY_ALBUM_ARTIST,
+ Grl.METADATA_KEY_ALBUM_DISC_NUMBER,
+ Grl.METADATA_KEY_ARTIST,
+ Grl.METADATA_KEY_COMPOSER,
+ Grl.METADATA_KEY_DURATION,
+ Grl.METADATA_KEY_FAVOURITE,
+ Grl.METADATA_KEY_ID,
+ Grl.METADATA_KEY_PLAY_COUNT,
+ Grl.METADATA_KEY_PUBLICATION_DATE,
+ Grl.METADATA_KEY_THUMBNAIL,
+ Grl.METADATA_KEY_TITLE,
+ Grl.METADATA_KEY_TRACK_NUMBER,
+ Grl.METADATA_KEY_URL
+ ]
+
+ def __init__(self, source, application):
+ """Initialize a search wrapper
+
+ Initialize a generic Grilo source search wrapper.
+
+ :param Grl.Source source: The Grilo source to wrap
+ :param Application application: Application instance
+ """
+ super().__init__()
+
+ self._application = application
+ self._coreselection = application.props.coreselection
+ self._log = application.props.log
+ self._source = source
+
+ coremodel = application.props.coremodel
+ self._song_search_proxy = coremodel.props.songs_search_proxy
+
+ self._song_search_store = Gio.ListStore.new(CoreSong)
+ # FIXME: Workaround for adding the right list type to the proxy
+ # list model.
+ self._song_search_model = Gtk.FilterListModel.new(
+ self._song_search_store)
+ self._song_search_model.set_filter(Gtk.AnyFilter())
+ self._song_search_proxy.append(self._song_search_model)
+
+ self._fast_options = Grl.OperationOptions()
+ self._fast_options.set_count(25)
+ self._fast_options.set_resolution_flags(
+ Grl.ResolutionFlags.FAST_ONLY | Grl.ResolutionFlags.IDLE_RELAY)
+
+ def search(self, text):
+ """Initiate a search
+
+ :param str text: The text to search
+ """
+ with self._song_search_store.freeze_notify():
+ self._song_search_store.remove_all()
+
+ def _search_result_cb(source, op_id, media, remaining, error):
+ if error:
+ self._log.warning("Error: {}".format(error))
+ return
+
+ if not media:
+ return
+
+ coresong = CoreSong(self._application, media)
+ coresong.props.title = (
+ coresong.props.title + " (" + source.props.source_name + ")")
+
+ self._song_search_store.append(coresong)
+
+ self._source.search(
+ text, self.METADATA_KEYS, self._fast_options, _search_result_cb)
diff --git a/gnomemusic/grilowrappers/grltrackerplaylists.py b/gnomemusic/grilowrappers/grltrackerplaylists.py
new file mode 100644
index 00000000..4d80aa49
--- /dev/null
+++ b/gnomemusic/grilowrappers/grltrackerplaylists.py
@@ -0,0 +1,1168 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import time
+
+from gettext import gettext as _
+
+import gi
+gi.require_versions({"Grl": "0.3", "Tracker": "3.0"})
+from gi.repository import Gio, Grl, Gtk, GLib, GObject, Tracker
+
+from gnomemusic.coresong import CoreSong
+import gnomemusic.utils as utils
+
+
+class GrlTrackerPlaylists(GObject.GObject):
+
+ _METADATA_PLAYLIST_KEYS = [
+ Grl.METADATA_KEY_CHILDCOUNT,
+ Grl.METADATA_KEY_CREATION_DATE,
+ Grl.METADATA_KEY_ID,
+ Grl.METADATA_KEY_TITLE
+ ]
+
+ def __init__(self, source, application, tracker_wrapper, songs_hash):
+ """Initialize GrlTrackerPlaylists.
+
+ :param Grl.TrackerSource source: The Tracker source to wrap
+ :param Application application: Application instance
+ :param TrackerWrapper tracker_wrapper: The TrackerWrapper
+ instance
+ :param dict songs_hash: The songs hash table
+ """
+ super().__init__()
+
+ self._application = application
+ self._coremodel = application.props.coremodel
+ self._log = application.props.log
+ self._source = source
+ self._model = self._coremodel.props.playlists
+ self._model_filter = self._coremodel.props.playlists_filter
+ self._user_model_filter = self._coremodel.props.user_playlists_filter
+ self._pls_todelete = []
+ self._songs_hash = songs_hash
+ self._tracker = tracker_wrapper.props.local_db
+ self._tracker_wrapper = tracker_wrapper
+ self._notificationmanager = application.props.notificationmanager
+ self._window = application.props.window
+
+ user_playlists_filter = Gtk.CustomFilter()
+ user_playlists_filter.set_filter_func(self._user_playlists_filter)
+ self._user_model_filter.set_filter(user_playlists_filter)
+
+ self._fast_options = Grl.OperationOptions()
+ self._fast_options.set_resolution_flags(
+ Grl.ResolutionFlags.FAST_ONLY | Grl.ResolutionFlags.IDLE_RELAY)
+
+ self._initial_playlists_fill()
+
+ def _initial_playlists_fill(self):
+ args = {
+ "source": self._source,
+ "application": self._application,
+ "tracker_wrapper": self._tracker_wrapper,
+ "songs_hash": self._songs_hash
+ }
+
+ smart_playlists = {
+ "MostPlayed": MostPlayed(**args),
+ "NeverPlayed": NeverPlayed(**args),
+ "RecentlyPlayed": RecentlyPlayed(**args),
+ "RecentlyAdded": RecentlyAdded(**args),
+ "Favorites": Favorites(**args)
+ }
+
+ for playlist in smart_playlists.values():
+ self._model.append(playlist)
+
+ self._notificationmanager.push_loading()
+ query = """
+ SELECT DISTINCT
+ %(media_type)s AS ?type
+ ?playlist AS ?id
+ nie:title(?playlist) AS ?title
+ nrl:added(?playlist) AS ?creationDate
+ nfo:entryCounter(?playlist) AS ?childCount
+ WHERE
+ {
+ ?playlist a nmm:Playlist .
+ }
+ """.replace("\n", " ").strip() % {
+ "media_type": int(Grl.MediaType.CONTAINER),
+ }
+
+ self._source.query(
+ query, self._METADATA_PLAYLIST_KEYS, self._fast_options,
+ self._add_user_playlist)
+
+ def _add_user_playlist(
+ self, source, op_id, media, remaining, data=None, error=None):
+ if error:
+ self._log.warning("Error: {}".format(error))
+ self._notificationmanager.pop_loading()
+ return
+ if not media:
+ self._notificationmanager.pop_loading()
+ return
+
+ playlist = Playlist(
+ media=media, source=self._source, application=self._application,
+ tracker_wrapper=self._tracker_wrapper, songs_hash=self._songs_hash)
+ self._model.append(playlist)
+ callback = data
+ if callback is not None:
+ callback(playlist)
+
+ def _playlists_filter(self, playlist):
+ return playlist not in self._pls_todelete
+
+ def _user_playlists_filter(self, playlist):
+ return (playlist not in self._pls_todelete
+ and playlist.props.is_smart is False)
+
+ def stage_playlist_deletion(self, playlist):
+ """Adds playlist to the list of playlists to delete
+
+ :param Playlist playlist: playlist
+ """
+ self._pls_todelete.append(playlist)
+ playlists_filter = Gtk.CustomFilter()
+ playlists_filter.set_filter_func(self._playlists_filter)
+ self._model_filter.set_filter(playlists_filter)
+
+ def finish_playlist_deletion(self, playlist, deleted):
+ """Removes playlist from the list of playlists to delete
+
+ :param Playlist playlist: playlist
+ :param bool deleted: indicates if the playlist has been deleted
+ """
+ playlists_filter = Gtk.CustomFilter()
+ playlists_filter.set_filter_func(self._playlists_filter)
+ user_playlists_filter = Gtk.CustomFilter()
+ user_playlists_filter.set_filter_func(self._playlists_filter)
+
+ self._pls_todelete.remove(playlist)
+ if deleted is False:
+ self._model_filter.set_filter(playlists_filter)
+ self._user_model_filter.set_filter(user_playlists_filter)
+ return
+
+ def _delete_cb(conn, res, data):
+ try:
+ conn.update_finish(res)
+ except GLib.Error as error:
+ self._log.warning("Unable to delete playlist {}: {}".format(
+ playlist.props.title, error.message))
+ else:
+ for idx, playlist_model in enumerate(self._model):
+ if playlist_model is playlist:
+ self._model.remove(idx)
+ break
+
+ playlists_filter = Gtk.CustomFilter()
+ playlists_filter.set_filter_func(self._playlists_filter)
+ self._model_filter.set_filter(playlists_filter)
+ self._notificationmanager.pop_loading()
+
+ self._notificationmanager.push_loading()
+ query = """
+ DELETE {
+ ?playlist a rdfs:Resource .
+ }
+ WHERE {
+ ?playlist a nmm:Playlist ;
+ a nfo:MediaList .
+ FILTER (
+ tracker:id(?playlist) = %(playlist_id)s
+ )
+ }
+ """.replace("\n", " ").strip() % {
+ "playlist_id": playlist.props.pl_id
+ }
+ self._tracker.update_async(query, None, _delete_cb, None)
+
+ def create_playlist(self, playlist_title, callback):
+ """Creates a new user playlist.
+
+ :param str playlist_title: playlist title
+ :param callback: function to perform once, the playlist is created
+ """
+ def _create_cb(conn, res, data):
+ try:
+ result = conn.update_blank_finish(res)
+ except GLib.Error as error:
+ self._log.warning(
+ "Unable to create playlist {}: {}".format(
+ playlist_title, error.message))
+ self._notificationmanager.pop_loading()
+ if callback is not None:
+ callback(None)
+
+ return
+
+ playlist_urn = result[0][0]['playlist']
+ query = """
+ SELECT
+ %(media_type)s AS ?type
+ ?playlist AS ?id
+ nie:title(?playlist) AS ?title
+ nrl:added(?playlist) AS ?creationDate
+ nfo:entryCounter(?playlist) AS ?childCount
+ WHERE
+ {
+ BIND ( <%(playlist_urn)s> AS ?playlist )
+ }
+ """.replace("\n", " ").strip() % {
+ "media_type": int(Grl.MediaType.CONTAINER),
+ "playlist_urn": playlist_urn
+ }
+
+ self._source.query(
+ query, self._METADATA_PLAYLIST_KEYS, self._fast_options,
+ self._add_user_playlist, callback)
+
+ self._notificationmanager.push_loading()
+ query = """
+ INSERT {
+ _:playlist a nmm:Playlist ;
+ a nfo:MediaList ;
+ nie:title "%(title)s" ;
+ nfo:entryCounter 0 .
+ }
+ """.replace("\n", " ").strip() % {
+ "title": Tracker.sparql_escape_string(playlist_title)
+ }
+ self._tracker.update_blank_async(query, None, _create_cb, None)
+
+ def check_smart_playlist_change(self):
+ """Check if smart playlists need to be updated.
+
+ A smart playlist needs to be updated in two cases:
+ * it is being played (active_playlist)
+ * it is visible in PlaylistsView
+ """
+ active_core_object = self._coremodel.props.active_core_object
+ if (isinstance(active_core_object, Playlist)
+ and active_core_object.props.is_smart):
+ active_core_object.update()
+ else:
+ self._coremodel.emit("smart-playlist-change")
+
+
+class Playlist(GObject.GObject):
+ """ Base class of all playlists """
+
+ __gsignals__ = {
+ "playlist-loaded": (GObject.SignalFlags.RUN_FIRST, None, ()),
+ }
+
+ _METADATA_PLAYLIST_KEYS = [
+ Grl.METADATA_KEY_ALBUM,
+ Grl.METADATA_KEY_ARTIST,
+ Grl.METADATA_KEY_DURATION,
+ Grl.METADATA_KEY_FAVOURITE,
+ Grl.METADATA_KEY_ID,
+ Grl.METADATA_KEY_LAST_PLAYED,
+ Grl.METADATA_KEY_PLAY_COUNT,
+ Grl.METADATA_KEY_TITLE,
+ Grl.METADATA_KEY_URL
+ ]
+
+ count = GObject.Property(type=int, default=0)
+ creation_date = GObject.Property(type=GLib.DateTime, default=None)
+ icon_name = GObject.Property(type=str, default="music-playlist-symbolic")
+ is_smart = GObject.Property(type=bool, default=False)
+ pl_id = GObject.Property(type=str, default=None)
+ query = GObject.Property(type=str, default=None)
+ tag_text = GObject.Property(type=str, default=None)
+
+ def __init__(
+ self, media=None, query=None, tag_text=None, source=None,
+ application=None, tracker_wrapper=None, songs_hash=None):
+ super().__init__()
+ """Initialize a playlist
+
+ :param Grl.Media media: A media object
+ :param string query: Tracker query that returns the playlist
+ :param string tag_text: The non translatable unique identifier
+ of the playlist
+ :param Grl.Source source: The Grilo Tracker source object
+ :param Application application: The Application instance
+ :param TrackerWrapper tracker_wrapper: The TrackerWrapper instance
+ :param dict songs_hash: The songs hash table
+ """
+ if media:
+ self.props.pl_id = media.get_id()
+ self._title = utils.get_media_title(media)
+ self.props.count = media.get_childcount()
+ self.props.creation_date = media.get_creation_date()
+ else:
+ self._title = None
+
+ self.props.query = query
+ self.props.tag_text = tag_text
+ self._application = application
+ self._model = None
+ self._source = source
+ self._coremodel = application.props.coremodel
+ self._coreselection = application.props.coreselection
+ self._log = application.props.log
+ self._songs_hash = songs_hash
+ self._tracker = tracker_wrapper.props.local_db
+ self._tracker_wrapper = tracker_wrapper
+ self._notificationmanager = application.props.notificationmanager
+
+ self._fast_options = Grl.OperationOptions()
+ self._fast_options.set_resolution_flags(
+ Grl.ResolutionFlags.FAST_ONLY | Grl.ResolutionFlags.IDLE_RELAY)
+
+ self._songs_todelete = []
+
+ @GObject.Property(type=Gio.ListStore, default=None)
+ def model(self):
+ if self._model is None:
+ self._model = Gio.ListStore()
+
+ self._populate_model()
+
+ return self._model
+
+ @model.setter # type: ignore
+ def model(self, value):
+ self._model = value
+
+ def _populate_model(self):
+ self._notificationmanager.push_loading()
+
+ query = """
+ SELECT
+ %(media_type)s AS ?type
+ ?song AS ?id
+ ?url
+ ?title
+ ?artist
+ ?album
+ ?duration
+ ?tag AS ?favorite
+ nie:contentAccessed(?song) AS ?lastPlayed
+ nie:usageCounter(?song) AS ?playCount
+ WHERE {
+ ?playlist a nmm:Playlist ;
+ a nfo:MediaList ;
+ nfo:hasMediaFileListEntry ?entry .
+ ?entry a nfo:MediaFileListEntry ;
+ nfo:entryUrl ?url .
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT
+ ?song
+ nie:title(?song) AS ?title
+ nmm:artistName(nmm:artist(?song)) AS ?artist
+ nie:title(nmm:musicAlbum(?song)) AS ?album
+ nfo:duration(?song) AS ?duration
+ ?url
+ WHERE {
+ ?song a nmm:MusicPiece ;
+ nie:isStoredAs ?url .
+ %(location_filter)s
+ }
+ }
+ }
+ OPTIONAL {
+ ?song nao:hasTag ?tag .
+ FILTER( ?tag = nao:predefined-tag-favorite )
+ }
+ FILTER (
+ %(filter_clause)s
+ )
+ }
+ ORDER BY nfo:listPosition(?entry)
+ """.replace('\n', ' ').strip() % {
+ "media_type": int(Grl.MediaType.AUDIO),
+ "filter_clause": 'tracker:id(?playlist) = ' + self.props.pl_id,
+ "location_filter": self._tracker_wrapper.location_filter(),
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ }
+
+ def _add_to_playlist_cb(
+ source, op_id, media, remaining, user_data, error):
+ if not media:
+ self.props.count = self._model.get_n_items()
+ self.emit("playlist-loaded")
+ self._notificationmanager.pop_loading()
+ return
+
+ coresong = CoreSong(self._application, media)
+ self._bind_to_main_song(coresong)
+ if coresong not in self._songs_todelete:
+ self._model.append(coresong)
+
+ options = Grl.OperationOptions()
+ options.set_resolution_flags(
+ Grl.ResolutionFlags.FAST_ONLY | Grl.ResolutionFlags.IDLE_RELAY)
+
+ self._source.query(
+ query, self._METADATA_PLAYLIST_KEYS, options, _add_to_playlist_cb,
+ None)
+
+ def _bind_to_main_song(self, coresong):
+ main_coresong = self._songs_hash[coresong.props.media.get_id()]
+
+ # It is not necessary to bind all the CoreSong properties:
+ # selected property is linked to a view
+ # validation is a short-lived playability check for local songs
+ bidirectional_properties = [
+ "album", "album_disc_number", "artist", "duration", "media",
+ "grlid", "play_count", "title", "track_number", "url", "favorite"]
+
+ for prop in bidirectional_properties:
+ main_coresong.bind_property(
+ prop, coresong, prop,
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+
+ # There is no need for the "state" property to be bidirectional
+ coresong.bind_property(
+ prop, main_coresong, "state", GObject.BindingFlags.DEFAULT)
+
+ @GObject.Property(type=str, default=None)
+ def title(self):
+ """Playlist title
+
+ :returns: playlist title
+ :rtype: str
+ """
+ return self._title
+
+ @title.setter # type: ignore
+ def title(self, new_name):
+ """Rename a playlist
+
+ :param str new_name: new playlist name
+ """
+ self._notificationmanager.push_loading()
+
+ def update_cb(conn, res, data):
+ try:
+ conn.update_finish(res)
+ except GLib.Error as e:
+ self._log.warning(
+ "Unable to rename playlist from {} to {}: {}".format(
+ self._title, new_name, e.message))
+ else:
+ self._title = new_name
+ finally:
+ self._notificationmanager.pop_loading()
+ self.thaw_notify()
+
+ query = """
+ INSERT OR REPLACE {
+ ?playlist nie:title "%(title)s"
+ }
+ WHERE {
+ ?playlist a nmm:Playlist ;
+ a nfo:MediaList .
+ OPTIONAL {
+ ?playlist nfo:hasMediaFileListEntry ?entry .
+ }
+ FILTER (
+ tracker:id(?playlist) = %(playlist_id)s
+ )
+ }
+ """.replace("\n", " ").strip() % {
+ 'title': Tracker.sparql_escape_string(new_name),
+ 'playlist_id': self.props.pl_id
+ }
+
+ self.freeze_notify()
+ self._tracker.update_async(query, None, update_cb, None)
+
+ def stage_song_deletion(self, coresong, index):
+ """Adds a song to the list of songs to delete
+
+ :param CoreSong coresong: song to delete
+ :param int position: Song position in the playlist
+ """
+ self._songs_todelete.append(coresong)
+ self._model.remove(index)
+ self.props.count -= 1
+
+ def undo_pending_song_deletion(self, coresong, position):
+ """Removes song from the list of songs to delete
+
+ :param CoreSong coresong: song to delete
+ :param int position: Song position in the playlist
+ """
+ self._songs_todelete.remove(coresong)
+ self._model.insert(position, coresong)
+ self.props.count += 1
+
+ def finish_song_deletion(self, coresong: CoreSong, position: int) -> None:
+ """Removes a song from the playlist
+
+ :param CoreSong coresong: song to remove
+ :param int position: Song position in the playlist, starts from
+ zero
+ """
+ def update_cb(conn, res):
+ try:
+ conn.update_finish(res)
+ except GLib.Error as e:
+ self._log.warning(
+ "Unable to remove song from playlist {}: {}".format(
+ self.props.title, e.message))
+
+ self._notificationmanager.pop_loading()
+
+ def entry_retrieved_cb(source, op_id, media, remaining, error):
+ if error:
+ self._log.warning("Error: {}".format(error))
+ return
+
+ if not media:
+ return
+
+ self._notificationmanager.push_loading()
+ update_query = """
+ INSERT OR REPLACE {
+ ?entry nfo:listPosition ?position .
+ }
+ WHERE {
+ SELECT ?entry
+ (?old_position - 1) AS ?position
+ WHERE {
+ ?entry a nfo:MediaFileListEntry ;
+ nfo:listPosition ?old_position .
+ ?playlist nfo:hasMediaFileListEntry ?entry .
+ FILTER (?old_position > ?removed_position)
+ {
+ SELECT ?playlist
+ ?removed_position
+ WHERE {
+ ?playlist a nmm:Playlist ;
+ a nfo:MediaList ;
+ nfo:hasMediaFileListEntry
+ ?removed_entry .
+ ?removed_entry nfo:listPosition ?removed_position .
+ FILTER (
+ tracker:id(?playlist) = %(playlist_id)s &&
+ tracker:id(?removed_entry) = %(entry_id)s
+ )
+ }
+ }
+ }
+ };
+ INSERT OR REPLACE {
+ ?playlist nfo:entryCounter ?new_counter .
+ }
+ WHERE {
+ SELECT ?playlist
+ (?counter - 1) AS ?new_counter
+ WHERE {
+ ?playlist a nmm:Playlist ;
+ a nfo:MediaList ;
+ nfo:entryCounter ?counter .
+ FILTER (
+ tracker:id(?playlist) = %(playlist_id)s
+ )
+ }
+ };
+ DELETE {
+ ?playlist nfo:hasMediaFileListEntry ?entry .
+ ?entry a rdfs:Resource .
+ }
+ WHERE {
+ ?playlist a nmm:Playlist ;
+ a nfo:MediaList ;
+ nfo:hasMediaFileListEntry ?entry .
+ FILTER (
+ tracker:id(?playlist) = %(playlist_id)s &&
+ tracker:id(?entry) = %(entry_id)s
+ )
+ }
+ """.replace("\n", " ").strip() % {
+ "playlist_id": self.props.pl_id,
+ "entry_id": media.get_id()
+ }
+
+ self._tracker.update_async(update_query, None, update_cb)
+
+ entry_query = """
+ SELECT
+ %(media_type)s AS ?type
+ ?entry AS ?id
+ WHERE {
+ ?playlist a nmm:Playlist ;
+ a nfo:MediaList ;
+ nfo:hasMediaFileListEntry ?entry .
+ ?entry a nfo:MediaFileListEntry .
+ FILTER (
+ %(filter_clause_pl)s &&
+ nfo:listPosition(?entry) = %(position)s
+ )
+ }
+ """.replace("\n", " ").strip() % {
+ "media_type": int(Grl.MediaType.AUDIO),
+ "position": position + 1,
+ "filter_clause_pl": "tracker:id(?playlist) = " + self.props.pl_id,
+ }
+
+ self._source.query(
+ entry_query, [Grl.METADATA_KEY_ID], self._fast_options,
+ entry_retrieved_cb)
+
+ def add_songs(self, coresongs):
+ """Adds songs to the playlist
+
+ :param list coresongs: list of Coresong
+ """
+ def _add_to_model(source, op_id, media, remaining, error):
+ if not media:
+ self.props.count = self._model.get_n_items()
+ return
+
+ coresong = CoreSong(self._application, media)
+ self._bind_to_main_song(coresong)
+ if coresong not in self._songs_todelete:
+ self._model.append(coresong)
+
+ def _requery_media(conn, res, coresong):
+ if self._model is None:
+ return
+
+ media_id = coresong.props.media.get_id()
+ pl_id = self.props.pl_id
+ miner_fs_busname = self._tracker_wrapper.props.miner_fs_busname
+ query = """
+ SELECT
+ %(media_type)s AS ?type
+ ?song AS ?id
+ ?url
+ ?title
+ ?artist
+ ?album
+ ?duration
+ ?tag AS ?favorite
+ nie:contentAccessed(?song) AS ?lastPlayed
+ nie:usageCounter(?song) AS ?playCount
+ WHERE {
+ ?playlist a nmm:Playlist ;
+ a nfo:MediaList ;
+ nfo:hasMediaFileListEntry ?entry .
+ ?entry a nfo:MediaFileListEntry ;
+ nfo:entryUrl ?url .
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT
+ ?song
+ nie:title(?song) AS ?title
+ nmm:artistName(nmm:artist(?song)) AS ?artist
+ nie:title(nmm:musicAlbum(?song)) AS ?album
+ nfo:duration(?song) AS ?duration
+ ?url
+ WHERE {
+ ?song a nmm:MusicPiece ;
+ nie:isStoredAs ?url .
+ %(location_filter)s
+ FILTER (
+ %(filter_clause_song)s
+ )
+ }
+ }
+ }
+ OPTIONAL {
+ ?song nao:hasTag ?tag .
+ FILTER( ?tag = nao:predefined-tag-favorite )
+ }
+ FILTER (
+ %(filter_clause_pl)s
+ )
+ } LIMIT 1
+ """.replace("\n", " ").strip() % {
+ "media_type": int(Grl.MediaType.AUDIO),
+ "filter_clause_song": "tracker:id(?song) = " + media_id,
+ "filter_clause_pl": "tracker:id(?playlist) = " + pl_id,
+ "location_filter": self._tracker_wrapper.location_filter(),
+ "miner_fs_busname": miner_fs_busname,
+ }
+
+ self._source.query(
+ query, self._METADATA_PLAYLIST_KEYS, self._fast_options,
+ _add_to_model)
+
+ for coresong in coresongs:
+ query = """
+ INSERT OR REPLACE {
+ _:entry a nfo:MediaFileListEntry ;
+ nfo:entryUrl "%(song_uri)s" ;
+ nfo:listPosition ?position .
+ ?playlist nfo:entryCounter ?position ;
+ nfo:hasMediaFileListEntry _:entry .
+ }
+ WHERE {
+ SELECT ?playlist
+ (?counter + 1) AS ?position
+ WHERE {
+ ?playlist a nmm:Playlist ;
+ a nfo:MediaList ;
+ nfo:entryCounter ?counter .
+ FILTER (
+ tracker:id(?playlist) = %(playlist_id)s
+ )
+ }
+ }
+ """.replace("\n", " ").strip() % {
+ "playlist_id": self.props.pl_id,
+ "song_uri": coresong.props.media.get_url()}
+
+ self._tracker.update_blank_async(
+ query, None, _requery_media, coresong)
+
+ def reorder(self, previous_position, new_position):
+ """Changes the order of a songs in the playlist.
+
+ :param int previous_position: preivous song position
+ :param int new_position: new song position
+ """
+ def _position_changed_cb(conn, res, position):
+ # FIXME: Check for failure.
+ conn.update_finish(res)
+
+ coresong = self._model.get_item(previous_position)
+ self._model.remove(previous_position)
+ self._model.insert(new_position, coresong)
+
+ main_query = """
+ INSERT OR REPLACE {
+ ?entry
+ nfo:listPosition %(position)s
+ }
+ WHERE {
+ ?playlist a nmm:Playlist ;
+ a nfo:MediaList ;
+ nfo:hasMediaFileListEntry ?entry .
+ FILTER (
+ tracker:id(?playlist) = %(playlist_id)s &&
+ tracker:id(?entry) = %(song_id)s
+ )
+ }
+ """.replace("\n", " ").strip()
+
+ first_pos = min(previous_position, new_position)
+ last_pos = max(previous_position, new_position)
+
+ for position in range(first_pos, last_pos + 1):
+ coresong = self._model.get_item(position)
+ query = main_query % {
+ "playlist_id": self.props.pl_id,
+ "song_id": coresong.props.media.get_id(),
+ "position": position
+ }
+ self._tracker.update_async(
+ query, None, _position_changed_cb, position)
+
+
+class SmartPlaylist(Playlist):
+ """Base class for smart playlists"""
+
+ _METADATA_SMART_PLAYLIST_KEYS = [
+ Grl.METADATA_KEY_ALBUM,
+ Grl.METADATA_KEY_ALBUM_DISC_NUMBER,
+ Grl.METADATA_KEY_ARTIST,
+ Grl.METADATA_KEY_DURATION,
+ Grl.METADATA_KEY_FAVOURITE,
+ Grl.METADATA_KEY_ID,
+ Grl.METADATA_KEY_PLAY_COUNT,
+ Grl.METADATA_KEY_URL,
+ Grl.METADATA_KEY_TITLE,
+ Grl.METADATA_KEY_TRACK_NUMBER,
+ ]
+
+ def __init__(self, **args):
+ super().__init__(**args)
+
+ self.props.is_smart = True
+
+ @GObject.Property(type=Gio.ListStore, default=None)
+ def model(self):
+ if self._model is None:
+ self._model = Gio.ListStore.new(CoreSong)
+
+ self._notificationmanager.push_loading()
+
+ def _add_to_model(source, op_id, media, remaining, error):
+ if error:
+ self._log.warning("Error: {}".format(error))
+ self._notificationmanager.pop_loading()
+ self.emit("playlist-loaded")
+ return
+
+ if not media:
+ self.props.count = self._model.get_n_items()
+ self._notificationmanager.pop_loading()
+ self.emit("playlist-loaded")
+ return
+
+ coresong = CoreSong(self._application, media)
+ self._bind_to_main_song(coresong)
+ self._model.append(coresong)
+
+ self._source.query(
+ self.props.query, self._METADATA_SMART_PLAYLIST_KEYS,
+ self._fast_options, _add_to_model)
+
+ return self._model
+
+ def update(self):
+ """Updates playlist model."""
+ if self._model is None:
+ return
+
+ new_model_medias = []
+
+ def _fill_new_model(source, op_id, media, remaining, error):
+ if error:
+ return
+
+ if not media:
+ self._finish_update(new_model_medias)
+ return
+
+ new_model_medias.append(media)
+
+ self._source.query(
+ self.props.query, self._METADATA_SMART_PLAYLIST_KEYS,
+ self._fast_options, _fill_new_model)
+
+ def _finish_update(self, new_model_medias):
+ if not new_model_medias:
+ self._model.remove_all()
+ self.props.count = 0
+ return
+
+ current_models_ids = [coresong.props.media.get_id()
+ for coresong in self._model]
+ new_model_ids = [media.get_id() for media in new_model_medias]
+
+ idx_to_delete = []
+ for idx, media_id in enumerate(current_models_ids):
+ if media_id not in new_model_ids:
+ idx_to_delete.insert(0, idx)
+
+ for idx in idx_to_delete:
+ self._model.remove(idx)
+ self.props.count -= 1
+
+ for idx, media in enumerate(new_model_medias):
+ if media.get_id() not in current_models_ids:
+ coresong = CoreSong(self._application, media)
+ self._bind_to_main_song(coresong)
+ self._model.append(coresong)
+ self.props.count += 1
+
+
+class MostPlayed(SmartPlaylist):
+ """Most Played smart playlist"""
+
+ def __init__(self, **args):
+ super().__init__(**args)
+
+ self.props.tag_text = "MOST_PLAYED"
+ # TRANSLATORS: this is a playlist name
+ self._title = _("Most Played")
+ self.props.icon_name = "audio-speakers-symbolic"
+ self.props.query = """
+ SELECT
+ %(media_type)s AS ?type
+ ?song AS ?id
+ ?title
+ ?url
+ ?artist
+ ?album
+ ?duration
+ ?trackNumber
+ ?albumDiscNumber
+ ?playCount
+ ?tag AS ?favorite
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT
+ ?song
+ nie:title(?song) AS ?title
+ nie:isStoredAs(?song) AS ?url
+ nmm:artistName(nmm:artist(?song)) AS ?artist
+ nie:title(nmm:musicAlbum(?song)) AS ?album
+ nfo:duration(?song) AS ?duration
+ nmm:trackNumber(?song) AS ?trackNumber
+ nmm:setNumber(nmm:musicAlbumDisc(?song))
+ AS ?albumDiscNumber
+ WHERE {
+ ?song a nmm:MusicPiece .
+ %(location_filter)s
+ }
+ }
+ }
+ ?song nie:usageCounter ?playCount
+ OPTIONAL { ?song nao:hasTag ?tag .
+ FILTER (?tag = nao:predefined-tag-favorite) }
+ }
+ ORDER BY DESC(?playCount) LIMIT 50
+ """.replace('\n', ' ').strip() % {
+ "media_type": int(Grl.MediaType.AUDIO),
+ "location_filter": self._tracker_wrapper.location_filter(),
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ }
+
+
+class NeverPlayed(SmartPlaylist):
+ """Never Played smart playlist"""
+
+ def __init__(self, **args):
+ super().__init__(**args)
+
+ self.props.tag_text = "NEVER_PLAYED"
+ # TRANSLATORS: this is a playlist name
+ self._title = _("Never Played")
+ self.props.icon_name = "dialog-question-symbolic"
+ self.props.query = """
+ SELECT
+ %(media_type)s AS ?type
+ ?song AS ?id
+ ?title
+ ?url
+ ?artist
+ ?album
+ ?duration
+ ?trackNumber
+ ?albumDiscNumber
+ nie:usageCounter(?song) AS ?playCount
+ ?tag AS ?favorite
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT
+ ?song
+ nie:title(?song) AS ?title
+ nie:isStoredAs(?song) AS ?url
+ nmm:artistName(nmm:artist(?song)) AS ?artist
+ nie:title(nmm:musicAlbum(?song)) AS ?album
+ nfo:duration(?song) AS ?duration
+ nmm:trackNumber(?song) AS ?trackNumber
+ nmm:setNumber(nmm:musicAlbumDisc(?song))
+ AS ?albumDiscNumber
+ WHERE {
+ ?song a nmm:MusicPiece .
+ %(location_filter)s
+ }
+ }
+ }
+ FILTER ( NOT EXISTS { ?song nie:usageCounter ?count .} )
+ OPTIONAL { ?song nao:hasTag ?tag .
+ FILTER (?tag = nao:predefined-tag-favorite) }
+ } ORDER BY nfo:fileLastAccessed(?song) LIMIT 50
+ """.replace('\n', ' ').strip() % {
+ "media_type": int(Grl.MediaType.AUDIO),
+ "location_filter": self._tracker_wrapper.location_filter(),
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ }
+
+
+class RecentlyPlayed(SmartPlaylist):
+ """Recently Played smart playlist"""
+
+ def __init__(self, **args):
+ super().__init__(**args)
+
+ self.props.tag_text = "RECENTLY_PLAYED"
+ # TRANSLATORS: this is a playlist name
+ self._title = _("Recently Played")
+ self.props.icon_name = "document-open-recent-symbolic"
+
+ sparql_midnight_dateTime_format = "%Y-%m-%dT00:00:00Z"
+ days_difference = 7
+ seconds_difference = days_difference * 86400
+ compare_date = time.strftime(
+ sparql_midnight_dateTime_format,
+ time.gmtime(time.time() - seconds_difference))
+ self.props.query = """
+ SELECT
+ %(media_type)s AS ?type
+ ?song AS ?id
+ ?title
+ ?url
+ ?artist
+ ?album
+ ?duration
+ ?trackNumber
+ ?albumDiscNumber
+ nie:usageCounter(?song) AS ?playCount
+ ?tag AS ?favorite
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT
+ ?song
+ nie:title(?song) AS ?title
+ nie:isStoredAs(?song) AS ?url
+ nmm:artistName(nmm:artist(?song)) AS ?artist
+ nie:title(nmm:musicAlbum(?song)) AS ?album
+ nfo:duration(?song) AS ?duration
+ nmm:trackNumber(?song) AS ?trackNumber
+ nmm:setNumber(nmm:musicAlbumDisc(?song))
+ AS ?albumDiscNumber
+ WHERE {
+ ?song a nmm:MusicPiece .
+ %(location_filter)s
+ }
+ }
+ }
+ ?song nie:contentAccessed ?lastPlayed .
+ FILTER ( ?lastPlayed > '%(compare_date)s'^^xsd:dateTime
+ && EXISTS { ?song nie:usageCounter ?count .} )
+ OPTIONAL { ?song nao:hasTag ?tag .
+ FILTER (?tag = nao:predefined-tag-favorite) }
+ } ORDER BY DESC(?lastPlayed) LIMIT 50
+ """.replace('\n', ' ').strip() % {
+ "media_type": int(Grl.MediaType.AUDIO),
+ 'compare_date': compare_date,
+ "location_filter": self._tracker_wrapper.location_filter(),
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ }
+
+
+class RecentlyAdded(SmartPlaylist):
+ """Recently Added smart playlist"""
+
+ def __init__(self, **args):
+ super().__init__(**args)
+
+ self.props.tag_text = "RECENTLY_ADDED"
+ # TRANSLATORS: this is a playlist name
+ self._title = _("Recently Added")
+ self.props.icon_name = "list-add-symbolic"
+
+ sparql_midnight_dateTime_format = "%Y-%m-%dT00:00:00Z"
+ days_difference = 7
+ seconds_difference = days_difference * 86400
+ compare_date = time.strftime(
+ sparql_midnight_dateTime_format,
+ time.gmtime(time.time() - seconds_difference))
+ self.props.query = """
+ SELECT
+ %(media_type)s AS ?type
+ ?song AS ?id
+ ?title
+ ?url
+ ?artist
+ ?album
+ ?duration
+ ?trackNumber
+ ?albumDiscNumber
+ nie:usageCounter(?song) AS ?playCount
+ ?tag AS ?favorite
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT
+ ?song
+ nie:title(?song) AS ?title
+ nie:isStoredAs(?song) AS ?url
+ nmm:artistName(nmm:artist(?song)) AS ?artist
+ nie:title(nmm:musicAlbum(?song)) AS ?album
+ nfo:duration(?song) AS ?duration
+ nmm:trackNumber(?song) AS ?trackNumber
+ nmm:setNumber(nmm:musicAlbumDisc(?song))
+ AS ?albumDiscNumber
+ ?added
+ WHERE {
+ ?song a nmm:MusicPiece ;
+ nrl:added ?added .
+ %(location_filter)s
+ FILTER ( ?added > '%(compare_date)s'^^xsd:dateTime )
+ }
+ }
+ }
+ OPTIONAL { ?song nao:hasTag ?tag .
+ FILTER (?tag = nao:predefined-tag-favorite) }
+ } ORDER BY DESC(nrl:added(?song)) LIMIT 50
+ """.replace('\n', ' ').strip() % {
+ "media_type": int(Grl.MediaType.AUDIO),
+ 'compare_date': compare_date,
+ "location_filter": self._tracker_wrapper.location_filter(),
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ }
+
+
+class Favorites(SmartPlaylist):
+ """Favorites smart playlist"""
+
+ def __init__(self, **args):
+ super().__init__(**args)
+
+ self.props.tag_text = "FAVORITES"
+ # TRANSLATORS: this is a playlist name
+ self._title = _("Favorite Songs")
+ self.props.icon_name = "starred-symbolic"
+ self.props.query = """
+ SELECT
+ %(media_type)s AS ?type
+ ?song AS ?id
+ ?title
+ ?url
+ ?artist
+ ?album
+ ?duration
+ ?trackNumber
+ ?albumDiscNumber
+ nie:usageCounter(?song) AS ?playCount
+ nao:predefined-tag-favorite AS ?favorite
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT
+ ?song
+ nie:title(?song) AS ?title
+ nie:isStoredAs(?song) AS ?url
+ nmm:artistName(nmm:artist(?song)) AS ?artist
+ nie:title(nmm:musicAlbum(?song)) AS ?album
+ nfo:duration(?song) AS ?duration
+ nmm:trackNumber(?song) AS ?trackNumber
+ nmm:setNumber(nmm:musicAlbumDisc(?song))
+ AS ?albumDiscNumber
+ nrl:added(?song) AS ?added
+ WHERE {
+ ?song a nmm:MusicPiece .
+ %(location_filter)s
+ }
+ }
+ }
+ ?song nao:hasTag nao:predefined-tag-favorite .
+ } ORDER BY DESC(?added)
+ """.replace('\n', ' ').strip() % {
+ "media_type": int(Grl.MediaType.AUDIO),
+ "location_filter": self._tracker_wrapper.location_filter(),
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ }
diff --git a/gnomemusic/grilowrappers/grltrackerwrapper.py b/gnomemusic/grilowrappers/grltrackerwrapper.py
new file mode 100644
index 00000000..2831b977
--- /dev/null
+++ b/gnomemusic/grilowrappers/grltrackerwrapper.py
@@ -0,0 +1,1331 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from typing import Callable, Dict, List, Optional
+import typing
+
+import gi
+gi.require_versions({"Grl": "0.3", "Tracker": "3.0"})
+from gi.repository import Grl, Gio, Gtk, GLib, GObject, Tracker
+
+from gnomemusic.asyncqueue import AsyncQueue
+from gnomemusic.corealbum import CoreAlbum
+from gnomemusic.coreartist import CoreArtist
+from gnomemusic.coredisc import CoreDisc
+from gnomemusic.coresong import CoreSong
+from gnomemusic.grilowrappers.grltrackerplaylists import (
+ GrlTrackerPlaylists, Playlist)
+from gnomemusic.trackerwrapper import TrackerWrapper
+from gnomemusic.utils import CoreObjectType
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.coremodel import CoreModel
+ from gnomemusic.musiclogger import MusicLogger
+ from gnomemusic.notificationmanager import NotificationManager
+ from gnomemusic.storeart import StoreArt
+
+
+class GrlTrackerWrapper(GObject.GObject):
+ """Wrapper for the Grilo Tracker source.
+ """
+
+ _SPLICE_SIZE: int = 100
+
+ _METADATA_ALBUM_CHANGED_KEYS: List[int] = [
+ Grl.METADATA_KEY_ARTIST,
+ Grl.METADATA_KEY_ALBUM_ARTIST,
+ Grl.METADATA_KEY_COMPOSER,
+ Grl.METADATA_KEY_ID,
+ Grl.METADATA_KEY_PUBLICATION_DATE,
+ Grl.METADATA_KEY_TITLE,
+ Grl.METADATA_KEY_URL
+ ]
+
+ _METADATA_SONG_FILL_KEYS: List[int] = [
+ Grl.METADATA_KEY_ALBUM,
+ Grl.METADATA_KEY_ALBUM_DISC_NUMBER,
+ Grl.METADATA_KEY_ARTIST,
+ Grl.METADATA_KEY_DURATION,
+ Grl.METADATA_KEY_FAVOURITE,
+ Grl.METADATA_KEY_ID,
+ Grl.METADATA_KEY_PLAY_COUNT,
+ Grl.METADATA_KEY_TITLE,
+ Grl.METADATA_KEY_TRACK_NUMBER,
+ Grl.METADATA_KEY_URL
+ ]
+
+ _METADATA_SONG_MEDIA_QUERY_KEYS: List[int] = [
+ Grl.METADATA_KEY_ALBUM,
+ Grl.METADATA_KEY_ALBUM_DISC_NUMBER,
+ Grl.METADATA_KEY_ARTIST,
+ Grl.METADATA_KEY_DURATION,
+ Grl.METADATA_KEY_FAVOURITE,
+ Grl.METADATA_KEY_ID,
+ Grl.METADATA_KEY_PLAY_COUNT,
+ Grl.METADATA_KEY_TITLE,
+ Grl.METADATA_KEY_TRACK_NUMBER,
+ Grl.METADATA_KEY_URL
+ ]
+
+ _METADATA_THUMBNAIL_KEYS: List[int] = [
+ Grl.METADATA_KEY_ID,
+ Grl.METADATA_KEY_THUMBNAIL
+ ]
+
+ def __init__(
+ self, source: Grl.Source, application: Application,
+ tracker_wrapper: TrackerWrapper) -> None:
+ """Initialize the Tracker wrapper
+
+ :param Grl.TrackerSource source: The Tracker source to wrap
+ :param Application application: Application instance
+ :param TrackerWrapper tracker_wrapper: The TrackerWrapper instance
+ """
+ super().__init__()
+
+ self._async_queue = AsyncQueue("GrlTrackerWrapper")
+ self._application: Application = application
+ cm: CoreModel = application.props.coremodel
+ self._log: MusicLogger = application.props.log
+ self._songs_model = Gio.ListStore.new(CoreSong)
+ cm.props.songs_proxy.append(self._songs_model)
+ self._source: Optional[Grl.Source] = None
+ self._albums_model = Gio.ListStore.new(CoreAlbum)
+ cm.props.albums_proxy.append(self._albums_model)
+ self._album_ids: Dict[str, CoreAlbum] = {}
+ self._artists_model = Gio.ListStore.new(CoreArtist)
+ cm.props.artists_proxy.append(self._artists_model)
+ self._artist_ids: Dict[str, CoreArtist] = {}
+ self._hash: Dict[str, CoreSong] = {}
+ self._batch_changed_media_ids: Dict[
+ Grl.SourceChangeType, List[str]] = {}
+ self._content_changed_timeout: int = 0
+ self._tracker_playlists: Optional[GrlTrackerPlaylists] = None
+ self._tracker_wrapper: TrackerWrapper = tracker_wrapper
+ self._notificationmanager: NotificationManager = (
+ application.props.notificationmanager)
+
+ self._songs_search: Gtk.FilterListModel = Gtk.FilterListModel.new(
+ self._songs_model)
+ self._songs_search.set_filter(Gtk.AnyFilter())
+ cm.props.songs_search_proxy.append(self._songs_search)
+
+ self._albums_search: Gtk.FilterListModel = Gtk.FilterListModel.new(
+ self._albums_model)
+ self._albums_search.set_filter(Gtk.AnyFilter())
+ cm.props.albums_search_proxy.append(self._albums_search)
+
+ self._artists_search: Gtk.FilterListModel = Gtk.FilterListModel.new(
+ self._artists_model)
+ self._artists_search.set_filter(Gtk.AnyFilter())
+ cm.props.artists_search_proxy.append(self._artists_search)
+
+ self._fast_options: Grl.OperationOptions = Grl.OperationOptions()
+ self._fast_options.set_type_filter(Grl.TypeFilter.AUDIO)
+ self._fast_options.set_resolution_flags(
+ Grl.ResolutionFlags.FAST_ONLY)
+
+ self._fast_options_lprio = Grl.OperationOptions()
+ self._fast_options_lprio.set_type_filter(Grl.TypeFilter.AUDIO)
+ self._fast_options_lprio.set_resolution_flags(
+ Grl.ResolutionFlags.FAST_ONLY | Grl.ResolutionFlags.IDLE_RELAY)
+
+ self._full_options: Grl.OperationOptions = Grl.OperationOptions()
+ self._full_options.set_type_filter(Grl.TypeFilter.AUDIO)
+ self._full_options.set_resolution_flags(
+ Grl.ResolutionFlags.FULL)
+
+ self._full_options_lprio = Grl.OperationOptions()
+ self._full_options_lprio.set_type_filter(Grl.TypeFilter.AUDIO)
+ self._full_options_lprio.set_resolution_flags(
+ Grl.ResolutionFlags.FULL | Grl.ResolutionFlags.IDLE_RELAY)
+
+ self._content_changed_id: int = 0
+ self.props.source = source
+
+ self._initial_songs_fill()
+ self._initial_albums_fill()
+ self._initial_artists_fill()
+
+ @GObject.Property(type=Grl.Source, default=None)
+ def source(self) -> Grl.Source:
+ return self._source
+
+ @source.setter # type: ignore
+ def source(self, new_source: Grl.Source):
+ """Set a new grilo tracker source
+
+ Everytime, the tracker plugin is loaded, a new source is
+ created. The source needs to be updated to get notifications.
+
+ :param Grl.Source new_source: new grilo tracker source
+ """
+ if self._content_changed_id != 0:
+ self._source.disconnect(self._content_changed_id)
+ self._content_changed_id = 0
+
+ self._source = new_source
+ self._source.notify_change_start()
+ self._content_changed_id = self._source.connect(
+ "content-changed", self._batch_content_changed)
+
+ def _batch_content_changed(
+ self, source: Grl.Source, medias: List[Grl.Media],
+ change_type: Grl.SourceChangeType, loc_unknown: bool) -> None:
+ if medias == []:
+ return
+
+ if change_type not in self._batch_changed_media_ids.keys():
+ self._batch_changed_media_ids[change_type] = []
+
+ # Remove notifications contain two events for the same file.
+ # One event as a file uri and the other one as a
+ # nie:InformationElement. Only the nie:InformationElement event
+ # needs to be kept because it is saved in the hash.
+ changed_medias = [
+ media.get_id() for media in medias
+ if ((media.is_audio() or media.is_container())
+ and media.get_id().startswith("urn:"))]
+ self._batch_changed_media_ids[change_type].extend(changed_medias)
+
+ if self._content_changed_timeout == 0:
+ self._content_changed_timeout = GLib.timeout_add(
+ 250, self._on_content_changed)
+
+ def _on_content_changed(self) -> bool:
+ for change_type in self._batch_changed_media_ids.keys():
+ media_ids: List[str] = self._batch_changed_media_ids[change_type]
+
+ # The Tracker indexed paths may differ from Music's paths.
+ # In that case Tracker will report it as 'changed', while
+ # it means 'added' to Music.
+ if (change_type == Grl.SourceChangeType.CHANGED
+ or change_type == Grl.SourceChangeType.ADDED):
+ self._log.debug(
+ "Added/Changed media(s): {}".format(media_ids))
+ self._changed_media(media_ids)
+ elif change_type == Grl.SourceChangeType.REMOVED:
+ self._log.debug(
+ "Removed media(s): {}".format(media_ids))
+ self._remove_media(media_ids)
+
+ self._check_album_change()
+ self._check_artist_change()
+ if self._tracker_playlists is not None:
+ self._tracker_playlists.check_smart_playlist_change()
+
+ self._batch_changed_media_ids = {}
+ self._content_changed_timeout = 0
+
+ return GLib.SOURCE_REMOVE
+
+ def _check_album_change(self) -> None:
+ album_ids: Dict[str, CoreAlbum] = {}
+
+ query = """
+ SELECT
+ ?type ?id ?title ?composer ?albumArtist
+ ?artist ?url ?publicationDate
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT
+ %(media_type)s AS ?type
+ ?album AS ?id
+ nie:title(?album) AS ?title
+ ?composer
+ ?albumArtist
+ nmm:artistName(?artist) AS ?artist
+ nie:isStoredAs(?song) AS ?url
+ YEAR(MAX(nie:contentCreated(?song)))
+ AS ?publicationDate
+ WHERE {
+ ?album a nmm:MusicAlbum .
+ ?song a nmm:MusicPiece ;
+ nmm:musicAlbum ?album ;
+ nmm:artist ?artist .
+ OPTIONAL { ?song nmm:composer/
+ nmm:artistName ?composer . }
+ OPTIONAL { ?album nmm:albumArtist/
+ nmm:artistName ?albumArtist . }
+ %(location_filter)s
+ } GROUP BY ?album
+ }
+ }
+ }
+ """.replace('\n', ' ').strip() % {
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ "media_type": int(Grl.MediaType.CONTAINER),
+ 'location_filter': self._tracker_wrapper.location_filter()
+ }
+
+ def check_album_cb(
+ source: Grl.Source, op_id: int, media: Optional[Grl.Media],
+ remaining: int, error: str) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ return
+
+ if not media:
+ changed_ids = set(
+ album_ids.keys()) ^ set(self._album_ids.keys())
+
+ self._log.debug(
+ "Albums changed ID's: {}".format(changed_ids))
+
+ for key in changed_ids:
+ if key in album_ids:
+ self._albums_model.append(album_ids[key])
+ elif key in self._album_ids:
+ for idx, corealbum in enumerate(self._albums_model):
+ if corealbum.media.get_id() == key:
+ self._albums_model.remove(idx)
+ break
+
+ self._album_ids = album_ids
+ return
+
+ if media.get_id() in self._album_ids.keys():
+ album = self._album_ids[media.get_id()]
+ else:
+ album = CoreAlbum(self._application, media)
+
+ album_ids[media.get_id()] = album
+
+ self.props.source.query(
+ query, self._METADATA_ALBUM_CHANGED_KEYS, self._fast_options,
+ check_album_cb)
+
+ def _check_artist_change(self) -> None:
+ artist_ids: Dict[str, CoreArtist] = {}
+
+ query = """
+ SELECT ?type ?id ?artist
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT
+ %(media_type)s AS ?type
+ (COALESCE(?album_artist, ?artist) AS ?id)
+ ?artist_bind AS ?artist
+ WHERE {
+ ?song a nmm:MusicPiece;
+ nmm:musicAlbum ?album;
+ nmm:artist ?artist .
+ OPTIONAL {
+ ?album a nmm:MusicAlbum;
+ nmm:albumArtist ?album_artist .
+ }
+ BIND(COALESCE(nmm:artistName(?album_artist),
+ nmm:artistName(?artist)) AS ?artist_bind)
+ %(location_filter)s
+ }
+ GROUP BY ?artist_bind
+ }
+ }
+ }
+ """.replace('\n', ' ').strip() % {
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ "media_type": int(Grl.MediaType.CONTAINER),
+ 'location_filter': self._tracker_wrapper.location_filter()
+ }
+
+ metadata_keys = [
+ Grl.METADATA_KEY_ALBUM_ARTIST,
+ Grl.METADATA_KEY_ARTIST,
+ Grl.METADATA_KEY_ID
+ ]
+
+ def check_artist_cb(
+ source: Grl.Source, op_id: int, media: Optional[Grl.Media],
+ remaining: int, error: Optional[GLib.Error]) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ return
+
+ if not media:
+ changed_ids = set(
+ artist_ids.keys()) ^ set(self._artist_ids.keys())
+ self._log.debug(
+ "Artists changed ID's: {}".format(changed_ids))
+
+ for key in changed_ids:
+ if key in artist_ids:
+ self._artists_model.append(artist_ids[key])
+ elif key in self._artist_ids:
+ for idx, coreartist in enumerate(self._artists_model):
+ if coreartist.media.get_id() == key:
+ self._artists_model.remove(idx)
+ break
+
+ self._artist_ids = artist_ids
+ return
+
+ if media.get_id() in self._artist_ids.keys():
+ artist = self._artist_ids[media.get_id()]
+ else:
+ artist = CoreArtist(self._application, media)
+
+ artist_ids[media.get_id()] = artist
+
+ self.props.source.query(
+ query, metadata_keys, self._fast_options, check_artist_cb)
+
+ def _remove_media(self, media_ids: List[str]) -> None:
+ for media_id in media_ids:
+ try:
+ coresong = self._hash.pop(media_id)
+ except KeyError:
+ self._log.warning("Removal KeyError.")
+ return
+
+ for idx, coresong_model in enumerate(self._songs_model):
+ if coresong_model is coresong:
+ self._log.debug("Removing: {}, {}".format(
+ coresong.props.media.get_id(), coresong.props.title))
+
+ self._songs_model.remove(idx)
+ break
+
+ def _song_media_query(self, ids: Optional[List[str]] = None) -> str:
+ """Returns a songs query string
+
+ :param list ids: List of Media ids to filter by or None
+ """
+ songs_filter = ""
+ if ids is not None:
+ media_ids = ", ".join([f"<{media_id}>" for media_id in ids])
+ songs_filter = f"FILTER ( ?song in ( {media_ids} ) )"
+
+ location_filter = self._tracker_wrapper.location_filter()
+ media_type = int(Grl.MediaType.AUDIO)
+ miner_fs_busname = self._tracker_wrapper.props.miner_fs_busname
+ query = " ".join(f"""
+ SELECT
+ ?type ?urn ?title ?id ?url
+ ?artist ?album
+ ?duration ?trackNumber
+ ?albumDiscNumber
+ nie:usageCounter(?urn) AS ?playCount
+ ?tag AS ?favorite
+ WHERE {{
+ SERVICE <dbus:{miner_fs_busname}> {{
+ GRAPH tracker:Audio {{
+ SELECT DISTINCT
+ {media_type} AS ?type
+ ?song AS ?urn
+ nie:title(?song) AS ?title
+ ?song AS ?id
+ nie:isStoredAs(?song) AS ?url
+ nmm:artistName(nmm:artist(?song)) AS ?artist
+ nie:title(nmm:musicAlbum(?song)) AS ?album
+ nfo:duration(?song) AS ?duration
+ nmm:trackNumber(?song) AS ?trackNumber
+ nmm:setNumber(nmm:musicAlbumDisc(?song))
+ AS ?albumDiscNumber
+ WHERE {{
+ ?song a nmm:MusicPiece .
+ {songs_filter}
+ {location_filter}
+ }}
+ }}
+ }}
+ OPTIONAL {{
+ ?urn nao:hasTag ?tag .
+ FILTER (?tag = nao:predefined-tag-favorite)
+ }}
+ }} ORDER BY ?title ?artist
+ """.split())
+
+ return query
+
+ def _changed_media(self, media_ids: List[str]) -> None:
+
+ def _update_changed_media(
+ source: Grl.Source, op_id: int, media: Optional[Grl.Media],
+ remaining: int, error: Optional[GLib.Error]) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ return
+
+ if not media:
+ self._remove_media(media_ids)
+ return
+
+ media_id: str = media.get_id()
+ if media_id not in self._hash:
+ song = CoreSong(self._application, media)
+ self._songs_model.append(song)
+ self._hash[media_id] = song
+ self._log.debug(
+ "Adding: {}, {}".format(media_id, song.props.title))
+ else:
+ self._hash[media_id].update(media)
+
+ media_ids.remove(media_id)
+
+ self.props.source.query(
+ self._song_media_query(media_ids),
+ self._METADATA_SONG_MEDIA_QUERY_KEYS, self._fast_options,
+ _update_changed_media)
+
+ def _initial_songs_fill(self) -> None:
+ self._notificationmanager.push_loading()
+ songs_added: List[int] = []
+
+ def _add_to_model(
+ source: Grl.Source, op_id: int, media: Optional[Grl.Media],
+ remaining: int, error: Optional[GLib.Error]) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ self._notificationmanager.pop_loading()
+ return
+
+ if not media:
+ self._songs_model.splice(
+ self._songs_model.get_n_items(), 0, songs_added)
+ self._notificationmanager.pop_loading()
+
+ # Initialize the playlists subwrapper after the initial
+ # songs model fill, the playlists expect a filled songs
+ # hashtable.
+ self._tracker_playlists = GrlTrackerPlaylists(
+ self.props.source, self._application,
+ self._tracker_wrapper, self._hash)
+
+ return
+
+ song = CoreSong(self._application, media)
+ songs_added.append(song)
+ self._hash[media.get_id()] = song
+ if len(songs_added) == self._SPLICE_SIZE:
+ self._songs_model.splice(
+ self._songs_model.get_n_items(), 0, songs_added)
+ songs_added.clear()
+
+ self.props.source.query(
+ self._song_media_query(), self._METADATA_SONG_FILL_KEYS,
+ self._fast_options, _add_to_model)
+
+ def _initial_albums_fill(self) -> None:
+ self._notificationmanager.push_loading()
+ albums_added: List[int] = []
+
+ def _add_to_albums_model(
+ source: Grl.Source, op_id: int, media: Optional[Grl.Media],
+ remaining: int, error: Optional[GLib.Error]) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ self._notificationmanager.pop_loading()
+ return
+
+ if not media:
+ self._albums_model.splice(
+ self._albums_model.get_n_items(), 0, albums_added)
+ self._notificationmanager.pop_loading()
+ return
+
+ album = CoreAlbum(self._application, media)
+ self._album_ids[media.get_id()] = album
+ albums_added.append(album)
+ if len(albums_added) == self._SPLICE_SIZE:
+ self._albums_model.splice(
+ self._albums_model.get_n_items(), 0, albums_added)
+ albums_added.clear()
+
+ query = """
+ SELECT
+ ?type ?id ?title ?composer ?albumArtist
+ ?artist ?url ?publicationDate
+ WHERE
+ {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT
+ %(media_type)s AS ?type
+ ?album AS ?id
+ nie:title(?album) AS ?title
+ ?composer
+ ?albumArtist
+ nmm:artistName(?artist) AS ?artist
+ nie:isStoredAs(?song) AS ?url
+ YEAR(MAX(nie:contentCreated(?song)))
+ AS ?publicationDate
+ WHERE
+ {
+ ?album a nmm:MusicAlbum .
+ ?song a nmm:MusicPiece ;
+ nmm:musicAlbum ?album ;
+ nmm:artist ?artist .
+ OPTIONAL { ?song nmm:composer/
+ nmm:artistName ?composer . }
+ OPTIONAL { ?album nmm:albumArtist/
+ nmm:artistName ?albumArtist . }
+ %(location_filter)s
+ }
+ GROUP BY ?album
+ ORDER BY ?title ?albumArtist ?artist ?publicationDate
+ }
+ }
+ }
+ """.replace('\n', ' ').strip() % {
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ "media_type": int(Grl.MediaType.CONTAINER),
+ 'location_filter': self._tracker_wrapper.location_filter()
+ }
+
+ self.props.source.query(
+ query, self._METADATA_ALBUM_CHANGED_KEYS, self._fast_options,
+ _add_to_albums_model)
+
+ def _initial_artists_fill(self) -> None:
+ self._notificationmanager.push_loading()
+ artists_added: List[int] = []
+
+ def _add_to_artists_model(
+ source: Grl.Source, op_id: int, media: Optional[Grl.Media],
+ remaining: int, error: Optional[GLib.Error]) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ self._notificationmanager.pop_loading()
+ return
+
+ if not media:
+ self._artists_model.splice(
+ self._artists_model.get_n_items(), 0, artists_added)
+ self._notificationmanager.pop_loading()
+ return
+
+ artist = CoreArtist(self._application, media)
+ self._artist_ids[media.get_id()] = artist
+ artists_added.append(artist)
+ if len(artists_added) == self._SPLICE_SIZE:
+ self._artists_model.splice(
+ self._artists_model.get_n_items(), 0, artists_added)
+ artists_added.clear()
+
+ query = """
+ SELECT ?type ?id ?artist
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT
+ %(media_type)s AS ?type
+ (COALESCE(?album_artist, ?artist) AS ?id)
+ ?artist_bind AS ?artist
+ WHERE {
+ ?song a nmm:MusicPiece;
+ nmm:musicAlbum ?album;
+ nmm:artist ?artist .
+ OPTIONAL {
+ ?album a nmm:MusicAlbum;
+ nmm:albumArtist ?album_artist .
+ }
+ BIND(COALESCE(nmm:artistName(?album_artist),
+ nmm:artistName(?artist)) AS ?artist_bind)
+ %(location_filter)s
+ }
+ GROUP BY ?artist_bind
+ ORDER BY ?artist_bind
+ }
+ }
+ }
+ """.replace('\n', ' ').strip() % {
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ "media_type": int(Grl.MediaType.CONTAINER),
+ 'location_filter': self._tracker_wrapper.location_filter()
+ }
+
+ metadata_keys: List[int] = [
+ Grl.METADATA_KEY_ARTIST,
+ Grl.METADATA_KEY_ID
+ ]
+
+ self.props.source.query(
+ query, metadata_keys, self._fast_options, _add_to_artists_model)
+
+ def get_artist_albums(
+ self, media: Grl.Source, model: Gtk.FilterListModel) -> None:
+ """Get all albums by an artist
+
+ :param Grl.Media media: The media with the artist id
+ :param Gtk.FilterListModel model: The model to fill
+ """
+ self._notificationmanager.push_loading()
+ artist_id = media.get_id()
+
+ query = """
+ SELECT
+ ?type ?id ?title ?publicationDate
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT DISTINCT
+ %(media_type)s AS ?type
+ ?album AS ?id
+ nie:title(?album) AS ?title
+ nie:contentCreated(?song) AS ?publicationDate
+ WHERE {
+ ?album a nmm:MusicAlbum .
+ OPTIONAL { ?album nmm:albumArtist ?album_artist . }
+ ?song a nmm:MusicPiece;
+ nmm:musicAlbum ?album;
+ nmm:artist ?artist .
+ FILTER ( ?album_artist = <%(artist_id)s>
+ || ?artist = <%(artist_id)s> )
+ %(location_filter)s
+ }
+ GROUP BY ?album
+ ORDER BY ?publicationDate ?album
+ }
+ }
+ }
+ """.replace('\n', ' ').strip() % {
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ "media_type": int(Grl.MediaType.CONTAINER),
+ "artist_id": artist_id,
+ 'location_filter': self._tracker_wrapper.location_filter()
+ }
+
+ albums: List[str] = []
+
+ def query_cb(
+ source: Grl.Source, op_id: int, media: Optional[Grl.Media],
+ remaining: int, error: Optional[GLib.Error]) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ self._notificationmanager.pop_loading()
+ return
+
+ if not media:
+ custom_filter = Gtk.CustomFilter()
+ custom_filter.set_filter_func(albums_filter, albums)
+ model.set_filter(custom_filter)
+ self._notificationmanager.pop_loading()
+ return
+
+ albums.append(media.get_id())
+
+ def albums_filter(corealbum: CoreAlbum, albums: List[str]) -> bool:
+ return corealbum.props.media.get_id() in albums
+
+ self.props.source.query(
+ query, [Grl.METADATA_KEY_TITLE], self._fast_options, query_cb)
+
+ def get_album_discs(
+ self, media: Grl.Media, disc_model: Gtk.SortListModel) -> None:
+ """Get all discs of an album
+
+ :param Grl.Media media: The media with the album id
+ :param Gtk.SortListModel disc_model: The model to fill
+ """
+ self._notificationmanager.push_loading()
+ album_id = media.get_id()
+
+ query = """
+ SELECT
+ ?type ?id ?albumDiscNumber
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT DISTINCT
+ %(media_type)s AS ?type
+ ?album AS ?id
+ nmm:setNumber(nmm:musicAlbumDisc(?song))
+ AS ?albumDiscNumber
+ WHERE {
+ ?song a nmm:MusicPiece;
+ nmm:musicAlbum ?album .
+ FILTER ( ?album = <%(album_id)s> )
+ %(location_filter)s
+ }
+ ORDER BY ?albumDiscNumber
+ }
+ }
+ }
+ """.replace('\n', ' ').strip() % {
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ "media_type": int(Grl.MediaType.CONTAINER),
+ "album_id": album_id,
+ 'location_filter': self._tracker_wrapper.location_filter()
+ }
+
+ def _disc_nr_cb(
+ source: Grl.Source, op_id: int, media: Optional[Grl.Media],
+ remaining: int, error: Optional[GLib.Error]) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ self._notificationmanager.pop_loading()
+ return
+
+ if not media:
+ self._notificationmanager.pop_loading()
+ return
+
+ disc_nr = media.get_album_disc_number()
+ coredisc = CoreDisc(self._application, media, disc_nr)
+ disc_model.append(coredisc)
+
+ self.props.source.query(
+ query, [Grl.METADATA_KEY_ALBUM_DISC_NUMBER], self._fast_options,
+ _disc_nr_cb)
+
+ def get_album_disc(
+ self, media: Grl.Media, disc_nr: int,
+ model: Gtk.FilterListModel) -> None:
+ """Get all songs of an album disc
+
+ :param Grl.Media media: The media with the album id
+ :param int disc_nr: The disc number
+ :param Gtk.FilterListModel model: The model to fill
+ """
+ album_id = media.get_id()
+
+ query = """
+ SELECT
+ ?type ?id ?url ?title
+ ?artist ?album
+ ?duration ?trackNumber ?albumDiscNumber
+ ?publicationDate
+ nie:usageCounter(?id) AS ?playCount
+ ?tag AS ?favorite
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT DISTINCT
+ %(media_type)s AS ?type
+ ?song AS ?id
+ nie:isStoredAs(?song) AS ?url
+ nie:title(?song) AS ?title
+ nmm:artistName(nmm:artist(?song)) AS ?artist
+ nie:title(nmm:musicAlbum(?song)) AS ?album
+ nfo:duration(?song) AS ?duration
+ nmm:trackNumber(?song) AS ?trackNumber
+ nmm:setNumber(nmm:musicAlbumDisc(?song))
+ AS ?albumDiscNumber
+ YEAR(?date) AS ?publicationDate
+ WHERE {
+ ?song a nmm:MusicPiece ;
+ nmm:musicAlbum ?album .
+ OPTIONAL { ?song nie:contentCreated ?date . }
+ FILTER (
+ ?album = <%(album_id)s> &&
+ nmm:setNumber(nmm:musicAlbumDisc(?song)) =
+ %(disc_nr)s
+ )
+ %(location_filter)s
+ }
+ ORDER BY ?trackNumber
+ }
+ }
+ OPTIONAL {
+ ?id nao:hasTag ?tag .
+ FILTER (?tag = nao:predefined-tag-favorite)
+ }
+ }
+ """.replace('\n', ' ').strip() % {
+ "media_type": int(Grl.MediaType.AUDIO),
+ 'album_id': album_id,
+ 'disc_nr': disc_nr,
+ 'location_filter': self._tracker_wrapper.location_filter(),
+ 'miner_fs_busname': self._tracker_wrapper.props.miner_fs_busname
+ }
+
+ metadata_keys: List[int] = [
+ Grl.METADATA_KEY_ALBUM,
+ Grl.METADATA_KEY_ALBUM_DISC_NUMBER,
+ Grl.METADATA_KEY_ARTIST,
+ Grl.METADATA_KEY_DURATION,
+ Grl.METADATA_KEY_FAVOURITE,
+ Grl.METADATA_KEY_ID,
+ Grl.METADATA_KEY_PLAY_COUNT,
+ Grl.METADATA_KEY_TITLE,
+ Grl.METADATA_KEY_URL
+ ]
+
+ disc_song_ids: List[str] = []
+
+ def _filter_func(coresong: CoreSong) -> bool:
+ return coresong.props.grlid in disc_song_ids
+
+ def _callback(
+ source: Grl.Source, op_id: int, media: Grl.Media,
+ remaining: int, error: GLib.Error) -> None:
+ if error:
+ self._log.warning(f"Error: {error.domain}, {error.message}")
+ return
+
+ if media is None:
+ custom_filter = Gtk.CustomFilter()
+ custom_filter.set_filter_func(_filter_func)
+ model.set_filter(custom_filter)
+ return
+
+ disc_song_ids.append(media.get_source() + media.get_id())
+
+ self.props.source.query(
+ query, metadata_keys, self._fast_options, _callback)
+
+ def search(self, text: str) -> None:
+ # FIXME: Searches are limited to not bog down the UI with
+ # widget creation ({List,Flow}Box limitations). The limit is
+ # arbitrarily set to 50 and set in the Tracker query. It should
+ # be possible to set it through Grilo options instead. This
+ # does not work as expected and needs further investigation.
+ term: str = Tracker.sparql_escape_string(
+ GLib.utf8_normalize(
+ GLib.utf8_casefold(text, -1), -1, GLib.NormalizeMode.NFKD))
+
+ # Artist search
+ self._notificationmanager.push_loading()
+
+ query = """
+ SELECT
+ ?type ?id
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT DISTINCT
+ %(media_type)s AS ?type
+ COALESCE(?album_artist, ?artist) AS ?id
+ WHERE {
+ ?song a nmm:MusicPiece ;
+ nmm:musicAlbum ?album ;
+ nmm:artist ?artist .
+ OPTIONAL {
+ ?album a nmm:MusicAlbum ;
+ nmm:albumArtist ?album_artist .
+ }
+ BIND(COALESCE(nmm:artistName(?album_artist),
+ nmm:artistName(?artist)) AS ?artist_bind)
+ BIND(tracker:normalize(nmm:artistName(
+ nmm:albumArtist(?artist_bind)), 'nfkd')
+ AS ?match1) .
+ BIND(tracker:normalize(
+ nmm:artistName(nmm:artist(?song)), 'nfkd')
+ AS ?match2) .
+ BIND(tracker:normalize(nmm:composer(?song), 'nfkd')
+ AS ?match4) .
+ FILTER (
+ CONTAINS(tracker:case-fold(
+ tracker:unaccent(?match1)), "%(name)s")
+ || CONTAINS(tracker:case-fold(?match1), "%(name)s")
+ || CONTAINS(tracker:case-fold(
+ tracker:unaccent(?match2)), "%(name)s")
+ || CONTAINS(tracker:case-fold(?match2), "%(name)s")
+ || CONTAINS(tracker:case-fold(
+ tracker:unaccent(?match4)), "%(name)s")
+ || CONTAINS(tracker:case-fold(?match4), "%(name)s")
+ )
+ %(location_filter)s
+ }
+ LIMIT 50
+ }
+ }
+ }
+ """.replace('\n', ' ').strip() % {
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ "media_type": int(Grl.MediaType.AUDIO),
+ 'location_filter': self._tracker_wrapper.location_filter(),
+ 'name': term
+ }
+
+ artist_filter_ids: List[str] = []
+
+ def artist_filter(coreartist: CoreArtist) -> bool:
+ return coreartist.media.get_id() in artist_filter_ids
+
+ def artist_search_cb(
+ source: Grl.Source, op_id: int, media: Optional[Grl.Media],
+ remaining: int, error: Optional[GLib.Error]) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ self._notificationmanager.pop_loading()
+ return
+
+ if not media:
+ custom_filter = Gtk.CustomFilter()
+ custom_filter.set_filter_func(artist_filter)
+ self._artists_search.set_filter(custom_filter)
+ self._notificationmanager.pop_loading()
+ return
+
+ artist_filter_ids.append(media.get_id())
+
+ self.props.source.query(
+ query, [Grl.METADATA_KEY_ID], self._fast_options, artist_search_cb)
+
+ # Album search
+ self._notificationmanager.push_loading()
+
+ query = """
+ SELECT
+ ?type ?id
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT DISTINCT
+ %(media_type)s AS ?type
+ nmm:musicAlbum(?song) AS ?id
+ WHERE {
+ ?song a nmm:MusicPiece .
+ BIND(tracker:normalize(
+ nie:title(nmm:musicAlbum(?song)), 'nfkd')
+ AS ?match1) .
+ BIND(tracker:normalize(
+ nmm:artistName(nmm:artist(?song)), 'nfkd')
+ AS ?match2) .
+ BIND(tracker:normalize(nmm:composer(?song), 'nfkd')
+ AS ?match4) .
+ FILTER (
+ CONTAINS(tracker:case-fold(
+ tracker:unaccent(?match1)), "%(name)s")
+ || CONTAINS(tracker:case-fold(?match1), "%(name)s")
+ || CONTAINS(tracker:case-fold(
+ tracker:unaccent(?match2)), "%(name)s")
+ || CONTAINS(tracker:case-fold(?match2), "%(name)s")
+ || CONTAINS(tracker:case-fold(
+ tracker:unaccent(?match4)), "%(name)s")
+ || CONTAINS(tracker:case-fold(?match4), "%(name)s")
+ )
+ %(location_filter)s
+ }
+ LIMIT 50
+ }
+ }
+ }
+ """.replace('\n', ' ').strip() % {
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ "media_type": int(Grl.MediaType.CONTAINER),
+ 'location_filter': self._tracker_wrapper.location_filter(),
+ 'name': term
+ }
+
+ album_filter_ids: List[str] = []
+
+ def album_filter(corealbum: CoreAlbum) -> bool:
+ return corealbum.media.get_id() in album_filter_ids
+
+ def albums_search_cb(
+ source: Grl.Source, op_id: int, media: Optional[Grl.Media],
+ remaining: int, error: Optional[GLib.Error]) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ self._notificationmanager.pop_loading()
+ return
+
+ if not media:
+ custom_filter = Gtk.CustomFilter()
+ custom_filter.set_filter_func(album_filter)
+ self._albums_search.set_filter(custom_filter)
+ self._notificationmanager.pop_loading()
+ return
+
+ album_filter_ids.append(media.get_id())
+
+ self.props.source.query(
+ query, [Grl.METADATA_KEY_ID], self._fast_options, albums_search_cb)
+
+ # Song search
+ self._notificationmanager.push_loading()
+
+ query = """
+ SELECT
+ ?type ?id
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT DISTINCT
+ %(media_type)s AS ?type
+ ?song AS ?id
+ WHERE {
+ ?song a nmm:MusicPiece .
+ BIND(tracker:normalize(
+ nie:title(nmm:musicAlbum(?song)), 'nfkd')
+ AS ?match1) .
+ BIND(tracker:normalize(
+ nmm:artistName(nmm:artist(?song)), 'nfkd')
+ AS ?match2) .
+ BIND(tracker:normalize(
+ nie:title(?song), 'nfkd') AS ?match3) .
+ BIND(tracker:normalize(nmm:composer(?song), 'nfkd')
+ AS ?match4) .
+ FILTER (
+ CONTAINS(tracker:case-fold(
+ tracker:unaccent(?match1)), "%(name)s")
+ || CONTAINS(tracker:case-fold(?match1), "%(name)s")
+ || CONTAINS(tracker:case-fold(
+ tracker:unaccent(?match2)), "%(name)s")
+ || CONTAINS(tracker:case-fold(?match2), "%(name)s")
+ || CONTAINS(tracker:case-fold(
+ tracker:unaccent(?match3)), "%(name)s")
+ || CONTAINS(tracker:case-fold(?match3), "%(name)s")
+ || CONTAINS(tracker:case-fold(
+ tracker:unaccent(?match4)), "%(name)s")
+ || CONTAINS(tracker:case-fold(?match4), "%(name)s")
+ )
+ %(location_filter)s
+ }
+ LIMIT 50
+ }
+ }
+ }
+ """.replace('\n', ' ').strip() % {
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ "media_type": int(Grl.MediaType.AUDIO),
+ 'location_filter': self._tracker_wrapper.location_filter(),
+ 'name': term
+ }
+
+ filter_ids: List[str] = []
+
+ def songs_filter(coresong: CoreSong) -> bool:
+ return coresong.media.get_id() in filter_ids
+
+ def songs_search_cb(
+ source: Grl.Source, op_id: int, media: Optional[Grl.Media],
+ remaining: int, error: Optional[GLib.Error]) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ self._notificationmanager.pop_loading()
+ return
+
+ if not media:
+ custom_filter = Gtk.CustomFilter()
+ custom_filter.set_filter_func(songs_filter)
+ self._songs_search.set_filter(custom_filter)
+ self._notificationmanager.pop_loading()
+ return
+
+ filter_ids.append(media.get_id())
+
+ self.props.source.query(
+ query, [Grl.METADATA_KEY_ID], self._fast_options, songs_search_cb)
+
+ def _get_album_for_media_id_query(
+ self, media_id: str, song: bool = True) -> str:
+ # Even though we check for the album_artist, we fill
+ # the artist key, since Grilo coverart plugins use
+ # only that key for retrieval.
+
+ if song:
+ filter_clause = "?song = <{}>".format(str(media_id))
+ else:
+ filter_clause = "?album = <{}>".format(str(media_id))
+
+ query = """
+ SELECT
+ ?type ?id ?mbReleaseGroup ?mbRelease ?artist ?album
+ WHERE {
+ SERVICE <dbus:%(miner_fs_busname)s> {
+ GRAPH tracker:Audio {
+ SELECT DISTINCT
+ %(media_type)s AS ?type
+ ?album AS ?id
+ tracker:referenceIdentifier(?release_group_id)
+ AS ?mbReleaseGroup
+ tracker:referenceIdentifier(?release_id) AS ?mbRelease
+ tracker:coalesce(nmm:artistName(?album_artist),
+ nmm:artistName(?song_artist))
+ AS ?artist
+ nie:title(?album) AS ?album
+ WHERE {
+ ?album a nmm:MusicAlbum .
+ ?song a nmm:MusicPiece ;
+ nmm:musicAlbum ?album ;
+ nmm:artist ?song_artist .
+ OPTIONAL {
+ ?album tracker:hasExternalReference
+ ?release_group_id .
+ ?release_group_id tracker:referenceSource
+ "https://musicbrainz.org/doc/Release_Group" .
+ }
+ OPTIONAL {
+ ?album tracker:hasExternalReference ?release_id .
+ ?release_id tracker:referenceSource
+ "https://musicbrainz.org/doc/Release" .
+ }
+ OPTIONAL { ?album nmm:albumArtist ?album_artist . }
+ FILTER (
+ %(filter_clause)s
+ )
+ %(location_filter)s
+ }
+ }
+ }
+ }
+ """.replace("\n", " ").strip() % {
+ "miner_fs_busname": self._tracker_wrapper.props.miner_fs_busname,
+ "media_type": int(Grl.MediaType.CONTAINER),
+ "filter_clause": filter_clause,
+ "location_filter": self._tracker_wrapper.location_filter()
+ }
+
+ return query
+
+ def get_song_art(self, coresong: CoreSong, storeart: StoreArt) -> None:
+ """Retrieve song art for the given CoreSong
+
+ Since MediaArt does not really support per-song art this
+ uses the songs album information as base to retrieve relevant
+ art and store it.
+
+ :param CoreSong coresong: CoreSong to get art for
+ :param StoreArt storeart: StoreArt instance to use
+ """
+ media: Grl.Media = coresong.props.media
+
+ # If there is no album and artist do not go through with the
+ # query, it will not give any results.
+ if (media.get_album() is None
+ and (media.get_album_artist() is None
+ or media.get_artist() is None)):
+ return
+
+ def art_retrieved_cb(
+ source: Grl.Source, op_id: int,
+ queried_media: Optional[Grl.Media], remaining: int,
+ error: Optional[GLib.Error]) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ self.emit("finished")
+ return
+
+ if queried_media is None:
+ return
+
+ self._async_queue.queue(
+ storeart, coresong, queried_media.get_thumbnail(),
+ CoreObjectType.SONG)
+
+ song_id: str = media.get_id()
+ query: str = self._get_album_for_media_id_query(song_id)
+
+ self.props.source.query(
+ query, self._METADATA_THUMBNAIL_KEYS, self._full_options_lprio,
+ art_retrieved_cb)
+
+ def get_album_art(self, corealbum: CoreAlbum, storeart: StoreArt) -> None:
+ """Retrieve album art for the given CoreAlbum
+
+ :param CoreAlbum corealbum: CoreAlbum to get art for
+ :param StoreArt storeart: StoreArt instance to use
+ """
+ media: Grl.Media = corealbum.props.media
+
+ def art_retrieved_cb(
+ source: Grl.Source, op_id: int,
+ queried_media: Optional[Grl.Media], remaining: int,
+ error: Optional[GLib.Error]) -> None:
+ if error:
+ self._log.warning("Error: {}".format(error))
+ storeart.emit("finished")
+ return
+
+ if queried_media is None:
+ return
+
+ self._async_queue.queue(
+ storeart, corealbum, queried_media.get_thumbnail(),
+ CoreObjectType.ALBUM)
+
+ album_id: str = media.get_id()
+ query: str = self._get_album_for_media_id_query(album_id, False)
+
+ self.props.source.query(
+ query, self._METADATA_THUMBNAIL_KEYS, self._full_options_lprio,
+ art_retrieved_cb)
+
+ def get_artist_art(
+ self, coreartist: CoreArtist, storeart: StoreArt) -> None:
+ """Retrieve artist art for the given CoreArtist
+
+ This retrieves art through Grilo online services only.
+
+ :param CoreArtist coreartist: CoreArtist to get art for
+ :param StoreArt storeart: StoreArt instance to use
+ """
+ media: Grl.Media = coreartist.props.media
+
+ def art_resolved_cb(
+ source: Grl.Source, op_id: int,
+ resolved_media: Optional[Grl.Media],
+ error: Optional[GLib.Error]) -> None:
+ if error:
+ storeart.emit("finished")
+ self._log.warning("Error: {}".format(error))
+ return
+
+ if resolved_media is None:
+ storeart.emit("finished")
+ return
+
+ thumbnail = resolved_media.get_thumbnail()
+ if thumbnail is None:
+ storeart.emit("finished")
+ return
+
+ self._async_queue.queue(
+ storeart, coreartist, resolved_media.get_thumbnail(),
+ CoreObjectType.ARTIST)
+
+ self.props.source.resolve(
+ media, [Grl.METADATA_KEY_THUMBNAIL], self._full_options_lprio,
+ art_resolved_cb)
+
+ def stage_playlist_deletion(self, playlist: Optional[Playlist]) -> None:
+ """Prepares playlist deletion.
+
+ :param Playlist playlist: playlist
+ """
+ if self._tracker_playlists is None:
+ return
+
+ self._tracker_playlists.stage_playlist_deletion(playlist)
+
+ def finish_playlist_deletion(
+ self, playlist: Optional[Playlist], deleted: bool) -> None:
+ """Finishes playlist deletion.
+
+ :param Playlist playlist: playlist
+ :param bool deleted: indicates if the playlist has been deleted
+ """
+ if self._tracker_playlists is None:
+ return
+
+ self._tracker_playlists.finish_playlist_deletion(playlist, deleted)
+
+ def create_playlist(
+ self, playlist_title: str,
+ callback: Callable[[Playlist], None]) -> None:
+ """Creates a new user playlist.
+
+ :param str playlist_title: playlist title
+ :param callback: function to perform once, the playlist is created
+ """
+ if self._tracker_playlists is None:
+ return
+
+ self._tracker_playlists.create_playlist(playlist_title, callback)
diff --git a/gnomemusic/gstplayer.py b/gnomemusic/gstplayer.py
new file mode 100644
index 00000000..aaff3ed4
--- /dev/null
+++ b/gnomemusic/gstplayer.py
@@ -0,0 +1,431 @@
+# Copyright © 2018 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from typing import List, Optional
+from enum import IntEnum
+import typing
+
+from gettext import gettext as _, ngettext
+import gi
+gi.require_version('Gst', '1.0')
+gi.require_version('GstPbutils', '1.0')
+from gi.repository import GLib, Gtk, Gio, GObject, Gst, GstPbutils
+
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+
+
+class Playback(IntEnum):
+ """Playback status enumerator"""
+ STOPPED = 0
+ LOADING = 1
+ PAUSED = 2
+ PLAYING = 3
+
+
+class GstPlayer(GObject.GObject):
+ """Contains GStreamer logic for Player
+
+ Handles GStreamer interaction for Player and SmoothScale.
+ """
+ __gsignals__ = {
+ "about-to-finish": (GObject.SignalFlags.RUN_FIRST, None, ()),
+ "clock-tick": (GObject.SignalFlags.RUN_FIRST, None, (int, )),
+ 'eos': (GObject.SignalFlags.RUN_FIRST, None, ()),
+ "error": (GObject.SignalFlags.RUN_FIRST, None, ()),
+ 'seek-finished': (GObject.SignalFlags.RUN_FIRST, None, ()),
+ "stream-start": (GObject.SignalFlags.RUN_FIRST, None, ())
+ }
+
+ def __init__(self, application: Application) -> None:
+ """Initialize the GStreamer player
+
+ :param Application application: Application object
+ """
+ super().__init__()
+
+ Gst.init(None)
+
+ self._application = application
+ self._duration = -1.
+ self._log = application.props.log
+ self._seek = False
+ self._tick = 0
+
+ self._clock_id = 0
+ self._clock: Optional[Gst.Clock] = None
+
+ self._missing_plugin_messages: List[Gst.Message] = []
+ self._settings = application.props.settings
+
+ self._player = Gst.ElementFactory.make('playbin3', 'player')
+ self._bus = self._player.get_bus()
+ self._bus.add_signal_watch()
+ self._setup_replaygain()
+
+ self._settings.connect(
+ 'changed::replaygain', self._on_replaygain_setting_changed)
+ self._on_replaygain_setting_changed(
+ None, self._settings.get_value('replaygain'))
+
+ self._bus.connect('message::async-done', self._on_async_done)
+ self._bus.connect('message::error', self._on_bus_error)
+ self._bus.connect('message::element', self._on_bus_element)
+ self._bus.connect('message::eos', self._on_bus_eos)
+ self._bus.connect('message::new-clock', self._on_new_clock)
+ self._bus.connect("message::state-changed", self._on_state_changed)
+ self._bus.connect("message::stream-start", self._on_bus_stream_start)
+
+ self._player.connect("about-to-finish", self._on_about_to_finish)
+
+ self._state = Playback.STOPPED
+
+ def _setup_replaygain(self):
+ """Set up replaygain"""
+ self._rg_volume = Gst.ElementFactory.make("rgvolume", "rg volume")
+ self._rg_limiter = Gst.ElementFactory.make("rglimiter", "rg limiter")
+
+ self._filter_bin = Gst.ElementFactory.make("bin", "filter bin")
+ self._filter_bin.add(self._rg_volume)
+ self._filter_bin.add(self._rg_limiter)
+ self._rg_volume.link(self._rg_limiter)
+
+ pad_src = self._rg_limiter.get_static_pad('src')
+ ghost_src = Gst.GhostPad.new('src', pad_src)
+ self._filter_bin.add_pad(ghost_src)
+
+ pad_sink = self._rg_volume.get_static_pad('sink')
+ ghost_sink = Gst.GhostPad.new('sink', pad_sink)
+ self._filter_bin.add_pad(ghost_sink)
+
+ if (not self._filter_bin
+ or not self._rg_volume
+ or not self._rg_limiter):
+ self._log.message("Replay Gain is not available")
+ return
+
+ def _on_replaygain_setting_changed(self, settings, value):
+ if value:
+ self._player.set_property("audio-filter", self._filter_bin)
+ else:
+ self._player.set_property("audio-filter", None)
+
+ def _on_about_to_finish(self, klass):
+ self.emit("about-to-finish")
+
+ def _on_async_done(self, bus, message):
+ if self._seek:
+ self._seek = False
+ self.emit("seek-finished")
+
+ def _query_duration(self):
+ success, duration = self._player.query_duration(
+ Gst.Format.TIME)
+
+ if success:
+ self.props.duration = duration / Gst.SECOND
+ else:
+ self.props.duration = duration
+
+ def _create_clock_tick(self):
+ if self._clock_id > 0:
+ return
+
+ self._clock_id = self._clock.new_periodic_id(
+ self._clock.get_time(), 1 * Gst.SECOND)
+ self._clock.id_wait_async(self._clock_id, self._on_clock_tick, None)
+
+ def _destroy_clock_tick(self) -> None:
+ if (self._clock_id > 0
+ and self._clock is not None):
+ self._clock.id_unschedule(self._clock_id)
+ self._clock_id = 0
+
+ def _on_new_clock(self, bus, message):
+ self._clock_id = 0
+ self._clock = message.parse_new_clock()
+ self._create_clock_tick()
+
+ def _on_clock_tick(self, clock, time, id, data):
+ self.emit("clock-tick", self._tick)
+ self._tick += 1
+
+ def _on_bus_element(self, bus, message):
+ if GstPbutils.is_missing_plugin_message(message):
+ self._missing_plugin_messages.append(message)
+
+ def _on_bus_stream_start(self, bus, message):
+ def delayed_query():
+ self._query_duration()
+ self._tick = 0
+ self.emit("stream-start")
+
+ # Delay the signalling slightly or the new duration will not
+ # have been set yet.
+ GLib.timeout_add(1, delayed_query)
+
+ def _on_state_changed(self, bus, message):
+ if message.src != self._player:
+ return
+
+ old_state, new_state, _ = message.parse_state_changed()
+ self._log.debug(
+ "Player state changed: {} -> {}".format(old_state, new_state))
+
+ if new_state == Gst.State.PAUSED:
+ self._state = Playback.PAUSED
+ self._destroy_clock_tick()
+ elif new_state == Gst.State.PLAYING:
+ self._state = Playback.PLAYING
+ self._create_clock_tick()
+ elif new_state == Gst.State.READY:
+ self._state = Playback.LOADING
+ else:
+ self._state = Playback.STOPPED
+
+ self.notify("state")
+
+ def _on_bus_error(self, bus, message):
+ if self._is_missing_plugin_message(message):
+ self.props.state = Playback.PAUSED
+ self._handle_missing_plugins()
+ return True
+
+ error, debug = message.parse_error()
+ debug = debug.split('\n')
+ debug = [(' ') + line.lstrip() for line in debug]
+ debug = '\n'.join(debug)
+ self._log.warning("URI: {}".format(self.props.url))
+ self._log.warning(
+ "Error from element {}: {}".format(
+ message.src.get_name(), error.message))
+ self._log.warning("Debugging info:\n{}".format(debug))
+
+ self.emit("error")
+ return True
+
+ def _on_bus_eos(self, bus, message):
+ self.emit('eos')
+
+ @GObject.Property(
+ type=int, flags=GObject.ParamFlags.READWRITE
+ | GObject.ParamFlags.EXPLICIT_NOTIFY)
+ def state(self):
+ """Current state of the player
+
+ :return: state
+ :rtype: Playback (enum)
+ """
+ return self._state
+
+ @state.setter # type: ignore
+ def state(self, state):
+ """Set state of the player
+
+ :param Playback state: The state to set
+ """
+ if state == Playback.PAUSED:
+ self._player.set_state(Gst.State.PAUSED)
+ if state == Playback.STOPPED:
+ # Changing the state to NULL flushes the pipeline.
+ # Thus, the change message never arrives.
+ self._player.set_state(Gst.State.NULL)
+ self._state = Playback.STOPPED
+ self.notify("state")
+ self._destroy_clock_tick()
+ if state == Playback.LOADING:
+ self._player.set_state(Gst.State.READY)
+ if state == Playback.PLAYING:
+ self._player.set_state(Gst.State.PLAYING)
+
+ @GObject.Property
+ def url(self):
+ """Current url loaded
+
+ :return: url
+ :rtype: string
+ """
+ return self._player.props.current_uri
+
+ @url.setter # type: ignore
+ def url(self, url_):
+ """url to load next
+
+ :param string url: url to load
+ """
+ self._player.set_property('uri', url_)
+
+ @GObject.Property
+ def position(self):
+ """Current player position
+
+ Player position in seconds
+ :return: position
+ :rtype: float
+ """
+ position = self._player.query_position(Gst.Format.TIME)[1] / Gst.SECOND
+
+ return position
+
+ @GObject.Property(type=float)
+ def duration(self):
+ """Total duration of current media
+
+ Total duration in seconds or -1. if not available
+ :return: duration
+ :rtype: float
+ """
+ if self.props.state == Playback.STOPPED:
+ return -1.
+
+ return self._duration
+
+ # Setter provided to trigger a property signal.
+ # For internal use only.
+ @duration.setter # type: ignore
+ def duration(self, duration):
+ """Set duration of current media (internal)
+
+ For internal use only.
+ """
+ self._duration = duration
+
+ def seek(self, seconds):
+ """Seek to position
+
+ :param float seconds: Position in seconds to seek
+ """
+ self._seek = self._player.seek_simple(
+ Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT,
+ seconds * Gst.SECOND)
+
+ def _start_plugin_installation(
+ self, missing_plugin_messages, confirm_search):
+ install_ctx = GstPbutils.InstallPluginsContext.new()
+ application_id = self._application.props.application_id
+ install_ctx.set_desktop_id(application_id + '.desktop')
+ install_ctx.set_confirm_search(confirm_search)
+
+ startup_id = "_TIME{}".format(Gtk.get_current_event_time())
+ install_ctx.set_startup_notification_id(startup_id)
+
+ installer_details = []
+ get_details = GstPbutils.missing_plugin_message_get_installer_detail
+ for message in missing_plugin_messages:
+ installer_detail = get_details(message)
+ installer_details.append(installer_detail)
+
+ def on_install_done(res):
+ # We get the callback too soon, before the installation has
+ # actually finished. Do nothing for now.
+ pass
+
+ GstPbutils.install_plugins_async(
+ installer_details, install_ctx, on_install_done)
+
+ def _show_codec_confirmation_dialog(
+ self, install_helper_name, missing_plugin_messages):
+ active_window = self._application.props.active_window
+ dialog = MissingCodecsDialog(active_window, install_helper_name)
+
+ def on_dialog_response(dialog, response_type):
+ if response_type == Gtk.ResponseType.ACCEPT:
+ self._start_plugin_installation(missing_plugin_messages, False)
+
+ dialog.destroy()
+
+ descriptions = []
+ get_description = GstPbutils.missing_plugin_message_get_description
+ for message in missing_plugin_messages:
+ description = get_description(message)
+ descriptions.append(description)
+
+ dialog.set_codec_names(descriptions)
+ dialog.connect('response', on_dialog_response)
+ dialog.present()
+
+ def _handle_missing_plugins(self):
+ if not self._missing_plugin_messages:
+ return
+
+ missing_plugin_messages = self._missing_plugin_messages
+ self._missing_plugin_messages = []
+
+ proxy = Gio.DBusProxy.new_sync(
+ Gio.bus_get_sync(Gio.BusType.SESSION, None),
+ Gio.DBusProxyFlags.NONE, None, 'org.freedesktop.PackageKit',
+ '/org/freedesktop/PackageKit',
+ 'org.freedesktop.PackageKit.Modify2', None)
+ prop = Gio.DBusProxy.get_cached_property(proxy, 'DisplayName')
+ if prop:
+ display_name = prop.get_string()
+ if display_name:
+ self._show_codec_confirmation_dialog(
+ display_name, missing_plugin_messages)
+ return
+
+ # If the above failed, fall back to immediately starting the
+ # codec installation.
+ self._start_plugin_installation(missing_plugin_messages, True)
+
+ def _is_missing_plugin_message(self, message):
+ error, debug = message.parse_error()
+
+ if error.matches(Gst.CoreError.quark(), Gst.CoreError.MISSING_PLUGIN):
+ return True
+
+ return False
+
+
+class MissingCodecsDialog(Gtk.MessageDialog):
+
+ def __init__(self, parent_window, install_helper_name):
+ super().__init__(
+ transient_for=parent_window, modal=True, destroy_with_parent=True,
+ message_type=Gtk.MessageType.ERROR, buttons=Gtk.ButtonsType.CANCEL,
+ text=_("Unable to play the file"))
+
+ # TRANSLATORS: this is a button to launch a codec installer.
+ # {} will be replaced with the software installer's name, e.g.
+ # 'Software' in case of gnome-software.
+ self.find_button = self.add_button(
+ _("_Find in {}").format(install_helper_name),
+ Gtk.ResponseType.ACCEPT)
+ self.set_default_response(Gtk.ResponseType.ACCEPT)
+ Gtk.StyleContext.add_class(
+ self.find_button.get_style_context(), 'suggested-action')
+
+ def set_codec_names(self, codec_names):
+ n_codecs = len(codec_names)
+ if n_codecs == 2:
+ # TRANSLATORS: separator for two codecs
+ text = _(" and ").join(codec_names)
+ else:
+ # TRANSLATORS: separator for a list of codecs
+ text = _(", ").join(codec_names)
+ self.format_secondary_text(ngettext(
+ "{} is required to play the file, but is not installed.",
+ "{} are required to play the file, but are not installed.",
+ n_codecs).format(text))
diff --git a/gnomemusic/inhibitsuspend.py b/gnomemusic/inhibitsuspend.py
new file mode 100644
index 00000000..29058344
--- /dev/null
+++ b/gnomemusic/inhibitsuspend.py
@@ -0,0 +1,84 @@
+# Copyright © 2018 The GNOME Music developers
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gettext import gettext as _
+from gi.repository import Gtk, GObject
+
+from gnomemusic.gstplayer import Playback
+
+
+class InhibitSuspend(GObject.GObject):
+ """InhibitSuspend object
+
+ Contains the logic to postpone automatic system suspend
+ until the application has played all the songs in the playlist.
+ """
+
+ def __init__(self, application):
+ """Initialize supend inhibitor
+
+ :param Application application: Application object
+ """
+ super().__init__()
+
+ self._application = application
+ self._log = application.props.log
+ self._player = application.props.player
+ self._inhibit_cookie = 0
+
+ self._player.connect('notify::state', self._on_player_state_changed)
+
+ self._settings = application.props.settings
+ self._should_inhibit = self._settings.get_boolean('inhibit-suspend')
+ self._settings.connect(
+ 'changed::inhibit-suspend', self._on_inhibit_suspend_changed)
+
+ def _inhibit_suspend(self):
+ if (self._inhibit_cookie == 0
+ and self._should_inhibit):
+ active_window = self._application.props.active_window
+
+ self._inhibit_cookie = self._application.inhibit(
+ active_window, Gtk.ApplicationInhibitFlags.SUSPEND,
+ _("Playing music"))
+
+ if self._inhibit_cookie == 0:
+ self._log.warning("Unable to inhibit automatic system suspend")
+
+ def _uninhibit_suspend(self):
+ if self._inhibit_cookie != 0:
+ self._application.uninhibit(self._inhibit_cookie)
+ self._inhibit_cookie = 0
+
+ def _on_inhibit_suspend_changed(self, settings, value):
+ self._should_inhibit = value
+ self._on_player_state_changed(None, None)
+
+ def _on_player_state_changed(self, klass, arguments):
+ if (self._player.props.state == Playback.PLAYING
+ or self._player.props.state == Playback.LOADING):
+ self._inhibit_suspend()
+
+ if (self._player.props.state == Playback.PAUSED
+ or self._player.props.state == Playback.STOPPED):
+ self._uninhibit_suspend()
diff --git a/gnomemusic/mediaartloader.py b/gnomemusic/mediaartloader.py
new file mode 100644
index 00000000..3b622e8a
--- /dev/null
+++ b/gnomemusic/mediaartloader.py
@@ -0,0 +1,119 @@
+# Copyright 2022 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from typing import Optional
+
+from gi.repository import Gdk, Gio, GLib, GObject
+
+from gnomemusic.musiclogger import MusicLogger
+
+
+class MediaArtLoader(GObject.GObject):
+ """Handles retrieval of MediaArt cache art
+
+ Signals when the media is loaded and passes a texture or None.
+ """
+
+ __gtype_name__ = "MediaArtLoader"
+
+ __gsignals__ = {
+ "finished": (GObject.SignalFlags.RUN_FIRST, None, (object, ))
+ }
+
+ _chunksize = 32768
+ _log = MusicLogger()
+
+ def __init__(self) -> None:
+ """Intialize MediaArtLoader
+ """
+ super().__init__()
+
+ self._bytearray = bytearray()
+ self._texture: Optional[Gdk.Texture] = None
+
+ def start(self, uri: str) -> None:
+ """Start the cache query
+
+ :param str uri: The MediaArt uri
+ """
+ thumb_file = Gio.File.new_for_uri(uri)
+ if thumb_file:
+ thumb_file.read_async(
+ GLib.PRIORITY_DEFAULT_IDLE, None, self._open_stream)
+ else:
+ self.emit("finished", self._texture)
+
+ def _open_stream(
+ self, thumb_file: Gio.File, result: Gio.AsyncResult) -> None:
+ try:
+ stream = thumb_file.read_finish(result)
+ except GLib.Error as error:
+ self._log.warning(
+ "Error: {}, {}".format(error.domain, error.message))
+ self.emit("finished", self._texture)
+ else:
+ stream.read_bytes_async(
+ self._chunksize, GLib.PRIORITY_DEFAULT_IDLE, None,
+ self._read_bytes_async_cb)
+
+ def _read_bytes_async_cb(
+ self, stream: Gio.FileInputStream,
+ result: Gio.AsyncResult) -> None:
+ try:
+ gbytes = stream.read_bytes_finish(result)
+ except GLib.Error as error:
+ self._log.warning(
+ "Error: {}, {}".format(error.domain, error.message))
+ stream.close_async(
+ GLib.PRIORITY_DEFAULT_IDLE, None, self._close_stream)
+ return
+
+ gbytes_size = gbytes.get_size()
+ if gbytes_size > 0:
+ self._bytearray += gbytes.unref_to_data()
+
+ stream.read_bytes_async(
+ self._chunksize, GLib.PRIORITY_DEFAULT_IDLE, None,
+ self._read_bytes_async_cb)
+ else:
+ # FIXME: Use GTask to load textures async.
+ # See pygobject#114 for bytes conversion.
+ self._texture = Gdk.Texture.new_from_bytes(
+ GLib.Bytes(bytes(self._bytearray)))
+
+ self._bytearray = bytearray()
+
+ stream.close_async(
+ GLib.PRIORITY_DEFAULT_IDLE, None, self._close_stream)
+
+ def _close_stream(
+ self, stream: Gio.InputStream, result: Gio.AsyncResult) -> None:
+ try:
+ stream.close_finish(result)
+ except GLib.Error as error:
+ self._log.warning(
+ "Error: {}, {}".format(error.domain, error.message))
+
+ self.emit("finished", self._texture)
diff --git a/gnomemusic/mpris.py b/gnomemusic/mpris.py
new file mode 100644
index 00000000..ddb54a74
--- /dev/null
+++ b/gnomemusic/mpris.py
@@ -0,0 +1,876 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import re
+
+from gi.repository import Gio, GLib
+
+from gnomemusic.grilowrappers.grltrackerplaylists import Playlist
+from gnomemusic.gstplayer import Playback
+from gnomemusic.player import RepeatMode
+from gnomemusic.widgets.songwidget import SongWidget
+
+
+class DBusInterface:
+
+ def __init__(self, name, path, application):
+ """Etablish a D-Bus session connection
+
+ :param str name: interface name
+ :param str path: object path
+ :param GtkApplication application: The Application object
+ """
+ self._log = application.props.log
+ self._path = path
+ self._signals = None
+ Gio.bus_get(Gio.BusType.SESSION, None, self._bus_get_sync, name)
+
+ def _bus_get_sync(self, source, res, name):
+ try:
+ self._con = Gio.bus_get_finish(res)
+ except GLib.Error as e:
+ self._log.warning(
+ "Unable to connect to to session bus: {}".format(e.message))
+ return
+
+ Gio.bus_own_name_on_connection(
+ self._con, name, Gio.BusNameOwnerFlags.NONE, None, None)
+
+ method_outargs = {}
+ method_inargs = {}
+ signals = {}
+ for interface in Gio.DBusNodeInfo.new_for_xml(self.__doc__).interfaces:
+
+ for method in interface.methods:
+ method_outargs[method.name] = "(" + "".join(
+ [arg.signature for arg in method.out_args]) + ")"
+ method_inargs[method.name] = tuple(
+ arg.signature for arg in method.in_args)
+
+ for signal in interface.signals:
+ args = {arg.name: arg.signature for arg in signal.args}
+ signals[signal.name] = {
+ 'interface': interface.name, 'args': args}
+
+ self._con.register_object(
+ object_path=self._path, interface_info=interface,
+ method_call_closure=self._on_method_call)
+
+ self._method_inargs = method_inargs
+ self._method_outargs = method_outargs
+ self._signals = signals
+
+ def _on_method_call(
+ self, connection, sender, object_path, interface_name, method_name,
+ parameters, invocation):
+ """GObject.Closure to handle incoming method calls.
+
+ :param Gio.DBusConnection connection: D-Bus connection
+ :param str sender: bus name that invoked the method
+ :param srt object_path: object path the method was invoked on
+ :param str interface_name: name of the D-Bus interface
+ :param str method_name: name of the method that was invoked
+ :param GLib.Variant parameters: parameters of the method invocation
+ :param Gio.DBusMethodInvocation invocation: invocation
+ """
+ args = list(parameters.unpack())
+ for i, sig in enumerate(self._method_inargs[method_name]):
+ if sig == 'h':
+ msg = invocation.get_message()
+ fd_list = msg.get_unix_fd_list()
+ args[i] = fd_list.get(args[i])
+
+ method_snake_name = DBusInterface.camelcase_to_snake_case(method_name)
+ try:
+ result = getattr(self, method_snake_name)(*args)
+ except ValueError as e:
+ invocation.return_dbus_error(interface_name, str(e))
+ return
+
+ # out_args is at least (signature1). We therefore always wrap the
+ # result as a tuple.
+ # Reference:
+ # https://bugzilla.gnome.org/show_bug.cgi?id=765603
+ result = (result,)
+
+ out_args = self._method_outargs[method_name]
+ if out_args != '()':
+ variant = GLib.Variant(out_args, result)
+ invocation.return_value(variant)
+ else:
+ invocation.return_value(None)
+
+ def _dbus_emit_signal(self, signal_name, values):
+ if self._signals is None:
+ return
+
+ signal = self._signals[signal_name]
+ parameters = []
+ for arg_name, arg_signature in signal['args'].items():
+ value = values[arg_name]
+ parameters.append(GLib.Variant(arg_signature, value))
+
+ variant = GLib.Variant.new_tuple(*parameters)
+ self._con.emit_signal(
+ None, self._path, signal['interface'], signal_name, variant)
+
+ @staticmethod
+ def camelcase_to_snake_case(name):
+ s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
+ return '_' + re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
+
+
+class MPRIS(DBusInterface):
+ """
+ <!DOCTYPE node PUBLIC
+ '-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+ 'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+ <node>
+ <interface name='org.freedesktop.DBus.Introspectable'>
+ <method name='Introspect'>
+ <arg name='data' direction='out' type='s'/>
+ </method>
+ </interface>
+ <interface name='org.freedesktop.DBus.Properties'>
+ <method name='Get'>
+ <arg name='interface' direction='in' type='s'/>
+ <arg name='property' direction='in' type='s'/>
+ <arg name='value' direction='out' type='v'/>
+ </method>
+ <method name='Set'>
+ <arg name='interface_name' direction='in' type='s'/>
+ <arg name='property_name' direction='in' type='s'/>
+ <arg name='value' direction='in' type='v'/>
+ </method>
+ <method name='GetAll'>
+ <arg name='interface' direction='in' type='s'/>
+ <arg name='properties' direction='out' type='a{sv}'/>
+ </method>
+ <signal name='PropertiesChanged'>
+ <arg name='interface_name' type='s' />
+ <arg name='changed_properties' type='a{sv}' />
+ <arg name='invalidated_properties' type='as' />
+ </signal>
+ </interface>
+ <interface name='org.mpris.MediaPlayer2'>
+ <method name='Raise'>
+ </method>
+ <method name='Quit'>
+ </method>
+ <property name='CanQuit' type='b' access='read' />
+ <property name='Fullscreen' type='b' access='readwrite' />
+ <property name='CanRaise' type='b' access='read' />
+ <property name='HasTrackList' type='b' access='read'/>
+ <property name='Identity' type='s' access='read'/>
+ <property name='DesktopEntry' type='s' access='read'/>
+ <property name='SupportedUriSchemes' type='as' access='read'/>
+ <property name='SupportedMimeTypes' type='as' access='read'/>
+ </interface>
+ <interface name='org.mpris.MediaPlayer2.Player'>
+ <method name='Next'/>
+ <method name='Previous'/>
+ <method name='Pause'/>
+ <method name='PlayPause'/>
+ <method name='Stop'/>
+ <method name='Play'/>
+ <method name='Seek'>
+ <arg direction='in' name='Offset' type='x'/>
+ </method>
+ <method name='SetPosition'>
+ <arg direction='in' name='TrackId' type='o'/>
+ <arg direction='in' name='Position' type='x'/>
+ </method>
+ <method name='OpenUri'>
+ <arg direction='in' name='Uri' type='s'/>
+ </method>
+ <signal name='Seeked'>
+ <arg name='Position' type='x'/>
+ </signal>
+ <property name='PlaybackStatus' type='s' access='read'/>
+ <property name='LoopStatus' type='s' access='readwrite'/>
+ <property name='Rate' type='d' access='readwrite'/>
+ <property name='Shuffle' type='b' access='readwrite'/>
+ <property name='Metadata' type='a{sv}' access='read'>
+ </property>
+ <property name='Position' type='x' access='read'/>
+ <property name='MinimumRate' type='d' access='read'/>
+ <property name='MaximumRate' type='d' access='read'/>
+ <property name='CanGoNext' type='b' access='read'/>
+ <property name='CanGoPrevious' type='b' access='read'/>
+ <property name='CanPlay' type='b' access='read'/>
+ <property name='CanPause' type='b' access='read'/>
+ <property name='CanSeek' type='b' access='read'/>
+ <property name='CanControl' type='b' access='read'/>
+ </interface>
+ <interface name='org.mpris.MediaPlayer2.TrackList'>
+ <method name='GetTracksMetadata'>
+ <arg direction='in' name='TrackIds' type='ao'/>
+ <arg direction='out' name='Metadata' type='aa{sv}'>
+ </arg>
+ </method>
+ <method name='AddTrack'>
+ <arg direction='in' name='Uri' type='s'/>
+ <arg direction='in' name='AfterTrack' type='o'/>
+ <arg direction='in' name='SetAsCurrent' type='b'/>
+ </method>
+ <method name='RemoveTrack'>
+ <arg direction='in' name='TrackId' type='o'/>
+ </method>
+ <method name='GoTo'>
+ <arg direction='in' name='TrackId' type='o'/>
+ </method>
+ <signal name='TrackListReplaced'>
+ <arg name='Tracks' type='ao'/>
+ <arg name='CurrentTrack' type='o'/>
+ </signal>
+ <property name='Tracks' type='ao' access='read'/>
+ <property name='CanEditTracks' type='b' access='read'/>
+ </interface>
+ <interface name='org.mpris.MediaPlayer2.Playlists'>
+ <method name='ActivatePlaylist'>
+ <arg direction="in" name="PlaylistId" type="o" />
+ </method>
+ <method name='GetPlaylists'>
+ <arg direction='in' name='Index' type='u' />
+ <arg direction='in' name='MaxCount' type='u' />
+ <arg direction='in' name='Order' type='s' />
+ <arg direction='in' name='ReverseOrder' type='b' />
+ <arg direction='out' name='Playlists' type='a(oss)' />
+ </method>
+ <property name='PlaylistCount' type='u' access='read' />
+ <property name='Orderings' type='as' access='read' />
+ <property name='ActivePlaylist' type='(b(oss))' access='read' />
+ <signal name='PlaylistChanged'>
+ <arg name='Playlist' type='(oss)' />
+ </signal>
+ </interface>
+ </node>
+ """
+
+ MEDIA_PLAYER2_IFACE = 'org.mpris.MediaPlayer2'
+ MEDIA_PLAYER2_PLAYER_IFACE = 'org.mpris.MediaPlayer2.Player'
+ MEDIA_PLAYER2_TRACKLIST_IFACE = 'org.mpris.MediaPlayer2.TrackList'
+ MEDIA_PLAYER2_PLAYLISTS_IFACE = 'org.mpris.MediaPlayer2.Playlists'
+
+ _playlist_nb_songs = 10
+
+ def __init__(self, app):
+ name = "org.mpris.MediaPlayer2.{}".format(app.props.application_id)
+ path = '/org/mpris/MediaPlayer2'
+ super().__init__(name, path, app)
+
+ self._app = app
+ self._log = app.props.log
+ self._player = app.props.player
+ self._player.connect(
+ 'song-changed', self._on_current_song_changed)
+ self._player.connect('notify::state', self._on_player_state_changed)
+ self._player.connect(
+ 'notify::repeat-mode', self._on_repeat_mode_changed)
+ self._player.connect('seek-finished', self._on_seek_finished)
+
+ self._coremodel = app.props.coremodel
+ self._player_model = self._coremodel.props.playlist_sort
+ self._player_model_changed_id = None
+
+ self._coremodel.connect(
+ "playlist-loaded", self._on_player_playlist_changed)
+
+ self._playlists_model = self._coremodel.props.playlists_sort
+ n_items = self._playlists_model.get_n_items()
+ self._on_playlists_items_changed(
+ self._playlists_model, 0, n_items, n_items)
+ self._playlists_model.connect(
+ "items-changed", self._on_playlists_items_changed)
+
+ self._recent_playlist = self._coremodel.props.recent_playlist
+ self._recent_playlist.connect(
+ "items-changed", self._on_recent_playlist_changed)
+
+ self._player_playlist_type = None
+ self._path_list = []
+ self._metadata_list = []
+ self._previous_can_go_next = False
+ self._previous_can_go_previous = False
+ self._previous_can_play = False
+ self._previous_is_shuffled = None
+ self._previous_loop_status = ""
+ self._previous_mpris_playlist = self._get_active_playlist()
+ self._previous_playback_status = "Stopped"
+
+ def _get_playback_status(self):
+ state = self._player.props.state
+ if state == Playback.STOPPED:
+ return 'Stopped'
+ elif state == Playback.PAUSED:
+ return 'Paused'
+ else:
+ return 'Playing'
+
+ def _get_loop_status(self):
+ if self._player.props.repeat_mode == RepeatMode.ALL:
+ return "Playlist"
+ elif self._player.props.repeat_mode == RepeatMode.SONG:
+ return "Track"
+ else:
+ return "None"
+
+ def _get_metadata(self, coresong=None, index=None):
+ song_dbus_path = self._get_song_dbus_path(coresong, index)
+ if not self._player.props.current_song:
+ return {
+ 'mpris:trackid': GLib.Variant('o', song_dbus_path)
+ }
+
+ if not coresong:
+ coresong = self._player.props.current_song
+
+ length = coresong.props.duration * 1e6
+ user_rating = 1.0 if coresong.props.favorite else 0.0
+ artist = coresong.props.artist
+
+ metadata = {
+ 'mpris:trackid': GLib.Variant('o', song_dbus_path),
+ 'xesam:url': GLib.Variant('s', coresong.props.url),
+ 'mpris:length': GLib.Variant('x', length),
+ 'xesam:useCount': GLib.Variant('i', coresong.props.play_count),
+ 'xesam:userRating': GLib.Variant('d', user_rating),
+ 'xesam:title': GLib.Variant('s', coresong.props.title),
+ 'xesam:album': GLib.Variant('s', coresong.props.album),
+ 'xesam:artist': GLib.Variant('as', [artist]),
+ 'xesam:albumArtist': GLib.Variant('as', [artist])
+ }
+
+ genre = coresong.props.media.get_genre()
+ if genre is not None:
+ metadata['xesam:genre'] = GLib.Variant('as', [genre])
+
+ last_played = coresong.props.media.get_last_played()
+ if last_played is not None:
+ last_played_str = last_played.format("%FT%T%:z")
+ metadata['xesam:lastUsed'] = GLib.Variant('s', last_played_str)
+
+ track_nr = coresong.props.track_number
+ if track_nr > 0:
+ metadata['xesam:trackNumber'] = GLib.Variant('i', track_nr)
+
+ art_url = coresong.props.thumbnail
+ if art_url != "generic":
+ metadata['mpris:artUrl'] = GLib.Variant('s', art_url)
+
+ return metadata
+
+ def _get_song_dbus_path(self, coresong=None, index=None):
+ """Convert a Grilo media to a D-Bus path
+
+ The hex encoding is used to remove any possible invalid
+ character. Use player index to make the path truly unique in
+ case the same song is present multiple times in a playlist.
+ If coresong is None, it means that the current song path is
+ requested.
+
+ :param CoreSong coresong: The CoreSong object
+ :param int index: The media position in the current playlist
+ :return: a D-Bus id to uniquely identify the song
+ :rtype: str
+ """
+ if not self._player.props.current_song:
+ return "/org/mpris/MediaPlayer2/TrackList/NoTrack"
+
+ if not coresong:
+ coresong = self._player.props.current_song
+ index = self._player.props.position
+
+ id_hex = coresong.props.grlid.encode('ascii').hex()
+ path = "/org/gnome/GnomeMusic/TrackList/{}_{}".format(
+ id_hex, index)
+ return path
+
+ def _on_recent_playlist_changed(self, model, position, removed, added):
+ self._path_list = []
+ self._metadata_list = []
+
+ offset = self._recent_playlist.get_offset()
+ for position, coresong in enumerate(self._recent_playlist):
+ offset_position = position + offset
+ self._path_list.append(
+ self._get_song_dbus_path(coresong, offset_position))
+ self._metadata_list.append(
+ self._get_metadata(coresong, offset_position))
+
+ current_song_path = self._get_song_dbus_path()
+ self._track_list_replaced(self._path_list, current_song_path)
+
+ def _get_playlist_dbus_path(self, playlist):
+ """Convert a playlist to a D-Bus path
+
+ :param Playlist playlist: The playlist object
+ :return: a D-Bus id to uniquely identify the playlist
+ :rtype: str
+ """
+ if not playlist:
+ return "/"
+
+ # Smart Playlists do not have an id
+ pl_id = playlist.props.pl_id or playlist.props.tag_text
+ pl_id = pl_id.rsplit(":")[-1].replace("-", "")
+ return "/org/gnome/GnomeMusic/Playlist/{}".format(pl_id)
+
+ def _get_mpris_playlist_from_playlist(self, playlist):
+ playlist_name = playlist.props.title
+ path = self._get_playlist_dbus_path(playlist)
+ return (path, playlist_name, "")
+
+ def _get_active_playlist(self):
+ """Get Active Maybe_Playlist
+
+ Maybe_Playlist is a structure describing a playlist, or nothing
+ according to MPRIS specifications.
+ If a playlist is active, return True and its description
+ (path, name and icon).
+ If no playlist is active, return False and an undefined structure.
+
+ :returns: playlist existence and its structure
+ :rtype: tuple
+ """
+ current_core_object = self._coremodel.props.active_core_object
+ if not isinstance(current_core_object, Playlist):
+ return (False, ("/", "", ""))
+
+ mpris_playlist = self._get_mpris_playlist_from_playlist(
+ current_core_object)
+ return (True, mpris_playlist)
+
+ def _on_current_song_changed(self, player):
+ # In repeat song mode, no metadata has changed if the
+ # player was already started
+ if self._player.props.repeat_mode == RepeatMode.SONG:
+ self._seeked(0)
+ if self._previous_can_play is True:
+ return
+
+ if self._player_model_changed_id is None:
+ self._player_model_changed_id = self._player_model.connect_after(
+ "items-changed", self._on_player_model_changed)
+
+ self._on_player_model_changed(self._player_model, 0, 0, 0)
+
+ def _on_player_model_changed(self, model, pos, removed, added):
+ # Do no update the properties if the model has completely changed.
+ # These changes will be applied once a new song starts playing.
+ if added == model.get_n_items():
+ return
+
+ properties = {}
+ properties["Metadata"] = GLib.Variant("a{sv}", self._get_metadata())
+
+ has_next = self._player.props.has_next
+ if has_next != self._previous_can_go_next:
+ properties["CanGoNext"] = GLib.Variant("b", has_next)
+ self._previous_can_go_next = has_next
+
+ has_previous = self._player.props.has_previous
+ if has_previous != self._previous_can_go_previous:
+ properties["CanGoPrevious"] = GLib.Variant("b", has_previous)
+ self._previous_can_go_previous = has_previous
+
+ if self._previous_can_play is not True:
+ properties["CanPause"] = GLib.Variant("b", True)
+ properties["CanPlay"] = GLib.Variant("b", True)
+ self._previous_can_play = True
+
+ self._properties_changed(
+ MPRIS.MEDIA_PLAYER2_PLAYER_IFACE, properties, [])
+
+ def _on_player_state_changed(self, klass, args):
+ playback_status = self._get_playback_status()
+ if playback_status == self._previous_playback_status:
+ return
+
+ self._previous_playback_status = playback_status
+ self._properties_changed(
+ MPRIS.MEDIA_PLAYER2_PLAYER_IFACE,
+ {'PlaybackStatus': GLib.Variant('s', playback_status), }, [])
+
+ def _on_repeat_mode_changed(self, player, param):
+ properties = {}
+
+ is_shuffled = self._player.props.repeat_mode == RepeatMode.SHUFFLE
+ if is_shuffled != self._previous_is_shuffled:
+ properties["Shuffle"] = GLib.Variant("b", is_shuffled)
+ self._previous_is_shuffled = is_shuffled
+
+ loop_status = self._get_loop_status()
+ if loop_status != self._previous_loop_status:
+ properties["LoopStatus"] = GLib.Variant("s", loop_status)
+ self._previous_loop_status = loop_status
+
+ if not properties:
+ return
+ self._properties_changed(
+ MPRIS.MEDIA_PLAYER2_PLAYER_IFACE, properties, [])
+
+ def _on_seek_finished(self, player):
+ position_second = self._player.get_position()
+ self._seeked(int(position_second * 1e6))
+
+ def _on_player_playlist_changed(self, coremodel, playlist_type):
+ self._player_playlist_type = playlist_type
+
+ mpris_playlist = self._get_active_playlist()
+ if mpris_playlist == self._previous_mpris_playlist:
+ return
+
+ self._previous_mpris_playlist = mpris_playlist
+ properties = {
+ "ActivePlaylist": GLib.Variant("(b(oss))", mpris_playlist)}
+ self._properties_changed(
+ MPRIS.MEDIA_PLAYER2_PLAYLISTS_IFACE, properties, [])
+
+ def _on_playlists_items_changed(self, model, position, removed, added):
+ if added > 0:
+ for i in range(added):
+ playlist = model[position + i]
+ playlist.connect("notify::title", self._on_playlist_renamed)
+ playlist.connect(
+ "notify::active", self._on_player_playlist_changed)
+
+ playlist_count = model.get_n_items()
+ properties = {"PlaylistCount": GLib.Variant("u", playlist_count)}
+ self._properties_changed(
+ MPRIS.MEDIA_PLAYER2_PLAYLISTS_IFACE, properties, [])
+
+ def _on_playlist_renamed(self, playlist, param):
+ mpris_playlist = self._get_mpris_playlist_from_playlist(playlist)
+ self._dbus_emit_signal('PlaylistChanged', {'Playlist': mpris_playlist})
+
+ def _raise(self):
+ """Brings user interface to the front (MPRIS Method)."""
+ self._app.do_activate()
+
+ def _quit(self):
+ """Causes the media player to stop running (MPRIS Method)."""
+ self._app.quit()
+
+ def _next(self):
+ """Skips to the next track in the tracklist (MPRIS Method)."""
+ self._player.next()
+
+ def _previous(self):
+ """Skips to the previous track in the tracklist.
+
+ (MPRIS Method)
+ """
+ self._player.previous()
+
+ def _pause(self):
+ """Pauses playback (MPRIS Method)."""
+ self._player.pause()
+
+ def _play_pause(self):
+ """Play or Pauses playback (MPRIS Method)."""
+ self._player.play_pause()
+
+ def _stop(self):
+ """Stop playback (MPRIS Method)."""
+ self._player.stop()
+
+ def _play(self):
+ """Start or resume playback (MPRIS Method).
+
+ If there is no track to play, this has no effect.
+ """
+ self._player.play()
+
+ def _seek(self, offset_msecond):
+ """Seek forward in the current track (MPRIS Method).
+
+ Seek is relative to the current player position.
+ If the value passed in would mean seeking beyond the end of the track,
+ acts like a call to Next.
+
+ :param int offset_msecond: number of microseconds
+ """
+ current_position_second = self._player.get_position()
+ new_position_second = current_position_second + offset_msecond / 1e6
+
+ duration_second = self._player.props.duration
+ if new_position_second <= duration_second:
+ self._player.set_position(new_position_second)
+ else:
+ self._player.next()
+
+ def _set_position(self, track_id, position_msecond):
+ """Set the current track position in microseconds (MPRIS Method)
+
+ :param str track_id: The currently playing track's identifier
+ :param int position_msecond: new position in microseconds
+ """
+ metadata = self._get_metadata()
+ current_track_id = metadata["mpris:trackid"].get_string()
+ if track_id != current_track_id:
+ return
+ self._player.set_position(position_msecond / 1e6)
+
+ def _open_uri(self, uri):
+ """Opens the Uri given as an argument (MPRIS Method).
+
+ Not implemented.
+
+ :param str uri: Uri of the track to load.
+ """
+ pass
+
+ def _seeked(self, position_msecond):
+ """Indicate that the track position has changed.
+
+ :param int position_msecond: new position in microseconds.
+ """
+ self._dbus_emit_signal("Seeked", {"Position": position_msecond})
+
+ def _get_tracks_metadata(self, track_paths):
+ """Gets all the metadata available for a set of tracks.
+
+ (MPRIS Method)
+
+ :param list track_paths: list of track ids
+ :returns: Metadata of the set of tracks given as input.
+ :rtype: list
+ """
+ metadata = []
+ for path in track_paths:
+ index = self._path_list.index(path)
+ metadata.append(self._metadata_list[index])
+ return metadata
+
+ def _add_track(self, uri, after_track, set_as_current):
+ """Adds a URI in the TrackList. (MPRIS Method).
+
+ This is not implemented (CanEditTracks is set to False).
+ """
+ pass
+
+ def _remove_track(self, path):
+ """Removes an item from the TrackList. (MPRIS Method).
+
+ This is not implemented (CanEditTracks is set to False).
+ """
+ pass
+
+ def _go_to(self, path):
+ """Skip to the specified TrackId (MPRIS Method).
+
+ :param str path: Identifier of the track to skip to
+ """
+ current_index = self._path_list.index(self._get_song_dbus_path())
+ current_coresong = self._player.props.current_song
+
+ goto_index = self._path_list.index(path)
+ new_position = self._player.props.position + goto_index - current_index
+ new_coresong = self._player_model[new_position]
+
+ self._player.play(new_coresong)
+ current_coresong.props.state = SongWidget.State.PLAYED
+ new_coresong.props.state = SongWidget.State.PLAYING
+
+ def _track_list_replaced(self, track_paths, current_song_path):
+ """Indicate that the entire tracklist has been replaced.
+
+ (MPRIS Method)
+
+ :param list track_paths: the new list of tracks
+ :param current_song_path: the id of the current song
+ """
+ parameters = {
+ "Tracks": track_paths,
+ "CurrentTrack": current_song_path}
+ self._dbus_emit_signal("TrackListReplaced", parameters)
+
+ def _load_player_playlist(self, playlist):
+ def _on_playlist_loaded(klass, playlist_type):
+ self._player.play()
+ self._coremodel.disconnect(loaded_id)
+
+ loaded_id = self._coremodel.connect(
+ "playlist-loaded", _on_playlist_loaded)
+ self._coremodel.props.active_core_object = playlist
+
+ def _activate_playlist(self, playlist_path):
+ """Starts playing the given playlist (MPRIS Method).
+
+ :param str playlist_path: The id of the playlist to activate.
+ """
+ selected_playlist = None
+ for playlist in self._playlists_model:
+ if playlist_path == self._get_playlist_dbus_path(playlist):
+ selected_playlist = playlist
+ break
+
+ if selected_playlist is None:
+ return
+
+ def _on_playlist_model_loaded(playlist):
+ playlist.disconnect(signal_id)
+ self._load_player_playlist(playlist)
+
+ if selected_playlist.props.model.get_n_items() > 0:
+ self._load_player_playlist(selected_playlist)
+ else:
+ signal_id = selected_playlist.connect(
+ "playlist-loaded", _on_playlist_model_loaded)
+
+ def _get_playlists(self, index, max_count, order, reverse):
+ """Gets a set of playlists (MPRIS Method).
+
+ GNOME Music only handles playlists with the Alphabetical order.
+
+ :param int index: the index of the first playlist to be fetched
+ :param int max_count: the maximum number of playlists to fetch.
+ :param str order: the ordering that should be used.
+ :param bool reverse: whether the order should be reversed.
+ """
+ if order != 'Alphabetical':
+ return []
+
+ mpris_playlists = [self._get_mpris_playlist_from_playlist(playlist)
+ for playlist in self._playlists_model]
+
+ if not reverse:
+ return mpris_playlists[index:index + max_count]
+
+ first_index = index - 1
+ if first_index < 0:
+ first_index = None
+ return mpris_playlists[index + max_count - 1:first_index:-1]
+
+ def _get(self, interface_name, property_name):
+ # Some clients (for example GSConnect) try to acesss the volume
+ # property. This results in a crash at startup.
+ # Return nothing to prevent it.
+ try:
+ return self._get_all(interface_name)[property_name]
+ except KeyError:
+ msg = "MPRIS does not handle {} property from {} interface".format(
+ property_name, interface_name)
+ self._log.warning(msg)
+ raise ValueError(msg)
+
+ def _get_all(self, interface_name):
+ if interface_name == MPRIS.MEDIA_PLAYER2_IFACE:
+ application_id = self._app.props.application_id
+ return {
+ 'CanQuit': GLib.Variant('b', True),
+ 'Fullscreen': GLib.Variant('b', False),
+ 'CanSetFullscreen': GLib.Variant('b', False),
+ 'CanRaise': GLib.Variant('b', True),
+ 'HasTrackList': GLib.Variant('b', True),
+ 'Identity': GLib.Variant('s', 'Music'),
+ 'DesktopEntry': GLib.Variant('s', application_id),
+ 'SupportedUriSchemes': GLib.Variant('as', [
+ 'file'
+ ]),
+ 'SupportedMimeTypes': GLib.Variant('as', [
+ 'application/ogg',
+ 'audio/x-vorbis+ogg',
+ 'audio/x-flac',
+ 'audio/mpeg'
+ ]),
+ }
+ elif interface_name == MPRIS.MEDIA_PLAYER2_PLAYER_IFACE:
+ position_msecond = int(self._player.get_position() * 1e6)
+ playback_status = self._get_playback_status()
+ is_shuffle = (self._player.props.repeat_mode == RepeatMode.SHUFFLE)
+ can_play = (self._player.props.current_song is not None)
+ has_previous = (self._player.props.has_previous)
+ return {
+ 'PlaybackStatus': GLib.Variant('s', playback_status),
+ 'LoopStatus': GLib.Variant('s', self._get_loop_status()),
+ 'Rate': GLib.Variant('d', 1.0),
+ 'Shuffle': GLib.Variant('b', is_shuffle),
+ 'Metadata': GLib.Variant('a{sv}', self._get_metadata()),
+ 'Position': GLib.Variant('x', position_msecond),
+ 'MinimumRate': GLib.Variant('d', 1.0),
+ 'MaximumRate': GLib.Variant('d', 1.0),
+ 'CanGoNext': GLib.Variant('b', self._player.props.has_next),
+ 'CanGoPrevious': GLib.Variant('b', has_previous),
+ 'CanPlay': GLib.Variant('b', can_play),
+ 'CanPause': GLib.Variant('b', can_play),
+ 'CanSeek': GLib.Variant('b', True),
+ 'CanControl': GLib.Variant('b', True),
+ }
+ elif interface_name == MPRIS.MEDIA_PLAYER2_TRACKLIST_IFACE:
+ return {
+ 'Tracks': GLib.Variant('ao', self._path_list),
+ 'CanEditTracks': GLib.Variant('b', False)
+ }
+ elif interface_name == MPRIS.MEDIA_PLAYER2_PLAYLISTS_IFACE:
+ playlist_count = self._playlists_model.get_n_items()
+ active_playlist = self._get_active_playlist()
+ return {
+ 'PlaylistCount': GLib.Variant('u', playlist_count),
+ 'Orderings': GLib.Variant('as', ['Alphabetical']),
+ 'ActivePlaylist': GLib.Variant('(b(oss))', active_playlist),
+ }
+ elif interface_name == 'org.freedesktop.DBus.Properties':
+ return {}
+ elif interface_name == 'org.freedesktop.DBus.Introspectable':
+ return {}
+ else:
+ self._log.warning(
+ "MPRIS does not implement {} interface".format(interface_name))
+
+ def _set(self, interface_name, property_name, new_value):
+ if interface_name == MPRIS.MEDIA_PLAYER2_IFACE:
+ if property_name == 'Fullscreen':
+ pass
+ elif interface_name == MPRIS.MEDIA_PLAYER2_PLAYER_IFACE:
+ if property_name in ['Rate', 'Volume']:
+ pass
+ elif property_name == 'LoopStatus':
+ if new_value == 'None':
+ self._player.props.repeat_mode = RepeatMode.NONE
+ elif new_value == 'Track':
+ self._player.props.repeat_mode = RepeatMode.SONG
+ elif new_value == 'Playlist':
+ self._player.props.repeat_mode = RepeatMode.ALL
+ elif property_name == 'Shuffle':
+ if new_value:
+ self._player.props.repeat_mode = RepeatMode.SHUFFLE
+ else:
+ self._player.props.repeat_mode = RepeatMode.NONE
+ else:
+ self._log.warning(
+ "MPRIS does not implement {} interface".format(interface_name))
+
+ def _properties_changed(self, interface_name, changed_properties,
+ invalidated_properties):
+ parameters = {
+ 'interface_name': interface_name,
+ 'changed_properties': changed_properties,
+ 'invalidated_properties': invalidated_properties
+ }
+ self._dbus_emit_signal('PropertiesChanged', parameters)
+
+ def _introspect(self):
+ return self.__doc__
diff --git a/gnomemusic/musiclogger.py b/gnomemusic/musiclogger.py
new file mode 100644
index 00000000..63e855c0
--- /dev/null
+++ b/gnomemusic/musiclogger.py
@@ -0,0 +1,105 @@
+# Copyright 2020 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import inspect
+import os
+
+from gi.repository import GLib, GObject
+
+
+class MusicLogger(GObject.GObject):
+ """GLib logging wrapper
+
+ A tiny wrapper aroung the default GLib logger.
+
+ * Message is for user facing warnings, which ideally should be in
+ the application.
+ * Warning is for logging non-fatal errors during execution.
+ * Debug is for developer use as a way to get more runtime info.
+ """
+
+ _DOMAIN = "org.gnome.Music"
+
+ def _log(self, message, level):
+ stack = inspect.stack()
+
+ filename = os.path.basename(stack[2][1])
+ line = stack[2][2]
+ function = stack[2][3]
+
+ if level in [GLib.LogLevelFlags.LEVEL_DEBUG,
+ GLib.LogLevelFlags.LEVEL_INFO,
+ GLib.LogLevelFlags.LEVEL_WARNING]:
+ message = "({}, {}, {}) {}".format(
+ filename, function, line, message)
+
+ variant_message = GLib.Variant("s", message)
+ variant_file = GLib.Variant("s", filename)
+ variant_line = GLib.Variant("i", line)
+ variant_func = GLib.Variant("s", function)
+
+ variant_dict = GLib.Variant("a{sv}", {
+ "MESSAGE": variant_message,
+ "CODE_FILE": variant_file,
+ "CODE_LINE": variant_line,
+ "CODE_FUNC": variant_func
+ })
+
+ GLib.log_variant(self._DOMAIN, level, variant_dict)
+
+ def message(self, message):
+ """The default user facing message
+
+ Wraps g_message.
+
+ :param string message: Message
+ """
+ self._log(message, GLib.LogLevelFlags.LEVEL_MESSAGE)
+
+ def warning(self, message):
+ """Warning message
+
+ Wraps g_warning.
+
+ :param string message: Warning message
+ """
+ self._log(message, GLib.LogLevelFlags.LEVEL_WARNING)
+
+ def info(self, message):
+ """Informational message
+
+ Wraps g_info.
+
+ :param string message: Informational message
+ """
+ self._log(message, GLib.LogLevelFlags.LEVEL_INFO)
+
+ def debug(self, message):
+ """Debug message
+
+ Wraps g_debug.
+
+ :param string message: Debug message
+ """
+ self._log(message, GLib.LogLevelFlags.LEVEL_DEBUG)
diff --git a/gnomemusic/notificationmanager.py b/gnomemusic/notificationmanager.py
new file mode 100644
index 00000000..5ea0520e
--- /dev/null
+++ b/gnomemusic/notificationmanager.py
@@ -0,0 +1,71 @@
+# Copyright 2020 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import GLib, GObject
+
+
+class NotificationManager(GObject.Object):
+ """Managing wrapper around the notification widgets
+ """
+
+ _pulse_id = 0
+ _loading_counter = 0
+
+ def __init__(self, application):
+ """Initialize the notification manager
+
+ :param Application application: The Application instance
+ """
+ super().__init__()
+
+ self._application = application
+ self._window = application.props.window
+
+ if self._window is None:
+ application.connect(
+ "notify::window", self._on_window_changed)
+
+ def _on_window_changed(self, klass, value):
+ self._window = self._application.props.window
+ if self._loading_counter > 0:
+ self._window.loading_visible(True)
+
+ def push_loading(self):
+ """Push a loading notifcation."""
+ self._loading_counter += 1
+
+ if (self._pulse_id == 0
+ and self._window):
+ self._window.loading_visible(True)
+ self._pulse_id = GLib.timeout_add(100, self._window.loading_pulse)
+
+ def pop_loading(self):
+ self._loading_counter -= 1
+
+ if (self._loading_counter == 0
+ and self._pulse_id != 0):
+ GLib.Source.remove(self._pulse_id)
+ self._pulse_id = 0
+ if self._window:
+ self._window.loading_visible(False)
diff --git a/gnomemusic/pauseonsuspend.py b/gnomemusic/pauseonsuspend.py
new file mode 100644
index 00000000..e23fdea1
--- /dev/null
+++ b/gnomemusic/pauseonsuspend.py
@@ -0,0 +1,132 @@
+# Copyright 2019 The GNOME Music developers
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import os
+
+from gi.repository import GLib, Gio, GObject
+
+from gnomemusic.gstplayer import Playback
+from gnomemusic.musiclogger import MusicLogger
+
+
+class PauseOnSuspend(GObject.GObject):
+ """PauseOnSuspend object
+
+ Contains logic to pause music on system suspend
+ and inhibit suspend before pause.
+ """
+
+ def __init__(self, player):
+ """Initialize pause on supend handling
+
+ :param Player player: Player object
+ """
+ super().__init__()
+
+ self._log = MusicLogger()
+
+ self._player = player
+ self._init_pause_on_suspend()
+
+ self._connection = None
+ self._file_descriptor = -1
+ self._suspend_proxy = None
+ self._previous_state = self._player.props.state
+ self._player.connect("notify::state", self._on_player_state_changed)
+
+ def _on_player_state_changed(self, klass, arguments):
+ new_state = self._player.props.state
+ if self._previous_state == new_state:
+ return
+
+ if (new_state == Playback.PLAYING
+ and self._file_descriptor == -1):
+ self._take_lock()
+
+ if (self._previous_state == Playback.PLAYING
+ and new_state != Playback.LOADING):
+ self._release_lock()
+
+ self._previous_state = new_state
+
+ def _take_lock(self):
+ variant = GLib.Variant(
+ "(ssss)",
+ (
+ "sleep",
+ "GNOME Music",
+ "GNOME Music is pausing",
+ "delay"
+ )
+ )
+
+ self._suspend_proxy.call(
+ "Inhibit", variant, Gio.DBusCallFlags.NONE,
+ -1, None, self._on_inhibit)
+
+ def _on_inhibit(self, proxy, task, data=None):
+ if not self._suspend_proxy:
+ return
+
+ try:
+ var = self._suspend_proxy.call_with_unix_fd_list_finish(task)
+ self._file_descriptor = var.out_fd_list.get(0)
+ self._connection = self._suspend_proxy.connect(
+ "g-signal", self._pause_playing)
+ except GLib.Error as e:
+ self._log.warning(
+ "Error: Failed to finish proxy call: {}".format(e.message))
+
+ def _release_lock(self):
+ if self._file_descriptor >= 0:
+ os.close(self._file_descriptor)
+ self._file_descriptor = -1
+ self._suspend_proxy.disconnect(self._connection)
+
+ def _init_pause_on_suspend(self):
+ Gio.DBusProxy.new_for_bus(
+ Gio.BusType.SYSTEM,
+ Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES, None,
+ "org.freedesktop.login1",
+ "/org/freedesktop/login1",
+ "org.freedesktop.login1.Manager", None,
+ self._suspend_proxy_ready)
+
+ def _suspend_proxy_ready(self, proxy, result, data=None):
+ try:
+ self._suspend_proxy = proxy.new_finish(result)
+ except GLib.Error as e:
+ self._log.warning(
+ "Error: Failed to contact logind daemon: {}".format(e.message))
+ return
+
+ def _pause_playing(self, proxy, sender, signal, parameters):
+ if signal != "PrepareForSleep":
+ return
+
+ (going_to_sleep, ) = parameters
+ if going_to_sleep is True:
+ self._player.pause()
+ self._release_lock()
+ else:
+ self._take_lock()
diff --git a/gnomemusic/player.py b/gnomemusic/player.py
new file mode 100644
index 00000000..da7d0cff
--- /dev/null
+++ b/gnomemusic/player.py
@@ -0,0 +1,660 @@
+# Copyright © 2018 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from enum import Enum, IntEnum
+from gettext import gettext as _
+from random import randrange
+import time
+import typing
+
+import gi
+gi.require_version('GstPbutils', '1.0')
+from gi.repository import GObject, GstPbutils, Gtk
+
+from gnomemusic.coresong import CoreSong
+from gnomemusic.gstplayer import GstPlayer, Playback
+from gnomemusic.widgets.songwidget import SongWidget
+
+
+class RepeatMode(Enum):
+ """Enum for player repeat mode"""
+
+ # Translators: "shuffle" causes tracks to play in random order.
+ NONE = 0, "media-playlist-consecutive-symbolic", _("Shuffle/Repeat Off")
+ SONG = 1, "media-playlist-repeat-song-symbolic", _("Repeat Song")
+ ALL = 2, "media-playlist-repeat-symbolic", _("Repeat All")
+ SHUFFLE = 3, "media-playlist-shuffle-symbolic", _("Shuffle")
+
+ # The type checking is necessary to avoid false positives
+ # See: https://github.com/python/mypy/issues/1021
+ if typing.TYPE_CHECKING:
+ icon: str
+ label: str
+
+ def __new__(
+ cls, value: int, icon: str = "", label: str = "") -> "RepeatMode":
+ obj = object.__new__(cls)
+ obj._value_ = value
+ obj.icon = icon
+ obj.label = label
+ return obj
+
+
+class PlayerPlaylist(GObject.GObject):
+ """PlayerPlaylist object
+
+ Contains the logic to validate a song, handle RepeatMode and the
+ list of songs being played.
+ """
+
+ class Type(IntEnum):
+ """Type of playlist."""
+ SONGS = 0
+ ALBUM = 1
+ ARTIST = 2
+ PLAYLIST = 3
+ SEARCH_RESULT = 4
+
+ repeat_mode = GObject.Property(type=object)
+
+ def __init__(self, application):
+ super().__init__()
+
+ GstPbutils.pb_utils_init()
+
+ self._app = application
+ self._log = application.props.log
+ self._position = 0
+
+ self._validation_songs = {}
+ self._discoverer = GstPbutils.Discoverer()
+ self._discoverer.connect("discovered", self._on_discovered)
+ self._discoverer.start()
+
+ self._coremodel = self._app.props.coremodel
+ self._model = self._coremodel.props.playlist_sort
+ self._model_recent = self._coremodel.props.recent_playlist
+
+ self.connect("notify::repeat-mode", self._on_repeat_mode_changed)
+
+ def has_next(self):
+ """Test if there is a song after the current one.
+
+ :return: True if there is a song. False otherwise.
+ :rtype: bool
+ """
+ if (self.props.repeat_mode == RepeatMode.SONG
+ or self.props.repeat_mode == RepeatMode.ALL
+ or self.props.position < self._model.get_n_items() - 1):
+ return True
+
+ return False
+
+ def has_previous(self):
+ """Test if there is a song before the current one.
+
+ :return: True if there is a song. False otherwise.
+ :rtype: bool
+ """
+ if (self.props.repeat_mode == RepeatMode.SONG
+ or self.props.repeat_mode == RepeatMode.ALL
+ or (self.props.position <= self._model.get_n_items() - 1
+ and self.props.position > 0)):
+ return True
+
+ return False
+
+ def get_next(self):
+ """Get the next song in the playlist.
+
+ :return: The next CoreSong or None.
+ :rtype: CoreSong
+ """
+ if not self.has_next():
+ return None
+
+ if self.props.repeat_mode == RepeatMode.SONG:
+ next_position = self.props.position
+ elif (self.props.repeat_mode == RepeatMode.ALL
+ and self.props.position == self._model.get_n_items() - 1):
+ next_position = 0
+ else:
+ next_position = self.props.position + 1
+
+ return self._model[next_position]
+
+ def next(self):
+ """Go to the next song in the playlist.
+
+ :return: True if the operation succeeded. False otherwise.
+ :rtype: bool
+ """
+ if not self.has_next():
+ return False
+
+ if self.props.repeat_mode == RepeatMode.SONG:
+ next_position = self.props.position
+ elif (self.props.repeat_mode == RepeatMode.ALL
+ and self.props.position == self._model.get_n_items() - 1):
+ next_position = 0
+ else:
+ next_position = self.props.position + 1
+
+ self._model[self.props.position].props.state = SongWidget.State.PLAYED
+ self._position = next_position
+
+ next_song = self._model[next_position]
+ if next_song.props.validation == CoreSong.Validation.FAILED:
+ return self.next()
+
+ self._update_model_recent()
+ next_song.props.state = SongWidget.State.PLAYING
+ self._validate_next_song()
+ return True
+
+ def previous(self):
+ """Go to the previous song in the playlist.
+
+ :return: True if the operation succeeded. False otherwise.
+ :rtype: bool
+ """
+ if not self.has_previous():
+ return False
+
+ if self.props.repeat_mode == RepeatMode.SONG:
+ previous_position = self.props.position
+ elif (self.props.repeat_mode == RepeatMode.ALL
+ and self.props.position == 0):
+ previous_position = self._model.get_n_items() - 1
+ else:
+ previous_position = self.props.position - 1
+
+ self._model[self.props.position].props.state = SongWidget.State.PLAYED
+ self._position = previous_position
+
+ previous_song = self._model[previous_position]
+ if previous_song.props.validation == CoreSong.Validation.FAILED:
+ return self.previous()
+
+ self._update_model_recent()
+ self._model[previous_position].props.state = SongWidget.State.PLAYING
+ self._validate_previous_song()
+ return True
+
+ @GObject.Property(type=int, default=0, flags=GObject.ParamFlags.READABLE)
+ def position(self):
+ """Gets current song index.
+
+ :returns: position of the current song in the playlist.
+ :rtype: int
+ """
+ return self._position
+
+ @GObject.Property(
+ type=CoreSong, default=None, flags=GObject.ParamFlags.READABLE)
+ def current_song(self):
+ """Get current song.
+
+ :returns: the song being played or None if there are no songs
+ :rtype: CoreSong
+ """
+ n_items = self._model.get_n_items()
+ if (n_items != 0
+ and n_items > self._position):
+ current_song = self._model[self._position]
+ if current_song.props.state == SongWidget.State.PLAYING:
+ return current_song
+
+ for idx, coresong in enumerate(self._model):
+ if coresong.props.state == SongWidget.State.PLAYING:
+ self._position = idx
+ self._update_model_recent()
+ return coresong
+
+ return None
+
+ def set_song(self, song):
+ """Sets current song.
+
+ If no song is provided, a song is automatically selected.
+
+ :param CoreSong song: song to set
+ :returns: The selected song
+ :rtype: CoreSong
+ """
+ if self._model.get_n_items() == 0:
+ return None
+
+ if song is None:
+ if self.props.repeat_mode == RepeatMode.SHUFFLE:
+ position = randrange(0, self._model.get_n_items())
+ else:
+ position = 0
+ song = self._model.get_item(position)
+ song.props.state = SongWidget.State.PLAYING
+ self._position = position
+ self._validate_song(song)
+ self._validate_next_song()
+ self._update_model_recent()
+ return song
+
+ for idx, coresong in enumerate(self._model):
+ if coresong == song:
+ coresong.props.state = SongWidget.State.PLAYING
+ self._position = idx
+ self._validate_song(song)
+ self._validate_next_song()
+ self._update_model_recent()
+ return song
+
+ return None
+
+ def _update_model_recent(self):
+ recent_size = self._coremodel.props.recent_playlist_size
+ offset = max(0, self._position - recent_size)
+ self._model_recent.set_offset(offset)
+
+ def _on_repeat_mode_changed(self, klass, param):
+ def _shuffle_sort(song_a, song_b, data=None):
+ if song_a.props.shuffle_pos < song_b.props.shuffle_pos:
+ return Gtk.Ordering.SMALLER
+ elif song_a.props.shuffle_pos > song_b.props.shuffle_pos:
+ return Gtk.Ordering.LARGER
+ else:
+ return Gtk.Ordering.EQUAL
+
+ if self.props.repeat_mode == RepeatMode.SHUFFLE:
+ for idx, coresong in enumerate(self._model):
+ coresong.update_shuffle_pos()
+
+ songs_sorter = Gtk.CustomSorter()
+ songs_sorter.set_sort_func(_shuffle_sort)
+ self._model.set_sorter(songs_sorter)
+ elif self.props.repeat_mode in [RepeatMode.NONE, RepeatMode.ALL]:
+ self._model.set_sorter(None)
+
+ def _validate_song(self, coresong):
+ # Song is being processed or has already been processed.
+ # Nothing to do.
+ if coresong.props.validation > CoreSong.Validation.PENDING:
+ return
+
+ url = coresong.props.url
+ if not url:
+ self._log.warning(
+ "The item {} doesn't have a URL set.".format(coresong))
+ return
+ if not url.startswith("file://"):
+ self._log.debug(
+ "Skipping validation of {} as not a local file".format(url))
+ return
+
+ coresong.props.validation = CoreSong.Validation.IN_PROGRESS
+ self._validation_songs[url] = coresong
+ self._discoverer.discover_uri_async(url)
+
+ def _validate_next_song(self):
+ if self.props.repeat_mode == RepeatMode.SONG:
+ return
+
+ current_position = self.props.position
+ next_position = current_position + 1
+ if next_position == self._model.get_n_items():
+ if self.props.repeat_mode != RepeatMode.ALL:
+ return
+ next_position = 0
+
+ self._validate_song(self._model[next_position])
+
+ def _validate_previous_song(self):
+ if self.props.repeat_mode == RepeatMode.SONG:
+ return
+
+ current_position = self.props.position
+ previous_position = current_position - 1
+ if previous_position < 0:
+ if self.props.repeat_mode != RepeatMode.ALL:
+ return
+ previous_position = self._model.get_n_items() - 1
+
+ self._validate_song(self._model[previous_position])
+
+ def _on_discovered(self, discoverer, info, error):
+ url = info.get_uri()
+ coresong = self._validation_songs[url]
+
+ if error:
+ self._log.warning("Info {}: error: {}".format(info, error))
+ coresong.props.validation = CoreSong.Validation.FAILED
+ else:
+ coresong.props.validation = CoreSong.Validation.SUCCEEDED
+
+
+class Player(GObject.GObject):
+ """Main Player object
+
+ Contains the logic of playing a song with Music.
+ """
+
+ __gsignals__ = {
+ 'seek-finished': (GObject.SignalFlags.RUN_FIRST, None, ()),
+ 'song-changed': (GObject.SignalFlags.RUN_FIRST, None, ())
+ }
+
+ state = GObject.Property(type=int, default=Playback.STOPPED)
+ duration = GObject.Property(type=float, default=-1.)
+
+ def __init__(self, application):
+ """Initialize the player
+
+ :param Application application: Application object
+ """
+ super().__init__()
+
+ self._app = application
+ # In the case of gapless playback, both 'about-to-finish'
+ # and 'eos' can occur during the same stream. 'about-to-finish'
+ # already sets self._playlist to the next song, so doing it
+ # again on eos would skip a song.
+ # TODO: Improve playlist handling so this hack is no longer
+ # needed.
+ self._gapless_set = False
+ self._log = application.props.log
+ self._playlist = PlayerPlaylist(self._app)
+
+ self._playlist_model = self._app.props.coremodel.props.playlist_sort
+ self._playlist_model.connect(
+ "items-changed", self._on_playlist_model_items_changed)
+
+ self._settings = application.props.settings
+ self._repeat = RepeatMode(self._settings.get_enum("repeat"))
+ self.bind_property(
+ 'repeat-mode', self._playlist, 'repeat-mode',
+ GObject.BindingFlags.SYNC_CREATE)
+
+ self._new_clock = True
+
+ self._gst_player = GstPlayer(application)
+ self._gst_player.connect("about-to-finish", self._on_about_to_finish)
+ self._gst_player.connect('clock-tick', self._on_clock_tick)
+ self._gst_player.connect('eos', self._on_eos)
+ self._gst_player.connect("error", self._on_error)
+ self._gst_player.connect('seek-finished', self._on_seek_finished)
+ self._gst_player.connect("stream-start", self._on_stream_start)
+ self._gst_player.bind_property(
+ 'duration', self, 'duration', GObject.BindingFlags.SYNC_CREATE)
+ self._gst_player.bind_property(
+ 'state', self, 'state', GObject.BindingFlags.SYNC_CREATE)
+
+ self._lastfm = application.props.lastfm_scrobbler
+
+ @GObject.Property(
+ type=bool, default=False, flags=GObject.ParamFlags.READABLE)
+ def has_next(self):
+ """Test if the playlist has a next song.
+
+ :returns: True if the current song is not the last one.
+ :rtype: bool
+ """
+ return self._playlist.has_next()
+
+ @GObject.Property(
+ type=bool, default=False, flags=GObject.ParamFlags.READABLE)
+ def has_previous(self):
+ """Test if the playlist has a previous song.
+
+ :returns: True if the current song is not the first one.
+ :rtype: bool
+ """
+ return self._playlist.has_previous()
+
+ @GObject.Property(
+ type=bool, default=False, flags=GObject.ParamFlags.READABLE)
+ def playing(self):
+ """Test if a song is currently played.
+
+ :returns: True if a song is currently played.
+ :rtype: bool
+ """
+ return self.props.state == Playback.PLAYING
+
+ def _on_playlist_model_items_changed(self, model, pos, removed, added):
+ if (removed > 0
+ and model.get_n_items() == 0):
+ self.stop()
+
+ def _on_about_to_finish(self, klass):
+ if self.props.has_next:
+ self._log.debug("Song is about to finish, loading the next one.")
+ next_coresong = self._playlist.get_next()
+ new_url = next_coresong.props.url
+ self._gst_player.props.url = new_url
+ self._gapless_set = True
+
+ def _on_eos(self, klass):
+ self._playlist.next()
+
+ if self._gapless_set:
+ # After 'eos' in the gapless case, the pipeline needs to be
+ # hard reset.
+ self._log.debug("Song finished, loading the next one.")
+ self.stop()
+ self.play(self.props.current_song)
+ else:
+ self._log.debug("End of the playlist, stopping the player.")
+ self.stop()
+
+ self._gapless_set = False
+
+ def _on_error(self, klass=None):
+ self.stop()
+ self._gapless_set = False
+
+ current_song = self.props.current_song
+ current_song.props.validation = CoreSong.Validation.FAILED
+ if (self.has_next
+ and self.props.repeat_mode != RepeatMode.SONG):
+ self.next()
+
+ def _on_stream_start(self, klass):
+ if self._gapless_set:
+ self._playlist.next()
+
+ self._gapless_set = False
+ self._time_stamp = int(time.time())
+
+ self.emit("song-changed")
+
+ def _load(self, coresong):
+ self._log.debug("Loading song {}".format(coresong.props.title))
+ self._gst_player.props.state = Playback.LOADING
+ self._time_stamp = int(time.time())
+ self._gst_player.props.url = coresong.props.url
+
+ def play(self, coresong=None):
+ """Play a song.
+
+ Start playing a song, a specific CoreSong if supplied and
+ available or a song in the playlist decided by the play mode.
+
+ If a song is paused, a subsequent play call without a CoreSong
+ supplied will continue playing the paused song.
+
+ :param CoreSong coresong: The CoreSong to play or None.
+ """
+ if self.props.current_song is None:
+ coresong = self._playlist.set_song(coresong)
+
+ if (coresong is not None
+ and coresong.props.validation == CoreSong.Validation.FAILED
+ and self.props.repeat_mode != RepeatMode.SONG):
+ self._on_error()
+ return
+
+ if coresong is not None:
+ self._load(coresong)
+
+ if self.props.current_song is not None:
+ self._gst_player.props.state = Playback.PLAYING
+
+ def pause(self):
+ """Pause"""
+ self._gst_player.props.state = Playback.PAUSED
+
+ def stop(self):
+ """Stop"""
+ self._gst_player.props.state = Playback.STOPPED
+
+ def next(self):
+ """"Play next song
+
+ Play the next song of the playlist, if any.
+ """
+ if self._gapless_set:
+ self.set_position(0.0)
+ elif self._playlist.next():
+ self.play(self._playlist.props.current_song)
+
+ def previous(self):
+ """Play previous song
+
+ Play the previous song of the playlist, if any.
+ """
+ position = self._gst_player.props.position
+ if self._gapless_set:
+ self.stop()
+
+ if (position < 5
+ and self._playlist.has_previous()):
+ self._playlist.previous()
+ self._gapless_set = False
+ self.play(self._playlist.props.current_song)
+ # This is a special case for a song that is very short and the
+ # first song in the playlist. It can trigger gapless, but
+ # has_previous will return False.
+ elif (position < 5
+ and self._playlist.props.position == 0):
+ self.set_position(0.0)
+ self._gapless_set = False
+ self.play(self._playlist.props.current_song)
+ else:
+ self.set_position(0.0)
+
+ def play_pause(self):
+ """Toggle play/pause state"""
+ if self.props.state == Playback.PLAYING:
+ self.pause()
+ else:
+ self.play()
+
+ def _on_clock_tick(self, klass, tick):
+ self._log.debug("Clock tick {}, player at {} seconds".format(
+ tick, self._gst_player.props.position))
+
+ current_song = self._playlist.props.current_song
+
+ if tick == 0:
+ self._new_clock = True
+ self._lastfm.now_playing(current_song)
+
+ if self.props.duration == -1.:
+ return
+
+ position = self._gst_player.props.position
+ if position > 0:
+ percentage = tick / self.props.duration
+ if (not self._lastfm.props.scrobbled
+ and self.props.duration > 30.
+ and (percentage > 0.5 or tick > 4 * 60)):
+ self._lastfm.scrobble(current_song, self._time_stamp)
+
+ if (percentage > 0.5
+ and self._new_clock):
+ self._new_clock = False
+ current_song.bump_play_count()
+ current_song.set_last_played()
+
+ @GObject.Property(type=object)
+ def repeat_mode(self) -> RepeatMode:
+ """Gets current repeat mode.
+
+ :returns: current repeat mode
+ :rtype: RepeatMode
+ """
+ return self._repeat
+
+ @repeat_mode.setter # type: ignore
+ def repeat_mode(self, mode):
+ if mode == self._repeat:
+ return
+
+ self._repeat = mode
+ self._settings.set_enum("repeat", mode.value)
+
+ @GObject.Property(type=int, default=0, flags=GObject.ParamFlags.READABLE)
+ def position(self):
+ """Gets current song index.
+
+ :returns: position of the current song in the playlist.
+ :rtype: int
+ """
+ return self._playlist.props.position
+
+ @GObject.Property(
+ type=CoreSong, default=None, flags=GObject.ParamFlags.READABLE)
+ def current_song(self):
+ """Get the current song.
+
+ :returns: The song being played. None if there is no playlist.
+ :rtype: CoreSong
+ """
+ return self._playlist.props.current_song
+
+ def get_position(self):
+ """Get player position.
+
+ Player position in seconds.
+ :returns: position
+ :rtype: float
+ """
+ return self._gst_player.props.position
+
+ # TODO: used by MPRIS
+ def set_position(self, position_second):
+ """Change GstPlayer position.
+
+ If the position if negative, set it to zero.
+ If the position if greater than song duration, do nothing
+ :param float position_second: requested position in second
+ """
+ if position_second < 0.0:
+ position_second = 0.0
+
+ duration_second = self._gst_player.props.duration
+ if position_second <= duration_second:
+ self._gst_player.seek(position_second)
+
+ def _on_seek_finished(self, klass):
+ # FIXME: Just a proxy
+ self.emit('seek-finished')
diff --git a/gnomemusic/playlisttoast.py b/gnomemusic/playlisttoast.py
new file mode 100644
index 00000000..3de4b268
--- /dev/null
+++ b/gnomemusic/playlisttoast.py
@@ -0,0 +1,75 @@
+# Copyright 2022 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from typing import Optional
+import typing
+
+from gettext import gettext as _
+from gi.repository import Adw, GLib, GObject, Gio, Gtk
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.grilowrappers.grltrackerplaylists import Playlist
+
+
+class PlaylistToast(GObject.Object):
+ """Toast for playlist deletion, including undo
+ """
+
+ __gtype_name__ = "PlaylistToast"
+
+ def __init__(self, application: Application, playlist: Playlist) -> None:
+ """Initialize the toast for song deletion
+
+ :param Application application: Application object
+ :param Playlist playlist: The playlist that contains the song
+ """
+ super().__init__()
+
+ self._coregrilo = application.props.coregrilo
+ self._playlist = playlist
+ self._undo = False
+
+ toast = Adw.Toast.new(
+ _("Playlist {} removed".format(self._playlist.props.title)))
+ toast.set_button_label(_("Undo"))
+
+ toast.set_action_name("toast.undo")
+ application.props.window.install_action(
+ "toast.undo", None, self._toast_undo_cb)
+
+ toast.connect("dismissed", self._on_dismissed)
+ self._coregrilo.stage_playlist_deletion(self._playlist)
+
+ application.props.window._toast_overlay.add_toast(toast)
+
+ def _toast_undo_cb(
+ self, widget: Gtk.Widget, action: Gio.Action,
+ param: Optional[GLib.Variant]) -> None:
+ self._undo = True
+ self._coregrilo.finish_playlist_deletion(self._playlist, False)
+
+ def _on_dismissed(self, widget: Gtk.Widget) -> None:
+ if not self._undo:
+ self._coregrilo.finish_playlist_deletion(self._playlist, True)
diff --git a/gnomemusic/scrobbler.py b/gnomemusic/scrobbler.py
new file mode 100644
index 00000000..8025d590
--- /dev/null
+++ b/gnomemusic/scrobbler.py
@@ -0,0 +1,479 @@
+# Copyright (c) 2018 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from typing import Dict, Optional, Union, cast
+from enum import IntEnum
+from hashlib import md5
+
+import gi
+gi.require_version('Goa', '1.0')
+gi.require_version("Soup", "3.0")
+from gi.repository import Gio, GLib, Goa, GObject, Soup
+
+from gnomemusic.musiclogger import MusicLogger
+
+
+class GoaLastFM(GObject.GObject):
+ """Last.fm account handling through GOA
+ """
+
+ class State(IntEnum):
+ """GoaLastFM account State.
+
+ NOT_AVAILABLE: GOA does not handle Last.fm accounts
+ NOT_CONFIGURED: GOA handles Last.fm but no user account has
+ been configured
+ DISABLED: a user account exists, but it is disabled
+ ENABLED: a user account exists and is enabled
+ """
+ NOT_AVAILABLE = 0
+ NOT_CONFIGURED = 1
+ DISABLED = 2
+ ENABLED = 3
+
+ def __init__(self) -> None:
+ """Initialize GoaLastFM
+ """
+ super().__init__()
+ self._log = MusicLogger()
+
+ self._client: Optional[Goa.Client] = None
+ self._connection: Optional[Gio.DBusConnection] = None
+ self._state = GoaLastFM.State.NOT_AVAILABLE
+ self.notify("state")
+ self._reset_attributes()
+ Goa.Client.new(None, self._new_client_callback)
+
+ def _reset_attributes(self):
+ self._account = None
+ self._authentication = None
+ self._music_disabled_id = None
+
+ def _new_client_callback(self, source, result):
+ try:
+ self._client = source.new_finish(result)
+ except GLib.Error as error:
+ self._log.warning("Error: {}, {}".format(
+ error.code, error.message))
+ return
+
+ manager = self._client.get_manager()
+
+ if manager is None:
+ self._log.info("GNOME Online Accounts is unavailable")
+ return
+
+ try:
+ manager.call_is_supported_provider(
+ "lastfm", None, self._lastfm_is_supported_cb)
+ except TypeError:
+ self._log.warning("Error: Unable to check if last.fm is supported")
+
+ def _lastfm_is_supported_cb(self, proxy, result):
+ try:
+ lastfm_supported = proxy.call_is_supported_provider_finish(result)
+ except GLib.Error as e:
+ self._log.warning(
+ "Error: Unable to check if last.fm is supported: {}".format(
+ e.message))
+ return
+
+ if lastfm_supported is False:
+ return
+
+ self._state = GoaLastFM.State.NOT_CONFIGURED
+ self.notify("state")
+ self._client.connect("account-added", self._goa_account_added)
+ self._client.connect("account-removed", self._goa_account_removed)
+ self._find_lastfm_account()
+
+ def _goa_account_added(self, client, obj):
+ self._find_lastfm_account()
+
+ def _goa_account_removed(self, client, obj):
+ account = obj.get_account()
+ if account.props.provider_type == "lastfm":
+ self._account.disconnect(self._music_disabled_id)
+ self._state = GoaLastFM.State.NOT_CONFIGURED
+ self._reset_attributes()
+ self.notify("state")
+
+ def _find_lastfm_account(self):
+ accounts = self._client.get_accounts()
+
+ for obj in accounts:
+ account = obj.get_account()
+ if account.props.provider_type == "lastfm":
+ self._authentication = obj.get_oauth2_based()
+ self._account = account
+ self._music_disabled_id = self._account.connect(
+ 'notify::music-disabled', self._goa_music_disabled)
+ self._goa_music_disabled(self._account)
+ break
+
+ def _goa_music_disabled(self, klass, args=None):
+ if self._account.props.music_disabled is True:
+ self._state = GoaLastFM.State.DISABLED
+ else:
+ self._state = GoaLastFM.State.ENABLED
+
+ self.notify("state")
+
+ @GObject.Property(type=int, default=0, flags=GObject.ParamFlags.READABLE)
+ def state(self):
+ """Retrieve the state for the Last.fm account
+
+ :returns: The account state
+ :rtype: GoaLastFM.State
+ """
+ return self._state
+
+ def enable_music(self):
+ """Enable music suport of the Last.fm account"""
+ self._account.props.music_disabled = False
+
+ @GObject.Property(type=str, default="", flags=GObject.ParamFlags.READABLE)
+ def identity(self):
+ """Get Last.fm account identity
+
+ :returns: Last.fm account identity
+ :rtype: str
+ """
+ return self._account.props.identity
+
+ @GObject.Property
+ def secret(self):
+ """Retrieve the Last.fm client secret"""
+ return self._authentication.props.client_secret
+
+ @GObject.Property
+ def client_id(self):
+ """Retrieve the Last.fm client id"""
+ return self._authentication.props.client_id
+
+ @GObject.Property
+ def session_key(self):
+ """Retrieve the Last.fm session key"""
+ try:
+ return self._authentication.call_get_access_token_sync(None)[0]
+ except GLib.Error as e:
+ self._log.warning(
+ "Error: Unable to retrieve last.fm session key: {}".format(
+ e.message))
+ return None
+
+ def configure(self) -> None:
+ """Open the LastFM GOA Settings panel"""
+ if self.props.state == GoaLastFM.State.NOT_AVAILABLE:
+ self._log.warning("Error, cannot configure a Last.fm account.")
+ return
+
+ Gio.bus_get(Gio.BusType.SESSION, None, self._get_dbus_connection)
+
+ def _get_dbus_connection(
+ self, source: None, result: Gio.AsyncResult) -> None:
+ try:
+ self._connection = Gio.bus_get_finish(result)
+ except GLib.Error as e:
+ self._log.warning(
+ "Error: Unable to get the DBus connection: {}".format(
+ e.message))
+ return
+
+ try:
+ proxy = Gio.DBusProxy.new_sync(
+ self._connection, Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS
+ | Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES, None,
+ "org.gnome.Settings", "/org/gnome/Settings", "org.gtk.Actions",
+ None)
+ except GLib.Error as e:
+ self._log.warning(f"Unable to create proxy: {e.message}")
+ else:
+ self._activate_settings(proxy, True)
+
+ def _activate_settings(
+ self, settings_proxy: Gio.DBusProxy, try_fallback: bool) -> None:
+ if self._state == GoaLastFM.State.NOT_CONFIGURED:
+ params = [GLib.Variant("s", "add"), GLib.Variant("s", "lastfm")]
+ else:
+ params = [GLib.Variant("s", self._account.props.id)]
+
+ args = GLib.Variant("(sav)", ("online-accounts", params))
+ variant = GLib.Variant("(sava{sv})", ("launch-panel", [args], {}))
+ settings_proxy.call(
+ "Activate", variant, Gio.DBusCallFlags.NONE, -1, None,
+ self._on_settings_activated, try_fallback)
+
+ def _on_settings_activated(
+ self, proxy: Gio.DBusProxy, result: Gio.AsyncResult,
+ try_fallback: bool) -> None:
+ try:
+ proxy.call_finish(result)
+ except GLib.Error as e:
+ if try_fallback:
+ proxy = Gio.DBusProxy.new_sync(
+ self._connection, Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS
+ | Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES, None,
+ "org.gnome.ControlCenter", "/org/gnome/ControlCenter",
+ "org.gtk.Actions", None)
+ self._activate_settings(proxy, False)
+ else:
+ self._log.warning(
+ f"Error: Failed to activate Settings: {e.message}")
+
+
+class LastFmScrobbler(GObject.GObject):
+ """Scrobble songs to Last.fm"""
+
+ def __init__(self, application):
+ """Intialize LastFm Scrobbler
+
+ :param Application application: Application object
+ """
+ super().__init__()
+
+ self._log = application.props.log
+ self._settings = application.props.settings
+ self._report = self._settings.get_boolean("lastfm-report")
+
+ self._scrobbled = False
+ self._account_state = GoaLastFM.State.NOT_AVAILABLE
+
+ self._goa_lastfm = GoaLastFM()
+ self._goa_lastfm.bind_property(
+ "state", self, "account-state", GObject.BindingFlags.SYNC_CREATE)
+
+ self._soup_session = Soup.Session.new()
+ self._scrobble_cache = []
+
+ def configure(self):
+ self._goa_lastfm.configure()
+
+ @GObject.Property(type=str, default="", flags=GObject.ParamFlags.READABLE)
+ def identity(self):
+ """Get Last.fm account identity
+
+ :returns: Last.fm account identity
+ :rtype: str
+ """
+ return self._goa_lastfm.props.identity
+
+ @GObject.Property(type=int, default=GoaLastFM.State.NOT_AVAILABLE)
+ def account_state(self):
+ """Get the Last.fm account state
+
+ :returns: state of the Last.fm account
+ :rtype: GoaLastFM.State
+ """
+ return self._account_state
+
+ @account_state.setter # type: ignore
+ def account_state(self, value):
+ """Set the Last.fm account state
+
+ The account state depends on GoaLast.fm state property.
+ :param GoaLastFM.State value: new state
+ """
+ self._account_state = value
+ self.notify("can-scrobble")
+
+ @GObject.Property(type=bool, default=False)
+ def can_scrobble(self):
+ """Get can scrobble status
+
+ Music is reported to Last.fm if the "lastfm-report" setting is
+ True and if a Goa Last.fm account is configured with music
+ support enabled.
+
+ :returns: True is music is reported to Last.fm
+ :rtype: bool
+ """
+ return (self.props.account_state == GoaLastFM.State.ENABLED
+ and self._report is True)
+
+ @can_scrobble.setter # type: ignore
+ def can_scrobble(self, value):
+ """Set the can_scrobble status
+
+ If no account is configured, nothing happens.
+ If the new value is True, "lastfm-report" is changed and music
+ support in the Last.fm is enabled if necessary.
+ If the new value is False, "lastfm-report" is changed but the
+ Last.fm account is not changed.
+ :param bool value: new value
+ """
+ if self.props.account_state == GoaLastFM.State.NOT_CONFIGURED:
+ return
+
+ if (value is True
+ and self.props.account_state == GoaLastFM.State.DISABLED):
+ self._goa_lastfm.enable_music()
+
+ self._settings.set_boolean("lastfm-report", value)
+ self._report = value
+
+ @GObject.Property(type=bool, default=False)
+ def scrobbled(self):
+ """Bool indicating current scrobble status"""
+ return self._scrobbled
+
+ @scrobbled.setter # type: ignore
+ def scrobbled(self, scrobbled):
+ self._scrobbled = scrobbled
+
+ def _lastfm_api_call(self, coresong, time_stamp, request_type_key):
+ """Internal method called by self.scrobble"""
+ api_key = self._goa_lastfm.client_id
+ sk = self._goa_lastfm.session_key
+ if sk is None:
+ self._log.warning(
+ "Error: Unable to perform last.fm api call {}".format(
+ request_type_key))
+ return
+ secret = self._goa_lastfm.secret
+
+ artist = coresong.props.artist
+ title = coresong.props.title
+
+ request_type = {
+ "update now playing": "track.updateNowPlaying",
+ "scrobble": "track.scrobble"
+ }
+
+ # The album is optional. So only provide it when it is
+ # available.
+ album = coresong.props.album
+
+ request_dict = {}
+ if (request_type_key == "scrobble"
+ and time_stamp is not None):
+ self._scrobble_cache.append({
+ "artist": artist,
+ "track": title,
+ "album": album,
+ "timestamp": time_stamp
+ })
+
+ for index, data in enumerate(self._scrobble_cache):
+ request_dict.update({
+ "artist[{}]".format(index): data['artist'],
+ "track[{}]".format(index): data['track'],
+ "timestamp[{}]".format(index): str(data['timestamp']),
+ })
+ if album:
+ request_dict.update({
+ "album[{}]".format(index): data['album']
+ })
+ else:
+ if album:
+ request_dict.update({
+ "album": album
+ })
+
+ if time_stamp is not None:
+ request_dict.update({
+ "timestamp": str(time_stamp)
+ })
+
+ request_dict.update({
+ "artist": artist,
+ "track": title,
+ })
+
+ request_dict.update({
+ "api_key": api_key,
+ "method": request_type[request_type_key],
+ "sk": sk,
+ })
+
+ sig = ""
+ for key in sorted(request_dict):
+ sig += key + request_dict[key]
+
+ sig += secret
+
+ api_sig = md5(sig.encode()).hexdigest()
+ request_dict.update({
+ "api_sig": api_sig
+ })
+
+ msg = Soup.Message.new_from_encoded_form(
+ "POST", "https://ws.audioscrobbler.com/2.0/",
+ Soup.form_encode_hash(request_dict))
+ data = {
+ "msg": msg,
+ "request_type_key": request_type_key,
+ }
+ self._soup_session.send_async(
+ msg, GLib.PRIORITY_DEFAULT, None, self._lastfm_api_callback, data)
+
+ def _lastfm_api_callback(
+ self, session: Soup.Session,
+ result: Gio.AsyncResult,
+ data: Dict[str, Union[str, Soup.Message]]) -> None:
+ """Internal callback method called by queue_message"""
+ msg = cast(Soup.Message, data["msg"])
+ request_type_key = cast(str, data["request_type_key"])
+
+ status_code = msg.props.status_code
+ if status_code != 200:
+ self._log.debug("Failed to {} track {} : {}".format(
+ request_type_key, status_code, msg.props.reason_phrase))
+ self._log.debug(msg.props.response_body.data)
+ elif (status_code == 200
+ and request_type_key == "scrobble"):
+ self._scrobble_cache.clear()
+
+ def scrobble(self, coresong, time_stamp):
+ """Scrobble a song to Last.fm.
+
+ If not connected to Last.fm nothing happens
+
+ :param coresong: CoreSong to scrobble
+ :param time_stamp: song loaded time (epoch time)
+ """
+ self.props.scrobbled = True
+
+ if not self.props.can_scrobble:
+ return
+
+ self._lastfm_api_call(coresong, time_stamp, "scrobble")
+
+ def now_playing(self, coresong):
+ """Set now playing song to Last.fm
+
+ If not connected to Last.fm nothing happens
+
+ :param coresong: CoreSong to use for now playing
+ """
+ self.props.scrobbled = False
+
+ if coresong is None:
+ return
+
+ if not self.props.can_scrobble:
+ return
+
+ self._lastfm_api_call(coresong, None, "update now playing")
diff --git a/gnomemusic/search.py b/gnomemusic/search.py
new file mode 100644
index 00000000..3e2a85cc
--- /dev/null
+++ b/gnomemusic/search.py
@@ -0,0 +1,47 @@
+# Copyright 2018 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from enum import IntEnum
+
+from gi.repository import GObject
+
+
+class Search(GObject.GObject):
+
+ class State(IntEnum):
+ """States the Search can have
+
+ NONE: No ongoing search.
+ RESULT: Search with result.
+ NO_RESULT: Search without result.
+ """
+ NONE = 0
+ RESULT = 1
+ NO_RESULT = 2
+
+ search_mode_active = GObject.Property(type=bool, default=False)
+ state = GObject.Property(type=int, default=0)
+
+ def __init__(self):
+ super().__init__()
diff --git a/gnomemusic/songart.py b/gnomemusic/songart.py
new file mode 100644
index 00000000..18c4f204
--- /dev/null
+++ b/gnomemusic/songart.py
@@ -0,0 +1,79 @@
+# Copyright 2020 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import gi
+gi.require_version("MediaArt", "2.0")
+from gi.repository import GObject, MediaArt
+
+from gnomemusic.asyncqueue import AsyncQueue
+from gnomemusic.embeddedart import EmbeddedArt
+from gnomemusic.fileexistsasync import FileExistsAsync
+from gnomemusic.storeart import StoreArt
+
+
+class SongArt(GObject.GObject):
+ """SongArt retrieval object
+ """
+
+ _async_queue = AsyncQueue("SongArt")
+
+ def __init__(self, application, coresong):
+ """Initialize SongArt
+
+ :param Application application: The application object
+ :param CoreSong coresong: The coresong to use
+ """
+ super().__init__()
+
+ self._coresong = coresong
+ self._coregrilo = application.props.coregrilo
+ self._album = self._coresong.props.album
+ self._artist = self._coresong.props.artist
+
+ self._in_cache()
+
+ def _on_embedded_art_found(self, embeddedart, found):
+ if found:
+ self._in_cache()
+ else:
+ self._coregrilo.get_song_art(self._coresong, StoreArt())
+
+ def _in_cache(self):
+ success, thumb_file = MediaArt.get_file(
+ self._artist, self._album, "album")
+ if not success:
+ return
+
+ def on_file_exists_async_finished(obj, result):
+ if result:
+ self._coresong.props.thumbnail = thumb_file.get_uri()
+ else:
+ embedded = EmbeddedArt()
+ embedded.connect("art-found", self._on_embedded_art_found)
+ embedded.query(self._coresong, self._album)
+
+ file_exists_async = FileExistsAsync()
+ file_exists_async.connect(
+ "finished", on_file_exists_async_finished)
+ self._async_queue.queue(file_exists_async, thumb_file)
diff --git a/gnomemusic/songtoast.py b/gnomemusic/songtoast.py
new file mode 100644
index 00000000..084acc22
--- /dev/null
+++ b/gnomemusic/songtoast.py
@@ -0,0 +1,85 @@
+# Copyright 2022 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from typing import Optional
+import typing
+
+from gettext import gettext as _
+from gi.repository import Adw, GLib, GObject, Gio, Gtk
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.grilowrappers.grltrackerplaylists import Playlist
+ from gnomemusic.coresong import CoreSong
+
+
+class SongToast(GObject.Object):
+ """Toast for song deletion, including undo
+ """
+
+ __gtype_name__ = "SongToast"
+
+ def __init__(
+ self, application: Application, playlist: Playlist, position: int,
+ coresong: CoreSong) -> None:
+ """Initialize the toast for song deletion
+
+ :param Application application: Application object
+ :param Playlist playlist: The playlist that contains the song
+ :param int position: The song position in the playlist
+ :param CoreSong coresong: The coresong to be deleted
+ """
+ super().__init__()
+
+ self._coregrilo = application.props.coregrilo
+ self._coresong = coresong
+ self._playlist = playlist
+ self._position = position
+ self._undo = False
+
+ playlist_title = self._playlist.props.title
+ song_title = self._coresong.props.title
+ toast = Adw.Toast.new(
+ _("{} removed from {}".format(song_title, playlist_title)))
+ toast.set_button_label(_("Undo"))
+
+ toast.set_action_name("toast.undo")
+ application.props.window.install_action(
+ "toast.undo", None, self._toast_undo_cb)
+
+ toast.connect("dismissed", self._on_dismissed)
+ playlist.stage_song_deletion(self._coresong, position)
+
+ application.props.window._toast_overlay.add_toast(toast)
+
+ def _toast_undo_cb(
+ self, widget: Gtk.Widget, action: Gio.Action,
+ param: Optional[GLib.Variant]) -> None:
+ self._undo = True
+ self._playlist.undo_pending_song_deletion(
+ self._coresong, self._position)
+
+ def _on_dismissed(self, widget: Gtk.Widget) -> None:
+ if not self._undo:
+ self._playlist.finish_song_deletion(self._coresong, self._position)
diff --git a/gnomemusic/storeart.py b/gnomemusic/storeart.py
new file mode 100644
index 00000000..ffee7abd
--- /dev/null
+++ b/gnomemusic/storeart.py
@@ -0,0 +1,167 @@
+# Copyright 2020 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import gi
+gi.require_versions({"MediaArt": "2.0", "Soup": "3.0"})
+from gi.repository import Gio, GLib, GObject, MediaArt, Soup, GdkPixbuf
+
+from gnomemusic.musiclogger import MusicLogger
+from gnomemusic.utils import CoreObjectType
+
+
+class StoreArt(GObject.Object):
+ """Stores Art in the MediaArt cache.
+ """
+
+ __gsignals__ = {
+ "finished": (GObject.SignalFlags.RUN_FIRST, None, ())
+ }
+
+ def __init__(self):
+ """Initialize StoreArtistArt
+
+ :param coreobject: The CoreArtist or CoreAlbum to store art for
+ :param string uri: The art uri
+ """
+ super().__init__()
+
+ self._coreobject = None
+
+ self._file = None
+ self._log = MusicLogger()
+ self._soup_session = Soup.Session.new()
+
+ def start(self, coreobject, uri, coreobjecttype):
+ self._coreobject = coreobject
+
+ if (uri is None
+ or uri == ""):
+ self.emit("finished")
+ return
+
+ if coreobjecttype == CoreObjectType.ARTIST:
+ success, self._file = MediaArt.get_file(
+ self._coreobject.props.artist, None, "artist")
+ elif coreobjecttype == CoreObjectType.ALBUM:
+ success, self._file = MediaArt.get_file(
+ self._coreobject.props.artist, self._coreobject.props.title,
+ "album")
+ elif coreobjecttype == CoreObjectType.SONG:
+ success, self._file = MediaArt.get_file(
+ self._coreobject.props.artist, self._coreobject.props.album,
+ "album")
+ else:
+ success = False
+
+ if not success:
+ self.emit("finished")
+ return
+
+ cache_dir = GLib.build_filenamev(
+ [GLib.get_user_cache_dir(), "media-art"])
+ cache_dir_file = Gio.File.new_for_path(cache_dir)
+ cache_dir_file.query_info_async(
+ Gio.FILE_ATTRIBUTE_ACCESS_CAN_READ, Gio.FileQueryInfoFlags.NONE,
+ GLib.PRIORITY_DEFAULT_IDLE, None, self._cache_dir_info_read, uri)
+
+ def _cache_dir_info_read(self, cache_dir_file, res, uri):
+ try:
+ cache_dir_file.query_info_finish(res)
+ except GLib.Error:
+ # directory does not exist yet
+ try:
+ cache_dir_file.make_directory(None)
+ except GLib.Error as error:
+ self._log.warning(
+ "Error: {}, {}".format(error.domain, error.message))
+ self.emit("finished")
+ return
+
+ msg = Soup.Message.new("GET", uri)
+ self._soup_session.send_and_read_async(
+ msg, GLib.PRIORITY_DEFAULT, None, self._read_callback)
+
+ def _read_callback(
+ self, session: Soup.Session, result: Gio.AsyncResult) -> None:
+ try:
+ bytes = session.send_and_read_finish(result)
+ except GLib.Error as error:
+ self._log.debug(
+ f"Failed to get remote art: {error.domain}, {error.message}")
+ self.emit("finished")
+
+ istream = Gio.MemoryInputStream.new_from_bytes(bytes)
+ GdkPixbuf.Pixbuf.new_from_stream_async(
+ istream, None, self._pixbuf_from_stream_finished)
+
+ def _pixbuf_from_stream_finished(
+ self, stream: Gio.MemoryInputStream,
+ result: Gio.AsyncResult) -> None:
+ try:
+ pixbuf = GdkPixbuf.Pixbuf.new_from_stream_finish(result)
+ except GLib.Error as error:
+ self._log.warning(f"Error: {error.domain}, {error.message}")
+ self.emit("finished")
+ else:
+ self._file.create_async(
+ Gio.FileCreateFlags.NONE, GLib.PRIORITY_DEFAULT_IDLE, None,
+ self._output_stream_created, pixbuf)
+ finally:
+ stream.close_async(
+ GLib.PRIORITY_DEFAULT_IDLE, None, self._stream_closed)
+
+ def _output_stream_created(
+ self, stream: Gio.FileOutputStream, result: Gio.AsyncResult,
+ pixbuf: GdkPixbuf.Pixbuf) -> None:
+ try:
+ output_stream = stream.create_finish(result)
+ except GLib.Error as error:
+ # File already exists.
+ self._log.info(f"Error: {error.domain}, {error.message}")
+ self.emit("finished")
+ else:
+ pixbuf.save_to_streamv_async(
+ output_stream, "jpeg", None, None, None,
+ self._output_stream_saved, output_stream)
+
+ def _output_stream_saved(
+ self, pixbuf: GdkPixbuf.Pixbuf, result: Gio.AsyncResult,
+ output_stream: Gio.FileOutputStream) -> None:
+ try:
+ pixbuf.save_to_stream_finish(result)
+ except GLib.Error as error:
+ self._log.warning(f"Error: {error.domain}, {error.message}")
+ else:
+ self._coreobject.props.thumbnail = self._file.get_uri()
+ finally:
+ self.emit("finished")
+ output_stream.close_async(
+ GLib.PRIORITY_DEFAULT_IDLE, None, self._stream_closed)
+
+ def _stream_closed(
+ self, stream: Gio.OutputStream, result: Gio.AsyncResult) -> None:
+ try:
+ stream.close_finish(result)
+ except GLib.Error as error:
+ self._log.warning(f"Error: {error.domain}, {error.message}")
diff --git a/gnomemusic/texturecache.py b/gnomemusic/texturecache.py
new file mode 100644
index 00000000..300f2e0c
--- /dev/null
+++ b/gnomemusic/texturecache.py
@@ -0,0 +1,172 @@
+# Copyright 2022 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from enum import IntEnum
+from typing import Dict, Optional, Tuple, Union
+import time
+import typing
+
+from gi.repository import GLib, GObject, Gdk, Gio
+
+from gnomemusic.asyncqueue import AsyncQueue
+from gnomemusic.musiclogger import MusicLogger
+from gnomemusic.mediaartloader import MediaArtLoader
+if typing.TYPE_CHECKING:
+ from gnomemusic.corealbum import CoreAlbum
+ from gnomemusic.coreartist import CoreArtist
+ from gnomemusic.coresong import CoreSong
+
+if typing.TYPE_CHECKING:
+ CoreObject = Union[CoreAlbum, CoreArtist, CoreSong]
+
+
+class TextureCache(GObject.GObject):
+ """Retrieval and cache for artwork textures
+ """
+
+ class LoadingState(IntEnum):
+ """The loading status of the URI
+
+ AVAILABLE: The texture is currently cached
+ UNAVAILABLE: No texture is available for the URI
+ CLEARED: The texture was available, has been cleared and
+ should be available on lookup
+ """
+ AVAILABLE = 0
+ UNAVAILABLE = 1
+ CLEARED = 2
+
+ __gtype_name__ = "TextureCache"
+
+ __gsignals__ = {
+ "texture": (GObject.SignalFlags.RUN_FIRST, None, (object, ))
+ }
+
+ # Music has two main cycling views (AlbumsView and ArtistsView),
+ # both have around 200 cycling items each when fully used. For
+ # the cache to be useful it needs to be larger than the given
+ # numbers combined.
+ _MAX_CACHE_SIZE = 800
+
+ _async_queue = AsyncQueue("TextureCache")
+ _cleanup_id = 0
+ _log = MusicLogger()
+ _memory_monitor = Gio.MemoryMonitor.dup_default()
+ _size = _MAX_CACHE_SIZE
+ _textures: Dict[str, Tuple[
+ TextureCache.LoadingState, float, Optional[Gdk.Texture]]] = {}
+
+ def __init__(self) -> None:
+ """Initialize Texturecache
+ """
+ super().__init__()
+
+ self._art_loader: MediaArtLoader
+ self._art_loading_id = 0
+
+ if TextureCache._cleanup_id == 0:
+ TextureCache._cleanup_id = GLib.timeout_add_seconds(
+ 10, TextureCache._cache_cleanup)
+ TextureCache._memory_monitor.connect(
+ "low-memory-warning", TextureCache._low_memory_warning)
+
+ def clear_pending_lookup_callback(self) -> None:
+ """Disconnect ongoing lookup callback
+ """
+ if self._art_loading_id != 0:
+ self._art_loader.disconnect(self._art_loading_id)
+ self._art_loading_id = 0
+
+ def lookup(self, uri: str) -> None:
+ """Look up a texture for the given MediaArt uri
+
+ :param str uri: The MediaArt uri
+ """
+ self.clear_pending_lookup_callback()
+
+ if uri in TextureCache._textures.keys():
+ state, _, texture = TextureCache._textures[uri]
+ if state in [
+ TextureCache.LoadingState.AVAILABLE,
+ TextureCache.LoadingState.UNAVAILABLE]:
+ self.emit("texture", texture)
+ TextureCache._textures[uri] = (state, time.time(), texture)
+ return
+
+ self._art_loader = MediaArtLoader()
+ self._art_loading_id = self._art_loader.connect(
+ "finished", self._on_art_loading_finished, uri)
+ self._async_queue.queue(self._art_loader, uri)
+
+ @classmethod
+ def _low_memory_warning(
+ cls, mm: Gio.MemoryMonitor,
+ level: Gio.MemoryMonitorWarningLevel) -> None:
+ if level < Gio.MemoryMonitorWarningLevel.LOW:
+ TextureCache._size = TextureCache._MAX_CACHE_SIZE
+ else:
+ # List slicing with 0 gives an empty list in
+ # _cache_cleanup.
+ TextureCache._size = 1
+
+ @classmethod
+ def _cache_cleanup(cls) -> None:
+ """Sorts the available cache entries by recency and evicts
+ the oldest items to match the maximum cache size.
+ """
+ sorted_available = {
+ k: (state, t, texture)
+ for k, (state, t, texture) in sorted(
+ TextureCache._textures.items(), key=lambda item: item[1][1])
+ if state in [TextureCache.LoadingState.AVAILABLE]}
+
+ sorted_available_l = len(sorted_available)
+ if sorted_available_l < TextureCache._size:
+ return GLib.SOURCE_CONTINUE
+
+ keys_to_clear = list(sorted_available.keys())[:-TextureCache._size]
+ for key in keys_to_clear:
+ state, t, texture = TextureCache._textures[key]
+ TextureCache._textures[key] = (
+ TextureCache.LoadingState.CLEARED, t, None)
+
+ keys_l = len(keys_to_clear)
+ TextureCache._log.info(
+ f"Cleared {keys_l} items, texture cache contains"
+ f" {sorted_available_l-keys_l} available items.")
+
+ return GLib.SOURCE_CONTINUE
+
+ def _on_art_loading_finished(
+ self, art_loader: MediaArtLoader, texture: Gdk.Texture,
+ uri: str) -> None:
+ if texture:
+ state = TextureCache.LoadingState.AVAILABLE
+ else:
+ state = TextureCache.LoadingState.UNAVAILABLE
+
+ TextureCache._textures[uri] = (state, time.time(), texture)
+
+ self.emit("texture", texture)
diff --git a/gnomemusic/trackerwrapper.py b/gnomemusic/trackerwrapper.py
new file mode 100644
index 00000000..3ab69c2c
--- /dev/null
+++ b/gnomemusic/trackerwrapper.py
@@ -0,0 +1,305 @@
+# Copyright 2019 The GNOME Music developers
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+import os
+import typing
+from enum import IntEnum
+from typing import Optional
+
+from gi.repository import Gio, GLib, GObject, Tracker
+
+if typing.TYPE_CHECKING:
+ from gi.repository import Grl
+
+ from gnomemusic.application import Application
+
+
+class TrackerState(IntEnum):
+ """Tracker Status
+ """
+ AVAILABLE = 0
+ UNAVAILABLE = 1
+ OUTDATED = 2
+
+
+class TrackerWrapper(GObject.GObject):
+
+ def __init__(self, application: Application) -> None:
+ """Create a connection to an instance of Tracker
+
+ :param Application application: The application object
+ """
+ super().__init__()
+
+ self._log = application.props.log
+ self._application_id = application.props.application_id
+
+ self._local_db: Tracker.SparqlConnection = None
+ self._local_db_available = TrackerState.UNAVAILABLE
+
+ self._miner_fs: Tracker.SparqlConnection = None
+ self._miner_fs_busname = ""
+ self._miner_fs_available = TrackerState.UNAVAILABLE
+
+ self._setup_local_db()
+ self._setup_host_miner_fs()
+
+ @staticmethod
+ def _in_flatpak() -> bool:
+ """Indicates if Music is running as flatpak
+
+ :returns: True if running as flatpak.
+ :rtype: bool
+ """
+ return os.path.exists("/.flatpak-info")
+
+ def _setup_host_miner_fs(self) -> None:
+ self._miner_fs_busname = "org.freedesktop.Tracker3.Miner.Files"
+
+ self._log.debug(
+ "Connecting to session-wide Tracker indexer at {}".format(
+ self._miner_fs_busname))
+
+ try:
+ self._miner_fs = Tracker.SparqlConnection.bus_new(
+ self._miner_fs_busname, None, None)
+ self._log.info("Using session-wide tracker-miner-fs-3")
+ self._miner_fs_available = TrackerState.AVAILABLE
+ self.notify("tracker-available")
+ except GLib.Error as error:
+ self._log.warning(
+ "Could not connect to host Tracker miner-fs at {}: {}".format(
+ self._miner_fs_busname, error))
+ if self._in_flatpak():
+ self._setup_local_miner_fs()
+ else:
+ self._miner_fs_busname = ""
+ self.notify("tracker-available")
+
+ def _setup_local_miner_fs(self) -> None:
+ self._miner_fs_busname = self._application_id + ".Tracker3.Miner.Files"
+ self._log.debug(
+ "Connecting to bundled Tracker indexer at {}".format(
+ self._miner_fs_busname))
+
+ # Calling self._application.get_dbus_connection() seems to return None
+ # here, so get the bus directly from Gio.
+ Gio.bus_get(Gio.BusType.SESSION, None,
+ self._setup_local_bus_connection_cb)
+
+ def _setup_local_bus_connection_cb(self, klass, result):
+ # Query callback for _setup_local_miner_fs() to connect to session bus
+ bus = Gio.bus_get_finish(result)
+
+ miner_fs_startup_timeout_msec = 30 * 1000
+ miner_fs_object_path = "/org/freedesktop/Tracker3/Miner/Files"
+
+ bus.call(
+ self._miner_fs_busname, miner_fs_object_path,
+ "org.freedesktop.DBus.Peer", "Ping", None, None,
+ Gio.DBusCallFlags.NONE, miner_fs_startup_timeout_msec, None,
+ self._setup_local_miner_fs_ping_cb)
+
+ def _setup_local_miner_fs_ping_cb(
+ self, klass: Gio.DBusProxy, result: Gio.AsyncResult) -> None:
+ try:
+ klass.call_finish(result)
+ self._log.info("Using bundled tracker-miner-fs-3")
+ self._miner_fs = Tracker.SparqlConnection.bus_new(
+ self._miner_fs_busname, None, None)
+ self._miner_fs_available = TrackerState.AVAILABLE
+ self.notify("tracker-available")
+ except GLib.Error as error:
+ self._log.warning(
+ "Could not start local Tracker miner-fs at {}: {}".format(
+ self._miner_fs_busname, error))
+ self._miner_fs_busname = ""
+ self.notify("tracker-available")
+
+ def _setup_local_db(self) -> None:
+ # Open a local Tracker database.
+ try:
+ self._local_db = Tracker.SparqlConnection.new(
+ Tracker.SparqlConnectionFlags.NONE,
+ Gio.File.new_for_path(self.cache_directory()),
+ Tracker.sparql_get_ontology_nepomuk(),
+ None)
+ except GLib.Error as error:
+ self._log.warning(
+ "Error: {}, {}".format(error.domain, error.message))
+ self.notify("tracker-available")
+ return
+
+ # Version checks against the local version of Tracker can be done
+ # here, set `self._tracker_available = TrackerState.OUTDATED` if the
+ # checks fail.
+ self._local_db_available = TrackerState.AVAILABLE
+ self.notify("tracker-available")
+
+ def cache_directory(self) -> str:
+ """Get directory which contains Music private data.
+
+ :returns: private store path
+ :rtype: str
+ """
+ return GLib.build_pathv(
+ GLib.DIR_SEPARATOR_S,
+ [GLib.get_user_cache_dir(), "gnome-music", "db"])
+
+ @GObject.Property(type=str, flags=GObject.ParamFlags.READABLE)
+ def miner_fs_busname(self) -> str:
+ return self._miner_fs_busname
+
+ @GObject.Property(type=object, flags=GObject.ParamFlags.READABLE)
+ def local_db(self) -> Tracker.SparqlConnection:
+ return self._local_db
+
+ @GObject.Property(
+ type=int, default=TrackerState.UNAVAILABLE,
+ flags=GObject.ParamFlags.READABLE)
+ def tracker_available(self) -> TrackerState:
+ """Get Tracker availability.
+
+ :returns: tracker availability
+ :rtype: TrackerState
+ """
+ if (self._local_db_available == TrackerState.AVAILABLE
+ and self._miner_fs_available == TrackerState.AVAILABLE):
+ return TrackerState.AVAILABLE
+ elif (self._local_db_available == TrackerState.OUTDATED
+ or self._miner_fs_available == TrackerState.OUTDATED):
+ return TrackerState.OUTDATED
+ else:
+ return TrackerState.UNAVAILABLE
+
+ def location_filter(self) -> Optional[str]:
+ try:
+ music_dir = GLib.get_user_special_dir(
+ GLib.UserDirectory.DIRECTORY_MUSIC)
+ assert music_dir is not None
+ except (TypeError, AssertionError):
+ self._log.message("XDG Music dir is not set")
+ return None
+
+ music_dir = Tracker.sparql_escape_string(
+ GLib.filename_to_uri(music_dir))
+
+ query = "FILTER (STRSTARTS(nie:isStoredAs(?song), '{}/'))".format(
+ music_dir)
+
+ return query
+
+ def _update_favorite(self, media: Grl.Media) -> None:
+ """Update favorite state of a song
+
+ :param Grl.Media media: media which contains updated favorite state
+ """
+ if (media.get_favourite()):
+ update = """
+ INSERT DATA {
+ <%(urn)s> a nmm:MusicPiece ;
+ nao:hasTag nao:predefined-tag-favorite .
+ }
+ """.replace("\n", "").strip() % {
+ "urn": media.get_id(),
+ }
+ else:
+ update = """
+ DELETE DATA {
+ <%(urn)s> nao:hasTag nao:predefined-tag-favorite .
+ }
+ """.replace("\n", "").strip() % {
+ "urn": media.get_id(),
+ }
+
+ def _update_favorite_cb(conn, res):
+ try:
+ conn.update_finish(res)
+ except GLib.Error as e:
+ self._log.warning("Unable to update favorite: {}".format(
+ e.message))
+
+ self._local_db.update_async(update, None, _update_favorite_cb)
+
+ def _update_play_count(self, media: Grl.Media) -> None:
+ update = """
+ DELETE WHERE {
+ <%(urn)s> nie:usageCounter ?count .
+ };
+ INSERT DATA {
+ <%(urn)s> a nmm:MusicPiece ;
+ nie:usageCounter %(count)d .
+ }
+ """.replace("\n", "").strip() % {
+ "urn": media.get_id(),
+ "count": media.get_play_count(),
+ }
+
+ def _update_play_count_cb(conn, res):
+ try:
+ conn.update_finish(res)
+ except GLib.Error as e:
+ self._log.warning("Unable to update play count: {}".format(
+ e.message))
+
+ self._local_db.update_async(update, None, _update_play_count_cb)
+
+ def _update_last_played(self, media: Grl.Media) -> None:
+ last_played = media.get_last_played().format_iso8601()
+ update = """
+ DELETE WHERE {
+ <%(urn)s> nie:contentAccessed ?accessed
+ };
+ INSERT DATA {
+ <%(urn)s> a nmm:MusicPiece ;
+ nie:contentAccessed "%(last_played)s"
+ }
+ """.replace("\n", "").strip() % {
+ "urn": media.get_id(),
+ "last_played": last_played,
+ }
+
+ def _update_last_played_cb(conn, res):
+ try:
+ conn.update_finish(res)
+ except GLib.Error as e:
+ self._log.warning("Unable to update play count: {}".format(
+ e.message))
+
+ self._local_db.update_async(update, None, _update_last_played_cb)
+
+ def update_tag(self, media: Grl.Media, tag: str) -> None:
+ """Update property of a resource.
+
+ :param Grl.Media media: media which contains updated tag
+ :param str tag: tag to update
+ """
+ if tag == "favorite":
+ self._update_favorite(media)
+ elif tag == "last-played":
+ self._update_last_played(media)
+ elif tag == "play-count":
+ self._update_play_count(media)
+ else:
+ self._log.warning("Unknown tag: '{}'".format(tag))
diff --git a/gnomemusic/utils.py b/gnomemusic/utils.py
new file mode 100644
index 00000000..208f8707
--- /dev/null
+++ b/gnomemusic/utils.py
@@ -0,0 +1,213 @@
+# Copyright (c) 2016 Marinus Schraal <mschraal@src.gnome.org>
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from enum import Enum, IntEnum
+from typing import List, Union
+import re
+import unicodedata
+
+from gettext import gettext as _
+from gi.repository import Gio, GLib, Gtk
+
+from gnomemusic.musiclogger import MusicLogger
+
+
+class ArtSize(Enum):
+ """Enum for icon sizes"""
+ XSMALL = (42, 42)
+ SMALL = (74, 74)
+ MEDIUM = (192, 192)
+ LARGE = (256, 256)
+
+ def __init__(self, width, height):
+ """Intialize width and height"""
+ self.width = width
+ self.height = height
+
+
+class CoreObjectType(Enum):
+ """Indicates the type of the CoreObject passed"""
+ ALBUM = 0
+ ARTIST = 1
+ SONG = 2
+
+
+class DefaultIconType(Enum):
+ ALBUM = "folder-music-symbolic"
+ ARTIST = "music-artist-symbolic"
+
+
+class SongStateIcon(Enum):
+ """Enum for icons used in song playing and validation"""
+ ERROR = "dialog-error-symbolic"
+ PLAYING = "media-playback-start-symbolic"
+
+
+class View(IntEnum):
+ """Enum for views"""
+ EMPTY = 0
+ ALBUM = 1
+ ARTIST = 2
+ SONG = 3
+ PLAYLIST = 4
+ SEARCH = 5
+
+
+def get_album_title(item):
+ """Returns the album title associated with the media item
+
+ In case of an audio file the get_album call returns the
+ album title and in case of a container we are looking for
+ the title.
+
+ :param Grl.Media item: A Grilo Media object
+ :return: The album title
+ :rtype: str
+ """
+ if item.is_container():
+ album = get_media_title(item)
+ else:
+ album = (item.get_album()
+ or _("Unknown album"))
+
+ return album
+
+
+def get_artist_name(item):
+ """Returns the preferred artist for a media item.
+
+ The artist name for a particular media item can be either
+ the main artist of the full album (album artist), the
+ artist of the song (artist) or possibly it is not known at
+ all. The first is preferred in most cases, because it is
+ the most accurate in an album setting.
+
+ :param Grl.Media item: A Grilo Media object
+ :return: The artist name
+ :rtype: str
+ """
+
+ return (item.get_album_artist()
+ or item.get_artist()
+ or _("Unknown Artist"))
+
+
+def get_media_title(item):
+ """Returns the title of the media item.
+
+ :param Grl.Media item: A Grilo Media object
+ :return: The title
+ :rtype: str
+ """
+
+ title = item.get_title()
+
+ if not title:
+ url = item.get_url()
+ # FIXME: This and the later occurance are user facing strings,
+ # but they ideally should never be seen. A media should always
+ # contain a URL or we can not play it, in that case it should
+ # be removed.
+ if url is None:
+ return "NO URL"
+ file_ = Gio.File.new_for_uri(url)
+ try:
+ # FIXME: query_info is not async.
+ fileinfo = file_.query_info(
+ "standard::display-name", Gio.FileQueryInfoFlags.NONE, None)
+ except GLib.Error as error:
+ MusicLogger().warning(
+ "Error: {}, {}".format(error.domain, error.message))
+ return "NO URL"
+ title = fileinfo.get_display_name()
+ title = title.replace("_", " ")
+
+ return title
+
+
+def get_media_year(item):
+ """Returns the year when the media was published.
+
+ :param Grl.Media item: A Grilo Media object
+ :return: The publication year or None if not defined
+ :rtype: str or None
+ """
+ date = item.get_publication_date()
+
+ if not date:
+ return None
+
+ return str(date.get_year())
+
+
+def seconds_to_string(duration):
+ """Convert a time in seconds to a mm:ss string
+
+ :param int duration: Time in seconds
+ :return: Time in mm:ss format
+ :rtype: str
+ """
+ seconds = duration
+ minutes = seconds // 60
+ seconds %= 60
+
+ return '{:d}:{:02d}'.format(minutes, seconds)
+
+
+def normalize_caseless(text):
+ """Get a normalized casefolded version of a string.
+
+ :param str text: string to normalize
+ :returns: normalized casefolded string
+ :rtype: str
+ """
+ return unicodedata.normalize("NFKD", text.casefold())
+
+
+def natural_sort_names(name_a: str, name_b: str) -> int:
+ """Natural order comparison of two strings.
+
+ A natural order is an alphabetical order which takes into account
+ digit numbers. For example, it returns ["Album 3", "Album 10"]
+ instead of ["Album 10", "Album 3"] for an alphabetical order.
+ The names are also normalized to properly take into account names
+ which contain accents.
+
+ :param str name_a: first string to compare
+ :param str name_b: second string to compare
+ :returns: Gtk Ordering
+ :rtype: int
+ """
+ def _extract_numbers(text: str) -> List[Union[int, str]]:
+ return [int(tmp) if tmp.isdigit() else tmp
+ for tmp in re.split(r"(\d+)", normalize_caseless(text))]
+
+ extract_a = _extract_numbers(name_a)
+ extract_b = _extract_numbers(name_b)
+ if extract_a < extract_b:
+ return Gtk.Ordering.SMALLER
+ elif extract_a > extract_b:
+ return Gtk.Ordering.LARGER
+ else:
+ return Gtk.Ordering.EQUAL
diff --git a/gnomemusic/views/__init__.py b/gnomemusic/views/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/gnomemusic/views/__init__.py
diff --git a/gnomemusic/views/albumsview.py b/gnomemusic/views/albumsview.py
new file mode 100644
index 00000000..44123267
--- /dev/null
+++ b/gnomemusic/views/albumsview.py
@@ -0,0 +1,262 @@
+# Copyright 2019 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+import typing
+
+from gettext import gettext as _
+from gi.repository import GObject, Gtk
+from typing import Dict, List
+
+from gnomemusic.coverpaintable import CoverPaintable
+from gnomemusic.utils import ArtSize, DefaultIconType
+from gnomemusic.widgets.headerbar import HeaderBar
+from gnomemusic.widgets.albumwidget import AlbumWidget
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.corealbum import CoreAlbum
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/AlbumsView.ui")
+class AlbumsView(Gtk.Stack):
+ """Gridlike view of all albums
+
+ Album activation switches to AlbumWidget.
+ """
+
+ __gtype_name__ = "AlbumsView"
+
+ icon_name = GObject.Property(
+ type=str, default="media-optical-cd-audio-symbolic",
+ flags=GObject.ParamFlags.READABLE)
+ search_mode_active = GObject.Property(type=bool, default=False)
+ selection_mode = GObject.Property(type=bool, default=False)
+ title = GObject.Property(
+ type=str, default=_("Albums"), flags=GObject.ParamFlags.READABLE)
+
+ _album_scrolled_window = Gtk.Template.Child()
+ _scrolled_window = Gtk.Template.Child()
+ _gridview = Gtk.Template.Child()
+
+ def __init__(self, application: Application) -> None:
+ """Initialize AlbumsView
+
+ :param application: The Application object
+ """
+ super().__init__(transition_type=Gtk.StackTransitionType.CROSSFADE)
+
+ self.props.name = "albums"
+
+ self._application = application
+ self._window = application.props.window
+ self._headerbar = self._window.props.headerbar
+
+ self._list_item_bindings: Dict[
+ Gtk.ListItem, List[GObject.Binding]] = {}
+ self._list_item_star_controllers: Dict[
+ Gtk.ListItem, List[GObject.Binding]] = {}
+
+ list_item_factory = Gtk.SignalListItemFactory()
+ list_item_factory.connect("setup", self._setup_list_item)
+ list_item_factory.connect("bind", self._bind_list_item)
+ list_item_factory.connect("unbind", self._unbind_list_item)
+
+ self._gridview.props.factory = list_item_factory
+
+ self._selection_model = Gtk.MultiSelection.new(
+ self._application.props.coremodel.props.albums_sort)
+ self._gridview.props.model = self._selection_model
+
+ self._gridview.connect("activate", self._on_album_activated)
+
+ self.bind_property(
+ "selection-mode", self._gridview, "single-click-activate",
+ GObject.BindingFlags.SYNC_CREATE
+ | GObject.BindingFlags.INVERT_BOOLEAN)
+ self.bind_property(
+ "selection-mode", self._gridview, "enable-rubberband",
+ GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selection-mode", self._window, "selection-mode",
+ GObject.BindingFlags.DEFAULT)
+
+ self._window.connect(
+ "notify::selection-mode", self._on_selection_mode_changed)
+
+ self._album_widget = AlbumWidget(self._application)
+ self._album_widget.bind_property(
+ "selection-mode", self, "selection-mode",
+ GObject.BindingFlags.BIDIRECTIONAL)
+
+ viewport = self._album_scrolled_window.get_first_child()
+ viewport.set_child(self._album_widget)
+
+ self.connect(
+ "notify::search-mode-active", self._on_search_mode_changed)
+
+ def _on_selection_mode_changed(self, widget, data=None):
+ selection_mode = self._window.props.selection_mode
+ if (selection_mode == self.props.selection_mode
+ or self.get_parent().get_visible_child() != self):
+ return
+
+ self.props.selection_mode = selection_mode
+ if not self.props.selection_mode:
+ self.deselect_all()
+
+ def _on_search_mode_changed(self, klass, param):
+ if (not self.props.search_mode_active
+ and self._headerbar.props.stack.props.visible_child == self
+ and self.get_visible_child_name() == "widget"):
+ self._set_album_headerbar(self._album_widget.props.corealbum)
+
+ def _back_button_clicked(self, widget, data=None):
+ self._headerbar.state = HeaderBar.State.MAIN
+ self.props.visible_child = self._scrolled_window
+
+ def _on_album_activated(self, widget, position):
+ corealbum = widget.props.model[position]
+
+ self._album_widget.props.corealbum = corealbum
+ self._set_album_headerbar(corealbum)
+ self.props.visible_child = self._album_scrolled_window
+
+ def _on_child_activated(self, widget, child, user_data=None):
+ corealbum = child.props.corealbum
+ if self.props.selection_mode:
+ return
+
+ # Update and display the album widget if not in selection mode
+ self._album_widget.props.corealbum = corealbum
+
+ self._set_album_headerbar(corealbum)
+ self.set_visible_child_name("widget")
+
+ def _set_album_headerbar(self, corealbum: CoreAlbum) -> None:
+ self._headerbar.props.state = HeaderBar.State.CHILD
+ self._headerbar.set_label_title(
+ corealbum.props.title, corealbum.props.artist)
+
+ def _toggle_all_selection(self, selected):
+ """Selects or deselects all items.
+ """
+ with self._application.props.coreselection.freeze_notify():
+ if self.get_visible_child_name() == "widget":
+ if selected is True:
+ self._album_widget.select_all()
+ else:
+ self._album_widget.deselect_all()
+ else:
+ if selected:
+ self._selection_model.select_all()
+ else:
+ self._selection_model.unselect_all()
+
+ def select_all(self):
+ self._toggle_all_selection(True)
+
+ def deselect_all(self):
+ self._toggle_all_selection(False)
+
+ def _setup_list_item(
+ self, factory: Gtk.SignalListItemFactory,
+ list_item: Gtk.ListItem) -> None:
+ builder = Gtk.Builder.new_from_resource(
+ "/org/gnome/Music/ui/AlbumCoverListItem.ui")
+ list_item.props.child = builder.get_object("_album_cover")
+ cover_image = list_item.props.child.get_first_child().get_first_child()
+ cover_image.set_size_request(
+ ArtSize.MEDIUM.width, ArtSize.MEDIUM.height)
+ cover_image.props.paintable = CoverPaintable(
+ self, ArtSize.MEDIUM, icon_type=DefaultIconType.ALBUM)
+
+ self.bind_property(
+ "selection-mode", list_item, "selectable",
+ GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selection-mode", list_item, "activatable",
+ GObject.BindingFlags.SYNC_CREATE
+ | GObject.BindingFlags.INVERT_BOOLEAN)
+
+ def _bind_list_item(
+ self, factory: Gtk.SignalListItemFactory,
+ list_item: Gtk.ListItem) -> None:
+ album_cover = list_item.props.child
+ corealbum = list_item.props.item
+
+ cover_image = album_cover.get_first_child().get_first_child()
+ check = cover_image.get_next_sibling()
+ album_label = album_cover.get_first_child().get_next_sibling()
+ artist_label = album_label.get_next_sibling()
+
+ b1 = corealbum.bind_property(
+ "corealbum", cover_image.props.paintable, "coreobject",
+ GObject.BindingFlags.SYNC_CREATE)
+ b2 = corealbum.bind_property(
+ "title", album_label, "label", GObject.BindingFlags.SYNC_CREATE)
+ b3 = corealbum.bind_property(
+ "artist", artist_label, "label", GObject.BindingFlags.SYNC_CREATE)
+
+ b4 = list_item.bind_property(
+ "selected", corealbum, "selected",
+ GObject.BindingFlags.SYNC_CREATE)
+ b5 = list_item.bind_property(
+ "selected", check, "active", GObject.BindingFlags.SYNC_CREATE)
+ b6 = self.bind_property(
+ "selection-mode", check, "visible",
+ GObject.BindingFlags.SYNC_CREATE)
+
+ def on_activated(widget, value):
+ if check.props.active:
+ self._selection_model.select_item(
+ list_item.get_position(), False)
+ else:
+ self._selection_model.unselect_item(
+ list_item.get_position())
+
+ # the listitem selected property is read-only.
+ # It cannot be bound from the check active property.
+ # It is necessary to update the selection model in order
+ # to update it.
+ check.connect("notify::active", on_activated)
+
+ self._list_item_bindings[list_item] = [b1, b2, b3, b4, b5, b6]
+
+ def _unbind_list_item(
+ self, factory: Gtk.SignalListItemFactory,
+ list_item: Gtk.ListItem) -> None:
+ bindings = self._list_item_bindings.pop(list_item)
+ [binding.unbind() for binding in bindings]
+
+ album_cover = list_item.props.child
+
+ cover_image = album_cover.get_first_child().get_first_child()
+ check = cover_image.get_next_sibling()
+
+ signal_id, detail_id = GObject.signal_parse_name(
+ "notify::active", check, True)
+ handler_id = GObject.signal_handler_find(
+ check, GObject.SignalMatchType.ID, signal_id, detail_id, None, 0,
+ 0)
+ check.disconnect(handler_id)
diff --git a/gnomemusic/views/artistsview.py b/gnomemusic/views/artistsview.py
new file mode 100644
index 00000000..b4c92809
--- /dev/null
+++ b/gnomemusic/views/artistsview.py
@@ -0,0 +1,160 @@
+# Copyright (c) 2016 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+import typing
+
+from gettext import gettext as _
+from gi.repository import GObject, Gtk
+
+from gnomemusic.widgets.artistalbumswidget import ArtistAlbumsWidget
+from gnomemusic.widgets.artisttile import ArtistTile
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/ArtistsView.ui")
+class ArtistsView(Gtk.Paned):
+ """Main view of all available artists
+
+ Consists of a list of artists on the left side and an overview of
+ all albums by this artist on the right side.
+ """
+
+ __gtype_name__ = "ArtistsView"
+
+ icon_name = GObject.Property(
+ type=str, default="music-artist-symbolic",
+ flags=GObject.ParamFlags.READABLE)
+ title = GObject.Property(
+ type=str, default=_("Artists"), flags=GObject.ParamFlags.READABLE)
+
+ _artist_view = Gtk.Template.Child()
+ _sidebar = Gtk.Template.Child()
+
+ def __init__(self, application: Application) -> None:
+ """Initialize
+
+ :param GtkApplication application: The application object
+ """
+ super().__init__()
+
+ self.props.name = "artists"
+
+ # This indicates if the current list has been empty and has
+ # had no user interaction since.
+ self._untouched_list = True
+
+ self._window = application.props.window
+ self._coremodel = application.props.coremodel
+ self._model = self._coremodel.props.artists_sort
+
+ self._selection_model = Gtk.SingleSelection.new(self._model)
+ self._sidebar.props.model = self._selection_model
+ artist_item_factory = Gtk.SignalListItemFactory()
+ artist_item_factory.connect("setup", self._on_list_view_setup)
+ artist_item_factory.connect("bind", self._on_list_view_bind)
+ self._sidebar.props.factory = artist_item_factory
+
+ self._artist_album = ArtistAlbumsWidget(application)
+ self._artist_view.props.child = self._artist_album
+
+ self.bind_property(
+ "selection-mode", self._artist_album, "selection-mode",
+ GObject.BindingFlags.SYNC_CREATE
+ | GObject.BindingFlags.BIDIRECTIONAL)
+ self._window.bind_property(
+ "selection-mode", self, "selection-mode",
+ GObject.BindingFlags.BIDIRECTIONAL)
+
+ self._selection_model.connect_after(
+ "items-changed", self._on_model_items_changed)
+ self._on_model_items_changed(self._selection_model, 0, 0, 0)
+
+ self._selection_mode = False
+
+ def _on_list_view_setup(
+ self, factory: Gtk.SignalListItemFactory,
+ list_item: Gtk.ListItem) -> None:
+ list_item.props.child = ArtistTile()
+
+ def _on_list_view_bind(
+ self, factory: Gtk.SignalListItemFactory,
+ list_item: Gtk.ListItem) -> None:
+ coreartist = list_item.props.item
+ artist_tile = list_item.props.child
+ artist_tile.props.coreartist = coreartist
+
+ def _on_model_items_changed(
+ self, model: Gtk.SingleSelection, position: int, removed: int,
+ added: int) -> None:
+ if model.get_n_items() == 0:
+ self._untouched_list = True
+ # FIXME: Add an empty state.
+ elif self._untouched_list is True:
+ self._untouched_list = False
+ self._sidebar.emit("activate", 0)
+
+ @Gtk.Template.Callback()
+ def _on_artist_activated(
+ self, sidebar: Gtk.ListView, position: int) -> None:
+ """Initializes new artist album widgets"""
+ coreartist = self._selection_model.get_item(position)
+ self._artist_album.props.coreartist = coreartist
+
+ @GObject.Property(type=bool, default=False)
+ def selection_mode(self):
+ """selection mode getter
+
+ :returns: If selection mode is active
+ :rtype: bool
+ """
+ return self._selection_mode
+
+ @selection_mode.setter # type: ignore
+ def selection_mode(self, value):
+ """selection-mode setter
+
+ :param bool value: Activate selection mode
+ """
+ if (value == self._selection_mode
+ or self._window.props.active_view is not self):
+ return
+
+ self._selection_mode = value
+ self._sidebar.props.sensitive = not self._selection_mode
+ if not self._selection_mode:
+ self.deselect_all()
+
+ def select_all(self) -> None:
+ """Select all items"""
+ coreartist = self._selection_model.get_selected_item()
+ if coreartist:
+ coreartist.props.selected = True
+
+ def deselect_all(self) -> None:
+ """Deselect all items"""
+ coreartist = self._selection_model.get_selected_item()
+ if coreartist:
+ coreartist.props.selected = False
diff --git a/gnomemusic/views/emptyview.py b/gnomemusic/views/emptyview.py
new file mode 100644
index 00000000..e1dc068a
--- /dev/null
+++ b/gnomemusic/views/emptyview.py
@@ -0,0 +1,149 @@
+# Copyright (c) 2016 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from enum import IntEnum
+
+from gettext import gettext as _
+from gi.repository import GLib, GObject, Gtk, Tracker
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/EmptyView.ui")
+class EmptyView(Gtk.Stack):
+ """Empty view when there is no music to display
+
+ This view can have several states
+
+ EMPTY: No music has been found at startup (default)
+ SEARCH: No music found with a user search
+ NO_TRACKER: Tracker is unavailable
+ TRACKER_OUTDATED: Tracker version is too old
+ """
+
+ class State(IntEnum):
+ """Enum for EmptyView state."""
+ EMPTY = 0
+ SEARCH = 1
+ NO_TRACKER = 2
+ TRACKER_OUTDATED = 3
+
+ __gtype_name__ = "EmptyView"
+
+ _description_label = Gtk.Template.Child()
+ _initial_state = Gtk.Template.Child()
+ _status_page = Gtk.Template.Child()
+
+ def __init__(self):
+ super().__init__()
+
+ # FIXME: This is now duplicated here and in GrlTrackerWrapper.
+ try:
+ music_folder = GLib.get_user_special_dir(
+ GLib.UserDirectory.DIRECTORY_MUSIC)
+ assert music_folder is not None
+ except (TypeError, AssertionError):
+ self._content_text = _("Your XDG Music directory is not set.")
+ return
+
+ music_folder = Tracker.sparql_escape_string(
+ GLib.filename_to_uri(music_folder))
+
+ href_text = "<a href='{}'>{}</a>".format(
+ music_folder, _("Music Folder"))
+
+ # TRANSLATORS: This is a label to display a link to open user's music
+ # folder. {} will be replaced with the translated text 'Music folder'
+ folder_text = _("The contents of your {} will appear here.")
+ self._content_text = folder_text.format(href_text)
+
+ # Hack to get to AdwClamp, so it can be hidden for the
+ # initial state.
+ child_of_child = self._status_page.get_first_child().get_first_child()
+ self._adw_clamp = child_of_child.get_first_child().get_first_child()
+
+ self._status_page.set_child(self._initial_state)
+
+ self._state = EmptyView.State.EMPTY
+
+ @GObject.Property(type=int, default=0, minimum=0, maximum=4)
+ def state(self):
+ """Get the state of the empty view
+
+ :returns: The view state
+ :rtype: int
+ """
+ return self._state
+
+ @state.setter # type: ignore
+ def state(self, value):
+ """Set the state of the empty view
+
+ :param int value: new state
+ """
+ self._state = value
+
+ self._adw_clamp.props.visible = True
+ self._initial_state.props.visible = False
+
+ if self._state == EmptyView.State.EMPTY:
+ self._set_empty_state()
+ elif self._state == EmptyView.State.SEARCH:
+ self._set_search_state()
+ elif self._state == EmptyView.State.NO_TRACKER:
+ self._set_no_tracker_state()
+ elif self._state == EmptyView.State.TRACKER_OUTDATED:
+ self._set_tracker_outdated_state()
+
+ def _set_empty_state(self):
+ self._adw_clamp.props.visible = False
+ self._initial_state.props.visible = True
+
+ self._description_label.props.label = self._content_text
+
+ def _set_search_state(self):
+ self._status_page.props.title = _("No Music Found")
+ self._status_page.props.description = _("Try a Different Search")
+
+ def _set_no_tracker_state(self):
+ self._status_page.props.title = _(
+ "GNOME Music could not connect to Tracker.")
+ self._status_page.props.description = _(
+ "Your music files cannot be indexed without Tracker running.")
+
+ self._status_page.props.icon_name = "dialog-error-symbolic"
+
+ def _set_tracker_outdated_state(self):
+ self._status_page.props.title = _(
+ "Your system Tracker version seems outdated.")
+ self._status_page.props.description = _(
+ "Music needs Tracker version 3.0.0 or higher.")
+
+ self._status_page.props.icon_name = "dialog-error-symbolic"
+
+ def select_all(self):
+ """Cannot select songs from EmptyView."""
+ pass
+
+ def deselect_all(self):
+ """Cannot select songs from EmptyView."""
+ pass
diff --git a/gnomemusic/views/playlistsview.py b/gnomemusic/views/playlistsview.py
new file mode 100644
index 00000000..58c107e7
--- /dev/null
+++ b/gnomemusic/views/playlistsview.py
@@ -0,0 +1,162 @@
+# Copyright 2020 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gettext import gettext as _
+from typing import Optional
+
+from gi.repository import GObject, Gtk
+
+from gnomemusic.grilowrappers.grltrackerplaylists import Playlist
+from gnomemusic.widgets.playlistswidget import PlaylistsWidget
+from gnomemusic.widgets.playlisttile import PlaylistTile
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/PlaylistsView.ui")
+class PlaylistsView(Gtk.Paned):
+ """Main view for playlists"""
+
+ __gtype_name__ = "PlaylistsView"
+
+ icon_name = GObject.Property(
+ type=str, default="view-list-symbolic",
+ flags=GObject.ParamFlags.READABLE)
+ title = GObject.Property(
+ type=str, default=_("Playlists"), flags=GObject.ParamFlags.READABLE)
+
+ _sidebar = Gtk.Template.Child()
+
+ def __init__(self, application):
+ """Initialize
+
+ :param GtkApplication application: The application object
+ """
+ super().__init__()
+
+ self.props.name = "playlists"
+
+ self._coremodel = application.props.coremodel
+ self._model = self._coremodel.props.playlists_sort
+
+ # This indicates if the current list has been empty and has
+ # had no user interaction since.
+ self._untouched_list = True
+
+ self._playlist_widget = PlaylistsWidget(application, self)
+ self.props.end_child = self._playlist_widget
+
+ self._sidebar.set_header_func(self._sidebar_header_func)
+ self._sidebar.bind_model(self._model, self._add_playlist_to_sidebar)
+
+ self._coremodel.connect(
+ "notify::active-core-object", self._on_active_core_object_changed)
+
+ self._model.connect("items-changed", self._on_playlists_model_changed)
+ self._on_playlists_model_changed(self._model, 0, 0, 0)
+
+ def _sidebar_header_func(
+ self, row: Gtk.ListBoxRow,
+ before: Optional[Gtk.ListBoxRow]) -> None:
+ if (before
+ and before.props.playlist.props.is_smart
+ and not row.props.playlist.props.is_smart):
+ separator = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
+ separator.props.height_request = 2
+ separator.props.margin_end = 16
+ separator.props.margin_start = 16
+ row.set_header(separator)
+ else:
+ row.set_header(None)
+
+ def _add_playlist_to_sidebar(self, playlist):
+ """Add a playlist to sidebar
+
+ :param GrlMedia playlist: playlist to add
+ :param int index: position
+ """
+ row = PlaylistTile(playlist)
+ return row
+
+ def _on_playlists_model_changed(self, model, position, removed, added):
+ if model.get_n_items() == 0:
+ self._untouched_list = True
+ return
+ elif self._untouched_list is True:
+ first_row = self._sidebar.get_row_at_index(0)
+ self._sidebar.select_row(first_row)
+ self._on_playlist_activated(self._sidebar, first_row, True)
+ return
+
+ if removed == 0:
+ return
+
+ row_next = (self._sidebar.get_row_at_index(position)
+ or self._sidebar.get_row_at_index(position - 1))
+ if row_next:
+ self._sidebar.select_row(row_next)
+ self._on_playlist_activated(self._sidebar, row_next, True)
+
+ @GObject.Property(
+ type=Playlist, default=None, flags=GObject.ParamFlags.READABLE)
+ def current_playlist(self):
+ selection = self._sidebar.get_selected_row()
+ if selection is None:
+ return None
+
+ return selection.props.playlist
+
+ @Gtk.Template.Callback()
+ def _on_playlist_activated(self, sidebar, row, untouched=False):
+ """Update view with content from selected playlist"""
+ if untouched is False:
+ self._untouched_list = False
+
+ self.notify("current-playlist")
+
+ def _on_active_core_object_changed(self, klass, val):
+ """Selects the active playlist when an MPRIS client
+ has changed it.
+ """
+ active_core_object = self._coremodel.props.active_core_object
+ selection = self._sidebar.get_selected_row()
+ if (not isinstance(active_core_object, Playlist)
+ or active_core_object == selection.props.playlist):
+ return
+
+ playlist_row = None
+ for row in self._sidebar:
+ if row.props.playlist == active_core_object:
+ playlist_row = row
+ break
+
+ if not playlist_row:
+ return
+
+ self._sidebar.select_row(playlist_row)
+ self._on_playlist_activated(self._sidebar, playlist_row)
+
+ @GObject.Property(
+ type=bool, default=False, flags=GObject.ParamFlags.READABLE)
+ def rename_active(self):
+ """Indicate if renaming dialog is active"""
+ return self._playlist_widget.props.rename_active
diff --git a/gnomemusic/views/searchview.py b/gnomemusic/views/searchview.py
new file mode 100644
index 00000000..cd7cf3f9
--- /dev/null
+++ b/gnomemusic/views/searchview.py
@@ -0,0 +1,401 @@
+# Copyright (c) 2016 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from enum import IntEnum
+from gettext import gettext as _
+from typing import Optional
+import typing
+
+from gi.repository import GObject, Gtk
+
+from gnomemusic.search import Search
+from gnomemusic.utils import ArtSize
+from gnomemusic.widgets.albumcover import AlbumCover
+from gnomemusic.widgets.albumwidget import AlbumWidget
+from gnomemusic.widgets.headerbar import HeaderBar
+from gnomemusic.widgets.artistalbumswidget import ArtistAlbumsWidget
+from gnomemusic.widgets.artistsearchtile import ArtistSearchTile
+from gnomemusic.widgets.songwidget import SongWidget
+from gnomemusic.widgets.songwidgetmenu import SongWidgetMenu
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.corealbum import CoreAlbum
+ from gnomemusic.coresong import CoreSong
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/SearchView.ui")
+class SearchView(Gtk.Stack):
+ """Gridlike view of search results.
+
+ Three sections: artists, albums, songs.
+ """
+
+ __gtype_name__ = "SearchView"
+
+ class State(IntEnum):
+ """The different states of SearchView
+ """
+ MAIN = 0
+ ALL_ALBUMS = 1
+ ALL_ARTISTS = 2
+ ALBUM = 3
+ ARTIST = 4
+
+ search_state = GObject.Property(type=int, default=Search.State.NONE)
+ selection_mode = GObject.Property(type=bool, default=False)
+ state = GObject.Property(type=int, default=State.MAIN)
+ title = GObject.Property(
+ type=str, default="", flags=GObject.ParamFlags.READABLE)
+
+ _album_header = Gtk.Template.Child()
+ _album_flowbox = Gtk.Template.Child()
+ _album_all_flowbox = Gtk.Template.Child()
+ _all_search_results = Gtk.Template.Child()
+ _artist_header = Gtk.Template.Child()
+ _artist_all_flowbox = Gtk.Template.Child()
+ _artist_flowbox = Gtk.Template.Child()
+ _scrolled_album_widget = Gtk.Template.Child()
+ _search_results = Gtk.Template.Child()
+ _songs_header = Gtk.Template.Child()
+ _songs_listbox = Gtk.Template.Child()
+ _view_all_albums = Gtk.Template.Child()
+ _view_all_artists = Gtk.Template.Child()
+
+ def __init__(self, application: Application) -> None:
+ """Initialize SearchView
+
+ :param GtkApplication application: The Application object
+ """
+ super().__init__(transition_type=Gtk.StackTransitionType.CROSSFADE)
+
+ self.props.name = "search"
+
+ self._application = application
+ self._coremodel = application.props.coremodel
+ self._model = self._coremodel.props.songs_search
+ self._player = self._application.props.player
+ self._window = application.props.window
+ self._headerbar = self._window.props.headerbar
+
+ self._album_model = self._coremodel.props.albums_search
+ self._artist_model = self._coremodel.props.artists_search
+
+ self._album_slice = Gtk.SliceListModel.new(self._album_model, 0, 8)
+ self._artist_slice = Gtk.SliceListModel.new(self._artist_model, 0, 6)
+
+ self._model.connect_after(
+ "items-changed", self._on_model_items_changed)
+ self._songs_listbox.bind_model(self._model, self._create_song_widget)
+ self._on_model_items_changed(self._model, 0, 0, 0)
+
+ self._album_slice.connect_after(
+ "items-changed", self._on_album_model_items_changed)
+ self._album_flowbox.bind_model(
+ self._album_slice, self._create_album_cover)
+ self._application.props.window.connect(
+ "notify::default-width", self._on_window_width_change)
+
+ self._artist_slice.connect_after(
+ "items-changed", self._on_artist_model_items_changed)
+ self._artist_flowbox.bind_model(
+ self._artist_slice, self._create_artist_widget)
+
+ self.connect("notify::selection-mode", self._on_selection_mode_changed)
+
+ self.bind_property(
+ 'selection-mode', self._window, 'selection-mode',
+ GObject.BindingFlags.BIDIRECTIONAL)
+
+ self._album_widget = AlbumWidget(self._application)
+ self._album_widget.bind_property(
+ "selection-mode", self, "selection-mode",
+ GObject.BindingFlags.BIDIRECTIONAL)
+ viewport = self._scrolled_album_widget.get_first_child()
+ viewport.set_child(self._album_widget)
+
+ self._scrolled_artist_window: Optional[Gtk.ScrolledWindow] = None
+
+ self._search_mode_active = False
+
+ def _core_filter(self, coreitem, coremodel, nr_items):
+ if coremodel.get_n_items() <= 5:
+ return True
+
+ for i in range(nr_items):
+ if coremodel.get_item(i) == coreitem:
+ return True
+
+ return False
+
+ def _create_song_widget(self, coresong: CoreSong) -> Gtk.ListBoxRow:
+ song_widget = SongWidget(coresong, False, True)
+ song_widget.props.show_song_number = False
+ song_widget.props.menu = SongWidgetMenu(
+ self._application, song_widget, coresong)
+
+ self.bind_property(
+ "selection-mode", song_widget, "selection-mode",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+
+ return song_widget
+
+ def _create_album_cover(self, corealbum: CoreAlbum) -> AlbumCover:
+ album_cover = AlbumCover(corealbum)
+ album_cover.retrieve()
+
+ self.bind_property(
+ "selection-mode", album_cover, "selection-mode",
+ GObject.BindingFlags.SYNC_CREATE
+ | GObject.BindingFlags.BIDIRECTIONAL)
+
+ # NOTE: Adding SYNC_CREATE here will trigger all the nested
+ # models to be created. This will slow down initial start,
+ # but will improve initial 'select all' speed.
+ album_cover.bind_property(
+ "selected", corealbum, "selected",
+ GObject.BindingFlags.BIDIRECTIONAL)
+
+ return album_cover
+
+ def _create_artist_widget(self, coreartist):
+ artist_tile = ArtistSearchTile(coreartist)
+
+ self.bind_property(
+ "selection-mode", artist_tile, "selection-mode",
+ GObject.BindingFlags.SYNC_CREATE
+ | GObject.BindingFlags.BIDIRECTIONAL)
+
+ return artist_tile
+
+ def _on_album_model_items_changed(self, model, position, removed, added):
+ items_found = model.get_n_items() > 0
+ self._album_header.props.visible = items_found
+ self._album_flowbox.props.visible = items_found
+ self._check_visibility()
+
+ nr_albums = self._album_model.get_n_items()
+ self._view_all_albums.props.visible = (nr_albums > model.get_n_items())
+
+ def _on_artist_model_items_changed(self, model, position, removed, added):
+ items_found = model.get_n_items() > 0
+ self._artist_header.props.visible = items_found
+ self._artist_flowbox.props.visible = items_found
+ self._check_visibility()
+
+ nr_artists = self._artist_model.get_n_items()
+ self._view_all_artists.props.visible = (
+ nr_artists > model.get_n_items())
+
+ def _on_model_items_changed(self, model, position, removed, added):
+ items_found = model.get_n_items() > 0
+ self._songs_header.props.visible = items_found
+ self._songs_listbox.props.visible = items_found
+ self._check_visibility()
+
+ def _check_visibility(self):
+ if not self.props.search_mode_active:
+ return
+
+ items_found = (self._model.get_n_items() > 0
+ or self._artist_model.get_n_items() > 0
+ or self._album_model.get_n_items() > 0)
+ if items_found:
+ self.props.search_state = Search.State.RESULT
+ else:
+ self.props.search_state = Search.State.NO_RESULT
+
+ @Gtk.Template.Callback()
+ def _song_activated(
+ self, list_box: Gtk.ListBox, song_widget: SongWidget) -> bool:
+ coresong = song_widget.props.coresong
+ if self.props.selection_mode:
+ selection_state = coresong.props.selected
+ song_widget.props.selected = not selection_state
+ coresong.props.selected = not selection_state
+ return True
+
+ self._coremodel.props.active_core_object = coresong
+ self._player.play(coresong)
+
+ return True
+
+ def _on_window_width_change(self, widget, value):
+ allocation = self._album_flowbox.get_allocation()
+ # FIXME: Just a bit of guesswork here.
+ padding = 32
+ items_per_row = allocation.width // (ArtSize.MEDIUM.width + padding)
+
+ self._album_slice.props.size = 2 * items_per_row
+ self._artist_slice.props.size = items_per_row
+
+ @Gtk.Template.Callback()
+ def _on_album_activated(self, widget, child, user_data=None):
+ corealbum = child.props.corealbum
+ if self.props.selection_mode:
+ corealbum.props.selected = not corealbum.props.selected
+ return
+
+ # Update and display the album widget if not in selection mode
+ self._album_widget.props.corealbum = corealbum
+
+ self.props.state = SearchView.State.ALBUM
+ self._headerbar.props.state = HeaderBar.State.SEARCH
+ self._headerbar.set_label_title(
+ corealbum.props.title, corealbum.props.artist)
+
+ self.set_visible_child(self._scrolled_album_widget)
+ self.props.search_mode_active = False
+
+ @Gtk.Template.Callback()
+ def _on_artist_activated(self, widget, child, user_data=None):
+ coreartist = child.props.coreartist
+ if self.props.selection_mode:
+ return
+
+ artist_albums_widget = ArtistAlbumsWidget(self._application)
+ artist_albums_widget.props.coreartist = coreartist
+ # FIXME: Recreating a view here. Alternate solution is used
+ # in AlbumsView: one view created and an update function.
+ # Settle on one design.
+ self._scrolled_artist_window = Gtk.ScrolledWindow()
+ self._scrolled_artist_window.props.child = artist_albums_widget
+ self._scrolled_artist_window.props.visible = True
+ self.add_child(self._scrolled_artist_window)
+ artist_albums_widget.show()
+
+ self.bind_property(
+ "selection-mode", artist_albums_widget, "selection-mode",
+ GObject.BindingFlags.BIDIRECTIONAL)
+
+ self.props.state = SearchView.State.ARTIST
+ self._headerbar.props.state = HeaderBar.State.SEARCH
+ self._headerbar.set_label_title(coreartist.props.artist, "")
+
+ self.set_visible_child(self._scrolled_artist_window)
+ self.props.search_mode_active = False
+
+ @Gtk.Template.Callback()
+ def _on_all_artists_clicked(self, widget, user_data=None):
+ self.props.state = SearchView.State.ALL_ARTISTS
+ self._headerbar.props.state = HeaderBar.State.SEARCH
+ self._headerbar.set_label_title(_("Artists Results"), "")
+
+ self._artist_all_flowbox.props.visible = True
+ self._album_all_flowbox.props.visible = False
+ self._artist_all_flowbox.bind_model(
+ self._artist_model, self._create_artist_widget)
+
+ self.props.visible_child = self._all_search_results
+ self.props.search_mode_active = False
+
+ @Gtk.Template.Callback()
+ def _on_all_albums_clicked(self, widget, user_data=None):
+ self.props.state = SearchView.State.ALL_ALBUMS
+ self._headerbar.props.state = HeaderBar.State.SEARCH
+ self._headerbar.set_label_title(_("Albums Results"), "")
+
+ self._artist_all_flowbox.props.visible = False
+ self._album_all_flowbox.props.visible = True
+ self._album_all_flowbox.bind_model(
+ self._album_model, self._create_album_cover)
+
+ self.props.visible_child = self._all_search_results
+ self.props.search_mode_active = False
+
+ def _select_all(self, value: bool) -> None:
+ if self.props.state == SearchView.State.MAIN:
+ with self._model.freeze_notify():
+ for coresong in self._model:
+ coresong.props.selected = value
+ for corealbum in self._album_model:
+ corealbum.props.selected = value
+ for coreartist in self._artist_model:
+ coreartist.props.selected = value
+ elif self.props.state == SearchView.State.ALL_ALBUMS:
+ with self._model.freeze_notify():
+ for corealbum in self._album_model:
+ corealbum.props.selected = value
+ elif self.props.state == SearchView.State.ALL_ARTISTS:
+ with self._model.freeze_notify():
+ for corealbum in self._album_model:
+ corealbum.props.selected = value
+ elif self.props.state == SearchView.State.ALBUM:
+ view = self._album_widget
+ if value is True:
+ view.select_all()
+ else:
+ view.deselect_all()
+ elif self.props.state == SearchView.State.ARTIST:
+ view = self.get_visible_child().get_child().get_child()
+ if value is True:
+ view.select_all()
+ else:
+ view.deselect_all()
+
+ def select_all(self):
+ self._select_all(True)
+
+ def deselect_all(self):
+ self._select_all(False)
+
+ def _back_button_clicked(self, widget, data=None):
+ if self.get_visible_child() == self._search_results:
+ return
+ elif self.get_visible_child() == self._scrolled_artist_window:
+ self.remove(self._scrolled_artist_window)
+
+ self.set_visible_child(self._search_results)
+ self.props.search_mode_active = True
+ self.props.state = SearchView.State.MAIN
+ self._headerbar.props.state = HeaderBar.State.MAIN
+
+ def _on_selection_mode_changed(self, widget, data=None):
+ if (not self.props.selection_mode
+ and self.get_parent().get_visible_child() == self):
+ self.deselect_all()
+
+ @GObject.Property(type=bool, default=False)
+ def search_mode_active(self):
+ """Get search mode status.
+
+ :returns: the search mode status
+ :rtype: bool
+ """
+ return self._search_mode_active
+
+ @search_mode_active.setter # type: ignore
+ def search_mode_active(self, value):
+ """Set search mode status.
+
+ :param bool mode: new search mode
+ """
+ # FIXME: search_mode_active should not change search_state.
+ # This is necessary because Search state cannot interact with
+ # the child views.
+ self._search_mode_active = value
+ if (not self._search_mode_active
+ and self.get_visible_child() == self._search_results):
+ self.props.search_state = Search.State.NONE
diff --git a/gnomemusic/views/songsview.py b/gnomemusic/views/songsview.py
new file mode 100644
index 00000000..3de6b3d9
--- /dev/null
+++ b/gnomemusic/views/songsview.py
@@ -0,0 +1,269 @@
+# Copyright 2022 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+import typing
+
+from gettext import gettext as _
+from gi.repository import GObject, Gtk
+from typing import Dict, List
+
+from gnomemusic.widgets.songwidgetmenu import SongWidgetMenu
+import gnomemusic.utils as utils
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/SongsView.ui")
+class SongsView(Gtk.Box):
+ """Main view of all songs sorted artistwise
+
+ Consists all songs along with songname, star, length, artist
+ and the album name.
+ """
+
+ __gtype_name__ = "SongsView"
+
+ icon_name = GObject.Property(
+ type=str, default="emblem-music-symbolic",
+ flags=GObject.ParamFlags.READABLE)
+ title = GObject.Property(
+ type=str, default=_("Songs"), flags=GObject.ParamFlags.READABLE)
+
+ _listview = Gtk.Template.Child()
+
+ def __init__(self, application: Application) -> None:
+ """Initialize
+
+ :param GtkApplication window: The application object
+ """
+ super().__init__()
+
+ self.props.name = "songs"
+
+ self._application = application
+ self._coremodel = application.props.coremodel
+ self._coreselection = application.props.coreselection
+ self._player = application.props.player
+ self._window = application.props.window
+
+ self._list_item_bindings: Dict[
+ Gtk.ListItem, List[GObject.Binding]] = {}
+ self._list_item_star_controllers: Dict[
+ Gtk.ListItem, List[GObject.Binding]] = {}
+
+ self._selection_model = Gtk.MultiSelection.new(
+ self._coremodel.props.songs)
+
+ list_item_factory = Gtk.SignalListItemFactory()
+ list_item_factory.connect("setup", self._setup_list_item)
+ list_item_factory.connect("bind", self._bind_list_item)
+ list_item_factory.connect("unbind", self._unbind_list_item)
+
+ self._listview.props.factory = list_item_factory
+ self._listview.props.model = self._selection_model
+
+ self._listview.connect("activate", self._on_song_activated)
+
+ self._selection_mode = False
+
+ self.bind_property(
+ "selection-mode", self._listview, "single-click-activate",
+ GObject.BindingFlags.SYNC_CREATE
+ | GObject.BindingFlags.INVERT_BOOLEAN)
+ self.bind_property(
+ "selection-mode", self._listview, "enable-rubberband",
+ GObject.BindingFlags.SYNC_CREATE)
+ self._window.bind_property(
+ "selection-mode", self, "selection-mode",
+ GObject.BindingFlags.BIDIRECTIONAL)
+
+ def _on_song_activated(self, widget, position):
+ coresong = widget.props.model[position]
+
+ self._coremodel.props.active_core_object = coresong
+ self._player.play(coresong)
+
+ def _setup_list_item(
+ self, factory: Gtk.SignalListItemFactory,
+ list_item: Gtk.ListItem) -> None:
+ builder = Gtk.Builder.new_from_resource(
+ "/org/gnome/Music/ui/SongListItem.ui")
+ song_box = builder.get_object("_song_box")
+ list_item.props.child = song_box
+
+ menu_button = builder.get_object("_menu_button")
+ song_menu = SongWidgetMenu(self._application, song_box, None)
+ menu_button.props.popover = song_menu
+
+ self.bind_property(
+ "selection-mode", list_item, "selectable",
+ GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selection-mode", list_item, "activatable",
+ GObject.BindingFlags.SYNC_CREATE
+ | GObject.BindingFlags.INVERT_BOOLEAN)
+
+ def _bind_list_item(
+ self, factory: Gtk.SignalListItemFactory,
+ list_item: Gtk.ListItem) -> None:
+ list_row = list_item.props.child
+ coresong = list_item.props.item
+
+ check = list_row.get_first_child()
+ info_box = check.get_next_sibling()
+ duration_label = info_box.get_next_sibling()
+ star_box = duration_label.get_next_sibling()
+ star_image = star_box.get_first_child()
+ title_label = info_box.get_first_child()
+ album_label = title_label.get_next_sibling()
+ artist_label = album_label.get_next_sibling()
+ menu_button = star_box.get_next_sibling()
+
+ def _on_star_toggle(
+ controller: Gtk.GestureClick, n_press: int, x: float,
+ y: float) -> None:
+ controller.set_state(Gtk.EventSequenceState.CLAIMED)
+ coresong.props.favorite = not coresong.props.favorite
+ star_image.props.favorite = coresong.props.favorite
+
+ star_click = Gtk.GestureClick()
+ star_click.props.button = 1
+ star_click.connect("released", _on_star_toggle)
+ star_image.add_controller(star_click)
+
+ def _on_star_enter(
+ controller: Gtk.EventControllerMotion, x: float,
+ y: float) -> None:
+ star_image.props.hover = True
+
+ def _on_star_leave(controller: Gtk.EventControllerMotion) -> None:
+ star_image.props.hover = False
+
+ star_hover = Gtk.EventControllerMotion()
+ star_hover.connect("enter", _on_star_enter)
+ star_hover.connect("leave", _on_star_leave)
+ star_image.add_controller(star_hover)
+
+ song_menu = menu_button.props.popover
+ song_menu.props.coreobject = coresong
+
+ b1 = coresong.bind_property(
+ "title", title_label, "label", GObject.BindingFlags.SYNC_CREATE)
+ b2 = coresong.bind_property(
+ "album", album_label, "label", GObject.BindingFlags.SYNC_CREATE)
+ b3 = coresong.bind_property(
+ "artist", artist_label, "label", GObject.BindingFlags.SYNC_CREATE)
+
+ b4 = coresong.bind_property(
+ "favorite", star_image, "favorite")
+
+ duration_label.props.label = utils.seconds_to_string(
+ coresong.props.duration)
+
+ b5 = list_item.bind_property(
+ "selected", coresong, "selected", GObject.BindingFlags.SYNC_CREATE)
+ b6 = list_item.bind_property(
+ "selected", check, "active", GObject.BindingFlags.SYNC_CREATE)
+ b7 = self.bind_property(
+ "selection-mode", check, "visible",
+ GObject.BindingFlags.SYNC_CREATE)
+
+ def on_activated(widget, value):
+ if check.props.active:
+ self._selection_model.select_item(
+ list_item.get_position(), False)
+ else:
+ self._selection_model.unselect_item(
+ list_item.get_position())
+
+ # The listitem selected property is read-only.
+ # It cannot be bound from the check active property.
+ # It is necessary to update the selection model in order
+ # to update it.
+ check.connect("notify::active", on_activated)
+
+ self._list_item_bindings[list_item] = [b1, b2, b3, b4, b5, b6, b7]
+ self._list_item_star_controllers[list_item] = [star_click, star_hover]
+
+ def _unbind_list_item(
+ self, factory: Gtk.SignalListItemFactory,
+ list_item: Gtk.ListItem) -> None:
+ bindings = self._list_item_bindings.pop(list_item)
+ [binding.unbind() for binding in bindings]
+
+ list_row = list_item.props.child
+ check = list_row.get_first_child()
+ info_box = check.get_next_sibling()
+ duration_label = info_box.get_next_sibling()
+ star_box = duration_label.get_next_sibling()
+ star_image = star_box.get_first_child()
+
+ controllers = self._list_item_star_controllers.pop(list_item)
+ [star_image.remove_controller(ctrl) for ctrl in controllers]
+
+ signal_id, detail_id = GObject.signal_parse_name(
+ "notify::active", check, True)
+ handler_id = GObject.signal_handler_find(
+ check, GObject.SignalMatchType.ID, signal_id, detail_id, None, 0,
+ 0)
+ check.disconnect(handler_id)
+
+ @GObject.Property(type=bool, default=False)
+ def selection_mode(self):
+ """selection mode getter
+
+ :returns: If selection mode is active
+ :rtype: bool
+ """
+ return self._selection_mode
+
+ @selection_mode.setter # type: ignore
+ def selection_mode(self, value):
+ """selection-mode setter
+
+ :param bool value: Activate selection mode
+ """
+ if (value == self._selection_mode
+ or self.get_parent().get_visible_child() != self):
+ return
+
+ self._selection_mode = value
+ if self._selection_mode is False:
+ self.deselect_all()
+
+ def _toggle_all_selection(self, selected):
+ """Selects or deselects all items.
+ """
+ with self._coreselection.freeze_notify():
+ if selected:
+ self._selection_model.select_all()
+ else:
+ self._selection_model.unselect_all()
+
+ def select_all(self):
+ self._toggle_all_selection(True)
+
+ def deselect_all(self):
+ self._toggle_all_selection(False)
diff --git a/gnomemusic/widgets/__init__.py b/gnomemusic/widgets/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/gnomemusic/widgets/__init__.py
diff --git a/gnomemusic/widgets/aboutdialog.py b/gnomemusic/widgets/aboutdialog.py
new file mode 100644
index 00000000..303ab036
--- /dev/null
+++ b/gnomemusic/widgets/aboutdialog.py
@@ -0,0 +1,35 @@
+# Copyright 2018 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import Gtk
+
+
+@Gtk.Template(resource_path='/org/gnome/Music/ui/AboutDialog.ui')
+class AboutDialog(Gtk.AboutDialog):
+ """About dialog"""
+
+ __gtype_name__ = 'AboutDialog'
+
+ def __init__(self):
+ super().__init__()
diff --git a/gnomemusic/widgets/albumcover.py b/gnomemusic/widgets/albumcover.py
new file mode 100644
index 00000000..b7755246
--- /dev/null
+++ b/gnomemusic/widgets/albumcover.py
@@ -0,0 +1,115 @@
+# Copyright 2018 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import gi
+gi.require_version('Grl', '0.3')
+from gi.repository import GObject, Gtk
+
+from gnomemusic.corealbum import CoreAlbum
+from gnomemusic.coverpaintable import CoverPaintable
+from gnomemusic.utils import ArtSize, DefaultIconType
+from gnomemusic.widgets.twolinetip import TwoLineTip
+
+
+@Gtk.Template(resource_path='/org/gnome/Music/ui/AlbumCover.ui')
+class AlbumCover(Gtk.FlowBoxChild):
+ """Cover tile as used in AlbumsView
+
+ Includes cover, album title, artist & selection mode checkmark.
+ """
+
+ __gtype_name__ = 'AlbumCover'
+
+ _check = Gtk.Template.Child()
+ _cover_image = Gtk.Template.Child()
+ _title_label = Gtk.Template.Child()
+ _artist_label = Gtk.Template.Child()
+
+ selected = GObject.Property(
+ type=bool, default=False, flags=GObject.ParamFlags.READWRITE)
+ selection_mode = GObject.Property(
+ type=bool, default=False, flags=GObject.ParamFlags.READWRITE)
+
+ def __init__(self, corealbum):
+ """Initialize the AlbumCover
+
+ :param Grl.Media media: The media object to use
+ """
+ super().__init__()
+
+ self._corealbum = corealbum
+ self._retrieved = False
+
+ self._tooltip = TwoLineTip()
+
+ artist = self._corealbum.props.artist
+ title = self._corealbum.props.title
+
+ self._tooltip.props.title = artist
+ self._tooltip.props.subtitle = title
+
+ self._artist_label.props.label = artist
+ self._title_label.props.label = title
+
+ self.bind_property(
+ 'selected', self._check, 'active',
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ 'selection-mode', self._check, 'visible',
+ GObject.BindingFlags.BIDIRECTIONAL)
+
+ self.connect('query-tooltip', self._on_tooltip_query)
+
+ self._cover_image.set_size_request(
+ ArtSize.MEDIUM.width, ArtSize.MEDIUM.height)
+ self._cover_image.props.paintable = CoverPaintable(
+ self, ArtSize.MEDIUM, DefaultIconType.ALBUM)
+
+ def retrieve(self):
+ """Start retrieving the actual album cover
+
+ Cover retrieval is an expensive operation, so use this call to
+ start the retrieval process when needed.
+ """
+ if self._retrieved:
+ return
+
+ self._retrieved = True
+ self._cover_image.props.paintable.props.coreobject = self._corealbum
+
+ @GObject.Property(type=CoreAlbum, flags=GObject.ParamFlags.READABLE)
+ def corealbum(self):
+ """CoreAlbum object used in AlbumCover
+
+ :returns: The album used
+ :rtype: CoreAlbum
+ """
+ return self._corealbum
+
+ @Gtk.Template.Callback()
+ def _on_tooltip_query(self, widget, x, y, kb, tooltip, data=None):
+ tooltip.set_custom(self._tooltip)
+
+ return True
diff --git a/gnomemusic/widgets/albumwidget.py b/gnomemusic/widgets/albumwidget.py
new file mode 100644
index 00000000..0a91ab9a
--- /dev/null
+++ b/gnomemusic/widgets/albumwidget.py
@@ -0,0 +1,341 @@
+# Copyright 2020 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from gettext import ngettext
+from typing import Optional, Union
+import typing
+
+from gi.repository import Adw, Gio, GLib, GObject, Gtk
+
+from gnomemusic.corealbum import CoreAlbum
+from gnomemusic.coverpaintable import CoverPaintable
+from gnomemusic.utils import ArtSize, DefaultIconType
+from gnomemusic.widgets.discbox import DiscBox
+from gnomemusic.widgets.playlistdialog import PlaylistDialog
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.coreartist import CoreArtist
+ from gnomemusic.coredisc import CoreDisc
+ from gnomemusic.coresong import CoreSong
+ from gnomemusic.widgets.songwidget import SongWidget
+
+
+@Gtk.Template(resource_path='/org/gnome/Music/ui/AlbumWidget.ui')
+class AlbumWidget(Adw.Bin):
+ """Album widget.
+
+ The album widget consists of an image with the album art
+ on the left and a list of songs on the right.
+ """
+
+ __gtype_name__ = 'AlbumWidget'
+
+ _artist_label = Gtk.Template.Child()
+ _composer_label = Gtk.Template.Child()
+ _cover_image = Gtk.Template.Child()
+ _disc_list_box = Gtk.Template.Child()
+ _menu_button = Gtk.Template.Child()
+ _play_button = Gtk.Template.Child()
+ _released_label = Gtk.Template.Child()
+ _title_label = Gtk.Template.Child()
+
+ selection_mode = GObject.Property(type=bool, default=False)
+ show_artist_label = GObject.Property(type=bool, default=True)
+
+ def __init__(self, application: Application) -> None:
+ """Initialize the AlbumWidget.
+
+ :param GtkApplication application: The application object
+ """
+ super().__init__()
+
+ self._album_model = None
+ self._application = application
+ self._corealbum: CoreAlbum
+ self._active_coreobject: Union[CoreAlbum, CoreArtist]
+ self._coremodel = self._application.props.coremodel
+ self._duration_signal_id = 0
+ self._year_signal_id = 0
+ self._model_signal_id = 0
+
+ self._playlist_dialog: Optional[PlaylistDialog] = None
+
+ self._cover_image.set_size_request(
+ ArtSize.LARGE.width, ArtSize.LARGE.height)
+ self._cover_image.props.paintable = CoverPaintable(
+ self, ArtSize.LARGE, DefaultIconType.ALBUM)
+ self._player = self._application.props.player
+
+ self.bind_property(
+ "selection-mode", self._disc_list_box, "selection-mode",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+
+ self.bind_property(
+ "show-artist-label", self._artist_label, "visible",
+ GObject.BindingFlags.SYNC_CREATE)
+
+ self.connect("notify::selection-mode", self._on_selection_mode_changed)
+
+ action_group = Gio.SimpleActionGroup()
+ actions = (
+ ("play", self._on_play_action),
+ ("add_favorites", self._on_add_favorites_action),
+ ("add_playlist", self._on_add_playlist_action)
+ )
+ for (name, callback) in actions:
+ action = Gio.SimpleAction.new(name, None)
+ action.connect("activate", callback)
+ action_group.add_action(action)
+
+ self.insert_action_group("album", action_group)
+
+ @GObject.Property(
+ type=CoreAlbum, default=None, flags=GObject.ParamFlags.READWRITE)
+ def corealbum(self) -> Optional[CoreAlbum]:
+ """Get the current CoreAlbum.
+
+ :returns: The current CoreAlbum
+ :rtype: CoreAlbum or None
+ """
+ try:
+ return self._corealbum
+ except AttributeError:
+ return None
+
+ @corealbum.setter # type:ignore
+ def corealbum(self, corealbum: CoreAlbum) -> None:
+ """Update CoreAlbum used for AlbumWidget.
+
+ :param CoreAlbum corealbum: The CoreAlbum object
+ """
+ if (self._duration_signal_id != 0
+ or self._year_signal_id != 0
+ or self._model_signal_id != 0):
+ self._corealbum.disconnect(self._duration_signal_id)
+ self._corealbum.disconnect(self._year_signal_id)
+ self._corealbum.props.model.disconnect(self._model_signal_id)
+
+ self._corealbum = corealbum
+
+ self._cover_image.props.paintable.props.coreobject = self._corealbum
+
+ album_name = self._corealbum.props.title
+ artist = self._corealbum.props.artist
+
+ self._title_label.props.label = album_name
+ self._title_label.props.tooltip_text = album_name
+
+ self._artist_label.props.label = artist
+ self._artist_label.props.tooltip_text = artist
+
+ self._duration_signal_id = self._corealbum.connect(
+ "notify::duration", self._on_release_info_changed)
+ self._year_signal_id = self._corealbum.connect(
+ "notify::year", self._on_release_info_changed)
+ self._set_composer_label()
+ # In case the duration is no longer changing, make sure it is
+ # displayed.
+ self._corealbum.notify("duration")
+
+ self._album_model = self._corealbum.props.model
+ self._model_signal_id = self._album_model.connect_after(
+ "items-changed", self._on_model_items_changed)
+ self._disc_list_box.bind_model(self._album_model, self._create_widget)
+
+ self._album_model.items_changed(0, 0, 0)
+
+ @GObject.Property(
+ type=object, default=None, flags=GObject.ParamFlags.READWRITE)
+ def active_coreobject(self) -> Optional[Union[CoreAlbum, CoreArtist]]:
+ """Get the current CoreObject.
+
+ active_coreobject is used to set the Player playlist
+ AlbumWidget can be used to display an Album in AlbumsView or
+ ArtistsView. In the former case, there is no need to set it: it's
+ already the corealbum. In the later case, the active_coreobject is
+ an artist. It needs to be set.
+
+ :returns: The current CoreObject
+ :rtype: Union[CoreAlbum, CoreArtist]
+ """
+ try:
+ return self._active_coreobject
+ except AttributeError:
+ return self.props.corealbum
+
+ @active_coreobject.setter # type:ignore
+ def active_coreobject(
+ self, coreobject: Union[CoreAlbum, CoreArtist]) -> None:
+ """Update CoreOject used for AlbumWidget.
+
+ :param CoreAlbum corealbum: The CoreAlbum object
+ """
+ self._active_coreobject = coreobject
+
+ def _create_widget(self, disc: CoreDisc) -> DiscBox:
+ disc_box = DiscBox(self._application, self._corealbum, disc)
+ disc_box.connect('song-activated', self._song_activated)
+
+ self._corealbum.bind_property(
+ "selected", disc, "selected", GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selection-mode", disc_box, "selection-mode",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+
+ return disc_box
+
+ def _on_model_items_changed(
+ self, model: Gtk.SortListModel, position: int, removed: int,
+ added: int) -> None:
+ n_items: int = model.get_n_items()
+ if n_items == 1:
+ discbox = self._disc_list_box.get_row_at_index(0)
+ discbox.props.show_disc_label = False
+ else:
+ for i in range(n_items):
+ discbox = self._disc_list_box.get_row_at_index(i)
+ discbox.props.show_disc_label = True
+
+ empty_album = (n_items == 0)
+ self._play_button.props.sensitive = not empty_album
+ self._menu_button.props.sensitive = not empty_album
+
+ def _set_composer_label(self) -> None:
+ composer = self._corealbum.props.composer
+ show = False
+
+ if composer:
+ self._composer_label.props.label = composer
+ self._composer_label.props.tooltip_text = composer
+ show = True
+
+ self._composer_label.props.visible = show
+
+ def _on_release_info_changed(
+ self, klass: CoreAlbum,
+ value: Optional[GObject.ParamSpecString]) -> None:
+ if not self._corealbum:
+ return
+
+ mins = (self._corealbum.props.duration // 60) + 1
+ mins_text = ngettext("{} minute", "{} minutes", mins).format(mins)
+ year = self._corealbum.props.year
+
+ if year is None:
+ label = mins_text
+ else:
+ label = f"{year}, {mins_text}"
+
+ self._released_label.props.label = label
+
+ def _play(self, coresong: Optional[CoreSong] = None) -> None:
+ signal_id = 0
+
+ def _on_playlist_loaded(klass, playlist_type):
+ self._player.play(coresong)
+ self._coremodel.disconnect(signal_id)
+
+ signal_id = self._coremodel.connect(
+ "playlist-loaded", _on_playlist_loaded)
+ self._coremodel.props.active_core_object = self.props.active_coreobject
+
+ def _song_activated(
+ self, widget: Gtk.Widget, song_widget: SongWidget) -> None:
+ if self.props.selection_mode:
+ song_widget.props.selected = not song_widget.props.selected
+ return
+
+ self._play(song_widget.props.coresong)
+
+ def select_all(self) -> None:
+ if self._album_model:
+ for coredisc in self._album_model:
+ coredisc.props.selected = True
+
+ def deselect_all(self) -> None:
+ if self._album_model:
+ for coredisc in self._album_model:
+ coredisc.props.selected = False
+
+ def _on_selection_mode_changed(
+ self, widget: Gtk.Widget, value: GObject.ParamSpecBoolean) -> None:
+ if not self.props.selection_mode:
+ self.deselect_all()
+
+ def _on_add_favorites_action(
+ self, action: Gio.SimpleAction,
+ data: Optional[GLib.Variant]) -> None:
+ if self._corealbum:
+ for coredisc in self._corealbum.props.model:
+ for coresong in coredisc.props.model:
+ if not coresong.props.favorite:
+ coresong.props.favorite = True
+
+ def _on_add_playlist_action(
+ self, action: Gio.SimpleAction,
+ data: Optional[GLib.Variant]) -> None:
+
+ def on_response(dialog: PlaylistDialog, response_id: int) -> None:
+ if not self._playlist_dialog:
+ return
+
+ if response_id == Gtk.ResponseType.ACCEPT:
+ playlist = self._playlist_dialog.props.selected_playlist
+ coresongs = [
+ song
+ for disc in self._corealbum.props.model
+ for song in disc.props.model]
+ playlist.add_songs(coresongs)
+
+ self._playlist_dialog.destroy()
+ self._playlist_dialog = None
+
+ if not self._corealbum:
+ return
+
+ self._playlist_dialog = PlaylistDialog(self._application)
+ active_window = self._application.props.active_window
+ self._playlist_dialog.props.transient_for = active_window
+ self._playlist_dialog.connect("response", on_response)
+ self._playlist_dialog.present()
+
+ def _on_play_action(
+ self, action: Gio.SimpleAction,
+ data: Optional[GLib.Variant]) -> None:
+ self._play()
+
+ @Gtk.Template.Callback()
+ def _on_play_button_clicked(self, button: Gtk.Button) -> None:
+ # When the coreobject is an artist, the first song of the album
+ # needs to be loaded. Otherwise, the first album of the artist
+ # is played.
+ coresong: Optional[CoreSong] = None
+ if self.props.active_coreobject != self.props.corealbum:
+ coredisc = self.props.corealbum.props.model[0]
+ coresong = coredisc.props.model[0]
+
+ self._play(coresong)
diff --git a/gnomemusic/widgets/appmenu.py b/gnomemusic/widgets/appmenu.py
new file mode 100644
index 00000000..c0baecb7
--- /dev/null
+++ b/gnomemusic/widgets/appmenu.py
@@ -0,0 +1,82 @@
+# Copyright 2018 The GNOME Music developers
+#
+# GNOME Music is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import Gtk
+
+from gnomemusic.scrobbler import GoaLastFM
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/AppMenu.ui")
+class AppMenu(Gtk.Popover):
+ """AppMenu shown from the HeaderBar within the main view"""
+
+ __gtype_name__ = "AppMenu"
+
+ _lastfm_box = Gtk.Template.Child()
+ _lastfm_switch = Gtk.Template.Child()
+
+ def __init__(self, application):
+ """Initialize the application menu
+
+ :param Application application: Application object
+ """
+ super().__init__()
+
+ self._lastfm_switcher_id = None
+
+ self._lastfm_configure_action = application.lookup_action(
+ "lastfm-configure")
+
+ self._lastfm_scrobbler = application.props.lastfm_scrobbler
+ self._lastfm_scrobbler.connect(
+ "notify::can-scrobble", self._on_scrobbler_state_changed)
+ self._on_scrobbler_state_changed(None, None)
+
+ def _on_scrobbler_state_changed(self, klass, args):
+ state = self._lastfm_scrobbler.props.account_state
+
+ if state == GoaLastFM.State.NOT_AVAILABLE:
+ self._lastfm_configure_action.props.enabled = False
+ return
+
+ self._lastfm_configure_action.props.enabled = True
+
+ if state == GoaLastFM.State.NOT_CONFIGURED:
+ self._lastfm_box.props.visible = False
+ if self._lastfm_switcher_id is not None:
+ self._lastfm_switch.disconnect(self._lastfm_switcher_id)
+ self._lastfm_switcher_id = None
+ return
+
+ self._lastfm_box.props.visible = True
+ if self._lastfm_switcher_id is None:
+ self._lastfm_switcher_id = self._lastfm_switch.connect(
+ "state-set", self._on_lastfm_switch_active)
+
+ with self._lastfm_switch.handler_block(self._lastfm_switcher_id):
+ can_scrobble = self._lastfm_scrobbler.props.can_scrobble
+ self._lastfm_switch.props.state = can_scrobble
+
+ def _on_lastfm_switch_active(self, klass, state):
+ self._lastfm_scrobbler.props.can_scrobble = state
diff --git a/gnomemusic/widgets/artistalbumswidget.py b/gnomemusic/widgets/artistalbumswidget.py
new file mode 100644
index 00000000..74255d62
--- /dev/null
+++ b/gnomemusic/widgets/artistalbumswidget.py
@@ -0,0 +1,119 @@
+# Copyright (c) 2016 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from typing import Optional
+import typing
+
+from gi.repository import GObject, Gtk
+
+from gnomemusic.coreartist import CoreArtist
+from gnomemusic.widgets.albumwidget import AlbumWidget
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/ArtistAlbumsWidget.ui")
+class ArtistAlbumsWidget(Gtk.Box):
+ """Widget containing all albums by an artist
+
+ A vertical list of AlbumWidget, containing all the albums
+ by one artist. Contains the model for all the song widgets of
+ the album(s).
+ """
+
+ __gtype_name__ = 'ArtistAlbumsWidget'
+
+ _listbox = Gtk.Template.Child()
+
+ selection_mode = GObject.Property(type=bool, default=False)
+
+ def __init__(self, application: Application) -> None:
+ """Initialize the ArtistAlbumsWidget
+
+ :param Aplication application: The Application object
+ """
+ super().__init__()
+
+ self._application = application
+ self._coreartist: Optional[CoreArtist] = None
+
+ def _update_model(self) -> None:
+ if self._coreartist is not None:
+ self._listbox.bind_model(
+ self._coreartist.props.model, self._add_album)
+
+ def _add_album(self, corealbum):
+ row = Gtk.ListBoxRow()
+ row.props.selectable = False
+ row.props.activatable = False
+ row.props.focusable = False
+
+ widget = AlbumWidget(self._application)
+ widget.props.corealbum = corealbum
+ widget.props.active_coreobject = self._coreartist
+ widget.props.show_artist_label = False
+
+ self._coreartist.bind_property(
+ "selected", corealbum, "selected",
+ GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ 'selection-mode', widget, 'selection-mode',
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+
+ row.set_child(widget)
+
+ return row
+
+ def select_all(self) -> None:
+ """Select all items"""
+ if self._coreartist is not None:
+ self._coreartist.props.selected = True
+
+ def deselect_all(self) -> None:
+ """Deselect all items"""
+ if self._coreartist is not None:
+ self._coreartist.props.selected = False
+
+ @GObject.Property(
+ type=CoreArtist, flags=GObject.ParamFlags.READWRITE, default=None)
+ def coreartist(self) -> CoreArtist:
+ """Current CoreArtist object
+
+ :param CoreArtist coreartist: The CoreArtist object
+ :rtype: CoreArtist
+ """
+ return self._coreartist
+
+ @coreartist.setter # type: ignore
+ def coreartist(self, coreartist: CoreArtist) -> None:
+ """Sets the CoreArtist for the widget
+
+ :param CoreArtist coreartist: The CoreArtist to use
+ """
+ if self._coreartist is not coreartist:
+ self._coreartist = coreartist
+
+ self._update_model()
diff --git a/gnomemusic/widgets/artistsearchtile.py b/gnomemusic/widgets/artistsearchtile.py
new file mode 100644
index 00000000..c7f3f31d
--- /dev/null
+++ b/gnomemusic/widgets/artistsearchtile.py
@@ -0,0 +1,102 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import Gdk, GObject, Gtk
+
+from gnomemusic.coreartist import CoreArtist
+from gnomemusic.coverpaintable import CoverPaintable
+from gnomemusic.utils import ArtSize, DefaultIconType
+from gnomemusic.widgets.twolinetip import TwoLineTip
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/ArtistSearchTile.ui")
+class ArtistSearchTile(Gtk.FlowBoxChild):
+ """Artist search tile
+
+ Contains artist art and name
+ """
+
+ __gtype_name__ = "ArtistSearchTile"
+
+ _artist_label = Gtk.Template.Child()
+ _cover_image = Gtk.Template.Child()
+ _check = Gtk.Template.Child()
+
+ coreartist = GObject.Property(
+ type=CoreArtist, default=None, flags=GObject.ParamFlags.READWRITE)
+ selected = GObject.Property(
+ type=bool, default=False, flags=GObject.ParamFlags.READWRITE)
+ selection_mode = GObject.Property(
+ type=bool, default=False, flags=GObject.ParamFlags.READWRITE)
+
+ def __init__(self, coreartist):
+ """Initialize the ArtistSearchTile
+
+ :param CoreArtist coreartist: The coreartist to use
+ """
+ super().__init__()
+
+ self.props.coreartist = coreartist
+
+ self._cover_image.set_size_request(
+ ArtSize.MEDIUM.width, ArtSize.MEDIUM.height)
+ self._cover_image.props.paintable = CoverPaintable(
+ self, ArtSize.MEDIUM, DefaultIconType.ARTIST)
+
+ self._cover_image.props.paintable.props.coreobject = coreartist
+
+ self._tooltip = TwoLineTip()
+ self._tooltip.props.subtitle_visible = False
+
+ artist = self.props.coreartist.props.artist
+ self._artist_label.props.label = artist
+ self._tooltip.props.title = artist
+
+ self.bind_property(
+ "selected", self._check, "active",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selected", self.props.coreartist, "selected",
+ GObject.BindingFlags.BIDIRECTIONAL)
+
+ self.bind_property(
+ "selection-mode", self._check, "visible",
+ GObject.BindingFlags.BIDIRECTIONAL)
+
+ @Gtk.Template.Callback()
+ def _on_artist_event(self, gesture_click, n_press, x, y):
+ state = gesture_click.get_current_event_state()
+ modifiers = Gtk.accelerator_get_default_mod_mask()
+ if (state & modifiers == Gdk.ModifierType.CONTROL_MASK
+ and not self.props.selection_mode):
+ self.props.selection_mode = True
+
+ if self.props.selection_mode:
+ self.props.selected = not self.props.selected
+
+ @Gtk.Template.Callback()
+ def _on_tooltip_query(self, widget, x, y, kb, tooltip, data=None):
+ tooltip.set_custom(self._tooltip)
+ return True
diff --git a/gnomemusic/widgets/artisttile.py b/gnomemusic/widgets/artisttile.py
new file mode 100644
index 00000000..543bdc59
--- /dev/null
+++ b/gnomemusic/widgets/artisttile.py
@@ -0,0 +1,82 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from typing import Optional
+
+from gi.repository import GObject, Gtk
+
+from gnomemusic.coreartist import CoreArtist
+from gnomemusic.coverpaintable import CoverPaintable
+from gnomemusic.utils import ArtSize, DefaultIconType
+
+
+@Gtk.Template(resource_path='/org/gnome/Music/ui/ArtistTile.ui')
+class ArtistTile(Gtk.Box):
+ """Row for sidebars
+
+ Contains a label and an optional checkbox.
+ """
+
+ __gtype_name__ = 'ArtistTile'
+
+ _cover_image = Gtk.Template.Child()
+ _label = Gtk.Template.Child()
+
+ text = GObject.Property(type=str, default='')
+
+ def __init__(self) -> None:
+ """Initialise ArtistTile"""
+ super().__init__()
+
+ self._coreartist: Optional[CoreArtist] = None
+
+ self._cover_image.set_size_request(
+ ArtSize.XSMALL.width, ArtSize.XSMALL.height)
+ self._cover_image.props.paintable = CoverPaintable(
+ self, ArtSize.XSMALL, DefaultIconType.ARTIST)
+
+ self.bind_property('text', self._label, 'label')
+ self.bind_property('text', self._label, 'tooltip-text')
+
+ @GObject.Property(
+ type=CoreArtist, flags=GObject.ParamFlags.READWRITE, default=None)
+ def coreartist(self) -> CoreArtist:
+ """CoreArtist to use for ArtistTile
+
+ :returns: The artist object
+ :rtype: CoreArtist
+ """
+ return self._coreartist
+
+ @coreartist.setter # type: ignore
+ def coreartist(self, coreartist: CoreArtist) -> None:
+ """CoreArtist setter
+
+ :param CoreArtist coreartist: The coreartist to use
+ """
+ self._coreartist = coreartist
+
+ self._cover_image.props.paintable.props.coreobject = coreartist
+ self.props.text = coreartist.props.artist
diff --git a/gnomemusic/widgets/discbox.py b/gnomemusic/widgets/discbox.py
new file mode 100644
index 00000000..85bcd379
--- /dev/null
+++ b/gnomemusic/widgets/discbox.py
@@ -0,0 +1,116 @@
+# Copyright (c) 2021 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from gettext import gettext as _
+import typing
+
+from gi.repository import Gdk, Gio, GObject, Gtk
+
+from gnomemusic.widgets.songwidget import SongWidget
+from gnomemusic.widgets.songwidgetmenu import SongWidgetMenu
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.corealbum import CoreAlbum
+ from gnomemusic.coredisc import CoreDisc
+
+
+@Gtk.Template(resource_path='/org/gnome/Music/ui/DiscBox.ui')
+class DiscBox(Gtk.ListBoxRow):
+ """A widget which compromises one disc
+
+ DiscBox contains a disc label for the disc number on top
+ with a GtkListBox beneath.
+ """
+ __gtype_name__ = 'DiscBox'
+
+ _disc_label = Gtk.Template.Child()
+ _list_box = Gtk.Template.Child()
+
+ __gsignals__ = {
+ 'song-activated': (GObject.SignalFlags.RUN_FIRST, None, (Gtk.Widget,))
+ }
+
+ selection_mode = GObject.Property(type=bool, default=False)
+ show_disc_label = GObject.Property(type=bool, default=False)
+
+ def __init__(
+ self, application: Application, corealbum: CoreAlbum,
+ coredisc: CoreDisc) -> None:
+ """Initialize
+
+ :param Application coredisc: The Application object
+ :param CoreAlbum corealbum: The corealbum of the coredisc
+ :param CoreDisc coredisc: The CoreDisc object to use
+ """
+ super().__init__()
+
+ self._application = application
+ self._corealbum = corealbum
+ self._coredisc = coredisc
+ self._model: Gio.ListModel = coredisc.props.model
+
+ disc_nr: int = coredisc.props.disc_nr
+ self._disc_label.props.label = _("Disc {}").format(disc_nr)
+
+ self.bind_property(
+ 'show-disc-label', self._disc_label, 'visible',
+ GObject.BindingFlags.SYNC_CREATE)
+
+ self._list_box.bind_model(self._model, self._create_widget)
+
+ def select_all(self):
+ """Select all songs"""
+ for coresong in self._model:
+ coresong.props.selected = True
+
+ def deselect_all(self):
+ """Deselect all songs"""
+ for coresong in self._model:
+ coresong.props.selected = False
+
+ def _create_widget(self, coresong):
+ song_widget = SongWidget(coresong)
+ song_widget.props.menu = SongWidgetMenu(
+ self._application, song_widget, self._corealbum)
+
+ self._coredisc.bind_property(
+ "selected", coresong, "selected", GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selection-mode", song_widget, "selection-mode",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+
+ return song_widget
+
+ @Gtk.Template.Callback()
+ def _song_activated(
+ self, list_box: Gtk.ListBox, song_widget: SongWidget) -> bool:
+ if self.props.selection_mode:
+ selection_state = song_widget.props.coresong.props.selected
+ song_widget.props.coresong.props.selected = not selection_state
+ else:
+ self.emit("song-activated", song_widget)
+
+ return Gdk.EVENT_STOP
diff --git a/gnomemusic/widgets/headerbar.py b/gnomemusic/widgets/headerbar.py
new file mode 100644
index 00000000..5efb2186
--- /dev/null
+++ b/gnomemusic/widgets/headerbar.py
@@ -0,0 +1,259 @@
+# Copyright 2018 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from enum import IntEnum
+
+from gettext import gettext as _, ngettext
+from gi.repository import Adw, GObject, Gtk
+
+from gnomemusic.widgets.appmenu import AppMenu
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/SelectionBarMenuButton.ui")
+class SelectionBarMenuButton(Gtk.MenuButton):
+ """Button for popup to select all or no items
+
+ The button label indicates the number of items selected.
+ """
+
+ __gtype_name__ = "SelectionBarMenuButton"
+
+ def __init__(self):
+ super().__init__()
+
+ self._selected_songs_count = 0
+
+ @GObject.Property(type=int, default=0, minimum=0)
+ def selected_songs_count(self):
+ """The number of songs selected
+
+ :returns: Number of songs selected
+ :rtype: int
+ """
+ return self._selected_songs_count
+
+ @selected_songs_count.setter # type: ignore
+ def selected_songs_count(self, value):
+ """Set the number of songs selected
+
+ :param int value: The number of songs selected
+ """
+ self._selected_songs_count = value
+
+ if value > 0:
+ text = ngettext(
+ "Selected {} song", "Selected {} songs", value).format(value)
+ self.props.label = text
+ else:
+ self.props.label = _("Click on items to select them")
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/HeaderBar.ui")
+class HeaderBar(Adw.Bin):
+ """Headerbar of the application"""
+
+ class State(IntEnum):
+ """States the Headerbar can have"""
+ MAIN = 0
+ CHILD = 1
+ SEARCH = 2
+ EMPTY = 3
+
+ __gtype_name__ = "HeaderBar"
+
+ __gsignals__ = {
+ 'back-button-clicked': (GObject.SignalFlags.RUN_FIRST, None, ()),
+ }
+
+ _search_button = Gtk.Template.Child()
+ _select_button = Gtk.Template.Child()
+ _cancel_button = Gtk.Template.Child()
+ _back_button = Gtk.Template.Child()
+ _headerbar = Gtk.Template.Child()
+ _label_title_box = Gtk.Template.Child()
+ _label_title = Gtk.Template.Child()
+ _label_subtitle = Gtk.Template.Child()
+ _menu_button = Gtk.Template.Child()
+
+ search_mode_active = GObject.Property(type=bool, default=False)
+ selected_songs_count = GObject.Property(type=int, default=0, minimum=0)
+ selection_mode_allowed = GObject.Property(type=bool, default=True)
+ stack = GObject.Property(type=Adw.ViewStack)
+
+ def __init__(self, application):
+ """Initialize Headerbar
+
+ :param Application application: Application object
+ """
+ super().__init__()
+
+ self._selection_mode = False
+
+ self._stack_switcher = Adw.ViewSwitcher(
+ focusable=False, halign="center",
+ policy=Adw.ViewSwitcherPolicy.WIDE)
+
+ self._selection_menu = SelectionBarMenuButton()
+
+ self._menu_button.props.popover = AppMenu(application)
+
+ self.bind_property(
+ "selection-mode", self._headerbar, "show-end-title-buttons",
+ GObject.BindingFlags.INVERT_BOOLEAN
+ | GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selection-mode", self._cancel_button, "visible")
+ self.bind_property(
+ "selection-mode", self._select_button, "visible",
+ GObject.BindingFlags.INVERT_BOOLEAN)
+ self.bind_property(
+ "selection-mode", self._select_button, "active",
+ GObject.BindingFlags.BIDIRECTIONAL)
+ self.bind_property(
+ "stack", self._stack_switcher, "stack",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selected-songs-count", self._selection_menu,
+ "selected-songs-count")
+ self.bind_property(
+ "search-mode-active", self._search_button, "active",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selection-mode", self._search_button, "visible",
+ GObject.BindingFlags.INVERT_BOOLEAN
+ | GObject.BindingFlags.SYNC_CREATE)
+
+ self.connect(
+ "notify::selection-mode-allowed",
+ self._on_selection_mode_allowed_changed)
+
+ @GObject.Property(type=bool, default=False)
+ def selection_mode(self):
+ """Selection mode
+
+ :returns: Selection mode
+ :rtype: bool
+ """
+ return self._selection_mode
+
+ @selection_mode.setter # type: ignore
+ def selection_mode(self, mode):
+ """Set the selection mode
+
+ :param bool value: Selection mode
+ """
+ self._selection_mode = mode
+
+ if mode:
+ self.get_style_context().add_class("selection-mode")
+ else:
+ self.get_style_context().remove_class("selection-mode")
+ self._select_button.props.active = False
+
+ self._update()
+
+ @GObject.Property
+ def state(self):
+ """State of the widget
+
+ :returns: Widget state
+ :rtype: HeaderBar.State
+ """
+ return self._state
+
+ @state.setter # type: ignore
+ def state(self, value):
+ """Set state of the of widget
+
+ This influences the look and functionality of the headerbar.
+
+ :param HeaderBar.State value: Widget state
+ """
+ self._state = value
+ self._update()
+
+ search_visible = self.props.state != HeaderBar.State.SEARCH
+ self._search_button.props.visible = search_visible
+
+ if value == HeaderBar.State.EMPTY:
+ self._search_button.props.sensitive = False
+ self._select_button.props.sensitive = False
+ self._stack_switcher.hide()
+ else:
+ self._search_button.props.sensitive = True
+ self._select_button.props.sensitive = True
+ self._stack_switcher.show()
+
+ def set_label_title(self, title: str, subtitle: str) -> None:
+ """Set the headerbar title-widget as two labels:
+ a title and a subtitle
+
+ :param str title: headerbar title
+ :param str subtitle: headerbar subtitle
+ :returns:
+ """
+ self._headerbar.props.title_widget = self._label_title_box
+ self._label_title.props.label = title
+ self._label_subtitle.props.label = subtitle
+ if not subtitle:
+ self._label_title.props.valign = Gtk.Align.CENTER
+ self._label_subtitle.props.visible = False
+ else:
+ self._label_title.props.valign = Gtk.Align.FILL
+ self._label_subtitle.props.visible = True
+
+ @Gtk.Template.Callback()
+ def _on_back_button_clicked(self, widget=None):
+ self.emit('back-button-clicked')
+
+ @Gtk.Template.Callback()
+ def _on_cancel_button_clicked(self, button):
+ self.props.selection_mode = False
+
+ def _update(self):
+ if self.props.selection_mode:
+ self._headerbar.props.title_widget = self._selection_menu
+ elif self.props.state != HeaderBar.State.MAIN:
+ self._headerbar.props.title_widget = None
+ else:
+ self._headerbar.props.title_widget = self._stack_switcher
+
+ self._back_button.props.visible = (
+ not self.props.selection_mode
+ and self.props.state != HeaderBar.State.MAIN
+ and self.props.state != HeaderBar.State.EMPTY
+ )
+
+ self._menu_button.props.visible = (
+ not self.props.selection_mode
+ and self.props.state == HeaderBar.State.MAIN
+ )
+
+ def _on_selection_mode_allowed_changed(self, widget, data):
+ if self.props.selection_mode_allowed:
+ self._select_button.props.sensitive = True
+ else:
+ self._select_button.props.sensitive = False
diff --git a/gnomemusic/widgets/lastfmdialog.py b/gnomemusic/widgets/lastfmdialog.py
new file mode 100644
index 00000000..00d39ed6
--- /dev/null
+++ b/gnomemusic/widgets/lastfmdialog.py
@@ -0,0 +1,77 @@
+# Copyright 2020 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gettext import gettext as _
+
+from gi.repository import Gdk, Gtk
+
+from gnomemusic.scrobbler import GoaLastFM
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/LastfmDialog.ui")
+class LastfmDialog(Gtk.Dialog):
+ """Dialog to configure a Last.fm account"""
+
+ __gtype_name__ = "LastfmDialog"
+
+ _action_button = Gtk.Template.Child()
+ _action_label = Gtk.Template.Child()
+ _status_label = Gtk.Template.Child()
+
+ def __init__(self, parent, lastfm_scrobbler):
+ super().__init__()
+
+ self.props.transient_for = parent
+ self._lastfm_scrobbler = lastfm_scrobbler
+ self._lastfm_scrobbler.connect(
+ "notify::account-state", self._on_account_state_changed)
+ self._update_view()
+
+ def _on_account_state_changed(self, klass, value):
+ self._update_view()
+
+ def _update_view(self):
+ account_state = self._lastfm_scrobbler.props.account_state
+ if account_state == GoaLastFM.State.NOT_CONFIGURED:
+ self._status_label.props.label = _("Music Reporting Not Setup")
+ self._action_button.props.label = _("Login")
+ self._action_label.props.label = _(
+ "Login to your Last.fm account to report your music listening.") # noqa: E501
+ return
+
+ if self._lastfm_scrobbler.can_scrobble is True:
+ action = _("Your music listening is reported to Last.fm.")
+ else:
+ action = _("Your music listening is not reported to Last.fm.")
+
+ identity = self._lastfm_scrobbler.props.identity
+ # TRANSLATORS: displays the username of the Last.fm account
+ self._status_label.props.label = _("Logged in as {}").format(identity)
+ self._action_button.props.label = _("Configure")
+ self._action_label.props.label = action
+
+ @Gtk.Template.Callback()
+ def _on_action_button_clicked(self, btn: Gtk.Button) -> bool:
+ self._lastfm_scrobbler.configure()
+ return Gdk.EVENT_STOP
diff --git a/gnomemusic/widgets/playertoolbar.py b/gnomemusic/widgets/playertoolbar.py
new file mode 100644
index 00000000..71a094d1
--- /dev/null
+++ b/gnomemusic/widgets/playertoolbar.py
@@ -0,0 +1,209 @@
+# Copyright © 2018 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gettext import gettext as _
+from gi.repository import Gio, GLib, GObject, Gtk
+
+from gnomemusic.coverpaintable import CoverPaintable
+from gnomemusic.gstplayer import Playback
+from gnomemusic.utils import ArtSize, DefaultIconType
+from gnomemusic.player import Player, RepeatMode
+from gnomemusic.widgets.smoothscale import SmoothScale # noqa: F401
+from gnomemusic.widgets.twolinetip import TwoLineTip
+import gnomemusic.utils as utils
+
+
+@Gtk.Template(resource_path='/org/gnome/Music/ui/PlayerToolbar.ui')
+class PlayerToolbar(Gtk.ActionBar):
+ """Main Player widget object
+
+ Contains the ui of playing a song with Music.
+ """
+
+ __gtype_name__ = 'PlayerToolbar'
+
+ _artist_label = Gtk.Template.Child()
+ _cover_image = Gtk.Template.Child()
+ _duration_label = Gtk.Template.Child()
+ _next_button = Gtk.Template.Child()
+ _play_button = Gtk.Template.Child()
+ _play_pause_image = Gtk.Template.Child()
+ _prev_button = Gtk.Template.Child()
+ _progress_scale = Gtk.Template.Child()
+ _progress_time_label = Gtk.Template.Child()
+ _repeat_menu_button = Gtk.Template.Child()
+ _repeat_image = Gtk.Template.Child()
+ _song_info_box = Gtk.Template.Child()
+ _title_label = Gtk.Template.Child()
+
+ def __init__(self):
+ super().__init__()
+
+ self._player = None
+
+ self._cover_image.set_size_request(
+ ArtSize.SMALL.width, ArtSize.SMALL.height)
+ self._cover_image.props.paintable = CoverPaintable(
+ self, ArtSize.SMALL, DefaultIconType.ALBUM)
+
+ self._tooltip = TwoLineTip()
+
+ repeat_menu = Gio.Menu.new()
+ for mode in RepeatMode:
+ item = Gio.MenuItem.new()
+ item.set_label(mode.label)
+ item.set_action_and_target_value(
+ "playertoolbar.repeat", GLib.Variant("s", str(mode.value)))
+ repeat_menu.append_item(item)
+
+ self._repeat_menu_button.props.menu_model = repeat_menu
+ self._repeat_action: Gio.SimpleAction = Gio.SimpleAction.new_stateful(
+ "repeat", GLib.VariantType.new("s"), GLib.Variant("s", ""))
+
+ action_group = Gio.SimpleActionGroup()
+ action_group.add_action(self._repeat_action)
+ self.insert_action_group("playertoolbar", action_group)
+
+ # FIXME: This is a workaround for not being able to pass the player
+ # object via init when using Gtk.Builder.
+ @GObject.Property(type=Player, default=None)
+ def player(self):
+ """The GstPlayer object used
+
+ :return: player object
+ :rtype: GstPlayer
+ """
+ return self._player
+
+ @player.setter # type: ignore
+ def player(self, player):
+ """Set the GstPlayer object used
+
+ :param GstPlayer player: The GstPlayer to use
+ """
+ if (player is None
+ or (self._player is not None
+ and self._player != player)):
+ return
+
+ self._player = player
+ self._progress_scale.props.player = self._player
+
+ self._player.connect('song-changed', self._update_view)
+ self._player.connect(
+ 'notify::repeat-mode', self._on_repeat_mode_changed)
+ self._player.connect('notify::state', self._sync_playing)
+
+ repeat_mode = self._player.props.repeat_mode
+ self._repeat_action.set_state(
+ GLib.Variant("s", str(repeat_mode.value)))
+ self._repeat_action.connect("activate", self._repeat_menu_changed)
+
+ self._sync_repeat_image()
+
+ def _repeat_menu_changed(
+ self, action: Gio.SimpleAction, new_state: GLib.Variant) -> None:
+ self._repeat_action.set_state(new_state)
+ new_mode = new_state.get_string()
+ self._player.props.repeat_mode = RepeatMode(int(new_mode))
+
+ @Gtk.Template.Callback()
+ def _on_progress_value_changed(self, progress_scale):
+ seconds = int(progress_scale.get_value() / 60)
+ self._progress_time_label.set_label(utils.seconds_to_string(seconds))
+
+ @Gtk.Template.Callback()
+ def _on_prev_button_clicked(self, button):
+ self._player.previous()
+
+ @Gtk.Template.Callback()
+ def _on_play_button_clicked(self, button):
+ self._player.play_pause()
+
+ @Gtk.Template.Callback()
+ def _on_next_button_clicked(self, button):
+ self._player.next()
+
+ def _on_repeat_mode_changed(self, klass, param):
+ self._sync_repeat_image()
+ self._sync_prev_next()
+
+ def _sync_repeat_image(self) -> None:
+ self._repeat_image.set_from_icon_name(
+ self._player.props.repeat_mode.icon)
+
+ def _sync_playing(self, player, state):
+ if (self._player.props.state == Playback.STOPPED
+ and not self._player.props.has_next
+ and not self._player.props.has_previous):
+ self.props.revealed = False
+ return
+
+ self.props.revealed = True
+
+ if self._player.props.state == Playback.PLAYING:
+ icon_name = "media-playback-pause-symbolic"
+ tooltip = _("Pause")
+ else:
+ icon_name = "media-playback-start-symbolic"
+ tooltip = _("Play")
+
+ if self._play_pause_image.props.icon_name != icon_name:
+ self._play_pause_image.props.icon_name = icon_name
+
+ self._play_button.set_tooltip_text(tooltip)
+
+ def _sync_prev_next(self):
+ self._next_button.props.sensitive = self._player.props.has_next
+ self._prev_button.props.sensitive = self._player.props.has_previous
+
+ def _update_view(self, player):
+ """Update all visual elements on song change
+
+ :param Player player: The main player object
+ """
+ coresong = player.props.current_song
+ self._duration_label.props.label = utils.seconds_to_string(
+ coresong.props.duration)
+ self._progress_time_label.props.label = "0:00"
+
+ self._play_button.set_sensitive(True)
+ self._sync_prev_next()
+
+ artist = coresong.props.artist
+ title = coresong.props.title
+
+ self._title_label.props.label = title
+ self._artist_label.props.label = artist
+
+ self._tooltip.props.title = title
+ self._tooltip.props.subtitle = artist
+
+ self._cover_image.props.paintable.props.coreobject = coresong
+
+ @Gtk.Template.Callback()
+ def _on_tooltip_query(self, widget, x, y, kb, tooltip, data=None):
+ tooltip.set_custom(self._tooltip)
+
+ return True
diff --git a/gnomemusic/widgets/playlistcontrols.py b/gnomemusic/widgets/playlistcontrols.py
new file mode 100644
index 00000000..46432024
--- /dev/null
+++ b/gnomemusic/widgets/playlistcontrols.py
@@ -0,0 +1,186 @@
+# Copyright 2018 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import gettext
+
+from gi.repository import Gdk, GObject, Gio, Gtk
+
+from gnomemusic.grilowrappers.grltrackerplaylists import Playlist
+from gnomemusic.playlisttoast import PlaylistToast
+
+
+@Gtk.Template(resource_path='/org/gnome/Music/ui/PlaylistControls.ui')
+class PlaylistControls(Gtk.Box):
+ """Widget holding the playlist controls"""
+
+ __gtype_name__ = "PlaylistControls"
+
+ _name_stack = Gtk.Template.Child()
+ _name_label = Gtk.Template.Child()
+ _play_button = Gtk.Template.Child()
+ _rename_controller = Gtk.Template.Child()
+ _rename_entry = Gtk.Template.Child()
+ _rename_done_button = Gtk.Template.Child()
+ _songs_count_label = Gtk.Template.Child()
+
+ def __init__(self):
+ super().__init__()
+
+ self._application = None
+
+ self._playlist = None
+ self._count_id = 0
+ self._binding_count = None
+
+ self._delete_action = Gio.SimpleAction.new("playlist_delete", None)
+ self._delete_action.connect("activate", self._on_delete_action)
+
+ self._play_action = Gio.SimpleAction.new("playlist_play", None)
+
+ self._rename_action = Gio.SimpleAction.new("playlist_rename", None)
+ self._rename_action.connect("activate", self._enable_rename_playlist)
+
+ # FIXME: This is a workaround for not being able to pass the application
+ # object via init when using Gtk.Builder.
+ @GObject.Property(default=None)
+ def application(self):
+ """The Application object used
+
+ :return: application object
+ :rtype: Application
+ """
+ return self._application
+
+ @application.setter # type: ignore
+ def application(self, application):
+ """Set the Application object used
+
+ :param Application application: The Application to use
+ """
+ if (application is None
+ or (self._application is not None
+ and self._application != application)):
+ return
+
+ self._application = application
+ self._coremodel = application.props.coremodel
+ self._player = application.props.player
+ self._window = application.props.window
+
+ self._window.add_action(self._delete_action)
+ self._window.add_action(self._play_action)
+ self._window.add_action(self._rename_action)
+
+ def _on_delete_action(self, menutime, data=None):
+ active_core_object = self._coremodel.props.active_core_object
+ if (active_core_object is not None
+ and active_core_object == self.props.playlist):
+ self._player.stop()
+ self._window.set_player_visible(False)
+
+ PlaylistToast(self._application, self.props.playlist)
+
+ @Gtk.Template.Callback()
+ def _on_play_button_clicked(self, button: Gtk.Button) -> None:
+ self._play_action.activate()
+
+ @Gtk.Template.Callback()
+ def _on_rename_entry_changed(self, selection):
+ selection_length = selection.props.text_length
+ self._rename_done_button.props.sensitive = selection_length > 0
+
+ @Gtk.Template.Callback()
+ def _on_rename_entry_key_pressed(self, controller, keyval, keycode, state):
+ if keyval == Gdk.KEY_Escape:
+ self._disable_rename_playlist()
+
+ @Gtk.Template.Callback()
+ def _on_playlist_renamed(self, widget):
+ new_name = self._rename_entry.props.text
+
+ if not new_name:
+ return
+
+ self.props.playlist.props.title = new_name
+ self._disable_rename_playlist()
+
+ def _on_songs_count_changed(self, klass, data=None):
+ self._songs_count_label.props.label = gettext.ngettext(
+ "{} Song", "{} Songs", self.props.playlist.count).format(
+ self.props.playlist.count)
+
+ empty_pl = (self.props.playlist.props.count == 0)
+ self._play_button.props.sensitive = not empty_pl
+ self._play_action.props.enabled = not empty_pl
+
+ def _enable_rename_playlist(self, menuitem, data=None):
+ self._name_stack.props.visible_child_name = "renaming_dialog"
+ self._rename_entry.props.text = self.props.playlist.props.title
+ self._rename_entry.grab_focus()
+
+ def _disable_rename_playlist(self):
+ """Disables rename button and entry"""
+ self._name_stack.props.visible_child = self._name_label
+
+ @GObject.Property(type=bool, default=False)
+ def rename_active(self):
+ """Indicate if renaming dialog is active
+
+ :return: Renaming dialog active
+ :rtype: bool
+ """
+ return self._name_stack.props.visible_child_name == "renaming_dialog"
+
+ @GObject.Property(
+ type=Playlist, default=None, flags=GObject.ParamFlags.READWRITE)
+ def playlist(self):
+ """Playlist property getter.
+
+ :returns: current playlist
+ :rtype: Playlist
+ """
+ return self._playlist
+
+ @playlist.setter # type: ignore
+ def playlist(self, new_playlist):
+ """Playlist property setter.
+
+ :param Playlist new_playlist: new playlist
+ """
+ if self._count_id > 0:
+ self._playlist.disconnect(self._count_id)
+ self._count_id = 0
+ self._binding_count.unbind()
+
+ self._playlist = new_playlist
+ self._disable_rename_playlist()
+ self._delete_action.props.enabled = not self._playlist.props.is_smart
+ self._rename_action.props.enabled = not self._playlist.props.is_smart
+
+ self._binding_count = self._playlist.bind_property(
+ "title", self._name_label, "label",
+ GObject.BindingFlags.SYNC_CREATE)
+ self._count_id = self._playlist.connect(
+ "notify::count", self._on_songs_count_changed)
+ self._on_songs_count_changed(None)
diff --git a/gnomemusic/widgets/playlistdialog.py b/gnomemusic/widgets/playlistdialog.py
new file mode 100644
index 00000000..fa402f76
--- /dev/null
+++ b/gnomemusic/widgets/playlistdialog.py
@@ -0,0 +1,137 @@
+# Copyright 2019 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import GObject, Gtk
+
+from gnomemusic.grilowrappers.grltrackerplaylists import Playlist
+from gnomemusic.widgets.playlistdialogrow import PlaylistDialogRow
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/PlaylistDialog.ui")
+class PlaylistDialog(Gtk.Dialog):
+ """Dialog for adding items to a playlist"""
+
+ __gtype_name__ = 'PlaylistDialog'
+
+ selected_playlist = GObject.Property(type=Playlist, default=None)
+
+ _add_playlist_stack = Gtk.Template.Child()
+ _normal_box = Gtk.Template.Child()
+ _empty_box = Gtk.Template.Child()
+ _title_bar = Gtk.Template.Child()
+ _listbox = Gtk.Template.Child()
+ _cancel_button = Gtk.Template.Child()
+ _select_button = Gtk.Template.Child()
+ _new_playlist_button = Gtk.Template.Child()
+ _new_playlist_entry = Gtk.Template.Child()
+ _first_playlist_button = Gtk.Template.Child()
+ _first_playlist_entry = Gtk.Template.Child()
+
+ def __init__(self, application):
+ """Initialize PlaylistDialog
+
+ :param Application application: The application object
+ """
+ super().__init__()
+
+ self._coregrilo = application.props.coregrilo
+
+ self._add_playlist_button = None
+ self._add_playlist_entry = None
+
+ self.set_titlebar(self._title_bar)
+
+ self._user_playlists_available = False
+
+ coremodel = application.props.coremodel
+ self._listbox.bind_model(
+ coremodel.props.user_playlists_sort, self._create_playlist_row)
+
+ self._set_view()
+
+ def _set_view(self):
+ if self._user_playlists_available:
+ self._normal_box.show()
+ self._add_playlist_stack.props.visible_child = self._normal_box
+ self._add_playlist_button = self._new_playlist_button
+ self._add_playlist_entry = self._new_playlist_entry
+ else:
+ self._empty_box.show()
+ self._add_playlist_stack.props.visible_child = self._empty_box
+ self._add_playlist_button = self._first_playlist_button
+ self._add_playlist_entry = self._first_playlist_entry
+
+ def _create_playlist_row(self, playlist):
+ """Adds (non-smart only) playlists to the model"""
+ self._user_playlists_available = True
+ self._set_view()
+
+ row = PlaylistDialogRow(playlist)
+
+ return row
+
+ @Gtk.Template.Callback()
+ def _on_selection(self, select_button):
+ self.response(Gtk.ResponseType.ACCEPT)
+
+ @Gtk.Template.Callback()
+ def _on_cancel_button_clicked(self, cancel_button):
+ self.response(Gtk.ResponseType.REJECT)
+
+ @Gtk.Template.Callback()
+ def _on_selected_rows_changed(self, klass):
+ self._add_playlist_entry.props.text = ""
+ self._add_playlist_button.props.sensitive = False
+ selected_row = self._listbox.get_selected_row()
+ if selected_row is not None:
+ self.props.selected_playlist = selected_row.props.playlist
+ self._select_button.props.sensitive = selected_row is not None
+
+ for row in self._listbox:
+ row.props.selected = (row == selected_row)
+
+ @Gtk.Template.Callback()
+ def _on_editing_done(self, sender, data=None):
+ def select_and_close_dialog(playlist):
+ for row in self._listbox:
+ if row.props.playlist == playlist:
+ self._listbox.select_row(row)
+ break
+ self.response(Gtk.ResponseType.ACCEPT)
+
+ text = self._add_playlist_entry.props.text
+ if text:
+ self._coregrilo.create_playlist(text, select_and_close_dialog)
+
+ @Gtk.Template.Callback()
+ def _on_add_playlist_entry_changed(self, editable, data=None):
+ if editable.props.text:
+ self._add_playlist_button.props.sensitive = True
+ else:
+ self._add_playlist_button.props.sensitive = False
+
+ @Gtk.Template.Callback()
+ def _on_add_playlist_entry_focused(
+ self, controller: Gtk.EventControllerFocus) -> None:
+ self._listbox.unselect_all()
diff --git a/gnomemusic/widgets/playlistdialogrow.py b/gnomemusic/widgets/playlistdialogrow.py
new file mode 100644
index 00000000..a52abcc6
--- /dev/null
+++ b/gnomemusic/widgets/playlistdialogrow.py
@@ -0,0 +1,53 @@
+# Copyright 2019 The GNOME Music Developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import GObject, Gtk
+
+from gnomemusic.grilowrappers.grltrackerplaylists import Playlist
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/PlaylistDialogRow.ui")
+class PlaylistDialogRow(Gtk.ListBoxRow):
+
+ __gtype_name__ = "PlaylistDialogRow"
+
+ playlist = GObject.Property(type=Playlist, default=None)
+ selected = GObject.Property(type=bool, default=False)
+
+ _label = Gtk.Template.Child()
+ _selection_icon = Gtk.Template.Child()
+
+ def __init__(self, playlist):
+ """Create a row of the PlaylistDialog
+
+ :param Playlist playlist: the associated playlist
+ """
+ super().__init__()
+
+ self.props.playlist = playlist
+ self._label.props.label = playlist.props.title
+
+ self.bind_property(
+ "selected", self._selection_icon, "visible",
+ GObject.BindingFlags.SYNC_CREATE)
diff --git a/gnomemusic/widgets/playlistswidget.py b/gnomemusic/widgets/playlistswidget.py
new file mode 100644
index 00000000..2e4748d4
--- /dev/null
+++ b/gnomemusic/widgets/playlistswidget.py
@@ -0,0 +1,137 @@
+# Copyright 2020 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+import typing
+
+from gi.repository import GObject, Gtk
+
+from gnomemusic.widgets.playlistcontrols import PlaylistControls # noqa: F401
+from gnomemusic.widgets.songwidget import SongWidget
+from gnomemusic.widgets.songwidgetmenu import SongWidgetMenu
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.coresong import CoreSong
+ from gnomemusic.grilowrappers.grltrackerplaylists import Playlist
+ from gnomemusic.views.playlistsview import PlaylistsView
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/PlaylistsWidget.ui")
+class PlaylistsWidget(Gtk.Box):
+ """Widget to display the playlist controls and list"""
+
+ __gtype_name__ = "PlaylistsWidget"
+
+ _pl_ctrls = Gtk.Template.Child()
+ _songs_list = Gtk.Template.Child()
+
+ def __init__(
+ self, application: Application,
+ playlists_view: PlaylistsView) -> None:
+ """Initialize the PlaylistsWidget.
+
+ :param Application application: The application object
+ :param PlaylistsView playlists_view: The parent view
+ """
+ super().__init__()
+
+ self._application = application
+ self._window = application.props.window
+ self._coremodel = application.props.coremodel
+ self._player = application.props.player
+ self._playlists_view = playlists_view
+
+ self._playlists_view.connect(
+ "notify::current-playlist", self._on_current_playlist_changed)
+
+ self._pl_ctrls.props.application = application
+
+ playlist_play_action = self._window.lookup_action("playlist_play")
+ playlist_play_action.connect("activate", self._on_play_playlist)
+
+ self._coremodel.connect(
+ "smart-playlist-change", self._on_smart_playlist_change)
+
+ def _on_current_playlist_changed(self, playlists_view, value):
+ """Update view with content from selected playlist"""
+ playlist = self._playlists_view.props.current_playlist
+
+ self._songs_list.bind_model(
+ playlist.props.model, self._create_song_widget, playlist)
+ if playlist.props.is_smart:
+ playlist.update()
+
+ self._pl_ctrls.props.playlist = playlist
+
+ def _create_song_widget(
+ self, coresong: CoreSong, playlist: Playlist) -> Gtk.ListBoxRow:
+ can_dnd = not playlist.props.is_smart
+ song_widget = SongWidget(coresong, can_dnd, True)
+ song_widget.props.show_song_number = False
+ song_widget.props.menu = SongWidgetMenu(
+ self._application, song_widget, playlist)
+
+ if can_dnd is True:
+ song_widget.connect("widget_moved", self._on_song_widget_moved)
+
+ return song_widget
+
+ @Gtk.Template.Callback()
+ def _on_song_activated(
+ self, list_box: Gtk.ListBox, song_widget: SongWidget) -> bool:
+ coresong = song_widget.props.coresong
+ self._play(coresong)
+ return True
+
+ def _play(self, coresong=None):
+ signal_id = None
+
+ def _on_playlist_loaded(klass, playlist_type):
+ self._player.play(coresong)
+ self._coremodel.disconnect(signal_id)
+
+ current_playlist = self._playlists_view.props.current_playlist
+ signal_id = self._coremodel.connect(
+ "playlist-loaded", _on_playlist_loaded)
+ self._coremodel.props.active_core_object = current_playlist
+
+ def _on_song_widget_moved(self, target, source_position):
+ target_position = target.get_index()
+ current_playlist = self._playlists_view.props.current_playlist
+ current_playlist.reorder(source_position, target_position)
+
+ def _on_smart_playlist_change(self, coremodel):
+ current_playlist = self._playlists_view.props.current_playlist
+ if (current_playlist is not None
+ and current_playlist.props.is_smart):
+ current_playlist.update()
+
+ def _on_play_playlist(self, menuitem, data=None):
+ self._play()
+
+ @GObject.Property(
+ type=bool, default=False, flags=GObject.ParamFlags.READABLE)
+ def rename_active(self):
+ """Indicate if renaming dialog is active"""
+ return self._pl_ctrls.props.rename_active
diff --git a/gnomemusic/widgets/playlisttile.py b/gnomemusic/widgets/playlisttile.py
new file mode 100644
index 00000000..d756a7a8
--- /dev/null
+++ b/gnomemusic/widgets/playlisttile.py
@@ -0,0 +1,56 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import GObject, Gtk
+
+from gnomemusic.grilowrappers.grltrackerplaylists import Playlist
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/PlaylistTile.ui")
+class PlaylistTile(Gtk.ListBoxRow):
+ """Row for sidebars
+
+ Contains a label and an optional checkbox.
+ """
+
+ __gtype_name__ = "PlaylistTile"
+
+ _icon = Gtk.Template.Child()
+ _label = Gtk.Template.Child()
+
+ playlist = GObject.Property(type=Playlist, default=None)
+ text = GObject.Property(type=str, default='')
+
+ def __init__(self, playlist):
+ super().__init__()
+
+ self.props.playlist = playlist
+
+ self._icon.props.icon_name = playlist.props.icon_name
+
+ self.props.playlist.bind_property(
+ "title", self._label, "label", GObject.BindingFlags.SYNC_CREATE)
+ self.props.playlist.bind_property(
+ "title", self._label, "tooltip-text",
+ GObject.BindingFlags.SYNC_CREATE)
diff --git a/gnomemusic/widgets/searchheaderbar.py b/gnomemusic/widgets/searchheaderbar.py
new file mode 100644
index 00000000..3c2298bd
--- /dev/null
+++ b/gnomemusic/widgets/searchheaderbar.py
@@ -0,0 +1,215 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from enum import IntEnum
+
+from gettext import gettext as _
+from gi.repository import Adw, GObject, Gtk
+
+from gnomemusic.search import Search
+from gnomemusic.widgets.headerbar import HeaderBar, SelectionBarMenuButton
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/SearchHeaderBar.ui")
+class SearchHeaderBar(Adw.Bin):
+ """SearcnHeaderbar of the application"""
+
+ class State(IntEnum):
+ """States the SearchHeaderbar can have"""
+ MAIN = 0
+ CHILD = 1
+ SEARCH = 2
+ EMPTY = 3
+
+ __gtype_name__ = "SearchHeaderBar"
+
+ _headerbar = Gtk.Template.Child()
+ _search_button = Gtk.Template.Child()
+ _select_button = Gtk.Template.Child()
+ _cancel_button = Gtk.Template.Child()
+
+ search_mode_active = GObject.Property(type=bool, default=False)
+ search_state = GObject.Property(type=int, default=Search.State.NONE)
+ selected_songs_count = GObject.Property(type=int, default=0, minimum=0)
+ selection_mode_allowed = GObject.Property(type=bool, default=True)
+ stack = GObject.Property(type=Adw.ViewStack)
+
+ def __init__(self, application):
+ super().__init__()
+
+ self._coregrilo = application.props.coregrilo
+ self._selection_mode = False
+
+ self._entry = Gtk.SearchEntry()
+ self._entry.props.placeholder_text = _(
+ "Search songs, artists, albums and playlists")
+ self._entry.props.halign = Gtk.Align.CENTER
+ self._entry.props.visible = True
+ self._entry.props.width_request = 500
+
+ self._selection_menu = SelectionBarMenuButton()
+
+ self.bind_property(
+ "selection-mode", self._headerbar, "show-end-title-buttons",
+ GObject.BindingFlags.INVERT_BOOLEAN
+ | GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selection-mode", self._cancel_button, "visible")
+ self.bind_property(
+ "selection-mode", self._select_button, "visible",
+ GObject.BindingFlags.INVERT_BOOLEAN)
+ self.bind_property(
+ "selection-mode", self._select_button, "active",
+ GObject.BindingFlags.BIDIRECTIONAL)
+ self.bind_property(
+ "selected-songs-count", self._selection_menu,
+ "selected-songs-count")
+ self.bind_property(
+ "search-mode-active", self._search_button, "active",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selection-mode", self._search_button, "visible",
+ GObject.BindingFlags.INVERT_BOOLEAN
+ | GObject.BindingFlags.SYNC_CREATE)
+
+ self.connect(
+ "notify::selection-mode-allowed",
+ self._on_selection_mode_allowed_changed)
+
+ self.connect(
+ "notify::search-mode-active", self._on_search_mode_changed)
+ self.connect("notify::search-state", self._search_state_changed)
+
+ self._entry.connect("search-changed", self._search_entry_changed)
+
+ @GObject.Property(type=bool, default=False)
+ def selection_mode(self):
+ """Selection mode
+
+ :returns: Selection mode
+ :rtype: bool
+ """
+ return self._selection_mode
+
+ @selection_mode.setter # type: ignore
+ def selection_mode(self, mode):
+ """Set the selection mode
+
+ :param bool value: Selection mode
+ """
+ self._selection_mode = mode
+
+ if mode:
+ self.get_style_context().add_class("selection-mode")
+ else:
+ self.get_style_context().remove_class("selection-mode")
+ self._select_button.props.active = False
+
+ self._update()
+
+ @GObject.Property
+ def state(self):
+ """State of the widget
+
+ :returns: Widget state
+ :rtype: HeaderBar.State
+ """
+ return self._state
+
+ @state.setter # type: ignore
+ def state(self, value):
+ """Set state of the of widget
+
+ This influences the look and functionality of the headerbar.
+
+ :param HeaderBar.State value: Widget state
+ """
+ self._state = value
+ self._update()
+
+ search_visible = self.props.state != HeaderBar.State.SEARCH
+ self._search_button.props.visible = search_visible
+
+ if value == HeaderBar.State.EMPTY:
+ self._search_button.props.sensitive = False
+ self._select_button.props.sensitive = False
+ self._entry.props.visible = False
+ else:
+ self._search_button.props.sensitive = True
+ self._select_button.props.sensitive = True
+ self._entry.props.visible = False
+
+ @Gtk.Template.Callback()
+ def _on_cancel_button_clicked(self, button):
+ self.props.selection_mode = False
+
+ def _update(self):
+ if self.props.selection_mode:
+ self._headerbar.props.title_widget = self._selection_menu
+ else:
+ self._headerbar.props.title_widget = self._entry
+
+ def _on_selection_mode_allowed_changed(self, widget, data):
+ if self.props.selection_mode_allowed:
+ self._select_button.props.sensitive = True
+ else:
+ self._select_button.props.sensitive = False
+
+ def _search_entry_changed(self, widget: Gtk.SearchEntry) -> bool:
+ search_term = self._entry.get_text()
+ if search_term != "":
+ self.props.stack.set_visible_child_name("search")
+ self._coregrilo.search(search_term)
+ else:
+ self._set_error_style(False)
+
+ return False
+
+ def _on_search_mode_changed(self, klass, data):
+ if self.props.search_mode_active:
+ self._entry.grab_focus()
+
+ def _search_state_changed(self, klass, data):
+ search_state = self.props.search_state
+
+ if search_state == Search.State.NO_RESULT:
+ self._set_error_style(True)
+ self.props.stack.props.visible_child_name = "emptyview"
+ elif search_state == Search.State.RESULT:
+ self._set_error_style(False)
+ self.props.stack.props.visible_child_name = "search"
+ elif search_state == Search.State.NONE:
+ self._entry.props.text = ""
+
+ def _set_error_style(self, error):
+ """Adds error state to the search entry.
+
+ :param bool error: Whether to add error state
+ """
+ style_context = self._entry.get_style_context()
+ if error:
+ style_context.add_class("error")
+ else:
+ style_context.remove_class("error")
diff --git a/gnomemusic/widgets/selectiontoolbar.py b/gnomemusic/widgets/selectiontoolbar.py
new file mode 100644
index 00000000..f3a34bc4
--- /dev/null
+++ b/gnomemusic/widgets/selectiontoolbar.py
@@ -0,0 +1,57 @@
+# Copyright © 2018 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import GObject, Gtk
+
+
+@Gtk.Template(resource_path='/org/gnome/Music/ui/SelectionToolbar.ui')
+class SelectionToolbar(Gtk.ActionBar):
+
+ __gtype_name__ = 'SelectionToolbar'
+
+ _add_to_playlist_button = Gtk.Template.Child()
+
+ __gsignals__ = {
+ 'add-to-playlist': (GObject.SignalFlags.RUN_FIRST, None, ())
+ }
+
+ selected_songs_count = GObject.Property(type=int, default=0, minimum=0)
+
+ def __init__(self):
+ super().__init__()
+
+ self.connect(
+ 'notify::selected-songs-count', self._on_songs_selection_changed)
+
+ self.notify("selected-songs-count")
+
+ @Gtk.Template.Callback()
+ def _on_add_to_playlist_button_clicked(self, widget):
+ self.emit('add-to-playlist')
+
+ def _on_songs_selection_changed(self, widget, data):
+ if self.props.selected_songs_count > 0:
+ self._add_to_playlist_button.props.sensitive = True
+ else:
+ self._add_to_playlist_button.props.sensitive = False
diff --git a/gnomemusic/widgets/smoothscale.py b/gnomemusic/widgets/smoothscale.py
new file mode 100644
index 00000000..8892c4c4
--- /dev/null
+++ b/gnomemusic/widgets/smoothscale.py
@@ -0,0 +1,193 @@
+# Copyright © 2018 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import GLib, GObject, Gtk
+
+from gnomemusic.gstplayer import Playback
+
+
+class SmoothScale(Gtk.Scale):
+ """Progressbar UI element
+
+ The progressbar Gtk.Scale, extended with smoothing capabilities, so
+ the indicator updates every pixel available.
+ """
+ __gtype_name__ = 'SmoothScale'
+
+ def __init__(self):
+ super().__init__()
+
+ self._player = None
+ self._old_smooth_scale_value = 0.0
+
+ self._seek_timeout = None
+ self._previous_state = None
+
+ self._timeout = None
+
+ ctrl = Gtk.GestureClick()
+ ctrl.connect("pressed", self._on_button_pressed)
+ ctrl.connect("released", self._on_button_released)
+ self.add_controller(ctrl)
+
+ self.connect('change-value', self._on_smooth_scale_seek)
+
+ # FIXME: This is a workaround for not being able to pass the player
+ # object via init when using Gtk.Builder.
+ @GObject.Property
+ def player(self):
+ """The Player object used
+
+ :return: player object
+ :rtype: Player
+ """
+ return self._player
+
+ @player.setter # type: ignore
+ def player(self, player):
+ """Set the Player object used
+
+ :param Player player: The Player to use
+ """
+ if (player is None
+ or (self._player is not None
+ and self._player != player)):
+ return
+
+ self._player = player
+
+ self._player.connect('notify::state', self._on_state_change)
+ self._player.connect('notify::duration', self._on_duration_changed)
+
+ def _on_state_change(self, klass, arguments):
+ state = self._player.props.state
+
+ self._previous_state = state
+
+ if (state == Playback.STOPPED
+ or state == Playback.LOADING):
+ self.set_value(0)
+ self.props.sensitive = False
+ else:
+ self.props.sensitive = True
+
+ if state == Playback.PLAYING:
+ self._update_position_callback()
+ else:
+ self._remove_timeout()
+
+ return True
+
+ def _on_duration_changed(self, klass, arguments):
+ duration = self._player.props.duration
+
+ if duration != -1.:
+ self.set_range(0.0, duration * 60)
+ self.set_increments(300, 600)
+
+ def _on_smooth_scale_seek_finish(self, value):
+ """Prevent stutters when seeking with infinitesimal amounts"""
+ self._seek_timeout = None
+ round_digits = self.props.round_digits
+ if self._old_smooth_scale_value != round(value, round_digits):
+ self._on_smooth_scale_change_value(self)
+ self._old_smooth_scale_value = round(value, round_digits)
+
+ return False
+
+ def _on_smooth_scale_seek(self, scale, scroll_type, value):
+ """Smooths out the seeking process
+
+ Called every time progress scale is moved. Only after a seek
+ has been stable for 100ms, play the song from its location.
+ """
+ if self._seek_timeout:
+ GLib.source_remove(self._seek_timeout)
+
+ Gtk.Range.do_change_value(scale, scroll_type, value)
+ if scroll_type == Gtk.ScrollType.JUMP:
+ self._seek_timeout = GLib.timeout_add(
+ 100, self._on_smooth_scale_seek_finish, value)
+ else:
+ # Scroll with keys, hence no smoothing.
+ self._on_smooth_scale_seek_finish(value)
+ self._update_position_callback()
+
+ return True
+
+ def _on_button_released(self, gesture, n_press, x, y):
+ if self._seek_timeout:
+ GLib.source_remove(self._seek_timeout)
+ self._on_smooth_scale_seek_finish(
+ self.get_value())
+
+ self._update_position_callback()
+
+ return False
+
+ def _on_button_pressed(self, gesture, n_press, x, y):
+ self._remove_timeout()
+ self._old_smooth_scale_value = self.get_value()
+
+ return False
+
+ def _update_timeout(self):
+ """Update the duration for self._timeout
+
+ Sets the period of self._timeout to a value small enough to make
+ the slider SmoothScale move smoothly based on the current song
+ duration and scale length.
+ """
+ duration = abs(self._player.props.duration)
+
+ style_context = self.get_style_context()
+ width = self.get_allocated_width()
+ padding = style_context.get_padding()
+ width = max(width - (padding.left + padding.right), 1)
+
+ timeout_period = min(1000 * duration // width, 200)
+
+ if self._timeout:
+ GLib.source_remove(self._timeout)
+ self._timeout = GLib.timeout_add(
+ timeout_period, self._update_position_callback)
+
+ def _remove_timeout(self):
+ if self._timeout:
+ GLib.source_remove(self._timeout)
+ self._timeout = None
+
+ def _on_smooth_scale_change_value(self, scroll):
+ seconds = scroll.get_value() / 60
+ self._player.set_position(seconds)
+
+ return True
+
+ def _update_position_callback(self):
+ position = self._player.get_position()
+ if position > 0:
+ self.set_value(position * 60)
+ self._update_timeout()
+
+ return False
diff --git a/gnomemusic/widgets/songwidget.py b/gnomemusic/widgets/songwidget.py
new file mode 100644
index 00000000..ff3dbf3f
--- /dev/null
+++ b/gnomemusic/widgets/songwidget.py
@@ -0,0 +1,337 @@
+# Copyright © 2018 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+
+from enum import IntEnum
+from typing import Optional
+
+from gi.repository import Gdk, GObject, Gtk
+
+from gnomemusic import utils
+from gnomemusic.coresong import CoreSong
+from gnomemusic.utils import SongStateIcon
+from gnomemusic.widgets.starimage import StarImage # noqa: F401
+
+
+@Gtk.Template(resource_path='/org/gnome/Music/ui/SongWidget.ui')
+class SongWidget(Gtk.ListBoxRow):
+ """The single song widget used in DiscBox
+
+ Contains
+ * play icon (depending on state)
+ * selection check box (optional)
+ * song number on disc (optional)
+ * song title
+ * song duration (optional)
+ * favorite/star picker (optional)
+ """
+
+ __gtype_name__ = 'SongWidget'
+
+ __gsignals__ = {
+ "widget-moved": (GObject.SignalFlags.RUN_FIRST, None, (int,))
+ }
+
+ coresong = GObject.Property(type=CoreSong, default=None)
+ selected = GObject.Property(type=bool, default=False)
+ show_song_number = GObject.Property(type=bool, default=True)
+
+ _album_label = Gtk.Template.Child()
+ _album_duration_box = Gtk.Template.Child()
+ _artist_box = Gtk.Template.Child()
+ _artist_label = Gtk.Template.Child()
+ _dnd_icon = Gtk.Template.Child()
+ _drag_source = Gtk.Template.Child()
+ _menu_button = Gtk.Template.Child()
+ _select_button = Gtk.Template.Child()
+ _number_label = Gtk.Template.Child()
+ _title_label = Gtk.Template.Child()
+ _duration_label = Gtk.Template.Child()
+ _star_image = Gtk.Template.Child()
+ _star_stack = Gtk.Template.Child()
+ _play_icon = Gtk.Template.Child()
+ _size_group = Gtk.Template.Child()
+
+ class State(IntEnum):
+ """The state of the SongWidget
+ """
+ PLAYED = 0
+ PLAYING = 1
+ UNPLAYED = 2
+
+ def __init__(self, coresong, can_dnd=False, show_artist_and_album=False):
+ """Instanciates a SongWidget
+
+ :param Corsong coresong: song associated with the widget
+ :param bool can_dnd: allow drag and drop operations
+ :param bool show_artist_and_album: display artist and album
+ """
+ super().__init__()
+
+ self.props.coresong = coresong
+ self._selection_mode = False
+ self._state = SongWidget.State.UNPLAYED
+
+ self.props.coresong.bind_property(
+ "track-number", self, "song-number",
+ GObject.BindingFlags.SYNC_CREATE)
+
+ self._title_label.set_max_width_chars(50)
+ self.props.coresong.bind_property(
+ "title", self._title_label, "label",
+ GObject.BindingFlags.SYNC_CREATE)
+ self.props.coresong.bind_property(
+ "title", self._title_label, "tooltip-text",
+ GObject.BindingFlags.SYNC_CREATE)
+
+ time = utils.seconds_to_string(self.props.coresong.props.duration)
+ self._duration_label.props.label = time
+
+ if show_artist_and_album is True:
+ self.props.coresong.bind_property(
+ "album", self._album_label, "label",
+ GObject.BindingFlags.SYNC_CREATE)
+ self._album_label.props.visible = True
+ self.props.coresong.bind_property(
+ "artist", self._artist_label, "label",
+ GObject.BindingFlags.SYNC_CREATE)
+ self._artist_box.props.visible = True
+ else:
+ self._size_group.remove_widget(self._album_duration_box)
+
+ self._select_button.set_visible(False)
+
+ self._play_icon.set_from_icon_name("media-playback-start-symbolic")
+
+ self.props.coresong.bind_property(
+ 'selected', self._select_button, 'active',
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ 'show-song-number', self._number_label, 'visible',
+ GObject.BindingFlags.SYNC_CREATE)
+ self.props.coresong.bind_property(
+ "favorite", self._star_image, "favorite",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+ self.props.coresong.bind_property(
+ "state", self, "state",
+ GObject.BindingFlags.SYNC_CREATE)
+ self.props.coresong.connect(
+ "notify::validation", self._on_validation_changed)
+
+ if not self.props.coresong.props.is_tracker:
+ self._star_stack.props.visible_child_name = "empty"
+
+ self._drag_x = 0.
+ self._drag_y = 0.
+ self._drag_widget: Optional[Gtk.ListBox] = None
+ if can_dnd:
+ capture_phase = Gtk.PropagationPhase.CAPTURE
+ self._drag_source.props.propagation_phase = capture_phase
+ self._dnd_icon.props.visible = True
+
+ @Gtk.Template.Callback()
+ def _on_drag_prepare(
+ self, drag_source: Gtk.DragSource, x: float,
+ y: float) -> Gdk.ContentProvider:
+ self._drag_x = x
+ self._drag_y = y
+ return Gdk.ContentProvider.new_for_value(self)
+
+ @Gtk.Template.Callback()
+ def _on_drag_begin(
+ self, drag_source: Gtk.DragSource, drag: Gdk.Drag) -> None:
+ allocation = self.get_allocation()
+ self._drag_widget = Gtk.ListBox()
+ self._drag_widget.set_size_request(allocation.width, allocation.height)
+
+ drag_row = SongWidget(self.props.coresong, False, True)
+ drag_row.props.show_song_number = self.props.show_song_number
+ self._drag_widget.append(drag_row)
+ self._drag_widget.drag_highlight_row(drag_row)
+
+ drag_icon = Gtk.DragIcon.get_for_drag(drag)
+ drag_icon.props.child = self._drag_widget
+ drag.set_hotspot(self._drag_x, self._drag_y)
+
+ @Gtk.Template.Callback()
+ def _on_drop(
+ self, target: Gtk.DropTarget,
+ source_widget: SongWidget, x: float, y: float) -> bool:
+ self._drag_widget = None
+ self._drag_x = 0.
+ self._drag_y = 0.
+
+ source_position = source_widget.get_index()
+ target_position = self.get_index()
+ if source_position == target_position:
+ return False
+
+ self.emit("widget-moved", source_position)
+ return True
+
+ @Gtk.Template.Callback()
+ def _on_click(
+ self, gesture_click: Gtk.GestureClick, n_click: int, x: int,
+ y: int) -> bool:
+ state = gesture_click.get_current_event_state()
+ modifiers = Gtk.accelerator_get_default_mod_mask()
+ if (state & modifiers == Gdk.ModifierType.CONTROL_MASK
+ and not self.props.selection_mode):
+ self.props.selection_mode = True
+
+ return Gdk.EVENT_STOP
+
+ @Gtk.Template.Callback()
+ def _on_star_toggle(
+ self, controller: Gtk.GestureClick, n_press: int, x: float,
+ y: float) -> bool:
+ controller.set_state(Gtk.EventSequenceState.CLAIMED)
+ favorite = not self._star_image.favorite
+ self._star_image.props.favorite = favorite
+ return Gdk.EVENT_STOP
+
+ @Gtk.Template.Callback()
+ def _on_star_hover(self, controller, x, y):
+ self._star_image.props.hover = True
+
+ @Gtk.Template.Callback()
+ def _on_star_unhover(self, controller):
+ self._star_image.props.hover = False
+
+ @GObject.Property(type=bool, default=False)
+ def selection_mode(self):
+ """Selection mode
+
+ :returns: Selection mode
+ :rtype: bool
+ """
+ return self._selection_mode
+
+ @selection_mode.setter # type: ignore
+ def selection_mode(self, value):
+ """Set the selection mode
+
+ :param bool value: Selection mode
+ """
+ if (not self.props.coresong.props.is_tracker
+ and value):
+ self.props.sensitive = False
+ return
+
+ self.props.sensitive = True
+
+ self._selection_mode = value
+ self._select_button.set_visible(value)
+
+ if not value:
+ self.props.selected = False
+
+ @GObject.Property
+ def state(self):
+ """State of the widget
+
+ :returns: Widget state
+ :rtype: SongWidget.State
+ """
+ return self._state
+
+ @state.setter # type: ignore
+ def state(self, value):
+ """Set state of the of widget
+
+ This influences the look of the widgets label and if there is a
+ song play indicator being shown.
+
+ :param SongWidget.State value: Widget state
+ """
+ self._state = value
+
+ style_ctx = self._title_label.get_style_context()
+
+ style_ctx.remove_class('dim-label')
+ style_ctx.remove_class('playing-song-label')
+ self._play_icon.set_visible(False)
+
+ coresong = self.props.coresong
+ if coresong.props.validation == CoreSong.Validation.FAILED:
+ self._play_icon.set_visible(True)
+ style_ctx.add_class("dim-label")
+ return
+
+ if value == SongWidget.State.PLAYED:
+ style_ctx.add_class('dim-label')
+ elif value == SongWidget.State.PLAYING:
+ self._play_icon.set_visible(True)
+ style_ctx.add_class('playing-song-label')
+
+ def _on_validation_changed(self, coresong, sate):
+ validation_status = coresong.props.validation
+ if validation_status == CoreSong.Validation.FAILED:
+ self._play_icon.props.icon_name = SongStateIcon.ERROR.value
+ self._play_icon.set_visible(True)
+ else:
+ self._play_icon.props.icon_name = SongStateIcon.PLAYING.value
+
+ @GObject.Property(type=str, default="")
+ def song_number(self):
+ """Get song number label
+
+ :returns: the song number
+ :rtype: str
+ """
+ return self._number_label.props.label
+
+ @song_number.setter # type: ignore
+ def song_number(self, new_nr):
+ """Set song number label from an integer
+
+ :param int new_nr: new song number
+ """
+ if new_nr == 0:
+ new_nr = ""
+
+ self._number_label.props.label = str(new_nr)
+
+ @GObject.Property(type=Gtk.Popover, default=None)
+ def menu(self) -> Optional[Gtk.Popover]:
+ """Get the song menu.
+
+ If no menu is set, the menu button is not displayed.
+
+ :returns: song menu
+ :rtype: Gtk.PopoverMenu
+ """
+ return self._menu_button.props.popover
+
+ @menu.setter # type: ignore
+ def menu(self, menu: Optional[Gtk.PopoverMenu]) -> None:
+ """Set song menu.
+
+ :param Gtk.PopoverMenu menu: new song menu
+ """
+ self._menu_button.props.popover = menu
+ self._menu_button.props.visible = (menu is not None)
diff --git a/gnomemusic/widgets/songwidgetmenu.py b/gnomemusic/widgets/songwidgetmenu.py
new file mode 100644
index 00000000..6874ea9d
--- /dev/null
+++ b/gnomemusic/widgets/songwidgetmenu.py
@@ -0,0 +1,140 @@
+# Copyright 2021 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+from typing import Any, Optional, Union, cast
+import typing
+
+from gi.repository import Gio, GObject, Gtk
+
+from gnomemusic.grilowrappers.grltrackerplaylists import Playlist
+from gnomemusic.songtoast import SongToast
+from gnomemusic.widgets.playlistdialog import PlaylistDialog
+from gnomemusic.widgets.songwidget import SongWidget
+if typing.TYPE_CHECKING:
+ from gnomemusic.application import Application
+ from gnomemusic.corealbum import CoreAlbum
+ from gnomemusic.coresong import CoreSong
+ CoreObject = Union[CoreAlbum, CoreSong, Playlist]
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/SongWidgetMenu.ui")
+class SongWidgetMenu(Gtk.PopoverMenu):
+
+ __gtype_name__ = "SongWidgetMenu"
+
+ def __init__(
+ self, application: Application,
+ song_widget: Union[SongWidget, Gtk.ListItem],
+ coreobject: Optional[CoreObject]) -> None:
+ """Menu to interact with the song of a SongWidget.
+
+ :param Application application: The application object
+ :param SongWidget song_widget: The songwidget associated with the menu
+ :param Union[CoreAlbum, CoreSong, Playlist] coreobject: The
+ coreobject associated with the menu
+ """
+ super().__init__()
+
+ self._application = application
+ self._coremodel = application.props.coremodel
+ self._player = application.props.player
+ self._window = application.props.window
+
+ self._coreobject = coreobject
+ self._coresong: CoreSong
+ self._song_widget = song_widget
+ self.props.coreobject = coreobject
+
+ self._playlist_dialog: Optional[PlaylistDialog] = None
+
+ action_group = Gio.SimpleActionGroup()
+ action_entries = [
+ ("play", self._play_song),
+ ("add_playlist", self._add_to_playlist)
+ ]
+ if (isinstance(self._coreobject, Playlist)
+ and not self._coreobject.props.is_smart):
+ action_entries.append(
+ ("remove_playlist", self._remove_from_playlist))
+ elif not isinstance(self._coreobject, Playlist):
+ self.props.menu_model.remove(2)
+
+ for name, callback in action_entries:
+ action = Gio.SimpleAction.new(name, None)
+ action.connect("activate", callback)
+ action_group.add_action(action)
+
+ self.insert_action_group("songwidget", action_group)
+
+ def _play_song(self, action: Gio.Simple, param: Any) -> None:
+ self.popdown()
+ signal_id = 0
+
+ def _on_playlist_loaded(klass, playlist_type):
+ self._player.play(self._coresong)
+ self._coremodel.disconnect(signal_id)
+
+ signal_id = self._coremodel.connect(
+ "playlist-loaded", _on_playlist_loaded)
+ self._coremodel.props.active_core_object = self._coreobject
+
+ def _add_to_playlist(self, action: Gio.Simple, param: Any) -> None:
+
+ def on_response(dialog: PlaylistDialog, response_id: int) -> None:
+ if not self._playlist_dialog:
+ return
+
+ if response_id == Gtk.ResponseType.ACCEPT:
+ playlist = self._playlist_dialog.props.selected_playlist
+ playlist.add_songs([self._coresong])
+
+ self._playlist_dialog.destroy()
+ self._playlist_dialog = None
+
+ self.popdown()
+ self._playlist_dialog = PlaylistDialog(self._application)
+ self._playlist_dialog.props.transient_for = self._window
+ self._playlist_dialog.connect("response", on_response)
+ self._playlist_dialog.present()
+
+ def _remove_from_playlist(self, action: Gio.Simple, param: Any) -> None:
+ self.popdown()
+ position = self._song_widget.get_index()
+ SongToast(
+ self._application, cast(Playlist, self._coreobject), position,
+ self._coresong)
+
+ @GObject.Property(type=GObject.GObject)
+ def coreobject(self) -> CoreObject:
+ return self._coreobject
+
+ @coreobject.setter # type: ignore
+ def coreobject(self, coreobject: CoreObject) -> None:
+ self._coreobject = coreobject
+
+ if isinstance(self._song_widget, SongWidget):
+ self._coresong = self._song_widget.props.coresong
+ else:
+ self._coresong = coreobject
diff --git a/gnomemusic/widgets/starimage.py b/gnomemusic/widgets/starimage.py
new file mode 100644
index 00000000..1d84ecd3
--- /dev/null
+++ b/gnomemusic/widgets/starimage.py
@@ -0,0 +1,74 @@
+# Copyright © 2018 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import GObject, Gtk
+
+
+class StarImage(Gtk.Image):
+ """GtkImage for starring songs"""
+ __gtype_name__ = 'StarImage'
+
+ def __init__(self):
+ super().__init__()
+
+ self._favorite = False
+ self._hover = False
+
+ self.get_style_context().add_class("star")
+ self.props.visible = True
+
+ @GObject.Property(type=bool, default=False)
+ def favorite(self):
+ """Return the current state of the widget
+
+ :return: The state of the widget
+ :rtype: bool
+ """
+ return self._favorite
+
+ @favorite.setter # type: ignore
+ def favorite(self, value):
+ """Set favorite
+
+ Set the current widget as favorite or not.
+
+ :param bool value: Value to switch the widget state to
+ """
+ self._favorite = value
+
+ if self._favorite:
+ self.set_state_flags(Gtk.StateFlags.SELECTED, False)
+ else:
+ self.unset_state_flags(Gtk.StateFlags.SELECTED)
+
+ @GObject.Property(type=bool, default=False)
+ def hover(self):
+ return self._hover
+
+ @hover.setter # type: ignore
+ def hover(self, value):
+ if value:
+ self.set_state_flags(Gtk.StateFlags.PRELIGHT, False)
+ else:
+ self.unset_state_flags(Gtk.StateFlags.PRELIGHT)
diff --git a/gnomemusic/widgets/twolinetip.py b/gnomemusic/widgets/twolinetip.py
new file mode 100644
index 00000000..d40cdd77
--- /dev/null
+++ b/gnomemusic/widgets/twolinetip.py
@@ -0,0 +1,49 @@
+# Copyright 2018 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from gi.repository import GObject, Gtk
+
+
+@Gtk.Template(resource_path='/org/gnome/Music/ui/TwoLineTip.ui')
+class TwoLineTip(Gtk.Box):
+ """Tooltip with two lines of text
+
+ A bolded title and a regular subtitle.
+ """
+
+ __gtype_name__ = 'TwoLineTip'
+
+ _title_label = Gtk.Template.Child()
+ _subtitle_label = Gtk.Template.Child()
+
+ title = GObject.Property(type=str)
+ subtitle = GObject.Property(type=str)
+ subtitle_visible = GObject.Property(type=bool, default=True)
+
+ def __init__(self):
+ super().__init__()
+
+ self.bind_property('title', self._title_label, 'label')
+ self.bind_property('subtitle', self._subtitle_label, 'label')
+ self.bind_property('subtitle-visible', self._subtitle_label, 'visible')
diff --git a/gnomemusic/window.py b/gnomemusic/window.py
new file mode 100644
index 00000000..f0eb4312
--- /dev/null
+++ b/gnomemusic/window.py
@@ -0,0 +1,507 @@
+# Copyright 2019 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from typing import Optional
+
+from gi.repository import Adw, Gtk, Gdk, Gio, GLib, GObject
+from gettext import gettext as _
+
+from gnomemusic.gstplayer import Playback
+from gnomemusic.player import RepeatMode
+from gnomemusic.search import Search
+from gnomemusic.trackerwrapper import TrackerState
+from gnomemusic.utils import View
+from gnomemusic.views.albumsview import AlbumsView
+from gnomemusic.views.artistsview import ArtistsView
+from gnomemusic.views.emptyview import EmptyView
+from gnomemusic.views.searchview import SearchView
+from gnomemusic.views.songsview import SongsView
+from gnomemusic.views.playlistsview import PlaylistsView
+from gnomemusic.widgets.headerbar import HeaderBar
+from gnomemusic.widgets.playertoolbar import PlayerToolbar # noqa: F401
+from gnomemusic.widgets.playlistdialog import PlaylistDialog
+from gnomemusic.widgets.searchheaderbar import SearchHeaderBar
+from gnomemusic.widgets.selectiontoolbar import SelectionToolbar # noqa: F401
+from gnomemusic.windowplacement import WindowPlacement
+
+
+@Gtk.Template(resource_path="/org/gnome/Music/ui/Window.ui")
+class Window(Adw.ApplicationWindow):
+
+ __gtype_name__ = "Window"
+
+ active_view = GObject.Property(type=GObject.GObject, default=None)
+ selected_songs_count = GObject.Property(type=int, default=0, minimum=0)
+ selection_mode = GObject.Property(type=bool, default=False)
+
+ _headerbar_stack = Gtk.Template.Child()
+ _loading_progress = Gtk.Template.Child()
+ _overlay = Gtk.Template.Child()
+ _player_toolbar = Gtk.Template.Child()
+ _selection_toolbar = Gtk.Template.Child()
+ _stack = Gtk.Template.Child()
+ _toast_overlay = Gtk.Template.Child()
+
+ def __init__(self, app):
+ """Initialize the main window.
+
+ :param Gtk.Application app: Application object
+ """
+ super().__init__(application=app, title=_("Music"))
+
+ self._app = app
+ self._coreselection = app.props.coreselection
+
+ self._coreselection.bind_property(
+ "selected-songs-count", self, "selected-songs-count")
+
+ self._settings = app.props.settings
+ select_all = Gio.SimpleAction.new('select_all', None)
+ select_all.connect('activate', self._select_all)
+ self.add_action(select_all)
+ deselect_all = Gio.SimpleAction.new('deselect_all', None)
+ deselect_all.connect('activate', self._deselect_all)
+ self.add_action(deselect_all)
+
+ self.set_size_request(200, 100)
+ WindowPlacement(self)
+
+ self._current_view = None
+ self._view_before_search = None
+
+ self._playlist_dialog: Optional[PlaylistDialog] = None
+
+ self._player = app.props.player
+ self._search = app.props.search
+
+ self._startup_timeout_id = 0
+ self._setup_view()
+
+ def _setup_view(self):
+ self._headerbar = HeaderBar(self._app)
+ self._headerbar.props.stack = self._stack
+ self._search_headerbar = SearchHeaderBar(self._app)
+ self._search_headerbar.props.stack = self._stack
+ self._headerbar_stack.add_named(self._headerbar, "main")
+ self._headerbar_stack.add_named(self._search_headerbar, "search")
+
+ self._search.bind_property(
+ "search-mode-active", self._headerbar, "search-mode-active",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+ self._search.bind_property(
+ "search-mode-active", self._search_headerbar, "search-mode-active",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+ self._search.bind_property(
+ "state", self._search_headerbar, "search-state",
+ GObject.BindingFlags.SYNC_CREATE)
+
+ self._search.connect(
+ "notify::search-mode-active", self._on_search_mode_changed)
+
+ self._player_toolbar.props.player = self._player
+
+ self._headerbar.connect(
+ 'back-button-clicked', self._switch_back_from_childview)
+
+ self.bind_property(
+ 'selected-songs-count', self._headerbar, 'selected-songs-count')
+ self.bind_property(
+ "selected-songs-count", self._selection_toolbar,
+ "selected-songs-count")
+ self.bind_property(
+ 'selection-mode', self._headerbar, 'selection-mode',
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selected-songs-count", self._search_headerbar,
+ "selected-songs-count")
+ self.bind_property(
+ "selection-mode", self._search_headerbar, "selection-mode",
+ GObject.BindingFlags.BIDIRECTIONAL
+ | GObject.BindingFlags.SYNC_CREATE)
+ self.bind_property(
+ "selection-mode", self._player_toolbar, "visible",
+ GObject.BindingFlags.INVERT_BOOLEAN)
+ self.bind_property(
+ "selection-mode", self._selection_toolbar, "visible")
+ self.connect("notify::selection-mode", self._on_selection_mode_changed)
+
+ self.views = [None] * len(View)
+ # Create only the empty view at startup
+ # if no music, switch to empty view and hide stack
+ # if some music is available, populate stack with mainviews,
+ # show stack and set empty_view to empty_search_view
+ self.views[View.EMPTY] = EmptyView()
+ self._stack.connect(
+ "notify::visible-child", self._on_stack_visible_child_changed)
+ self._stack.add_named(self.views[View.EMPTY], "emptyview")
+
+ # Add the 'background' styleclass so it properly hides the
+ # bottom line of the searchbar
+ self._stack.get_style_context().add_class('background')
+
+ self._selection_toolbar.connect(
+ 'add-to-playlist', self._on_add_to_playlist)
+ self._search.connect("notify::state", self._on_search_state_changed)
+
+ self._headerbar.props.state = HeaderBar.State.MAIN
+
+ self._app.props.coremodel.connect(
+ "notify::songs-available", self._on_songs_available)
+
+ self._app.props.coregrilo.connect(
+ "notify::tracker-available", self._on_tracker_available)
+
+ self._startup_timeout_id = GLib.timeout_add(
+ 2000, self._on_songs_available, None, None)
+
+ def _switch_to_empty_view(self):
+ state = self._app.props.coregrilo.props.tracker_available
+ empty_view = self.views[View.EMPTY]
+ empty_view.props.visible = True
+ if state == TrackerState.UNAVAILABLE:
+ empty_view.props.state = EmptyView.State.NO_TRACKER
+ elif state == TrackerState.OUTDATED:
+ empty_view.props.state = EmptyView.State.TRACKER_OUTDATED
+ else:
+ empty_view.props.state = EmptyView.State.EMPTY
+
+ self._headerbar.props.state = HeaderBar.State.EMPTY
+
+ def _on_search_mode_changed(self, search, value):
+ if self._search.props.search_mode_active:
+ self._headerbar_stack.props.visible_child_name = "search"
+ else:
+ self._headerbar_stack.props.visible_child_name = "main"
+
+ def _on_songs_available(self, klass, value):
+ if self._startup_timeout_id > 0:
+ GLib.source_remove(self._startup_timeout_id)
+ self._startup_timeout_id = 0
+
+ if self._app.props.coremodel.props.songs_available:
+ self._switch_to_player_view()
+ else:
+ self._switch_to_empty_view()
+
+ def _on_stack_visible_child_changed(self, klass, value):
+ self.props.active_view = self._stack.props.visible_child
+
+ def _on_tracker_available(self, klass, value):
+ new_state = self._app.props.coregrilo.props.tracker_available
+
+ if new_state != TrackerState.AVAILABLE:
+ self._switch_to_empty_view()
+
+ self._on_songs_available(None, None)
+
+ def _switch_to_player_view(self):
+ self._on_notify_model_id = self._stack.connect(
+ 'notify::visible-child', self._on_notify_mode)
+ self.connect('destroy', self._notify_mode_disconnect)
+
+ # All views are created together, so if the album view is
+ # already initialized, assume the rest are as well.
+ if self.views[View.ALBUM] is not None:
+ return
+
+ ctrl = Gtk.GestureClick().new()
+ # Mouse button 8 is the back button.
+ ctrl.props.button = 8
+ ctrl.connect("pressed", self._on_back_button_pressed)
+ self.add_controller(ctrl)
+
+ self.views[View.EMPTY].props.state = EmptyView.State.SEARCH
+
+ self._headerbar.props.state = HeaderBar.State.MAIN
+ self.views[View.ALBUM] = AlbumsView(self._app)
+ self.views[View.ARTIST] = ArtistsView(self._app)
+ self.views[View.SONG] = SongsView(self._app)
+ self.views[View.PLAYLIST] = PlaylistsView(self._app)
+ self.views[View.SEARCH] = SearchView(self._app)
+
+ # empty view has already been created in self._setup_view starting at
+ # View.ALBUM
+ # empty view state is changed once album view is visible to prevent it
+ # from being displayed during startup
+ for i in self.views[View.ALBUM:]:
+ if i.props.title:
+ stackpage = self._stack.add_titled(
+ i, i.props.name, i.props.title)
+ stackpage.props.icon_name = i.props.icon_name
+ else:
+ self._stack.add_named(i, i.props.name)
+
+ # The "visible-child" notification ensures that the AlbumView
+ # appears as selected by the stack switcher on launch.
+ self._stack.props.visible_child = self.views[View.ALBUM]
+ self._stack.notify("visible-child")
+
+ self.views[View.SEARCH].bind_property(
+ "search-state", self._search, "state",
+ GObject.BindingFlags.SYNC_CREATE)
+ self._search.bind_property(
+ "search-mode-active", self.views[View.SEARCH],
+ "search-mode-active", GObject.BindingFlags.BIDIRECTIONAL)
+ self._search.bind_property(
+ "search-mode-active", self.views[View.ALBUM],
+ "search-mode-active", GObject.BindingFlags.SYNC_CREATE)
+
+ def _select_all(self, action=None, param=None):
+ if not self.props.selection_mode:
+ return
+
+ self.props.active_view.select_all()
+
+ def _deselect_all(self, action=None, param=None):
+ if not self.props.selection_mode:
+ return
+
+ self.props.active_view.deselect_all()
+
+ @GObject.Property(
+ type=HeaderBar, default=None, flags=GObject.ParamFlags.READABLE)
+ def headerbar(self) -> HeaderBar:
+ """Get headerbar instance.
+
+ :returns: The headerbar
+ :rtype: HeaderBar
+ """
+ return self._headerbar
+
+ @Gtk.Template.Callback()
+ def _on_key_press(self, controller, keyval, keycode, state):
+ modifiers = state & Gtk.accelerator_get_default_mod_mask()
+ control_mask = Gdk.ModifierType.CONTROL_MASK
+ shift_mask = Gdk.ModifierType.SHIFT_MASK
+ alt_mask = Gdk.ModifierType.ALT_MASK
+ shift_ctrl_mask = control_mask | shift_mask
+
+ # Ctrl+<KEY>
+ if control_mask == modifiers:
+ if keyval == Gdk.KEY_a:
+ self._select_all()
+ # Open search bar on Ctrl + F
+ if (keyval == Gdk.KEY_f
+ and not self.views[View.PLAYLIST].rename_active
+ and not self.props.selection_mode
+ and self._headerbar.props.state != HeaderBar.State.SEARCH):
+ search_mode = self._search.props.search_mode_active
+ self._search.props.search_mode_active = not search_mode
+ # Play / Pause on Ctrl + SPACE
+ if keyval == Gdk.KEY_space:
+ self._player.play_pause()
+ # Play previous on Ctrl + B
+ if keyval == Gdk.KEY_b:
+ self._player.previous()
+ # Play next on Ctrl + N
+ if keyval == Gdk.KEY_n:
+ self._player.next()
+ # Toggle repeat on Ctrl + R
+ if keyval == Gdk.KEY_r:
+ if self._player.props.repeat_mode == RepeatMode.SONG:
+ self._player.props.repeat_mode = RepeatMode.NONE
+ else:
+ self._player.props.repeat_mode = RepeatMode.SONG
+ # Toggle shuffle on Ctrl + S
+ if keyval == Gdk.KEY_s:
+ if self._player.props.repeat_mode == RepeatMode.SHUFFLE:
+ self._player.props.repeat_mode = RepeatMode.NONE
+ else:
+ self._player.props.repeat_mode = RepeatMode.SHUFFLE
+ # Ctrl+Shift+<KEY>
+ elif modifiers == shift_ctrl_mask:
+ if keyval == Gdk.KEY_A:
+ self._deselect_all()
+ # Alt+<KEY>
+ elif modifiers == alt_mask:
+ # Go back from child view on Alt + Left
+ if keyval == Gdk.KEY_Left:
+ self._switch_back_from_childview()
+ # Headerbar switching
+ if keyval in [Gdk.KEY_1, Gdk.KEY_KP_1]:
+ self._toggle_view(View.ALBUM)
+ if keyval in [Gdk.KEY_2, Gdk.KEY_KP_2]:
+ self._toggle_view(View.ARTIST)
+ if keyval in [Gdk.KEY_3, Gdk.KEY_KP_3]:
+ self._toggle_view(View.SONG)
+ if keyval in [Gdk.KEY_4, Gdk.KEY_KP_4]:
+ self._toggle_view(View.PLAYLIST)
+ # No modifier
+ else:
+ if (keyval == Gdk.KEY_AudioPlay
+ or keyval == Gdk.KEY_AudioPause):
+ self._player.play_pause()
+
+ if keyval == Gdk.KEY_AudioStop:
+ self._player.stop()
+
+ if keyval == Gdk.KEY_AudioPrev:
+ self._player.previous()
+
+ if keyval == Gdk.KEY_AudioNext:
+ self._player.next()
+
+ if (keyval == Gdk.KEY_Delete
+ and self.props.active_view == self.views[View.PLAYLIST]
+ and not self.views[View.PLAYLIST].rename_active):
+ self.activate_action("playlist_delete", None)
+
+ # Close selection mode or search bar after Esc is pressed
+ if keyval == Gdk.KEY_Escape:
+ if self.props.selection_mode:
+ self.props.selection_mode = False
+ elif self._search.props.search_mode_active:
+ self._search.props.search_mode_active = False
+
+ # Open the search bar when typing printable chars.
+ key_unic = Gdk.keyval_to_unicode(keyval)
+ if ((not self._search.props.search_mode_active
+ and not keyval == Gdk.KEY_space)
+ and GLib.unichar_isprint(chr(key_unic))
+ and (modifiers == shift_mask
+ or modifiers == 0)
+ and self.views[View.PLAYLIST] is not None
+ and not self.views[View.PLAYLIST].rename_active
+ and not self.props.selection_mode
+ and self._headerbar.props.state != HeaderBar.State.SEARCH):
+ self._search.props.search_mode_active = True
+
+ def _on_back_button_pressed(self, gesture, n_press, x, y):
+ self._headerbar.emit('back-button-clicked')
+
+ def _notify_mode_disconnect(self, data=None):
+ self._player.stop()
+ self.notifications_popup.terminate_pending()
+ self._stack.disconnect(self._on_notify_model_id)
+
+ def _on_notify_mode(self, stack, param):
+ previous_view = self._current_view
+ self._current_view = self.props.active_view
+
+ # Disable search mode when switching view
+ search_views = [self.views[View.EMPTY], self.views[View.SEARCH]]
+ if (self._current_view in search_views
+ and previous_view not in search_views):
+ self._view_before_search = previous_view
+ elif (self._current_view not in search_views
+ and self._search.props.search_mode_active is True):
+ self._search.props.search_mode_active = False
+
+ # Disable the selection button for the EmptySearch and Playlist
+ # view
+ no_selection_mode = [
+ self.views[View.EMPTY],
+ self.views[View.PLAYLIST]
+ ]
+ allowed = self._current_view not in no_selection_mode
+ self._headerbar.props.selection_mode_allowed = allowed
+ self._search_headerbar.props.selection_mode_allowed = allowed
+
+ def _toggle_view(self, view_enum):
+ # TODO: The SEARCH state actually refers to the child state of
+ # the search mode. This fixes the behaviour as needed, but is
+ # incorrect: searchview currently does not switch states
+ # correctly.
+ if (not self.props.selection_mode
+ and not self._headerbar.props.state == HeaderBar.State.CHILD
+ and not self._headerbar.props.state == HeaderBar.State.SEARCH):
+ self._stack.set_visible_child(self.views[view_enum])
+
+ def _on_search_state_changed(self, klass, param):
+ if (self._search.props.state != Search.State.NONE
+ or not self._view_before_search):
+ return
+
+ # Get back to the view before the search
+ self._stack.props.visible_child = self._view_before_search
+
+ def _switch_back_from_childview(self, klass=None):
+ if self.props.selection_mode:
+ return
+
+ views_with_child = [
+ self.views[View.ALBUM],
+ self.views[View.SEARCH]
+ ]
+ if self._current_view in views_with_child:
+ self._current_view._back_button_clicked(self._current_view)
+
+ def _on_selection_mode_changed(self, widget, data=None):
+ if (not self.props.selection_mode
+ and self._player.state == Playback.STOPPED):
+ self._player_toolbar.props.revealed = False
+
+ def _on_add_to_playlist(self, widget: SelectionToolbar) -> None:
+
+ def on_response(dialog: PlaylistDialog, response_id: int) -> None:
+ if not self._playlist_dialog:
+ return
+
+ if response_id == Gtk.ResponseType.ACCEPT:
+ playlist = self._playlist_dialog.props.selected_playlist
+ playlist.add_songs(selected_songs)
+
+ self.props.selection_mode = False
+ self._playlist_dialog.destroy()
+ self._playlist_dialog = None
+
+ if self.props.active_view == self.views[View.PLAYLIST]:
+ return
+
+ selected_songs = self._coreselection.props.selected_songs
+
+ if len(selected_songs) < 1:
+ return
+
+ self._playlist_dialog = PlaylistDialog(self._app)
+ self._playlist_dialog.props.transient_for = self
+ self._playlist_dialog.connect("response", on_response)
+ self._playlist_dialog.present()
+
+ def set_player_visible(self, visible):
+ """Set PlayWidget action visibility
+
+ :param bool visible: actionbar visibility
+ """
+ self._player_toolbar.props.revealed = visible
+
+ def loading_pulse(self) -> bool:
+ """Pulse the loading progress bar
+
+ :returns: GLib.SOURCE_CONTINUE
+ :rtype: bool
+ """
+ self._loading_progress.pulse()
+
+ return GLib.SOURCE_CONTINUE
+
+ def loading_visible(self, show: bool) -> None:
+ """Sets visibility of the loading progressbar
+
+ :param bool show: Wheter to show the loading bar
+ """
+ self._loading_progress.props.visible = show
diff --git a/gnomemusic/windowplacement.py b/gnomemusic/windowplacement.py
new file mode 100644
index 00000000..ee7889c5
--- /dev/null
+++ b/gnomemusic/windowplacement.py
@@ -0,0 +1,90 @@
+# Copyright 2018 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from __future__ import annotations
+import typing
+
+from gi.repository import GLib, GObject
+
+if typing.TYPE_CHECKING:
+ from gnomemusic.window import Window
+
+
+class WindowPlacement(GObject.GObject):
+ """Main window placement
+
+ Restores and saves the main window placement, success may vary
+ depending on the underlying window manager.
+ """
+
+ __gtype_name__ = 'WindowPlacement'
+
+ def __init__(self, window):
+ """Initialize WindowPlacement
+
+ :param Gtk.Window window: Main window
+ """
+ super().__init__()
+
+ self._window = window
+ application = window.props.application
+ self._settings = application.props.settings
+
+ self._restore_window_state()
+
+ self._window_placement_update_timeout = 0
+ self._window.connect('notify::is-maximized', self._on_maximized)
+ self._window.connect("notify::default-height", self._on_size_change)
+ self._window.connect("notify::default-width", self._on_size_change)
+
+ def _restore_window_state(self):
+ size_setting = self._settings.get_value('window-size')
+ if (len(size_setting) == 2
+ and isinstance(size_setting[0], int)
+ and isinstance(size_setting[1], int)):
+ self._window.set_default_size(size_setting[0], size_setting[1])
+
+ if self._settings.get_value('window-maximized'):
+ self._window.maximize()
+
+ def _on_size_change(
+ self, window: Window, size: GObject.ParamSpecInt) -> None:
+ if self._window_placement_update_timeout == 0:
+ self._window_placement_update_timeout = GLib.timeout_add(
+ 500, self._store_size, window)
+
+ def _store_size(self, window: Window) -> bool:
+ width = window.get_width()
+ height = window.get_height()
+ self._settings.set_value(
+ "window-size", GLib.Variant("ai", [width, height]))
+
+ GLib.source_remove(self._window_placement_update_timeout)
+ self._window_placement_update_timeout = 0
+
+ return False
+
+ def _on_maximized(self, klass, value, data=None):
+ self._settings.set_boolean(
+ 'window-maximized', self._window.is_maximized())
diff --git a/help/C/figures/org.gnome.Music.svg b/help/C/figures/org.gnome.Music.svg
new file mode 100644
index 00000000..2bc77446
--- /dev/null
+++ b/help/C/figures/org.gnome.Music.svg
@@ -0,0 +1,36 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="128" width="128">
+ <defs>
+ <linearGradient gradientTransform="translate(0 -172)" y2="-316.08" x2="600.205" y1="238" x1="116.205" gradientUnits="userSpaceOnUse" id="a">
+ <stop stop-color="#b2d1e9" offset="0"/>
+ <stop stop-color="#c0c6cd" offset=".136"/>
+ <stop stop-color="#d2dee8" offset=".453"/>
+ <stop stop-color="#bfc5ce" offset=".72"/>
+ <stop stop-color="#dbe2e8" offset=".937"/>
+ <stop stop-color="#e4e6e8" offset="1"/>
+ </linearGradient>
+ <linearGradient gradientTransform="translate(0 -172)" y2="-316.08" x2="600.205" y1="238" x1="116.205" gradientUnits="userSpaceOnUse" id="b">
+ <stop stop-color="#b2d1e9" offset="0"/>
+ <stop stop-color="#c0c6cd" offset=".136"/>
+ <stop stop-color="#d2dee8" offset=".453"/>
+ <stop stop-color="#bfc5ce" offset=".72"/>
+ <stop stop-color="#dbe2e8" offset=".937"/>
+ <stop stop-color="#e4e6e8" offset="1"/>
+ </linearGradient>
+ <linearGradient gradientTransform="rotate(90 47.387 40.864) scale(.26563)" y2="91.301" x2="431.139" y1="91.301" x1="99.846" gradientUnits="userSpaceOnUse" id="c">
+ <stop stop-color="#f6d32d" offset="0"/>
+ <stop stop-color="#f9f06b" offset="1"/>
+ </linearGradient>
+ <radialGradient gradientTransform="matrix(.25657 -.06875 .06875 .2566 -10.396 58.824)" r="56" fy="67.198" fx="273.943" cy="67.198" cx="273.943" gradientUnits="userSpaceOnUse" id="d">
+ <stop stop-color="#fff" offset="0"/>
+ <stop stop-color="#c4c5c3" offset="1"/>
+ </radialGradient>
+ </defs>
+ <path fill="url(#a)" d="M20 12h88a8 8 0 018 8v88a8 8 0 01-8 8H20a8 8 0 01-8-8V20a8 8 0 018-8zm0 0"/>
+ <path fill="url(#b)" d="M124 64c0 33.137-26.863 60-60 60S4 97.137 4 64 30.863 4 64 4s60 26.863 60 60zm0 0"/>
+ <path d="M116 64c0 28.719-23.281 52-52 52S12 92.719 12 64c0-28.723 23.281-52.004 52-52.004S116 35.277 116 64zm0 0"/>
+ <path fill="#2a2a3b" d="M112 64c0 26.508-21.492 48-48 48S16 90.508 16 64c0-26.512 21.492-48.004 48-48.004S112 37.488 112 64zm0 0"/>
+ <path fill="url(#c)" d="M64 108c-24.3 0-44-19.7-44-44s19.7-44 44-44 44 19.7 44 44-19.7 44-44 44zm0 0"/>
+ <path d="M84 64c0 11.047-8.953 20-20 20s-20-8.953-20-20 8.953-20.004 20-20.004S84 52.953 84 64zm0 0"/>
+ <path fill="url(#d)" d="M79.453 59.86c2.29 8.535-2.777 17.308-11.312 19.597-8.536 2.285-17.309-2.781-19.594-11.316-2.29-8.536 2.777-17.309 11.312-19.598 8.536-2.285 17.309 2.781 19.594 11.316zm0 0"/>
+ <path d="M24 106c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm84 0c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm0-84c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm-84 0c0 1.125-.895 2.035-2 2.035s-2-.91-2-2.035.895-2.035 2-2.035 2 .91 2 2.035zm0 0"/>
+</svg>
diff --git a/help/C/index.page b/help/C/index.page
new file mode 100644
index 00000000..335d0afc
--- /dev/null
+++ b/help/C/index.page
@@ -0,0 +1,34 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ xmlns:its="http://www.w3.org/2005/11/its"
+ type="guide" id="index">
+
+ <info>
+ <title type="link" role="trail">Music</title>
+ <title type="link">Music</title>
+ <title type="text">Music</title>
+ <revision pkgversion="3.12" date="2014-02-24" status="review"/>
+
+ <credit type="author">
+ <name>Shobha Tyagi</name>
+ <email its:translate="no">tyagishobha@gmail.com</email>
+ <years>2014</years>
+ </credit>
+ <include href="legal.xml" xmlns="http://www.w3.org/2001/XInclude"/>
+ </info>
+
+ <title>
+ <media type="image" width="48px" height="48px" its:translate="no"
+ src="figures/org.gnome.Music.svg" /> Music
+ </title>
+
+ <section id="create" style= "2column">
+ <title>Create playlist</title>
+ </section>
+ <section id="use" style= "2column">
+ <title>Play a song</title>
+ </section>
+ <section id="delete" style= "2column">
+ <title>Remove songs and playlist</title>
+ </section>
+
+</page>
diff --git a/help/C/introduction.page b/help/C/introduction.page
new file mode 100644
index 00000000..b4673950
--- /dev/null
+++ b/help/C/introduction.page
@@ -0,0 +1,26 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ xmlns:its="http://www.w3.org/2005/11/its"
+ type="guide" style="2column task"
+ id="introduction">
+
+ <info>
+ <link type="guide" xref="index" group="#first"/>
+ <revision pkgversion="3.12" date="2014-02-24" status="review"/>
+
+ <credit type="author">
+ <name>Shobha Tyagi</name>
+ <email its:translate="no">tyagishobha@gmail.com</email>
+ <years>2014</years>
+ </credit>
+
+ <include href="legal.xml" xmlns="http://www.w3.org/2001/XInclude"/>
+
+ <desc>A simple and elegant replacement for using <app>Files</app> to show
+ the music directory.</desc>
+ </info>
+
+ <title>Introduction to Music</title>
+ <p>A simple and elegant replacement for using <app>Files</app> to show the
+ music directory.</p>
+
+</page>
diff --git a/help/C/legal.xml b/help/C/legal.xml
new file mode 100644
index 00000000..aa36246c
--- /dev/null
+++ b/help/C/legal.xml
@@ -0,0 +1,8 @@
+<license xmlns="http://projectmallard.org/1.0/"
+ href="http://creativecommons.org/licenses/by-sa/3.0/">
+
+ <p>This work is licensed under a
+ <link href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons
+ Attribution-ShareAlike 3.0 Unported License</link>.</p>
+
+</license>
diff --git a/help/C/play-music.page b/help/C/play-music.page
new file mode 100644
index 00000000..eddfc91e
--- /dev/null
+++ b/help/C/play-music.page
@@ -0,0 +1,40 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ xmlns:its="http://www.w3.org/2005/11/its"
+ type="guide" style="2column task"
+ id="play-music">
+
+ <info>
+ <link type="guide" xref="index#use"/>
+ <revision pkgversion="3.12" date="2014-03-09" status="review"/>
+
+ <credit type="author">
+ <name>Shobha Tyagi</name>
+ <email its:translate="no">tyagishobha@gmail.com</email>
+ <years>2014</years>
+ </credit>
+
+ <include href="legal.xml" xmlns="http://www.w3.org/2001/XInclude"/>
+
+ <desc>Play your favorite songs.</desc>
+
+ </info>
+
+ <title>Play music</title>
+
+ <p>You can play your favorite music by creating a playlist or by simply
+ clicking on the song of your choice from any view.</p>
+
+ <steps>
+ <title>While in <em>Playlists</em>:</title>
+ <item>
+ <p>Select a playlist.</p>
+ </item>
+ <item>
+ <p>Click on the gear button on the right hand side.</p>
+ </item>
+ <item>
+ <p>Click on <gui>Play</gui>.</p>
+ </item>
+ </steps>
+
+</page>
diff --git a/help/C/playlist-create-albums.page b/help/C/playlist-create-albums.page
new file mode 100644
index 00000000..8ba8caf0
--- /dev/null
+++ b/help/C/playlist-create-albums.page
@@ -0,0 +1,81 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ xmlns:its="http://www.w3.org/2005/11/its"
+ type="guide" style="2column task"
+ id="playlist-create-albums">
+
+ <info>
+ <link type="guide" xref="index#create"/>
+ <revision pkgversion="3.12" date="2014-02-22" status="review"/>
+
+ <credit type="author">
+ <name>Shobha Tyagi</name>
+ <email its:translate="no">tyagishobha@gmail.com</email>
+ <years>2014</years>
+ </credit>
+
+ <include href="legal.xml" xmlns="http://www.w3.org/2001/XInclude"/>
+
+ <desc>Add songs to playlists using albums.</desc>
+ </info>
+
+ <title>Create a playlist using albums</title>
+
+ <p>You can view all your albums by clicking on the
+ <gui style="button">Albums</gui> button.</p>
+
+ <steps>
+ <title>To add all the songs in an album:</title>
+ <item>
+ <p>Click on the check button in the top-right of the window.</p>
+ </item>
+ <item>
+ <p>Select albums.</p>
+ </item>
+ <item>
+ <p>Click on the <gui style="button">Add to Playlist</gui> button.</p>
+ </item>
+ <item>
+ <p>Click on <gui>New Playlist</gui> and type a name for your
+ playlist.</p>
+ </item>
+ <item>
+ <p>Click on <gui style="button">Select</gui>.</p>
+ </item>
+ </steps>
+
+ <p>You can also create a playlist from specific songs.</p>
+
+ <steps>
+ <title>To add selected songs from an album:</title>
+ <item>
+ <p>Click on an album.</p>
+ </item>
+ <item>
+ <p>Click on the check button.</p>
+ </item>
+ <item>
+ <p>Select songs.</p>
+ </item>
+ <item>
+ <p>Click on the <gui style="button">Add to Playlist</gui> button.</p>
+ </item>
+ <item>
+ <p>Click on <gui>New Playlist</gui> and type a name for your
+ playlist.</p>
+ </item>
+ <item>
+ <p>Click on <gui style="button">Select</gui>.</p>
+ </item>
+ </steps>
+
+ <note>
+ <p>To select all the songs click
+ <guiseq><gui>Click on items to select them</gui><gui>Select All</gui></guiseq>
+ in the toolbar or press <keyseq><key>Ctrl</key><key>A</key></keyseq>.</p>
+
+ <p>To clear the selection click
+ <guiseq><gui>Click on items to select them</gui><gui>Select None</gui></guiseq>
+ in the toolbar.</p>
+ </note>
+
+</page>
diff --git a/help/C/playlist-create-artists.page b/help/C/playlist-create-artists.page
new file mode 100644
index 00000000..e21bf19e
--- /dev/null
+++ b/help/C/playlist-create-artists.page
@@ -0,0 +1,57 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ xmlns:its="http://www.w3.org/2005/11/its"
+ type="guide" style="2column task"
+ id="playlist-create-artists">
+
+ <info>
+ <link type="guide" xref="index#create"/>
+ <revision pkgversion="3.12" date="2014-03-08" status="review"/>
+
+ <credit type="author">
+ <name>Shobha Tyagi</name>
+ <email its:translate="no">tyagishobha@gmail.com</email>
+ <years>2014</years>
+ </credit>
+
+ <include href="legal.xml" xmlns="http://www.w3.org/2001/XInclude"/>
+
+ <desc>Create playlist by selecting your favorite artists.</desc>
+
+ </info>
+
+ <title>Create playlists using artists</title>
+
+ <p>You can view all the artists and their songs by clicking on the
+ <gui style="button">Artists</gui> button.</p>
+
+ <steps>
+ <title>To create a new playlist while in <em>Artists</em> view:</title>
+ <item>
+ <p>Click on the check button in the top-right of the window.</p>
+ </item>
+ <item>
+ <p>Select all the artists whose songs you want to add to the
+ playlist.</p>
+ </item>
+ <item>
+ <p>Click on the <gui style="button">Add to Playlist</gui> button.</p>
+ </item>
+ <item>
+ <p>Click on <gui>New Playlist</gui> and type a name for your
+ playlist.</p>
+ </item>
+ <item>
+ <p>Click on <gui>Select</gui>.</p>
+ </item>
+ </steps>
+
+ <note>
+ <p>To select all the songs click
+ <guiseq><gui>Click on items to select them</gui><gui>Select All</gui></guiseq>
+ in the toolbar or press <keyseq><key>Ctrl</key><key>A</key></keyseq>.</p>
+
+ <p>To clear the selection click
+ <guiseq><gui>Click on items to select them</gui><gui>Select None</gui></guiseq>
+ in the toolbar.</p>
+ </note>
+</page>
diff --git a/help/C/playlist-create-songs.page b/help/C/playlist-create-songs.page
new file mode 100644
index 00000000..078d2084
--- /dev/null
+++ b/help/C/playlist-create-songs.page
@@ -0,0 +1,55 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ xmlns:its="http://www.w3.org/2005/11/its"
+ type="guide" style="2column task"
+ id="playlist-create-songs">
+
+ <info>
+ <link type="guide" xref="index#create"/>
+ <revision pkgversion="3.12" date="2014-03-03" status="review"/>
+
+ <credit type="author">
+ <name>Shobha Tyagi</name>
+ <email its:translate="no">tyagishobha@gmail.com</email>
+ <years>2014</years>
+ </credit>
+
+ <include href="legal.xml" xmlns="http://www.w3.org/2001/XInclude"/>
+
+ <desc>Create playlist by selecting your favorite songs.</desc>
+ </info>
+
+ <title>Create playlists using songs</title>
+
+ <p>You can view all the songs by clicking on the
+ <gui style="button">Songs</gui> button.</p>
+
+ <steps>
+ <title>To create a new playlist while in <em>Songs</em> view:</title>
+ <item>
+ <p>Click on the check button in the top-right of the window.</p>
+ </item>
+ <item>
+ <p>Select all the songs you want to add to the playlist.</p>
+ </item>
+ <item>
+ <p>Click on the <gui style="button">Add to Playlist</gui> button.</p>
+ </item>
+ <item>
+ <p>Click on <gui style="button">New Playlist</gui> and type a
+ name for your playlist.</p>
+ </item>
+ <item>
+ <p>Click on <gui style="button">Select</gui>.</p>
+ </item>
+ </steps>
+
+ <note>
+ <p>To select all the songs click
+ <guiseq><gui>Click on items to select them</gui><gui>Select All</gui></guiseq>
+ in the toolbar or press <keyseq><key>Ctrl</key><key>A</key></keyseq>.</p>
+
+ <p>To clear the selection click
+ <guiseq><gui>Click on items to select them</gui><gui>Select None</gui></guiseq>
+ in the toolbar.</p>
+ </note>
+</page>
diff --git a/help/C/playlist-delete.page b/help/C/playlist-delete.page
new file mode 100644
index 00000000..d066ba74
--- /dev/null
+++ b/help/C/playlist-delete.page
@@ -0,0 +1,39 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ xmlns:its="http://www.w3.org/2005/11/its"
+ type="guide" style="2column task"
+ id="playlist-delete">
+
+ <info>
+ <link type="guide" xref="index#delete"/>
+ <revision pkgversion="3.12" date="2014-03-08" status="review"/>
+
+ <credit type="author">
+ <name>Shobha Tyagi</name>
+ <email its:translate="no">tyagishobha@gmail.com</email>
+ <years>2014</years>
+ </credit>
+
+ <include href="legal.xml" xmlns="http://www.w3.org/2001/XInclude"/>
+
+ <desc>Remove an unwanted playlist.</desc>
+
+ </info>
+
+ <title>Delete a playlist</title>
+
+ <p>You can remove an old and unwanted playlist.</p>
+
+ <steps>
+ <title>While in <em>Playlists</em>:</title>
+ <item>
+ <p>Select the playlist which you want to delete.</p>
+ </item>
+ <item>
+ <p>Click on the gear button on the right hand side.</p>
+ </item>
+ <item>
+ <p>Click on <gui>Delete</gui>.</p>
+ </item>
+ </steps>
+
+</page>
diff --git a/help/C/playlist-remove-songs.page b/help/C/playlist-remove-songs.page
new file mode 100644
index 00000000..f7f6a760
--- /dev/null
+++ b/help/C/playlist-remove-songs.page
@@ -0,0 +1,42 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ xmlns:its="http://www.w3.org/2005/11/its"
+ type="guide" style="2column task"
+ id="playlist-remove-songs">
+
+ <info>
+ <link type="guide" xref="index#delete"/>
+ <revision pkgversion="3.12" date="2014-03-09" status="review"/>
+
+ <credit type="author">
+ <name>Shobha Tyagi</name>
+ <email its:translate="no">tyagishobha@gmail.com</email>
+ <years>2014</years>
+ </credit>
+
+ <include href="legal.xml" xmlns="http://www.w3.org/2001/XInclude"/>
+
+ <desc>Delete songs from the playlist.</desc>
+
+ </info>
+
+ <title>Remove songs</title>
+
+ <p>You can remove any unwanted songs from a playlist.</p>
+
+ <steps>
+ <title>While in <em>Playlists</em>:</title>
+ <item>
+ <p>Select the playlist from which you want to remove songs.</p>
+ </item>
+ <item>
+ <p>Click on the check button on the toolbar.</p>
+ </item>
+ <item>
+ <p>Select all the songs which you want to remove.</p>
+ </item>
+ <item>
+ <p>Click on <gui style="button">Remove from Playlist</gui>.</p>
+ </item>
+ </steps>
+
+</page>
diff --git a/help/C/playlist-repeat.page b/help/C/playlist-repeat.page
new file mode 100644
index 00000000..3334a33b
--- /dev/null
+++ b/help/C/playlist-repeat.page
@@ -0,0 +1,35 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ xmlns:its="http://www.w3.org/2005/11/its"
+ type="guide" style="2column task"
+ id="playlist-repeat">
+
+ <info>
+ <link type="guide" xref="index#use"/>
+ <revision pkgversion="3.12" date="2014-03-25" status="review"/>
+
+ <credit type="author">
+ <name>Shobha Tyagi</name>
+ <email its:translate="no">tyagishobha@gmail.com</email>
+ <years>2014</years>
+ </credit>
+
+ <include href="legal.xml" xmlns="http://www.w3.org/2001/XInclude"/>
+
+ <desc>Repeat all songs in the playlist or only the current song.</desc>
+
+ </info>
+
+ <title>How do I play songs on repeat?</title>
+
+ <list>
+ <title>In the taskbar, click on the button on the right side:</title>
+ <item>
+ <p>Select <gui>Repeat Song</gui> to repeat a single song.</p>
+ </item>
+ <item>
+ <p>Select <gui>Repeat All</gui> to repeat all the song in the
+ playlist.</p>
+ </item>
+ </list>
+
+</page>
diff --git a/help/C/playlist-shuffle.page b/help/C/playlist-shuffle.page
new file mode 100644
index 00000000..2c1037c3
--- /dev/null
+++ b/help/C/playlist-shuffle.page
@@ -0,0 +1,27 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ xmlns:its="http://www.w3.org/2005/11/its"
+ type="guide" style="2column task"
+ id="playlist-shuffle">
+
+ <info>
+ <link type="guide" xref="index#use"/>
+ <revision pkgversion="3.12" date="2014-03-25" status="review"/>
+
+ <credit type="author">
+ <name>Shobha Tyagi</name>
+ <email its:translate="no">tyagishobha@gmail.com</email>
+ <years>2014</years>
+ </credit>
+
+ <include href="legal.xml" xmlns="http://www.w3.org/2001/XInclude"/>
+
+ <desc>Shuffle songs in the playlist.</desc>
+
+ </info>
+
+ <title>How do I shuffle my songs?</title>
+
+ <p>In the taskbar, click on the button on right hand side and
+ select <gui>Shuffle</gui>.</p>
+
+</page>
diff --git a/help/C/search.page b/help/C/search.page
new file mode 100644
index 00000000..9dae9fff
--- /dev/null
+++ b/help/C/search.page
@@ -0,0 +1,28 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ xmlns:its="http://www.w3.org/2005/11/its"
+ type="guide" style="2column task"
+ id="search">
+
+ <info>
+ <link type="guide" xref="index#create"/>
+ <revision pkgversion="3.12" date="2014-03-09" status="review"/>
+
+ <credit type="author">
+ <name>Shobha Tyagi</name>
+ <email its:translate="no">tyagishobha@gmail.com</email>
+ <years>2014</years>
+ </credit>
+
+ <include href="legal.xml" xmlns="http://www.w3.org/2001/XInclude"/>
+
+ <desc>Search through your music collection.</desc>
+
+ </info>
+
+ <title>Find music</title>
+
+ <p>You can search your albums, artists, songs and playlists. Select what you
+ want to search through then click the <gui>Search</gui> button and start
+ searching.</p>
+
+</page>
diff --git a/help/LINGUAS b/help/LINGUAS
new file mode 100644
index 00000000..1c5acb5a
--- /dev/null
+++ b/help/LINGUAS
@@ -0,0 +1,23 @@
+ca
+cs
+da
+de
+el
+es
+eu
+fr
+gl
+hr
+hu
+id
+it
+ko
+nl
+pl
+pt_BR
+ro
+ru
+sv
+tr
+uk
+zh_CN
diff --git a/help/ca/ca.po b/help/ca/ca.po
new file mode 100644
index 00000000..7ace15e6
--- /dev/null
+++ b/help/ca/ca.po
@@ -0,0 +1,459 @@
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2022-07-25 15:45+0000\n"
+"PO-Revision-Date: 2022-08-09 19:52+0000\n"
+"Last-Translator: Jordi Mas i Herǹandez <jmas@softcatala.org>\n"
+"Language-Team: Catalan (http://www.transifex.com/softcatala/gnome-"
+"documentation-catalan/language/ca/)\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "Jaume Jorba <jaume.jorba@gmail.com>, 2018"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Un senzill i elegant reemplaçament del <app>Fitxers</app> com a eina per "
+"a mostrar el directori de música."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Introducció al Música"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Música"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Música"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Música"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Música"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Crear una llista de reproducció"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Reproduir una cançó"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Suprimir cançons i llista de reproducció"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Reproduir les cançons favorites."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Reproduir música"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Podeu reproduir la vostra música preferida creant una llista de reproducció "
+"o simplement fent clic sobre la cançó escollida des de qualsevol vista."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "Mentre s'estigui a les <em>llistes de reproducció</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Seleccionar una llista de reproducció."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Feu clic al botó de configuració del costat dret."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Feu clic a <gui>Reprodueix</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Afegir cançons a la llista de reproducció utilitzant àlbums."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Crear una llista de reproducció utilitzant àlbums"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Es poden veure tots els àlbums propis fent clic al botó <gui style=\"button"
+"\">Àlbums</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Per a afegir totes les cançons a un àlbum:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Feu clic al botó de selecció a la part superior dreta de la finestra."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Seleccionar àlbums."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Feu clic al botó <gui style=\"button\">Afegeix a la llista de reproducció</"
+"gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Feu clic a <gui>Llista de reproducció nova</gui> i escriviu un nom per a la "
+"llista."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Feu clic a <gui style=\"button\">Selecciona</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr ""
+"Es pot crear una llista de reproducció a partir de cançons específiques."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Per a afegir les cançons seleccionades d'un àlbum:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Feu clic a un àlbum."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Feu clic a la casella de selecció."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Seleccioneu cançons."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Per a seleccionar totes les cançons feu clic a <guiseq><gui>Feu clic als "
+"elements per a seleccionar-los</gui><gui>Selecciona-ho tot</gui></guiseq> a "
+"la barra d'eines o premeu <keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Per a netejar la selecció actual feu clic a <guiseq><gui>Feu clic als "
+"elements per a seleccionar-los</gui><gui>No en seleccionis cap</gui></"
+"guiseq> a la barra d'eines."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Crear una llista de reproducció seleccionant les cançons preferides."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Crear una llista de reproducció utilitzant cançons"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Es poden veure totes les cançons fent clic al botó <gui style=\"button"
+"\">Cançons</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Per a crear una nova llista de reproducció a la vista <em>Cançons</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr ""
+"Seleccioneu totes les cançons que es vulguin afegir a la llista de "
+"reproducció."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Feu clic a <gui style=\"button\">Llista de reproducció nova</gui> i escriure "
+"el nom de la llista."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Crear una llista de reproducció seleccionant els artistes preferits."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Crear una llista de reproducció utilitzant artistes"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Es poden veure tots els artistes i les seves cançons fent clic al botó <gui "
+"style=\"button\">Artistes</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Per a crear una nova llista de reproducció mentre s'està a la vista "
+"<em>Artistes</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Seleccioneu tots els artistes les cançons dels quals vulgueu afegir a la "
+"llista de reproducció."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Feu clic a <gui>Selecciona</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Suprimir una llista de reproducció no desitjada."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Suprimir una llista de reproducció"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Es pot eliminar una llista de reproducció antiga i no desitjada."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Seleccioneu la llista de reproducció que es vulgui esborrar."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Feu clic a <gui>Suprimeix</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Esborrar cançons de la llista de reproducció."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Eliminar cançons"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr ""
+"Es poden eliminar totes les cançons no desitjades d'una llista de "
+"reproducció."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr ""
+"Seleccioneu la llista de reproducció de la qual es volen eliminar cançons."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Feu clic sobre la casella de verificació a la barra d'eines."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Seleccioneu totes les cançons que es vulguin eliminar."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr ""
+"Feu clic a <gui style=\"button\">Suprimeix de la llista de reproducció</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr ""
+"Repetir totes les cançons de la llista de reproducció o només la cançó "
+"actual."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Com es poden reproduir cançons en repetició?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "A la barra de tasques, feu clic al botó del costat dret:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr ""
+"Seleccioneu <gui>Repeteix la cançó</gui> per a repetir una única cançó."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Seleccioneu <gui>Repeteix-ho tot</gui> per a repetir totes les cançons de la "
+"llista de reproducció."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Mesclar les cançons a la llista de reproducció."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Com mesclar les cançons?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"A la barra de tasques, fer clic al botó de la banda dreta i seleccioneu "
+"<gui>Mescla</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Cercar a través de la col·lecció de música."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Trobar música"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Es poden cercar àlbums, artistes, cançons i llistes de reproducció. "
+"Seleccioneu el que voleu cercar i aleshores feu clic al botó <gui>Cerca</"
+"gui> i comenceu la cerca."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Llicència Reconeixement-CompartirIgual 3.0 No adaptada"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Aquesta obra està llicenciada sota una <_:link-1/>."
diff --git a/help/cs/cs.po b/help/cs/cs.po
new file mode 100644
index 00000000..a5a9a7a6
--- /dev/null
+++ b/help/cs/cs.po
@@ -0,0 +1,454 @@
+# Czech translation for gnome-music.
+# Copyright (C) 2014 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# Marek Černocký <marek@manet.cz>, 2014, 2015, 2016, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music\n"
+"POT-Creation-Date: 2021-04-10 19:23+0000\n"
+"PO-Revision-Date: 2021-08-27 00:47+0200\n"
+"Last-Translator: Marek Černocký <marek@manet.cz>\n"
+"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Gtranslator 2.91.6\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "Marek Černocký <marek@manet.cz>"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Jednoduchá a vytříbená náhrada za aplikaci <app>Soubory</app> pro zobrazení "
+"složky s hudbou."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Úvod do aplikace Hudba"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Hudba"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Hudba"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Hudba"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Hudba"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Jak vytvořit seznam k přehrání"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Jak přehrát skladbu"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Jak odstranit skladbu a seznam k přehrání"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Jak přehrát své oblíbené skladby."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Přehrávání hudby"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Svoji oblíbenou hudbu si můžete přehrávat tak, že si vytvoříte seznamy k "
+"přehrání, nebo jednoduše jen kliknete na skladbu v libovolném výpisu."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "Když jste v <em>Seznamech k přehrání</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Vyberte seznam k přehrání."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Klikněte na tlačítko s ozubeným kolem na pravé straně."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Klikněte na <gui>Přehrát</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Jak pomocí alb přidat skladby do seznamů k přehrání."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Vytvoření seznamu k přehrání pomocí alb"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Všechna svá alba si můžete zobrazit kliknutím na tlačítko <gui style=\"button"
+"\">Alba</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Abyste přidali všechny skladby z alba:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Klikněte na tlačítko se zaškrtávátkem v pravé horní části okna."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Vyberte alba."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Klikněte na tlačítko <gui style=\"button\">Přidat do seznamu k přehrání</"
+"gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr "Klikněte na <gui>Nový seznam k přehrání</gui> a napište pro něj název."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Klikněte na <gui style=\"button\">Vybrat</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "Seznam k přehrání můžete vytvořit také jen z konkrétních skladeb."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Pro přidání vybraných skladeb z alba:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Klikněte na album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Klikněte na tlačítko se zaškrtávátkem."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Vyberte skladby."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Abyste vybrali všechny skladby, klikněte na <guiseq><gui>Klikáním vyberte "
+"položky</gui><gui>Vybrat vše</gui></guiseq> na nástrojové liště nebo "
+"zmáčkněte <keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Pro zrušení výběru stačí kliknout na <guiseq><gui>Klikáním vyberte položky</"
+"gui><gui>Zrušit výběr</gui></guiseq> na nástrojové liště."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Jak pomocí výběru svých oblíbených skladeb vytvořit seznam k přehrání."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Vytvoření seznamu k přehrání pomocí skladeb"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Všechny své skladby si můžete zobrazit kliknutím na tlačítko <gui style="
+"\"button\">Skladby</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Když máte zobrazeny <em>Skladby</em>, nový seznam k přehrání vytvoříte "
+"následovně:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Vyberte všechny skladby, které chcete přidat do seznamu k přehrání."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Klikněte na <gui style=\"button\">Nový seznam k přehrání</gui> a napište pro "
+"něj název."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Jak pomocí výběru svých oblíbených umělců vytvořit seznam k přehrání."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Vytvoření seznamu k přehrání pomocí umělců"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Všechny své umělce si můžete zobrazit kliknutím na tlačítko <gui style="
+"\"button\">Umělci</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Když máte zobrazeny <em>Umělce</em>, nový seznam k přehrání vytvoříte "
+"následovně:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Vyberte všechny umělce, jejichž skladby chcete přidat do seznamu k přehrání."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Klikněte na <gui>Vybrat</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Jak odstranit nepotřebný seznam k přehrání."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Mazání seznamů k přehrání"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Staré a nepotřebné seznamy k přehrání můžete odstranit."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Vyberte seznam k přehrání, který chcete smazat."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Klikněte na <gui>Smazat</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Jak smazat skladbu ze seznamu k přehrání."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Odebrání skladby"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "Skladby, které už v seznamu k přehrání nechcete, můžete odebrat."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Vyberte seznam k přehrání, ze kterého chcete skladby odebrat."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Klikněte na tlačítko se zaškrtávátkem na nástrojové liště."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Vyberte skladby, které chcete odebrat."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "Klikněte na <gui style=\"button\">Odebrat ze seznamu k přehrání</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr "Opakování všech nebo jen jedné skladby stále dokola."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Jak mohu přehrávat sklady opakovaně dokola?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Na liště úloh klikněte na tlačítko na pravé straně:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr ""
+"Aby se jedna skladba opakovat stále dokola, vyberte <gui>Opakovat skladbu</"
+"gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Aby se opakovaly dokola všechny skladby v seznam k přehrání, vyberte "
+"<gui>Opakovat vše</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Promíchání skladeb v seznamu k přehrání."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Jak mohu skladby přehrávat v náhodném pořadí?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"Na liště úloh klikněte na tlačítko na pravé straně a vyberte <gui>Náhodně "
+"zamíchat</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Jak vyhledávat ve své sbírce hudby."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Hledání hudby"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Je možné vyhledávat svá alba, umělce, skladby a seznamy k přehrání. Co "
+"chcete hledat zvolte kliknutím na tlačítko <gui>Hledat</gui> a můžete s "
+"hledáním začít."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Tato práce ji licencována pod <_:link-1/>"
+
diff --git a/help/da/da.po b/help/da/da.po
new file mode 100644
index 00000000..250236ed
--- /dev/null
+++ b/help/da/da.po
@@ -0,0 +1,450 @@
+# Danish translation for gnome-music.
+# Copyright (C) 2015 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# scootergrisen, 2015, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2021-04-29 10:20+0000\n"
+"PO-Revision-Date: 2022-01-26 19:41+0100\n"
+"Last-Translator: Alan Mortensen <alanmortensen.am@gmail.com>\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.3\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+"scootergrisen <>, 2015, 2020\n"
+"\n"
+"Dansk-gruppen\n"
+"Websted http://dansk-gruppen.dk\n"
+"E-mail <dansk@dansk-gruppen.dk>"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"En enkel og elegant erstatning for <app>Filer</app> til at vise musikmappen."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Introduktion til Musik"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Musik"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Musik"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Musik"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Musik"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Opret afspilningsliste"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Afspil en sang"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Fjern sange og afspilningsliste"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Afspil dine favoritsange."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Afspil musik"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Du kan afspille din favoritmusik ved at oprette en afspilningsliste eller "
+"blot ved at klikke på en sang efter eget valg i enhver visning."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "I <em>Afspilningslister</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Vælg en afspilningsliste."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Klik på tandhjulsknappen i højre side."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Klik på <gui>Afspil</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Tilføj sange til afspilningslister ved brug af album."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Opret en afspilningsliste ved brug af album"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Du kan vise alle dine album ved at klikke på knappen <gui style=\"button"
+"\">Album</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Sådan tilføjes alle sangene i et album:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Klik på afkrydsningsknappen i øverste højre hjørne af vinduet."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Vælg album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr "Klik på knappen <gui style=\"button\">Føj til afspilningsliste</gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Klik på <gui>Ny afspilningsliste</gui> og skriv et navn til din "
+"afspilningsliste."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Klik på <gui style=\"button\">Vælg</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "Du kan også oprette en afspilningsliste ud fra bestemte sange."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Sådan tilføjes valgte sange fra et album:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Klik på et album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Klik på afkrydsningsknappen."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Vælg sange."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"For at vælge alle sange klikkes <guiseq><gui>Klik på elementerne for at "
+"vælge dem</gui><gui>Vælg alle</gui></guiseq> i værktøjslinjen, eller med "
+"tastaturet <keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"For at rydde valget klikkes på <guiseq><gui>Klik på elementerne for at vælge "
+"dem</gui><gui>Vælg ingen</gui></guiseq> i værktøjslinjen."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Opret afspilningsliste ved at vælge dine favoritsange."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Opret afspilningslister ved brug af sange"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Du kan vise alle dine sange ved at klikke på knappen <gui style=\"button"
+"\">Sange</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Sådan oprettes en ny afspilningsliste mens du er i visningen <em>Sange</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Vælg alle de sange, du vil tilføje til afspilningslisten."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Klik på <gui style=\"button\">Ny afspilningsliste</gui> og skriv et navn til "
+"din afspilningsliste."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Opret afspilningsliste ved at vælge dine favoritkunstnere."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Opret afspilningslister ved brug af kunstnere"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Du kan vise alle dine kunstnere og deres sange, ved at klikke på knappen "
+"<gui style=\"button\">Kunstnere</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Sådan oprettes en ny afspilningsliste mens du er i visningen <em>Kunstnere</"
+"em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Vælg alle de kunstnere, hvis sange du vil tilføje til afspilningslisten."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Klik på <gui>Vælg</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Fjern en uønsket afspilningsliste."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Slet en afspilningsliste"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Du kan fjerne en gammel eller uønsket afspilningsliste."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Vælg den afspilningsliste du vil slette."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Klik på <gui>Slet</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Slet sange fra afspilningslisten."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Fjern sange"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "Du kan fjerne uønskede sange fra en afspilningsliste."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Vælg den afspilningsliste, hvorfra du vil fjerne sange."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Klik på afkrydsningsknappen på værktøjslinjen."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Vælg alle de sange du vil fjerne."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "Klik på <gui style=\"button\">Fjern fra afspilningsliste</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr "Gentag alle sange i afspilningslisten eller kun den aktuelle sang."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Hvordan gentager jeg sange?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Klik på knappen i højre side af opgavelinjen:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Vælg <gui>Gentag sang</gui> for at gentage en enkelt sang."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Vælg <gui>Gentag alle</gui> for at gentage alle sange i afspilningslisten."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Bland sange i afspilningslisten."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Hvordan blander jeg mine sange?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr "Klik på knappen i højre side af opgavelinjen og vælg <gui>Bland</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Søg i din musiksamling."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Find musik"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Du kan søge i dine album, kunstnere, sange og afspilningslister. Vælg hvad "
+"du vil søge i og klik så på knappen <gui>Søg</gui> og start søgningen."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr ""
+"Creative Commons Kreditering-Deling på samme vilkår 3.0 Ikke porteret-licens"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Værket er licenseret under en <_:link-1/>."
diff --git a/help/de/de.po b/help/de/de.po
new file mode 100644
index 00000000..f4229675
--- /dev/null
+++ b/help/de/de.po
@@ -0,0 +1,462 @@
+# German translation for gnome-music.
+# Copyright (C) 2014 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Christian Kirbach <Christian.Kirbach@gmail.com>, 2014-2015.
+# Mario Blättermann <mario.blaettermann@gmail.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music gnome-3-14\n"
+"POT-Creation-Date: 2021-04-10 19:23+0000\n"
+"PO-Revision-Date: 2021-09-14 20:11+0200\n"
+"Last-Translator: Tim Sabsch <tim@sabsch.com>\n"
+"Language-Team: German <gnome-de@gnome.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.0\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+"Christian Kirbach <Christian.Kirbach@gmail.com>, 2014, 2015\n"
+"Mario Blättermann <mario.blaettermann@gmail.com>, 2016"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Eine einfache und elegante Alternative zum Anzeigen des Musikordners mit "
+"<app>Dateien</app>."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Einführung in Musik"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Musik"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Musik"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Musik"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Musik"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Wiedergabeliste anlegen"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Titel wiedergeben"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Titel und Wiedergabeliste entfernen"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Geben Sie Ihre Lieblingsmusik wieder."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Musik abspielen"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Erstellen Sie Wiedergabelisten und geben Sie Ihre Lieblingsmusik wieder, "
+"oder klicken Sie einfach zur Wiedergabe auf einen Musiktitel Ihrer Wahl in "
+"einer beliebigen Ansicht."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "In den <em>Wiedergabelisten</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Wählen Sie eine Wiedergabeliste."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Klicken Sie auf den Knopf mit dem Zahnrad auf der rechten Seite."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Klicken Sie auf <gui>Wiedergabe</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Lieder zu Wiedergabelisten mit Hilfe von Alben hinzufügen."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Eine Wiedergabeliste mit Hilfe von Alben anlegen"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Schauen Sie sich alle Ihre Alben an, indem Sie auf den Knopf <gui style="
+"\"button\">Alben</gui> klicken."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "So fügen Sie alle Titel eines Albums hinzu:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr ""
+"Klicken Sie auf das Ankreuzfeld in der rechten oberen Ecke des Fensters."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Wählen Sie Alben."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Klicken Sie auf <gui style=\"button\">Zur Wiedergabeliste hinzufügen</gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Klicken Sie auf <gui>Neue Wiedergabeliste</gui> und geben Sie einen Namen "
+"für Ihre Wiedergabeliste ein."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Klicken Sie auf <gui style=\"button\">Wählen</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "Sie können auch eine Wiedergabeliste anhand bestimmter Titel anlegen."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "So fügen Sie ausgewählte Titel eines Albums hinzu:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Klicken Sie auf ein Album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Klicken Sie auf den Ankreuzknopf."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Wählen Sie einige Titel."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Klicken Sie auf <guiseq><gui>Objekte per Klick auswählen</gui><gui>Alle "
+"auswählen</gui></guiseq> in der Werkzeugleiste, um alle Titel auszuwählen, "
+"oder drücken Sie <keyseq><key>Strg</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Klicken Sie auf <guiseq><gui>Objekte per Klick auswählen</gui><gui>Keine "
+"auswählen</gui></guiseq> in der Werkzeugleiste, um die Auswahl aufzuheben."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Eine Wiedergabeliste durch Wählen Ihrer Lieblingstitel anlegen."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Wiedergabelisten mit Hilfe von Titeln anlegen"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Schauen Sie sich alle Titel an, indem Sie auf den Knopf <gui style=\"button"
+"\">Titel</gui> klicken."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"So erstellen Sie eine neue Wiedergabeliste in der <em>Titel</em>-Ansicht:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Wählen Sie alle Titel, die Sie zur Wiedergabeliste hinzufügen wollen."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Klicken Sie auf <gui style=\"button\">Neue Wiedergabeliste</gui> und geben "
+"Sie einen Namen für Ihre Wiedergabeliste ein."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Eine Wiedergabeliste durch Wählen Ihrer Lieblingskünstler anlegen."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Wiedergabelisten mit Hilfe von Künstlern anlegen"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Schauen Sie sich alle Künstler und deren Titel an, indem Sie auf den Knopf "
+"<gui style=\"button\">Künstler</gui> klicken."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"So erstellen Sie eine neue Wiedergabeliste in der <em>Künstler</em>-Ansicht:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Wählen Sie alle Künstler, deren Titel Sie zur Wiedergabeliste hinzufügen "
+"möchten."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Klicken Sie auf <gui>Wählen</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Eine unerwünschte Wiedergabeliste entfernen."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Eine Wiedergabeliste löschen"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Sie können eine alte und unerwünschte Wiedergabeliste löschen."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Wählen Sie die Wiedergabeliste aus, die Sie löschen wollen."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Klicken Sie auf <gui>Löschen</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "So löschen Sie Titel aus der Wiedergabeliste."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Titel entfernen"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "Sie können unerwünschte Titel aus einer Wiedergabeliste entfernen."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Wählen Sie die Wiedergabeliste, aus der Sie Titel löschen wollen."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Klicken Sie auf den Ankreuzknopf in der Werkzeugleiste."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Wählen Sie alle Titel, die Sie entfernen wollen."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr ""
+"Klicken Sie auf <gui style=\"button\">Aus der Wiedergabeliste entfernen</"
+"gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr ""
+"Alle Titel der Wiedergabeliste oder nur den aktuellen Titel wiederholen."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Wie werden Titel wiederholt wiedergegeben?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Klicken Sie in der Programmleiste auf den Knopf auf der rechten Seite:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr ""
+"Wählen Sie <gui>Titel wiederholen</gui>, um einen einzelnen Titel zu "
+"wiederholen."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Wählen Sie <gui>Alle wiederholen</gui>, um alle Titel in der Wiedergabeliste "
+"zu wiederholen."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "So mischen Sie die Titel der Wiedergabeliste."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Wie mischt man eigene Titel?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"Klicken Sie in der Programmleiste auf den Knopf auf der rechten Seite und "
+"wählen Sie <gui>Mischen</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Durchsuchen Sie Ihre Musiksammlung."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Musik suchen"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Durchsuchen Sie Ihre Alben, Künstler, Titel und Wiedergabelisten. Wählen "
+"Sie, wo Sie überall suchen möchten und klicken Sie dann auf den Knopf "
+"<gui>Suchen</gui>."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr ""
+"Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 "
+"nicht angepasst"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Dieses Werk ist unter <_:link-1/> lizenziert."
diff --git a/help/el/el.po b/help/el/el.po
new file mode 100644
index 00000000..645ae042
--- /dev/null
+++ b/help/el/el.po
@@ -0,0 +1,466 @@
+# Greek translation for gnome-music.
+# Copyright (C) 2014 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Dimitris Spingos <dmtrs32@gmail.com>, 2014.
+# Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music gnome-3-12\n"
+"POT-Creation-Date: 2015-10-10 07:53+0000\n"
+"PO-Revision-Date: 2015-10-10 18:17+0300\n"
+"Last-Translator: Tom Tryfonidis <tomtryf@gmail.com>\n"
+"Language-Team: www.gnome.gr\n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.5\n"
+"X-Project-Style: gnome\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+"Ελληνική μεταφραστική ομάδα GNOME <team@gnome.gr>, 2014-2015\n"
+"Μαρία Μαυρίδου <mavridou@gmail.com>, 2014\n"
+"Δημήτρης Σπίγγος <dmtrs32@gmail.com>, 2014\n"
+"Θάνος Τρυφωνίδης <tomtryf@gmail.com>, 2015"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:11 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:13 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using files to show the music directory."
+msgstr ""
+"Μια απλή και κομψή αντικατάσταση για χρήση αρχείων που εμφανίζουν τον "
+"κατάλογο μουσικής."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Εισαγωγή στη μουσική"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link"
+msgid "Music"
+msgstr "Μουσική"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "text"
+msgid "Music"
+msgstr "Μουσική"
+
+#. (itstool) path: page/title
+#: C/index.page:18
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Μουσική"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Δημιουργία λίστας αναπαραγωγής"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Αναπαραγωγή τραγουδιού"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Αφαίρεση τραγουδιών και λίστας αναπαραγωγής"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Αναπαράξτε τα αγαπημένα σας τραγούδια."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Αναπαραγωγή μουσικής"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Μπορείτε να παίξετε την αγαπημένη μουσική σας δημιουργώντας μια λίστα "
+"αναπαραγωγής ή πατώντας απλά στο τραγούδι της επιλογής σας από οποιαδήποτε "
+"προβολή."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "Ενώ βρίσκεστε στις <em>Λίστες αναπαραγωγής</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Επιλέξτε μια λίστα αναπαραγωγής."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Κάντε κλικ στο πλήκτρο γραναζιού στα δεξιά."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Κάντε κλικ στην <gui>Αναπαραγωγή</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Προσθέστε τραγούδια στις λίστες αναπαραγωγής χρησιμοποιώντας δίσκους."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Δημιουργήστε μια λίστα αναπαραγωγής χρησιμοποιώντας δίσκους"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Μπορείτε να προβάλετε όλους τους δίσκους σας κάνοντας κλικ στο πλήκτρο <gui "
+"style=\"button\">Δίσκοι</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Για να προσθέσετε όλα τα τραγούδια σε έναν δίσκο:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Κάντε κλικ στο κουμπί ελέγχου στα πάνω δεξιά του παραθύρου."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Επιλέξτε τους δίσκους."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Κάντε κλικ στο κουμπί <gui style=\"button\">Προσθήκη στην λίστα "
+"αναπαραγωγής</gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Κάντε κλικ στο <gui>Νέα λίστα αναπαραγωγής</gui> και πληκτρολογήστε ένα "
+"όνομα για την λίστα αναπαραγωγής."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Κάντε κλικ στο <gui style=\"button\">Επιλογή</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr ""
+"Μπορείτε επίσης να δημιουργήσετε μια λίστα αναπαραγωγής από συγκεκριμένα "
+"τραγούδια."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Για να προσθέσετε επιλεγμένα τραγούδια από έναν δίσκο:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Κάντε κλικ σε έναν δίσκο."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Κάντε κλικ στο πλήκτρο ελέγχου."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Επιλέξτε τα τραγούδια."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Για να επιλέξετε όλα τα τραγούδια κάντε κλικ στο <guiseq><gui>Πατήστε σε "
+"αντικείμενα για να τα επιλέξετε</gui><gui>Επιλογή όλων</gui></guiseq> στην "
+"εργαλειοθήκη ή πατήστε <keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Για να σβήσετε την επιλογή πατήστε <guiseq><gui>Πάτημα στα στοιχεία για να "
+"τα επιλέξετε</gui><gui>Καμία επιλογή</gui></guiseq> στην εργαλειοθήκη."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr ""
+"Δημιουργήστε λίστες αναπαραγωγής επιλέγοντας τα αγαπημένα σας τραγούδια."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Δημιουργία λιστών αναπαραγωγής χρησιμοποιώντας τραγούδια"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Μπορείτε να προβάλετε όλα τα τραγούδια πατώντας το κουμπί <gui style=\"button"
+"\">Τραγούδια</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Για να δημιουργήσετε μια νέα λίστα αναπαραγωγής ενώ είστε στην προβολή "
+"<em>Τραγούδια</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr ""
+"Επιλέξτε όλα τα τραγούδια που θέλετε να προσθέσετε στη λίστα αναπαραγωγής."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Κάντε κλικ στο <gui style=\"button\">Νέα λίστα αναπαραγωγής</gui> και "
+"πληκτρολογήστε ένα όνομα για την λίστα αναπαραγωγής."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr ""
+"Δημιουργήστε λίστες αναπαραγωγής επιλέγοντας τους αγαπημένους σας "
+"καλλιτέχνες."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Δημιουργία λιστών αναπαραγωγής χρησιμοποιώντας καλλιτέχνες"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Μπορείτε να προβάλετε όλους τους καλλιτέχνες και τα τραγούδια τους κάνοντας "
+"κλικ στο κουμπί <gui style=\"button\">Καλλιτέχνες</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Για να δημιουργήσετε μια νέα λίστα αναπαραγωγής ενώ είσαστε στην προβολή "
+"<em>Καλλιτέχνες</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Επιλέξτε όλους τους καλλιτέχνες των οποίων τα τραγούδια θέλετε να προσθέσετε "
+"στη λίστα αναπαραγωγής."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Κάντε κλικ στο <gui>Επιλογή</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Αφαιρέστε μια ανεπιθύμητη λίστα αναπαραγωγής."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Διαγραφή λίστας αναπαραγωγής"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Μπορείτε να αφαιρέσετε μια παλιά και ανεπιθύμητη λίστα αναπαραγωγής."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Επιλέξτε τη λίστα αναπαραγωγής που θέλετε να διαγράψετε."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Κάντε κλικ στο <gui>Διαγραφή</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Διαγράψτε τραγούδια από τη λίστα αναπαραγωγής."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Αφαίρεση τραγουδιών"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr ""
+"Μπορείτε να αφαιρέσετε οποιαδήποτε ανεπιθύμητα τραγούδια από μια λίστα "
+"αναπαραγωγής."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr ""
+"Επιλέξτε μια λίστα αναπαραγωγής από την οποία θέλετε να αφαιρέσετε τραγούδια."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Κάντε κλικ στο κουμπί ελέγχου στην εργαλειοθήκη."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Επιλέξτε όλα τα τραγούδια που θέλετε να αφαιρέσετε."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr ""
+"Πατήστε το <gui style=\"button\">Αφαίρεση από την λίστα αναπαραγωγής</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr ""
+"Αναπαράξτε όλα τα τραγούδια της λίστας αναπαραγωγής ή μόνο του τρέχοντος "
+"τραγουδιού."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Πώς παίζω τραγούδια σε επανάληψη;"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Στην γραμμή εργασιών, κάντε κλικ στο κουμπί στα δεξιά:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr ""
+"Επιλέξτε <gui>Επανάληψη τραγουδιού</gui> για να επαναλάβετε ένα μεμονωμένο "
+"τραγούδι."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Επιλέξτε <gui>Επανάληψη όλων</gui> για να επαναλάβετε όλα τα τραγούδια στην "
+"λίστα αναπαραγωγής."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Παίξτε τυχαία τα τραγούδια σας στην λίστα αναπαραγωγής."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Πώς παίζω τυχαία τα τραγούδια μου;"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"Στην γραμμή εργασιών, κάντε κλικ στο κουμπί στα δεξιά και επιλέξτε "
+"<gui>Τυχαία σειρά</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Αναζήτηση μέσα από τη μουσική συλλογή σας."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Ααναζήτηση μουσικής"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Μπορείτε να αναζητήσετε τους δίσκους σας, τους καλλιτέχνες, τα τραγούδια και "
+"τις λίστες αναπαραγωγής. Επιλέξτε τι θέλετε να αναζητήστε και έπειτα πατήστε "
+"το κουμπί <gui>Αναζήτηση</gui> για να ξεκινήσετε την αναζήτηση."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Άδεια Creative Commons Attribution-ShareAlike 3.0 Unported"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Αυτό το έργο κυκλοφορεί υπό την <_:link-1/>."
diff --git a/help/es/es.po b/help/es/es.po
new file mode 100644
index 00000000..8087893c
--- /dev/null
+++ b/help/es/es.po
@@ -0,0 +1,468 @@
+# Spanish translation for gnome-music.
+# Copyright (C) 2014 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# Daniel Mustieles <daniel.mustieles@gmail.com>, 2014, 2015, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2021-09-10 15:42+0000\n"
+"PO-Revision-Date: 2021-09-10 17:41+0200\n"
+"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
+"Language-Team: es <gnome-es-list@gnome.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.0\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "Daniel Mustieles <daniel.mustieles@gmail.com>, 2014 - 2016"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Un reemplazo sencillo y elegante para usar <app>Archivos</app> para mostrar "
+"la carpeta de música."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Introducción a Música"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Música"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Música"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Música"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Música"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Crear una lista de reproducción"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Reproducir una canción"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Quitar canciones y lista de reproducción"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Reproducir sus canciones favoritas."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Reproducir música"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Puede reproducir su música favorita creando una lista de reproducción o "
+"simplemente pulsando en la canción que quiera desde cualquier vista."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "Estando en <em>Listas de reproducción</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Seleccionar una lista de reproducción."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Pulse en el icono de la rueda dentada en la parte de la derecha."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Pulse en <gui>Reproducir</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Añadir canciones a las listas de reproducción usando álbumes."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Crear una lista de reproducción usando álbumes"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Puede ver todos sus álbumes pulsando el botón <gui style=\"button\">Álbumes</"
+"gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Para añadir todas las canciones de un álbum:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Pulse el botón «Marcar» en la parte superior derecha de la ventana."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Seleccione los álbumes."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Pulse en el botón <gui style=\"button\">Añadir a la lista de reproducción</"
+"gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Pulse en <gui>Nueva lista de reproducción</gui> y escriba el nombre de la "
+"lista."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Pulse en <gui style=\"button\">Seleccionar</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr ""
+"También puede crear una lista de reproducción con canciones específicas."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Para añadir las canciones seleccionadas de un álbum:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Pulse sobre un álbum."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Pulse el botón «Marcar»."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Seleccionar canciones."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Para seleccionar todas las canciones, pulse en <guiseq><gui>Pulse sobre los "
+"elementos para seleccionarlos</gui><gui>Seleccionar todo</gui></guiseq> en "
+"la barra de herramientas o pulse <keyseq><key>Ctrl</key><key>A</key></"
+"keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Para limpiar la selección, pulse en <guiseq><gui>Pulse sobre los elementos "
+"para seleccionarlos</gui><gui>Seleccionar ninguno</gui></guiseq> en la barra "
+"de herramientas."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Crear listas de reproducción seleccionando sus canciones favoritas."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Crear una lista de reproducción usando canciones"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Puede ver todas las canciones pulsando el botón <gui style=\"button"
+"\">Canciones</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Para crear una lista de reproducción nueva estando en la vista de "
+"<em>Canciones</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr ""
+"Seleccione todas las canciones que quiere añadir a la lista de reproducción."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Pulse en <gui style=\"button\">Nueva lista de reproducción</gui> y escriba "
+"un nombre para la lista."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Crear una lista de reproducción seleccionando sus artistas favoritos."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Crear listas de reproducción usando artistas"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Puede ver todos los artistas y sus canciones pulsando el botón <gui syle="
+"\"button\">Artistas</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Para crear una lista de reproducción nueva estando en la vista de "
+"<em>Artistas</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Seleccione todos los artistas cuyas canciones quiere añadir a la lista de "
+"reproducción."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Pulse en <gui>Seleccionar</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Quitar una lista de reproducción."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Eliminar una lista de reproducción"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr ""
+"Puede quitar una canción antigua o una lista de reproducción que no quiera."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Seleccione la lista de reproducción que quiere eliminar."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Pulse en <gui>Eliminar</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Quitar canciones de la lista de reproducción."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Quitar canciones"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr ""
+"Puede quitar cualquier canción que no quiera de una lista de reproducción."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr ""
+"Seleccione la lista de reproducción de la que quiere quitar las canciones."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Pulse el botón «Marcar» en la barra de herramientas."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Seleccione todas las canciones que quiere eliminar."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr ""
+"Pulse en <gui style=\"button\">Quitar de la lista de reproducción</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr ""
+"Repetir todas las canciones de la lista de reproducción o sólo la canción "
+"actual."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "¿Cómo repito canciones?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "En la barra de tareas, pulse el botón en la parte de la derecha:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Seleccione <gui>Repetir canción</gui> para repetir una sola canción."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Seleccione <gui>Repetir todas</gui> para repetir todas las canciones de la "
+"lista de reproducción."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Mezclar canciones en la lista de reproducción."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "¿Cómo mezclo mis canciones?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"En la barra de tareas, pulse el botón en la parte derecha y elija "
+"<gui>Mezclar</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Buscar en su colección de música."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Buscar música"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Buscar en sus álbumes, artistas, canciones y listas de reproducción. "
+"Seleccione lo que quiere buscar y pulse el botón <gui>Buscar</gui> para "
+"empezar a buscar."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons de Atribución-Compartir Igual 3.0 no portada"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Este trabajo está licenciado bajo la <_:link-1/>."
+
+#~| msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+#~ msgid "Click on <gui styl=\"button\">Select</gui>."
+#~ msgstr "Pulse en <gui style=\"button\">Seleccionar</gui>."
diff --git a/help/eu/eu.po b/help/eu/eu.po
new file mode 100644
index 00000000..c13c96ac
--- /dev/null
+++ b/help/eu/eu.po
@@ -0,0 +1,411 @@
+# Basque translation for gnome-music.
+# Copyright (C) 2019 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# Asier Sarasua Garmendia <asier.sarasua@gmail.com>, 2019.
+#
+msgid ""
+msgstr "Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2019-11-27 15:25+0000\n"
+"PO-Revision-Date: 2019-12-10 10:00+0100\n"
+"Last-Translator: Asier Sarasua Garmendia <asier.sarasua@gmail.com>\n"
+"Language-Team: Basque <librezale@librezale.eus>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: eu\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "Asier Sarasua Garmendia <asier.sarasua@gmail.com>"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:11 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:13 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr "<app>Fitxategiak</app> aplikazioaren ordezko sinple eta dotorea musikaren direktorioa erakusteko."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Musika aplikazioaren sarrera"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link"
+msgid "Music"
+msgstr "Musika"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "text"
+msgid "Music"
+msgstr "Musika"
+
+#. (itstool) path: page/title
+#: C/index.page:18
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Musika"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Sortu erreprodukzio-zerrenda"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Erreproduzitu abesti bat"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Kendu abestiak eta erreprodukzio-zerrenda"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Erreproduzitu zure abesti gogokoenak."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Erreproduzitu musika"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr "Zure musikarik gogokoena erreproduzitu dezakezu bai zerrenda bat sortuta bai nahi duzun abestian klik eginda."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "<em>Erreprodukzio-zerrendetan</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Hautatu erreprodukzio-zerrenda bat."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Egin klik eskuinaldeko gurpil-botoian."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Egin klik <gui>Erreproduzitu</gui> aukeran."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Gehitu abestiak erreprodukzio-zerrendei albumak erabilita."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Sortu erreprodukzio-zerrenda bat albumak erabilita"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr "Zure albumak ikus ditzakezu <gui style=\"button\">Albumak</gui> botoian klik eginez."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Abesti guztiak album bati gehitzeko:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Egin klik leihoko goi eskuineko kontrol-botoian."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Hautatu albumak."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr "Egin klik <gui style=\"button\">Gehitu erreprodukzio-zerrendari</gui> botoian."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr "Egin klik <gui>Erreprodukzio-zerrenda berria</gui> aukeran eta idatzi zure zerrendaren izena."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Egin klik <gui style=\"button\">Hautatu</gui> botoian."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "Abesti jakin batzuetarako erreprodukzio-zerrenda bat ere sortu dezakezu."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Album bateko abesti hautatuak gehitzeko:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Egin klik album batean."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Egin klik kontrol-botoian."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Hautatu abestiak."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr "Abesti guztiak hautatzeko, egin klik tresna-barrako <guiseq><gui>Egin klik elementuen gainean hautatzeko</gui><gui>Hautatu dena</gui></guiseq> aukeran, edo sakatu <keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr "Hautapena garbitzeko, egin klik tresna-barrako <guiseq><gui>Egin klik elementuen gainean hautatzeko</gui><gui>Ez hautatu ezer</gui></guiseq>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Sortu erreprodukzio-zerrenda zure abestirik gogokoenak hautatuta."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Sortu erreprodukzio-zerrendak abestiak erabilita"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr "Abesti guztiak bistaratu daitezke <gui style=\"button\">Abestiak</gui> botoia erabilita."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr "Erreprodukzio-zerrenda berria sortzeko <em>Abestiak</em> bistan zauden bitartean:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Hautatu erreprodukzio-zerrendari gehitu nahi dizkiozun abesti guztiak."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr "Egin klik <gui style=\"button\">Erreprodukzio-zerrenda berria</gui> aukeran eta idatzi izen bat zure zerrendarako."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Sortu erreprodukzio-zerrenda zure artistarik gogokoenak hautatuta."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Sortu erreprodukzio-zerrendak artistak erabilita"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr "Artista guztiak eta beren abestiak bistaratu daitezke <gui style=\"button\">Artistak</gui> botoia erabilita."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr "Erreprodukzio-zerrenda berria sortzeko <em>Artistak</em> bistan zauden bitartean:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr "Hautatu erreprodukzio-zerrendari gehitu nahi dizkiozun artista guztiak."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Egin klik <gui>Hautatu</gui> aukeran."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Kendu gehiago nahi ez duzun erreprodukzio-zerrenda bat."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Ezabatu erreprodukzio-zerrenda bat"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Gehiago nahi ez duzun erreprodukzio-zerrenda bat kendu dezakezu."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Hautatu ezabatu nahi duzun erreprodukzio-zerrenda."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Egin klik <gui>Ezabatu</gui> aukeran."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Ezabatu abestiak erreprodukzio-zerrendatik."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Kendu abestiak"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "Gehiago nahi ez dituzun abestiak kendu ditzakezu erreprodukzio-zerrenda batetik."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Hautatu abestiak ezabatu nahi dizkiozun erreprodukzio-zerrenda."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Egin klik tresna-barrako kontrol-botoian."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Hautatu ezabatu nahi dituzun abesti guztiak."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "Egin klik <gui style=\"button\">Kendu erreprodukzio-zerrendatik</gui> aukeran."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr "Errepikatu erreprodukzio-zerrendako abesti guztiak edo uneko abestia soilik."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Nola erreproduzitu ditzaket abestiak modu errepikatuan?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Ataza-barran, egin klik eskuinaldeko botoian:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Hautatu <gui>Errepikatu abestia</gui> abesti bakar bat errepikatzeko."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr "Hautatu <gui>Errepikatu dena</gui> erreprodukzio-zerrendako abesti guztiak errepikatzeko."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Erreproduzitu erreprodukzio-zerrendako abestiak ausaz."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Nola erreproduzitu ditzaket abestiak ausaz?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr "Ataza-barran, egin klik eskuinaldeko botoian eta hautatu <gui>Ausaz</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Egin bilaketak zure musika-bilduman."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Aurkitu musika"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr "Albumetan, artistetan, abestietan eta erreprodukzio-zerrendetan egin ditzakezu bilaketan. Hautatu zer bilatu nahi duzun eta egin klik <gui>Bilatu</gui> botoian bilaketa hasteko."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported lizentzia"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Lan honen lizentzia <_:link-1/> da."
diff --git a/help/fr/fr.po b/help/fr/fr.po
new file mode 100644
index 00000000..cdb39d6f
--- /dev/null
+++ b/help/fr/fr.po
@@ -0,0 +1,470 @@
+# French translation for gnome-music.
+# Copyright (C) 2014 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Alain Lojewski <allomervan@gmail.com>, 2014.
+# Julien Hardelin <jhardlin@orange.fr>, 2014.
+# Charles Monzat <charles.monzat@free.fr>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2021-12-25 18:25+0000\n"
+"PO-Revision-Date: 2022-04-11 22:35+0200\n"
+"Last-Translator: Charles Monzat <charles.monzat@free.fr>\n"
+"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Gtranslator 40.0\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+"Alain Lojewski <allomervan@gmail.com>, 2014\n"
+"Julien Hardelin <jhardlin@orange.fr>, 2014\n"
+"Charles Monzat <charles.monzat@free.fr>, 2017-2022"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Une alternative simple et élégante à <app>Fichiers</app> pour l’affichage du "
+"répertoire de Musique."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Introduction à Musique"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Musique"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Musique"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Musique"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Musique"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Création d’une liste de lecture"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Lecture d’un morceau"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Suppression des morceaux et de la liste de lecture"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Lire vos morceaux préférés."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Lecture d’un morceau"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Pour lire votre musique préférée, créez une liste de lecture ou cliquez "
+"seulement sur le morceau de votre choix depuis n’importe quelle vue."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "Une fois dans <em>Listes de lecture</em> :"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Sélectionnez une liste de lecture."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Cliquez sur le bouton ⚙ situé à droite."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Cliquez sur <gui>Lire</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Ajouter des morceaux aux listes de lecture à partir d’albums."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Création d’une liste de lecture à partir d’un album"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Pour afficher tous vos albums, cliquez sur le bouton <gui style=\"button"
+"\">Albums</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Pour ajouter tous les morceaux d’un album :"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr ""
+"Cliquez sur le bouton de sélection dans le coin supérieur droit de la "
+"fenêtre."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Sélectionnez les albums."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Cliquez sur le bouton <gui style=\"button\">Ajouter à la liste de lecture</"
+"gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr "Cliquez sur <gui>Nouvelle liste de lecture</gui> et donnez-lui un nom."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Cliquez sur <gui style=\"button\">Sélectionner</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr ""
+"Vous pouvez aussi créer une liste de lecture avec des morceaux particuliers."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Pour ajouter des morceaux choisis dans un album :"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Cliquez sur l’album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Cliquez sur le bouton de sélection."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Sélectionnez les morceaux."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Pour sélectionner tous les morceaux, cliquez sur <guiseq><gui>Cliquez sur "
+"les éléments pour les sélectionner</gui><gui>Tout sélectionner</gui></"
+"guiseq> dans la barre d’outils, ou bien appuyez sur <keyseq><key>Ctrl</"
+"key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Pour annuler la sélection, cliquez sur <guiseq><gui>Cliquez sur les éléments "
+"pour les sélectionner</gui><gui>Tout désélectionner</gui></guiseq> dans la "
+"barre d’outils."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Créer une liste de lecture en choisissant vos morceaux préférés."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Création de listes de lecture avec des morceaux"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Pour afficher tous les morceaux, cliquez sur le bouton <gui style=\"button"
+"\">Morceaux</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Pour créer une nouvelle liste de lecture en étant dans la fenêtre "
+"<em>Morceaux</em> :"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr ""
+"Sélectionnez tous les morceaux que vous voulez ajouter à la liste de lecture."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Cliquez sur <gui style=\"button\">Nouvelle liste de lecture</gui> et donnez-"
+"lui un nom."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Créer une liste de lecture en choisissant vos artistes préférés."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Création de listes de lecture par artiste"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Pour afficher tous les artistes et leurs morceaux, cliquez sur le bouton "
+"<gui style=\"button\">Artistes</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Pour créer une nouvelle liste de lecture en étant dans la fenêtre "
+"<em>Artistes</em> :"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Sélectionnez tous les artistes dont vous voulez regrouper les morceaux dans "
+"la liste de lecture."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Cliquez sur <gui>Sélectionner</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Supprimer une liste de lecture superflue."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Suppression d’une liste de lecture"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Pour supprimer une ancienne liste de lecture :"
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Sélectionnez la liste de lecture à supprimer."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Cliquez sur <gui>Supprimer</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Supprimer des titres de la liste de lecture."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Suppression de morceaux"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "Pour supprimer des morceaux obsolètes d’une liste de lecture :"
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Sélectionnez la liste de lecture à nettoyer."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Cliquez sur le bouton de sélection dans la barre d’outils."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Sélectionnez tous les morceaux à supprimer."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr ""
+"Cliquez sur <gui style=\"button\">Supprimer de la liste de lecture</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr ""
+"Répéter tous les titres d’une liste de lecture ou seulement la chanson en "
+"cours de lecture."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Répétition de pistes"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Dans la barre des tâches, cliquez sur le bouton situé à droite, puis :"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Sélectionnez <gui>Répéter le morceau</gui> pour répéter un seul titre."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Sélectionnez <gui>Tout répéter</gui> pour répéter tous les morceaux de la "
+"liste de lecture."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Mélanger des titres de la liste de lecture."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Lecture aléatoire de titres"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"Dans la barre des tâches, cliquez sur le bouton situé à droite et "
+"sélectionnez <gui>Mélanger</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Effectuer une recherche dans votre discothèque."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Recherche de musique"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Vous pouvez faire une recherche sur un artiste, sur un morceau ou sur une "
+"liste de lecture. Sélectionnez votre choix et appuyez sur <gui>Rechercher</"
+"gui> pour lancer l’opération."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr ""
+"Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 3.0 "
+"non transposé"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Cette œuvre est distribuée sous <_:link-1/>."
+
+#~ msgid "Click on <gui styl=\"button\">Select</gui>."
+#~ msgstr "Cliquez sur <gui styl=\"button\">Sélectionner</gui>."
diff --git a/help/gl/gl.po b/help/gl/gl.po
new file mode 100644
index 00000000..740a1ff7
--- /dev/null
+++ b/help/gl/gl.po
@@ -0,0 +1,464 @@
+# Galician translation for gnome-music.
+# Copyright (C) 2014 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Fran Dieguez <frandieguez@gnome.org>, 2014-2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2021-04-10 19:23+0000\n"
+"PO-Revision-Date: 2021-08-30 11:06+0200\n"
+"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
+"Language-Team: Galician <Proxecto Trasno <proxecto@trasno.gal>>\n"
+"Language: gl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"X-Generator: Gtranslator 40.0\n"
+"X-Project-Style: gnome\n"
+"X-DL-Team: gl\n"
+"X-DL-Module: gnome-music\n"
+"X-DL-Branch: master\n"
+"X-DL-Domain: help\n"
+"X-DL-State: Translating\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "Fran Diéguez <frandieguez@gnome.org>, 2014-2021."
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Un substituto simple e elegante para usar <app>Ficheiros</app> para mostrar "
+"o cartafol de música."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Introdución a Música"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+#| msgctxt "link"
+#| msgid "Music"
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Música"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Música"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Música"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Música"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Crear lista de reprodución"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Reproducir unha canción"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Quitar cancións da lista de reprodución"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Reproducir as súas cancións favoritas."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Reproducir música"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Vostede pode reproducir a súa música favorita creando unha lista de "
+"reprodución ou simplemente premendo na canción que desexe desde calquera "
+"vista."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "Mentres nas <em>Listas de reproducións</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Seleccione unha lista de reprodución."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Prema no botón do engranaxe na parte dereita."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Prema en <gui>Reproducir</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Engadir cancións ás listas de reprodución usando álbums."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Crear unha lista de reprodución usando álbums"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Pode ver todo os álbums premendo sobre o botón <gui style=\"button\">Álbums</"
+"gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Para engadir todas as cancións nun álbum:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Prema no botón de comprobación na parte superior dereita da xanela."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Seleccione os álbums."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Prema no botón <gui style=\"button\">Engadir á lista de reprodución</gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Prema en <gui>Nova lista de reprodución</gui> e escriba un nome para a súa "
+"lista de reprodución."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Prema en <gui style=\"button\">Seleccionar</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "Amén pode crear unha lista de reprodución desde cancións específicas."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Para engadir as cancións seleccionadas desde un álbum:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Prema no álbum."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Prema no botón de comprobación."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Seleccione as cancións."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Para seleccionar todas as cancións prema <guiseq><gui>Prema nos elementos "
+"para seleccionalos</gui><gui>Seleccionar todos</gui></guiseq> desde a barra "
+"de ferramentas ou prema <keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Para limpar a selección prema <guiseq><gui>Prema nos elementos para "
+"seleccionalos</gui><gui>Deseleccionar todos</gui></guiseq> na barra de "
+"ferramentas."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr ""
+"Crear unha lista de reprodución seleccionando as súas cancións favoritas."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Crear listas de reproducións usando cancións"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Pode ver todas as canciónsemendo sobre o botón <gui style=\"button"
+"\">Cancións</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Para crear unha nova lista de reprodución mentres están a vista "
+"<em>Cancións</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Seleccione todas as cancións que quere engadir á lista de reprodución."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Prema en <gui style=\"button\">Nova lista de reprodución</gui> e escriba un "
+"nome da súa lista de reprodución."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Crear unha lista de reprodución seleccionando os seus artistas."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Crear listas de reproducións usando artistas"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Pode ver todos os artistas e as súas cancións premendo sobre o botón <gui "
+"style=\"button\">Artistas</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Para crear unha nova lista de reprodución mentres están a vista "
+"<em>Artistas</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Seleccione todos os artistas cuxas cancións quere engadir á lista de "
+"reprodución."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Prema en <gui>Seleccionar</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Quitar unha lista de reprodución non desexada."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Eliminar unha lista de reprodución"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Pode eliminar unha lista de reprodución antiga ou non desexada."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Seleccione a lista que quere eliminar."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Prema en <gui>Eliminar</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Eliminar cancións dunha lista de reprodución."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Eliminar cancións"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "Pode quitar cancións que non desexe dunha lista de reprodución."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Seleccione a lista de reprodución da que quere quitar cancións."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Prema no botón de marcar na barra de ferramentas."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Seleccione todas as cancións que quere eliminar."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "Prema en <gui style=\"button\">Quitar da lista de reprodución</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr ""
+"Repetir todas as cancións nunha lista de reprodución ou só a canción actual."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Como reproduzo cancións en bucle?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Na barra de tarefas, prema no botón da parte dereita:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Seleccione <gui>Repetir canción</gui> para repetir unha soa canción."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Seleccione <gui>Repetir todas</gui> para repetir todas as cancións na lista "
+"de reprodución."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Desordenar cancións na lista de reprodución."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Como desordenar as miñas cancións?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"Na barra de tarefas, prema no botón da parte dereita e seleccione "
+"<gui>Desordenar</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Buscar na súa colección de música."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Buscar música"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Pode buscar nos seus álbums, artistas, cancións ou listas de reprodución. "
+"Seleccione que quere buscar logo prema no botón <gui>Buscar</gui> e iniciar "
+"a busca."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons Atribución-CompartirIgual 3.0 Licenza non portada"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Este traballa ten a licenza <_:link-1/>."
diff --git a/help/hr/hr.po b/help/hr/hr.po
new file mode 100644
index 00000000..4f8f7204
--- /dev/null
+++ b/help/hr/hr.po
@@ -0,0 +1,449 @@
+# Croatian translation for gnome-music.
+# Copyright (C) 2017 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2022-07-25 15:45+0000\n"
+"PO-Revision-Date: 2022-08-17 23:18+0200\n"
+"Last-Translator: gogo <trebelnik2@gmail.com>\n"
+"Language-Team: Croatian <hr@li.org>\n"
+"Language: hr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\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"
+"X-Generator: Poedit 3.1.1\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+"Launchpad Contributions:\n"
+" gogo https://launchpad.net/~trebelnik-stefina"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Jednostavna i elegantna zamjena za korištenje <app>Datoteka</app> za prikaz "
+"glazbene mape."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Uvod u Glazbu"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Glazba"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Glazba"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Glazba"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Glazba"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Stvaranje popisa izvođenja"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Reprodukcija pjesme"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Uklanjanje pjesma i popisa izvođenja"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Slušajte svoje omiljene pjesme."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Reprodukcija glazbe"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Možete slušati svoju omiljenu glazbu stvaranjem popisa izvođenja ili "
+"jednostavno klikom na vašu odabranu pjesmu u bilo kojem prikazu."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "U <em>Popisu izvođenja</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Odaberite popis izvođenja."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Kliknite na tipku zupčanika s lijeve strane."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Kliknite na <gui>Sviraj</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Dodajte pjesme na popis izvođenja koristeći albume."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Stvaranje popisa izvođenja pomoću albuma"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui "
+"style=\"button\">Albums</gui> button."
+msgstr ""
+"Možete vidjeti sve svoje albume klikom na <gui style=\"button\">Albumi</gui> "
+"tipku."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Kako bi dodali sve pjesme u albumu:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Kliknite na tipku odabira gore desno u prozoru."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Odaberite albume."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr "Kliknite na <gui style=\"button\">Dodaj u popis izvođenja</gui> tipku."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Kliknite na <gui>Novi popis izvođenja</gui> i upišite naziv vašeg popisa "
+"izvođenja."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Kliknite na <gui style=\"button\">Odaberi</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "Isto tako možete stvoriti popis izvođenja od određenih pjesama."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Kako bi dodali određene pjesme iz albuma:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Kliknite na album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Kliknite na tipku odabira."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Odaberite pjesme."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Kako bi odabrali sve pjesme kliknite na <guiseq><gui>Klikni na stavku za "
+"odabir</gui><gui>Odaberi sve</gui></guiseq> u alatnoj traci ili pritisnite "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Kako bi uklonili odabir kliknite na <guiseq><gui>Klikni na stavku za odabir</"
+"gui><gui>Ukloni odabir</gui></guiseq> u alatnoj traci."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Stvorite popis izvođenja odabirom svojih omiljenih pjesama."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Stvaranje popisa izvođenja pomoću pjesama"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Možete vidjeti sve pjesme klikom na <gui style=\"button\">Pjesme</gui> tipku."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Kako bi stvorili novi popis izvođenja dok ste u <em>Pjesme</em> prikazu:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Odaberite sve pjesme koje želite dodati na popis izvođenja."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Kliknite na <gui style=\"button\">Novi popis izvođenja</gui> i upišite naziv "
+"vašeg popisa izvođenja."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Stvorite popis izvođenja odabirom vašeg omiljenog izvođača."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Stvaranje popisa izvođenja pomoću izvođača"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui "
+"style=\"button\">Artists</gui> button."
+msgstr ""
+"Možete vidjeti sve izvođače i njihove pjesme klikom na <gui "
+"style=\"button\">Izvođači</gui> tipku."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Kako bi stvorili novi popis izvođenja dok ste u <em>Izvođači</em> prikazu:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr "Odaberite sve izvođače čije pjesme želite dodati na popis izvođenja."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Kliknite na <gui>Odaberi</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Uklonite neželjeni popisa izvođenja."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Brisanje popisa izvođenja"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Možete ukloniti stari ili neželjeni popis izvođenja."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Odaberite popis izvođenja koji želite obrisati."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Kliknite na <gui>Obriši</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Obrišite pjesme iz popisa izvođenja."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Uklanjanje pjesama"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "Možete ukloniti sve neželjene pjesme iz popisa izvođenja."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Odaberite popis izvođenja iz kojeg želite ukloniti pjesme."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Kliknite na tipku odabira u alatnoj traci."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Odaberite sve pjesme koje želite ukloniti."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "Kliknite na <gui style=\"button\">Ukloni s popisa izvođenja</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr "Ponovite sve pjesme u popisu izvođenja ili samo trenutnu pjesmu."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Kako reproducirati ili ponoviti pjesmu?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "U alatnoj traci, kliknite tipku na desnoj strani:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Odaberite <gui>Ponovi pjesmu</gui> za ponavljanje jedne pjesme."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Odaberite <gui>Ponovni sve</gui> za ponavljanje svih pjesama na popisu "
+"izvođenja."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Pokrenite naizmjeničnu reprodukciju pjesama na popisu izvođenja."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Kako pokrenuti naizmjeničnu reprodukciju pjesama?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"U alatnoj traci, kliknite tipku na desnoj strani i odaberite "
+"<gui>Naizmjenično</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Pretražujte svoju glazbenu kolekciju."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Pretraga glazbe"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Možete pretraživati svoje albume, izvođače, pjesme i popise izvođenja. "
+"Odaberite što želite pretraživati zatim kliknite na <gui>Pretraži</gui> "
+"tipku za pokretanje pretraživanja."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons Imenovanje-Dijeli pod istim uvjetima 3.0 Hrvatska"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Ovaj rad je licenciran pod <_:link-1/>."
diff --git a/help/hu/hu.po b/help/hu/hu.po
new file mode 100644
index 00000000..5898ceac
--- /dev/null
+++ b/help/hu/hu.po
@@ -0,0 +1,460 @@
+# Hungarian translation for gnome-music.
+# Copyright (C) 2014, 2015, 2017, 2019, 2021 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnome-music package.
+#
+# Balázs Úr <ur.balazs at fsf dot hu>, 2014, 2019, 2021.
+# Gabor Kelemen <kelemeng at gnome dot hu>, 2014, 2015, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2021-04-10 19:23+0000\n"
+"PO-Revision-Date: 2021-09-12 08:48+0200\n"
+"Last-Translator: Balázs Úr <ur.balazs at fsf dot hu>\n"
+"Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 19.12.3\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+"Kelemen Gábor <kelemeng at gnome dot hu>, 2014.\n"
+"Úr Balázs <ur.balazs at fsf dot hu>, 2014.\n"
+"Hammer Attila <hammera at pickup dot hu>, 2014."
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Egyszerű és elegáns eszköz a zenegyűjtemény megjelenítésére a <app>Fájlok</"
+"app> alkalmazással."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "A Zene bemutatása"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+#| msgctxt "link"
+#| msgid "Music"
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Zene"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Zene"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Zene"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Zene"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Lejátszólista létrehozása"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Szám lejátszása"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Számok és lejátszólista eltávolítása"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Kedvenc számainak lejátszása."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Zenék lejátszása"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Kedvenc zenéit lejátszhatja lejátszólista létrehozásával, vagy egyszerűen "
+"csak rákattintva a számra bármely nézetben."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "A <em>Lejátszólistákban</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Válasszon egy lejátszólistát"
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Kattintson a fogaskerék gombra a jobb oldalon."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Kattintson a <gui>Lejátszás</gui> menüpontra."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Számok lejátszólistához adása albumokkal."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Lejátszólista létrehozása albumok használatával"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Összes albumát megjelenítheti az <gui style=\"button\">Albumok</gui> gombra "
+"kattintással."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Egy album összes számának hozzáadásához:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Kattintson az ablak jobb felső sarkában lévő pipa gombra."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Válasszon ki albumokat."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Nyomja meg a <gui style=\"button\">Hozzáadás a lejátszólistához</gui> gombot."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Kattintson az <gui>Új lejátszólista</gui> gombra, és írja be a lejátszólista "
+"nevét."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Kattintson a <gui style=\"button\">Kijelölés</gui> gombra."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "Létrehozhat lejátszólistát adott számokból is."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Kijelölt számok hozzáadásához egy albumról:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Kattintson egy albumra."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Kattintson a pipa gombra."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Válasszon ki számokat."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Az összes szám kiválasztásához kattintson az eszköztáron a "
+"<guiseq><gui>Kattintson az elemekre a kiválasztásukhoz</gui><gui>Összes "
+"kijelölése</gui></guiseq> lehetőségre, vagy nyomja meg a <keyseq><key>Ctrl</"
+"key><key>A</key></keyseq> billentyűkombinációt."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"A kijelölés törléséhez kattintson az eszköztáron a <guiseq><gui>Kattintson "
+"az elemekre a kiválasztásukhoz</gui><gui>Kijelölés törlése</gui></guiseq> "
+"lehetőségre."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Lejátszólista létrehozása kedvenc számai kiválasztásával."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Lejátszólista létrehozása számok használatával"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Az összes számot megjelenítheti a <gui style=\"button\">Számok</gui> gomb "
+"megnyomásával."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr "Új lejátszólista létrehozása a <em>Számok</em> nézetben:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Jelölje ki a lejátszólistához adandó összes számot."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Kattintson az <gui style=\"button\">Új lejátszólista</gui> gombra, és írja "
+"be a lejátszólista nevét."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Lejátszólista létrehozása kedvenc előadói kiválasztásával."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Lejátszólista létrehozása előadók használatával"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Az összes előadót és számaikat megjelenítheti az <gui style=\"button"
+"\">Előadók</gui> gomb megnyomásával."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr "Új lejátszólista létrehozása az <em>Előadók</em> nézetben:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Jelölje ki az összes előadót, akiknek számait a lejátszólistához szeretné "
+"adni."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Kattintson a <gui>Kijelölés</gui> gombra."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Fölösleges lejátszólista eltávolítása."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Lejátszólista törlése"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "A régi és már nem szükséges lejátszólistákat eltávolíthatja."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Válassza ki a törölni kívánt lejátszólistát."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Kattintson a <gui>Törlés</gui> gombra."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Számok törlése a lejátszólistáról."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Számok eltávolítása"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "A már nem kívánt számokat eltávolíthatja a lejátszólistáról."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Válassza ki a lejátszólistát, amelyről számokat szeretne eltávolítani."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Kattintson a pipa gombra az eszköztáron."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Jelölje ki az összes eltávolítani kívánt számot."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr ""
+"Kattintson az <gui style=\"button\">Eltávolítás a lejátszólistáról</gui> "
+"gombra."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr ""
+"Az összes szám, vagy egyetlen szám ismétlődő lejátszása a lejátszólistából."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Hogyan lehet a számok lejátszását ismételtetni?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "A tálca jobb oldalán kattintson a gombra:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr ""
+"Egyetlen szám ismétléséhez válassza a <gui>Szám ismétlése</gui> lehetőséget."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"A lejátszólistában levő összes szám ismétléséhez válassza az <gui>Összes "
+"ismétlése</gui> lehetőséget."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Számok véletlenszerű lejátszása a lejátszólistából."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Hogyan játszhatom le véletlenszerűen a számaimat?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"A tálca jobb oldalán kattintson a gombra, majd válassza a "
+"<gui>Véletlenszerű</gui> lehetőséget."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Keressen zenegyűjteményében."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Zene keresése"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Kereshet albumok, előadók, számok és lejátszólisták alapján. Válassza ki, "
+"hogy miben szeretne keresni, majd kattintson a <gui>Keresés</gui> gombra a "
+"keresés megkezdéséhez."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons Nevezd meg!-Így add tovább! 3.0 átíratlan licenc"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Ez a mű a <_:link-1/> feltételei szerint terjeszthető."
diff --git a/help/id/id.po b/help/id/id.po
new file mode 100644
index 00000000..aedbbd0a
--- /dev/null
+++ b/help/id/id.po
@@ -0,0 +1,446 @@
+# Indonesian translation for gnome-music.
+# Copyright (C) 2019 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Andika Triwidada <atriwidada@gnome.org>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2021-04-10 19:23+0000\n"
+"PO-Revision-Date: 2021-08-26 07:32+0700\n"
+"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
+"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.2\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "Andika Triwidada <andika@gmail.com>, 2019, 2021."
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Pengganti memakai <app>Files</app> yang sederhana dan elegan untuk "
+"menampilkan direktori musik."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Perkenalan ke Musik"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Musik"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Musik"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Musik"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Musik"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Buat daftar putar"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Mainkan sebuah lagu"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Hapus lagu dan daftar putar"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Mainkan lagu-lagu favorit Anda."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Putar musik"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Anda dapat memutar musik favorit Anda dengan membuat sebuah daftar putar "
+"atau sekadar dengan mengklik lagu pilihan Anda dari sebarang tilikan."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "Saat di dalam <em>Daftar Putar</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Pilih sebuah daftar putar."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Klik pada tombol gerigi di sisi kanan."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Klik pada <gui>Putar</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Menambahkan lagu ke daftar putar memakai album."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Membuat sebuah dafta putar memakai album"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Anda juga dapat melihat semua album Anda dengan mengklik tombol <gui style="
+"\"button\">Album</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Untuk menambahkan semua lagu dalam suatu album:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Klik pada tombol centang di kanan atas jendela."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Pilih album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr "Klik pada tombol <gui style=\"button\">Tambah ke Daftar Putar</gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Klik pada <gui>Daftar Putar Baru</gui> dan ketikkan sebuah nama untuk daftar "
+"putar Anda."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Klik pada <gui style=\"button\">Pilih</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "Anda juga dapat membuat suatu daftar putar dari lagu-lagu tertentu."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Untuk menambahkan lagu-lagu yang dipilih dari sebuah album:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Klik pada suatu album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Klik pada tombol centang."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Pilih lagu."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Untuk memilih semua lagu klik <guiseq><gui>Klik pada butir untuk memilih "
+"mereka</gui><gui>Pilih Semua</gui></guiseq> pada bilah alat atau tekan "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Untuk membersihkan pilihan klik <guiseq><gui>Klik pada butir untuk memilih "
+"mereka</gui><gui>Pilih Tak Satupun</gui></guiseq> pada bilah alat."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Membuat daftar putar dengan memilih lagu-lagu favorit Anda."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Membuat daftar putar memakai lagu-lagu"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Anda dapat melihat semua lagi dengan mengklik tombol <gui style=\"button"
+"\">Lagu</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Untuk membuat sebuah daftar putar baru ketika dalam tilikan <em>Lagu</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Pilih semua lagu yang ingin Anda tambahkan ke daftar putar."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Klik pada <gui style=\"button\">Daftar Putar Baru</gui> dan ketikkan sebuah "
+"nama untuk daftar putar Anda."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Membuat daftar putar dengan memilih artis-artis favorit Anda."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Membuat daftar putar memakai artis-artis"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Anda dapat melihat semua artis dan lagu-lagu mereka dengan mengklik pada "
+"tombol <gui style=\"button\">Artis</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Untuk membuat sebuah daftar putar baru ketika dalam tilikan <em>Artis</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Pilih semua artis yang lagu-lagunya ingin Anda tambahkan ke daftar putar."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Klik pada <gui>Pilih</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Menghapus sebuah daftar putar yang tidak diinginkan."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Menghapus sebuah daftar putar"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Anda dapat menghapus sebuah daftar putar tua yang tidak diinginkan."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Pilih daftar putar yang ingin Anda hapus."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Klik pada <gui>Hapus</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Menghapus lagu dari daftar putar."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Menghapus lagu"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr ""
+"Anda dapat menghapus sebarang lagu yang tidak diinginkan dari suatu daftar "
+"putar."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Pilih daftar putar yang lagunya ingin Anda hapus."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Klik pada tombol centang di bilah alat."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Pilih semua lagu yang ingin Anda hapus."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "Klik pada <gui style=\"button\">Hapus dari Daftar Putar</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr "Ulang semua lagu dalam daftar putar atau hanya lagu saat ini."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Bagaimana saya memutar lagu berulang?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Dalam bilah tugas, klik pada tombol di sisi kanan:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Pilih <gui>Ulangi Lagu</gui> untuk mengulangi sebuah lagu."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Pilih <gui>Ulang Semua</gui> untuk mengulang semua lagu dalam daftar putar."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Acak lagu dalam daftar putar."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Bagaimana saya mengacak lagu-lagu saya?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"Dalam bilah tugas, klik pada tombol di sisi kanan dan pilih <gui>Acak</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Mencari dalam koleksi musik Anda."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Cari musik"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Anda dapat mencari album, artis, lagu, dan daftar putar Anda. Pilih apa yang "
+"ingin Anda cari lalu klik tombol <gui>Cari</gui> dan memulai pencarian."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Karya ini dilisensikan di bawah <_:link-1/>."
diff --git a/help/it/it.po b/help/it/it.po
new file mode 100644
index 00000000..ac2cf13e
--- /dev/null
+++ b/help/it/it.po
@@ -0,0 +1,448 @@
+# Italian translation for gnome-music.
+# Copyright (C) 2019 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Milo Casagrande <milo@milo.name>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2019-01-28 23:03+0000\n"
+"PO-Revision-Date: 2019-01-31 14:34+0100\n"
+"Language-Team: Italian <tp@lists.linux.it>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Last-Translator: Milo Casagrande <milo@milo.name>\n"
+"X-Generator: Poedit 2.2.1\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "Milo Casagrande <milo@milo.name>, 2019"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:11 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:13 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Un'alternativa semplice ed elegante all'utilizzo di <app>File</app> per "
+"consultare la propria musica."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Introduzione a Musica"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link"
+msgid "Music"
+msgstr "Musica"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "text"
+msgid "Music"
+msgstr "Musica"
+
+#. (itstool) path: page/title
+#: C/index.page:18
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Musica"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Creare playlist"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Riprodurre un brano"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Rimuovere brani e playlist"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Riprodurre i brani preferiti."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Riprodurre musica"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"È possibile riprodurre i propri brani preferiti creando una playlist o "
+"semplicemente selezionando il brano desiderato dalla finestra."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "In modalità <em>Playlist</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Selezionare una playlist."
+
+# (ndt) o pulsante con l'ingranaggio?
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Fare clic sul pulsante delle azioni sul lato destro."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Fare clic su <gui>Riproduci</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Aggiungere brani alle playlist utilizzando gli album."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Creare una playlist utilizzando gli album"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"È possibile visualizzare tutti i propri album facendo clic sul pulsante "
+"<gui style=\"button\">Albums</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Per aggiungere tutti i brani in un album:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr ""
+"Fare clic sul pulsante di selezione nell'angolo in alto a destra della "
+"finestra."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Selezionare gli album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Fare clic sul pulsante <gui style=\"button\">Aggiungi a playlist</gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Fare clic su <gui>Nuova playlist</gui> e digitare il nome per la playlist."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Fare clic su <gui style=\"button\">Seleziona</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr ""
+"È anche possibile creare una playlist partendo da dei brani specifici."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Per aggiungere i brani selezionati da un album:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Fare clic su un album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Fare clic sul pulsante di selezione."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Selezionare i brani."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Per selezionare tutti i brani fare clic su <guiseq><gui>Fare clic sugli "
+"elementi per selezionarli</gui><gui>Seleziona tutto</gui></guiseq> nella "
+"barra degli strumenti o premere <keyseq><key>Ctrl</key><key>A</key></"
+"keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Per annullare la selezione, fare clic su <guiseq><gui>Fare clic sugli "
+"elementi per selezionarli</gui><gui>Deseleziona tutto</gui></guiseq> nella "
+"barra degli strumenti."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Creare una playlist selezionando i brani preferiti."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Creare playlist utilizzando brani"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"È possibile visualizzare tutti i propri brani facendo clic sul pulsante "
+"<gui style=\"button\">Brani</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr "Per creare una playlist in modalità <em>Brani</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Selezionare tutti i brani da aggiungere alla playlist."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Fare clic su <gui style=\"button\">Nuova playlist</gui> e digitare il nome "
+"per la playlist."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Creare playlist selezionando gli artisti preferiti."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Creare playlist basate sugli artisti"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"È possibile visualizzare tutti gli artisti e i loro brani facendo clil sul "
+"pulsante <gui style=\"button\">Artisti</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr "Per creare una playlist in modalità <em>Artisti</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Selezionare tutti gli artisti i cui brani devono essere inclusi nella "
+"playlist."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Fare clic su <gui>Seleziona</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Rimuovere una playlist."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Eliminare una playlist"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr ""
+"È possibile rimuovere le vecchie playlist o quelle che non si utilizzano "
+"più."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Selezionare la playlist da eliminare."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Fare clic su <gui>Elimina</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Eliminare brani dalla playlist."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Rimuovere brani"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "È possibile rimuovere un qualsiasi brano da una playlist."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Selezionare la playlist da cui rimuovere i brani."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Fare clic sul pulsante di selezione nella barra del titolo."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Selezionare tutti i brani di rimuovere."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "Fare clic su <gui style=\"button\">Rimuovi da playlist</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr "Ripetere tutti i brani nella playlist o solo quello in riproduzione."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Riprodurre i brani in ripetizione"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Nella barra del titolo, fare clic sul pulsante a destra:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Selezionare <gui>Ripeti brano</gui> per ripetere un singolo brano."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Selezionare <gui>Ripeti tutto</gui> per ripetere tutti i brani nella "
+"playlist."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Mischiare i brani in un playlist."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Mischiare i brani"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"Nella barra del titolo, fare clic sul pulsante a destra e selezionare "
+"<gui>Mischia</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Cercare nella propria collezione musicale."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Trovare musica"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"È possibile cercare tra album, artisti, brani e playlist. Selezionare il "
+"criterio di ricerca quindi fare clic sul pulsante <gui>Cerca</gui>."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Questo documento è fornito nei termini della licenza <_:link-1/>."
diff --git a/help/ko/ko.po b/help/ko/ko.po
new file mode 100644
index 00000000..8fd957f0
--- /dev/null
+++ b/help/ko/ko.po
@@ -0,0 +1,439 @@
+# Korean translation for gnome-music.
+# Copyright (C) 2014 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Seong-ho Cho <shcho@gnome.org>, 2014, 2016, 2017, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2021-04-10 19:23+0000\n"
+"PO-Revision-Date: 2021-08-31 16:38+0900\n"
+"Last-Translator: Seong-ho Cho <shcho@gnome.org>\n"
+"Language-Team: Korean <gnome-kr@googlegroups.com>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 2.3.1\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "조성호 <shcho@gnome.org>, 2014, 2016, 2017, 2021."
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"음악 디렉터리를 보여주는 <app>파일</app>보다 더욱 단순하고 우아한 대안 프로"
+"그램입니다."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "음악 소개"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "음악"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "음악"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "음악"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> 음악"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "재생 목록 만들기"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "노래 재생하기"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "음악과 재생 목록 제거하기"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "원하는 노래를 재생합니다."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "음악 재생"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"재생 목록을 만들거나 어떤 뷰에서든 여러분이 선택한 노래를 눌러 듣고 싶은 음"
+"악을 재생할 수 있습니다."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "<em>재생 목록</em>에서:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "재생 목록을 선택하십시오."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "오른편에 있는 톱니바퀴 단추를 누르십시오."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "<gui>재생</gui>을 누르십시오."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "앨범을 사용하여 노래를 재생 목록에 추가합니다."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "앨범을 사용하여 재생 목록 만들기"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"<gui style=\"button\">앨범</gui> 단추를 누르면 모든 앨범을 볼 수 있습니다."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "앨범의 모든 노래를 추가하려면:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "창의 우측 상단에 있는 표시 단추를 누르십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "앨범을 선택하십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr "<gui style=\"button\">재생 목록에 추가</gui> 단추를 누르십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr "<gui>새 재생 목록</gui>을 누르고 재생 목록 이름을 입력하십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "<gui style=\"button\">선택</gui>을 누르십시오."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "개별 노래로 재생 목록을 만들 수도 있습니다."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "앨범에서 선택한 노래를 추가하려면:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "앨범을 누르십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "표시 단추를 누르십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "노래를 선택하십시오."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"모든 노래를 선택하려면 도구 모음에서 <guiseq><gui>선택할 항목 누름</"
+"gui><gui>모두 선택</gui></guiseq> 을 누르거나 <keyseq><key>Ctrl</"
+"key><key>A</key></keyseq>키 조합을 누르십시오."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"선택을 취소하려면 도구 모음에서 <guiseq><gui>선택할 항목 누름</gui><gui>선"
+"택 안함</gui></guiseq>을 누르십시오."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "듣고 싶은 노래를 선택하여 재생 목록을 만듭니다."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "노래로 재생 목록 만들기"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"<gui style=\"button\">노래</gui> 단추를 눌러 모든 노래를 볼 수 있습니다."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr "<em>노래</em> 보기에서 새 재생 목록을 만들려면:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "재생 목록에 추가할 모든 노래를 선택하십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"<gui style=\"button\">새 재생 목록</gui>을 누른 후 재생 목록에서 이름을 입"
+"력하십시오."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "원하는 음악가를 선택하여 재생 목록을 만듭니다."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "음악가 기준으로 재생 목록 만들기"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"<gui syle=\"button\">음악가</gui> 단추를 누르면 음악가와 해당 음악가의 모"
+"든 노래를 볼 수 있습니다."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr "<em>음악가</em> 보기에서 새 재생 목록을 만들려면:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr "재생 목록에 추가할 노래의 모든 음악가를 선택하십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "<gui>선택</gui>을 누르십시오."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "원하지 않는 재생 목록을 제거합니다."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "재생 목록 제거"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "오래되어 원하지 않는 재생 목록을 제거할 수 있습니다."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "삭제할 재생 목록을 선택하십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "<gui>삭제</gui>를 누르십시오."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "재생 목록에서 노래를 삭제합니다."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "노래 제거"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "재생 목록에서 원하지 않는 노래를 제거할 수 있습니다."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "제거하려는 노래를 재생 목록에서 선택하십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "도구 모음의 표시 단추를 누르십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "제거할 모든 노래를 선택하십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "<gui style=\"button\">재생 목록에서 제거</gui>를 누르십시오."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr "재생 목록의 모든 노래 또는 현재 노래에 대해 반복하십시오."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "노래 재생을 어떻게 반복하죠?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "작업 표시줄에서 오른편의 단추를 누르십시오:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "<gui>노래 반복</gui>을 선택하여 단일 노래를 반복하십시오."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"<gui>모두 반복</gui>을 선택하여 재생 목록의 모든 노래를 반복하십시오."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "재생 목록의 노래를 뒤섞습니다."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "어떻게 노래를 뒤섞을까요?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"작업 표시줄의 오른편에 있는 단추를 누르고 <gui>뒤섞기</gui>를 선택하십시오."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "음악 모음에서 검색하십시오."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "음악 찾기"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"앨범, 음악가, 노래, 재생 목록을 검색할 수 있습니다. 검색할 요소를 선택한 "
+"후 <gui>검색</gui> 단추를 누르면 검색을 시작합니다."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr ""
+"크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 Unported 라이선스"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "이 문서는 <_:link-1/>에 따른 활용을 허가합니다."
diff --git a/help/meson.build b/help/meson.build
new file mode 100644
index 00000000..06aad0d0
--- /dev/null
+++ b/help/meson.build
@@ -0,0 +1,17 @@
+gnome.yelp(meson.project_name(),
+ sources: [
+ 'introduction.page',
+ 'index.page',
+ 'play-music.page',
+ 'playlist-create-albums.page',
+ 'playlist-create-songs.page',
+ 'playlist-create-artists.page',
+ 'playlist-delete.page',
+ 'playlist-remove-songs.page',
+ 'playlist-repeat.page',
+ 'playlist-shuffle.page',
+ 'search.page',
+ 'legal.xml'
+ ],
+ media: 'figures/org.gnome.Music.svg'
+)
diff --git a/help/nl/nl.po b/help/nl/nl.po
new file mode 100644
index 00000000..50ac2669
--- /dev/null
+++ b/help/nl/nl.po
@@ -0,0 +1,453 @@
+# Dutch translation for gnome-music.
+# Copyright (C) 2016 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Justin van Steijn <jvs@fsfe.org>, 2016.
+# Nathan Follens <nfollens@gnome.org>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2022-05-10 09:09+0000\n"
+"PO-Revision-Date: 2022-06-30 21:18+0200\n"
+"Last-Translator: Nathan Follens <nfollens@gnome.org>\n"
+"Language-Team: Dutch <gnome-nl-list@gnome.org>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+"Justin van Steijn <jvs@fsfe.org>, 2016.\n"
+"Nathan Follens <nfollens@gnome.org>, 2022."
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Een eenvoudige en elegante vervanging voor <app>Bestanden</app> om door de "
+"muziekmap te bladeren."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Inleiding tot Muziek"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Muziek"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Muziek"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Muziek"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Muziek"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Afspeellijst maken"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Een nummer afspelen"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Nummers en afspeellijsten verwijderen"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Speel uw favoriete nummers af."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Muziek afspelen"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"U kunt uw favoriete muziek afspelen door een afspeellijst te maken of door "
+"simpelweg op het nummer van uw keuze te klikken vanuit een willekeurige "
+"weergave."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "Wanneer u in <em>Afspeellijsten</em> bent:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Selecteer een afspeellijst."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Klik op de knop met het tandrad aan de rechterkant."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Klik op <gui>Afspelen</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Voeg nummers aan afspeellijsten toe door gebruik te maken van albums."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Een afspeellijst maken met albums"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"U kunt al uw albums bekijken door op de knop <gui style=\"button\">Albums</"
+"gui> te klikken."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Om alle nummers in een album toe te voegen:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Klik op de knop met het vinkje in de rechterbovenhoek van het venster."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Selecteer albums."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr "Klik op <gui style=\"button\">Toevoegen aan afspeellijst</gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Klik op <gui>Nieuwe afspeellijst</gui> en typ een naam voor uw afspeellijst."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Klik op <gui style=\"button\">Selecteren</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "U kunt ook een afspeellijst maken met specifieke nummers."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Om geselecteerde nummers toe te voegen vanuit een album:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Klik op een album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Klik op de knop met het vinkje."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Selecteer nummers."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Om alle nummers te selecteren klikt u op <guiseq><gui>Klik op items om deze "
+"te selecteren</gui><gui>Alles selecteren</gui></guiseq> in de werkbalk of "
+"drukt u op<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Om de selectie op te heffen klikt u op <guiseq><gui>Klik op items om deze "
+"te selecteren</gui><gui>Niets selecteren</gui></guiseq> in de werkbalk."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Maak een afspeellijst aan door uw favoriete nummers te selecteren."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Afspeellijsten aanmaken met nummers"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"U kunt alle nummers bekijken door te klikken op <gui style=\"button"
+"\">Nummers</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Om een nieuwe afspeellijst aan te maken terwijl u in de <em>Nummers</em>-"
+"weergave bent:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Selecteer alle nummers die u aan de afspeellijst wilt toevoegen."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Klik op <gui style=\"button\">Nieuwe afspeellijst</gui> en typ een naam voor "
+"uw afspeellijst."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Maak een afspeellijst aan door uw favoriete artiesten te selecteren."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Afspeellijsten aanmaken met artiesten"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"U kunt alle artiesten en hun nummers weergeven door te klikken op <gui style="
+"\"button\">Artiesten</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Om een nieuwe afspeellijst aan te maken terwijl u in de <em>Artiesten</em>-"
+"weergave bent:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Selecteer alle artiesten wier nummers u aan de afspeellijst wilt toevoegen."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Klik op <gui>Selecteren</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Verwijder een ongewenste afspeellijst."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Een afspeellijst verwijderen"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "U kunt een oude en ongewenste afspeellijst verwijderen."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Selecteer de afspeellijst die u wilt verwijderen."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Klik op <gui>Verwijderen</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Verwijder nummers uit een afspeellijst."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Nummers verwijderen"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "U kunt ongewenste nummers uit een afspeellijst verwijderen."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Selecteer de afspeellijst waaruit u nummers wilt verwijderen."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Klik op de knop met het vinkje in de werkbalk."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Selecteer alle nummers die u wilt verwijderen."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "Klik op <gui style=\"button\">Verwijderen uit afspeellijst</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr "Herhaal alle nummers in de afspeellijst of alleen het huidige nummer."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Hoe herhaal ik nummers?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Klik op de knop aan de rechterkant in de werkbalk:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Selecteer <gui>Nummer herhalen</gui> om een enkel nummer te herhalen."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Selecteer <gui>Alles herhalen</gui> om alle nummers in de afspeellijst te "
+"herhalen."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Speel nummers in de afspeellijst in willekeurige volgorde af."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Hoe speel ik mijn nummers af in willekeurige volgorde?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"Klik op de knop aan de rechterkant in te taakbalk en selecteer "
+"<gui>Willekeurig</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Zoek in uw muziekverzameling."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Muziek zoeken"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"U kunt door uw albums, artiesten, nummers en afspeellijsten zoeken. "
+"Selecteer waarin u wilt zoeken, klik op <gui>Zoeken</gui> en begin met "
+"zoeken."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons Naamsvermelding-GelijkDelen 3.0 Unported-licentie"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Dit werk is uitgebracht onder een <_:link-1/>."
diff --git a/help/pl/pl.po b/help/pl/pl.po
new file mode 100644
index 00000000..8e6ab1e6
--- /dev/null
+++ b/help/pl/pl.po
@@ -0,0 +1,451 @@
+# Polish translation for gnome-music help.
+# Copyright © 2017 the gnome-music authors.
+# This file is distributed under the same license as the gnome-music help.
+# Piotr Drąg <piotrdrag@gmail.com>, 2017.
+# Aviary.pl <community-poland@mozilla.org>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music-help\n"
+"POT-Creation-Date: 2021-04-10 19:23+0000\n"
+"PO-Revision-Date: 2017-05-31 01:05+0200\n"
+"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
+"Language-Team: Polish <community-poland@mozilla.org>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+"Piotr Drąg <piotrdrag@gmail.com>, 2017\n"
+"Aviary.pl <community-poland@mozilla.org>, 2017"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Prosty i elegancki zamiennik używania <app>Menedżera plików</app> do "
+"wyświetlania katalogu z muzyką."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Wprowadzenie do odtwarzacza muzyki"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Muzyka"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Muzyka"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Muzyka"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Muzyka"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Tworzenie listy odtwarzania"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Odtwarzanie utworu"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Usuwanie utworów i list odtwarzania"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Odtwarzanie ulubionych utworów."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Odtwarzanie muzyki"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Można odtwarzać ulubioną muzykę tworząc listę odtwarzania lub po prostu "
+"klikając wybrany utwór w każdym widoku."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "W widoku <em>Listy odtwarzania</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Wybierz listę odtwarzania."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Kliknij przycisk z kołem zębatym po prawej stronie."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Kliknij <gui>Odtwórz</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Dodawanie utworów do list odtwarzania za pomocą albumów."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Tworzenie listy odtwarzania za pomocą albumów"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Można wyświetlić wszystkie albumy klikając przycisk <gui style=\"button"
+"\">Albumy</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Aby dodać wszystkie utwory w albumie:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Kliknij przycisk z haczykiem w górnym prawym rogu okna."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Zaznacz albumy."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Kliknij przycisk <gui style=\"button\">Dodaj do listy odtwarzania</gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr "Kliknij <gui>Nowa lista odtwarzania</gui> i wpisz nazwę listy."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Kliknij <gui style=\"button\">Wybierz</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "Można także utworzyć listę odtwarzania z konkretnych utworów."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Aby dodać wybrane utwory z albumu:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Kliknij album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Kliknij przycisk z haczykiem."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Zaznacz utwory."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Aby zaznaczyć wszystkie utwory, kliknij <guiseq><gui>Kliknięcie elementu "
+"zaznacza go</gui><gui>Zaznacz wszystko</gui></guiseq> na pasku narzędziowym "
+"lub naciśnij klawisze <keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Aby anulować zaznaczenie, kliknij <guiseq><gui>Kliknięcie elementu zaznacza "
+"go</gui><gui>Odznacz wszystko</gui></guiseq> na pasku narzędziowym."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Tworzenie listy odtwarzania wybierając ulubione utwory."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Tworzenie list odtwarzania za pomocą utworów"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Można wyświetlić wszystkie utwory klikając przycisk <gui style=\"button"
+"\">Utwory</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr "Aby utworzyć nową listę odtwarzania w widoku <em>Utwory</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Zaznacz wszystkie utwory do dodania do listy odtwarzania."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Kliknij przycisk <gui style=\"button\">Nowa lista odtwarzania</gui> i wpisz "
+"nazwę listy."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Tworzenie listy odtwarzania wybierając ulubionych wykonawców."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Tworzenie list odtwarzania za pomocą wykonawców"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Można wyświetlić wszystkich wykonawców i ich utwory klikając przycisk <gui "
+"style=\"button\">Wykonawcy</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr "Aby utworzyć nową listę odtwarzania w widoku <em>Wykonawcy</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Zaznacz wszystkich wykonawców, których utwory mają zostać dodane do listy "
+"odtwarzania."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Kliknij <gui>Wybierz</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Usuwanie niechcianej listy odtwarzania."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Usuwanie listy odtwarzania"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Można usunąć stare i niechciane listy odtwarzania."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Zaznacz listę odtwarzania do usunięcia."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Kliknij <gui>Usuń</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Usuwanie utworów z listy odtwarzania."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Usuwanie utworów"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "Można usunąć wszystkie niechciane utwory z listy odtwarzania."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Zaznacz listę odtwarzania, z której mają zostać usunięte utwory."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Kliknij przycisk z haczykiem na pasku narzędziowym."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Zaznacz wszystkie utwory do usunięcia."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "Kliknij <gui style=\"button\">Usuń z listy odtwarzania</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr ""
+"Powtarzanie wszystkich utworów na liście odtwarzania lub tylko obecnego "
+"utworu."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Jak ustawić powtarzanie utworów?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Kliknij przycisk po prawej stronie paska zadań:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Wybierz <gui>Powtarzanie utworu</gui>, aby powtarzać jeden utwór."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Wybierz <gui>Powtarzanie wszystkich</gui>, aby powtarzać wszystkie utwory "
+"listy odtwarzania."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Losowa kolejność utworów na liście odtwarzania."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Jak ustawić losową kolejność utworów?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"Kliknij przycisk po prawej stronie paska zadań i wybierz <gui>Odtwarzanie "
+"losowe</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Przeszukiwanie kolekcji muzycznej."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Wyszukiwanie muzyki"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Można przeszukiwać albumy, wykonawców, utwory i listy odtwarzania. Wybierz, "
+"co chcesz przeszukać, a następnie kliknij przycisk <gui>Wyszukaj</gui> "
+"i zacznij wyszukiwanie."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Na warunkach licencji <_:link-1/>."
diff --git a/help/pt_BR/pt_BR.po b/help/pt_BR/pt_BR.po
new file mode 100644
index 00000000..63b6e7da
--- /dev/null
+++ b/help/pt_BR/pt_BR.po
@@ -0,0 +1,459 @@
+# Brazilian Portuguese translation for gnome-music.
+# Copyright (C) 2021 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Rafael Fontenelle <rafaelff@gnome.org>, 2014, 2016, 2017.
+# Enrico Nicoletto <liverig@gmail.com>, 2021."
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2021-04-10 19:23+0000\n"
+"PO-Revision-Date: 2021-08-14 09:53-0300\n"
+"Last-Translator: Enrico Nicoletto <liverig@gmail.com>\n"
+"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0\n"
+"X-Project-Style: gnome\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "Rafael Fontenelle <rafaelff@gnome.org>, 2014, 2016\n"
+"Enrico Nicoletto <liverig@gmail.com>, 2021"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Uma substituição simples, porém elegante, ao uso de <app>Arquivos</app> para "
+"mostrar o diretório de músicas."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Introdução ao Músicas"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Música"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Música"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Música"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Músicas"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Criando lista de reprodução"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Reproduzindo uma música"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Removendo músicas e lista de reprodução"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Reproduza suas músicas favoritas."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Reproduzindo músicas"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Você pode reproduzir sua música favorita criando uma lista de reprodução ou "
+"simplesmente clicando na música de sua escolha a partir de qualquer visão."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "Em <em>Listas de reprodução</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Selecione uma lista de reprodução."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Clique no botão de engrenagem no lado direito."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Clique em <gui>Reproduzir</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Adicione músicas às listas de reprodução usando álbuns."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Criando uma lista de reprodução usando álbuns"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Você pode ver todos os seus álbuns clicando no botão <gui style=\"button"
+"\">Álbuns</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Para adicionar todas as músicas em um álbum:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Clique no botão marcação no topo direito da janela."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Selecione álbuns."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Clique no botão <gui style=\"button\">Adicionar para lista de reprodução</"
+"gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Clique em <gui>Nova lista de reprodução</gui> e digite um nome para sua "
+"lista de reprodução."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Clique em <gui style=\"button\">Selecionar</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr ""
+"Você também pode criar uma lista de reprodução para músicas específicas."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Para adicionar músicas selecionadas de um álbum:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Clique em um álbum."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Clique no botão de marcação."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Selecione as músicas."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Para selecionar todas as músicas, clique em <guiseq><gui>Clique nos itens "
+"para selecioná-los</gui><gui>Selecionar todos</gui></guiseq> na barra de "
+"ferramentas ou pressione <keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Para limpar a seleção, clique em <guiseq><gui>Clique nos itens para "
+"selecioná-los</gui><gui>Selecionar nenhum</gui></guiseq> na barra de "
+"ferramentas."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Crie lista de reprodução selecionando suas músicas favoritas."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Criando listas de reprodução usando músicas"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Você pode ver todas as suas músicas clicando no botão <gui style=\"button"
+"\">Músicas</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Para criar uma nova lista de reprodução enquanto na visão <em>Músicas</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr ""
+"Selecione todas as músicas que você deseja adicionar à lista de reprodução."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Clique em <gui style=\"button\">Nova lista de reprodução</gui> e digite um "
+"nome para sua lista de reprodução."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Crie lista de reprodução selecionando seus artistas favoritos."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Criando listas de reprodução usando artistas"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Você pode ver todos os artistas e suas músicas clicando no botão <gui style="
+"\"button\">Artistas</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Para criar uma nova lista de reprodução enquanto na visão <em>Artistas</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Selecione todos os artistas cujas músicas você deseja adicionar à lista de "
+"reprodução."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Clique em <gui>Selecionar</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Remova uma lista de reprodução indesejada."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Excluindo uma lista de reprodução"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Você pode remover uma lista de reprodução antiga e indesejada."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Selecione a lista de reprodução que você deseja excluir."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Clique em <gui>Excluir</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Exclua músicas da lista de reprodução."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Removendo músicas"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr ""
+"Você pode remover quaisquer músicas indesejadas de uma lista de reprodução."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Selecione a lista de reprodução da qual você deseja remover músicas."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Clique no botão de marcação na barra de ferramentas."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Selecione todas as músicas que você deseja remover."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "Clique em <gui style=\"button\">Remover da lista de reprodução</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr ""
+"Repita todas as músicas da lista de reprodução ou apenas a música atual."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Como eu faço para reproduzir músicas em repetição?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Na barra de tarefas, clique no botão no lado direito:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Selecione <gui>Repetir música</gui> para repetir uma única música."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Selecione <gui>Repetir tudo</gui> para repetir todas as músicas na lista de "
+"reprodução."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Embaralhe músicas da lista de reprodução."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Como eu faço para embaralhar minhas músicas?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"Na barra de tarefas, clique no botão no lado direito e selecione "
+"<gui>Embaralhar</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Pesquise em sua coleção de músicas."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Localizando músicas"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Você pode pesquisar seus álbuns, artistas, músicas e listas de reprodução. "
+"Selecione o que você deseja pesquisar e, então, clique no botão "
+"<gui>Pesquisar</gui> e comece a pesquisar."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr ""
+"licença Creative Commons Atribuição-Compartilhada Igual 3.0 Não Portada"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Essa obra é está licenciada sob uma <_:link-1/>."
diff --git a/help/ro/ro.po b/help/ro/ro.po
new file mode 100644
index 00000000..2739c58f
--- /dev/null
+++ b/help/ro/ro.po
@@ -0,0 +1,453 @@
+# Romanian translation for gnome-music.
+# Copyright (C) 2014 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Bogdan Mințoi <mintoi.bogdan@gmail.com>, 2014.
+# Daniel Șerbănescu <daniel [at] serbanescu [dot] dk>, 2014, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2017-09-04 22:23+0000\n"
+"PO-Revision-Date: 2017-09-06 19:02+0200\n"
+"Last-Translator: Daniel Șerbănescu <daniel [at] serbanescu [dot] dk>\n"
+"Language-Team: Gnome Romanian Translation Team\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
+"20)) ? 1 : 2);;\n"
+"X-Generator: Virtaal 0.7.1\n"
+"X-Project-Style: gnome\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "Bogdan Mințoi <mintoi.bogdan@gmail.com> 2014"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:11 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:13 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Un înlocuitor simplu și elegant de a utiliza <app>Fișiere</app> pentru a "
+"vizualiza dosarul ce conține muzică."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Introducere la Muzică"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link"
+msgid "Music"
+msgstr "Muzică"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "text"
+msgid "Music"
+msgstr "Muzică"
+
+#. (itstool) path: page/title
+#: C/index.page:18
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Muzică"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Crearea unei liste de redare"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Redarea unei piese"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Eliminarea pieselor și a listei de redare"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Redă piesele preferate."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Redare de muzică"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Puteți reda muzica preferată prin crearea unei liste de redare sau printr-un "
+"simplu clic pe piesa dorită din orice vizualizare."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "Când vă aflați în câmpul <em>Liste de redare</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Selectați o listă de redare."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Clic pe butonul unelte din partea dreaptă."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Clic pe <gui>Redă</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Adăugă piese la listele de redare folosind albume."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Crearea unei liste de redare folosind albume"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Puteți vizualiza toate albumele printr-un clic pe butonul <gui style=\""
+"button\">Albume</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Pentru a adăuga toate piesele într-un album:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Clic pe butonul de bifare aflat în partea dreapta-sus a ferestrei."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Selectați albume."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr "Clic pe butonul <gui style=\"button\">Adaugă în lista de redare</gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Clic pe <gui>Listă de redare nouă</gui> și introduceți un nume pentru lista "
+"de redare."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Clic pe <gui style=\"button\">Selectează</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr ""
+"De asemenea, puteți crea o listă de redare alcătuită din piese specifice."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Pentru a adăuga piese selectate dintr-un album:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Clic pe un album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Clic pe butonul de bifare."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Selectați piese."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Pentru a selecta toate piesele, clic <guiseq><gui>Clic pe elemente pentru "
+"selectare</gui><gui>Selectare totală</gui></guiseq> în bara de unelte sau "
+"apăsați <keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Pentru a elimina selecția, clic <guiseq><gui>Clic pe elemente pentru "
+"selectare</gui><gui>Deselectează tot</gui></guiseq> în bara de unelte."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Creează liste de redare prin selectarea pieselor preferate."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Crearea de liste de redare folosind piese"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Puteți vizualiza toate piesele printr-un clic pe butonul <gui style=\""
+"button\">Melodii</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr "Pentru a crea o listă de redare nouă, în câmpul <em>Melodii</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr ""
+"Selectați toate piesele pe care doriți să le adăugați în lista de redare."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Clic pe <gui style=\"button\">Listă de redare nouă</gui> și introduceți un "
+"nume pentru lista de redare."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Creează o listă de redare prin selectarea artiștilor preferați."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Crearea de liste de redare folosind numele artiștilor"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Puteți vizualiza toți artiștii și piesele compuse de aceștia printr-un clic "
+"pe butonul <gui style=\"button\">Artiști</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Pentru a creea o listă de redare nouă, când vă aflați în câmpul "
+"<em>Artiști</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Selectați toți artiștii ale căror piese doriți să le adăugați în lista de "
+"redare."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Clic pe <gui>Selectează</gui>"
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Elimină o listă de redare nedorită."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Ștergerea unei liste de redare"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr ""
+"Aveți posibilitatea să eliminați orice listă de redare veche sau nedorită."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Alegeți lista de redare pe care doriți să o ștergeți."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Clic pe <gui>Șterge</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Șterge piese dintr-o listă de redare."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Eliminarea pieselor"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr ""
+"Aveți posibilitatea să eliminați orice piesă nedorită dintr-o listă de "
+"redare."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Alegeți lista de redare din cadrul căreia doriți să eliminați piese."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Clic pe butonul de bifare din bara de unelte."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Alegeți toate piesele pe care doriți să le eliminați."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr ""
+"Clic pe butonul <gui style=\"button\">Elimină din lista de redare</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr "Repetă toate piesele din lista de redare sau doar piesa curentă."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Cum se pot reda piesele repetitiv?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "În bara de activități, clic pe butonul din partea dreaptă:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Selectați <gui>Repetă piesă</gui> pentru a repeta doar o piesă."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Selectați <gui>Repetă tot</gui> pentru a repeta toate melodiile din lista de "
+"redare."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Amestecă piesele din lista de redare."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Cum se amestecă piesele?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"În bara de activități, apăsați clic pe butonul din partea dreaptă și "
+"selectați <gui>Amestecă</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Caută prin întreaga colecție de muzică."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Căutarea muzicii"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Puteți căuta printre albume, artiști, piese și liste de redare. Alegeți prin "
+"ce anume doriți să căutați, apoi apăsați pe butonul <gui>Caută</gui> și "
+"începeți căutarea."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr ""
+"Licența ne-adaptată Creative Commons Atribuire - Distribuire-în-condiții-"
+"identice 3.0"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Această lucrare este licențiată sub <_:link-1/>."
diff --git a/help/ru/ru.po b/help/ru/ru.po
new file mode 100644
index 00000000..53ba09db
--- /dev/null
+++ b/help/ru/ru.po
@@ -0,0 +1,459 @@
+# Russian translation for gnome-music.
+# Copyright (C) 2022 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Ser82-png <sw@atrus.ru>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2022-01-08 22:22+0000\n"
+"PO-Revision-Date: 2022-01-21 01:03+1000\n"
+"Language-Team: Russian <gnome-cyr@gnome.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ru\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"
+"Last-Translator: Ser82-png\n"
+"X-Generator: Poedit 2.3\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "Ser82-png <sw@atrus.ru>, 2022"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Простая и элегантная замена файлового менеджера <app>Файлы</app> для "
+"отображения музыкального каталога."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Введение в \"Музыку\""
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Музыка"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Музыка"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Музыка"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Музыка"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Создать список воспроизведения"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Воспроизвести композицию"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Удалить композиции из списка воспроизведения"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Воспроизвести ваши любимые композиции."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Воспроизвести музыкальную композицию"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Вы можете воспроизводить свои любимые музыкальные композиции, создав "
+"список воспроизведения или просто щёлкнув нужную композицию в любой панели "
+"просмотра."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "В <em>Списках воспроизведения</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Выберите список воспроизведения."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Щёлкните на кнопку шестеренки с правой стороны."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Щёлкните <gui>Воспроизвести</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Добавить композиции в списки воспроизведения с помощью альбомов."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Создать список воспроизведения с помощью альбомов"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Вы можете просмотреть все свои альбомы, нажав кнопку <gui style=\"button"
+"\">Альбомы</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Чтобы добавить все композиции в альбоме:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Нажмите кнопку с галочкой в правом верхнем углу окна."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Выберите альбомы."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Щёлкните по кнопке<gui style=\"button\">Добавить в список воспроизведения</"
+"gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Щёлкните <gui>Новый список воспроизведения</gui> и введите название своего "
+"списка."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Щёлкните <gui style=\"button\">Выбрать</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr ""
+"Вы также можете создать список воспроизведения из конкретных композиций."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Чтобы добавить выбранные в альбоме композиции:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Щёлкните на альбом."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Щёлкните по кнопке с галочкой."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Выберите композиции."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Чтобы выбрать все песни, щёлкните <guiseq><gui>Нажмите, чтобы выбрать</"
+"gui><gui>Выбрать все</gui></guiseq> на панели инструментов или нажмите "
+"<keyseq><key>Ctrl</key ><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Чтобы отменить выделение, нажмите <guiseq><gui>Нажмите, чтобы выбрать</"
+"gui><gui>Снять выделение</gui></guiseq> на панели инструментов."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Создать список воспроизведения, выбрав свои любимые композиции."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Создать список воспроизведения на основе отдельных композиции"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Вы можете просмотреть все композиции, нажав кнопку <gui style=\"button"
+"\">Композиции</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Чтобы создать список воспроизведения используя вкладку <em>Композиции</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr ""
+"Выберите все композиции, которые хотите добавить в список воспроизведения."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Щёлкните <gui>Новый список воспроизведения</gui> и введите название своего "
+"списка."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Создать список воспроизведения, выбрав своих любимых исполнителей."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Создать список воспроизведения, с помощью выбора исполнителей"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Вы можете просмотреть всех исполнителей и их песни, нажав кнопку <gui "
+"style=\"button\">Исполнители</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Чтобы создать новый список воспроизведения во вкладке <em>Исполнители</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Выберите всех исполнителей, чьи песни вы хотите добавить в список "
+"воспроизведения."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Щёлкните <gui>Выбрать</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Удалить ненужный список воспроизведения."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Удалить список воспроизведения"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Вы можете удалить старый и ненужный список воспроизведения."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Выберите список воспроизведения, который хотите удалить."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Щёлкните <gui>Удалить</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Удаление композиции из списка воспроизведения."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Удаление композиций"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr ""
+"Вы можете удалить любые ненужные композиции из списка воспроизведения."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr ""
+"Выберите список воспроизведения, из которого хотите удалить композиции."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Щёлкните на кнопку с галочкой на панели инструментов."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Выберите все композиции, которые хотите удалить."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr ""
+"Щёлкните <gui style=\"button\">Удалить из списка воспроизведения</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr "Повтор всех композиций в списке воспроизведения или только текущей."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Как воспроизводить композицию на повторе?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "В панели задач щёлкните кнопку с правой стороны:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr ""
+"Выберите <gui>Повторять композицию</gui>, чтобы поставить её на повтор."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Выберите <gui>Повторять все</gui>, чтобы повторять все композиции в списке "
+"воспроизведения."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Перемешать песни в списке воспроизведения."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Как перемешать композиции?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"На панели задач справа нажмите кнопку и выберите <gui>В случайном порядке</"
+"gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Поиск по вашей музыкальной коллекции."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Поиск музыки"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Вы можете искать свои альбомы, исполнителей, песни и списки "
+"воспроизведения. Выберите, что вы хотите найти, затем нажмите кнопку "
+"<gui>Поиск</gui> и начните поиск."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Данная работа находится под лицензией <_:link-1/>."
diff --git a/help/sv/sv.po b/help/sv/sv.po
new file mode 100644
index 00000000..d379de79
--- /dev/null
+++ b/help/sv/sv.po
@@ -0,0 +1,444 @@
+# Swedish translation for gnome-music.
+# Copyright © 2016-2022 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Sebastian Rasmussen <sebras@gmail.com>, 2016.
+# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=user%20docs\n"
+"POT-Creation-Date: 2021-08-13 21:49+0000\n"
+"PO-Revision-Date: 2022-01-29 22:58+0100\n"
+"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "Sebastian Rasmussen <sebras@gmail.com>, 2016"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"En enkel och elegant ersättning för att använda <app>Filer</app> för att "
+"visa musikkatalogen."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Introduktion till Musik"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Musik"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Musik"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Musik"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Musik"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Skapa en spellista"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Spela en låt"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Ta bort låtar och spellistor"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Spela dina favoritlåtar."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Spela musik"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Du kan spela din favoritmusik genom att skapa en spellista eller genom att "
+"helt enkelt klicka på vilken låt du vill från vilken vy som helst."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "Medan du är i <em>Spellistor</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Välj en spellista."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Klicka på kugghjulsknappen på högersidan."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Klicka på <gui>Spela</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Lägg till låtar till spellistor via album."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Skapa en spellista via album"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Du kan visa alla dina album genom att klicka på knappen <gui style=\"button"
+"\">Album</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "För att lägga till alla låtarna i ett album:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Klicka på kryssrutan längst upp till höger i fönstret."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Välj album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr "Klicka på knappen <gui style=\"button\">Lägg till i spellista</gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Klicka på <gui>Ny spellista</gui> och skriv in ett namn på din spellista."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Klicka på <gui style=\"button\">Välj</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "Du kan också skapa en spellista från specifika låtar."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "För att lägga till utvalda låtar från ett album:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Klicka på ett album."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Klicka på kryssrutan."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Välj låtar."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"För att välja alla låtar klicka på <guiseq><gui>Klicka på objekt för att "
+"välja dem</gui><gui>Markera alla</gui></guiseq> i verktygsfältet eller tryck "
+"på <keyseq><key>Ctrl</key><key>A</key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"För att rensa markeringen klicka på <guiseq><gui>Klicka på objekt för att "
+"välja dem</gui><gui>Avmarkera alla</gui></guiseq> i verktygsfältet."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Skapa spellista genom att välja dina favoritlåtar."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Skapa spellistor via låtar"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Du kan visa alla låtar genom att klicka på knappen <gui style=\"button"
+"\">Låtar</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr "För att skapa en ny spellista medan du är i vyn <em>Låtar</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Markera alla låtar du vill lägga till i spellistan."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Klicka på <gui style=\"button\">Ny spellista</gui> och skriv in ett namn på "
+"din spellista."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Skapa spellista genom att välja dina favoritartister."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Skapa spellistor via artister"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Du kan visa alla artisterna och deras låtar genom att klicka på knappen <gui "
+"style=\"button\">Artister</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr "För att skapa en ny spellista medan du är i vyn <em>Artister</em>:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr "Markera alla artister vars låtar du vill lägga till i spellistan."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Klicka på <gui>Välj</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Ta bort en oönskad spellista."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Ta bort en spellista"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Du kan ta bort en gammal och oönskad spellista."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Markera spellistan som du vill ta bort."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Klicka på <gui>Ta bort</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Ta bort låtar från spellistan."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Ta bort låtar"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "Du kan ta bort oönskade låtar från en spellista."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Välj spellistan från vilken du vill ta bort låtar."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Klicka på kryssrutan i verktygsfältet."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Markera alla låtar du vill ta bort."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "Klicka på <gui style=\"button\">Ta bort från spellista</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr "Repetera alla låtar i spellistan eller endast den aktuella låten."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Hur spelar jag låtar upprepade gånger?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Klicka i verktygsfältet på knappen på höger sida:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Välj <gui>Upprepa låt</gui> för att upprepa en enstaka låt."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr "Välj <gui>Upprepa alla</gui> för att upprepa alla låtar i spellistan."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Spela låtar i spellistan i slumpmässig ordning."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Hur spelar jag mina låtar i slumpmässig ordning?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"I verktygsfältet, klicka på knappen på höger sida och välj <gui>Spela i "
+"slumpmässig ordning</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Sök genom din musiksamling."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Sök musik"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Du kan genomsöka dina album, artister, låtar och spellistor. Välj vad du "
+"vill genomsöka och klicka sedan på knappen <gui>Sök</gui> och börja söka."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "licensen Creative Commons Erkännande-DelaLika 3.0 Unported"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Detta verk är licensierat under <_:link-1/>."
diff --git a/help/tr/tr.po b/help/tr/tr.po
new file mode 100644
index 00000000..cbae97f4
--- /dev/null
+++ b/help/tr/tr.po
@@ -0,0 +1,456 @@
+# Turkish translation for gnome-music.
+# Copyright (C) 2021 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# Sabri Ünal <libreajans@gmail.com>, 2021.
+# Emin Tufan Çetin <etcetin@gmail.com>, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2021-04-10 19:23+0000\n"
+"PO-Revision-Date: 2022-03-10 21:59+0300\n"
+"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
+"Language-Team: Turkish <tr@li.org>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 2.4.3\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+"Sabri Ünal <libreajans@gmail.com>, 2021.\n"
+"Emin Tufan Çetin <etcetin@gmail.com>, 2021, 2022."
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Müzik dizinini göstermek için <app>Dosyalar</app>’ı kullanmanın basit ve "
+"zarif alternatifi."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Müzik’e Giriş"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Müzik"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Müzik"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Müzik"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Müzik"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Çalma listesi oluştur"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Şarkıyı çal"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Şarkıları ve çalma listesini kaldır"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Gözde şarkılarını çal."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Müzik çal"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Gözde şarkılarınızı çalma listesi oluşturarak ya da herhangi bir görünümden "
+"seçtiğiniz şarkıya tıklayarak çalabilirsiniz."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "<em>Çalma Listesi</em>’ndeyken:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Çalma listesi seçin."
+
+# Hata: Gear buton kalktı yerine üst üste üç nokta geldi.
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr "Sağ taraftaki dik üç nokta düğmesine tıklayın."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "<gui>Çal</gui>’ı seçin."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Albümleri kullanarak çalma listelerine şarkılar ekle."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Albümleri kullanarak çalma listesi oluştur"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"<gui style=\"button\">Albümler</gui> düğmesine tıklayarak tüm albümlerinizi "
+"görüntüleyebilirsiniz."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Tüm şarkıları bir albüme eklemek için:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Pencerenin sağ üst köşesindeki onay düğmesine tıklayın."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Albümleri seçin."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr "<gui style=\"button\">Çalma Listesine Ekle</gui> düğmesine tıklayın."
+
+# Hata: New playlist diye tıklanabilir bir alan yok
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"<gui>Yeni Çalma Listesi</gui> alanına tıklayıp çalma listeniz için ad girin."
+
+# Hata: Buton adı ekle olmuş.
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "<gui style=\"button\">Ekle</gui>’ye tıklayın."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "Belirli şarkılardan çalma listesi de oluşturabilirsiniz."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Albümden seçilen şarkıları eklemek için:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Albüme tıklayın."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Onay düğmesine tıklayın."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Şarkıları seçin."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Tüm şarkıları seçmek için araç çubuğundan <guiseq><gui>Seçmek için ögelere "
+"tıklayın</gui><gui>Tümünü Seç</gui></guiseq> yolunu izleyin ya da "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq> kısayolunu kullanın."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Seçimi temizlemek için araç çubuğundan <guiseq><gui>Seçmek için ögelere "
+"tıklayın</gui><gui>Hiçbirini Seçme</gui></guiseq> yolunu izleyin."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Gözde şarkılarını seçenek çalma listesi oluştur."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Şarkıları kullanarak çalma listeleri oluştur"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"<gui style=\"button\">Şarkılar</gui> düğmesine tıklayarak tüm şarkılarınızı "
+"görüntüleyebilirsiniz."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr "<em>Şarkılar</em> görünümündeyken yeni çalma listesi oluşturmak için:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Çalma listesine eklemek istediğiniz tüm şarkıları seçin."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"<gui>Yeni Çalma Listesi</gui> alanına tıklayıp çalma listeniz için ad girin."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Gözde sanatçılarını seçenek çalma listesi oluştur."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Sanatçıları kullanarak çalma listeleri oluştur"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"<gui style=\"button\">Sanatçılar</gui> düğmesine tıklayarak tüm sanatçıları "
+"ve şarkılarını görüntüleyebilirsiniz."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"<em>Sanatçılar</em> görünümündeyken yeni çalma listesi oluşturmak için:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr "Şarkılarını çalma listesine eklemek istediğiniz tüm sanatçıları seçin."
+
+# Hata: Düğme adı değişmiş.
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "<gui>Ekle</gui>’ye tıklayın."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "İstenmeyen çalma listesini kaldır."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Çalma listesini sil"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Eski ve istenmeyen çalma listelerini silebilirsiniz."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Silmek istediğiniz çalma listesini seçin."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "<gui>Sil</gui>’i seçin."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Şarkıları çalma listesinden sil."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Şarkıları kaldır"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "İstemediğiniz şarkıları çalma listesinden kaldırabilirsiniz."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Şarkıları kaldırmak istediğiniz çalma listesini seçin."
+
+# Hata: Sayfa tamamen güncellenmeye muhtaç
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Araç çubuğundaki kutucuğa tıklayın."
+
+# Hata: Sayfa tamamen güncellenmeye muhtaç
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Kaldırmak istediğiniz tüm şarkıları seçin."
+
+# Hata: Sayfa tamamen güncellenmeye muhtaç
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr "<gui style=\"button\">Çalma Listesinden Kaldır</gui>a tıklayın."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr ""
+"Çalma listesindeki tüm şarkıları ya da yalnızca geçerli şarkıyı yinele."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Şarkıları yeniden yeniden nasıl çalarım?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "Görev çubuğunda, sağdaki düğmeye tıklayın:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr "Tek şarkıyı yinelemek için <gui>Şarkıyı Yinele</gui>’yi seçin."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Çalma listesindeki tüm şarkıları yinelemek için <gui>Tümünü Yinele</gui>’yi "
+"seçin."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Çalma listesindeki şarkıları karıştır."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Şarkıları nasıl karıştırabilirim?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"Görev çubuğunda, sağ taraftaki düğmeye tıklayın ve <gui>Karıştır</gui>’ı "
+"seçin."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Müzik derleminde ara."
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Müzik ara"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Albümlerinizi, sanatçılarınızı, şarkılarınızı ve çalma listelerinizi "
+"arayabilirsiniz. Aramak istediğinizi seçin ve ardından <gui>Ara</gui> "
+"düğmesine tıklayın ve aramaya başlayın."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Bu çalışma <_:link-1/> ile lisanslanmıştır."
diff --git a/help/uk/uk.po b/help/uk/uk.po
new file mode 100644
index 00000000..a4bec660
--- /dev/null
+++ b/help/uk/uk.po
@@ -0,0 +1,458 @@
+# Ukrainian translation for gnome-music.
+# Copyright (C) 2020 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# Yuri Chornoivan <yurchor@ukr.net>, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music gnome-3-36\n"
+"POT-Creation-Date: 2021-04-10 19:23+0000\n"
+"PO-Revision-Date: 2021-04-18 10:31+0300\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Lokalize 20.12.0\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr "Юрій Чорноіван <yurchor@ukr.net>, 2020"
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr ""
+"Проста і елегантна заміна використанню <app>Файлів</app> для показу каталогу "
+"музики."
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "Вступ до «Музики»"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+#| msgctxt "link"
+#| msgid "Music"
+msgctxt "link:trail"
+msgid "Music"
+msgstr "Музика"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "Музика"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "Музика"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> Музика"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "Створення списку композицій"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "Відтворення пісні"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "Вилучення пісень і списку відтворення"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "Відтворення ваших улюблених пісень."
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "Відтворення музики"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+"Ви можете відтворювати улюблені музичні твори створенням списку композицій "
+"або простим натисканням пункту вибраної композиції з будь-якої панелі "
+"перегляду."
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr "У <em>Списках композицій</em>:"
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "Виберіть список композицій."
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr ""
+"Натисніть кнопку із зображенням шестерні у правій частині вікна програми."
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr "Натисніть кнопку <gui>Відтворити</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr "Додавання композицій до списків композицій за допомогою альбомів."
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr "Створення списку композицій за допомогою альбомів"
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+"Ви можете переглянути усі ваші альбоми натисканням кнопки <gui style=\"button"
+"\">Альбоми</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr "Щоб додати усі композиції у альбомі:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr "Натисніть кнопку із позначкою у верхньому правому куті вікна програми."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr "Виберіть альбоми."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+"Натисніть кнопку <gui style=\"button\">Додати до списку композицій</gui>."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+"Натисніть кнопку <gui>Створити список композицій</gui> і введіть назву "
+"вашого списку композицій."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr "Натисніть кнопку <gui style=\"button\">Вибрати</gui>."
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr "Ви також можете створити список композицій із вказаних композицій."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr "Щоб додати позначені композиції з альбому, виконайте такі дії:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr "Клацніть на альбомі."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr "Клацніть на кнопці із позначкою."
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr "Позначте композиції."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+"Щоб вибрати усі композиції, <guiseq><gui>клацніть правою кнопкою на "
+"об'єктах, щоб позначити їх</gui><gui>Вибрати все</gui></guiseq> на панелі "
+"інструментів або натисніть комбінацію клавіш <keyseq><key>Ctrl</key><key>A</"
+"key></keyseq>."
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+"Щоб зняти позначення, <guiseq><gui>клацніть на об'єктах, щоб позначити їх</"
+"gui><gui>Не вибирати</gui></guiseq> на панелі інструментів."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr "Створення списку композицій позначенням ваших улюблених композицій."
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr "Створення списку композицій на основі окремих композицій"
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+"Ви можете переглянути усі ваші композиції натисканням кнопки <gui style="
+"\"button\">Пісні</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+"Щоб створити список композицій у режимі <em>Пісні</em>, виконайте такі дії:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr "Позначте усі композиції, які ви хочете додати до списку композицій."
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+"Натисніть кнопку <gui style=\"button\">Створити список композицій</gui> і "
+"введіть назву вашого списку композицій."
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr "Створення списку композицій позначенням ваших улюблених виконавців."
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr "Створення списку композицій на основі окремих виконавців"
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+"Ви можете переглянути список усіх виконавців та їхніх композицій натисканням "
+"кнопки <gui style=\"button\">Виконавці</gui>."
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+"Щоб створити список композицій у режимі <em>Виконавці</em>, виконайте такі "
+"дії:"
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+"Позначте пункти усіх виконавців, композиції яких ви хочете додати до списку "
+"композицій."
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr "Натисніть кнопку <gui>Вибрати</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr "Вилучення небажаного списку композицій."
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr "Вилучення списку композицій"
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr "Ви можете вилучити старий і непотрібний список композицій."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr "Позначте список композицій, який ви хочете вилучити."
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "Натисніть кнопку <gui>Вилучити</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr "Вилучення композицій зі списку композицій."
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr "Вилучення композицій"
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr "Ви можете вилучити будь-які небажані композицій зі списку композицій."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr "Позначте список композицій, з якого ви хочете вилучити композиції."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr "Клацніть на кнопці із позначкою на панелі інструментів."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr "Позначте усі композиції, які ви хочете вилучити."
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr ""
+"Натисніть кнопку <gui style=\"button\">Вилучити зі списку композицій</gui>."
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr "Повторення усіх композицій у списку або лише поточної композиції."
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr "Як зробити так, щоб композицій відтворювалися повторно?"
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr "На панелі завдань натисніть кнопку у правій її частині:"
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr ""
+"Натисніть <gui>Повторювати пісню</gui>, щоб повторювалася окрема пісня."
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+"Виберіть <gui>Повторювати все</gui>, щоб програма повторювала усі композиції "
+"у списку композицій."
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr "Перемішування пісень у списку композицій."
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr "Як перемішати композиції?"
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+"На панелі завдань натисніть кнопку у правій її частині і виберіть "
+"<gui>Перемішати</gui>."
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "Пошук у збірці музичних творів"
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "Пошук музики"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+"Ви можете шукати бажану композицію серед ваших альбомів, списків виконавців, "
+"композицій та списків композицій. Позначте об'єкт пошуку і натисніть кнопку "
+"<gui>Пошук</gui>, щоб розпочати пошук."
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "Ця робота розповсюджується за умов дотримання <_:link-1/>."
diff --git a/help/zh_CN/zh_CN.po b/help/zh_CN/zh_CN.po
new file mode 100644
index 00000000..2d222c48
--- /dev/null
+++ b/help/zh_CN/zh_CN.po
@@ -0,0 +1,418 @@
+# Chinese (China) translation for gnome-music.
+# Copyright (C) 2022 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Boyuan Yang <073plan@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"POT-Creation-Date: 2022-04-12 09:44+0000\n"
+"PO-Revision-Date: 2022-04-20 09:56-0400\n"
+"Language-Team: Chinese (China) <i18n-zh@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Last-Translator: \n"
+"X-Generator: Poedit 2.4.3\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+
+#. (itstool) path: credit/name
+#: C/introduction.page:11 C/index.page:12 C/play-music.page:11
+#: C/playlist-create-albums.page:11 C/playlist-create-songs.page:11
+#: C/playlist-create-artists.page:11 C/playlist-delete.page:11
+#: C/playlist-remove-songs.page:11 C/playlist-repeat.page:11
+#: C/playlist-shuffle.page:11 C/search.page:11
+msgid "Shobha Tyagi"
+msgstr "Shobha Tyagi"
+
+#. (itstool) path: credit/years
+#: C/introduction.page:13 C/index.page:14 C/play-music.page:13
+#: C/playlist-create-albums.page:13 C/playlist-create-songs.page:13
+#: C/playlist-create-artists.page:13 C/playlist-delete.page:13
+#: C/playlist-remove-songs.page:13 C/playlist-repeat.page:13
+#: C/playlist-shuffle.page:13 C/search.page:13
+msgid "2014"
+msgstr "2014"
+
+#. (itstool) path: info/desc
+#. (itstool) path: page/p
+#: C/introduction.page:18 C/introduction.page:23
+msgid ""
+"A simple and elegant replacement for using <app>Files</app> to show the "
+"music directory."
+msgstr "简单而优雅的应用程序,使用<app>文件</app>来显示音乐目录。"
+
+#. (itstool) path: page/title
+#: C/introduction.page:22
+msgid "Introduction to Music"
+msgstr "音乐应用程序介绍"
+
+#. (itstool) path: info/title
+#: C/index.page:6
+msgctxt "link:trail"
+msgid "Music"
+msgstr "音乐"
+
+#. (itstool) path: info/title
+#: C/index.page:7
+msgctxt "link"
+msgid "Music"
+msgstr "音乐"
+
+#. (itstool) path: info/title
+#: C/index.page:8
+msgctxt "text"
+msgid "Music"
+msgstr "音乐"
+
+#. (itstool) path: page/title
+#: C/index.page:19
+msgid "<_:media-1/> Music"
+msgstr "<_:media-1/> 音乐"
+
+#. (itstool) path: section/title
+#: C/index.page:25
+msgid "Create playlist"
+msgstr "创建播放列表"
+
+#. (itstool) path: section/title
+#: C/index.page:28
+msgid "Play a song"
+msgstr "播放歌曲"
+
+#. (itstool) path: section/title
+#: C/index.page:31
+msgid "Remove songs and playlist"
+msgstr "移除歌曲和播放列表"
+
+#. (itstool) path: info/desc
+#: C/play-music.page:18
+msgid "Play your favorite songs."
+msgstr "播放您最爱的歌曲。"
+
+#. (itstool) path: page/title
+#: C/play-music.page:22
+msgid "Play music"
+msgstr "播放音乐"
+
+#. (itstool) path: page/p
+#: C/play-music.page:24
+msgid ""
+"You can play your favorite music by creating a playlist or by simply "
+"clicking on the song of your choice from any view."
+msgstr ""
+
+#. (itstool) path: steps/title
+#: C/play-music.page:28 C/playlist-delete.page:27
+#: C/playlist-remove-songs.page:27
+msgid "While in <em>Playlists</em>:"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/play-music.page:30
+msgid "Select a playlist."
+msgstr "选中一个播放列表。"
+
+#. (itstool) path: item/p
+#: C/play-music.page:33 C/playlist-delete.page:32
+msgid "Click on the gear button on the right hand side."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/play-music.page:36
+msgid "Click on <gui>Play</gui>."
+msgstr ""
+
+#. (itstool) path: info/desc
+#: C/playlist-create-albums.page:18
+msgid "Add songs to playlists using albums."
+msgstr ""
+
+#. (itstool) path: page/title
+#: C/playlist-create-albums.page:21
+msgid "Create a playlist using albums"
+msgstr ""
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:23
+msgid ""
+"You can view all your albums by clicking on the <gui style=\"button"
+"\">Albums</gui> button."
+msgstr ""
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:27
+msgid "To add all the songs in an album:"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:29 C/playlist-create-songs.page:29
+#: C/playlist-create-artists.page:30
+msgid "Click on the check button in the top-right of the window."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:32
+msgid "Select albums."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:35 C/playlist-create-albums.page:60
+#: C/playlist-create-songs.page:35 C/playlist-create-artists.page:37
+msgid "Click on the <gui style=\"button\">Add to Playlist</gui> button."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:38 C/playlist-create-albums.page:63
+#: C/playlist-create-artists.page:40
+msgid "Click on <gui>New Playlist</gui> and type a name for your playlist."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:42 C/playlist-create-albums.page:67
+#: C/playlist-create-songs.page:42
+msgid "Click on <gui style=\"button\">Select</gui>."
+msgstr ""
+
+#. (itstool) path: page/p
+#: C/playlist-create-albums.page:46
+msgid "You can also create a playlist from specific songs."
+msgstr ""
+
+#. (itstool) path: steps/title
+#: C/playlist-create-albums.page:49
+msgid "To add selected songs from an album:"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:51
+msgid "Click on an album."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:54
+msgid "Click on the check button."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-create-albums.page:57
+msgid "Select songs."
+msgstr ""
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:72 C/playlist-create-songs.page:47
+#: C/playlist-create-artists.page:49
+msgid ""
+"To select all the songs click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select All</gui></guiseq> in the toolbar or press "
+"<keyseq><key>Ctrl</key><key>A</key></keyseq>."
+msgstr ""
+
+#. (itstool) path: note/p
+#: C/playlist-create-albums.page:76 C/playlist-create-songs.page:51
+#: C/playlist-create-artists.page:53
+msgid ""
+"To clear the selection click <guiseq><gui>Click on items to select them</"
+"gui><gui>Select None</gui></guiseq> in the toolbar."
+msgstr ""
+
+#. (itstool) path: info/desc
+#: C/playlist-create-songs.page:18
+msgid "Create playlist by selecting your favorite songs."
+msgstr ""
+
+#. (itstool) path: page/title
+#: C/playlist-create-songs.page:21
+msgid "Create playlists using songs"
+msgstr ""
+
+#. (itstool) path: page/p
+#: C/playlist-create-songs.page:23
+msgid ""
+"You can view all the songs by clicking on the <gui style=\"button\">Songs</"
+"gui> button."
+msgstr ""
+
+#. (itstool) path: steps/title
+#: C/playlist-create-songs.page:27
+msgid "To create a new playlist while in <em>Songs</em> view:"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:32
+msgid "Select all the songs you want to add to the playlist."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-create-songs.page:38
+msgid ""
+"Click on <gui style=\"button\">New Playlist</gui> and type a name for your "
+"playlist."
+msgstr ""
+
+#. (itstool) path: info/desc
+#: C/playlist-create-artists.page:18
+msgid "Create playlist by selecting your favorite artists."
+msgstr ""
+
+#. (itstool) path: page/title
+#: C/playlist-create-artists.page:22
+msgid "Create playlists using artists"
+msgstr ""
+
+#. (itstool) path: page/p
+#: C/playlist-create-artists.page:24
+msgid ""
+"You can view all the artists and their songs by clicking on the <gui style="
+"\"button\">Artists</gui> button."
+msgstr ""
+
+#. (itstool) path: steps/title
+#: C/playlist-create-artists.page:28
+msgid "To create a new playlist while in <em>Artists</em> view:"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:33
+msgid "Select all the artists whose songs you want to add to the playlist."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-create-artists.page:44
+msgid "Click on <gui>Select</gui>."
+msgstr ""
+
+#. (itstool) path: info/desc
+#: C/playlist-delete.page:18
+msgid "Remove an unwanted playlist."
+msgstr ""
+
+#. (itstool) path: page/title
+#: C/playlist-delete.page:22
+msgid "Delete a playlist"
+msgstr ""
+
+#. (itstool) path: page/p
+#: C/playlist-delete.page:24
+msgid "You can remove an old and unwanted playlist."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:29
+msgid "Select the playlist which you want to delete."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-delete.page:35
+msgid "Click on <gui>Delete</gui>."
+msgstr "点击<gui>删除</gui>。"
+
+#. (itstool) path: info/desc
+#: C/playlist-remove-songs.page:18
+msgid "Delete songs from the playlist."
+msgstr ""
+
+#. (itstool) path: page/title
+#: C/playlist-remove-songs.page:22
+msgid "Remove songs"
+msgstr ""
+
+#. (itstool) path: page/p
+#: C/playlist-remove-songs.page:24
+msgid "You can remove any unwanted songs from a playlist."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:29
+msgid "Select the playlist from which you want to remove songs."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:32
+msgid "Click on the check button on the toolbar."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:35
+msgid "Select all the songs which you want to remove."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-remove-songs.page:38
+msgid "Click on <gui style=\"button\">Remove from Playlist</gui>."
+msgstr ""
+
+#. (itstool) path: info/desc
+#: C/playlist-repeat.page:18
+msgid "Repeat all songs in the playlist or only the current song."
+msgstr ""
+
+#. (itstool) path: page/title
+#: C/playlist-repeat.page:22
+msgid "How do I play songs on repeat?"
+msgstr ""
+
+#. (itstool) path: list/title
+#: C/playlist-repeat.page:25
+msgid "In the taskbar, click on the button on the right side:"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:27
+msgid "Select <gui>Repeat Song</gui> to repeat a single song."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/playlist-repeat.page:30
+msgid "Select <gui>Repeat All</gui> to repeat all the song in the playlist."
+msgstr ""
+
+#. (itstool) path: info/desc
+#: C/playlist-shuffle.page:18
+msgid "Shuffle songs in the playlist."
+msgstr ""
+
+#. (itstool) path: page/title
+#: C/playlist-shuffle.page:22
+msgid "How do I shuffle my songs?"
+msgstr ""
+
+#. (itstool) path: page/p
+#: C/playlist-shuffle.page:24
+msgid ""
+"In the taskbar, click on the button on right hand side and select "
+"<gui>Shuffle</gui>."
+msgstr ""
+
+#. (itstool) path: info/desc
+#: C/search.page:18
+msgid "Search through your music collection."
+msgstr "在您的音乐收藏中搜索。"
+
+#. (itstool) path: page/title
+#: C/search.page:22
+msgid "Find music"
+msgstr "查找音乐"
+
+#. (itstool) path: page/p
+#: C/search.page:24
+msgid ""
+"You can search your albums, artists, songs and playlists. Select what you "
+"want to search through then click the <gui>Search</gui> button and start "
+"searching."
+msgstr ""
+
+#. (itstool) path: p/link
+#: C/legal.xml:5
+msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
+msgstr "知识共享 署名-相同方式共享 3.0 未本地化版本"
+
+#. (itstool) path: license/p
+#: C/legal.xml:4
+msgid "This work is licensed under a <_:link-1/>."
+msgstr "本作品使用<_:link-1/>许可。"
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000..fd3e3b59
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,120 @@
+project('gnome-music',
+ version: '45.0',
+ meson_version: '>= 0.59.0'
+)
+
+# Importing modules
+gnome = import('gnome')
+i18n = import('i18n')
+python = import('python')
+
+# Module objects
+py_installation = python.find_installation('python3')
+
+# Make sure Python is installed and found
+if not py_installation.found()
+ error('No valid python3 binary found')
+endif
+
+# Python 3.7 is needed for postponed evalution of annotations
+if not py_installation.language_version().version_compare('>= 3.7')
+ error('Python 3.7 or newer is required.')
+endif
+
+# Constants
+PACKAGE_URL = 'https://wiki.gnome.org/Apps/Music'
+PACKAGE_URL_BUG = 'https://gitlab.gnome.org/GNOME/gnome-music/issues'
+PROJECT_RDNN_NAME = 'org.gnome.Music'
+
+# NAME_SUFFIX is used in the about dialog
+if get_option('profile') == 'development'
+ PROFILE = '.Devel'
+ NAME_SUFFIX = ' (Development Snapshot)'
+else
+ PROFILE = ''
+ NAME_SUFFIX = ''
+endif
+
+APPLICATION_ID = 'org.gnome.Music@0@'.format(PROFILE)
+PYTHON_DIR = py_installation.get_path('purelib')
+PKGDATA_DIR = join_paths(get_option('prefix'), get_option('datadir'), APPLICATION_ID)
+PKGLIB_DIR = join_paths(get_option('prefix'), get_option('libdir'), APPLICATION_ID)
+VCS_TAG = ''
+if get_option('profile') != 'default'
+ git = find_program('git', required : false)
+ if git.found()
+ VCS_TAG = run_command('git', 'rev-parse', '--short', 'HEAD').stdout().strip()
+ endif
+ if VCS_TAG == ''
+ VCS_TAG = '-devel'
+ else
+ VCS_TAG = '-@0@'.format(VCS_TAG)
+ endif
+endif
+
+
+# Dependencies
+dependency('glib-2.0', version: '>= 2.67.1')
+dependency('goa-1.0', version: '>= 3.35.90')
+dependency('gobject-introspection-1.0', version: '>= 1.35.0')
+dependency('gtk4', version: '>= 4.5.0')
+dependency('libadwaita-1', version: '>= 1.2.alpha')
+dependency('libmediaart-2.0', version: '>= 1.9.1')
+dependency('libsoup-3.0')
+dependency('tracker-sparql-3.0', version: '>= 2.99.3')
+dependency('pango', version: '>= 1.44.0')
+dependency('pygobject-3.0', version: '>= 3.36.1')
+dependency('py3cairo', version: '>= 1.14.0')
+dependency('grilo-0.3', version: '>= 0.3.13', fallback: ['grilo', 'libgrl_dep'])
+dependency('grilo-plugins-0.3', version: '>= 0.3.12', fallback: ['grilo-plugins', 'grilo_plugins_dep'])
+
+subdir('data')
+subdir('help')
+subdir('po')
+
+install_subdir(
+ 'gnomemusic',
+ install_dir: py_installation.get_install_dir()
+)
+
+# Install the executable file
+bin_config = configuration_data()
+bin_config.set('application_id', APPLICATION_ID)
+bin_config.set('rdnn_name', PROJECT_RDNN_NAME)
+bin_config.set('pkgdatadir', PKGDATA_DIR)
+bin_config.set('localedir', join_paths(get_option('prefix'), get_option('datadir'), 'locale'))
+bin_config.set('pythondir', PYTHON_DIR)
+bin_config.set('schemasdir', PKGDATA_DIR)
+bin_config.set('version', meson.project_version() + VCS_TAG)
+
+bin_config.set('local_build', 'False')
+
+configure_file(
+ input: 'gnome-music.in',
+ output: 'gnome-music',
+ configuration: bin_config,
+ install_dir: get_option('bindir')
+)
+
+# Install the builddir executable
+local_config = configuration_data()
+local_config.set('application_id', APPLICATION_ID)
+local_config.set('rdnn_name', PROJECT_RDNN_NAME)
+local_config.set('pkgdatadir', join_paths(meson.current_build_dir(), 'data'))
+local_config.set('localedir', join_paths(get_option('prefix'), get_option('datadir'), 'locale'))
+local_config.set('pythondir', meson.current_source_dir())
+local_config.set('schemasdir', join_paths(meson.current_build_dir(), 'data'))
+
+local_config.set('local_build', 'True')
+
+configure_file(
+ input: 'gnome-music.in',
+ output: 'local-music',
+ configuration: local_config
+)
+
+gnome.post_install(
+ glib_compile_schemas: true,
+ gtk_update_icon_cache: true,
+ update_desktop_database: true
+)
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000..a9e396dd
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,9 @@
+option(
+ 'profile',
+ type: 'combo',
+ choices: [
+ 'default',
+ 'development'
+ ],
+ value: 'default'
+)
diff --git a/org.gnome.Music.json b/org.gnome.Music.json
new file mode 100644
index 00000000..ca04def5
--- /dev/null
+++ b/org.gnome.Music.json
@@ -0,0 +1,147 @@
+{
+ "app-id": "org.gnome.Music.Devel",
+ "runtime": "org.gnome.Platform",
+ "runtime-version": "master",
+ "sdk": "org.gnome.Sdk",
+ "command": "gnome-music",
+ "tags": ["devel", "development", "nightly"],
+ "finish-args": [
+ "--device=dri",
+ "--share=ipc",
+ "--share=network",
+ "--socket=wayland",
+ "--socket=fallback-x11",
+ "--socket=pulseaudio",
+ "--filesystem=xdg-music",
+ "--talk-name=org.freedesktop.Tracker3.Writeback",
+ "--talk-name=org.gnome.OnlineAccounts",
+ "--talk-name=org.gnome.ControlCenter",
+ "--talk-name=org.gnome.Settings",
+ "--system-talk-name=org.freedesktop.login1",
+ "--add-policy=Tracker3.dbus:org.freedesktop.Tracker3.Miner.Files=tracker:Audio"
+ ],
+ "cleanup": [
+ "/include",
+ "/lib/pkgconfig",
+ "/share/pkgconfig",
+ "/share/aclocal",
+ "/man",
+ "/share/man",
+ "/share/gtk-doc",
+ "/share/vala",
+ "*.la",
+ "*.a"
+ ],
+ "modules": [
+ "subprojects/shared-modules/lua5.4/lua-5.4.json",
+ {
+ "name": "libmediaart",
+ "buildsystem": "meson",
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/libmediaart.git"
+ }
+ ]
+ },
+ {
+ "name": "tracker-miners",
+ "buildsystem": "meson",
+ "config-opts": [ "-Dbattery_detection=none",
+ "-Ddefault_index_single_dirs=",
+ "-Ddefault_index_recursive_dirs=&MUSIC",
+ "-Ddomain_prefix=org.gnome.Music.Devel",
+ "-Dman=false",
+ "-Dminer_fs=true",
+ "-Dminer_fs_cache_location=$XDG_CACHE_HOME/gnome-music/miner/files",
+ "-Dminer_rss=false",
+ "-Dsystemd_user_services=false"],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/tracker-miners.git"
+ }
+ ]
+ },
+ {
+ "name": "gnome-online-accounts",
+ "buildsystem": "meson",
+ "config-opts": [ "-Dgoabackend=false",
+ "-Dvapi=false",
+ "-Dexchange=false",
+ "-Dgoogle=false",
+ "-Dimap_smtp=false",
+ "-Dkerberos=false",
+ "-Downcloud=false",
+ "-Dwindows_live=false" ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/gnome-online-accounts.git"
+ }
+ ]
+ },
+ {
+ "name": "totem-pl-parser",
+ "buildsystem": "meson",
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/totem-pl-parser.git"
+ }
+ ]
+ },
+ {
+ "name": "grilo",
+ "buildsystem": "meson",
+ "config-opts": [ "-Denable-gtk-doc=false" ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/grilo.git"
+ }
+ ],
+ "cleanup": [ "/include", "/bin" ]
+ },
+ {
+ "name": "grilo-plugins",
+ "buildsystem": "meson",
+ "config-opts": [ "-Denable-bookmarks=no",
+ "-Denable-dleyna=no",
+ "-Denable-filesystem=no",
+ "-Denable-freebox=no",
+ "-Denable-local-metadata=no",
+ "-Denable-lua-factory=yes",
+ "-Denable-metadata-store=no",
+ "-Denable-opensubtitles=no",
+ "-Denable-optical-media=no",
+ "-Denable-podcasts=no",
+ "-Denable-thetvdb=no",
+ "-Denable-tmdb=no",
+ "-Denable-tracker=no",
+ "-Denable-tracker3=yes",
+ "-Denable-youtube=no",
+ "-Dhelp=no" ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/grilo-plugins.git"
+ }
+ ],
+ "cleanup": [ "/include" ]
+ },
+ {
+ "name": "gnome-music",
+ "config-opts" : [
+ "-Dprofile=development"
+ ],
+ "buildsystem": "meson",
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/gnome-music.git"
+ }
+ ]
+ }
+ ]
+}
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644
index 00000000..003d7e8f
--- /dev/null
+++ b/po/LINGUAS
@@ -0,0 +1,67 @@
+ab
+af
+an
+ar
+as
+be
+bg
+bs
+ca
+ca@valencia
+cs
+da
+de
+el
+en_GB
+eo
+es
+et
+eu
+fa
+fi
+fr
+fur
+fy
+ga
+gd
+gl
+he
+hr
+hu
+id
+is
+it
+ja
+ka
+kk
+kn
+ko
+lt
+lv
+mjw
+ml
+ms
+nb
+ne
+nl
+oc
+pa
+pl
+pt
+pt_BR
+ro
+ru
+sk
+sl
+sr
+sr@latin
+sv
+ta
+te
+tg
+tr
+uk
+vi
+zh_CN
+zh_HK
+zh_TW
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644
index 00000000..2b076bf9
--- /dev/null
+++ b/po/POTFILES.in
@@ -0,0 +1,45 @@
+# List of source files containing translatable strings.
+# Please keep this file sorted alphabetically.
+data/org.gnome.Music.appdata.xml.in.in
+data/org.gnome.Music.desktop.in.in
+data/org.gnome.Music.gschema.xml
+data/ui/AlbumWidget.ui
+data/ui/AppMenu.ui
+data/ui/EmptyView.ui
+data/ui/HeaderBar.ui
+data/ui/help-overlay.ui
+data/ui/LastfmDialog.ui
+data/ui/PlayerToolbar.ui
+data/ui/PlaylistControls.ui
+data/ui/PlaylistDialog.ui
+data/ui/SearchHeaderBar.ui
+data/ui/SearchView.ui
+data/ui/SelectionBarMenuButton.ui
+data/ui/SelectionToolbar.ui
+data/ui/SongWidgetMenu.ui
+gnomemusic/__init__.py
+gnomemusic/about.py
+gnomemusic/application.py
+gnomemusic/grilowrappers/grltrackerplaylists.py
+gnomemusic/gstplayer.py
+gnomemusic/inhibitsuspend.py
+gnomemusic/mpris.py
+gnomemusic/player.py
+gnomemusic/playlisttoast.py
+gnomemusic/songtoast.py
+gnomemusic/utils.py
+gnomemusic/views/albumsview.py
+gnomemusic/views/artistsview.py
+gnomemusic/views/emptyview.py
+gnomemusic/views/playlistsview.py
+gnomemusic/views/searchview.py
+gnomemusic/views/songsview.py
+gnomemusic/widgets/albumwidget.py
+gnomemusic/widgets/discbox.py
+gnomemusic/widgets/headerbar.py
+gnomemusic/widgets/lastfmdialog.py
+gnomemusic/widgets/playertoolbar.py
+gnomemusic/widgets/playlistcontrols.py
+gnomemusic/widgets/playlistdialog.py
+gnomemusic/widgets/searchheaderbar.py
+gnomemusic/window.py
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
new file mode 100644
index 00000000..72df75eb
--- /dev/null
+++ b/po/POTFILES.skip
@@ -0,0 +1,4 @@
+# List of source files that should *not* be translated.
+# Please keep this file sorted alphabetically.
+data/ui/AboutDialog.ui
+data/org.gnome.Music.appdata.xml
diff --git a/po/ab.po b/po/ab.po
new file mode 100644
index 00000000..ec14068d
--- /dev/null
+++ b/po/ab.po
@@ -0,0 +1,4683 @@
+msgid ""
+msgstr ""
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-01-25 19:11+0000\n"
+"Last-Translator: Нанба Наала <naala-nanba@rambler.ru>\n"
+"Language-Team: Abkhazian <daniel.abzakh@gmail.com>\n"
+"Language: ab\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:236
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Амузыка"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Амузыкатә коллекциа арҳәареи, ахархәареи"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Агәахәара узаазго амузыка азыӡырҩшьа ."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Ишәыҧшаала атрекқәа шәколлекциаҟны, арҳәара автоматикатә хьӡынҵақәа шәхы "
+"иашәырхәа, мамзар еизыжәга шәхатәы ҿыц ."
+
+#: data/org.gnome.Music.appdata.xml.in.in:167
+msgid "The GNOME Music developers"
+msgstr "Аԥҵаҩы изин © 2018 Аԥшьы Амузыка GNOME аԥҵаҩцәа"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Амузыкатә рҳәага"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Амузыкатә;Арҳәага;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Аԥенџьыр ашәагаа"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Аԥенџьыр ашәагаа (аҭбаареи аҳаракыреи)"
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Аԥенџьыр иамоуп иреиҳау ашәагаа"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Иеиҵыху аҧенџьыр арежим."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr ""
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "ReplayGain аҿакра"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Иаҿанакуеит мамзар иаҿнахуеит афункциа ReplayGain альбомқәа рзы"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Иаҿанакуеит мамзар иаҿнахуеит амузыка аҿакраан асистема азԥшра арежим ахь "
+"аиасразы иҟанаҵо аԥкра"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Иаҿанакуеит мамзар иаҿнахуеит аскробблқәеи аинформациақәеи \"уажәтәи "
+"аиҭарҿиара\" иазкны Last.fm. аҟны."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Аҿакра"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr ""
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr ""
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr ""
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Аккаунт Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr ""
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Ицоу арыдқәа"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Аилыркаа"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Аԥшьы иазкны"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr ""
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Амениу"
+
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Алхра"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Аԥыхра"
+
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Аҧшаара"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "Шьҭахьҟа"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr ""
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr ""
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr ""
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr ""
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr ""
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr ""
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr ""
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr ""
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr ""
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr ""
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr ""
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr ""
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr ""
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr ""
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr ""
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr ""
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr ""
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr ""
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Аҭаҩра"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Аԥхьатәи"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Ԥхьаҟа"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Аныхра"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr ""
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr ""
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Ихиоуп"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr ""
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr ""
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr ""
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr ""
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr ""
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Ацҵара"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Анагӡаҩцәа"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr ""
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Альбомқәа"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr ""
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Зегьы алхра"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr ""
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr ""
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr ""
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Аҿакрақәа рыхьӡынҵа аҟнытә аныхра"
+
+#: gnomemusic/about.py:238
+msgid "The GNOME Project"
+msgstr "The GNOME Project"
+
+#: gnomemusic/about.py:242
+msgid "translator-credits"
+msgstr "Нанба Наала <naala-nanba@rambler.ru>, 2022"
+
+#: gnomemusic/about.py:246
+msgid "Copyright The GNOME Music Developers"
+msgstr "Аԥҵаҩы изин © 2018 Аԥшьы Амузыка GNOME аԥҵаҩцәа"
+
+#: gnomemusic/about.py:249
+msgid "Translated by"
+msgstr ""
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr ""
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr ""
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr ""
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr ""
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr ""
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr ""
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Аҧшаара {} аҟны"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " насгьы "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] ""
+msgstr[1] ""
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr ""
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "Имашәыру аишьҭагылашьа"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr ""
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr ""
+
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr ""
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr ""
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Архынҳәра"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr ""
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr ""
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr ""
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr ""
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr ""
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr ""
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr ""
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr ""
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr ""
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr ""
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr ""
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Аҿакрақәа рыхьӡынҵа"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr ""
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr ""
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr ""
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] ""
+msgstr[1] ""
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr ""
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr ""
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr ""
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr ""
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pause"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] ""
+msgstr[1] ""
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#, fuzzy
diff --git a/po/af.po b/po/af.po
new file mode 100644
index 00000000..89b3719b
--- /dev/null
+++ b/po/af.po
@@ -0,0 +1,270 @@
+# Afrikaans translation for gnome-music.
+# This file is distributed under the same license as the gnome-music package.
+# Copyright (C) 2013
+# Dawid Loubser <dawid.loubser@ibi.co.za>, 2013.
+# F Wolff <friedel@translate.org.za>, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music gnome-3-10\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2013-10-14 11:25+0000\n"
+"PO-Revision-Date: 2013-10-23 14:43+0200\n"
+"Last-Translator: F Wolff <friedel@translate.org.za>\n"
+"Language-Team: translate-discuss-af@lists.sourceforge.net\n"
+"Language: af\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.1\n"
+"X-Project-Style: gnome\n"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "Venstergrootte"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "Venstergrootte (wydte en hoogte)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "Vensterposisie"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "Vensterposisie (X en Y)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "Venster-maksimeringstoestand"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "Of die venster gemaksimeer is."
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "Speelherhaalmodus"
+
+#: ../data/org.gnome.Music.gschema.xml.h:8
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: \"none\", \"song\", \"all\", \"shuffle\"."
+msgstr ""
+"Die waarde bepaal of die versameling lukraak of herhalend gespeel word. "
+"Waardes wat toegelaat word, is: \"none\", \"song\", \"all\", \"shuffle\"."
+
+#: ../data/org.gnome.Music.gschema.xml.h:9
+msgid "Search mode"
+msgstr "Soekmodus"
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "If true, the search bar is shown."
+msgstr "Indien waar, word die soekbalk vertoon."
+
+#: ../data/gnome-music.desktop.in.h:1 ../gnomemusic/application.py:46
+#: ../gnomemusic/application.py:102 ../gnomemusic/window.py:54
+#: ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "Musiek"
+
+#: ../data/gnome-music.desktop.in.h:2
+msgid "Music Player"
+msgstr "Musiekspeler"
+
+#: ../data/gnome-music.desktop.in.h:3 ../data/gnome-music.appdata.xml.in.h:2
+msgid "Play and organize your music collection"
+msgstr "Speel en organiseer u musiekversameling"
+
+#: ../data/gnome-music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "GNOME Musiek"
+
+#: ../data/gnome-music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "Musiek is GNOME se musiekspeelprogram."
+
+#: ../gnomemusic/albumArtCache.py:235
+msgid "Untitled"
+msgstr "Naamloos"
+
+#: ../gnomemusic/notification.py:70
+msgid "Not playing"
+msgstr "Speel nie tans nie"
+
+#: ../gnomemusic/notification.py:77 ../gnomemusic/player.py:350
+#: ../gnomemusic/view.py:229 ../gnomemusic/view.py:377
+#: ../gnomemusic/view.py:591
+msgid "Unknown Artist"
+msgstr "Onbekende kunstenaar"
+
+#: ../gnomemusic/notification.py:79 ../gnomemusic/view.py:475
+msgid "Unknown Album"
+msgstr "Onbekende album"
+
+#. TRANSLATORS: by refers to the artist, from to the album
+#: ../gnomemusic/notification.py:83
+#, python-format
+msgid "by %s, from %s"
+msgstr "deur %s, uit %s"
+
+#: ../gnomemusic/notification.py:123
+msgid "Previous"
+msgstr "Vorige"
+
+#: ../gnomemusic/notification.py:126
+msgid "Pause"
+msgstr "Pouseer"
+
+#: ../gnomemusic/notification.py:129
+msgid "Play"
+msgstr "Speel"
+
+#: ../gnomemusic/notification.py:131
+msgid "Next"
+msgstr "Volgende"
+
+#: ../gnomemusic/view.py:294
+#, python-format
+msgid ""
+"No Music found!\n"
+" Put some files into the folder %s"
+msgstr ""
+"Geen musiek is opgespoor nie!\n"
+" Plaas musieklêers in die gids %s"
+
+#: ../gnomemusic/view.py:301
+msgid "Albums"
+msgstr "Albums"
+
+#: ../gnomemusic/view.py:333
+msgid "Songs"
+msgstr "Liedjies"
+
+#: ../gnomemusic/view.py:484
+msgid "Playlists"
+msgstr "Speellyste"
+
+#: ../gnomemusic/view.py:490
+msgid "Artists"
+msgstr "Kunstenaars"
+
+#: ../gnomemusic/view.py:526 ../gnomemusic/view.py:528
+#: ../gnomemusic/widgets.py:443
+msgid "All Artists"
+msgstr "Alle kunstenaars"
+
+#: ../gnomemusic/widgets.py:73 ../gnomemusic/widgets.py:93
+msgid "Load More"
+msgstr "Laai meer"
+
+#: ../gnomemusic/widgets.py:83
+msgid "Loading..."
+msgstr "Laai tans..."
+
+#: ../gnomemusic/window.py:165
+msgid "Empty"
+msgstr "Leeg"
+
+#: ../data/AboutDialog.ui.in.h:2
+msgid "Copyright © 2013 GNOME Music Developers"
+msgstr "Kopiereg © 2013 GNOME-musiek se ontwikkelaars"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "'n Program vir die speel en bestuur van musiek vir GNOME."
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "Besoek GNOME-musiek se webwerf"
+
+#: ../data/AboutDialog.ui.in.h:5
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "Vrygestel"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "Speeltyd"
+
+#: ../data/app-menu.ui.h:1
+msgid "_New Playlist"
+msgstr "_Nuwe speellys"
+
+#: ../data/app-menu.ui.h:2
+msgid "_Now Playing"
+msgstr "Speel _tans"
+
+#: ../data/app-menu.ui.h:3
+msgid "_About Music"
+msgstr "_Aangaande Musiek"
+
+#: ../data/app-menu.ui.h:4
+msgid "_Quit"
+msgstr "_Sluit af"
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "Skommel"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "Herhaal almal"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "Herhaal liedjie"
+
+#: ../data/PlayerToolbar.ui.h:4
+msgid "Shuffle/Repeat Off"
+msgstr "Skommel/Herhaal afgeskakel"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No Music Found"
+msgstr "Geen musiek gevind nie"
+
+#: ../data/headerbar.ui.in.h:1
+msgid "Select All"
+msgstr "Selekteer almal"
+
+#: ../data/headerbar.ui.in.h:2
+msgid "Select None"
+msgstr "Selekteer geen"
+
+#: ../data/headerbar.ui.in.h:3
+msgid "Click on items to select them"
+msgstr "Klik op items om hulle te selekteer"
+
+#: ../data/headerbar.ui.in.h:4
+msgid "Cancel"
+msgstr "Kanselleer"
+
+#: ../data/SelectionToolbar.ui.h:1
+msgid "Add to Playlist"
+msgstr "Voeg by speellys"
diff --git a/po/an.po b/po/an.po
new file mode 100644
index 00000000..52ad6cad
--- /dev/null
+++ b/po/an.po
@@ -0,0 +1,471 @@
+# Aragonese translation for gnome-music.
+# Copyright (C) 2014 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# jorgtum <jorgtum@gmail.com>, 2014.
+# Daniel Martinez <entaltoaragon@gmail.com>, 2014, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2015-03-17 08:01+0000\n"
+"PO-Revision-Date: 2015-03-17 19:58+0100\n"
+"Last-Translator: Daniel Martinez <entaltoaragon@gmail.com>\n"
+"Language-Team: Aragonés <softaragones@googlegroups.com>\n"
+"Language: an\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Gtranslator 2.91.6\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "Grandaria d'a finestra"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "Grandaria d'a finestra (amplaria y altura)"
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "Posición d'a finestra"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "Posición d'a finestra (X e Y)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "Finestra maximizada"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "Estau maximizau d'a finestra"
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "Modo de repetición d'a lista de reproducción"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: ../data/org.gnome.Music.gschema.xml.h:9
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: \"none\" (repeat and shuffle are off), \"song"
+"\" (repeat current song), \"all\" (repeat playlist, no shuffle), \"shuffle"
+"\" (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Valor que indica si cal repetir u aleatorizar a reproducción d'a colección. "
+"As valors admitidas son: \"garra\" (as opcions de repetir y mezclar son "
+"desactivadas), \"canta\" (repetir a canta actual), \"todas\" (repetir a "
+"lista de reproducción, sin mezclar), \"mezclar\" (mezclar a lista de "
+"reproducción, se repiten todas)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "Search mode"
+msgstr "Modo de busca"
+
+#: ../data/org.gnome.Music.gschema.xml.h:11
+msgid "If true, the search bar is shown."
+msgstr "Si ye cierto, s'amuestra a barra de busca."
+
+#: ../data/org.gnome.Music.gschema.xml.h:12
+msgid "Notifications mode"
+msgstr "Modo de notificacions"
+
+#: ../data/org.gnome.Music.gschema.xml.h:13
+msgid "Enables or disables playback notifications"
+msgstr "Activa u desactiva as notificacions d'a reproducción"
+
+#: ../data/org.gnome.Music.gschema.xml.h:14
+msgid "Max chars to display in track name on Artist view"
+msgstr ""
+"Numero maximo de caracters que amostrar d'o nombre d'a pista en a vista "
+"d'artista"
+
+#: ../data/org.gnome.Music.gschema.xml.h:15
+msgid ""
+"This setting modifies the amount of chars for track title on Artist view "
+"before its been ellipsized. Set this to -1 to disable"
+msgstr ""
+"Ista valor modifica a cantidat de caracters que amostrar d'o titol d'a pista "
+"en a vista d'artista antes de retallar-lo. Establir a -1 ta desactivar-lo"
+
+#: ../data/org.gnome.Music.gschema.xml.h:16
+msgid "Enable ReplayGain"
+msgstr "Activar ReplayGain"
+
+#: ../data/org.gnome.Music.gschema.xml.h:17
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Activa u desactiva ReplayGain ta os albums"
+
+#: ../data/gnome-music.desktop.in.h:1 ../gnomemusic/application.py:50
+#: ../gnomemusic/application.py:113 ../gnomemusic/window.py:59
+#: ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "Mosica"
+
+#: ../data/gnome-music.desktop.in.h:2
+msgid "Music Player"
+msgstr "Reproductor de mosica"
+
+#: ../data/gnome-music.desktop.in.h:3 ../data/gnome-music.appdata.xml.in.h:2
+msgid "Play and organize your music collection"
+msgstr "Reproducir y organizar a tuya colección de mosica"
+
+#: ../data/gnome-music.desktop.in.h:4
+msgid "Music;Player;"
+msgstr "Mosica;Reproductor;"
+
+#: ../data/gnome-music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "Mosica de GNOME"
+
+#: ../data/gnome-music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "Mosica ye a nueva aplicación de reproducción de mosica de GNOME."
+
+#: ../gnomemusic/albumArtCache.py:103 ../gnomemusic/albumArtCache.py:111
+msgid "Untitled"
+msgstr "Sin titol"
+
+#: ../gnomemusic/mpris.py:148 ../gnomemusic/notification.py:100
+#: ../gnomemusic/player.py:470 ../gnomemusic/view.py:537
+#: ../gnomemusic/view.py:968 ../gnomemusic/view.py:1387
+msgid "Unknown Album"
+msgstr "Album desconoixiu"
+
+#: ../gnomemusic/mpris.py:164 ../gnomemusic/notification.py:98
+#: ../gnomemusic/player.py:461 ../gnomemusic/view.py:222
+#: ../gnomemusic/view.py:437 ../gnomemusic/view.py:710
+#: ../gnomemusic/view.py:1150 ../gnomemusic/view.py:1385
+#: ../gnomemusic/view.py:1421 ../gnomemusic/widgets.py:235
+#: ../gnomemusic/widgets.py:631
+msgid "Unknown Artist"
+msgstr "Artista desconoixiu"
+
+#: ../gnomemusic/notification.py:89
+msgid "Not playing"
+msgstr "No reproducindo"
+
+#. TRANSLATORS: by refers to the artist, from to the album
+#: ../gnomemusic/notification.py:104
+#, python-format
+msgid "by %s, from %s"
+msgstr "por %s, en %s"
+
+#: ../gnomemusic/notification.py:125 ../data/PlayerToolbar.ui.h:5
+msgid "Previous"
+msgstr "Anterior"
+
+#: ../gnomemusic/notification.py:128 ../gnomemusic/player.py:418
+msgid "Pause"
+msgstr "Pausa"
+
+#: ../gnomemusic/notification.py:131 ../gnomemusic/player.py:421
+#: ../data/PlayerToolbar.ui.h:6
+msgid "Play"
+msgstr "Reproducir"
+
+#: ../gnomemusic/notification.py:133 ../data/PlayerToolbar.ui.h:7
+msgid "Next"
+msgstr "Siguient"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:49
+msgid "Most Played"
+msgstr "Mas reproducidas"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:56
+msgid "Never Played"
+msgstr "No reproducidas nunca"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:63
+msgid "Recently Played"
+msgstr "Reproducidas recientment"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:70
+msgid "Recently Added"
+msgstr "Adhibidas recientment"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:77
+msgid "Favorite Songs"
+msgstr "Cantas favoritas"
+
+#. TRANSLATORS: _("the") should be a space-separated list of all-lowercase articles
+#. (such as 'the') that should be ignored when alphabetizing artists/albums. This
+#. list should include 'the' regardless of language. If some articles occur more
+#. frequently than others, most common should appear first, least common last.
+#: ../gnomemusic/query.py:69
+msgid "the a an"
+msgstr "o la los las un un una"
+
+#: ../gnomemusic/searchbar.py:58 ../gnomemusic/searchbar.py:101
+msgid "All"
+msgstr "Todas"
+
+#: ../gnomemusic/searchbar.py:59
+msgid "Artist"
+msgstr "Artista"
+
+#: ../gnomemusic/searchbar.py:60
+msgid "Album"
+msgstr "Album"
+
+#: ../gnomemusic/searchbar.py:61
+msgid "Track Title"
+msgstr "Titol d'a pista"
+
+#: ../gnomemusic/searchbar.py:102
+msgid "Local"
+msgstr "Local"
+
+#: ../gnomemusic/searchbar.py:204
+msgid "Sources"
+msgstr "Fuents"
+
+#: ../gnomemusic/searchbar.py:211
+msgid "Match"
+msgstr "Concidencia"
+
+#: ../gnomemusic/view.py:190 ../gnomemusic/widgets.py:267
+#: ../gnomemusic/widgets.py:508 ../gnomemusic/window.py:292
+#, python-format
+msgid "Selected %d item"
+msgid_plural "Selected %d items"
+msgstr[0] "%d elemento trigau"
+msgstr[1] "%d elementos trigaus"
+
+#: ../gnomemusic/view.py:192 ../gnomemusic/widgets.py:269
+#: ../gnomemusic/widgets.py:510 ../gnomemusic/window.py:296
+#: ../gnomemusic/window.py:308 ../data/headerbar.ui.h:3
+msgid "Click on items to select them"
+msgstr "Preta sobre os elementos ta trigar-los"
+
+#: ../gnomemusic/view.py:279 ../gnomemusic/view.py:1645
+msgid "Albums"
+msgstr "Albums"
+
+#: ../gnomemusic/view.py:371 ../gnomemusic/view.py:1647
+msgid "Songs"
+msgstr "Cantas"
+
+#: ../gnomemusic/view.py:569 ../gnomemusic/view.py:1646
+msgid "Artists"
+msgstr "Artistas"
+
+#: ../gnomemusic/view.py:615 ../gnomemusic/view.py:617
+#: ../gnomemusic/widgets.py:517
+msgid "All Artists"
+msgstr "Totz os artistas"
+
+#: ../gnomemusic/view.py:795 ../gnomemusic/view.py:1648
+msgid "Playlists"
+msgstr "Lista de reproducción"
+
+#: ../gnomemusic/view.py:1161
+#, python-format
+msgid "%d Song"
+msgid_plural "%d Songs"
+msgstr[0] "%d canta"
+msgstr[1] "%d cantas"
+
+#: ../gnomemusic/widgets.py:308 ../gnomemusic/widgets.py:342
+#, python-format
+msgid "%d min"
+msgstr "%d min"
+
+#: ../gnomemusic/widgets.py:755
+msgid "New Playlist"
+msgstr "Nueva lista de reproducción"
+
+#: ../gnomemusic/window.py:240
+msgid "Empty"
+msgstr "Vuedo"
+
+#: ../gnomemusic/window.py:320
+#| msgid "Loading..."
+msgid "Loading"
+msgstr "Cargando"
+
+#: ../gnomemusic/window.py:335
+msgid "_Undo"
+msgstr "_Desfer"
+
+#: ../gnomemusic/window.py:336
+#, python-format
+msgid "Playlist %s removed"
+msgstr "Lista de reproducción %s eliminada"
+
+#: ../data/AboutDialog.ui.in.h:2
+msgid "Copyright © 2013 GNOME Music Developers"
+msgstr "Dreitos d'autor © 2013 Desembolicadors de Mosica de GNOME"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "Una aplicación de reproducción y administración de mosica ta lo GNOME."
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "Visitar a pachina web d'a mosica de GNOME"
+
+#: ../data/AboutDialog.ui.in.h:5
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+"Mosica de GNOME ye software libre; puetz redistribuir-lo y/u modificar-lo "
+"baixo os termins d'a Licencia Publica Cheneral GNU tal como la publica a "
+"Free Software Foundation; ya siga en a versión 2 d'a Licencia, como (a la "
+"tuya esleción) qualsiquier atra versión posterior.\n"
+"\n"
+"Mosica de GNOME se distribuye con o afán que te será util, pero SIN GARRA "
+"GUARENCIA; sin mesmo a guarencia implicita de MERCANTILIDAT u IDONEIDAT TA "
+"UN PROPOSITO DETERMINAU. Vei a Licencia Publica Cheneral de GNU ta mas "
+"detalles.\n"
+"\n"
+"Habrías d'haber recibiu una copia d'a Licencia Publica Cheneral GNU chunto a "
+"Mosica si no, escribe a la Free Software Foundation,Inc., 51 Franklin "
+"Street, Fifth Floor, Boston, MA 02110-1301 EE. UU.\n"
+"\n"
+"Os autors de Mosica de GNOME conceden permiso ta usar y distribuir "
+"complementos de GStreamer no compatibles con a GPL. Iste permiso ye por "
+"dencima y dillá d'os permisos concedius por a GPL, por a quala Mosica de "
+"GNOME ye cubierta. Si modificas iste codigo, puetz enamplar ista excepción a "
+"la tuya versión d'o codigo, pero no yes obligau a fer-lo. Si no quiers fer-"
+"lo, elimina ista sentencia d'excepción d'a tuya versión."
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "Liberau"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "Durada d'a reproducción"
+
+#: ../data/app-menu.ui.h:1
+msgid "_Help"
+msgstr "Ad_uya"
+
+#: ../data/app-menu.ui.h:2
+msgid "_About"
+msgstr "_Arredol de"
+
+#: ../data/app-menu.ui.h:3
+msgid "_Quit"
+msgstr "_Salir"
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "Aleatorio"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "Repetir-lo tot"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "Repetir a canta"
+
+#: ../data/PlayerToolbar.ui.h:4
+msgid "Shuffle/Repeat Off"
+msgstr "Mezclar/no repetir"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No music found"
+msgstr "No s'ha trobau mosica"
+
+#: ../data/NoMusic.ui.h:2
+msgid "The contents of your music folder will appear here."
+msgstr "O conteniu d'a suya carpeta de mosica amaneixerá aquí."
+
+#: ../data/headerbar.ui.h:1
+msgid "Select All"
+msgstr "Seleccionar-lo tot"
+
+#: ../data/headerbar.ui.h:2
+msgid "Select None"
+msgstr "No seleccionar garra"
+
+#: ../data/headerbar.ui.h:4
+msgid "Search"
+msgstr "Mirar"
+
+#: ../data/headerbar.ui.h:5 ../data/PlaylistDialog.ui.h:3
+msgid "Select"
+msgstr "Trigar"
+
+#: ../data/headerbar.ui.h:6 ../data/PlaylistDialog.ui.h:2
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: ../data/headerbar.ui.h:7
+msgid "Back"
+msgstr "Atrás"
+
+#: ../data/SelectionToolbar.ui.h:1
+msgid "Add to Playlist"
+msgstr "Adhibir-ne a la lista de reproducción"
+
+#: ../data/SelectionToolbar.ui.h:2
+msgid "Remove from Playlist"
+msgstr "Sacar d'a lista de reproducción"
+
+#: ../data/PlaylistControls.ui.h:1
+msgid "_Play"
+msgstr "Re_producir"
+
+#: ../data/PlaylistControls.ui.h:2
+msgid "_Delete"
+msgstr "_Eliminar"
+
+#: ../data/PlaylistControls.ui.h:3
+msgid "Playlist Name"
+msgstr "Nombre d'a lista de reproducción"
+
+#: ../data/PlaylistDialog.ui.h:1
+msgid "Select Playlist"
+msgstr "Trigar lista de reproducción"
+
+#~ msgid "Internal: id for most played playlist"
+#~ msgstr "Interno: ID ta la lista de reproducción de cantas mas reproducidas"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "No s'ha trobau mosica!\n"
+#~ " Mete bells fichers en a carpeta %s"
+
+#~ msgid "Load More"
+#~ msgstr "Cargar-ne mas"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Nueva lista de reproducción"
+
+#~ msgid "Now _Playing"
+#~ msgstr "Reproduci_ndo agora"
diff --git a/po/ar.po b/po/ar.po
new file mode 100644
index 00000000..ce77359f
--- /dev/null
+++ b/po/ar.po
@@ -0,0 +1,384 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# aldileroi <alaeddinebensalah@gmail.com>, 2014.
+# Safa Alfulaij <safa1996alfulaij@gmail.com>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: Gnome 3.12\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-07-16 18:53+0000\n"
+"PO-Revision-Date: 2014-07-16 23:42+0300\n"
+"Last-Translator: Safa Alfulaij <safa1996alfulaij@gmail.com>\n"
+"Language-Team: Arabic <doc@arabeyes.org>\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"language/ar/)\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "حجم النافذة"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "حجم النافذة (العرض والارتفاع)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "موضع النافذة"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "موضع النافذة (x و y)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "النافذة مُكبّرة"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "حالة تكبير النافذة."
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "وضع تكرار التشغيل"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: ../data/org.gnome.Music.gschema.xml.h:9
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: \"none\" (repeat and shuffle are off), \"song"
+"\" (repeat current song), \"all\" (repeat playlist, no shuffle), \"shuffle"
+"\" (shuffle playlist, presumes repeat all)."
+msgstr ""
+"قيمة تحدّد فيما إذا كان التكرار بطريقة عشوائية أو من خلال تشغيل المجموعة. "
+"القيم المسموح بها هي: \"none\" (التكرار والخلط معطّلان)، \"song\" (تكرار "
+"الأغنية الحالية)، \"all\" (تكرار قائمة الأغاني، لا خلط)، \"shuffle\" (خلط "
+"قائمة الأغاني، يفترض تكرار كل شيء)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "Search mode"
+msgstr "وضع البحث"
+
+#: ../data/org.gnome.Music.gschema.xml.h:11
+msgid "If true, the search bar is shown."
+msgstr "إذا كان صحيحًا، سيظهر شريط البحث."
+
+#: ../data/gnome-music.desktop.in.h:1 ../gnomemusic/application.py:50
+#: ../gnomemusic/application.py:112 ../gnomemusic/window.py:62
+#: ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "موسيقى"
+
+#: ../data/gnome-music.desktop.in.h:2
+msgid "Music Player"
+msgstr "مشغّل الموسيقى"
+
+#: ../data/gnome-music.desktop.in.h:3 ../data/gnome-music.appdata.xml.in.h:2
+msgid "Play and organize your music collection"
+msgstr "شغل ونظّم مجموعتك الموسيقية"
+
+#: ../data/gnome-music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "موسيقى جنوم"
+
+#: ../data/gnome-music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "موسيقى هو تطبيق جنوم لتشغيل الموسيقى الجديد."
+
+#: ../gnomemusic/albumArtCache.py:100 ../gnomemusic/albumArtCache.py:108
+msgid "Untitled"
+msgstr "غير معنون"
+
+#: ../gnomemusic/mpris.py:133 ../gnomemusic/notification.py:100
+#: ../gnomemusic/player.py:400 ../gnomemusic/view.py:577
+#: ../gnomemusic/view.py:964 ../gnomemusic/view.py:1291
+msgid "Unknown Album"
+msgstr "ألبوم مجهول"
+
+#: ../gnomemusic/mpris.py:149 ../gnomemusic/notification.py:98
+#: ../gnomemusic/player.py:391 ../gnomemusic/view.py:286
+#: ../gnomemusic/view.py:486 ../gnomemusic/view.py:720
+#: ../gnomemusic/view.py:1068 ../gnomemusic/view.py:1289
+#: ../gnomemusic/view.py:1320 ../gnomemusic/widgets.py:184
+#: ../gnomemusic/widgets.py:563
+msgid "Unknown Artist"
+msgstr "فنّان مجهول"
+
+#: ../gnomemusic/notification.py:89
+msgid "Not playing"
+msgstr "متوقّف"
+
+#. TRANSLATORS: by refers to the artist, from to the album
+#: ../gnomemusic/notification.py:104
+#, python-format
+msgid "by %s, from %s"
+msgstr "أدّاها %s، من %s"
+
+#: ../gnomemusic/notification.py:128 ../data/PlayerToolbar.ui.h:5
+msgid "Previous"
+msgstr "السابقة"
+
+#: ../gnomemusic/notification.py:131 ../gnomemusic/player.py:348
+msgid "Pause"
+msgstr "ألبِث"
+
+#: ../gnomemusic/notification.py:134 ../gnomemusic/player.py:351
+#: ../data/PlayerToolbar.ui.h:6
+msgid "Play"
+msgstr "شغّل"
+
+#: ../gnomemusic/notification.py:136 ../data/PlayerToolbar.ui.h:7
+msgid "Next"
+msgstr "التالية"
+
+#: ../gnomemusic/searchbar.py:30 ../gnomemusic/searchbar.py:73
+msgid "All"
+msgstr "الكلّ"
+
+#: ../gnomemusic/searchbar.py:31
+msgid "Artist"
+msgstr "الفنّان"
+
+#: ../gnomemusic/searchbar.py:32
+msgid "Album"
+msgstr "الألبوم"
+
+#: ../gnomemusic/searchbar.py:33
+msgid "Track Title"
+msgstr "عنوان المقطوعة"
+
+#: ../gnomemusic/searchbar.py:74
+msgid "Local"
+msgstr "المحليّ"
+
+#: ../gnomemusic/searchbar.py:176
+msgid "Sources"
+msgstr "المصادر"
+
+#: ../gnomemusic/searchbar.py:183
+msgid "Match"
+msgstr "طابق"
+
+#: ../gnomemusic/view.py:201 ../gnomemusic/widgets.py:225
+#: ../gnomemusic/widgets.py:442 ../gnomemusic/window.py:278
+#, python-format
+msgid "Selected %d item"
+msgid_plural "Selected %d items"
+msgstr[0] "لا عناصر محدّدة (%d)"
+msgstr[1] "عنصر واحد محدّد (%d)"
+msgstr[2] "عنصران محدّدان (%d)"
+msgstr[3] "%d عناصر محدّدة"
+msgstr[4] "%d عنصرًا محدّدًا"
+msgstr[5] "%d عنصر محدّد"
+
+#: ../gnomemusic/view.py:203 ../gnomemusic/widgets.py:227
+#: ../gnomemusic/widgets.py:444 ../gnomemusic/window.py:282
+#: ../gnomemusic/window.py:294 ../data/headerbar.ui.h:3
+msgid "Click on items to select them"
+msgstr "انقر على العناصر لتحديدها"
+
+#: ../gnomemusic/view.py:340
+#, python-format
+msgid ""
+"No Music found!\n"
+" Put some files into the folder %s"
+msgstr ""
+"لم يُعثر على موسيقى!\n"
+" ضع بعض الملفات في المجلد %s"
+
+#: ../gnomemusic/view.py:348 ../gnomemusic/view.py:1535
+msgid "Albums"
+msgstr "الألبومات"
+
+#: ../gnomemusic/view.py:430 ../gnomemusic/view.py:1537
+msgid "Songs"
+msgstr "الأغاني"
+
+#: ../gnomemusic/view.py:594 ../gnomemusic/view.py:1536
+msgid "Artists"
+msgstr "الفنّانون"
+
+#: ../gnomemusic/view.py:639 ../gnomemusic/view.py:641
+#: ../gnomemusic/widgets.py:451
+msgid "All Artists"
+msgstr "كلّ الفنانين"
+
+#: ../gnomemusic/view.py:800 ../gnomemusic/view.py:1538
+msgid "Playlists"
+msgstr "قوائم التشغيل"
+
+#: ../gnomemusic/view.py:1080
+#, python-format
+msgid "%d Song"
+msgid_plural "%d Songs"
+msgstr[0] "لا أغاني (%d)"
+msgstr[1] "أغنية واحدة (%d)"
+msgstr[2] "أغنيتان (%d)"
+msgstr[3] "%d أغاني"
+msgstr[4] "%d أغنية"
+msgstr[5] "%d أغنية"
+
+#: ../gnomemusic/widgets.py:677
+msgid "New Playlist"
+msgstr "قائمة تشغيل جديدة"
+
+#: ../gnomemusic/window.py:226
+msgid "Empty"
+msgstr "فارغ"
+
+#: ../data/AboutDialog.ui.in.h:2
+msgid "Copyright © 2013 GNOME Music Developers"
+msgstr "حقوق النسخ © 2013 مطوّرو موسيقى جنوم"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "برمجية جنوم لتشغيل الموسيقى وإدارتها."
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "زُر موقع وِب موسيقى جنوم"
+
+#: ../data/AboutDialog.ui.in.h:5
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+"موسيقى جنوم برنامج حر؛ بإمكانك إعادة توزيعه و/أو تعديله تحت شروط الرخصة "
+"العمومية العامة لجنو والتي نشرتها منظمة البرمجيات الحرة؛ سواء الإصدارة 2 من "
+"الرخصة أو أي إصدارة بعدها حسب رغبتك.\n"
+"\n"
+"يوزّع موسيقى جنوم على أمل أن يكون مفيدًا لمن يستخدمه، دون أدنى مسؤولية؛ ولا "
+"حتى أي ضمان يضمن صلاحية العرض في السوق أو توافقه مع أي استخدام محدد. يمكنك "
+"مراجعة الرخصة العمومية العامة لجنو لمزيد من التفاصيل.\n"
+"\n"
+"من المفترض أن تكون قد استلمت نسخة من رخصة جنو العامةمع موسيقى جنوم؛ في حال "
+"عدم استلامك لذلك، يمكنك مكاتبة:\n"
+"Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA "
+"02110-1301 USA.\n"
+"\n"
+"يمنح كاتبو موسيقى جنوم إذن استخدام ملحقات GStreamer غير المتوافقة مع GPL "
+"وتوزيعها مع GStreamer وموسيقى جنوم. هذا الإذن هو تجاوز للأذون الممنوحة من "
+"رخصة GPL التي أُصدر موسيقى جنوم بها. إن عدّلت هذه الشِفرة، قد ترغب بتوسيع هذا "
+"الاستثناء إلى إصدار الشِفرة خاصّتك، ولكنك لست ملزمًا بذلك. إن لم ترغب بذلك، "
+"احذف بيان الاستثناء هذا من الإصدار خاصّتك."
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "أُصدر في"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "طول التشغيل"
+
+#: ../data/app-menu.ui.h:1
+msgid "_New Playlist"
+msgstr "قائمة تشغيل _جديدة"
+
+#: ../data/app-menu.ui.h:2
+msgid "_Help"
+msgstr "م_ساعدة"
+
+#: ../data/app-menu.ui.h:3
+msgid "_About"
+msgstr "_عنْ"
+
+#: ../data/app-menu.ui.h:4
+msgid "_Quit"
+msgstr "أ_نهِ"
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "اخلط"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "كرّر الكلّ"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "كرّر الأغنية"
+
+#: ../data/PlayerToolbar.ui.h:4
+msgid "Shuffle/Repeat Off"
+msgstr "أوقف الخلط/التكرار"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No Music Found"
+msgstr "لم يُعثر على موسيقى"
+
+#: ../data/headerbar.ui.h:1
+msgid "Select All"
+msgstr "حدّد الكلّ"
+
+#: ../data/headerbar.ui.h:2
+msgid "Select None"
+msgstr "حدّد لا شيء"
+
+#: ../data/headerbar.ui.h:4
+msgid "Search"
+msgstr "ابحث"
+
+#: ../data/headerbar.ui.h:5 ../data/PlaylistDialog.ui.h:3
+msgid "Select"
+msgstr "اختر"
+
+#: ../data/headerbar.ui.h:6 ../data/PlaylistDialog.ui.h:2
+msgid "Cancel"
+msgstr "ألغِ"
+
+#: ../data/headerbar.ui.h:7
+msgid "Back"
+msgstr "ارجع"
+
+#: ../data/SelectionToolbar.ui.h:1
+msgid "Add to Playlist"
+msgstr "أضف إلى قائمة التشغيل"
+
+#: ../data/SelectionToolbar.ui.h:2
+msgid "Remove from Playlist"
+msgstr "أزِل من قائمة التشغيل"
+
+#: ../data/PlaylistControls.ui.h:1
+msgid "_Play"
+msgstr "_شغّل"
+
+#: ../data/PlaylistControls.ui.h:2
+msgid "_Delete"
+msgstr "اح_ذف"
+
+#: ../data/PlaylistDialog.ui.h:1
+msgid "Select Playlist"
+msgstr "اختر قائمة تشغيل"
+
+#~ msgid "Load More"
+#~ msgstr "تحميل المزيد"
+
+#~ msgid "Loading..."
+#~ msgstr "تحميل ..."
diff --git a/po/as.po b/po/as.po
new file mode 100644
index 00000000..4d869864
--- /dev/null
+++ b/po/as.po
@@ -0,0 +1,399 @@
+# Assamese translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# ngoswami <ngoswami@redhat.com>, 2013, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-08-14 06:56+0000\n"
+"PO-Revision-Date: 2014-08-14 17:58+0530\n"
+"Last-Translator: Nilamdyuti Goswami <ngoswami@redhat.com>\n"
+"Language-Team: Assamese <kde-i18n-doc@kde.org>\n"
+"Language: as\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "উইন্ডোৰ আকাৰ"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "উইন্ডোৰ আকাৰ (প্ৰস্থ আৰু উচ্চতা)"
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "উইন্ডোৰ অৱস্থান"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "উইন্ডোৰ অৱস্থান (x আৰু y)।"
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "উইন্ডোৰ সৰ্বাধিক আকাৰ"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "উইন্ডোৰ সৰ্বাধিক আকাৰ অৱস্থা।"
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "প্লেবেক পুনৰাবৃত্তি অৱস্থা"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: ../data/org.gnome.Music.gschema.xml.h:9
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: \"none\" (repeat and shuffle are off), \"song"
+"\" (repeat current song), \"all\" (repeat playlist, no shuffle), \"shuffle"
+"\" (shuffle playlist, presumes repeat all)."
+msgstr ""
+"মানে চিনাক্ত কৰে সংগ্ৰহৰে প্লেবেক পুনৰাবৃত্তি কৰা হব নে যাদৃচ্ছিক কৰা হব। "
+"অনুমোদিত "
+"মান: \"none\" (পুনৰাবৃত্তি আৰু ছাফল বন্ধ থাকে), \"song\" (বৰ্তমান গীতৰ "
+"পুনৰাবৃত্তি), "
+"\"all\" (প্লেলিস্টৰ পুনৰাবৃত্তি, ছাফল নাই), \"shuffle\" (প্লেলিস্ট ছাফল কৰক, "
+"পুনৰাবৃত্তি ভাৱি লয়)।"
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "Search mode"
+msgstr "সন্ধান অৱস্থা"
+
+#: ../data/org.gnome.Music.gschema.xml.h:11
+msgid "If true, the search bar is shown."
+msgstr "যদি সত্য, সন্ধান বাৰ দেখুৱা হয়।"
+
+#: ../data/gnome-music.desktop.in.h:1 ../gnomemusic/application.py:50
+#: ../gnomemusic/application.py:112 ../gnomemusic/window.py:62
+#: ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "সংগীত"
+
+#: ../data/gnome-music.desktop.in.h:2
+msgid "Music Player"
+msgstr "সংগীত প্লেয়াৰ"
+
+#: ../data/gnome-music.desktop.in.h:3 ../data/gnome-music.appdata.xml.in.h:2
+msgid "Play and organize your music collection"
+msgstr "আপোনাৰ সংগীত সংগ্ৰহ বজাওক আৰু সংগঠিত কৰক"
+
+#: ../data/gnome-music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "GNOME সংগীত"
+
+#: ../data/gnome-music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "সংগীত হল নতুন GNOME সংগীত বজোৱা এপ্লিকেচন।"
+
+#: ../gnomemusic/albumArtCache.py:100 ../gnomemusic/albumArtCache.py:108
+msgid "Untitled"
+msgstr "শীৰ্ষকহীন"
+
+#: ../gnomemusic/mpris.py:133 ../gnomemusic/notification.py:100
+#: ../gnomemusic/player.py:400 ../gnomemusic/view.py:577
+#: ../gnomemusic/view.py:964 ../gnomemusic/view.py:1291
+msgid "Unknown Album"
+msgstr "অজ্ঞাত এলবাম"
+
+#: ../gnomemusic/mpris.py:149 ../gnomemusic/notification.py:98
+#: ../gnomemusic/player.py:391 ../gnomemusic/view.py:286
+#: ../gnomemusic/view.py:486 ../gnomemusic/view.py:720
+#: ../gnomemusic/view.py:1068 ../gnomemusic/view.py:1289
+#: ../gnomemusic/view.py:1320 ../gnomemusic/widgets.py:184
+#: ../gnomemusic/widgets.py:563
+msgid "Unknown Artist"
+msgstr "অজ্ঞাত শিল্পী"
+
+#: ../gnomemusic/notification.py:89
+msgid "Not playing"
+msgstr "বজোৱা নাই"
+
+#. TRANSLATORS: by refers to the artist, from to the album
+#: ../gnomemusic/notification.py:104
+#, python-format
+msgid "by %s, from %s"
+msgstr "%s দ্বাৰা, %s ৰ পৰা"
+
+#: ../gnomemusic/notification.py:130 ../data/PlayerToolbar.ui.h:5
+msgid "Previous"
+msgstr "পূৰ্বৱৰ্তী"
+
+#: ../gnomemusic/notification.py:133 ../gnomemusic/player.py:348
+msgid "Pause"
+msgstr "বিৰাম দিয়ক"
+
+#: ../gnomemusic/notification.py:136 ../gnomemusic/player.py:351
+#: ../data/PlayerToolbar.ui.h:6
+msgid "Play"
+msgstr "বজাওক"
+
+#: ../gnomemusic/notification.py:138 ../data/PlayerToolbar.ui.h:7
+msgid "Next"
+msgstr "পৰৱৰ্তী"
+
+#: ../gnomemusic/searchbar.py:30 ../gnomemusic/searchbar.py:73
+msgid "All"
+msgstr "সকলো"
+
+#: ../gnomemusic/searchbar.py:31
+#| msgid "Artists"
+msgid "Artist"
+msgstr "শিল্পী"
+
+#: ../gnomemusic/searchbar.py:32
+#| msgid "Albums"
+msgid "Album"
+msgstr "এলবাম"
+
+#: ../gnomemusic/searchbar.py:33
+msgid "Track Title"
+msgstr "ট্ৰেকৰ শীৰ্ষক"
+
+#: ../gnomemusic/searchbar.py:74
+msgid "Local"
+msgstr "স্থানীয়"
+
+#: ../gnomemusic/searchbar.py:176
+msgid "Sources"
+msgstr "উৎসসমূহ"
+
+#: ../gnomemusic/searchbar.py:183
+msgid "Match"
+msgstr "মিল"
+
+#: ../gnomemusic/view.py:201 ../gnomemusic/widgets.py:225
+#: ../gnomemusic/widgets.py:442 ../gnomemusic/window.py:278
+#, python-format
+msgid "Selected %d item"
+msgid_plural "Selected %d items"
+msgstr[0] "নিৰ্বাচিত %d বস্তু"
+msgstr[1] "নিৰ্বাচিত %d বস্তুবোৰ"
+
+#: ../gnomemusic/view.py:203 ../gnomemusic/widgets.py:227
+#: ../gnomemusic/widgets.py:444 ../gnomemusic/window.py:282
+#: ../gnomemusic/window.py:294 ../data/headerbar.ui.h:3
+msgid "Click on items to select them"
+msgstr "বস্তুবোৰ নিৰ্বাচন কৰিবলৈ সিহতক ক্লিক কৰক"
+
+#: ../gnomemusic/view.py:340
+#, python-format
+msgid ""
+"No Music found!\n"
+" Put some files into the folder %s"
+msgstr ""
+"কোনো সংগীত পোৱা নগল!\n"
+" ফোল্ডাৰ %s ত কিছুমান ফাইল থওক"
+
+#: ../gnomemusic/view.py:348 ../gnomemusic/view.py:1535
+msgid "Albums"
+msgstr "এলবামসমূহ"
+
+#: ../gnomemusic/view.py:430 ../gnomemusic/view.py:1537
+msgid "Songs"
+msgstr "সংগীতবোৰ"
+
+#: ../gnomemusic/view.py:594 ../gnomemusic/view.py:1536
+msgid "Artists"
+msgstr "শিল্পীসকল"
+
+#: ../gnomemusic/view.py:639 ../gnomemusic/view.py:641
+#: ../gnomemusic/widgets.py:451
+msgid "All Artists"
+msgstr "সকলো শিল্পী"
+
+#: ../gnomemusic/view.py:800 ../gnomemusic/view.py:1538
+msgid "Playlists"
+msgstr "প্লেলিস্টসমূহ"
+
+#: ../gnomemusic/view.py:1080
+#, python-format
+#| msgid "Songs"
+msgid "%d Song"
+msgid_plural "%d Songs"
+msgstr[0] "%d গান"
+msgstr[1] "%d গানসমূহ"
+
+#: ../gnomemusic/widgets.py:273 ../gnomemusic/widgets.py:311
+#, python-format
+msgid "%d min"
+msgstr "%d মিন"
+
+#: ../gnomemusic/widgets.py:677
+#| msgid "_New Playlist"
+msgid "New Playlist"
+msgstr "নতুন প্লেলিস্ট"
+
+#: ../gnomemusic/window.py:226
+msgid "Empty"
+msgstr "ৰিক্ত"
+
+#: ../data/AboutDialog.ui.in.h:2
+msgid "Copyright © 2013 GNOME Music Developers"
+msgstr "স্বত্বাধিকাৰ © ২০১৩ GNOME সংগীত উন্নয়নকাৰীসকল"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "GNOME ৰ বাবে এটা সংগীত প্লেয়াৰ আৰু ব্যৱস্থাপনা এপ্লিকেচন।"
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "GNOME সংগীত ৱেবছাইটলৈ যাওক"
+
+#: ../data/AboutDialog.ui.in.h:5
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+"GNOME সংগীত এটা বিনামুলিয়া চফ্টৱেৰ; আপুনি Free Software Foundation ৰ দ্বাৰা "
+"প্ৰকাশিত GNU General Public License ৰ চুক্তিসমূহৰ অন্তৰ্গত ইয়াক পুনৰ বিলাব "
+"পাৰিব "
+"অথবা সলনি কৰিব পাৰিব; হৈতো অনুজ্ঞাৰ সংস্কৰণ ২, অথবা (আপুনাৰ বিকল্পত) যিকোনো "
+"পৰৱৰ্তী সংস্কৰণ।\n"
+"\n"
+"GNOME সংগীত এইটো আশাত বিলোৱা হৈছে যে ই ব্যৱহাৰযোগ্য হ'ব, কিন্তু কোনো ৱাৰেন্টি "
+"নথকাকৈ; ব্যৱসায়ীক অথবা কোনো এটা বিশেষ কাৰণৰ যোগ্যতাৰ বাবে বুজুৱা ৱাৰেন্টি "
+"নথকাকৈ। অধিক জানিবলৈ GNU General Public License চাওক। \n"
+"\n"
+"আপুনি হৈতো ইতিমধ্যে GNOME সংগীতৰ সৈতে GNU General Public License ৰ কপি এটা "
+"পাইছে। যদি নাই , Free Software Foundation, Inc., 51 Franklin Street, Fifth "
+"Floor, Boston, MA 02110-1301, USA লৈ লিখক।\n"
+"\n"
+"GNOME সংগীত লেখকসকলে ইয়াৰ দ্বাৰা GStreamer আৰু GNOME সংগীতৰ সৈতে non-GPL সংগত "
+"GStreamer প্লাগিনসমূহ ব্যৱহাৰ আৰু একেলগে বিতৰণ কৰাৰ অনুমতি দিছে। এই অনুমতি "
+"GNOME "
+"সংগীতক অনুজ্ঞিত কৰা GPL অনুজ্ঞা দ্বাৰা প্ৰদান কৰা অনুমতিসমূহৰ ওপৰত আৰু অধিক "
+"বিস্তাৰিত। "
+"যদি আপুনি এই ক'ড পৰিবৰ্তন কৰে, আপুনি এই ব্যতিক্ৰমক আপোনাৰ ক'ডৰ সংস্কৰণলৈ "
+"প্ৰসাৰন "
+"কৰিব পাৰে, কিন্তু আপুনি এনেকুৱা কৰিবলৈ বাধ্য নহয়। যদি আপুনি এনেকুৱা কৰিব "
+"নিবিচাৰে, "
+"এই ব্যতিক্ৰম বিবৃতিক আপোনাৰ সংস্কৰণৰ পৰা মচি পেলাব।"
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "উন্মোচিত"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "চলাৰ দৈৰ্ঘ্য"
+
+#: ../data/app-menu.ui.h:1
+msgid "_New Playlist"
+msgstr "নতুন প্লেলিস্ট (_N)"
+
+#: ../data/app-menu.ui.h:2
+msgid "_Help"
+msgstr "সহায় (_H)"
+
+#: ../data/app-menu.ui.h:3
+msgid "_About"
+msgstr "বিষয়ে (_A)"
+
+#: ../data/app-menu.ui.h:4
+msgid "_Quit"
+msgstr "প্ৰস্থান কৰক (_Q)"
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "সানমিহলি কৰক"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "সকলো পুনৰাবৃত্তি কৰক"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "গান পুনৰ বজাওক"
+
+#: ../data/PlayerToolbar.ui.h:4
+msgid "Shuffle/Repeat Off"
+msgstr "সানমিহলি/পুনৰাবৃত্তি বন্ধ"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No Music Found"
+msgstr "কোনো সংগীত পোৱা নগল"
+
+#: ../data/headerbar.ui.h:1
+msgid "Select All"
+msgstr "সকলো বাছক"
+
+#: ../data/headerbar.ui.h:2
+msgid "Select None"
+msgstr "একো নাবাছিব"
+
+#: ../data/headerbar.ui.h:4
+#| msgid "Search mode"
+msgid "Search"
+msgstr "সন্ধান কৰক"
+
+#: ../data/headerbar.ui.h:5 ../data/PlaylistDialog.ui.h:3
+#| msgid "Select All"
+msgid "Select"
+msgstr "বাছক"
+
+#: ../data/headerbar.ui.h:6 ../data/PlaylistDialog.ui.h:2
+msgid "Cancel"
+msgstr "বাতিল কৰক"
+
+#: ../data/headerbar.ui.h:7
+msgid "Back"
+msgstr "পিছলৈ"
+
+#: ../data/SelectionToolbar.ui.h:1
+msgid "Add to Playlist"
+msgstr "প্লেলিস্টলৈ যোগ কৰক"
+
+#: ../data/SelectionToolbar.ui.h:2
+#| msgid "Add to Playlist"
+msgid "Remove from Playlist"
+msgstr "প্লেলিস্টৰ পৰা আতৰাওক"
+
+#: ../data/PlaylistControls.ui.h:1
+#| msgid "Play"
+msgid "_Play"
+msgstr "বজাওক (_P)"
+
+#: ../data/PlaylistControls.ui.h:2
+msgid "_Delete"
+msgstr "মচি পেলাওক (_D)"
+
+#: ../data/PlaylistDialog.ui.h:1
+#| msgid "Select All"
+msgid "Select Playlist"
+msgstr "প্লেলিস্ট বাছক"
+
+#~ msgid "Load More"
+#~ msgstr "অধিক ল'ড কৰক"
+
+#~ msgid "Loading..."
+#~ msgstr "ল'ড কৰা হৈছে..."
+
+#~| msgid "_Now Playing"
+#~ msgid "Now _Playing"
+#~ msgstr "এতিয়া বজোৱা হৈছে (_P)"
diff --git a/po/be.po b/po/be.po
new file mode 100644
index 00000000..ef8eafe9
--- /dev/null
+++ b/po/be.po
@@ -0,0 +1,659 @@
+# Belarusian translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Ihar Hrachyshka <ihar.hrachyshka@gmail.com>, 2013, 2014.
+# Yuras Shumovich <shumovichy@gmail.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-07-29 23:48+0300\n"
+"Last-Translator: Yuras Shumovich <shumovichy@gmail.com>\n"
+"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
+"Language: be\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\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"
+"X-Generator: Poedit 3.3.2\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Музыка"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Прайграванне і ўпарадкаванне музычнай калекцыі"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Просты і прыемны спосаб слухаць музыку."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Шукайце трэкі ў сваёй лакальнай калекцыі, карыстайцеся аўтаматычна "
+"згенерыраванымі спісамі прайгравання або дадайце ўласны."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Распрацоўшчыкі «Музыка GNOME»"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Музычны прайгравальнік"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Музыка;Музычны;Прайгравальнік;Плэер;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Памер акна"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Памер акна (шырыня і вышыня)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Разгортванне акна"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Стан акна – разгорнута."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Рэжым паўтору прайгравання"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Значэнне ключа вызначае, ці трэба паўтараць або выпадкова прайграваць "
+"музычную калекцыю. Магчымыя значэнні: \"none\" (паўтор і выпадковае "
+"прайграванне выключаныя), \"song\" (паўтор бягучай песні), \"all\" (паўтор "
+"спіса прайгравання без выпадковасці) і \"shuffle\" (выпадковае прайграванне "
+"спіса, магчыма з паўторам)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Уключыць ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Уключыць або адключыць ReplayGain для альбомаў"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Блакіраваць прыпыненне працы камп'ютара"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Уключыць або адключыць блакіраванне прыпынення працы падчас прайгравання "
+"музыкі"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Адпраўляць гісторыю праслуханай музыкі на Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Уключыць або адключыць адпраўку музыкальнага профілю і звестак, якая песня "
+"\"прайграецца зараз\" на Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Прайграваць"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Прайграваць"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Дадаць у _Абраныя песні"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Дадаць у спіс прайгравання…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Уліковы запіс Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Адпраўляць гісторыю праслуханай музыкі"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Спалучэнні клавіш"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Даведка"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Аб праграме"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Вітаем у праграме Музыка"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Меню"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Выбраць"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Скасаваць"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Пошук"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Назад"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Агульнае"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Закрыць акно"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Пошук"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Даведка"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Спалучэнні клавіш"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Прайграванне"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Прайграванне/паўза"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Наступная песня"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Папярэдняя песня"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Укл/выкл паўтор"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Укл/выкл тасаванне"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Навігацыя"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Перайсці да альбомаў"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Перайсці да выканаўцаў"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Перайсці да песень"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Перайсці да спісаў прайгравання"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Назад"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm — гэта сэрвіс пошуку музыкі, які дае асабістыя рэкамендацыі, "
+"заснаваныя на праслуханай вамі музыцы."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Адпраўка звестак пра музыку не наладжана"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Увайдзіце ў свой уліковы запіс Last.fm, каб адпраўляць гісторыю праслуханай "
+"музыкі."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Увайсці"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Папярэдні"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Наступны"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Выдаліць"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Перайменаваць…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Назва спіса прайгравання"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Гатова"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Увядзіце назву вашага першага спіса прайгравання"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "С_тварыць"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Новы спіс прайгравання…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Дадаць"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Дадаць у спіс прайгравання"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Дадаць"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Выканаўцы"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Усе"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Альбомы"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Песні"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Вылучыць усё"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Скасаваць вылучэнне"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Каб вылучыць аб'екты, пстрыкайце ў іх"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Дадаць у спіс прайгравання"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Выдаліць са спіса прайгравання"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Праект GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Launchpad translators"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Аўтарскае права Распрацоўшчыкі «Музыка GNOME»"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Пераклад"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Найчасцей прайгранае"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Ніколі не прайгранае"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Нядаўна прайгранае"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Нядаўна дададзенае"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Абраныя песні"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Не ўдалося прайграць гэты файл"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Шукаць у {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " і "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "Каб прайграць гэты файл, патрабуецца {}, але ён не ўсталяваны."
+msgstr[1] "Каб прайграць гэты файл, патрабуюцца {}, але яны не ўсталяваны."
+msgstr[2] "Каб прайграць гэты файл, патрабуюцца {}, але яны не ўсталяваны."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Прайграванне музыкі"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Выпадковы парадак і паўтор выключаны"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Паўтараць песню"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Паўтараць усё"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Выпадковы парадак"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Спіс прайгравання {} выдалены"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Адрабіць"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} выдалена з {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Невядомы альбом"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Невядомы выканаўца"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Каталог Музыкі XDG не зададзены."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "папкі Музыка"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Тут будзе паказвацца змесціва з {}."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Музыка не знойдзена"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Паспрабуйце іншы пошукавы запыт"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Музыцы GNOME не ўдалося падлучыцца да Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Немагчыма праіндэксаваць музычная файлы, калі не запушчаны Tracker."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Магчыма, што ў вашай сістэме састарэлая версія Tracker."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Патрабуецца Tracker версіі 3.0.0 або навейшай."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Спісы прайгравання"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Знойдзеныя выканаўцы"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Знойдзеныя альбомы"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} хвіліна"
+msgstr[1] "{} хвіліны"
+msgstr[2] "{} хвілін"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Дыск {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Выбрана {} песня"
+msgstr[1] "Выбрана {} песні"
+msgstr[2] "Выбрана {} песень"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Ваша гісторыя праслухвання адпраўлена на Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Ваша гісторыя праслухвання не адпраўлена на Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Вы ўвайшлі як {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Наладзіць"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Прыпыніць"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} песня"
+msgstr[1] "{} песні"
+msgstr[2] "{} песень"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Пошук песень, выканаўцаў і спісаў прайгравання"
+
+#~ msgid "GNOME Music"
+#~ msgstr "Музыка GNOME"
+
+#~ msgid "Window position"
+#~ msgstr "Становішча акна"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Становішча акна (x, y)."
+
+#~ msgid "Copyright © 2018 GNOME Music Developers"
+#~ msgstr "Аўтарскае права © 2018 Распрацоўшчыкі «Музыка GNOME»"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Музычны прайгравальнік і праграма кіравання музыкай для GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Наведаць сайт праграмы Музыка GNOME"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "Музыка GNOME з'яўляецца свабодным праграмным забеспячэннем. Вы можаце "
+#~ "распаўсюджваць гэту праграму згодна з умовамі Агульнай Грамадскай "
+#~ "Ліцэнзіі GNU (GPL), апублікаванай Фондам свабоднага праграмнага "
+#~ "забеспячэння, версіі 2 ці любой пазнейшай.\n"
+#~ "\n"
+#~ "Музыка GNOME распаўсюджваецца з надзеяй, што яна будзе карыснай, але без "
+#~ "ніякіх гарантый, у тым ліку камерцыйнай вартасці праграмы і наогул яе "
+#~ "карысці. Каб атрымаць больш інфармацыі глядзіце тэкст Агульнай "
+#~ "Грамадскай Ліцэнзіі GNU (GPL).\n"
+#~ "\n"
+#~ "Вы павінны былі атрымаць копію Агульнай Грамадскай Ліцэнзіі GNU (GPL) "
+#~ "разам з гэтай праграмай. Калі вы не атрымалі яе, паведаміце пра гэта "
+#~ "Фонду свабоднага праграмнага забеспячэння на адрас: the Free Software "
+#~ "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 "
+#~ "USA.\n"
+#~ "\n"
+#~ "Аўтары Музыкі GNOME даюць дазвол на распаўсюджванне ўбудоў GStreamer, не "
+#~ "сумяшчальных з GPL, разам з GStreamer і Музыкай GNOME. Гэты дазвол "
+#~ "носіць дадатковы характар і дапаўняе правы, гарантаваныя ліцэнзіяй GPL, "
+#~ "якая ахоўвае Музыку GNOME. Калі вы змяняеце гэты код, вы можаце "
+#~ "распаўсюдзіць гэты дазвол на вашу версію коду, хаця вы і не абавязаны "
+#~ "гэта рабіць. Калі вы не хочаце рабіць гэта, проста выдаліце тэкст гэтага "
+#~ "дадатковага дазволу."
+
+#~ msgid "Loading"
+#~ msgstr "Загрузка"
+
+#~ msgid "_Undo"
+#~ msgstr "_Адрабіць"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Дадаць у спіс прайгравання…"
+
+#~ msgid "Remove From Playlist"
+#~ msgstr "Выдаліць са спіса прайгравання"
diff --git a/po/bg.po b/po/bg.po
new file mode 100644
index 00000000..846799f4
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,584 @@
+# Bulgarian translation for gnome-music po-file.
+# Copyright (C) 2016 Free Software Foundation, Inc.
+# Copyright (C) 2021, 2022 Alexander Shopov.
+# This file is distributed under the same license as the gnome-music package.
+# Hristo Kozhuharov "XTard" <ickomcdevill@gmail.com>, 2016.
+# Alexander Shopov <ash@kambanaria.org>, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2022-09-11 18:29+0000\n"
+"PO-Revision-Date: 2022-09-12 22:56+0200\n"
+"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
+"Language-Team: Bulgarian <dict-notifications@fsa-bg.org>\n"
+"Language: bg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:236
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Музика"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Слушайте и организирайте колекцията си от музика"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Лесен и удобен начин да слушате музика."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Откриване на песни в локалната ви колекция, ползване на автоматично или "
+"ръчно създадени списъци за изпълнение."
+
+#: data/org.gnome.Music.appdata.xml.in.in:167
+msgid "The GNOME Music developers"
+msgstr "Разработчиците на „Музика на GNOME“"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Изпълнение на музика"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "music;player;музика;плеър;песни;слуша;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Размер на прозореца"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Размер на прозореца (широчина и височина)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Прозорецът е максимизиран"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Прозорецът е в максимизирано състояние."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Режим на повторение"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Стойносттa определя дали да се повтарят или да се възпроизвеждат разбъркано "
+"нещата от колекцията. Позволени стойности са: „none“ (без повтаряне или "
+"разбъркване), „song“ (повтаряне на текущата песен), „all“ (повтаряне без "
+"разбъркване на списък за изпълнение) и „shuffle“ (повтаряне на списък за "
+"изпълнение с разбъркване)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Включване на автоматичното регулиране на звука"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Позволяване или не на автоматичното регулиране на звука за албуми"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Предотвратяване на заспиване на системата"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Позволяване или не на заспиване на системата докато се изпълнява музика"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Докладване на изпълняваната музика към Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Позволяване или не на пращане на информацията за слушаната музика към Last."
+"fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Изпълнение"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Изпълнение"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Добавяне в любими песни…"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Добавяне в списък…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Регистрация за Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Публикуване на слушаната музика"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Клавишни комбинации"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "Помо_щ"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Относно „Музика“"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Добре дошли в „Музика“"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Меню"
+
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Избор"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Отказ"
+
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Търсене"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "Назад"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Общи"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Затваряне на прозорец"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Търсене"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Помощ"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Клавишни комбинации"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Изпълнение"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Изпълнение/пауза"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Следваща песен"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Предишна песен"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Повтаряне"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Разбъркване"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Навигация"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Към албумите"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Към изпълнителите"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Към песните"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Към списъците"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Назад"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm е услуга, за откриване на музика. Тя дава препоръки на базата на "
+"това, което слушате."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Публикуването на музика не е настроено"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Впишете се в регистрацията си в Last.fm, за да публикувате каква музика "
+"слушате."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Вписване"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Предишна"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Следваща"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Изтриване"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "Пре_именуване…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Име на списъка за изпълнение"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Готово"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Въведете име за списъка за изпълнение"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Създаване"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Нов списък…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Добавяне"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Добавяне в списък"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Добавяне"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Автори"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Преглед на всички"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Албуми"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Песни"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Избор на всички"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Избор на някои"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Изберете елементи чрез натискане"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Добавяне в списък"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Изваждане от списък"
+
+#: gnomemusic/about.py:238
+msgid "The GNOME Project"
+msgstr "Проектът GNOME"
+
+#: gnomemusic/about.py:242
+msgid "translator-credits"
+msgstr ""
+"Александър Шопов &lt;<a href='mailto:ash@kambanaria.org'>ash@kambanaria.org</"
+"a>&gt;\n"
+"Христо Кожухаров &lt;<a href='mailto:ickomcdevill@gmail."
+"com'>ickomcdevill@gmail.com</a>&gt;\n"
+"\n"
+"Проектът за превод на GNOME има нужда от подкрепа.\n"
+"Научете повече за нас на <a href='https://fsa-bg.org/project/gtp'>уеб сайта</"
+"a> ни.\n"
+"Докладвайте за грешки в превода в <a href='https://fsa-bg.org/project/gtp/"
+"newticket'>съответния раздел</a>."
+
+#: gnomemusic/about.py:246
+msgid "Copyright The GNOME Music Developers"
+msgstr "Авторски права: Разработчиците на „Музика на GNOME“"
+
+#: gnomemusic/about.py:249
+msgid "Translated by"
+msgstr "Преведено от"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Най-слушани"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Никога слушани"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Скоро слушани"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Скоро добавени"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Любими песни"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Файлът не може да се възпроизведе"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Търсене в {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " и "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "За да се пусне файлът е нужен {}, който не е инсталиран."
+msgstr[1] "За да се пусне файлът са нужни {}, които не са инсталирани."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Изпълнение на музика"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "Разбъркване"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Повтаряне на песента"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Повтаряне на всички"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr "Разбъркване/повтаряне изключено"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Списъкът „{}“ е премахнат"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Отмяна"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "„{}“ е извадена от „{}“"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Неизвестен албум"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Неизвестен автор"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Папката ви с музика (по XDG) не е настроена."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Папка с музика"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Съдържанието на „{}“ ще се появи тук."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Няма музика"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Друго търсене"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Музиката на GNOME не може да установи връзка с Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Файловете с музика не може да се индексират без Tracker."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Версията на Tracker в системата ви е стара."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Музиката на GNOME изисква версия поне 3.0.0."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Списъци за изпълнение"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Резултати — изпълнителни"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Резултати — албуми"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} минута"
+msgstr[1] "{} минути"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Диск {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Избрана е {} песен"
+msgstr[1] "Избрани са {} песни"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Информацията за изпълненията, които слушате, се публикува към Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr ""
+"Информацията за изпълненията, които слушате, не се публикува към Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Вписани сте като „{}“"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Настройки"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Пауза"
+
+# im not sure what stays on the place of %d, so there might be a mistake
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} песен"
+msgstr[1] "{} песни"
diff --git a/po/bs.po b/po/bs.po
new file mode 100644
index 00000000..f1249d69
--- /dev/null
+++ b/po/bs.po
@@ -0,0 +1,445 @@
+# Bosnian translation for bosnianuniversetranslation
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the bosnianuniversetranslation package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: bosnianuniversetranslation\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2015-02-26 20:04+0000\n"
+"PO-Revision-Date: 2015-03-02 08:59+0100\n"
+"Last-Translator: Merima Cisija <cisijam@gmail.com>\n"
+"Language-Team: Bosnian <bs@li.org>\n"
+"Language: bs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\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"
+"X-Launchpad-Export-Date: 2015-02-05 07:03+0000\n"
+"X-Generator: Poedit 1.7.4\n"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "Veličina prozora"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "Veličina prozora(sirina i visina)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "Pozicija prozora"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "Pozicija prozora (x i y)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "Uvećan prozor"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "Stanje uvećanog prozora."
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "Način ponavljanja reprodukcije"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: ../data/org.gnome.Music.gschema.xml.h:9
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: \"none\" (repeat and shuffle are off), \"song"
+"\" (repeat current song), \"all\" (repeat playlist, no shuffle), \"shuffle"
+"\" (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Vrijednost identificira da li ponoviti ili mješati reprodukciju kroz "
+"kolekciju. Dopuštene vrijednosti su: \"none\" (ponavljanje i mješanje su "
+"isključeni), \"song\" (ponavljam trenutne pjesme), \"all\" (ponoviti listu "
+"pjesama, nema mješanja), \"shuffle\" (mješanje liste pjesama pretpostavlja "
+"ponoviti sve)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "Search mode"
+msgstr "Režim traženja"
+
+#: ../data/org.gnome.Music.gschema.xml.h:11
+msgid "If true, the search bar is shown."
+msgstr "Ako je tačno,bar traženja je prikazan."
+
+#: ../data/org.gnome.Music.gschema.xml.h:12
+msgid "Notifications mode"
+msgstr "Režim koji podržava obavijesti"
+
+#: ../data/org.gnome.Music.gschema.xml.h:13
+msgid "Enables or disables playback notifications"
+msgstr "Omogućuje ili onemogućuje obavijesti za reprodukciju"
+
+#: ../data/org.gnome.Music.gschema.xml.h:14
+msgid "Max chars to display in track name on Artist view"
+msgstr "Paksimalan broj znakova u nazvu kompozicije za pogled izvođača"
+
+#: ../data/org.gnome.Music.gschema.xml.h:15
+msgid ""
+"This setting modifies the amount of chars for track title on Artist view "
+"before its been ellipsized. Set this to -1 to disable"
+msgstr "Ova postavka mijenja broj znakova za naslov kompozicije na "
+
+#: ../data/org.gnome.Music.gschema.xml.h:16
+msgid "Enable ReplayGain"
+msgstr "_Omogući „Replay Gain“ poboljšanje"
+
+#: ../data/org.gnome.Music.gschema.xml.h:17
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Omogućuje ili onemogućuje dobit izvođenja za albume"
+
+#: ../data/gnome-music.desktop.in.h:1 ../gnomemusic/application.py:50
+#: ../gnomemusic/application.py:113 ../gnomemusic/window.py:59
+#: ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "Muzika"
+
+#: ../data/gnome-music.desktop.in.h:2
+msgid "Music Player"
+msgstr "Muzički program"
+
+#: ../data/gnome-music.desktop.in.h:3 ../data/gnome-music.appdata.xml.in.h:2
+msgid "Play and organize your music collection"
+msgstr "Izvodite i organizirajte svoju muzičku zbirku"
+
+#: ../data/gnome-music.desktop.in.h:4
+msgid "Music;Player;"
+msgstr "Muzika;Plejer;"
+
+#: ../data/gnome-music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "GNOME muzika"
+
+#: ../data/gnome-music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "Music je nova muzička aplikacija GNOME."
+
+#: ../gnomemusic/albumArtCache.py:103 ../gnomemusic/albumArtCache.py:111
+msgid "Untitled"
+msgstr "Bez naslova"
+
+#: ../gnomemusic/mpris.py:148 ../gnomemusic/notification.py:100
+#: ../gnomemusic/player.py:454 ../gnomemusic/view.py:512
+#: ../gnomemusic/view.py:938 ../gnomemusic/view.py:1372
+msgid "Unknown Album"
+msgstr "Nepoznat album"
+
+#: ../gnomemusic/mpris.py:164 ../gnomemusic/notification.py:98
+#: ../gnomemusic/player.py:445 ../gnomemusic/view.py:222
+#: ../gnomemusic/view.py:432 ../gnomemusic/view.py:684
+#: ../gnomemusic/view.py:1124 ../gnomemusic/view.py:1370
+#: ../gnomemusic/view.py:1405 ../gnomemusic/widgets.py:234
+#: ../gnomemusic/widgets.py:638
+msgid "Unknown Artist"
+msgstr "Nepoznat izvođač"
+
+#: ../gnomemusic/notification.py:89
+msgid "Not playing"
+msgstr "Ne izvodi se"
+
+#. TRANSLATORS: by refers to the artist, from to the album
+#: ../gnomemusic/notification.py:104
+#, python-format
+msgid "by %s, from %s"
+msgstr "od %s , do %s"
+
+#: ../gnomemusic/notification.py:125 ../data/PlayerToolbar.ui.h:5
+msgid "Previous"
+msgstr "Prethodna"
+
+#: ../gnomemusic/notification.py:128 ../gnomemusic/player.py:402
+msgid "Pause"
+msgstr "Pauziraj"
+
+#: ../gnomemusic/notification.py:131 ../gnomemusic/player.py:405
+#: ../data/PlayerToolbar.ui.h:6
+msgid "Play"
+msgstr "Pokreni"
+
+#: ../gnomemusic/notification.py:133 ../data/PlayerToolbar.ui.h:7
+msgid "Next"
+msgstr "Sljedeći"
+
+#. TRANSLATORS: this is a playlist nami
+#: ../gnomemusic/playlists.py:49
+msgid "Most Played"
+msgstr "Sa najviše izvođenja"
+
+#. TRANSLATORS: this is a playlist nami
+#: ../gnomemusic/playlists.py:56
+msgid "Never Played"
+msgstr "Nikada nisu izvođene"
+
+#. TRANSLATORS: this is a playlist nami
+#: ../gnomemusic/playlists.py:63
+msgid "Recently Played"
+msgstr "Nedavno izvođene"
+
+#. TRANSLATORS: this is a playlist nami
+#: ../gnomemusic/playlists.py:70
+msgid "Recently Added"
+msgstr "Nedavno dodane"
+
+#. TRANSLATORS: this is a playlist nami
+#: ../gnomemusic/playlists.py:77
+msgid "Favorite Songs"
+msgstr "Omiljene pjesme"
+
+#. TRANSLATORS: _("the") should bje a space-separated list of all-lowercase articles
+#. (such as 'the') that should bje ignored when alphabetizing artists/albums. This
+#. list should include 'the' regardless of language. If some articles occur more
+#. frequently than others, most common should appear first, least common last.
+#: ../gnomemusic/query.py:69
+msgid "the a an"
+msgstr "the a an"
+
+#: ../gnomemusic/searchbar.py:58 ../gnomemusic/searchbar.py:101
+msgid "All"
+msgstr "Svi"
+
+#: ../gnomemusic/searchbar.py:59
+msgid "Artist"
+msgstr "Izvođač"
+
+#: ../gnomemusic/searchbar.py:60
+msgid "Album"
+msgstr "Album"
+
+#: ../gnomemusic/searchbar.py:61
+msgid "Track Title"
+msgstr "Naslov numere"
+
+#: ../gnomemusic/searchbar.py:102
+msgid "Local"
+msgstr "Lokalno"
+
+#: ../gnomemusic/searchbar.py:204
+msgid "Sources"
+msgstr "Izvori"
+
+#: ../gnomemusic/searchbar.py:211
+msgid "Match"
+msgstr "Poveži"
+
+#: ../gnomemusic/view.py:191 ../gnomemusic/widgets.py:275
+#: ../gnomemusic/widgets.py:515 ../gnomemusic/window.py:288
+#, python-format
+msgid "Selected %d item"
+msgid_plural "Selected %d items"
+msgstr[0] "Odabrana %d stavka"
+msgstr[1] "Odabrane %d stavke"
+msgstr[2] "Odabrano %d stavki"
+
+#: ../gnomemusic/view.py:193 ../gnomemusic/widgets.py:277
+#: ../gnomemusic/widgets.py:517 ../gnomemusic/window.py:292
+#: ../gnomemusic/window.py:304 ../data/headerbar.ui.h:3
+msgid "Click on items to select them"
+msgstr "Kliknite na stavke da ih označite"
+
+#: ../gnomemusic/view.py:278 ../gnomemusic/view.py:1628
+msgid "Albums"
+msgstr "Albumi"
+
+#: ../gnomemusic/view.py:369 ../gnomemusic/view.py:1630
+msgid "Songs"
+msgstr "Pjesme"
+
+#: ../gnomemusic/view.py:544 ../gnomemusic/view.py:1629
+msgid "Artists"
+msgstr "Izvođači"
+
+#: ../gnomemusic/view.py:590 ../gnomemusic/view.py:592
+#: ../gnomemusic/widgets.py:524
+msgid "All Artists"
+msgstr "Svi izvođači"
+
+#: ../gnomemusic/view.py:769 ../gnomemusic/view.py:1631
+msgid "Playlists"
+msgstr "Liste pjesama"
+
+#: ../gnomemusic/view.py:1135
+#, python-format
+msgid "%d Song"
+msgid_plural "%d Songs"
+msgstr[0] "%d Pjesma"
+msgstr[1] "%d Pjesme"
+msgstr[2] "%d Pjesama"
+
+#: ../gnomemusic/widgets.py:316 ../gnomemusic/widgets.py:350
+#, python-format
+msgid "%d min"
+msgstr "%d min"
+
+#: ../gnomemusic/widgets.py:762
+msgid "New Playlist"
+msgstr "Nova lista pjesama"
+
+#: ../gnomemusic/window.py:236
+msgid "Empty"
+msgstr "Prazno"
+
+#: ../gnomemusic/window.py:316
+msgid "_Undo"
+msgstr "_Poništi"
+
+#: ../gnomemusic/window.py:317
+#, python-format
+msgid "Playlist %s removed"
+msgstr "Uklonjena lista izvođenje %s"
+
+#: ../gnomemusic/window.py:341
+msgid "Loading"
+msgstr "Učitava se"
+
+#: ../data/AboutDialog.ui.in.h:2
+msgid "Copyright © 2013 GNOME Music Developers"
+msgstr "Autorska prava © 2013 GNOME Music Developers"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "muzička lista i upravljačka aplikacija za GNOME."
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "Posjetite stranicu GNOME Music"
+
+#: ../data/AboutDialog.ui.in.h:5
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+"Gnome Music je besplatan software; možete ga ponovo distribuirati i/ili "
+"izmjeniti pod uslovima GNU opće javne licence objavljeno od Free Sotware "
+"fondacije ; ili verzija 2 licence, ili (po svom izboru) bilo koje kasnije "
+"verzije.\n"
+"\n"
+"Trebali ste dobiti kopiju GNU opće javne licence uz GNOME Music; a ako ne "
+"pišite Free Software fonadaciji,, Inc., 51 Franklin Street, Fifth Floor, "
+"Boston, MA 02110-1301 USA.\n"
+"\n"
+"GNOME Music autori ovime daju dopuštenje za ne-GPL kompatibilni GStreamer "
+"dodatake koji će se koristiti i distribuirati zajedno s GStreamer i GNOME "
+"Music. Ovo odobrenje je iznad i izvan izdanoj dozvoli od GPL licence kojom "
+"je pokrivena i GNOME Music.Ako mjenjate vaš kod,možete pridružiti ovaj "
+"izuzetak vašoj verziji koda,ali niste obavezni uraditi.Ako ste sigurni da ne "
+"želite,izbrišite ovaj izuzetak iz vaše verzije."
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "Izdanje"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "Vrijeme trajanja"
+
+#: ../data/app-menu.ui.h:1
+msgid "_Help"
+msgstr "_Pomoć"
+
+#: ../data/app-menu.ui.h:2
+msgid "_About"
+msgstr "_O programu"
+
+#: ../data/app-menu.ui.h:3
+msgid "_Quit"
+msgstr "_Izlaz"
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "Izmiješaj"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "Ponovi sve"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "Ponovi pjesmu"
+
+#: ../data/PlayerToolbar.ui.h:4
+msgid "Shuffle/Repeat Off"
+msgstr "Izmješaj/isključi ponavljanje"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No music found"
+msgstr "Nije pronađena muzika"
+
+#: ../data/NoMusic.ui.h:2
+msgid "The contents of your music folder will appear here."
+msgstr "Sadržaj Vašeg direktorija sa muzikom će se pojaviti ovdje."
+
+#: ../data/headerbar.ui.h:1
+msgid "Select All"
+msgstr "Izaberi sve"
+
+#: ../data/headerbar.ui.h:2
+msgid "Select None"
+msgstr "Bez izbora"
+
+#: ../data/headerbar.ui.h:4
+msgid "Search"
+msgstr "Traži"
+
+#: ../data/headerbar.ui.h:5 ../data/PlaylistDialog.ui.h:3
+msgid "Select"
+msgstr "Odaberi"
+
+#: ../data/headerbar.ui.h:6 ../data/PlaylistDialog.ui.h:2
+msgid "Cancel"
+msgstr "Otkaži"
+
+#: ../data/headerbar.ui.h:7
+msgid "Back"
+msgstr "Nazad"
+
+#: ../data/SelectionToolbar.ui.h:1
+msgid "Add to Playlist"
+msgstr "Dodajte u listu za izvedbu"
+
+#: ../data/SelectionToolbar.ui.h:2
+msgid "Remove from Playlist"
+msgstr "Ukloni sa liste pjesama"
+
+#: ../data/PlaylistControls.ui.h:1
+msgid "_Play"
+msgstr "_Izvedi"
+
+#: ../data/PlaylistControls.ui.h:2
+msgid "_Delete"
+msgstr "_Izbriši"
+
+#: ../data/PlaylistControls.ui.h:3
+msgid "Playlist Name"
+msgstr "Naziv liste numera"
+
+#: ../data/PlaylistDialog.ui.h:1
+msgid "Select Playlist"
+msgstr "Izaberite listu numera"
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 00000000..c9df3f8a
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,584 @@
+# Catalan translation for gnome-calendar.
+# Copyright (C) 2012 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-calendar package.
+#
+# Jordi Mas i Hernandez <jmas@softcatala.org>, 2013, 2015, 2016, 2022
+# Pau Iranzo <paugnu@gmail.com>, 2013.
+# Gil Forcada <gilforcada@guifi.net>, 2014, 2018.
+# Jordi Serratosa <jordis@softcatala.cat>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2022-09-11 06:43+0100\n"
+"Last-Translator: Jordi Mas i Hernandez <jmas@softcatala.org>\n"
+"Language-Team: Catalan <tradgnome@softcatala.org>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 2.2.4\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Música"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Reproduïu i organitzeu la vostra col·lecció de música"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Una manera fàcil i agradable de reproduir música."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Trobeu cançons a la vostra col·lecció local, utilitzeu llistes de "
+"reproducció generades automàticament o creeu-ne de noves."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "L'equip de desenvolupament del Música del GNOME"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Reproductor de música"
+
+#. Translators: Search terms to find this application. Do NOT translate or
+#. localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Música;Reproductor;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Mida de la finestra"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Mida de la finestra (amplada i alçada)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Finestra maximitzada"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Estat de la finestra maximitzada."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Mode de repetició de la reproducció"
+
+#. Translators: Don't translate allowed values, just the description in the
+#. brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), “song” "
+"(repeat current song), “all” (repeat playlist, no shuffle), “shuffle” "
+"(shuffle playlist, presumes repeat all)."
+msgstr ""
+"El valor estableix si es reprodueix la col·lecció en mode de repetició o "
+"aleatori. Els valors que s'accepten són: «none» (cap, ni es repeteix ni es "
+"reprodueix aleatòriament), «song» (cançó, es repeteix la cançó actual), "
+"«all» (tot, repeteix la llista de reproducció, no es reprodueix "
+"aleatòriament) i «shuffle» (reprodueix aleatòriament la llista, se suposa "
+"que es repeteixen totes)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Habilita ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Habilita o inhabilita ReplayGain pels àlbums"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Inhibeix la suspensió del sistema"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Habilita o inhabilita la suspensió del sistema durant la reproducció de "
+"música"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Informa de l'històric de reproduccions a Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Activa o desactiva l'enviament de «scrobbles» i la informació de la "
+"«reproducció actual» a Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Reprodueix"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Reprodueix"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "_Cançons preferides"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Afegeix a la llista de reproducció…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Compte Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Informa de la música que escolteu"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Dreceres de teclat"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Ajuda"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Quant al Música"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Us donem la benvinguda al Música"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menú"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Selecciona"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Cancel·la"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Cerca"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Enrere"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "General"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Tanca la finestra"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Cerca"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Ajuda"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Dreceres"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Reprodueix"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Reprodueix/Fes una pausa"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Cançó següent"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Cançó anterior"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Commuta la repetició"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Commuta la mescla"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navegació"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Ves als àlbums"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Ves als artistes"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Ves a les cançons"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Ves a les llistes de reproducció"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Torna enrere"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm és un servei de descobriment de música que us dona recomanacions "
+"personalitzades basades en la música que escolteu."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "L'informe de la música no està configurat"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Inicieu la sessió amb el compte de Last.fm per a informar de la música que "
+"escolteu."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Inicia la sessió"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Anterior"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Següent"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Suprimeix"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Canvia el nom…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Nom de la llista de reproducció"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Fet"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Introduïu un nom per a la vostra primera llista de reproducció"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Crea"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Llista de reproducció nova…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Afegeix"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Afegeix a la llista de reproducció"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Afegeix"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artistes"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Mostra-ho tot"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Àlbums"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Cançons"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Selecciona-ho tot"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "No en seleccionis cap"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Feu clic als elements per a seleccionar-los"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Afegeix a la llista de reproducció"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Suprimeix de la llista de reproducció"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "El projecte GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Jordi Mas i Hernandez <jmas@softcatala.org>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright de l'equip de desenvolupament del Música del GNOME"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Traduït per"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Més reproduïdes"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Mai s'han reproduït"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Reproduccions recents"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Afegits recentment"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Cançons preferides"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "No s'ha pogut reproduir el fitxer"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Cerca a {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " i "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "Cal {} per a reproduir el fitxer, però no està instal·lat."
+msgstr[1] "Calen {} per a reproduir el fitxer, però no estan instal·lats."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Reproducció de música"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Aleatori/Repetició desactivada"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Repeteix la cançó"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Repeteix-ho tot"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Mescla"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "S'ha suprimit la llista de reproducció {}"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Desfés"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} suprimit de {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Àlbum desconegut"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Artista desconegut"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "El directori XDG de música no està configurat."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Carpeta de la música"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Els continguts de la {} apareixeran aquí."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "No s'ha trobat música"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Proveu una cerca diferent"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "El Música del GNOME no s'ha pogut connectar al Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Els fitxers de música no es poden indexar si el Tracker no s'està executant."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "El Tracker del sistema sembla obsolet."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "El Música necessita Tracker versió 3.0.0 o superior."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Llistes de reproducció"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Resultats d'artistes"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Resultats d'àlbums"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minut"
+msgstr[1] "{} minuts"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disc {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} cançó seleccionada"
+msgstr[1] "{} cançons seleccionades"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "S'informa de la música que escoleu a Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "No s'informa de la música que escoleu a Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Sessió iniciada com a {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Configura"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Fes una pausa"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} cançó"
+msgstr[1] "{} cançons"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Cerca cançons, artistes, àlbums i llistes de reproducció"
diff --git a/po/ca@valencia.po b/po/ca@valencia.po
new file mode 100644
index 00000000..2fa9160e
--- /dev/null
+++ b/po/ca@valencia.po
@@ -0,0 +1,628 @@
+# Catalan translation for gnome-calendar.
+# Copyright (C) 2012 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-calendar package.
+#
+# Jordi Mas i Hernandez <jmas@softcatala.org>, 2013, 2015, 2016
+# Pau Iranzo <paugnu@gmail.com>, 2013.
+# Gil Forcada <gilforcada@guifi.net>, 2014.
+# Jordi Serratosa <jordis@softcatala.cat>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2017-09-25 14:21+0000\n"
+"PO-Revision-Date: 2017-09-01 12:28+0200\n"
+"Last-Translator: Xavi Ivars <xavi.ivars@gmail.com>\n"
+"Language-Team: Catalan <tradgnome@softcatala.org>\n"
+"Language: ca-valencia\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 1.8.11\n"
+
+#: ../data/org.gnome.Music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "Música del GNOME"
+
+#: ../data/org.gnome.Music.appdata.xml.in.h:2
+#: ../data/org.gnome.Music.desktop.in.h:3
+msgid "Play and organize your music collection"
+msgstr "Reproduïu i organitzeu la col·lecció de música"
+
+#: ../data/org.gnome.Music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "El Música és la nova aplicació de reproducció de música del GNOME."
+
+#: ../data/org.gnome.Music.desktop.in.h:1 ../gnomemusic/application.py:53
+#: ../gnomemusic/application.py:102 ../gnomemusic/toolbar.py:90
+#: ../gnomemusic/window.py:68 ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "Música"
+
+#: ../data/org.gnome.Music.desktop.in.h:2
+msgid "Music Player"
+msgstr "Reproductor de música"
+
+#: ../data/org.gnome.Music.desktop.in.h:4
+msgid "Music;Player;"
+msgstr "Música;Reproductor;"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "Mida de la finestra"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "Mida de la finestra (amplària i alçària)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "Posició de la finestra"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "Posició de la finestra (x i y)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "Finestra maximitzada"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "Estat de la finestra maximitzada."
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "Mode de repetició de la reproducció"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: ../data/org.gnome.Music.gschema.xml.h:9
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"El valor estableix si es reprodueix la col·lecció en mode de repetició o "
+"aleatori. Els valors que s'accepten són: «none» (cap, ni es repeteix ni es "
+"reprodueix aleatòriament), «song» (cançó, es repeteix la cançó actual), "
+"«all» (tot, repeteix la llista de reproducció, no es reprodueix "
+"aleatòriament) i «shuffle» (reprodueix aleatòriament la llista, se suposa "
+"que es repeteixen totes)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "Search mode"
+msgstr "Mode de busca"
+
+#: ../data/org.gnome.Music.gschema.xml.h:11
+msgid "If true, the search bar is shown."
+msgstr "Si és cert, es mostra la barra de busca."
+
+#: ../data/org.gnome.Music.gschema.xml.h:12
+msgid "Notifications mode"
+msgstr "Mode de notificacions"
+
+#: ../data/org.gnome.Music.gschema.xml.h:13
+msgid "Enables or disables playback notifications"
+msgstr "Habilita o inhabilita les notificacions de reproducció"
+
+#: ../data/org.gnome.Music.gschema.xml.h:14
+msgid "Enable ReplayGain"
+msgstr "Habilita ReplayGain"
+
+#: ../data/org.gnome.Music.gschema.xml.h:15
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Habilita o inhabilita ReplayGain pels àlbums"
+
+#: ../data/org.gnome.Music.gschema.xml.h:16
+msgid "Inital state has been displayed"
+msgstr "S'ha mostrat l'estat inicial"
+
+#: ../data/org.gnome.Music.gschema.xml.h:17
+msgid "Set to true when initial state has been displayed"
+msgstr "Estableix a cert quan s'ha mostrat l'estat inicial"
+
+#: ../gnomemusic/notification.py:55 ../data/PlayerToolbar.ui.h:6
+msgid "Previous"
+msgstr "Anterior"
+
+#: ../gnomemusic/notification.py:58 ../gnomemusic/player.py:558
+msgid "Pause"
+msgstr "Fes una pausa"
+
+#: ../gnomemusic/notification.py:61 ../gnomemusic/player.py:561
+#: ../data/PlayerToolbar.ui.h:7
+msgid "Play"
+msgstr "Reprodueix"
+
+#: ../gnomemusic/notification.py:63 ../data/PlayerToolbar.ui.h:8
+msgid "Next"
+msgstr "Següent"
+
+#: ../gnomemusic/player.py:1167
+msgid "Unable to play the file"
+msgstr "No s'ha pogut reproduir el fitxer"
+
+#. TRANSLATORS: this is a button to launch a codec installer.
+#. %s will be replaced with the software installer's name, e.g.
+#. 'Software' in case of gnome-software.
+#: ../gnomemusic/player.py:1172
+#, python-format
+msgid "_Find in %s"
+msgstr "_Cerca a %s"
+
+#. TRANSLATORS: separator for a list of codecs
+#: ../gnomemusic/player.py:1182
+msgid " and "
+msgstr " i "
+
+#. TRANSLATORS: separator for a list of codecs
+#: ../gnomemusic/player.py:1185
+msgid ", "
+msgstr ", "
+
+#: ../gnomemusic/player.py:1186
+#, python-format
+msgid "%s is required to play the file, but is not installed."
+msgid_plural "%s are required to play the file, but are not installed."
+msgstr[0] "Cal %s per reproduir el fitxer però no està instal·lat."
+msgstr[1] "Calen %s per reproduir el fitxer però no estan instal·lats."
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:59
+msgid "Most Played"
+msgstr "Més reproduïdes"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:64
+msgid "Never Played"
+msgstr "Mai s'han reproduït"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:69
+msgid "Recently Played"
+msgstr "Reproduccions recents"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:74
+msgid "Recently Added"
+msgstr "Afegits recentment"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:79
+msgid "Favorite Songs"
+msgstr "Cançons preferides"
+
+#: ../gnomemusic/searchbar.py:63 ../gnomemusic/searchbar.py:111
+msgid "All"
+msgstr "Totes"
+
+#: ../gnomemusic/searchbar.py:64
+msgid "Artist"
+msgstr "Artista"
+
+#: ../gnomemusic/searchbar.py:65
+msgid "Album"
+msgstr "Àlbum"
+
+#: ../gnomemusic/searchbar.py:66 ../data/AlbumWidget.ui.h:3
+msgid "Composer"
+msgstr "Compositor"
+
+#: ../gnomemusic/searchbar.py:67
+msgid "Track Title"
+msgstr "Títol de la peça"
+
+#: ../gnomemusic/searchbar.py:112
+msgid "Local"
+msgstr "Local"
+
+#: ../gnomemusic/searchbar.py:224
+msgid "Sources"
+msgstr "Fonts"
+
+#: ../gnomemusic/searchbar.py:231
+msgid "Match"
+msgstr "Coincidència"
+
+#: ../gnomemusic/utils.py:63
+msgid "Unknown Artist"
+msgstr "Artista desconegut"
+
+#: ../gnomemusic/utils.py:75
+msgid "Untitled"
+msgstr "Sense títol"
+
+#: ../gnomemusic/views/albumsview.py:44 ../gnomemusic/views/searchview.py:454
+msgid "Albums"
+msgstr "Àlbums"
+
+#: ../gnomemusic/views/artistsview.py:55 ../gnomemusic/views/searchview.py:455
+msgid "Artists"
+msgstr "Artistes"
+
+#: ../gnomemusic/views/baseview.py:196
+msgid "Selected {} item"
+msgid_plural "Selected {} items"
+msgstr[0] "{} element seleccionat"
+msgstr[1] "{} elements seleccionats"
+
+#: ../gnomemusic/views/baseview.py:201 ../gnomemusic/views/baseview.py:303
+#: ../gnomemusic/widgets/albumwidget.py:198
+#: ../gnomemusic/widgets/artistalbumswidget.py:232 ../data/headerbar.ui.h:3
+msgid "Click on items to select them"
+msgstr "Feu clic als elements per seleccionar-los"
+
+#: ../gnomemusic/views/emptyview.py:51
+msgid "Music folder"
+msgstr "Carpeta de la música"
+
+#: ../gnomemusic/views/emptysearchview.py:50
+msgid "Try a different search"
+msgstr "Proveu una busca diferent"
+
+#: ../gnomemusic/views/initialstateview.py:50
+msgid "Hey DJ"
+msgstr "Hola DJ"
+
+#: ../gnomemusic/views/playlistview.py:58 ../gnomemusic/views/searchview.py:457
+msgid "Playlists"
+msgstr "Llistes de reproducció"
+
+#: ../gnomemusic/views/playlistview.py:420
+#, python-format
+msgid "%d Song"
+msgid_plural "%d Songs"
+msgstr[0] "%d cançó"
+msgstr[1] "%d cançons"
+
+#: ../gnomemusic/views/searchview.py:456 ../gnomemusic/views/songsview.py:55
+msgid "Songs"
+msgstr "Cançons"
+
+#: ../gnomemusic/widgets/albumwidget.py:194
+#: ../gnomemusic/widgets/artistalbumswidget.py:228
+#, python-format
+msgid "Selected %d item"
+msgid_plural "Selected %d items"
+msgstr[0] "%d element seleccionat"
+msgstr[1] "%d elements seleccionats"
+
+#: ../gnomemusic/widgets/albumwidget.py:291
+#: ../gnomemusic/widgets/albumwidget.py:345
+#, python-format
+msgid "%d min"
+msgstr "%d min"
+
+#: ../gnomemusic/widgets/disclistboxwidget.py:189
+msgid "Disc {}"
+msgstr "Disc {}"
+
+#: ../gnomemusic/window.py:125
+msgid "Loading"
+msgstr "S'està carregant"
+
+#. Undo button
+#: ../gnomemusic/window.py:162
+msgid "_Undo"
+msgstr "_Desfés"
+
+#: ../gnomemusic/window.py:314
+msgid "Empty"
+msgstr "Buit"
+
+#: ../gnomemusic/window.py:390
+msgid "Playlist {} removed"
+msgstr "S'ha suprimit la llista de reproducció {}"
+
+#: ../data/AboutDialog.ui.in.h:2
+msgid "Copyright © 2016 GNOME Music Developers"
+msgstr "Copyright © 2016 desenvolupadors del Música del GNOME"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "Una aplicació de reproducció i gestió de música pel GNOME."
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "Visiteu el lloc web del Música del GNOME"
+
+#: ../data/AboutDialog.ui.in.h:5
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version.\n"
+"\n"
+"“Magic of the vinyl” by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+"https://www.flickr.com/photos/_spy_/12270839403\n"
+msgstr ""
+"El Música del GNOME és programari lliure; podeu redistribuir-lo i/o "
+"modificar-lo segons els termes de la llicència pública general GNU publicada "
+"per la Free Software Foundation; siga la versió 2 de la llicència o (segons "
+"la vostra opció) qualsevol versió posterior.\n"
+"\n"
+"El Música del GNOME es distribueix amb l'esperança que siga útil, però "
+"SENSE CAP GARANTIA; ni tan sols amb la garantia implícita de "
+"COMERCIALITZACIÓ o IDONEÏTAT PER A UN PROPÒSIT PARTICULAR. Vegeu la "
+"Llicència Pública General GNU per més detalls.\n"
+"\n"
+"Heu de rebre una còpia de la Llicència Pública General GNU amb el GNOME "
+"Music; si no és el cas, escriviu a la Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"Els autors del Música del GNOME presents permeten l'ús i distribució "
+"conjunta del Música del GNOME amb connectors GStreamer no compatibles amb la "
+"GPL. Este permís està per sobre dels permisos garantits per la llicència "
+"GPL sota la qual es troba el Música del GNOME. Si modifiqueu este codi, "
+"podeu estendre esta excepció a la vostra versió del codi, però no esteu "
+"obligat a fer-ho. Si no voleu fer-ho, elimineu esta declaració d'excepció "
+"de la vostra versió.\n"
+"\n"
+"La imatge «Magic of the vinyl» d'en Sami Pyylampi està llicenciada sota CC-"
+"BY-SA 2.0 https://www.flickr.com/photos/_spy_/12270839403\n"
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "Publicat"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "Duració"
+
+#: ../data/app-menu.ui.h:1
+msgid "_Keyboard Shortcuts"
+msgstr "_Tecles de drecera"
+
+#: ../data/app-menu.ui.h:2
+msgid "_Help"
+msgstr "_Ajuda"
+
+#: ../data/app-menu.ui.h:3
+msgid "_About"
+msgstr "_Quant a"
+
+#: ../data/app-menu.ui.h:4
+msgid "_Quit"
+msgstr "I_x"
+
+#: ../data/headerbar.ui.h:1
+msgid "Select All"
+msgstr "Selecciona-ho tot"
+
+#: ../data/headerbar.ui.h:2
+msgid "Select None"
+msgstr "No en seleccionis cap"
+
+#: ../data/headerbar.ui.h:4
+msgid "Search"
+msgstr "Busca"
+
+#: ../data/headerbar.ui.h:5
+msgid "Select"
+msgstr "Selecciona"
+
+#: ../data/headerbar.ui.h:6 ../data/PlaylistDialog.ui.h:6
+msgid "_Cancel"
+msgstr "_Cancel·la"
+
+#: ../data/headerbar.ui.h:7
+msgid "Back"
+msgstr "Arrere"
+
+#: ../data/help-overlay.ui.h:1
+msgctxt "shortcut window"
+msgid "General"
+msgstr "General"
+
+#: ../data/help-overlay.ui.h:2
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Tanca la finestra"
+
+#: ../data/help-overlay.ui.h:3
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Busca"
+
+#: ../data/help-overlay.ui.h:4
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Ajuda"
+
+#: ../data/help-overlay.ui.h:5
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Dreceres"
+
+#: ../data/help-overlay.ui.h:6
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Reprodueix"
+
+#: ../data/help-overlay.ui.h:7
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Reprodueix/Fes una pausa"
+
+#: ../data/help-overlay.ui.h:8
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Cançó següent"
+
+#: ../data/help-overlay.ui.h:9
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Cançó anterior"
+
+#: ../data/help-overlay.ui.h:10
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Commuta la repetició"
+
+#: ../data/help-overlay.ui.h:11
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Commuta la mescla"
+
+#: ../data/help-overlay.ui.h:12
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navegació"
+
+#: ../data/help-overlay.ui.h:13
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Vés als àlbums"
+
+#: ../data/help-overlay.ui.h:14
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Vés als artistes"
+
+#: ../data/help-overlay.ui.h:15
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Vés a les cançons"
+
+#: ../data/help-overlay.ui.h:16
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Vés a les llistes de reproducció"
+
+#: ../data/help-overlay.ui.h:17
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Torna arrere"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No music found"
+msgstr "No s'ha trobat música"
+
+#. Translators: %s will be replaced with a link with text
+#: ../data/NoMusic.ui.h:4
+#, no-c-format
+msgid "The contents of your %s will appear here."
+msgstr "Els continguts de %s apareixeran ací."
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "Mescla"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "Repeteix-ho tot"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "Repeteix la cançó"
+
+#. Causes tracks to play in random order
+#: ../data/PlayerToolbar.ui.h:5
+msgid "Shuffle/Repeat Off"
+msgstr "Aleatori/Repetició desactivada"
+
+#: ../data/PlaylistControls.ui.h:1
+msgid "_Play"
+msgstr "_Reprodueix"
+
+#: ../data/PlaylistControls.ui.h:2
+msgid "_Delete"
+msgstr "_Suprimeix"
+
+#: ../data/PlaylistControls.ui.h:3
+msgid "Playlist Name"
+msgstr "Nom de la llista de reproducció"
+
+#: ../data/PlaylistDialog.ui.h:1
+msgid "Enter a name for your first playlist"
+msgstr "Introduïu un nom per la vostra primera llista de reproducció "
+
+#: ../data/PlaylistDialog.ui.h:2
+msgid "C_reate"
+msgstr "_Crea"
+
+#: ../data/PlaylistDialog.ui.h:3
+msgid "New Playlist"
+msgstr "Llista de reproducció nova"
+
+#: ../data/PlaylistDialog.ui.h:4
+msgid "Add"
+msgstr "Afig"
+
+#: ../data/PlaylistDialog.ui.h:5
+msgid "Select Playlist"
+msgstr "Seleccioneu una llista de reproducció"
+
+#: ../data/PlaylistDialog.ui.h:7
+msgid "_Add"
+msgstr "_Afig"
+
+#: ../data/SelectionToolbar.ui.h:1
+msgid "_Add to Playlist"
+msgstr "_Afig a la llista de reproducció"
+
+#: ../data/SelectionToolbar.ui.h:2
+msgid "_Remove from Playlist"
+msgstr "_Suprimeix de la llista de reproducció"
+
+#~ msgid "the|a|an"
+#~ msgstr "la|l'|el||les|els|un|una|uns|unes"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr ""
+#~ "Nombre de caràcters màxims a mostrar en el nom de la pista a la vista "
+#~ "artista"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Aquest paràmetre modifica el nombre de caràcters que es mostren al títol "
+#~ "de la pista a la vista artista abans d'escurçar-lo. Establiu-lo -1 per "
+#~ "inhabilitar-ho."
+
+#~ msgid "Unknown Album"
+#~ msgstr "Àlbum desconegut"
+
+#~ msgid "the a an"
+#~ msgstr "el la els l' les un una uns unes"
+
+#~ msgid "All Artists"
+#~ msgstr "Tots els artistes"
+
+#~ msgid "Not playing"
+#~ msgstr "No s'està reproduint"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "per %s, a %s"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "No s'ha trobat música\n"
+#~ " Copieu alguns fitxers a la carpeta: %s"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Llista de reproducció nova"
diff --git a/po/cs.po b/po/cs.po
new file mode 100644
index 00000000..f2ba81d1
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,584 @@
+# Czech translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# Adam Matoušek <adamatousek@gmail.com>, 2013.
+# Vojtěch Cajtler <vcajtler@seznam.cz>, 2015
+# Marek Černocký <marek@manet.cz>, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-31 15:24+0200\n"
+"Last-Translator: Daniel Rusek <mail@asciiwolf.com>\n"
+"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Hudba"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Přehrávat a organizovat svou hudební sbírku"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Snadný a příjemný způsob přehrávání hudby."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Vyhledávejte skladby ve své místní sbírce, používejte automaticky "
+"vygenerované seznamy skladeb nebo si vytvořte své vlastní."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Vývojáři Hudby GNOME"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Hudební přehrávač"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "hudba;muzika;přehrávač;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Velikost okna"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Velikost okna (šířka a výška)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Maximalizované okno"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Stav maximalizace okna."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Režim opakovaného přehrávání"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Hodnota určuje, jestli opakovaně nebo náhodně přehrávat z celé sbírku. "
+"Platné hodnoty jsou: „none“ (opakování a náhodný výběr vypnuty), "
+"„song“ (opakovat aktuální skladbu), „all“ (opakovat vše ze seznamu k "
+"přehrání, ne náhodně), „shuffle“ (náhodně přehrávat ze seznamu k přehrání, "
+"předpokládá se opakování všeho)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Povolit ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Povolí nebo zakáže vyrovnání hlasitosti u alb pomocí ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Bránit uspání systému"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Zapne nebo vypne blokování uspávání systému ve chvíli, kdy se přehrává hudba."
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Sdělovat Last.fm hudební historii"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Povolí nebo zakáže zasílání informací o dříve a právě přehrávaných skladbách "
+"do služby Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Přehrát"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Přehrát"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Přidat do o_blíbených skladeb"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "Přid_at do seznamu k přehrání…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Účet Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Sdělovat poslouchané skladby"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Klávesové zkratky"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Nápověda"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "O _aplikaci Hudba"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Vítejte v Hudbě"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Nabídka"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Vybrat"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Zrušit"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Hledat"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Zpět"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Obecné"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Zavřít okno"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Hledat"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Nápověda"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Klávesové zkratky"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Přehrát"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Přehrát/pozastavit"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Následující skladba"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Předchozí skladba"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Přepnout opakování"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Přepnout náhodný výběr"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigace"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Přejít na alba"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Přejít na umělce"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Přejít na skladby"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Přejít na seznamy k přehrání"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Přejít zpět"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm je vyhledávací služba, která Vám doporučí skladby podle toho, co "
+"posloucháte."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Sdělování informací není nastavené"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Aby se mohly sdělovat informace, co posloucháte, musíte s k Last.fm "
+"přihlásit."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Přihlásit"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Předchozí"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Následující"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Smazat"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Přejmenovat…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Název seznamu k přehrání"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Hotovo"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Zadejte název pro svůj první seznam k přehrání"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Vytvořit"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Nový seznam k přehrání…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Přidat"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Přidání do seznamu k přehrání"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "Přid_at"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Umělci"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Zobrazit vše"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Alba"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Skladby"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Vybrat vše"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Zrušit výběr"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Klikáním vyberte položky"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "Přid_at do seznamu k přehrání"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Odeb_rat ze seznamu k přehrání"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Projekt GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Marek Černocký <marek@manet.cz>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright vývojáři Hudby GNOME"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Přeložili"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Nejčastěji přehráváno"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Nikdy nepřehráno"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Nedávno přehráno"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Nedávno přidáno"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Oblíbené skladby"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Soubor nelze přehrát"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Hledat v instalátoru {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " a "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "K přehrání souboru je zapotřebí kodek {}, ale není nainstalován."
+msgstr[1] ""
+"K přehrání souboru jsou zapotřebí kodeky {}, ale nejsou nainstalovány."
+msgstr[2] ""
+"K přehrání souboru jsou zapotřebí kodeky {}, ale nejsou nainstalovány."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Přehrává se hudba"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Náhodně/opakování vypnuto"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Opakovat skladbu"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Opakovat vše"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Náhodně zamíchat"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Seznam k přehrání {} byl odstraněn"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Zpět"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "Skladba {} byla odebrána ze seznamu {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Neznámé album"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Neznámý umělec"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Nemáte nastavenou složku Hudba dle standardu XDG."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Složka s hudbou"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Zde se objeví, co obsahuje vaše {}."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Nebyla nalezena žádná hudba"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Zkuste hledat nějak jinak"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Hudbě GNOME se nezdařilo spojit s programem Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Pokud Tracker neběží, není možné indexovat hudební soubory."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Verze programu Tracker je pravděpodoně zastaralá."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Hudba potřebuje program Tracker ve verzi 3.0.0 nebo vyšší."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Seznamy k přehrání"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Nalezení umělci"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Nalezená alba"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minuta"
+msgstr[1] "{} minuty"
+msgstr[2] "{} minut"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disk {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Vybrána {} skladba"
+msgstr[1] "Vybrány {} skladby"
+msgstr[2] "Vybráno {} skladeb"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Údaje o vášem poslechu hudby jsou sdělovány na Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Údaje o vášem poslechu hudby nejsou sdělovány na Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Přihlášeno pod jménem {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Nastavit"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pozastavit"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} skladba"
+msgstr[1] "{} skladby"
+msgstr[2] "{} skladeb"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Vyhledávejte skladby, umělce, alba a seznamy skladeb"
diff --git a/po/da.po b/po/da.po
new file mode 100644
index 00000000..e12086e1
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,693 @@
+# Danish translation for gnome-music.
+# Copyright (C) 2013-2018 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Kris Thomsen <lakristho@gmail.com>, 2013-2014.
+# Ask Hjorth Larsen <asklarsen@gmail.com>, 2015, 2016, 2017, 2018.
+# scootergrisen, 2015, 2020.
+# Joe Hansen <joedalton2@yahoo.dk>, 2017.
+# Alan Mortensen <alanmortensen.am@gmail.com>, 2019-23.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-09-02 11:13+0200\n"
+"Last-Translator: Alan Mortensen <alanmortensen.am@gmail.com>\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Musik"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Afspil og organisér din musiksamling"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "En let og behagelig måde at afspille din musik på."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Find musiknumre i din lokale samling, brug automatisk genereret "
+"afspilningslister eller kuratér en ny."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "GNOME Musik-udviklerne"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Musikafspiller"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Musik;Afspiller;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Vinduesstørrelse"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Vinduesstørrelse (bredde og højde)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Vindue maksimeret"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Vindue i maksimeret tilstand."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Afspil i gentagelsestilstand"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Værdien afgør om afspilning af samlingen skal gentages eller blandes. "
+"Tilladte værdier er: “none” (gentagelse og blanding er slået fra), "
+"“song” (nuværende sang gentages), “all” (gentag afspilningslisten, bland "
+"ikke), “shuffle” (bland afspilningslisten, og alle gentages)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Aktivér ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Aktiverer eller deaktiverer ReplayGain for album"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Hindr systemhviletilstand"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Aktiverer eller deaktiverer forhindring af systemhviletilstand ved "
+"afspilning af musik"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Rapportér musikhistorik til Last.fm"
+
+# https://en.wikipedia.org/wiki/Last.fm
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Aktiverer eller deaktiverer, at der sendes “scrobbler” og “afspilles nu”-"
+"information til Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Afspil"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Afspil"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Tilføj til _yndlingssange"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Tilføj til afspilningsliste …"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Konto til Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Rapportér musikken, du lytter til"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Tastaturgenveje"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Hjælp"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Om Musik"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Velkommen til Musik"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menu"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Vælg"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Annullér"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Søg"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Tilbage"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Generelt"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Luk vindue"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Søg"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Hjælp"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Genveje"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Afspil"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Afspil/pause"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Næste sang"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Forrige sang"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Slå gentag til/fra"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Slå tilfældig rækkefølge til/fra"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigation"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Gå til album"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Gå til kunstnere"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Gå til sange"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Gå til afspilningslister"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Gå tilbage"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm er en musikopdagelsestjeneste, som giver dig personliggjorte "
+"anbefalinger baseret på den musik, du lytter til."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Musikrapportering ikke sat op"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Log ind på din konto til Last.fm for at rapportere den musik, du lytter til."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Log ind"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Forrige"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Næste"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Slet"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Omdøb …"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Navn på afspilningsliste"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Færdig"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Indtast et navn for din første afspilningsliste"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Opret"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Ny afspilningsliste …"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Tilføj"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Tilføj til afspilningsliste"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Tilføj"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Kunstnere"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Vis alle"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Album"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Sange"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Vælg alle"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Vælg ingen"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Klik på elementerne for at vælge dem"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Tilføj til afspilningsliste"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Fjern fra afspilningsliste"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "GNOME-projektet"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"Ask Hjorth Larsen\n"
+"Kris Thomsen\n"
+"scootergrisen\n"
+"Joe Hansen\n"
+"Alan Mortensen\n"
+"\n"
+"Dansk-gruppen\n"
+"Websted http://dansk-gruppen.dk\n"
+"E-mail <dansk@dansk-gruppen.dk>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Ophavsret GNOME Musik-udviklerne"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Oversat af"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Mest afspillet"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Aldrig afspillet"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Afspillet for nylig"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Tilføjet for nylig"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Yndlingssange"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Kan ikke afspille filen"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Find i {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " og "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} kræves for at afspille filen, men er ikke installeret."
+msgstr[1] "{} kræves for at afspille filen, men er ikke installeret."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Afspiller musik"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Bland/gentag fra"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Gentag sang"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Gentag alle"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Bland"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Afspilningslisten {} fjernet"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Fortryd"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} fjernet fra {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Ukendt album"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Ukendt kunstner"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Din XDG-musikmappe er ikke angivet."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Musikmappe"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Indholdet af din {} vil blive vist her."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Ingen musik fundet"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Prøv en anden søgning"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Musik kunne ikke forbinde til Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Dine musikfiler kan ikke indekseres, hvis ikke Tracker kører."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Dit system synes at have en gammel version af Tracker."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Musik kræver Tracker version 3.0.0 eller nyere."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Afspilningslister"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Resultater — kunstnere"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Resultater — albummer"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minut"
+msgstr[1] "{} minutter"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disk {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} sang valgt"
+msgstr[1] "{} sange valgt"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Musikken, du lytter til, rapporteres til Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Musikken, du lytter til, rapporteres ikke til Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Logget ind som {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Konfigurér"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pause"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} sang"
+msgstr[1] "{} sange"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Søg efter sange, kunstnere, albummer og afspilningslister"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "En musikafspiller og håndteringsprogram til GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Besøg GNOME Musiks websted"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME Musik er fri software. Du kan redistribuere og/eller modificere det "
+#~ "under de betingelser, som er angivet i GNU General Public License, som er "
+#~ "udgivet af Free Software Foundation. Enten version 2 af licensen eller "
+#~ "(efter eget valg) enhver senere version.\n"
+#~ "\n"
+#~ "GNOME Musik distribueres i håb om, at det vil vise sig nyttigt, men UDEN "
+#~ "NOGEN FORM FOR GARANTI, uden selv de underforståede garantier omkring "
+#~ "SALGBARHED eller EGNETHED TIL ET BESTEMT FORMÅL. Yderligere detaljer kan "
+#~ "læses i GNU General Public License.\n"
+#~ "\n"
+#~ "Du bør have modtaget en kopi af GNU General Public License sammen med "
+#~ "GNOME Musik. Hvis ikke, så skriv til Free software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n"
+#~ "\n"
+#~ "Forfatterne af GNOME Musik giver hermed tilladelse til, at ikke-GPL-"
+#~ "kompatible GStreamer-udvidelsesmoduler kan bruges og distribueres sammen "
+#~ "med GStreamer og GNOME Musik. Denne tilladelse tilsidesætter "
+#~ "tilladelserne givet af GPL-licensen, som GNOME Musik er dækket af. Hvis "
+#~ "du ændrer denne kode, kan du udvide denne undtagelse til din version af "
+#~ "koden, men du er ikke forpligtet til at gøre det. Hvis du ikke ønsker at "
+#~ "gøre dette, sletter du blot denne erklæring om undtagelse fra din version."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Indholdet af din musikmappe vil blive vist her."
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME Musik"
+
+#~ msgid "Window position"
+#~ msgstr "Vinduesplacering"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Vinduesplacering (x og y)."
+
+#~ msgid "Loading"
+#~ msgstr "Indlæser"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Tilføj til afspilningsliste …"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "En nem måde at afspille musik på. Find automatisk musik på din computer, "
+#~ "det lokale netværk samt internettjenester."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Find spor i din lokale samling, hent musik fra DLNA-servere eller prøv "
+#~ "noget nyt med tjenesterne Jamendo og Magnatune."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Den oprindelige tilstand har været vist"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Sæt til true når den oprindelige tilstand har været vist"
+
+#~ msgid "Released"
+#~ msgstr "Udgivet"
+
+#~ msgid "Running Length"
+#~ msgstr "Spilletid"
+
+#~ msgid "Composer"
+#~ msgstr "Komponist"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Afspil"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hey DJ"
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 00000000..945f4762
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,747 @@
+# German translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# music listening = Musikverlauf
+#
+#
+# Tobias Endrigkeit <tobiasendrigkeit@outlook.com>, 2013.
+# Christian Kirbach <christian.kirbach@gmail.com>, 2013.
+# Benjamin Steinwender <b@stbe.at>, 2013.
+# Bernd Homuth <dev@hmt.im>, 2014, 2015.
+# Vinzenz Vietzke <vinz@vinzv.de>, 2018.
+# Mario Blättermann <mario.blaettermann@gmail.com>, 2013, 2016-2018, 2020.
+# Wolfgang Stöggl <c72578@yahoo.de>, 2014-2015, 2020.
+# Tim Sabsch <tim@sabsch.com>, 2019-2020, 2022.
+# Philipp Kiemle <philipp.kiemle@gmail.com>, 2021-2022.
+# Jürgen Benvenuti <gastornis@posteo.org>, 2023.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-07-27 18:48+0200\n"
+"Last-Translator: Jürgen Benvenuti <gastornis@posteo.org>\n"
+"Language-Team: Deutsch <gnome-de@gnome.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Musik"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Geben Sie Ihre Musik wieder und verwalten Sie Ihre Sammlung"
+
+# Ich weiß - nicht ganz wortgetreu, aber m.M.n. geht es bei so einer Beschreibung hauptsächlich darum, kurz und prägnant zu sein. - pk
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Eine einfache und schöne Möglichkeit, Ihre Musik zu hören."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Finden Sie Titel in Ihrer lokalen Sammlung, nutzen Sie automatisch "
+"generierte Wiedergabelisten oder stellen Sie eine neue Wiedergabeliste "
+"zusammen."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Die GNOME-Musik-Entwickler"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Musikwiedergabe"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Musik;Wiedergabe;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Fenstergröße"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Fenstergröße (Breite und Höhe)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Fenster maximiert"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Fenstermaximierungsstatus."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Wiederholungsmodus"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Der Wert legt fest, ob die Wiedergabe endlos oder zufällig durch die "
+"Sammlung erfolgt. Gültige Werte sind: »none« (keine - Wiederholen und "
+"Zufallswiedergabe sind deaktiviert), »song« (den aktuellen Titel "
+"wiederholen), »all« (alle - die gesamte Wiedergabeliste wiederholen, keine "
+"Zufallswiedergabe) und »shuffle« (zufällige Wiedergabe aller Titel)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Lautstärken anpassen"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr ""
+"Legt fest, ob Lautstärken zwischen Titeln in Alben angepasst werden sollen "
+"(»ReplayGain«)"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Ruhezustand des Systems verhindern"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Erlaubt oder verhindert den Ruhezustand des Systems, während Musik gespielt "
+"wird"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Musikverlauf an Last.fm senden"
+
+# Scrobbeln ist ein Eigenbegriff von Last.fm
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Aktiviert/Deaktiviert das Senden von Informationen zu Scrobbeln und »Wird "
+"derzeit abgespielt« an Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Wiedergeben"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Wiedergabe"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Zu _Lieblingstiteln hinzufügen"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "Zu _Wiedergabeliste hinzufügen …"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm-Konto"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Musikverlauf senden"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "Tasten_kombinationen"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Hilfe"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Info zu Musik"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Willkommen bei Musik"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menü"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Auswählen"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "A_bbrechen"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Suchen"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Zurück"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Allgemein"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Fenster schließen"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Suchen"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Hilfe"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Tastenkürzel"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Abspielen"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Wiedergabe/Pause"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Nächster Titel"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Vorheriger Titel"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Wiederholung ein-/ausschalten"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Mischen ein-/ausschalten"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigation"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Zu Alben gehen"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Zu Künstlern gehen"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Zu Titeln gehen"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Zu Wiedergabelisten gehen"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Zurück gehen"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm ist ein Dienst zur Entdeckung neuer Musik, der Ihnen personalisierte "
+"Empfehlungen anhand Ihres Musikverlaufs gibt."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Senden des Musikverlaufs ist nicht eingerichtet"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Melden Sie sich mit Ihrem Last.fm-Konto an, um Ihren Musikverlauf zu senden."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Anmelden"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Vorheriges"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Nächstes"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Entfernen"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Umbenennen …"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Name der Wiedergabeliste"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Fertig"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Geben Sie einen Namen für Ihre erste Wiedergabeliste ein"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "An_legen"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Neue Wiedergabeliste …"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Zur Wiedergabeliste hinzufügen"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Hinzufügen"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Künstler"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Alle ansehen"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Alben"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Titel"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Alle auswählen"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Keinen auswählen"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Klicken Sie auf ein Objekt, um es auszuwählen"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "Zur Wiedergabeliste _hinzufügen"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Aus der Wiedergabeliste _entfernen"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Das GNOME-Projekt"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"Tobias Endrigkeit <tobiasendrigkeit@outlook.com>\n"
+"Christian Kirbach <christian.kirbach@gmail.com>\n"
+"Benjamin Steinwender <b@stbe.at>\n"
+"Bernd Homuth <dev@hmt.im>\n"
+"Vinzenz Vietzke <vinz@vinzv.de>\n"
+"Mario Blättermann <mario.blaettermann@gmail.com>\n"
+"Wolfgang Stöggl <c72578@yahoo.de>\n"
+"Tim Sabsch <tim@sabsch.com>\n"
+"Philipp Kiemle <philipp.kiemle@gmail.com>\n"
+"Jürgen Benvenuti <gastornis@posteo.org>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright Die GNOME-Musik-Entwickler"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Übersetzung von"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Am häufigsten wiedergegeben"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Noch nie wiedergegeben"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Zuletzt wiedergegeben"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Zuletzt hinzugefügt"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Lieblingstitel"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Datei kann nicht abgespielt werden"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "In {} _suchen"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " und "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] ""
+"{} wird zum Abspielen der Datei benötigt, ist aber nicht installiert."
+msgstr[1] ""
+"{} werden zum Abspielen der Datei benötigt, sind aber nicht installiert."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Musik wird wiedergegeben"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Zufall/Wiederholung aus"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Titel wiederholen"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Alle wiederholen"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Zufällig"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Wiedergabeliste {} entfernt"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Rückgängig"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} von {} entfernt"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Unbekanntes Album"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Unbekannter Künstler"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Ihr XDG-Musikorder wurde nicht festgelegt."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Musikordner"
+
+# Auch wenn hier der Genitiv ("Ihres Ordners") verwendet werden sollte, muss, aufgrund der variablen Zeichenkette, der Dativ verwendet werden - pk
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Der Inhalt von Ihrem {} wird hier angezeigt werden."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Keine Musik gefunden"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Versuchen Sie eine andere Suchanfrage"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Musik konnte nicht mit Tracker verbunden werden."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Ihre Musikdateien können nur indiziert werden, wenn Tracker läuft."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Ihre Systemversion von Tracker scheint veraltet zu sein."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Musik benötigt Tracker in der Version 3.0.0 oder neuer."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Wiedergabelisten"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Künstler-Ergebnisse"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Alben-Ergebnisse"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} Minute"
+msgstr[1] "{} Minuten"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disc {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} Titel gewählt"
+msgstr[1] "{} Titel gewählt"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Ihr Musikverlauf wird an Last.fm gesendet."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Ihr Musikverlauf wird nicht an Last.fm gesendet."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Angemeldet als {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Einrichten"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pause"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} Titel"
+msgstr[1] "{} Titel"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Titel, Künstler, Alben und Wiedergabelisten durchsuchen"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Eine Anwendung für Musikwiedergabe und -verwaltung für GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Besuchen Sie die GNOME-Musik-Webseite"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME Musik ist freie Software. Sie können es weitergeben und/oder "
+#~ "verändern, solange Sie sich an die Regeln der »GNU General Public "
+#~ "License« halten, so wie sie von der Free Software Foundation festgelegt "
+#~ "wurden; entweder in Version 2 der Lizenz oder (nach Ihrem Ermessen) in "
+#~ "jeder neueren Version.\n"
+#~ "\n"
+#~ "GNOME Musik wurde mit dem Ziel veröffentlicht, dass Sie es nützlich "
+#~ "finden, jedoch OHNE JEGLICHE GARANTIE, sogar ohne eine implizite Garantie "
+#~ "der VERKAUFBARKEIT oder der VERWENDBARKEIT FÜR EINEN SPEZIELLEN ZWECK. "
+#~ "Schauen Sie für weitere Informationen bitte in der »GNU General Public "
+#~ "License« (GNU GPL) nach.\n"
+#~ "\n"
+#~ "Zusammen mit GNOME Musik sollten Sie außerdem eine Kopie der »GNU General "
+#~ "Public License« erhalten haben. Wenn dem nicht so ist, so schreiben Sie "
+#~ "bitte an die Free Software Foundation, Inc., 51 Franklin Street, Fifth "
+#~ "Floor, Boston, MA 02110-1301, USA.\n"
+#~ "\n"
+#~ "Die Autoren von GNOME Musik gewähren hiermit das Recht für die Nutzung "
+#~ "von nicht-GPL-kompatiblen GStreamer-Erweiterungen und den Vertrieb "
+#~ "zusammen mit GStreamer und GNOME Musik. Dies geht über die "
+#~ "Berechtigungen hinaus, die von der GPL-Lizenz gewährt werden, der GNOME "
+#~ "Musik unterliegt. Wenn Sie diesen Code verändern, dürfen Sie diese "
+#~ "Ausnahme auf Ihren Code erweitern, jedoch sind Sie nicht dazu "
+#~ "verpflichtet. Wenn Sie dies nicht wünschen, entfernen Sie diese "
+#~ "Ausnahmeerklärung aus Ihrer Version."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Der Inhalt Ihres »Musik«-Ordners wird hier angezeigt werden."
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME Musik"
+
+#~ msgid "Window position"
+#~ msgstr "Fensterposition"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Fensterposition (x und y)."
+
+#~ msgid "Loading"
+#~ msgstr "Laden"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Zur Wiedergabeliste hinzufügen …"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Eine einfache Möglichkeit zur Wiedergabe Ihrer Musik. Lassen Sie "
+#~ "automatisiert auf Ihrem Rechner, im lokalen Netzwerk und bei "
+#~ "Internetdiensten nach Musik suchen."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Finden Sie Titel in Ihrer lokalen Sammlung, beziehen Sie Musik von DLNA-"
+#~ "Servern oder entdecken Sie Neues mit den Diensten Jamendo und Magnatune."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Originalzustand wurde angezeigt"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Auf wahr setzen, wenn der Originalzustand bereits angezeigt wurde"
+
+#~ msgid "Released"
+#~ msgstr "Erschienen"
+
+#~ msgid "Running Length"
+#~ msgstr "Spielzeit"
+
+#~ msgid "Composer"
+#~ msgstr "Komponist"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Abspielen"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hey DJ"
+
+#~ msgid "All"
+#~ msgstr "Alle"
+
+#~ msgid "Artist"
+#~ msgstr "Künstler"
+
+#~ msgid "Album"
+#~ msgstr "Album"
+
+#~ msgid "Track Title"
+#~ msgstr "Stücktitel"
+
+#~ msgid "Local"
+#~ msgstr "Lokal"
+
+#~ msgid "Sources"
+#~ msgstr "Quellen"
+
+#~ msgid "Match"
+#~ msgstr "Übereinstimmung"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "Unbenannt"
+
+#~ msgid "_Quit"
+#~ msgstr "_Beenden"
diff --git a/po/el.po b/po/el.po
new file mode 100644
index 00000000..8a8e141c
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,821 @@
+# Greek translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Dimitris Spingos <dmtrs32@gmail.com>, 2013.
+# Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>, 2013, 2014, 2015.
+# Dimitris Maroulidis <dmaroulidis@dimitrismaroulidis.com>, 2019
+# Efstathios Iosifidis <iosifidis@opensuse.org>, 2013-2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-07-29 11:36+0300\n"
+"Last-Translator: Efstathios Iosifidis <iosifidis@opensuse.org>\n"
+"Language-Team: Greek, Modern (1453-) <gnome-el-list@gnome.org>\n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+"X-Project-Style: gnome\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Μουσική"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Αναπαράξτε και οργανώστε τη μουσική σας συλλογή"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Ένας εύκολος και ευχάριστος τρόπος για να αναπαράγετε τη μουσική σας."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Βρείτε κομμάτια στην τοπική σας συλλογή, χρησιμοποιήστε αυτόματα "
+"δημιουργημένες λίστες αναπαραγωγής ή επιμεληθείτε μια νέα."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Οι προγραμματιστές του GNOME Music"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Αναπαραγωγή μουσικής"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Μουσική;Αναπαραγωγή;Music;Player;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Μέγεθος παραθύρου"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Μέγεθος παραθύρου (πλάτος και ύψος)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Μεγιστοποιημένο παράθυρο"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Κατάσταση μεγιστοποιημένου παραθύρου."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Λειτουργία επανάληψης αναπαραγωγής"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Η τιμή αναγνωρίζει αν θα επαναληφθεί ή θα αναπαραχθεί τυχαία η συλλογή. "
+"Επιτρεπτές τιμές είναι: «none» (με απενεργοποίηση της επανάληψης και της "
+"τυχαίας σειράς), «song» (επανάληψη τρέχοντος τραγουδιού), «all» (επανάληψη "
+"λίστας αναπαραγωγής, χωρίς τυχαία σειρά), «shuffle» (τυχαία σειρά λίστας "
+"αναπαραγωγής, προϋποθέτει την επανάληψη όλων)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Ενεργοποίηση του ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Ενεργοποιεί ή απενεργοποιεί το ReplayGain για συλλογές"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Αναστολή συστήματος αναστολής"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Ενεργοποίηση ή απενεργοποίηση την αναστολή συστήματος αναστολής κατά την "
+"αναπαραγωγή μουσικής"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Αναφορά ιστορικού μουσικής στην Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Ενεργοποιεί ή απενεργοποιεί την αποστολή πληροφοριών αρχείων \"που "
+"αναπαράγονται αυτήν τη στιγμή\" στο Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Αναπαραγωγή"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Αναπαραγωγή"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Προσθήκη στο _Αγαπημένα τραγούδια"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Προσθήκη στη λίστα αναπαραγωγής…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Λογαριασμός Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Αναφορά ακρόασης μουσικής"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "1821"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Βοήθεια"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Περί του Μουσική"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Καλώς ορίσατε στην Μουσική"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Μενού"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Επιλογή"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "Ακύ_ρωση"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Αναζήτηση"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Πίσω"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Γενικά"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Κλείσιμο παραθύρου"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Αναζήτηση"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Βοήθεια"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Συντομεύσεις"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Αναπαραγωγή"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Αναπαραγωγή/Παύση"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Επόμενο τραγούδι"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Προηγούμενο τραγούδι"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Εναλλαγή επανάληψης"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Εναλλαγή τυχαίας σειράς"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Περιήγηση"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Μετάβαση στους δίσκους"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Μετάβαση στους καλλιτέχνες"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Μετάβαση στα τραγούδια"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Μετάβαση στις λίστες αναπαραγωγής"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Μετάβαση πίσω"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Το Last.fm είναι μια υπηρεσία που ανακαλύπτετε μουσική και σας παρέχει "
+"εξατομικευμένες προτάσεις βάσει της μουσικής που ακούτε."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Δεν είναι ρυθμισμένη η αναφορά μουσικής"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Συνδεθείτε στον λογαριασμό σας Last.fm για να αναφέρετε τη μουσική σας."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Σύνδεση"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Προηγούμενο"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Επόμενο"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Διαγραφή"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Μετονομασία…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Όνομα λίστας αναπαραγωγής"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Ολοκληρώθηκε"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Πληκτρολογήστε ένα όνομα για την πρώτη σας λίστα αναπαραγωγής"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "Δ_ημιουργία"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Νέα λίστα αναπαραγωγής…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Προσθήκη"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Προσθήκη στη λίστα αναπαραγωγής"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Προσθήκη"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Καλλιτέχνες"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Προβολή όλων"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Δίσκοι"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Τραγούδια"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Επιλογή όλων"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Καμία επιλογή"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Πατήστε σε αντικείμενα για να τα επιλέξετε"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "Προ_σθήκη στη λίστα αναπαραγωγής"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Α_φαίρεση από την λίστα αναπαραγωγής"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Το έργο GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"Ελληνική μεταφραστική ομάδα GNOME\n"
+" Ευστάθιος Ιωσηφίδης <iosifidis@opensuse.org>\n"
+"\n"
+"Για περισσότερες πληροφορίες, επισκεφθείτε τη σελίδα\n"
+"http://gnome.gr/"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Πνευματικά δικαιώματα GNOME Music Developers"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Μετάφραση από"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Το περισσότερο παιγμένο"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Δεν παίχτηκε ποτέ"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Παίχτηκε πρόσφατα"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Προστέθηκε πρόσφατα"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Αγαπημένα τραγούδια"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Αδύνατη η αναπαραγωγή του αρχείου"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "Εύ_ρεση στο {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " και "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] ""
+"Απαιτείται το {} για αναπαραγωγή του αρχείου, αλλά δεν είναι εγκατεστημένο."
+msgstr[1] ""
+"Απαιτούνται τα {} για αναπαραγωγή του αρχείου, αλλά δεν είναι εγκατεστημένα."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Αναπαραγωγή μουσικής"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Τυχαία σειρά/Ανενεργή επανάληψη"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Επανάληψη τραγουδιού"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Επανάληψη όλων"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Τυχαία σειρά"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Αφαιρέθηκε η λίστα αναπαραγωγής {}"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Aναίρεση"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} αφαιρέθηκε από {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Άγνωστο άλμπουμ"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Άγνωστος καλλιτέχνης"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Ο κατάλογός Μουσική XDG δεν έχει ρυθμιστεί."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Φάκελος μουσικής"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Τα περιεχόμενα του {} θα εμφανιστούν εδώ."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Δεν βρέθηκε μουσική"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Δοκιμάστε μια διαφορετική αναζήτηση"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Η Μουσική του GNOME δεν μπόρεσε να συνδεθεί με το Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Δεν είναι δυνατή η ευρετηρίαση των αρχείων μουσικής σας χωρίς την εκτέλεση "
+"του Tracker."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Η έκδοση Tracker του συστήματος είναι παρωχημένη."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Η Μουσική χρειάζεται έκδοση Tracker 3.0.0 ή μεγαλύτερη."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Λίστες αναπαραγωγής"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Αποτελέσματα Καλλιτεχνών"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Αποτελέσματα Δίσκων"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} λεπτό"
+msgstr[1] "{} λεπτά"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Δίσκος {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Επιλέχθηκε {} τραγούδι"
+msgstr[1] "Επιλέχθηκαν {} τραγούδια"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Η μουσική που ακούτε αναφέρεται στο Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Η μουσική που ακούτε δεν αναφέρεται στο Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Συνδεδεμένος ως {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Ρύθμιση"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Παύση"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} τραγούδι"
+msgstr[1] "{} τραγούδια"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Αναζήτηση τραγουδιών, καλλιτεχνών, άλμπουμ και λιστών αναπαραγωγής"
+
+#~ msgid "GNOME Music"
+#~ msgstr "Μουσική GNOME"
+
+#~ msgid "Window position"
+#~ msgstr "Θέση παραθύρου"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Θέση παραθύρου (x και y)."
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Εφαρμογή αναπαραγωγής και διαχείρισης μουσικής, για το GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Επισκεφθείτε τον ιστότοπο της εφαρμογής Μουσική GNOME"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "Η Μουσική GNOME είναι ελεύθερο λογισμικό. Μπορείτε να το αναδιανείμετε ή/"
+#~ "και να το τροποποιήσετε, υπό τους όρους της άδειας GNU General Public "
+#~ "License, όπως αυτή εκδίδεται από το Ίδρυμα Ελεύθερου Λογισμικού (Free "
+#~ "Software Foundation), είτε της έκδοσης 2 της άδειας, είτε (κατ' επιλογήν "
+#~ "σας) οποιασδήποτε άλλης μεταγενέστερης έκδοσης.\n"
+#~ "\n"
+#~ "Το GNOME Music διανέμεται με την ελπίδα πως θα είναι χρήσιμο, αλλά ΧΩΡΙΣ "
+#~ "ΚΑΜΙΑ ΕΓΓΥΗΣΗ, χωρίς καν την υπονοούμενη εγγύηση της ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ή "
+#~ "της ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ. Δείτε την άδεια GNU General "
+#~ "Public License για περισσότερες λεπτομέρειες.\n"
+#~ "\n"
+#~ "Πρέπει να έχετε λάβει αντίγραφο της άδειας GNU General Public License "
+#~ "μαζί με το GNOME Music. Αν όχι, γράψτε στο: Free Software Foundation, "
+#~ "Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
+#~ "\n"
+#~ "Οι προγραμματιστές του GNOME Music επιτρέπουν στα μη-συμβατά με την άδεια "
+#~ "GPL πρόσθετα GStreamer, να χρησιμοποιούνται και να διανέμονται μαζί με το "
+#~ "GStreamer και το GNOME Music. Η άδεια είναι υπεράνω και πέραν των "
+#~ "απαγορεύσεων της άδειας χρήσης GPL, και στις οποίες υπάγεται η εφαρμογή "
+#~ "GNOME Music. Εάν τροποποιήσετε τον κώδικα, μπορείτε να επεκτείνετε αυτήν "
+#~ "την εξαίρεση στη δική σας έκδοση του κώδικα, χωρίς όμως να είστε "
+#~ "υποχρεωμένοι να το κάνετε. Εάν δεν θέλετε να το κάνετε, διαγράψτε αυτή "
+#~ "τη δήλωση εξαίρεσης από τη δική σας έκδοση."
+
+#~ msgid "Loading"
+#~ msgstr "Γίνεται φόρτωση"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Προσθήκη στη λίστα αναπαραγωγής…"
+
+#~ msgid "Remove From Playlist"
+#~ msgstr "Αφαίρεση από την λίστα αναπαραγωγής"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Ένας εύκολος τρόπος για αναπαραγωγή της μουσικής σας. Ανακαλύψτε αυτόματα "
+#~ "την μουσική στον υπολογιστή σας, στο τοπικό δίκτυο και στις υπηρεσίες "
+#~ "διαδικτύου."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Ανακαλύψτε τραγούδια στην τοπική σας συλλογή, λάβετε μουσική από τους "
+#~ "διακομιστές DLNA ή δοκιμάστε κάτι καινούριο με το Jamendo και τις "
+#~ "υπηρεσίες Magnatune."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Η αρχική κατάσταση έχει εμφανιστεί"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Ορίστε το ως αληθές όταν έχει εμφανιστεί η αρχική κατάσταση"
+
+#~ msgid "Released"
+#~ msgstr "Κυκλοφόρησε"
+
+#~ msgid "Running Length"
+#~ msgstr "Εκτελούμενη διάρκεια"
+
+#~ msgid "Composer"
+#~ msgstr "Συνθέτης"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Αναπαραγωγή"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Γεια σου DJ"
+
+#~ msgid "All"
+#~ msgstr "Όλα"
+
+#~ msgid "Artist"
+#~ msgstr "Καλλιτέχνης"
+
+#~ msgid "Album"
+#~ msgstr "Δίσκος"
+
+#~ msgid "Track Title"
+#~ msgstr "Τίτλος κομματιού"
+
+#~ msgid "Local"
+#~ msgstr "Τοπικά"
+
+#~ msgid "Sources"
+#~ msgstr "Πηγές"
+
+#~ msgid "Match"
+#~ msgstr "Ταίριασμα"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "Χωρίς τίτλο"
+
+#~ msgid "_Quit"
+#~ msgstr "Έ_ξοδος"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Η Μουσική είναι η νέα εφαρμογή του GNOME για αναπαραγωγή μουσικής."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Επιλέχθηκε %d αντικείμενο"
+#~ msgstr[1] "Επιλέχθηκαν %d αντικείμενα"
+
+#~ msgid "Empty"
+#~ msgstr "Κενό"
+
+#~ msgid "%d min"
+#~ msgstr "%d λεπτά"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Επιλογή λίστας αναπαραγωγής"
+
+#~ msgid "Search mode"
+#~ msgstr "Λειτουργία αναζήτησης"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Αν είναι αληθές, εμφανίζεται η γραμμή αναζήτησης."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Λειτουργία ειδοποιήσεων"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Ενεργοποιεί ή απενεργοποιεί τις ειδοποιήσεις αναπαραγωγής"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an|ο|η|το|τα|οι"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr ""
+#~ "Ο μέγιστος αριθμός χαρακτήρων που θα εμφανίζεται στο όνομα του κομματιού "
+#~ "στην προβολή καλλιτέχνη"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Αυτή η ρύθμιση τροποποιεί τον αριθμό των χαρακτήρων για τον τίτλο του "
+#~ "κομματιού στην προβολή καλλιτέχνη πριν την μερική απόκρυψη. Ορίστε το σε "
+#~ "-1 για να το απενεργοποιήσετε."
+
+#~ msgid "the a an"
+#~ msgstr "the "
+
+#~ msgid "All Artists"
+#~ msgstr "Όλοι οι καλλιτέχνες"
+
+#~ msgid "Not playing"
+#~ msgstr "Δεν αναπαράγεται"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "από τον %s, από το %s"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Νέα λίστα αναπαραγωγής"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "Δεν βρέθηκε μουσική!\n"
+#~ " Τοποθετήστε μερικά αρχεία στον φάκελο %s"
+
+#~ msgid "Load More"
+#~ msgstr "Φόρτωση περισσοτέρων"
+
+#~ msgid "Now _Playing"
+#~ msgstr "Αναπαράγεται _Τώρα"
+
+#~ msgid "<span color='grey'>Released</span>"
+#~ msgstr "<span color='grey'>Κυκλοφόρησε</span>"
+
+#~ msgid "<span color='grey'>Running Length</span>"
+#~ msgstr "<span color='grey'>Διάρκεια εκτέλεσης</span>"
+
+#~ msgid "----"
+#~ msgstr "----"
+
+#~ msgid "--:--"
+#~ msgstr "--:--"
+
+#~ msgid "00:00"
+#~ msgstr "00:00"
+
+#~ msgid "/"
+#~ msgstr "/"
diff --git a/po/en_GB.po b/po/en_GB.po
new file mode 100644
index 00000000..df033b7c
--- /dev/null
+++ b/po/en_GB.po
@@ -0,0 +1,816 @@
+# British English translation for gnome-music.
+# Copyright (C) 2012 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same licence as the gnome-music package.
+# Chris Leonard <cjlhomeaddress@gmail.com>, 2012.
+# Zander Brown <zbrown@gnome.org>, 2019-2020.
+# Bruce Cowan <bruce@bcowan.me.uk>, 2013-2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-01-25 19:11+0000\n"
+"PO-Revision-Date: 2023-06-30 19:55+0100\n"
+"Last-Translator: Bruce Cowan <bruce@bcowan.me.uk>\n"
+"Language-Team: English - United Kingdom <en@li.org>\n"
+"Language: en_GB\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.1\n"
+"X-Project-Style: gnome\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:236
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Music"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Play and organise your music collection"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "An easy and pleasant way to play your music."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+
+#: data/org.gnome.Music.appdata.xml.in.in:167
+msgid "The GNOME Music developers"
+msgstr "The GNOME Music developers"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Music Player"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Window size"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Window size (width and height)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Window maximised"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Window maximised state."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Playback repeat mode"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Value identifies whether to repeat or randomise playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Enable ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Enables or disables ReplayGain for albums"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Inhibit system suspend"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "Enables or disables inhibiting system suspend while playing music"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Report music history to Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Play"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Play"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Add to _Favourite Songs"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Add to Playlist…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm Account"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Report Music Listening"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Keyboard Shortcuts"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Help"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_About Music"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Welcome to Music"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Menu"
+
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Select"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Cancel"
+
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Search"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "Back"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "General"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Close window"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Search"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Help"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Shortcuts"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Playback"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Play/Pause"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Next song"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Previous song"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Toggle repeat"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Toggle shuffle"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigation"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Go to Albums"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Go to Artists"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Go to Songs"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Go to Playlists"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Go back"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Music Reporting Not Setup"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Login to your Last.fm account to report your music listening."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Login"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Previous"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Next"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Delete"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Rename…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Playlist Name"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Done"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Enter a name for your first playlist"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "C_reate"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "New Playlist…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Add"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Add to Playlist"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Add"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artists"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "View All"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albums"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Songs"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Select All"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Select None"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Click on items to select them"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Add to Playlist"
+
+#: data/ui/SongWidgetMenu.ui:19
+#| msgid "Remove From Playlist"
+msgid "_Remove from Playlist"
+msgstr "_Remove from Playlist"
+
+#: gnomemusic/about.py:238
+msgid "The GNOME Project"
+msgstr "The GNOME Project"
+
+#: gnomemusic/about.py:242
+msgid "translator-credits"
+msgstr "Bruce Cowan <bruce@bcowan.me.uk>"
+
+#: gnomemusic/about.py:246
+#| msgid "Copyright © 2018 GNOME Music Developers"
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright The GNOME Music Developers"
+
+#: gnomemusic/about.py:249
+msgid "Translated by"
+msgstr "Translated by"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Most Played"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Never Played"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Recently Played"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Recently Added"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Favourite Songs"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Unable to play the file"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Find in {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " and "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} is required to play the file, but is not installed."
+msgstr[1] "{} are required to play the file, but are not installed."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Playing music"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "Shuffle"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Repeat Song"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Repeat All"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr "Shuffle/Repeat Off"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Playlist {} removed"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+#| msgid "_Undo"
+msgid "Undo"
+msgstr "Undo"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} removed from {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Unknown Album"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Unknown Artist"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Your XDG Music directory is not set."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Music Folder"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "The contents of your {} will appear here."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "No Music Found"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Try a Different Search"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Music could not connect to Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Your music files cannot be indexed without Tracker running."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Your system Tracker version seems outdated."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Music needs Tracker version 3.0.0 or higher."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Playlists"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Artists"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Albums"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minute"
+msgstr[1] "{} minutes"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disc {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Selected {} song"
+msgstr[1] "Selected {} songs"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Your music listening is reported to Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Your music listening is not reported to Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Logged in as {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Configure"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pause"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} Song"
+msgstr[1] "{} Songs"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME Music"
+
+#~ msgid "Window position"
+#~ msgstr "Window position"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Window position (x and y)."
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "A music player and management application for GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Visit GNOME Music website"
+
+#~| msgid ""
+#~| "GNOME Music is free software; you can redistribute it and/or modify it "
+#~| "under the terms of the GNU General Public License as published by the "
+#~| "Free Software Foundation; either version 2 of the License, or (at your "
+#~| "option) any later version.\n"
+#~| "\n"
+#~| "GNOME Music is distributed in the hope that it will be useful, but "
+#~| "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~| "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU "
+#~| "General Public License for more details.\n"
+#~| "\n"
+#~| "You should have received a copy of the GNU General Public License along "
+#~| "with GNOME Music; if not, write to the Free Software Foundation, Inc., "
+#~| "51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~| "\n"
+#~| "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~| "GStreamer plugins to be used and distributed together with GStreamer and "
+#~| "GNOME Music. This permission is above and beyond the permissions "
+#~| "granted by the GPL license by which GNOME Music is covered. If you "
+#~| "modify this code, you may extend this exception to your version of the "
+#~| "code, but you are not obligated to do so. If you do not wish to do so, "
+#~| "delete this exception statement from your version.\n"
+#~| "\n"
+#~| "“Magic of the vinyl” by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+#~| "https://www.flickr.com/photos/_spy_/12270839403"
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public Licence as published by the "
+#~ "Free Software Foundation; either version 2 of the Licence, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public Licence for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public Licence along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plug-ins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL licence by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+
+#~ msgid "Loading"
+#~ msgstr "Loading"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Add to Playlist…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Inital state has been displayed"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Set to true when initial state has been displayed"
+
+#~ msgid "Released"
+#~ msgstr "Released"
+
+#~ msgid "Running Length"
+#~ msgstr "Running Length"
+
+#~ msgid "Composer"
+#~ msgstr "Composer"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Play"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hey DJ"
+
+#~ msgid "All"
+#~ msgstr "All"
+
+#~ msgid "Artist"
+#~ msgstr "Artist"
+
+#~ msgid "Album"
+#~ msgstr "Album"
+
+#~ msgid "Track Title"
+#~ msgstr "Track Title"
+
+#~ msgid "Local"
+#~ msgstr "Local"
+
+#~ msgid "Sources"
+#~ msgstr "Sources"
+
+#~ msgid "Match"
+#~ msgstr "Match"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Music is the new GNOME music playing application."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "Search mode"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "If true, the search bar is shown."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Notifications mode"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Enables or disables playback notifications"
+
+#~ msgid "Untitled"
+#~ msgstr "Untitled"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Selected %d item"
+#~ msgstr[1] "Selected %d items"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Empty"
+#~ msgstr "Empty"
+
+#~ msgid "_Quit"
+#~ msgstr "_Quit"
+
+#~| msgid "New Playlist"
+#~ msgid "Select Playlist"
+#~ msgstr "Select Playlist"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "Max chars to display in track name on Artist view"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+
+#~ msgid "the a an"
+#~ msgstr "the a an"
+
+#~ msgid "All Artists"
+#~ msgstr "All Artists"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+
+#~ msgid "Load More"
+#~ msgstr "Load More"
+
+#~ msgid "_Now Playing"
+#~ msgstr "_Now Playing"
+
+#~ msgid "_Change Address Book..."
+#~ msgstr "_Change Address Book..."
+
+#~ msgid "_About Contacts"
+#~ msgstr "_About Contacts"
+
+#~ msgid "New"
+#~ msgstr "New"
+
+#~ msgid "Quit"
+#~ msgstr "Quit"
+
+#~ msgid "A GNOME 3 application to listen and manage music playlists"
+#~ msgstr "A GNOME 3 application to listen and manage music playlists"
+
+#~ msgid "Collection name"
+#~ msgstr "Collection name"
+
+#~ msgid "%02u:%02u:%02u"
+#~ msgstr "%02u:%02u:%02u"
+
+#~ msgid "%02u:%02u"
+#~ msgstr "%02u:%02u"
+
+#~ msgid "If true, do randomized playback through the collection"
+#~ msgstr "If true, do randomised playback through the collection"
diff --git a/po/eo.po b/po/eo.po
new file mode 100644
index 00000000..99f10331
--- /dev/null
+++ b/po/eo.po
@@ -0,0 +1,683 @@
+# Esperanto translation for gnome-music.
+# Copyright (C) 2013 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnome-music package.
+# dms <detlefkar@gmail.com>, 2013.
+# Daniel PUENTES <blatberk@openmailbox.org>, 2015.
+# Baptiste DARTHENAY < >, 2016.
+# Sébastien ZURFLUH <sebastien.zurfluh@gmail.com>, 2018.
+# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2013-2019.
+# Carmen Bianca BAKKER <carmen@carmenbianca.eu>, 2018-2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2019-05-08 14:02+0000\n"
+"PO-Revision-Date: 2019-05-10 13:04+0200\n"
+"Last-Translator: Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n"
+"Language-Team: Esperanto <gnome-eo-list@gnome.org>\n"
+"Language: eo\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"X-Generator: Gtranslator 3.32.0\n"
+"X-DamnedLies-Scope: partial\n"
+"X-Project-Style: gnome\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+msgid "GNOME Music"
+msgstr "GNOME Muziko"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Ludu kaj organizu vian muzikaron"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid ""
+"An easy way to play your music. Automatically discover music on your "
+"computer, the local network and internet services."
+msgstr ""
+"Facila maniero por ludi vian muzikon. Malkovru aŭtomate muzikon sur via "
+"komputilo, la loka reto, kaj retaj servoj."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, get music from DLNA servers or try "
+"something new with the Jamendo and Magnatune services."
+msgstr ""
+"Trovu muzikaĵojn en via loka kolekto, akiru muzikon de DLNA-serviloj, aŭ "
+"provu ion novan kun la Jamendo aŭ Magnatune servoj."
+
+#: data/org.gnome.Music.appdata.xml.in.in:34
+msgid "The GNOME Music developers"
+msgstr "Verkistoj de GNOME Muziko"
+
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/application.py:58
+#: gnomemusic/window.py:77
+msgid "Music"
+msgstr "Muziko"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Muzikludilo"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Muziko;Ludilo;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Dimensio de fenestro"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Dimensio de fenestro (larĝo kaj alto)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window position"
+msgstr "Pozicio de fenestro"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window position (x and y)."
+msgstr "Pozicio de fenestro (x kaj y)."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Window maximized"
+msgstr "Fenestro maksimumigita"
+
+#: data/org.gnome.Music.gschema.xml:23
+msgid "Window maximized state."
+msgstr "Maksimumigita stato de fenestro."
+
+#: data/org.gnome.Music.gschema.xml:27
+msgid "Playback repeat mode"
+msgstr "Ripeta reĝimo de muzikludo"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:29
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Valoro identigas ĉu ripeti aŭ hazardigi la ludadon tra la muzikaro. "
+"Permesataj valoroj estas: “none” (neniu: ripetado kaj miksado estas "
+"malŝaltita), “song” (muzikaĵo: ripetas la nunludantan muzikaĵon), "
+"“all” (ĉiu: ripeti la ludliston, ne hazardelekti), “shuffle” (hazardelekti "
+"ludliston, supozas ripetadon de ĉiuj)."
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Enable ReplayGain"
+msgstr "Ŝalti ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Ŝaltas aŭ malŝaltas ReplayGain por albumoj"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Inital state has been displayed"
+msgstr "Komenca stato estis montrita"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid "Set to true when initial state has been displayed"
+msgstr "Agordu al vero kiam komenca stato estas montrita"
+
+#: data/ui/AboutDialog.ui.in:9
+msgid "Copyright © 2018 GNOME Music Developers"
+msgstr "Kopirajto © 2018 Programistoj de GNOME Muziko"
+
+#: data/ui/AboutDialog.ui.in:10
+msgid "A music player and management application for GNOME."
+msgstr "Muzikludilo kaj -organizilo por GNOME."
+
+#: data/ui/AboutDialog.ui.in:12
+msgid "Visit GNOME Music website"
+msgstr "Vizitu la retejon de GNOME Muziko"
+
+#: data/ui/AboutDialog.ui.in:13
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version.\n"
+"\n"
+"“Magic of the vinyl” by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+"https://www.flickr.com/photos/_spy_/12270839403"
+msgstr ""
+"GNOME Muziko estas libera programaro; vi povas redistribui kaj/aŭ modifi ĝin "
+"laŭ la kondiĉoj de la Ĝenerala Publika Permesilo de GNU eldonite de la Free "
+"Software Foundation; aŭ en la 2a versio de la permesilo aŭ (laŭ via volo) en "
+"iu sekva versio.\n"
+"\n"
+"GNOME Muziko estas distribuite kun la espero ke ĝi estos utila, sed SEN IA "
+"AJN GARANTIO; eĉ sen la implica garantio de NEGOCEBLO aŭ ADAPTADO AL IU "
+"APARTA CELO. Vidu la Ĝeneralan Publikan Permesilon de GNU por pli da "
+"detaloj.\n"
+"\n"
+"Vi devintus ricevi kopion de la Ĝenerala Publika Permesilo de GNU kune kun "
+"GNOME Muziko; se ne, skribu al Free Software Foundation, Inc., 51 Franklin "
+"Street, kvina etaĝo, Boston, MA 02110-1301 Usono.\n"
+"\n"
+"La aŭtoroj de GNOME Muziko donas, per tio, permeson por uzi ne-GPL kongruajn "
+"GStreamer-kromprogramojn kaj disdoni GNOME Muziko kune kun GStreamer "
+"kromprogramoj. Tiu ĉi permeso superas la permesojn, kiuj estas donataj de "
+"la GPL-permesilo, sub kiu GNOME Muziko estas. Se vi modifas tiun ĉi kodon, "
+"vi povas plivastigi tiun ĉi escepton en la versio de via kodo, sed tio ne "
+"estas devenda. Se vi ne volas fari tion, forigu tiun ĉi esceptan ordonon de "
+"via versio.\n"
+"\n"
+"“Magic of the vinyl” de Sami Pyylampi, bildo estas rajtigite per CC-BY-SA "
+"2.0 https://www.flickr.com/photos/_spy_/12270839403"
+
+#: data/ui/AlbumWidget.ui:105
+msgid "Released"
+msgstr "Eldonita"
+
+#: data/ui/AlbumWidget.ui:121
+msgid "Running Length"
+msgstr "Ludada daŭro"
+
+#: data/ui/AlbumWidget.ui:166 gnomemusic/widgets/searchbar.py:71
+msgid "Composer"
+msgstr "Komponisto"
+
+#: data/ui/AppMenu.ui:21
+msgid "_Keyboard Shortcuts"
+msgstr "_Klavkombinoj"
+
+#: data/ui/AppMenu.ui:35
+msgid "_Help"
+msgstr "_Helpo"
+
+#: data/ui/AppMenu.ui:49
+msgid "_About Music"
+msgstr "_Pri Muziko"
+
+#: data/ui/HeaderBar.ui:13
+msgid "Menu"
+msgstr "Menuo"
+
+#: data/ui/HeaderBar.ui:36
+msgid "Select"
+msgstr "Elekti"
+
+#: data/ui/HeaderBar.ui:58 data/ui/PlaylistDialog.ui:255
+msgid "_Cancel"
+msgstr "_Nuligi"
+
+#: data/ui/HeaderBar.ui:77
+msgid "Search"
+msgstr "Serĉi"
+
+#: data/ui/HeaderBar.ui:100
+msgid "Back"
+msgstr "Reen"
+
+#: data/ui/help-overlay.ui:13
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Ĝeneralo"
+
+#: data/ui/help-overlay.ui:17
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Fermi fenestron"
+
+#: data/ui/help-overlay.ui:24
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Serĉilo"
+
+#: data/ui/help-overlay.ui:31
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Helpo"
+
+#: data/ui/help-overlay.ui:38
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Klavkombinoj"
+
+#: data/ui/help-overlay.ui:47
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Ludi"
+
+#: data/ui/help-overlay.ui:51
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Ludi/Paŭzi"
+
+#: data/ui/help-overlay.ui:58
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Sekva muzikaĵo"
+
+#: data/ui/help-overlay.ui:65
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Antaŭa muzikaĵo"
+
+#: data/ui/help-overlay.ui:72
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Baskuligi ripeton"
+
+#: data/ui/help-overlay.ui:79
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Baskuligi hazardelekton"
+
+#: data/ui/help-overlay.ui:88
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigado"
+
+#: data/ui/help-overlay.ui:92
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Iri al albumoj"
+
+#: data/ui/help-overlay.ui:99
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Iri al artistoj"
+
+#: data/ui/help-overlay.ui:106
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Iri al muzikaĵoj"
+
+#: data/ui/help-overlay.ui:113
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Iri al ludlistoj"
+
+#: data/ui/help-overlay.ui:120
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Reen iri"
+
+#: data/ui/PlayerToolbar.ui:6
+msgid "Shuffle"
+msgstr "Hazardelekti"
+
+#: data/ui/PlayerToolbar.ui:11
+msgid "Repeat All"
+msgstr "Ripeti ĉion"
+
+#: data/ui/PlayerToolbar.ui:16
+msgid "Repeat Song"
+msgstr "Ripeti muzikaĵon"
+
+#. Causes tracks to play in random order
+#: data/ui/PlayerToolbar.ui:21
+msgid "Shuffle/Repeat Off"
+msgstr "Ne hazardelekti, ne ripetadi"
+
+#: data/ui/PlayerToolbar.ui:70
+msgid "Previous"
+msgstr "Antaŭa"
+
+#: data/ui/PlayerToolbar.ui:86 gnomemusic/widgets/playertoolbar.py:143
+msgid "Play"
+msgstr "Ludi"
+
+#: data/ui/PlayerToolbar.ui:102
+msgid "Next"
+msgstr "Sekva"
+
+#: data/ui/PlaylistContextMenu.ui:5
+msgctxt "context menu item"
+msgid "Play"
+msgstr "Ludi"
+
+#: data/ui/PlaylistContextMenu.ui:9
+msgid "Add to Playlist…"
+msgstr "Aldoni al ludlisto…"
+
+#: data/ui/PlaylistContextMenu.ui:13
+msgid "Remove From Playlist"
+msgstr "Forigi el ludlisto"
+
+#: data/ui/PlaylistControls.ui:6
+msgid "_Play"
+msgstr "_Ludi"
+
+#: data/ui/PlaylistControls.ui:10
+msgid "_Delete"
+msgstr "_Forigi"
+
+#: data/ui/PlaylistControls.ui:14
+msgid "_Rename…"
+msgstr "_Alinomi…"
+
+#: data/ui/PlaylistControls.ui:33
+msgid "Playlist Name"
+msgstr "Ludlista nomo"
+
+#: data/ui/PlaylistControls.ui:67
+msgid "_Done"
+msgstr "Far_ita"
+
+#: data/ui/PlaylistDialog.ui:66
+msgid "Enter a name for your first playlist"
+msgstr "Enigu nomon por via unua ludlisto"
+
+#: data/ui/PlaylistDialog.ui:92
+msgid "C_reate"
+msgstr "_Krei"
+
+#: data/ui/PlaylistDialog.ui:155
+msgid "New Playlist…"
+msgstr "Nova ludlisto…"
+
+#: data/ui/PlaylistDialog.ui:169
+msgid "Add"
+msgstr "Aldoni"
+
+#: data/ui/PlaylistDialog.ui:252
+msgid "Add to Playlist"
+msgstr "Aldoni al ludlisto"
+
+#: data/ui/PlaylistDialog.ui:268
+msgid "_Add"
+msgstr "_Aldoni"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Elekti ĉiujn"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Elekti neniun"
+
+#: data/ui/SelectionBarMenuButton.ui:31 gnomemusic/widgets/headerbar.py:75
+msgid "Click on items to select them"
+msgstr "Alklaku erojn por elekti ilin"
+
+#: data/ui/SelectionToolbar.ui:9
+msgid "_Add to Playlist"
+msgstr "_Aldoni al ludlisto"
+
+#: gnomemusic/gstplayer.py:375
+msgid "Unable to play the file"
+msgstr "Ne eblas ludi la dosieron"
+
+#: gnomemusic/gstplayer.py:381
+msgid "_Find in {}"
+msgstr "_Trovi en {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:392
+msgid " and "
+msgstr " kaj "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:395
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:397
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} estas bezonata por ludi la dosieron, sed ĝi ne estas instalita."
+msgstr[1] ""
+"{} estas bezonataj por ludi la dosieron, sed ili ne estas instalitaj."
+
+#: gnomemusic/inhibitsuspend.py:72
+msgid "Playing music"
+msgstr "Ludi muzikon"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/playlists.py:59
+msgid "Most Played"
+msgstr "Plejofte luditaj"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/playlists.py:64
+msgid "Never Played"
+msgstr "Neniam luditaj"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/playlists.py:69
+msgid "Recently Played"
+msgstr "Lastatempe luditaj"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/playlists.py:74
+msgid "Recently Added"
+msgstr "Freŝaldonitaj"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/playlists.py:79
+msgid "Favorite Songs"
+msgstr "Favorataj muzikaĵoj"
+
+#: gnomemusic/utils.py:56
+#| msgid "Unknown Album"
+msgid "Unknown album"
+msgstr "Nekonata albumo"
+
+#: gnomemusic/utils.py:77
+msgid "Unknown Artist"
+msgstr "Nekonata artisto"
+
+#: gnomemusic/views/albumsview.py:46 gnomemusic/views/searchview.py:607
+msgid "Albums"
+msgstr "Albumoj"
+
+#: gnomemusic/views/artistsview.py:61 gnomemusic/views/searchview.py:609
+msgid "Artists"
+msgstr "Artistoj"
+
+#: gnomemusic/views/emptyview.py:67
+msgid "Music folder"
+msgstr "Muzika dosierujo"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:71
+msgid "The contents of your {} will appear here."
+msgstr "La enhavo de via {} aperos ĉi tie."
+
+#: gnomemusic/views/emptyview.py:105
+msgid "Hey DJ"
+msgstr "Hej DĴ"
+
+#: gnomemusic/views/emptyview.py:115 gnomemusic/views/emptyview.py:121
+msgid "No music found"
+msgstr "Neniu muziko trovita"
+
+#: gnomemusic/views/emptyview.py:123
+msgid "Try a different search"
+msgstr "Provu alian serĉon"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker"
+msgstr "GNOME Muziko ne povis konekti al Ŝanĝospurilo"
+
+#: gnomemusic/views/emptyview.py:132
+msgid "Your music files cannot be indexed without Tracker running"
+msgstr "Ne povis indeksigi viajn muzikdosierojn sen rulanta Ŝanĝospurilo"
+
+#: gnomemusic/views/playlistview.py:62 gnomemusic/views/searchview.py:613
+msgid "Playlists"
+msgstr "Ludlistoj"
+
+#: gnomemusic/views/playlistview.py:632
+msgid "Playlist {} removed"
+msgstr "Ludlisto {} forigita"
+
+#: gnomemusic/views/playlistview.py:638
+msgid "{} removed from {}"
+msgstr "{} forigita el {}"
+
+#: gnomemusic/views/searchview.py:611 gnomemusic/views/songsview.py:55
+msgid "Songs"
+msgstr "Muzikaĵoj"
+
+#: gnomemusic/widgets/albumwidget.py:171
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minuto"
+msgstr[1] "{} minutoj"
+
+#: gnomemusic/widgets/disclistboxwidget.py:141
+msgid "Disc {}"
+msgstr "Disko {}"
+
+#: gnomemusic/widgets/headerbar.py:72
+msgid "Selected {} item"
+msgid_plural "Selected {} items"
+msgstr[0] "{} ero elektita"
+msgstr[1] "{} eroj elektitaj"
+
+#: gnomemusic/widgets/notificationspopup.py:169
+msgid "Loading"
+msgstr "Ŝargante"
+
+#: gnomemusic/widgets/notificationspopup.py:232
+msgid "_Undo"
+msgstr "_Malfari"
+
+#: gnomemusic/widgets/playertoolbar.py:140
+msgid "Pause"
+msgstr "Paŭzi"
+
+#: gnomemusic/widgets/playlistcontrols.py:96
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} muzikaĵo"
+msgstr[1] "{} muzikaĵoj"
+
+#: gnomemusic/widgets/searchbar.py:68 gnomemusic/widgets/searchbar.py:117
+msgid "All"
+msgstr "Ĉiuj"
+
+#: gnomemusic/widgets/searchbar.py:69
+msgid "Artist"
+msgstr "Artisto"
+
+#: gnomemusic/widgets/searchbar.py:70
+msgid "Album"
+msgstr "Albumo"
+
+#: gnomemusic/widgets/searchbar.py:72
+msgid "Track Title"
+msgstr "Muzikaĵa titolo"
+
+#: gnomemusic/widgets/searchbar.py:118
+msgid "Local"
+msgstr "Loka"
+
+#: gnomemusic/widgets/searchbar.py:287
+msgid "Sources"
+msgstr "Fontoj"
+
+#: gnomemusic/widgets/searchbar.py:298
+msgid "Match"
+msgstr "Kongrui"
+
+#~ msgid "Untitled"
+#~ msgstr "Sentitola"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "_Quit"
+#~ msgstr "Ĉ_esi"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Muziko estas la nova muzikludanta aplikaĵo de GNOME."
+
+#~ msgid "gnome-music"
+#~ msgstr "gnome-music"
+
+#~ msgid "Search mode"
+#~ msgstr "Serĉa reĝimo"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Se vero, la serĉa breto estas montrata."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Reĝimo de sciigoj"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Ŝaltas aŭ malŝaltas muzikludajn sciigojn"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "%d ero elektita"
+#~ msgstr[1] "%d eroj elektitaj"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Empty"
+#~ msgstr "Malplena"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Elekti ludliston"
+
+#~ msgid "_Remove from Playlist"
+#~ msgstr "Forigi _el ludlisto"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr ""
+#~ "Maksimuma kvanto da karakteroj montrataj en la kantotitolo de la artisto-"
+#~ "vido"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Tiu ĉi agordo modifas la kvanton da karakteroj en la kantotitolo, ĉe la "
+#~ "Artisto vido antaŭ malvastigo de ĝi. Agordu tion ĉi kiel -1 por elŝalti "
+#~ "ĝin"
+
+#~ msgid "the a an"
+#~ msgstr "the la"
+
+#~ msgid "All Artists"
+#~ msgstr "Ĉiuj artistoj"
+
+#~ msgid "Not playing"
+#~ msgstr "Ne ludanta"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "far %s, de %s"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "Neniu muziko trovita!\n"
+#~ "Metu kelkajn dosierojn en la dosierujon %s"
+
+#~ msgid "Load More"
+#~ msgstr "Ŝarĝi pli"
+
+#~ msgid "Now _Playing"
+#~ msgstr "Nun _ludanta"
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 00000000..a2ed0c3f
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,858 @@
+# Spanish translation for gnome-music.
+# Copyright (C) 2012 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+# Daniel Mustieles <daniel.mustieles@gmail.com>, 2012-2021.
+# Daniel Mustieles García <daniel.mustieles@gmail.com>, 2021-2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-08 08:11+0200\n"
+"Last-Translator: Daniel Mustieles García <daniel.mustieles@gmail.com>\n"
+"Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n"
+"Language: es_ES\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"X-Generator: Gtranslator 42.0\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Música"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Reproducir y organizar su colección de música"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Una forma fácil y agradable de reproducir su música."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Busque pistas en su colección local, use listas de reproducción generadas "
+"automáticamente o cree una nueva."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Los desarrolladores de GNOME Música"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Reproductor de música"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Música;Reproductor;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Tamaño de la ventana"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Tamaño de la ventana (anchura y altura)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Ventana maximizada"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Estado maximizado de la ventana."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Modo de repetición de la reproducción"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Valor que indica si se debe repetir o aleatorizar la reproducción de la "
+"colección. Los valores admitidos son: «ninguno» (las opciones de repetir y "
+"mezclar están desactivadas), «canción» (repetir la canción actual), "
+"«todas» (repetir la lista de reproducción, sin mezclar), «mezclar» (mezclar "
+"la lista de reproducción, se repiten todas)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Activar ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Activa o desactiva ReplayGain para los álbumes"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Suspensión de inhibición del sistema"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Activa o desactiva la suspensión de inhibición el sistema al reproducir "
+"música"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Enviar histórico de música a Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Activa o desactiva el envío de «scrobbles» e información de «reproduciendo "
+"actualmente» a Last.fm"
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Reproducir"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Reproducir"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Añadir a canciones _favoritas"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Añadir a la lista de reproducción…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Cuenta de Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Informar de música que se está escuchando"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Atajos del teclado"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Ayuda"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Acerca de Música"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Bienvenido a Música"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menú"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Seleccionar"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Cancelar"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Buscar"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Atrás"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "General"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Cerrar ventana"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Buscar"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Ayuda"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Atajos"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Reproducir"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Reproducir/Pausar"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Siguiente canción"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Canción anterior"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Conmutar repetición"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Conmutar mezcla"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navegación"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Ir a los álbumes"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Ir a los artistas"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Ir a las canciones"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Ir a las listas de reproducción"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Retroceder"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm es un servicio de descubrimiento de música que le ofrece "
+"recomendaciones personalizadas basadas en la música que escucha."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Informe de música no configurado"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Inicie sesión en su cuneta de Last.fm para informar de la música que escucha."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Iniciar sesión"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Anterior"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Siguiente"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Eliminar"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Renombrar…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Nombre de la lista de reproducción"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Hecho"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Introduzca un nombre para su primera lista de reproducción"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "C_rear"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Lista de reproducción nueva…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Añadir"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Añadir a la lista de reproducción"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Añadir"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artistas"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Ver todo"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Álbumes"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Canciones"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Seleccionar todos"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Seleccionar ninguno"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Pulse sobre los elementos para seleccionarlos"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "Añadir a la _lista de reproducción"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Quitar de la lista de reproducción"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "El Proyecto GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Daniel Mustieles <daniel.mustieles@gmail.com>, 2012-2022"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright Desarrolladores de GNOME Música"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Traducido por"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Más reproducidas"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "No reproducidas nunca"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Reproducidas recientemente"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Añadidas recientemente"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Canciones favoritas"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "No se puede reproducir el archivo"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Buscar en {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " y "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "Se necesita {} para reproducir el archivo, pero no está instalado."
+msgstr[1] ""
+"Se necesitan {} para reproducir el archivo, pero no están instalados."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Reproducir música"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "No mezclar ni repetir"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Repetir canción"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Repetir todas"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Mezclar"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Lista de reproducción {} eliminada"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Deshacer"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} eliminado de {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Álbum desconocido"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Artista desconocido"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Su carpeta Música de XDG no está configurada"
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Carpeta de música"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "El contenido de su {} aparecerá aquí."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "No se encontró ningún registro"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Abrir el cuadro de diálogo de buscar"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Música no se ha podido conectar a Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Sus archivos de música no se pueden indexar si Tracker no está en ejecución."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Su versión de Tracker no está actualizada."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Música necesita Tracker 3.0.0 o superior."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Listas de reproducción"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Resultados de artistas"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Resultados de álbumes"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minuto"
+msgstr[1] "{} minutos"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disco {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} canción seleccionada"
+msgstr[1] "{} canciones seleccionadas"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "La música que escucha se envía a Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "La música que escucha no se envía a Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Sesión iniciada como {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Configurar"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pausar"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} canción"
+msgstr[1] "{} canciones"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Buscar canciones, artistas, álbumes y listas de reproducción"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Una aplicación para gestionar y reproducir música en GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Visitar la página web de GNOME Music"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME Música es software libre; puede redistribuirlo y/o modificarlo bajo "
+#~ "los términos de la Licencia Pública General GNU tal como la publica la "
+#~ "Free Software Foundation; ya sea en la versión 2 de la Licencia, como (a "
+#~ "su elección) cualquier otra versión posterior.\n"
+#~ "\n"
+#~ "GNOME Música se distribuye con el ánimo de que le será útil, pero SIN "
+#~ "NINGUNA GARANTÍA; sin incluso la garantía implícita de MERCANTILIDAD o "
+#~ "IDONEIDAD PARA UN PROPÓSITO DETERMINADO. Vea la Licencia Pública General "
+#~ "de GNU para más detalles.\n"
+#~ "\n"
+#~ "Debería haber recibido una copia de la Licencia Pública General GNU junto "
+#~ "Música si no, escriba a la Free Software Foundation,Inc., 51 Franklin "
+#~ "Street, Fifth Floor, Boston, MA 02110-1301 EE. UU.\n"
+#~ "\n"
+#~ "Los autores de GNOME Música conceden permiso para usar y distribuir "
+#~ "complementos de GStreamer no compatibles con la GPL. Este permiso está "
+#~ "por encima y más allá de los permisos concedidos por la GPL, por la que "
+#~ "GNOME Música está cubierta. Si modifica este código, puede ampliar esta "
+#~ "excepción a su versión del código, pero no está obligado a hacerlo. Si no "
+#~ "quiere hacerlo, elimine esta sentencia de excepción de su versión.\n"
+#~ "\n"
+#~ "La imagen «Magic of the vinyl» de Sami Pyylampi está licenciada bajo la "
+#~ "CC-BY-SA 2.0 https://www.flickr.com/photos/_spy_/12270839403"
+
+#~| msgid "The contents of your {} will appear here."
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "El contenido de su carpeta Música aparecerá aquí"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME Música"
+
+#~ msgid "Window position"
+#~ msgstr "Posición de la ventana"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Posición de la ventana (x e y)."
+
+#~ msgid "Loading"
+#~ msgstr "Cargando"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Añadir a la lista de reproducción…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Una manera sencilla de reproducir su música. Descubra música "
+#~ "automáticamente en su equipo, la red local y los servicios de Internet."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Buscar pistas en su colección local, obtener música de servidores DNA o "
+#~ "probar algo nuevo con los servicios de Jamendo y Magnatunes."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Se ha mostrado el estado inicial"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Establecer a cierto cuando se haya mostrado el estado inicial"
+
+#~ msgid "Released"
+#~ msgstr "Publicado"
+
+#~ msgid "Running Length"
+#~ msgstr "Duración"
+
+#~ msgid "Composer"
+#~ msgstr "Compositor"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Reproducir"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hola Dj"
+
+#~ msgid "All"
+#~ msgstr "Todas"
+
+#~ msgid "Artist"
+#~ msgstr "Artista"
+
+#~ msgid "Album"
+#~ msgstr "Álbum"
+
+#~ msgid "Track Title"
+#~ msgstr "Título de la pista"
+
+#~ msgid "Local"
+#~ msgstr "Local"
+
+#~ msgid "Sources"
+#~ msgstr "Fuentes"
+
+#~ msgid "Match"
+#~ msgstr "Coincidencia"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "Sin título"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Música es la nueva aplicación de GNOME para reproducir música."
+
+#~ msgid "_Quit"
+#~ msgstr "_Salir"
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "%d elemento seleccionado"
+#~ msgstr[1] "%d elementos seleccionados"
+
+#~ msgid "Empty"
+#~ msgstr "Vacío"
+
+#~ msgid "Search mode"
+#~ msgstr "Modo de búsqueda"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Si es cierto, se muestra la barra de búsqueda."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Modo de notificaciones"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Activa o desactiva las notificaciones de la reproducción"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Seleccionar lista de reproducción"
+
+#~ msgid "the|a|an"
+#~ msgstr "el|la|los|las|un|una"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr ""
+#~ "Número máximo de caracteres que mostrar en la vista del nombre de la "
+#~ "pista o del artista"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Este valor modifica la cantidad de caracteres que mostrar en la vista del "
+#~ "título de la pista de del artista antes de recortarlo. Establecer a -1 "
+#~ "para desactivarlo"
+
+#~ msgid "the a an"
+#~ msgstr "el la los las un uno una"
+
+#~ msgid "All Artists"
+#~ msgstr "Todos los artistas"
+
+#~ msgid "Not playing"
+#~ msgstr "No está reproduciendo"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "por %s, en %s"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Lista de reproducción nueva"
+
+#~ msgid "the"
+#~ msgstr "el la"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "No se ha encontrado música.\n"
+#~ " Copie algunos archivos en la carpeta %s"
+
+#~ msgid "Load More"
+#~ msgstr "Cargar más"
+
+#~ msgid "Now _Playing"
+#~ msgstr "_Reproduciendo ahora"
+
+#~ msgid "Selected %d items"
+#~ msgstr "%d elementos seleccionados"
+
+#~| msgid "Songs"
+#~ msgid "%d Songs"
+#~ msgstr "%d canciones"
+
+#~ msgid "----"
+#~ msgstr "----"
+
+#~ msgid "--:--"
+#~ msgstr "--:--"
+
+#~| msgid "00:00"
+#~ msgid "0:00"
+#~ msgstr "0:00"
+
+#~ msgid "/"
+#~ msgstr "/"
+
+#~ msgid "<span color='grey'>Released</span>"
+#~ msgstr "<span color='grey'>Publicado</span>"
+
+#~ msgid "<span color='grey'>Running Length</span>"
+#~ msgstr "<span color='grey'>Duración</span>"
+
+#~ msgid "Shuffle playback"
+#~ msgstr "Reproducción aleatoria"
+
+#~ msgid "If true, do randomized playback through the collection"
+#~ msgstr "Si es cierto, reproducir la colección de manera aleatoria"
+
+#~ msgid "label"
+#~ msgstr "etiqueta"
+
+#~ msgid "_Change Address Book..."
+#~ msgstr "_Cambiar libreta de direcciones…"
+
+#~ msgid "_About Contacts"
+#~ msgstr "_Acerca de Contactos"
+
+#~ msgid "New"
+#~ msgstr "Nuevo"
+
+#~ msgid "Quit"
+#~ msgstr "Salir"
+
+#~ msgid "A GNOME 3 application to listen and manage music playlists"
+#~ msgstr ""
+#~ "Una aplicación de GNOME 3 para escuchar y gestionar listas de "
+#~ "reproducción de música"
+
+#~ msgid "Collection name"
+#~ msgstr "Nombre de la colección"
+
+#~ msgid "%02u:%02u:%02u"
+#~ msgstr "%02u:%02u:%02u"
+
+#~ msgid "%02u:%02u"
+#~ msgstr "%02u:%02u"
diff --git a/po/et.po b/po/et.po
new file mode 100644
index 00000000..cdd8e080
--- /dev/null
+++ b/po/et.po
@@ -0,0 +1,232 @@
+# Estonian translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2013-09-18 20:45+0000\n"
+"PO-Revision-Date: 2013-09-20 18:49+0300\n"
+"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
+"Language-Team: Estonian <gnome-et-list@gnome.org>\n"
+"Language: et\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.5.4\n"
+
+msgid "Window size"
+msgstr "Akna suurus"
+
+msgid "Window size (width and height)."
+msgstr "Akna suurus (laius ja kõrgus)."
+
+msgid "Window position"
+msgstr "Akna asukoht"
+
+msgid "Window position (x and y)."
+msgstr "Akna asukoht (x ja y)."
+
+msgid "Window maximized"
+msgstr "Aken on maksimeeritud"
+
+msgid "Window maximized state."
+msgstr "Akna maksimeerituse olek."
+
+msgid "Playback repeat mode"
+msgstr "Esituse kordamise režiim"
+
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: \"none\", \"song\", \"all\", \"shuffle\"."
+msgstr ""
+"Väärtus määrab, kas korratakse või esitatakse kogumikku juhuslikus "
+"järjekorras. Võimalikud väärtused on: \"none\" (pole), \"song\" (laul), \"all"
+"\" (kõiki) või \"shuffle\" (juhuslik)."
+
+msgid "Search mode"
+msgstr "Otsingu režiim"
+
+msgid "If true, the search bar is shown."
+msgstr "Kui märgitud, kuvatakse otsinguriba."
+
+msgid "Music"
+msgstr "Muusika"
+
+msgid "Music Player"
+msgstr "Muusikamängija"
+
+msgid "Play and organize your music collection"
+msgstr "Mängi ja halda oma muusikakogu"
+
+msgid "GNOME Music"
+msgstr "GNOME muusika"
+
+msgid "Music is the new GNOME music playing application."
+msgstr "Muusika on uus GNOME muusikamängimise rakendus."
+
+msgid "Untitled"
+msgstr "Ilma pealkirjata"
+
+msgid "Not playing"
+msgstr "Ei mängi"
+
+msgid "Unknown Artist"
+msgstr "Tundmatu esitaja"
+
+msgid "Unknown Album"
+msgstr "Tundmatu album"
+
+#. TRANSLATORS: by refers to the artist, from to the album
+#, python-format
+msgid "by %s, from %s"
+msgstr "esitaja %s, album %s"
+
+msgid "Previous"
+msgstr "Eelmine"
+
+msgid "Pause"
+msgstr "Paus"
+
+msgid "Play"
+msgstr "Mängi"
+
+msgid "Next"
+msgstr "Järgmine"
+
+#, python-format
+msgid ""
+"No Music found!\n"
+" Put some files into the folder %s"
+msgstr ""
+"Muusikat ei leitud!\n"
+" Pane mõned failid %s kausta"
+
+msgid "Albums"
+msgstr "Albumid"
+
+msgid "Songs"
+msgstr "Laulud"
+
+msgid "Playlists"
+msgstr "Loendid"
+
+msgid "Artists"
+msgstr "Esitajad"
+
+msgid "All Artists"
+msgstr "Kõik esitajad"
+
+msgid "Load More"
+msgstr "Laadi veel"
+
+msgid "Loading..."
+msgstr "Laadimine..."
+
+msgid "Empty"
+msgstr "Tühi"
+
+msgid "Copyright © 2013 GNOME Music Developers"
+msgstr "Copyright © 2013 GNOME muusika arendajad"
+
+msgid "A music player and management application for GNOME."
+msgstr "GNOME muusikamängija ja haldamise rakendus."
+
+msgid "Visit GNOME Music website"
+msgstr "Külasta GNOME muusika kodulehte"
+
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+"GNOME muusika on vaba tarkvara. Te võite seda edasi levitada ja/või muuta "
+"vastavalt GNU Üldise Avaliku Litsentsi tingimustele, nagu need on Vaba "
+"Tarkvara Fondi poolt avaldatud; kas Litsentsi versioon number 3 või "
+"(vastavalt Teie valikule) ükskõik milline hilisem versioon.\n"
+"\n"
+"GNOME muusikat levitatakse lootuses, et see on kasulik, kuid ILMA IGASUGUSE "
+"GARANTIITA; isegi KESKMISE/TAVALISE KVALITEEDIGARANTIITA või SOBIVUSELE "
+"TEATUD KINDLAKS EESMÄRGIKS. Üksikasjade suhtes vaata GNU Üldist Avalikku "
+"Litsentsi.\n"
+"\n"
+"Te peaks olema saanud GNU Üldise Avaliku Litsentsi koopia koos GNOME "
+"muusikaga. Kui mitte, kirjutage aadressil Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"GNOME muusika autorid lubavad kasutada ja levitada GPL-iga mitteühilduvaid "
+"GStreameri pluginaid koos GStreameri ja GNOME muusikaga. See õigus on ülem "
+"võrreldes GPL litsentsiga antud õigustega, mis käivad GNOME muusika kohta. "
+"Kui sa muudad seda koodi, võid sa seda erandit rakendada ka oma koodile, "
+"kuid see pole kohustuslik. Kui sa ei soovi seda teha, kustuta see avaldus "
+"oma versioonist."
+
+msgid "Released"
+msgstr "Aasta"
+
+msgid "Running Length"
+msgstr "Esituse pikkus"
+
+msgid "_New Playlist"
+msgstr "_Uus loend"
+
+msgid "_Now Playing"
+msgstr "_Praegu mängib"
+
+msgid "_About Music"
+msgstr "_Programmist lähemalt"
+
+msgid "_Quit"
+msgstr "_Lõpeta"
+
+msgid "Shuffle"
+msgstr "Juhuslik"
+
+msgid "Repeat All"
+msgstr "Korratakse kõiki"
+
+msgid "Repeat Song"
+msgstr "Korratakse laulu"
+
+msgid "Shuffle/Repeat Off"
+msgstr "Juhuslik/kordus väljas"
+
+msgid "No Music Found"
+msgstr "Muusikat ei leitud"
+
+msgid "Select All"
+msgstr "Vali kõik"
+
+msgid "Select None"
+msgstr "Tühista valik"
+
+msgid "Click on items to select them"
+msgstr "Kirje valimiseks klõpsa sellel"
+
+msgid "Cancel"
+msgstr "Loobu"
+
+msgid "Add to Playlist"
+msgstr "Lisa loendisse"
diff --git a/po/eu.po b/po/eu.po
new file mode 100644
index 00000000..008fd248
--- /dev/null
+++ b/po/eu.po
@@ -0,0 +1,694 @@
+# Basque translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# Iñaki Larrañaga Murgoitio <dooteo@zundan.com>, 2013, 2014, 2015, 2016, 2017.
+# Asier Sarasua Garmendia <asiersarasua@ni.eus>, 2013, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr "Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-14 10:00+0100\n"
+"Last-Translator: Asier Sarasua Garmendia <asiersarasua@ni.eus>\n"
+"Language-Team: Basque <librezale@librezale.eus>\n"
+"Language: eu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Musika"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Erreproduzitu eta antolatu zure musika-bilduma"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Musika erreproduzitzeko modu erraz eta atsegina."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr "Bilatu pistak zure bilduma lokalean, erabili automatikoki sortutako erreprodukzio-zerrendak edo sortu zerrenda berria."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "GNOME Musika aplikazioaren garatzaileak"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Musika-erreproduzitzailea"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Musika;Erreproduzitzailea;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Leihoaren tamaina"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Leihoaren tamaina (zabalera eta altuera)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Leihoa maximizatuta"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Leiho maximizatuaren egoera."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Erreprodukzioa errepikatzeko modua"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr "Balioak erreprodukzioa errepikatuko edo ausaz erreproduzituko den bilduman zehar zehazten du. Balio erabilgarriak: “none” (errepikatzea edo ausaz erreproduzitzea desgaituta), “song” (errepikatu uneko abestia), “all” (errepikatu erreprodukzio-zerrenda, ez-ausaz) eta “shuffle” (ausaz erreproduzitu zerrenda, osoa errepikatuko duela suposatzen da)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Gaitu 'ReplayGain' (erreprodukzioaren irabazia)"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Albumen erreprodukzioen irabazia (ReplayGain) gaitzen/desgaitzen du"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Galarazi sistema esekitzea"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "Musika erreproduzitzen ari den bitartean sistema eseki dadin galarazten du"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Igorri musika-historia Last.fm guneari"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr "Abestien izenak eta \"unean erreproduzitzen\" Last-fm guneari igortzea gaitzen edo desgaitzen du."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Erreproduzitu"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Erreproduzitu"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Gehitu _gogoko abestiei"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "Gehitu e_rreprodukzio-zerrendari…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm kontua"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Eman musika entzutearen berri"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "Las_ter-teklak"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Laguntza"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Musikari buruz"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Ongi etorri Musika aplikaziora"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menua"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Hautatu"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Utzi"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Bilatu"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Atzera"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Orokorra"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Itxi leihoa"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Bilatu"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Laguntza"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Lasterbideak"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Erreproduzitu"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Erreproduzitu/pausarazi"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Hurrengoa abestia"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Aurreko abestia"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Txandakatu errepikatzea"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Txandakatu ausazkoa"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Nabigazioa"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Joan albumetara"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Joan artistetara"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Joan abestietara"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Joan zerrendatara"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Joan atzera"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr "Last.fm musika aurkitzeko zerbitzu bat da, entzuten duzun musikaren araberako gomendio pertsonalizatuak ematen dizkizuna."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Abestien berri ematea ez dago konfiguratuta"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Hasi saioa zure Last.fm kontuan entzuten duzun musikaren berri emateko."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Saio-hasiera"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Aurrekoa"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Hurrengoa"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "Ez_abatu"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "Be_rrizendatu…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Zerrendaren izena"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Eginda"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Sartu aurreneko zerrendaren izena"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Sortu"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Erreprodukzio-zerrenda berria…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Gehitu"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Gehitu erreprodukzio-zerrendari…"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Gehitu"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artistak"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Ikusi dena"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albumak"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Abestiak"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Hautatu dena"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Ez hautatu ezer"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Egin klik elementuen gainean hautatzeko"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Gehitu zerrendari"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Kendu erreprodukzio-zerrendatik"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "GNOME proiektua"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "translator-credits"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright GNOME Musika aplikazioaren garatzaileak"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Itzultzaileak"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Gehien erreproduzitua"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Inoiz erreproduzitu gabea"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Azken aldian erreproduzitua"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Azken aldian gehitua"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Gogoko abestiak"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Ezin da fitxategia erreproduzitu"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Bilatu hemen: {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " eta "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} behar da fitxategia erreproduzitzeko, baina ez dago instalatuta."
+msgstr[1] "{} behar dira fitxategia erreproduzitzeko, baina ez daude instalatuta."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Musika erreproduzitzen"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Ausaz/Ez errepikatu"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Errepikatu abestia"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Errepikatu dena"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Ausaz"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "{} zerrenda kenduta"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Desegin"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} kenduta hemendik: {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Album ezezaguna"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Artista ezezaguna"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Zure XDG musika direktorioa ez dago ezarrita."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Musikaren karpeta"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Zure {} edukiak hemen agertuko dira."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Ez da musikarik aurkitu"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Saiatu bestelako bilaketa bat"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Musikak ezin izan du Tracker-ekin konektatu."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Zure musika-fitxategiak ezin dira indexatu Tracker exekutatzen ez bada."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Zure sistemako Tracker bertsioa zaharkituta dagoela dirudi."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Musika aplikazioak Tracker 3.0.0 bertsioa edo berriagoa behar du."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Erreprodukzio-zerrendak"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Artisten emaitzak"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Albumen emaitzak"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "Minutu {}"
+msgstr[1] "{} minutu"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "{} diskoa"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Abesti {} hautatuta"
+msgstr[1] "{} abesti hautatuta"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Entzuten duzun musikaren berri ematen ari zaio Last-fm zerbitzuari."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Entzuten duzun musikaren berri ez zaio ematen ari Last-fm zerbitzuari."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Saioa hasita {} erabiltzailearekin"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Konfiguratu"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pausatu"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "Abesti {}"
+msgstr[1] "{} abesti"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Bilatu abestiak, artistak, albumak eta erreprosukzio-zerrendak"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "GNOMEren aplikazio bat musika erreproduzitzeko eta kudeatzeko."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Bisitatu GNOME Music-en webgunea"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME Musika software librea da; birbana eta/edo alda dezakezu Free "
+#~ "Software Foundation-ek argitaratutako GNU Lizentzia Publiko Orokorraren "
+#~ "2. bertsioan, edo (nahiago baduzu) bertsio berriago batean, jasotako "
+#~ "baldintzak betez gero.\n"
+#~ "\n"
+#~ "GNOME Musika erabilgarria izango delakoan banatzen da, baina INOLAKO "
+#~ "BERMERIK GABE; era berean, ez da bermatzen beraren EGOKITASUNA "
+#~ "MERKATURATZEKO edo HELBURU PARTIKULARRETARAKO ERABILTZEKO. Argibide "
+#~ "gehiago nahi izanez gero, ikus GNU Lizentzia Publiko Orokorra.\n"
+#~ "\n"
+#~ "Programa honekin batera GNU Lizentzia Publiko Orokorraren kopia bat ere "
+#~ "jaso beharko zenuke; horrela ez bada, idatzi helbide honetara: Free "
+#~ "Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA "
+#~ "02111-1301, USA.\n"
+#~ "\n"
+#~ "GNOME Musikaren egileek baimena ematen dute GPL lizentziarekin "
+#~ "bateragarriak ez diren GStreamer pluginak erabiltzeko eta banatzeko "
+#~ "GStreamerrekin eta GNOME Musikarekin batera. Baimen hori GNOME Musikak "
+#~ "darabilen GPL lizentziak ematen dituen baimenen gainetik eta haratago "
+#~ "dago. Kode hau aldatzen baduzu, salbuespen hori kodearen zure bertsiora "
+#~ "hedatu dezakezu, baina ez zaude hori egitera behartuta. Ez baduzu egin "
+#~ "nahi, ezabatu salbuespen-adierazpen hau zure bertsiotik."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Zure 'Musika' karpetaren edukiak hemen agertuko dira"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME Musika"
+
+#~ msgid "Window position"
+#~ msgstr "Leihoaren posizioa"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Leihoaren posizioa (x eta y)."
+
+#~ msgid "Loading"
+#~ msgstr "Kargatzen"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Gehitu erreprodukzio-zerrendari…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Zure musika errproduzitzeko modu erraza. Aurkitu musika automatikoki zure "
+#~ "ordenagailuan, sare lokalean eta lineako zerbitzuetan."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Aurkitu pistak zure bilduma lokalean, eskuratu musika DLNA "
+#~ "zerbitzarietatik edo bilatuzerbait berria Jamendu eta Magnatune "
+#~ "zerbitzuetan."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Hasierako egoera bistaratu da"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Ezarri TRUE (egia) gisa hasierako egoera bistaratzen denean"
+
+#~ msgid "Released"
+#~ msgstr "Argitaratua"
+
+#~ msgid "Running Length"
+#~ msgstr "Iraupena"
+
+#~ msgid "Composer"
+#~ msgstr "Konpositorea"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Erreproduzitu"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hi DJ"
+
+#~ msgid "All"
+#~ msgstr "Denak"
+
+#~ msgid "Artist"
+#~ msgstr "Artista"
+
+#~ msgid "Album"
+#~ msgstr "Albuma"
+
+#~ msgid "Track Title"
+#~ msgstr "Pistaren titulua"
+
+#~ msgid "Local"
+#~ msgstr "Lokala"
+
+#~ msgid "Sources"
+#~ msgstr "Iturburuak"
+
+#~ msgid "Match"
+#~ msgstr "Parekatu"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "Izengabea"
diff --git a/po/fa.po b/po/fa.po
new file mode 100644
index 00000000..02bfbeda
--- /dev/null
+++ b/po/fa.po
@@ -0,0 +1,785 @@
+# Persian translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# royaniva <royaniva@outlook.com >, 2013.
+# Arash Mousavi <mousavi.arash@gmail.com>, 2013-2017.
+# Danial Behzadi <dani.behzi@ubuntu.com>, 2014, 2018-2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-07-31 02:14+0330\n"
+"Last-Translator: Danial Behzadi <dani.behzi@ubuntu.com>\n"
+"Language-Team: Persian <>\n"
+"Language: fa\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6 data/org.gnome.Music.desktop.in.in:3
+#: gnomemusic/about.py:243 gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "آهنگ‌ها"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7 data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "پخش و سازمان‌دهی مجموعه آهنگ‌هایتان"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "راهی آسان و دلپذیر برای پخش آهنگ‌هایتان."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists or "
+"curate a fresh one."
+msgstr ""
+"یافتن قطعه‌ها در مجموعهٔ محلّیتان با استفاده از سیاهه‌های پخش ایجاد شده به صورت "
+"خودکار یا ساختن سیاهه‌ای تازه."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "توسعه‌دهندگان آهنگ‌های گنوم"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "پخش‌کنندهٔ آهنگ"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;پخش‌کننده‌;موزیک;آهنگ;موسیقی;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "اندازهٔ پنجره"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "اندازهٔ پنجره (پهنا و بلندا)"
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "پنجره بیشینه شد"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "حالت بیشینهٔ پنجره."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "حالت تکرار پخش"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the collection. "
+"Allowed values are: “none” (repeat and shuffle are off), “song” (repeat current "
+"song), “all” (repeat playlist, no shuffle), “shuffle” (shuffle playlist, "
+"presumes repeat all)."
+msgstr ""
+"مقدار مشخص می‌کند که آیا پخش در میان مجموعه تکرار شود یا به صورت تصادفی باشد. "
+"مقادیر معتبر عبارتند از: «none» (تکرار و بر زدن خاموش)، «song» (آواز کنونی تکرار "
+"می‌شود)، «all» (سیاههٔ پخش بدون بر زدن تکرار می‌شود)، «shuffle» (بر زدن سیاههٔ پخش "
+"با حفظ تکرار همه)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "فعال‌سازی ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "به یا از کار انداختن ReplayGain برای آلبوم‌ها"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "جلوگیری از تعلیق سامانه"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "به یا از کار انداختن جلوگیری از تعلیق سامانه هنگام پخش آهنگ"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "گزارش تاریخچهٔ آهنگ‌ها به لست.اف‌ام"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to Last."
+"fm."
+msgstr "به یا از کار انداختن فرستادن اطلاعات پخش به لست.اف‌‌ام."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "پخش"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_پخش"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "افزودن به آوازهای _محبوب"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_افزودن به سیاههٔ پخش…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "حساب لست.اف‌ام"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "گزارش گوش دادن به آهنگ"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "میان‌برهای _صفحه‌کلید"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_راهنما"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_دربارهٔ آهنگ‌ها"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "به آهنگ‌ها خوش آمدید"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "فهرست"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "گزینش"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_لغو"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "جست‌وجو"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "برگشت"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "عمومی"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "بستن پنجره"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "جست‌وجو"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "راهنما"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "میان‌برها"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "پخش"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "پخش/مکث"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "آهنگ بعد"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "آهنگ پیشین"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "تغییر وضعیت تکرار"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "تغییر وضعیت بر زدن"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "ناوبری"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "رفتن به آلبوم‌ها"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "رفتن به هنرمندان"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "رفتن به آهنگ‌ها"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "رفتن به سیاهه‌های پخش"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "بازگشت"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised recommendations "
+"based on the music you listen to."
+msgstr ""
+"لست.اف‌ام یک خدت کشف آهنگ است که به شما پیشنهادهایی شخصی‌شده بر اساس آهنگ‌هایی که "
+"گوش می‌کنید می‌دهد."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "گزارش آهنگ برپا نشده"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "برای گزارش گوش کردنتان به آهنگ‌ها، وارد حساب لست.اف‌امتان شوید."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "ورود"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "پیشین"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "بعدی"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_حذف"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_تغییر نام…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "نام سیاههٔ پخش"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_انجام شد"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "نامی برای نخستین سیاههٔ پخشتان وارد کنید"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "ا_یجاد"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "سیاههٔ پخش جدید…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "افزودن"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "افزودن به سیاههٔ پخش"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "ا_فزودن"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "هنرمندان"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "نمایش همه"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "آلبوم‌ها"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "آوازها"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "گزینش همه"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "گزینش هیچ‌کدام"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "برای گزینش موارد،‌رویشان کلیک کنید"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "ا_فزودن به سیاههٔ پخش"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_برداشتن از سیاههٔ پخش"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "پروژهٔ گنوم"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "دانیال بهزادی <dani.behzi@ubuntu.com>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "حق‌رونوشت توسعه‌دهندگان آهنگ‌های گنوم"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "بازگردانی به دست"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "بیش‌ترین پخش شده"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "هرگز پخش نشده"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "اخیراً پخش شده"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "اخیراً اضافه شده"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "آوازهای محبوب"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "نمی‌توان پرونده را پخش کرد"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_یافتن در {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " و "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr "، "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "برای پخش پرونده نیاز به {} است، ولی نصب نشده."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "در حال پخش آهنگ"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "خاموشی بر زدن/تکرار"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "تکرار آواز"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "تکرار همه"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "بر زدن"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "سیاههٔ پخش {} برداشته شد"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "برگردان"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} از {} برداشته شد"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "آلبوم ناشناس"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "هنرمند ناشناس"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "شاخهٔ آهنگ XDGتان تنظیم نشده است."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "شاخهٔ موسیقی"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "محتویات {} شما در اینجا نمایان می‌شوند."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "هیچ آهنگی پیدا نشد"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "جست‌وجویی دیگر را بیازمایید"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "آهنگ‌های گنوم نتوانست به ردیاب وصل شود."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "بدون وجود ردیاب، پرونده‌های آهنگتان قادر به فهرست‌شدن نیستند."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "به نظر نگارش ردیاب سامانه‌تان قدیمی است."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "آهنگ‌ها به نگارش ۳٫۰٫۰ یا بالاتر ردیاب نیاز دارد."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "سیاهه‌های پخش"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "نتیجه‌های هنرمندان"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "نتیجه‌های آلبوم‌ها"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} دقیقه"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "دیسک {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} آواز گزیده"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "گوش دادنتان به آهنگ‌ها به لست.اف‌ام گزارش شد."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "گوش دادنتان به آهنگ‌ها به لست.اف‌ام گزارش نشد."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "وارد شده به عنوان {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "پیکربندی"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "مکث"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} آهنگ"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "جست‌وجوی آهنگ‌ها، هنرمندان و سیاهه‌های پخش"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "یک برنامه مدیریت و پخش آهنگ‌ها برای گنوم."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "پایگاه وب آهنگ‌های گنوم را ببینید"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it under "
+#~ "the terms of the GNU General Public License as published by the Free Software "
+#~ "Foundation; either version 2 of the License, or (at your option) any later "
+#~ "version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+#~ "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS "
+#~ "FOR A PARTICULAR PURPOSE. See the GNU General Public License for more "
+#~ "details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along with "
+#~ "GNOME Music; if not, write to the Free Software Foundation, Inc., 51 Franklin "
+#~ "Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted by "
+#~ "the GPL license by which GNOME Music is covered. If you modify this code, "
+#~ "you may extend this exception to your version of the code, but you are not "
+#~ "obligated to do so. If you do not wish to do so, delete this exception "
+#~ "statement from your version."
+#~ msgstr ""
+#~ "آهنگ‌های گنوم یک نرم‌افزار آزاد است؛ می‌توانید آن را با شرایط نگارش ۲ یا (بنا به "
+#~ "نظرتان) هر نگارش جدیدتری از پروانهٔ جامع همگانی گنو که بنیاد نرم‌افزارهای آزاد "
+#~ "منتشر کرده است،‌ تغییر داده یا بازتوزیع کنید.\n"
+#~ "\n"
+#~ "آهنگ‌های گنوم با امید کارآیی توزیع شده است، ولی بدون هر گونه ضمانتی؛ حتا ضمانت "
+#~ "ضمنی قابل فروش بودن یا مناسب بودن برای یک هدف مشخّص. برای جزییات بیش‌تر، "
+#~ "پروانهٔ جامع همگانی گنو را ببینید.\n"
+#~ "\n"
+#~ "همراه آهنگ‌های گنوم باید نگارشی از پروانهٔ جامع همگانی گنو را دریافت کرده باشد؛ "
+#~ "در غیر این صورت با شرکت بنیاد نرم‌افزارهای آزاد به نشانی زیر مکاتبه کنید: "
+#~ "Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n"
+#~ "\n"
+#~ "نگارندگان آهنگ‌های گنوم در این‌جا اجازه می‌دهند پلاگین‌های GStreamer ناسازگار با "
+#~ "جی‌پی‌ال به همراه GStreamer در آهنگ‌های گنوم استفاده و توزیع شوند. این اجازه "
+#~ "فراتر از اجازه‌هایی است که توسّط پروانهٔ جی‌پی‌ال که آهنگ‌های گنوم را پوشش می‌دهد "
+#~ "داده شده است. اگر این کد را دست‌کاری می‌کنید، ممکن است این استثنا را به نگارش "
+#~ "خودتان از کد گسترش دهید، ولی تعهّدی برای این کار ندارید. اگر نمی‌خواهید چنین "
+#~ "کنید، این عبارت استثنا را از نگارشتان حذف کنید."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "محتوای شاخهٔ آهنگ‌هایتان این‌جا ظاهر خواهد شد."
+
+#~ msgid "GNOME Music"
+#~ msgstr "آهنگ‌های گنوم"
+
+#~ msgid "Window position"
+#~ msgstr "موقعیت پنجره"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "موقعیت پنجره (x و y)."
+
+#~ msgid "Loading"
+#~ msgstr "در حال بار کردن"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "افزودن به سیاههٔ پخش…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "راهی آسان برای پخش آهنگ‌هایتان. کشف خودکار آهنگ‌های روی رایانه، شبکهٔ محلّی و "
+#~ "خدمات اینترنتیتان."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "یافتن قطعه‌ها روی گنجینهٔ محلّیتان، گرفتن آهنگ‌ها از کارسازهای DLNA یا آزمودن "
+#~ "چیزی جدید با خدمت‌های جمندو و ماگناتون."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "وضعیت نخستین نمایش داده شده"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "هنگام نمایش وضعیت ابتدایی، روی درست تنظیم شود"
+
+#~ msgid "Released"
+#~ msgstr "منتشر شده در"
+
+#~ msgid "Running Length"
+#~ msgstr "طول اجرا"
+
+#~ msgid "Composer"
+#~ msgstr "آهنگ‌ساز"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "پخش"
+
+#~ msgid "Hey DJ"
+#~ msgstr "هی دی‌جی"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "آهنگ‌ها برنامه پخش آهنگ جدید گنوم است."
+
+#~ msgid "Search mode"
+#~ msgstr "حالت جست‌وجو"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "اگر درست باشد، نوار جست‌وجو نشان داده می‌شود."
+
+#~ msgid "Notifications mode"
+#~ msgstr "حالت اعلان"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "فعال یا غیرفعال‌سازی اعلان‌های پخش"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an"
+
+#~ msgid "All"
+#~ msgstr "همه"
+
+#~ msgid "Artist"
+#~ msgstr "هنرمند"
+
+#~ msgid "Album"
+#~ msgstr "آلبوم"
+
+#~ msgid "Track Title"
+#~ msgstr "نام آهنگ"
+
+#~ msgid "Local"
+#~ msgstr "محلی"
+
+#~ msgid "Sources"
+#~ msgstr "منابع"
+
+#~ msgid "Match"
+#~ msgstr "هماهنگ"
+
+#~ msgid "Untitled"
+#~ msgstr "بدون عنوان"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "تعداد %d مورد انتخاب شد"
+
+#~ msgid "%d min"
+#~ msgstr "%d دقیقه"
+
+#~ msgid "Empty"
+#~ msgstr "خالی"
+
+#~ msgid "_Quit"
+#~ msgstr "_خروج"
+
+#~ msgid "Select Playlist"
+#~ msgstr "انتخاب فهرست‌پخش"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "بیشینه‌ی نویسه‌ها جهت نمایش نام قطعه در نمای هنرمند"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "این تنظیم تعداد نویسه‌های عنوان قطعه را در نمای هنرمند قبل از خلاصه شدن تعیین "
+#~ "می‌کند. برو روی -1 تنظیم کنید تا غیرفعال شود"
+
+#~ msgid "the a an"
+#~ msgstr "the a an"
+
+#~ msgid "All Artists"
+#~ msgstr "تمام هنرمندان"
+
+#~ msgid "Not playing"
+#~ msgstr "چیزی پخش نمی‌شود"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "توسّط %s، از آلبوم %s"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "هیچ آهنگی پیدا نشد!\n"
+#~ " تعدادی پرونده در پوشه‌ی %s بگذارید"
+
+#~ msgid "_New Playlist"
+#~ msgstr "فهرست پخش _جدید"
+
+#~ msgid "Load More"
+#~ msgstr "بار کردن بیش‌تر"
+
+#~| msgid "_Now Playing"
+#~ msgid "Now _Playing"
+#~ msgstr "درحال پخش"
+
+#~ msgid "<span color='grey'>Released</span>"
+#~ msgstr "<رنگ طول='grey'>انتشار/>محدوده>"
+
+#~ msgid "<span color='grey'>Running Length</span>"
+#~ msgstr "<رنگ طول='grey'>در حال اجرا طول/>محدوده>"
+
+#~ msgid "----"
+#~ msgstr "----"
+
+#~ msgid "--:--"
+#~ msgstr "--:--"
+
+#~ msgid "If true, do randomized playback through the collection"
+#~ msgstr "اگر درست باشد، پخش تصادفی از طریق مجموعه انجام می شود"
+
+#~ msgid "00:00"
+#~ msgstr "00:00"
+
+#~ msgid "/"
+#~ msgstr "/"
diff --git a/po/fi.po b/po/fi.po
new file mode 100644
index 00000000..08ce0f1b
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,754 @@
+# Finnish translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Jiri Grönroos <jiri.gronroos+l10n@iki.fi>, 2013, 2014, 2015, 2016, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-07 18:10+0300\n"
+"Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n"
+"Language-Team: suomi <lokalisointi-lista@googlegroups.com>\n"
+"Language: fi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Musiikki"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Toista ja hallitse musiikkikokoelmaasi"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Helppo ja mieluisa tapa toistaa musiikkia."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Löydä kappaleet paikallisesta kokoelmastasi, käytä automaattisesti luotuja "
+"soittolistoja tai valikoi itse parhaat kappaleet soittolistalle."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Gnomen musiikkisoittimen kehittäjät"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Musiikkisoitin"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;Musiikkisoitin;Musiikki;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Ikkunan koko"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Ikkunan koko (leveys ja korkeus)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Suurennettu ikkuna"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Suurennetun ikkunan tila."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Toiston kertaustila"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Arvo esittää, kerrataanko tai sekoitetaanko toistoa kokoelmaa käyttäen. "
+"Sallitut arvot ovat: \"none\" (ei kertausta tai sekoitusta), "
+"\"song\" (kertaa nykyistä kappaletta), \"all\" (kertaa soittolistaa, ei "
+"sekoitusta) ja \"shuffle\" (sekoita soittolista, kertaus kaiken suhteen)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Käytä ReplayGainia"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Ottaa käyttöön/poistaa käytöstä ReplayGainin albumeille"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Estä järjestelmän valmiustila"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Ottaa käyttöön tai poistaa käytöstä järjestelmän valmiustilaan siirtymisen "
+"estämisen kun musiikkia toistetaan"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Raportoi kuunteluhistoria Last.fm:ään"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Ottaa käyttöön tai poistaa käytöstä kuunteluhistorian ja \"Nyt toistetaan\"-"
+"tietojen lähettämisen Last.fm:ään."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Toista"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Toista"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Lisää _suosikkikappaleisiin"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "Lisää s_oittolistalle…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm-tili"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Raportoi kuunteluhistoria"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Pikanäppäimet"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Ohje"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Tietoja - Musiikki"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Tervetuloa, tämä on Musiikki"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Valikko"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Valitse"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Peru"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Hae"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Takaisin"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Yleiset"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Sulje ikkuna"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Haku"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Ohje"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Pikanäppäimet"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Toista"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Toista/keskeytä"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Seuraava kappale"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Edellinen kappale"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Kertaus päälle/pois"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Sekoitus päälle/pois"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Liikkuminen"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Siirry albumeihin"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Siirry esittäjiin"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Siirry kappaleisiin"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Siirry soittolistoihin"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Siirry takaisin"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm on musiikin löytämiseen tarkoitettu palvelu, joka antaa "
+"henkilökohtaisia suosituksia pohjautuen kuuntelemaasi musiikkiin."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Musiikin kuunteluhistorian lähetystä ei ole määritetty"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Kirjaudu Last.fm-tilillesi lähettääksesi musiikin kuunteluhistoriasi."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Kirjaudu"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Edellinen"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Seuraava"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Poista"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Nimeä uudelleen…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Soittolistan nimi"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Valmis"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Anna nimi ensimmäiselle soittolistallesi"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Luo"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Uusi soittolista…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Lisää"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Lisää soittolistaan"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Lisää"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Esittäjät"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Näytä kaikki"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albumit"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Kappaleet"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Valitse kaikki"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Älä valitse mitään"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Napsauta kohteita valitaksesi ne"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "Lisää _soittolistalle"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Poista _soittolistalta"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Gnome-projekti"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Jiri Grönroos"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Tekijänoikeus Gnomen musiikkisoittimen kehittäjät"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Käännös"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Eniten toistettu"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Ei koskaan toistettu"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Äskettäin toistettu"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Äskettäin lisätty"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Suosikkikappaleet"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Tiedoston toistaminen epäonnistui"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Etsi sovelluksella {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " ja "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} vaaditaan tiedoston toistamiseksi, mutta sitä ei ole asennettu."
+msgstr[1] "{} vaaditaan tiedoston toistamiseksi, mutta niitä ei ole asennettu."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Toistetaan musiikkia"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Sekoitus/kertaus pois"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Kertaa kappale"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Kertaa kaikki"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Sekoita"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Soittolista {} poistettu"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Kumoa"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} poistettu soittolistalta {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Tuntematon albumi"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Tuntematon esittäjä"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "XDG:n Musiikki-kansiota ei ole määritetty."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Musiikkikansio"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "{}n sisältö ilmestyy tähän."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Musiikkia ei löytynyt"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Yritä hakea eri hakuehdoilla"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Musiikki ei voinut yhdistää Trackeriin."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Musiikkitiedostojasi ei voi indeksoida, jos Tracker ei ole käynnissä."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Järjestelmään asennettu Tracker vaikuttaa olevan vanhentunut."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Musiikki tarvitsee Trackerin version 3.0.0 tai uudemman."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Soittolistat"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Esittäjätulokset"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Albumitulokset"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minuutti"
+msgstr[1] "{} minuuttia"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Levy {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} kappale valittu"
+msgstr[1] "{} kappaletta valittu"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Musiikin kuunteluhistoriasi lähetetään Last.fm:ään."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Musiikin kuunteluhistoriaasi ei lähetetä Last.fm:ään."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Kirjautuneena tilillä {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Määritä"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Keskeytä"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} kappale"
+msgstr[1] "{} kappaletta"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Etsi kappaleita, esittäjiä, albumeita ja soittolistoja"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Gnomen musiikkisoitin."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Käy Gnomen musiikkisoittimen verkkosivustolla"
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Musiikki-kansion sisältö ilmestyy tähän"
+
+#~ msgid "GNOME Music"
+#~ msgstr "Gnomen Musiikki"
+
+#~ msgid "Window position"
+#~ msgstr "Ikkunan sijainti"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Ikkunan sijainti (x ja y)."
+
+#~ msgid "Loading"
+#~ msgstr "Ladataan"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Lisää soittolistalle…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Helppo tapa toistaa musiikkia. Löytää musiikin automaattisesti "
+#~ "tietokoneeltasi, paikallisesta verkosta ja internetpalveluista."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Etsi kappaleita paikallisesta kokoelmastasi, toista musiikkia DLNA-"
+#~ "palvelimilta tai löydä jotain uutta Jamendo- ja Magnatune-palveluista."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Alkutila on näytetty"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Aseta todeksi kun alkutila on näytetty"
+
+#~ msgid "Released"
+#~ msgstr "Julkaistu"
+
+#~ msgid "Running Length"
+#~ msgstr "Kesto"
+
+#~ msgid "Composer"
+#~ msgstr "Säveltäjä"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Toista"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hei DJ"
+
+#~ msgid "All"
+#~ msgstr "Kaikki"
+
+#~ msgid "Artist"
+#~ msgstr "Esittäjä"
+
+#~ msgid "Album"
+#~ msgstr "Albumi"
+
+#~ msgid "Track Title"
+#~ msgstr "Kappaleen nimi"
+
+#~ msgid "Local"
+#~ msgstr "Paikalliset"
+
+#~ msgid "Sources"
+#~ msgstr "Lähteet"
+
+#~ msgid "Match"
+#~ msgstr "Vastaavuus"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "Nimetön"
+
+#~ msgid "_Quit"
+#~ msgstr "_Lopeta"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Musiikki on Gnomen uusi musiikintoistosovellus."
+
+#~| msgid "gnome-music"
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "Hakutila"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Jos tosi, hakupalkki näytetään."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Ilmoitustila"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Ota käyttöön/poista käytöstä ilmoitus toistettavista kappaleista"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Valittu %d kohde"
+#~ msgstr[1] "Valittu %d kohdetta"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Empty"
+#~ msgstr "Tyhjä"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Valitse soittolista"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr ""
+#~ "Kappaleen nimessä näytettävien merkkien enimmäismäärä esittäjänäkymässä"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Tämä asetus muokkaa näytettävien merkkien määrää esittäjänäkymän "
+#~ "kappalenimessä, ennen kuin nimi typistetään. Jos et halua typistää "
+#~ "kappaleen nimeä, aseta arvoksi -1."
+
+#~ msgid "the a an"
+#~ msgstr "the a an"
+
+#~ msgid "All Artists"
+#~ msgstr "Kaikki esittäjät"
+
+#~ msgid "Not playing"
+#~ msgstr "Ei toistoa"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "esittäjä %s, levy %s"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "Musiikkia ei löytynyt!\n"
+#~ " Laita musiikkitiedostoja kansioon %s"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Uusi soittolista"
+
+#~ msgid "Load More"
+#~ msgstr "Lataa lisää"
+
+#~ msgid "Now _Playing"
+#~ msgstr "_Nyt toistetaan"
+
+#~ msgid "New"
+#~ msgstr "Uusi"
+
+#~ msgid "Quit"
+#~ msgstr "Lopeta"
+
+#~ msgid "A GNOME 3 application to listen and manage music playlists"
+#~ msgstr "Gnome 3 -sovellus musiikin kuunteluun ja soittolistojen hallintaan"
+
+#~ msgid "%02u:%02u:%02u"
+#~ msgstr "%02u:%02u:%02u"
+
+#~ msgid "%02u:%02u"
+#~ msgstr "%02u:%02u"
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 00000000..e3daee10
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,621 @@
+# French translation for gnome-music.
+# Copyright (C) 2013-2022 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# Alain Lojewski <allomervan@gmail.com>, 2013-2015.
+# Erwan Georget <dremor@dremor.info>, 2015.
+# Guillaume Bernard <associations@guillaume-bernard.fr>, 2017-2018.
+# William Oprandi <william.oprandi@gmail.com>, 2019.
+# Julien Humbert <julroy67@gmail.com>, 2020.
+# vanadiae <vanadiae35@gmail.com>, 2020.
+# Charles Monzat <charles.monzat@free.fr>, 2018-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-07-04 10:30+0200\n"
+"Last-Translator: Guillaume Bernard <associations@guillaume-bernard.fr>\n"
+"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Musique"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Jouer et organiser votre discothèque"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Un moyen simple et agréable d’écouter votre musique."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Trouvez les pistes dans votre collection locale, utilisez des listes de "
+"lecture générées automatiquement ou organisez-en une nouvelle."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Les développeurs de l’application Musique de GNOME"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Lecteur de musique"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "musique;lecteur;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Taille de la fenêtre"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "La taille de la fenêtre (en largeur et hauteur)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Fenêtre maximisée"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "État maximisé de la fenêtre."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Mode de lecture répétition"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Valeur indiquant s’il faut répéter ou rendre aléatoire la lecture des "
+"musiques de la discothèque. Les valeurs possibles sont : « none » (aucune, "
+"la répétition et le mélange sont désactivés), « song » (répète le morceau "
+"actuel), « all » (rejoue toute la liste de lecture, sans mélange), "
+"« shuffle » (mélange la liste de lecture, en supposant de tout rejouer)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Activer ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Active ou désactive ReplayGain pour les albums"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Inhiber la mise en veille du système"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Active ou désactive l’inhibition de la mise en veille lors de la lecture de "
+"musique"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Informer Last.fm de l’historique des musiques écoutées"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Active ou désactive l’envoi à Last.fm des morceaux écoutés (scrobbles) et de "
+"l’information « en cours de lecture »."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Lecture"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Lire"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Ajouter aux morceaux _favoris"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Ajouter à la liste de lecture…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Compte Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Informer Last.fm des morceaux écoutés"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Raccourcis clavier"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "Aid_e"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "À _propos de Musique"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Bienvenue dans Musique"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menu"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Sélectionner"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "A_nnuler"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Rechercher"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Retour"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Général"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Fermer la fenêtre"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Recherche"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Aide"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Raccourcis"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Lecture"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Lecture/Pause"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Morceau suivant"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Morceau précédent"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Basculer la répétition"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Basculer la lecture aléatoire"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigation"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Aller aux albums"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Aller aux artistes"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Aller aux morceaux"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Aller aux listes de lecture"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Revenir en arrière"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm est un service de découverte musicale qui vous donne des "
+"recommandations personnalisées en fonction de la musique que vous écoutez."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Envoi de la musique non configuré"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Connectez-vous à votre compte Last.fm pour envoyer la musique que vous "
+"écoutez."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Se connecter"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Précédent"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Suivant"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Supprimer"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Renommer…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Nom de la liste de lecture"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Terminé"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Saisissez un nom pour la première liste de lecture"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "C_réer"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Nouvelle liste de lecture…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Ajouter"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Ajouter à la liste de lecture"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Ajouter"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artistes"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Tout afficher"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albums"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Morceaux"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Tout sélectionner"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Ne rien sélectionner"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Cliquez sur les éléments pour les sélectionner"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Ajouter à la liste de lecture"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Supprimer de la liste de lecture"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Le projet GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"Alain Lojewski <allomervan@gmail.com>\n"
+"Erwan Georget <dremor@dremor.info>\n"
+"Guillaume Bernard <associations@guillaume-bernard.fr>\n"
+"William Oprandi <william.oprandi@gmail.com>\n"
+"Julien Humbert <julroy67@gmail.com>\n"
+"vanadiae <vanadiae35@gmail.com>\n"
+"Charles Monzat <charles.monzat@free.fr>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright Développeurs de l’application Musique de GNOME"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Traduit par"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Les plus joués"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Jamais joués"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Joués récemment"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Ajoutés récemment"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Morceaux favoris"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Impossible de lire le fichier"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Trouver dans {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " et "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} est nécessaire pour lire le fichier, mais il n’est pas installé."
+msgstr[1] ""
+"{} sont nécessaires pour lire le fichier, mais ils ne sont pas installés."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Lecture de musique en cours"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Désactiver mélanger/répéter"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Répéter le morceau"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Tout répéter"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Mélanger"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Liste de lecture {} supprimée"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Annuler"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} supprimé de {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Album inconnu"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Artiste inconnu"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Votre répertoire de musique XDG n’est pas défini."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Dossier de musique"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Le contenu de votre {} s’affichera ici."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Aucune musique trouvée"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Essayez une recherche différente"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Musique de GNOME ne peut pas se connecter à Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Vos musiques ne peuvent pas être indexées si Tracker ne fonctionne pas."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Votre version de Tracker semble obsolète."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Musique nécessite Tracker version 3.0.0 ou ultérieure."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Listes de lecture"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Résultats pour Artistes"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Résultats pour Albums"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minute"
+msgstr[1] "{} minutes"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disque {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} morceau sélectionné"
+msgstr[1] "{} morceaux sélectionnés"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "La musique que vous écoutez est envoyée à Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "La musique que vous écoutez n’est pas envoyée à Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Connecté en tant que {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Configurer"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pause"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} morceau"
+msgstr[1] "{} morceaux"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr ""
+"Rechercher des musiques, des artistes, des albums ou des listes de lecture"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Un lecteur de musique et une application de gestion pour GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Visiter le site web de l’application Musique de GNOME"
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Le contenu de votre dossier Musique s’affichera ici"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Un moyen simple d’écouter votre musique. Découvrez automatiquement la "
+#~ "musique sur votre ordinateur, le réseau local et les services Internet."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "L’état initial a été affiché"
+
+#~ msgid "Released"
+#~ msgstr "Publié"
+
+#~ msgid "Running Length"
+#~ msgstr "Durée"
+
+#~ msgid "Composer"
+#~ msgstr "Compositeur"
diff --git a/po/fur.po b/po/fur.po
new file mode 100644
index 00000000..89e24c37
--- /dev/null
+++ b/po/fur.po
@@ -0,0 +1,777 @@
+# Friulian translation for gnome-music.
+# Copyright (C) 2015 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Fabio Tomat <f.t.public@gmail.com>, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2022-08-27 13:27+0000\n"
+"PO-Revision-Date: 2022-10-03 09:29+0200\n"
+"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
+"Language-Team: Friulian <f.t.public@gmail.com>\n"
+"Language: fur\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Editor: HaiPO 1.2 b1\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:236
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Musiche"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Sune e organize le tô colezion di musichis"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Une semplice e plasevule maniere par scoltâ la tô musiche."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Cjate i tocs inte tô colezion locâl, dopre lis listis di riproduzion "
+"gjeneradis in automatic o cure une gnove."
+
+#: data/org.gnome.Music.appdata.xml.in.in:167
+msgid "The GNOME Music developers"
+msgstr "I svilupadôrs di GNOME Musiche"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Letôr musicâl"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Musiche;Riprodutôr;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Dimension barcon"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Dimension barcon (largjece e altece)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Barcon slargjât"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Stât barcon slargjât."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Modalitât ripetizion"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Il valôr al specifiche se ripeti o riprodusi a câs le colezion. I valôrs "
+"acetâts a son: “none” (ripetizion e messedât a son studâts), "
+"“song” (ripetizion de cjançon atuâl), “all” (ripetizion de liste des "
+"cjançons, cence messedâ), “shuffle” (messedâ l'ordin de liste des cjançons, "
+"si intint ancje ripeti dutis)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Abilite ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Abilite o disabilite ReplayGain pai album"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Inibìs la sospension dal sisteme"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Abilite o disabilite la inibizion a sospindi il sisteme intant che si scolte "
+"la musiche"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Invie la cronologjie de musiche a Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Al abilite o al disabilite l'inviâ i tiei gjenars di musiche preferide e lis "
+"informazions ce che tu stâs scoltant a Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Sune"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Sune"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Zonte ai _tocs preferîts"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Zonte ae liste di riproduzion…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Account Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Invie la musiche che tu scoltis"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Scurtis di tastiere"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Jutori"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Informazions su Musiche"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Benvignûts su Musiche"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Menù"
+
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Selezione"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Anule"
+
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Cîr"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "Torne indaûr"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Gjenerâl"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Siere barcon"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Cîr"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Jutori"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Scurtis"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Riprodûs"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Sune/Pause"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Prossim toc"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Toc precedent"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Comutâ il ripeti"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Comutâ il messedâ"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigazion"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Va ai album"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Va ai artiscj"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Va ai tocs"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Va ae liste dai tocs"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Torne indaûr"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm al è un servizi di scuvierte de musiche che ti da conseis "
+"personalizâts in base ae musiche che tu scoltis."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Segnalazion de musiche, no configurade"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Jentre tal to account Last.fm par inviâ la musiche che tu scoltis."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Jentre"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Precedent"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Prossim"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Scancele"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Cambie non…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Non de liste des musichis"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Fat"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Scrîf un non pe tô prime liste di riproduzion"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "C_ree"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Gnove liste di musichis…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Zonte"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Zonte ae liste des musichis"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Zonte"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artiscj"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Visualize dut"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Album"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Cjancçons"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Selezione dut"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Selezione nuie"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Cliche sui elements par selezionaju"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Zonte ae liste des musichis"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Gjave de liste des musichis"
+
+#: gnomemusic/about.py:238
+msgid "The GNOME Project"
+msgstr "Il progjet GNOME"
+
+#: gnomemusic/about.py:242
+msgid "translator-credits"
+msgstr "Fabio Tomat <f.t.public@gmail.com>, 2022"
+
+#: gnomemusic/about.py:246
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright i svilupadôrs di GNOME Musiche"
+
+#: gnomemusic/about.py:249
+msgid "Translated by"
+msgstr "Tradot di"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Plui scoltats"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Mai scoltât"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Scoltât di recent"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Zontât di recent"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Tocs preferîts"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Impussibil riprodusi il file"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Cjate in {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " e "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "Al covente {} par riprodusi il file, ma nol è instalât."
+msgstr[1] "A coventin {} par riprodusi il file, ma no son instalâts."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Riproduzion musiche"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "Messede"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Ripet cjançon"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Ripet dut"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr "Messede/ripet studâts"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Liste di musichis {} gjavade"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Anule"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} gjavât di {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Album no cognossût"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Artist no cognossût"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "La tô cartele XDG di Musiche no je stabilide."
+
+# minuscul parce che al ven fûr la prime volte che si invie il program e il
+# test al è tal mieç di une frase:
+# Il contignût de tô cartele di musiche...
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "cartele de musiche"
+
+# %s o ai viodût che al ven fûr "cartele di musiche"
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Il contignût de tô {} al vignarà mostrât achì."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Nissune musiche cjatade"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Prove une ricercje diferente"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Musiche nol è rivât a conetisi al Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"I tiei files di musiche no puedin jessi metûts in tabele cence vê in "
+"esecuzion Tracker."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "La version di Tracker dal to sisteme e somee sorpassade."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Musiche al à bisugne de version 3.0.0 (o plui resinte) di Tracker."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Listis di musichis"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Risultâts artiscj"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Risultâts album"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minût"
+msgstr[1] "{} minûts"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disc {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Selezionât {} cjançon"
+msgstr[1] "Selezionâts {} cjançons"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "La musiche che tu scoltis e ven segnalade a Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "La musiche che tu scoltis no ven inviade a Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Jentrât come {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Configure"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pause"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} Cjançon"
+msgstr[1] "{} Cjançons"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Une aplicazion GNOME par sunâ e ministrâ le proprie musiche."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Visite il sît di GNOME Musiche"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME Musiche al è software libar; al è pussibil tornâ a distribuîlu o "
+#~ "modificâlu sot i tiermins de licence GNU General Public License, come "
+#~ "publicade de Free Software Foundation, version 2 o (a tô sielte) "
+#~ "cualsisei sucessive.\n"
+#~ "\n"
+#~ "GNOME Musiche al è distribuît inte sperance che al sedi util, ma CENCE "
+#~ "NISSUNE GARANZIE, cence nancje la implicite garanzie di CUMIERÇABILITÂT o "
+#~ "IDONEITÂT A UNE FINALITÂT PARTICOLÂR. Consultâ la licence GNU General "
+#~ "Public License par vê plui detais.\n"
+#~ "\n"
+#~ "Cun GNOME Musiche ti varessin di vê dât ancje une copie de licence GNU "
+#~ "General Public License, in câs contrari al è pussibil domandâle scrivint "
+#~ "a: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, "
+#~ "Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "Cun cheste letare i autôrs di GNOME Musiche a concedin il permès di doprâ "
+#~ "e distribuî i plugin GStreamer, che no son compatibii cun la GPL, adun "
+#~ "cun GStreamer e GNOME Musiche. Chest permès al è parsore e di là dal "
+#~ "permès concedût de licence GPL che e cuvierç GNOME Musiche. Se tu "
+#~ "modifichis chest codiç, tu puedis estindi cheste ecezion ae tô version "
+#~ "dal codiç, ma no tu sês obleât a fâlu. Se no tu desideris fâlu, elimine "
+#~ "cheste declarazion di ecezion de tô version."
+
+# %s o ai viodût che al ven fûr "cartele di musiche"
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Il contignût de tô cartele Musiche al vignarà mostrât achì"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME Musiche"
+
+#~ msgid "Window position"
+#~ msgstr "Posizion barcon"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Posizion barcon (x e y)."
+
+#~ msgid "Loading"
+#~ msgstr "Daûr a cjariâ"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Zonte te liste des musichis…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Une maniere semplice par riprodusi la tô musiche. Cjate in automatic la "
+#~ "musiche sul to computer, su pe rêt locâl e sui servizis internet."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Cjate i tocs te colezion locâl, oten musiche dai servidôrs DLNA o cîr alc "
+#~ "di gnûf cui servizis Jamendo e Magnatune."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Il stât iniziâl al è stât mostrât"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Imposte a vêr cuant che il stât iniziâl al è stât mostrât"
+
+#~ msgid "Released"
+#~ msgstr "Publicât"
+
+#~ msgid "Running Length"
+#~ msgstr "Durade"
+
+#~ msgid "Composer"
+#~ msgstr "Compositôr"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Riprodûs"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hey DJ"
+
+#~ msgid "All"
+#~ msgstr "Dut"
+
+#~ msgid "Artist"
+#~ msgstr "Artist"
+
+#~ msgid "Album"
+#~ msgstr "Album"
+
+#~ msgid "Track Title"
+#~ msgstr "Titul"
+
+#~ msgid "Local"
+#~ msgstr "Locâl"
+
+#~ msgid "Sources"
+#~ msgstr "Sorzints"
+
+#~ msgid "Match"
+#~ msgstr "Corispuindince"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "Cence Titul"
+
+#~ msgid "_Quit"
+#~ msgstr "_Jes"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Musiche e je le gnove aplicazion GNOME par riprodusi musiche."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Selezionât %d element"
+#~ msgstr[1] "Selezionâts %d elements"
+
+#~ msgid "Empty"
+#~ msgstr "Vueit"
+
+#~ msgid "Search mode"
+#~ msgstr "Modalitât di ricercje"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Se vêr, la sbare di ricercje a ven mostrade."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Modalitât di notificazion"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Abilite o no lis notificazions di riproduzion"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Selezione liste des musichis"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an|il|i|la|lis|un|une|l'"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr ""
+#~ "Numar massim di caratars di mostrâ tal non de cjançon inte visualizazion "
+#~ "Artist"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Cheste impostazion a cambie il cuantitatîf di caratars par il titul de "
+#~ "cjançon inte visualizazion Artist prime che al sedi mitût intun elìs. Met "
+#~ "chest valôr come -1 par no abilitâ"
+
+#~ msgid "the a an"
+#~ msgstr "Il la i lis the a an un une"
+
+#~ msgid "All Artists"
+#~ msgstr "Ducj i artiscj"
+
+#~ msgid "Not playing"
+#~ msgstr "Cuiet"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "di %s, dal album %s"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Gnove liste di musichis"
diff --git a/po/fy.po b/po/fy.po
new file mode 100644
index 00000000..4a11bf60
--- /dev/null
+++ b/po/fy.po
@@ -0,0 +1,622 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2021-08-31 14:27+0000\n"
+"PO-Revision-Date: 2021-10-05 09:48+0000\n"
+"Last-Translator: Tjipke van der Heide <tjipke@tutanota.com>\n"
+"Language-Team: Western Frisian\n"
+"Language: fy\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Loco-Source-Locale: fy_NL\n"
+"X-Generator: Loco https://localise.biz/\n"
+"X-DL-Team: fy\n"
+"X-DL-Module: gnome-music\n"
+"X-DL-Branch: master\n"
+"X-DL-Domain: po\n"
+"X-DL-State: Translating\n"
+"\n"
+"X-Loco-Parser: loco_parse_po"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+msgid "GNOME Music"
+msgstr "GNOME Music"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Spylje jo muzyksamling ôf en organisearje it"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "In maklik en noflik te brûken wize om jo muzyk ôf te spyljen."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Fynt ferskes yn jo lokale samling, brûk automatysk oanmakke ôfspyllisten of "
+"meitsje jo eigen."
+
+#: data/org.gnome.Music.appdata.xml.in.in:140
+msgid "The GNOME Music developers"
+msgstr "De GNOME Music-ûntwikkelers"
+
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/application.py:60
+#: gnomemusic/window.py:71
+msgid "Music"
+msgstr "Muzyk"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Muzykspiler"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Muzyk;Spiler;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Finstergrutte"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Finstergrutte (breedte en hichte)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window position"
+msgstr "Finsterposysje"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window position (x and y)."
+msgstr "Finsterposysje (x en y)."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Window maximized"
+msgstr "Finster maksimalisearre"
+
+#: data/org.gnome.Music.gschema.xml:23
+msgid "Window maximized state."
+msgstr "Finster maksimalisearresteat."
+
+#: data/org.gnome.Music.gschema.xml:27
+msgid "Playback repeat mode"
+msgstr "Opnij ôfspyljemodus"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:29
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), “song” "
+"(repeat current song), “all” (repeat playlist, no shuffle), “shuffle” "
+"(shuffle playlist, presumes repeat all)."
+msgstr ""
+"Wearde jout oan as de samling opnij ôfspile of mingd wurde moat. Jildige "
+"wearden binne: ‘gjin’ (opnij ôfspyljen en mingen binne útskeakele), ‘ferske’ "
+"(aktuele ferske opnij ôfspylje), ‘Alles’ (ôfspyllist opnij ôfspylje, net "
+"minge), ‘minge’ (ôfspyllist minge, giet der fan út dat alles opnij ôfspile "
+"wurdt)."
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Enable ReplayGain"
+msgstr "ReplayGain ynskeakelje"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Skeakelet ReplayGain foar albums yn of út"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Inhibit system suspend"
+msgstr "Foarkomme dat de kompjûter yn skoftmodus giet"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Skeakelet it foarkommen fan dat it systeem yn de skoftstân giet yn of út."
+
+#: data/org.gnome.Music.gschema.xml:43
+msgid "Report music history to Last.fm"
+msgstr "Muzykskiednis nei Last.fm ferstjoere"
+
+#: data/org.gnome.Music.gschema.xml:44
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Skeakelet it ferstjoeren fan \"scrobbles\" en ‘No oan it ôfspyljen’ "
+"ynformaasje nei Last.fm yn of út."
+
+#: data/ui/AboutDialog.ui.in:9
+msgid "Copyright © 2018 GNOME Music Developers"
+msgstr "Copyright © 2018 GNOME Music-ûntwikkelers"
+
+#: data/ui/AboutDialog.ui.in:10
+msgid "A music player and management application for GNOME."
+msgstr "In muzykspiler en behearapplikaasje foar GNOME."
+
+#: data/ui/AboutDialog.ui.in:12
+msgid "Visit GNOME Music website"
+msgstr "De GNOME Music-website besykje"
+
+#: data/ui/AboutDialog.ui.in:13
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+"GNOME Music is frije software; jo meie it fierder distribuearje en/of "
+"oanpasse ûnder de betingsten fan de GNU General Public License sa as útjûn "
+"troch de Free Software Foundation; ferzje 2 fan de lisinsje, of as jo dat "
+"wolle, elke nijere ferzje."
+
+#: data/ui/AlbumWidget.ui:104 data/ui/PlayerToolbar.ui:122
+#: data/ui/PlaylistControls.ui:121 data/ui/SongWidgetMenu.ui:19
+#: gnomemusic/widgets/playertoolbar.py:177
+msgid "Play"
+msgstr "Ofspylje"
+
+#: data/ui/AlbumWidget.ui:163 data/ui/PlaylistControls.ui:6
+msgid "_Play"
+msgstr "_Ofspylje"
+
+#: data/ui/AlbumWidget.ui:167
+msgid "Add to _Favorite Songs"
+msgstr "Oan _favorite ferskes tafoegje"
+
+#: data/ui/AlbumWidget.ui:171
+msgid "_Add to Playlist…"
+msgstr "_Oan ôfspyllist tafoegje…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm-account"
+
+#: data/ui/AppMenu.ui:38
+msgid "Report Music Listening"
+msgstr "Muzyk lústerje ferstjoere"
+
+#: data/ui/AppMenu.ui:63
+msgid "_Keyboard Shortcuts"
+msgstr "_Fluchtoetsen"
+
+#: data/ui/AppMenu.ui:74
+msgid "_Help"
+msgstr "_Help"
+
+#: data/ui/AppMenu.ui:85
+msgid "_About Music"
+msgstr "_Oer Music"
+
+#: data/ui/EmptyView.ui:35
+msgid "Welcome to Music"
+msgstr "Wolkom by Music"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Menu"
+
+#: data/ui/HeaderBar.ui:39 data/ui/SearchHeaderBar.ui:16
+msgid "Select"
+msgstr "Selektearje"
+
+#: data/ui/HeaderBar.ui:60 data/ui/PlaylistDialog.ui:211
+#: data/ui/SearchHeaderBar.ui:37
+msgid "_Cancel"
+msgstr "_Annulearje"
+
+#: data/ui/HeaderBar.ui:79 data/ui/SearchHeaderBar.ui:56
+msgid "Search"
+msgstr "Sykje"
+
+#: data/ui/HeaderBar.ui:102
+msgid "Back"
+msgstr "Tebek"
+
+#: data/ui/help-overlay.ui:13
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Algemien"
+
+#: data/ui/help-overlay.ui:17
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Finster slute"
+
+#: data/ui/help-overlay.ui:24
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Sykje"
+
+#: data/ui/help-overlay.ui:31
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Help"
+
+#: data/ui/help-overlay.ui:38
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Fluchtoetsen"
+
+#: data/ui/help-overlay.ui:47
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Ofspylje"
+
+#: data/ui/help-overlay.ui:51
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Ofspylje/Skoft"
+
+#: data/ui/help-overlay.ui:58
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Folgjende ferske"
+
+#: data/ui/help-overlay.ui:65
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Foarige ferske"
+
+#: data/ui/help-overlay.ui:72
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Opnij ôfspylje yn- of útskeakelje"
+
+#: data/ui/help-overlay.ui:79
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Minge yn- of útskeakelje"
+
+#: data/ui/help-overlay.ui:88
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigaasje"
+
+#: data/ui/help-overlay.ui:92
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Gean nei Albums"
+
+#: data/ui/help-overlay.ui:99
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Gean nei Artysten"
+
+#: data/ui/help-overlay.ui:106
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Gean nei Ferskes"
+
+#: data/ui/help-overlay.ui:113
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Gean nei Ofspyllisten"
+
+#: data/ui/help-overlay.ui:120
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Gean tebek"
+
+#: data/ui/LastfmDialog.ui:24
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm is in muzykûntdekkingstsjinst dy't jo persoanlike oanrekommandaasjes "
+"jout oan de hân fan de muzyk dêr't jo nei lústerje."
+
+#: data/ui/LastfmDialog.ui:35 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Music Reporting Not Setup"
+msgstr "Muzyk opstjoere net ynsteld"
+
+#: data/ui/LastfmDialog.ui:49 gnomemusic/widgets/lastfmdialog.py:61
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Meld oan op jo Last.fm-account om de muzyk dêr't jo nei lústerje op te "
+"stjoeren."
+
+#: data/ui/LastfmDialog.ui:60 gnomemusic/widgets/lastfmdialog.py:59
+msgid "Login"
+msgstr "Oanmelde"
+
+#: data/ui/LoadingNotification.ui:16
+msgid "Loading"
+msgstr "Lade"
+
+#: data/ui/PlayerToolbar.ui:105
+msgid "Previous"
+msgstr "Foarige"
+
+#: data/ui/PlayerToolbar.ui:139
+msgid "Next"
+msgstr "Folgjende"
+
+#: data/ui/PlaylistControls.ui:10
+msgid "_Delete"
+msgstr "_Fuortsmite"
+
+#: data/ui/PlaylistControls.ui:14
+msgid "_Rename…"
+msgstr "_Omneame…"
+
+#: data/ui/PlaylistControls.ui:44
+msgid "Playlist Name"
+msgstr "Namme fan de ôfspyllist"
+
+#: data/ui/PlaylistControls.ui:77
+msgid "_Done"
+msgstr "_Dien"
+
+#: data/ui/PlaylistDialog.ui:66
+msgid "Enter a name for your first playlist"
+msgstr "In namme foar jo ôfspyllist ynfiere"
+
+#: data/ui/PlaylistDialog.ui:88
+msgid "C_reate"
+msgstr "_Oanmeitsje"
+
+#: data/ui/PlaylistDialog.ui:156
+msgid "New Playlist…"
+msgstr "Nije ôfspyllist…"
+
+#: data/ui/PlaylistDialog.ui:167
+msgid "Add"
+msgstr "Tafoegje"
+
+#: data/ui/PlaylistDialog.ui:208
+msgid "Add to Playlist"
+msgstr "Oan ôfspyllist tafoegje"
+
+#: data/ui/PlaylistDialog.ui:224
+msgid "_Add"
+msgstr "_Tafoegje"
+
+#: data/ui/PlaylistNotification.ui:22
+msgid "_Undo"
+msgstr "_Ungedien meitsje"
+
+#: data/ui/SearchView.ui:47 gnomemusic/views/artistsview.py:46
+msgid "Artists"
+msgstr "Artysten"
+
+#: data/ui/SearchView.ui:57 data/ui/SearchView.ui:108
+msgid "View All"
+msgstr "Alles besjen"
+
+#: data/ui/SearchView.ui:98 gnomemusic/views/albumsview.py:50
+msgid "Albums"
+msgstr "Albums"
+
+#: data/ui/SearchView.ui:149 gnomemusic/views/songsview.py:47
+msgid "Songs"
+msgstr "Ferskes"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Alles selektearje"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Neat Selektearje"
+
+#: data/ui/SelectionBarMenuButton.ui:30 gnomemusic/widgets/headerbar.py:71
+msgid "Click on items to select them"
+msgstr "Klik op items om se te selektearjen"
+
+#: data/ui/SelectionToolbar.ui:9
+msgid "_Add to Playlist"
+msgstr "_Oan ôfspyllist tafoegje"
+
+#: data/ui/SongWidgetMenu.ui:29
+msgid "Add to Playlist…"
+msgstr "Oan ôfspyllist tafoegje…"
+
+#: data/ui/SongWidgetMenu.ui:39
+msgid "Remove From Playlist"
+msgstr "Ut ôfspyllist fuortsmite"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:898
+msgid "Most Played"
+msgstr "Meast ôfspile"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:952
+msgid "Never Played"
+msgstr "Nea ôfspile"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1005
+msgid "Recently Played"
+msgstr "Koartlyn ôfspile"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1068
+msgid "Recently Added"
+msgstr "Koartlyn tafoege"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1131
+msgid "Favorite Songs"
+msgstr "Favorite ferskes"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Kin it bestân net ôfspylje"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Sykje yn {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr "en"
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ","
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] ""
+"{} is nedich om it bestân ôf te spyljen, mar it is net ynstallearre."
+msgstr[1] ""
+"{} binne nedich om it bestân ôf te spyljen, mar se binne net ynstallearre."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Muzyk oan it ôfspyljen"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:45
+msgid "Shuffle"
+msgstr "Minge"
+
+#: gnomemusic/player.py:46
+msgid "Repeat Song"
+msgstr "Ferske opnij ôfspylje"
+
+#: gnomemusic/player.py:47
+msgid "Repeat All"
+msgstr "Alles opnij ôfspylje"
+
+#: gnomemusic/player.py:48
+msgid "Shuffle/Repeat Off"
+msgstr "Minge/Opnij ôfspylje út"
+
+#: gnomemusic/utils.py:80
+msgid "Unknown album"
+msgstr "Unbekend album"
+
+#: gnomemusic/utils.py:101
+msgid "Unknown Artist"
+msgstr "Unbekende artyst"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Jo XDG Muzyk-map is net ynsteld."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Muzykmap"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "De ynhâld fan jo {} sil hjir sichtber wurde."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Gjin muzyk fûn"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Probearje om wat oars te sykjen"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Music koe net mei Tracker ferbine."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Jo muzykbestannen kinne net yndeksearre wurde sûnder dat Tracker útfierd "
+"wurdt."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "De ferzje fan Tracker op jo systeem liket ferâldere."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Muzyk hat Tracker ferzje 3.0.0 of heger nedich."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Ofspyllisten"
+
+#: gnomemusic/views/searchview.py:420
+msgid "Artists Results"
+msgstr "Artystresultaten"
+
+#: gnomemusic/views/searchview.py:435
+msgid "Albums Results"
+msgstr "Albumresultaten"
+
+#: gnomemusic/widgets/albumwidget.py:237
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minút"
+msgstr[1] "{} minuten"
+
+#: gnomemusic/widgets/disclistboxwidget.py:75
+msgid "Disc {}"
+msgstr "Skiif {}"
+
+#: gnomemusic/widgets/headerbar.py:68
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "No {} ferske selektearre"
+msgstr[1] "No {} ferskes selektearre"
+
+#: gnomemusic/widgets/lastfmdialog.py:65
+msgid "Your music listening is reported to Last.fm."
+msgstr "De muzyk dêr't jo nei lústerje wurd nei Last.fm ferstjoerd."
+
+#: gnomemusic/widgets/lastfmdialog.py:67
+msgid "Your music listening is not reported to Last.fm."
+msgstr "De muzyk dêr't jo nei lústerje, wurdt net nei Last.fm ferstjoerd."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Logged in as {}"
+msgstr "Oanmeld as {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:72
+msgid "Configure"
+msgstr "Ynstelle"
+
+#: gnomemusic/widgets/notificationspopup.py:216
+msgid "Playlist {} removed"
+msgstr "Ofspyllist {} fuortsmiten"
+
+#: gnomemusic/widgets/notificationspopup.py:220
+msgid "{} removed from {}"
+msgstr "{} út {} fuortsmiten"
+
+#: gnomemusic/widgets/playertoolbar.py:174
+msgid "Pause"
+msgstr "Skoft"
+
+#: gnomemusic/widgets/playlistcontrols.py:132
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} Ferske"
+msgstr[1] "{} Ferskes"
diff --git a/po/ga.po b/po/ga.po
new file mode 100644
index 00000000..20b34d35
--- /dev/null
+++ b/po/ga.po
@@ -0,0 +1,226 @@
+# Irish translations for gnome-music package.
+# Copyright (C) 2013 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnome-music package.
+# Seán de Búrca <leftmostcat@gmail.com>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music.master\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-08-31 02:15-0600\n"
+"PO-Revision-Date: 2013-08-31 02:31-0600\n"
+"Last-Translator: Seán de Búrca <leftmostcat@gmail.com>\n"
+"Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
+"Language: ga\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : "
+"4;\n"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "Méid na fuinneoige"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "Méid na fuinneoige (leithead agus airde)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "Ionad na fuinneoige"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "Ionad na fuinneoige (x agus y)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "Uasmhéadaíodh an fhuinneog"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "Staid uasmhéadaithe na fuinneoige."
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr ""
+
+#: ../data/org.gnome.Music.gschema.xml.h:8
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: \"none\", \"song\", \"all\", \"shuffle\"."
+msgstr ""
+
+#: ../data/org.gnome.Music.gschema.xml.h:9
+msgid "Search mode"
+msgstr "Mód cuardaigh"
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "If true, the search bar is shown."
+msgstr "Má tá fíor, taispeántar an barra cuardaigh."
+
+#: ../data/gnome-music.desktop.in.h:1 ../gnomemusic/application.py:45
+#: ../gnomemusic/window.py:53 ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "Ceol"
+
+#: ../data/gnome-music.desktop.in.h:2
+msgid "Music Player"
+msgstr "Seinnteoir Ceoil"
+
+#: ../data/gnome-music.desktop.in.h:3
+msgid "Play and organize your music collection"
+msgstr "Seinn agus eagraigh do bhailiúchán ceoil"
+
+#: ../gnomemusic/albumArtCache.py:235
+msgid "Untitled"
+msgstr "Gan Teideal"
+
+#: ../gnomemusic/player.py:271 ../gnomemusic/view.py:218
+#: ../gnomemusic/view.py:571
+msgid "Unknown Artist"
+msgstr "Ealaíontóir Anaithnid"
+
+#: ../gnomemusic/view.py:280
+#, python-format
+msgid ""
+"No Music found!\n"
+" Put some files into the folder %s"
+msgstr ""
+"Ceol gan aimsiú!\n"
+" Cuir cúpla comhad isteach san fhillteán %s"
+
+#: ../gnomemusic/view.py:287
+msgid "Albums"
+msgstr "Albaim"
+
+#: ../gnomemusic/view.py:317
+msgid "Songs"
+msgstr "Amhráin"
+
+#: ../gnomemusic/view.py:462
+msgid "Playlists"
+msgstr "Seinmliostaí"
+
+#: ../gnomemusic/view.py:468
+msgid "Artists"
+msgstr "Ealaíontóirí"
+
+#: ../gnomemusic/view.py:506 ../gnomemusic/view.py:508
+#: ../gnomemusic/widgets.py:436
+msgid "All Artists"
+msgstr "Gach Ealaíontóir"
+
+#: ../gnomemusic/widgets.py:74 ../gnomemusic/widgets.py:94
+msgid "Load More"
+msgstr "Luchtaigh Tuilleadh"
+
+#: ../gnomemusic/widgets.py:84
+msgid "Loading..."
+msgstr "Á luchtú..."
+
+#: ../gnomemusic/window.py:134
+msgid "Empty"
+msgstr "Folamh"
+
+#: ../data/AboutDialog.ui.in.h:2
+msgid "Copyright © 2013 GNOME Music Developers"
+msgstr "Cóipcheart © 2013 Forbróirí Cheol GNOME"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "Seinnteoir ceoil agus feidhmchlár bhainisteoireacht cheoil do GNOME."
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "Féach an suíomh gréasáin do Cheol GNOME"
+
+#: ../data/AboutDialog.ui.in.h:5
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "Eisithe"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "Fad Reatha"
+
+#: ../data/app-menu.ui.h:1
+msgid "_New Playlist"
+msgstr "Seinmliosta _Nua"
+
+#: ../data/app-menu.ui.h:2
+msgid "_Now Playing"
+msgstr "Á Sheinm _Anois"
+
+#: ../data/app-menu.ui.h:3
+msgid "_About Music"
+msgstr "_Maidir le Ceol"
+
+#: ../data/app-menu.ui.h:4
+msgid "_Quit"
+msgstr "_Scoir"
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "Suaith"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "Seinn Gach Amhrán Arís"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "Seinn an tAmhrán Arís"
+
+#: ../data/PlayerToolbar.ui.h:4
+msgid "Shuffle/Repeat Off"
+msgstr "Ná Suaith/Seinn Arís"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No Music Found"
+msgstr "Ceol Gan Aimsiú"
+
+#: ../data/headerbar.ui.in.h:1
+msgid "Select All"
+msgstr "Roghnaigh Uile"
+
+#: ../data/headerbar.ui.in.h:2
+msgid "Select None"
+msgstr "Ná Roghnaigh"
+
+#: ../data/headerbar.ui.in.h:3
+msgid "Click on items to select them"
+msgstr "Cliceáil ar mhíreanna chun iad a roghnú"
+
+#: ../data/headerbar.ui.in.h:4
+msgid "Cancel"
+msgstr "Cealaigh"
+
+#: ../data/SelectionToolbar.ui.h:1
+msgid "Add to Playlist"
+msgstr "Cuir le Seinmliosta"
diff --git a/po/gd.po b/po/gd.po
new file mode 100644
index 00000000..64a58d48
--- /dev/null
+++ b/po/gd.po
@@ -0,0 +1,652 @@
+# Scottish Gaelic translation for gnome-music.
+# Copyright (C) 2016 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# GunChleoc <fios@foramnagaidhlig.net>, 2016, 2017, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music gnome-3-20\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2018-01-06 19:22+0000\n"
+"PO-Revision-Date: 2018-03-02 10:35+0100\n"
+"Last-Translator: GunChleoc <fios@foramnagaidhlig.net>\n"
+"Language-Team: Fòram na Gàidhlig\n"
+"Language: gd\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
+"(n > 2 && n < 20) ? 2 : 3;\n"
+"X-Generator: Virtaal 0.7.1\n"
+"X-Project-Style: gnome\n"
+
+#: ../data/org.gnome.Music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "Ceòl GNOME"
+
+#: ../data/org.gnome.Music.appdata.xml.in.h:2
+#: ../data/org.gnome.Music.desktop.in.h:3
+msgid "Play and organize your music collection"
+msgstr "Cluich is cum rian air a’ chruinneachadh ciùil agad"
+
+#: ../data/org.gnome.Music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "’S e aplacaid ùr GNOME gus ceòl a chluich a th’ ann an Ceòl."
+
+#: ../data/org.gnome.Music.desktop.in.h:1 ../gnomemusic/application.py:53
+#: ../gnomemusic/application.py:102 ../gnomemusic/toolbar.py:90
+#: ../gnomemusic/window.py:68 ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "Ceòl"
+
+#: ../data/org.gnome.Music.desktop.in.h:2
+msgid "Music Player"
+msgstr "Cluicheadair ciùil"
+
+#: ../data/org.gnome.Music.desktop.in.h:4
+msgid "Music;Player;"
+msgstr "Music;Player;ceòl;cluicheadair;inneal-cluich;"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "Meud na h-uinneige"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "Meud na h-uinneige (leud is àirde)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "Ionad na h-uinneige"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "Ionad na h-uinneige (x is y)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "Làn-mheud air an uinneag"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "Staid làn-mheud na h-uinneige."
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "Modh ath-chluich"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: ../data/org.gnome.Music.gschema.xml.h:9
+#| msgid ""
+#| "Value identifies whether to repeat or randomize playback through the "
+#| "collection. Allowed values are: \"none\" (repeat and shuffle are off), "
+#| "\"song\" (repeat current song), \"all\" (repeat playlist, no shuffle), "
+#| "\"shuffle\" (shuffle playlist, presumes repeat all)."
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Innsidh an luach am bu chòir ath-chluich no nithean sa chruinneachadh a "
+"chluich air thuaiream. Seo na luachan ceadaichte: “none” (tha ath-chluich is "
+"cluich air thuaiream dheth), “song” (ath-chluich an t-òran làithreach), "
+"“all” (ath-chluich an liosta-chluich gun a bhith ’ga cluich air thuaiream), "
+"“shuffle” (cluich na h-òrain air an liosta-chluich air thuaiream, an dùil "
+"gun dèid na h-uile òran ath-chluich)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "Search mode"
+msgstr "Modh an luirg"
+
+#: ../data/org.gnome.Music.gschema.xml.h:11
+msgid "If true, the search bar is shown."
+msgstr "Mas e “true” a th’ ann, thèid am bàr-luirg a shealltainn."
+
+#: ../data/org.gnome.Music.gschema.xml.h:12
+msgid "Notifications mode"
+msgstr "Modh nam brathan"
+
+#: ../data/org.gnome.Music.gschema.xml.h:13
+msgid "Enables or disables playback notifications"
+msgstr "Cuiridh seo brathan na cluich an comas no à comas"
+
+#: ../data/org.gnome.Music.gschema.xml.h:14
+msgid "Enable ReplayGain"
+msgstr "Cuir meudachadh fuaime an comas"
+
+#: ../data/org.gnome.Music.gschema.xml.h:15
+msgid "Enables or disables ReplayGain for albums"
+msgstr ""
+"Cuiridh seo meudachadh air àirde na fuaime airson albaman an comas no à comas"
+
+#: ../data/org.gnome.Music.gschema.xml.h:16
+msgid "Inital state has been displayed"
+msgstr "Chaidh an staid thùsail a shealltainn"
+
+#: ../data/org.gnome.Music.gschema.xml.h:17
+msgid "Set to true when initial state has been displayed"
+msgstr "’S e “true” a th’ ann ma chaidh an staid thùsail a shealltainn"
+
+#: ../gnomemusic/notification.py:55 ../data/PlayerToolbar.ui.h:6
+msgid "Previous"
+msgstr "Air ais"
+
+#: ../gnomemusic/notification.py:58 ../gnomemusic/player.py:558
+msgid "Pause"
+msgstr "Cuir ’na stad"
+
+#: ../gnomemusic/notification.py:61 ../gnomemusic/player.py:561
+#: ../data/PlayerToolbar.ui.h:7
+msgid "Play"
+msgstr "Cluich"
+
+#: ../gnomemusic/notification.py:63 ../data/PlayerToolbar.ui.h:8
+msgid "Next"
+msgstr "Air adhart"
+
+#: ../gnomemusic/player.py:1167
+msgid "Unable to play the file"
+msgstr "Chan urrainn dhuinn am faidhle a chluich"
+
+#. TRANSLATORS: this is a button to launch a codec installer.
+#. %s will be replaced with the software installer's name, e.g.
+#. 'Software' in case of gnome-software.
+#: ../gnomemusic/player.py:1172
+#, python-format
+msgid "_Find in %s"
+msgstr "_Lorg an-seo: %s"
+
+#. TRANSLATORS: separator for a list of codecs
+#: ../gnomemusic/player.py:1182
+msgid " and "
+msgstr " ’s "
+
+#. TRANSLATORS: separator for a list of codecs
+#: ../gnomemusic/player.py:1185
+msgid ", "
+msgstr ", "
+
+#: ../gnomemusic/player.py:1186
+#, python-format
+msgid "%s is required to play the file, but is not installed."
+msgid_plural "%s are required to play the file, but are not installed."
+msgstr[0] "Tha %s riatanach gus am faidhle a chluich ach cha deach a stàladh."
+msgstr[1] "Tha %s riatanach gus am faidhle a chluich ach cha deach an stàladh."
+msgstr[2] "Tha %s riatanach gus am faidhle a chluich ach cha deach an stàladh."
+msgstr[3] "Tha %s riatanach gus am faidhle a chluich ach cha deach an stàladh."
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:59
+msgid "Most Played"
+msgstr "’Ga chluich gu tric"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:64
+msgid "Never Played"
+msgstr "Gun chluich"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:69
+msgid "Recently Played"
+msgstr "O chionn ghoirid"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:74
+msgid "Recently Added"
+msgstr "Air a chur ris"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:79
+msgid "Favorite Songs"
+msgstr "Na h-òrain as annsa"
+
+#: ../gnomemusic/searchbar.py:63 ../gnomemusic/searchbar.py:111
+msgid "All"
+msgstr "Na h-uile"
+
+#: ../gnomemusic/searchbar.py:64
+msgid "Artist"
+msgstr "Neach-ciùil"
+
+#: ../gnomemusic/searchbar.py:65
+msgid "Album"
+msgstr "Albam"
+
+#: ../gnomemusic/searchbar.py:66 ../data/AlbumWidget.ui.h:3
+msgid "Composer"
+msgstr "Sgrìobhaiche ciùil"
+
+#: ../gnomemusic/searchbar.py:67
+msgid "Track Title"
+msgstr "Tiotail an traca"
+
+#: ../gnomemusic/searchbar.py:112
+msgid "Local"
+msgstr "Ionadail"
+
+#: ../gnomemusic/searchbar.py:224
+msgid "Sources"
+msgstr "Tùsan"
+
+#: ../gnomemusic/searchbar.py:231
+msgid "Match"
+msgstr "Maids"
+
+#: ../gnomemusic/utils.py:63
+msgid "Unknown Artist"
+msgstr "Neach-ciùil nach aithne dhuinn"
+
+#: ../gnomemusic/utils.py:75
+msgid "Untitled"
+msgstr "Gun tiotal"
+
+#: ../gnomemusic/views/albumsview.py:44 ../gnomemusic/views/searchview.py:454
+msgid "Albums"
+msgstr "Albaman"
+
+#: ../gnomemusic/views/artistsview.py:55 ../gnomemusic/views/searchview.py:455
+msgid "Artists"
+msgstr "Luchd-ciùil"
+
+#: ../gnomemusic/views/baseview.py:196
+#| msgid "Selected %d item"
+#| msgid_plural "Selected %d items"
+msgid "Selected {} item"
+msgid_plural "Selected {} items"
+msgstr[0] "Chaidh {} nì a thaghadh"
+msgstr[1] "Chaidh {} nì a thaghadh"
+msgstr[2] "Chaidh {} nithean a thaghadh"
+msgstr[3] "Chaidh {} nì a thaghadh"
+
+#: ../gnomemusic/views/baseview.py:201 ../gnomemusic/views/baseview.py:303
+#: ../gnomemusic/widgets/albumwidget.py:198
+#: ../gnomemusic/widgets/artistalbumswidget.py:232 ../data/headerbar.ui.h:3
+msgid "Click on items to select them"
+msgstr "Briog air nithean gus an taghadh"
+
+#: ../gnomemusic/views/emptyview.py:51
+msgid "Music folder"
+msgstr "Pasgan a’ chiùil"
+
+#: ../gnomemusic/views/emptysearchview.py:50
+msgid "Try a different search"
+msgstr "Feuch lorg eile"
+
+#: ../gnomemusic/views/initialstateview.py:50
+msgid "Hey DJ"
+msgstr "Hey DJ"
+
+#: ../gnomemusic/views/playlistview.py:58 ../gnomemusic/views/searchview.py:457
+msgid "Playlists"
+msgstr "Liostaichean-cluich"
+
+#: ../gnomemusic/views/playlistview.py:420
+#, python-format
+msgid "%d Song"
+msgid_plural "%d Songs"
+msgstr[0] "%d òran"
+msgstr[1] "%d òran"
+msgstr[2] "%d òrain"
+msgstr[3] "%d òran"
+
+#: ../gnomemusic/views/searchview.py:456 ../gnomemusic/views/songsview.py:55
+msgid "Songs"
+msgstr "Òrain"
+
+#: ../gnomemusic/widgets/albumwidget.py:194
+#: ../gnomemusic/widgets/artistalbumswidget.py:228
+#, python-format
+msgid "Selected %d item"
+msgid_plural "Selected %d items"
+msgstr[0] "Chaidh %d nì a thaghadh"
+msgstr[1] "Chaidh %d nì a thaghadh"
+msgstr[2] "Chaidh %d nithean a thaghadh"
+msgstr[3] "Chaidh %d nì a thaghadh"
+
+#: ../gnomemusic/widgets/albumwidget.py:291
+#: ../gnomemusic/widgets/albumwidget.py:345
+#, python-format
+msgid "%d min"
+msgstr "%d mion"
+
+#: ../gnomemusic/widgets/disclistboxwidget.py:189
+msgid "Disc {}"
+msgstr "Diosg {}"
+
+#: ../gnomemusic/window.py:125
+msgid "Loading"
+msgstr "’Ga luchdadh"
+
+#. Undo button
+#: ../gnomemusic/window.py:162
+msgid "_Undo"
+msgstr "_Neo-dhèan"
+
+#: ../gnomemusic/window.py:314
+msgid "Empty"
+msgstr "Falamh"
+
+#: ../gnomemusic/window.py:390
+#| msgid "Playlist %s removed"
+msgid "Playlist {} removed"
+msgstr "Chaidh an liosta-chluich {} a thoirt air falbh"
+
+#: ../data/AboutDialog.ui.in.h:2
+#| msgid "Copyright © 2013 GNOME Music Developers"
+msgid "Copyright © 2016 GNOME Music Developers"
+msgstr "Còir-lethbhreac © 2016 luchd-leasachaidh Ceòl GNOME"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "Aplacaid cluich is stiùireadh ciùil airson GNOME."
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "Tadhail air làrach-lìn Ceòl GNOME"
+
+#: ../data/AboutDialog.ui.in.h:5
+#| msgid ""
+#| "GNOME Music is free software; you can redistribute it and/or modify it "
+#| "under the terms of the GNU General Public License as published by the "
+#| "Free Software Foundation; either version 2 of the License, or (at your "
+#| "option) any later version.\n"
+#| "\n"
+#| "GNOME Music is distributed in the hope that it will be useful, but "
+#| "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#| "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#| "Public License for more details.\n"
+#| "\n"
+#| "You should have received a copy of the GNU General Public License along "
+#| "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#| "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#| "\n"
+#| "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#| "GStreamer plugins to be used and distributed together with GStreamer and "
+#| "GNOME Music. This permission is above and beyond the permissions granted "
+#| "by the GPL license by which GNOME Music is covered. If you modify this "
+#| "code, you may extend this exception to your version of the code, but you "
+#| "are not obligated to do so. If you do not wish to do so, delete this "
+#| "exception statement from your version.\n"
+#| "\n"
+#| "\"Magic of the vinyl\" by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+#| "https://www.flickr.com/photos/_spy_/12270839403\n"
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version.\n"
+"\n"
+"“Magic of the vinyl” by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+"https://www.flickr.com/photos/_spy_/12270839403\n"
+msgstr ""
+"’S e bathar-bog saor a th’ ann an Ceòl GNOME; faodaidh tu a sgaoileadh is/no "
+"atharrachadh fo cheadachas GNU General Public License mar a chaidh "
+"fhoillseachadh le Free Software Foundation; tionndadh 2 dhen cheadachas no "
+"(ma thogras tu) tionndadh sam bith nas àirde.\n"
+"\n"
+"Tha sinn a’ sgaoileadh Ceòl GNOME an dòchas gum bi e feumail ach GUN "
+"BHARANTAS SAM BITH; chan toir sinn eadhon barantas GUN GABH A REIC no gu "
+"bheil e FREAGARRACH AIRSON AMAIS SHÒNRAICHTE. Thoir sùil air GNU General "
+"Public License airson barrachd fiosrachaidh.\n"
+"\n"
+"Bu chòir do lethbhreac dhe GNU General Public License a bhith an cois Ceòl "
+"GNOME; mur eil, sgrìobh gun Free Software Foundation, Inc., 51 Franklin "
+"Street, Fifth Floor, Boston, MA 02110-1301, USA\n"
+"\n"
+"Le seo, tha ùghdaran Ceòl GNOME a’ toirt cead seachad gus na plugain "
+"GStreamer nach eil fo bhuaidh a’ GPL a chleachdadh ’s a sgaoileadh còmhla ri "
+"GStreamer agus Ceòl GNOME. Tha an cead seo thar nan ceadan a bheir "
+"ceadachas GPL seachad agus Ceòl GNOME fo a chòmhdachadh. Ma "
+"dh’atharraicheas tu an còd seo, faodaidh tu an eisgeachd seo a shìneadh air "
+"adhart dhan tionndadh agadsa dhen chòd ach cha leig thu leas. Mur eil thu "
+"airson seo a dèanamh, sguab às aithris na h-eisgeachd seo on tionndadh "
+"agadsa.\n"
+"\n"
+"Tha an dealbh “Magic of the vinyl” le Sami Pyylampi fo cheadachas CC-BY-SA "
+"2.0 https://www.flickr.com/photos/_spy_/12270839403\n"
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "Air a sgaoileadh"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "Faide"
+
+#: ../data/app-menu.ui.h:1
+msgid "_Keyboard Shortcuts"
+msgstr "Ath-ghoiridean a’ _mheur-chlàir"
+
+#: ../data/app-menu.ui.h:2
+msgid "_Help"
+msgstr "Cob_hair"
+
+#: ../data/app-menu.ui.h:3
+msgid "_About"
+msgstr "_Mu dhèidhinn"
+
+#: ../data/app-menu.ui.h:4
+msgid "_Quit"
+msgstr "_Fàg an-seo"
+
+#: ../data/headerbar.ui.h:1
+msgid "Select All"
+msgstr "Tagh na h-uile"
+
+#: ../data/headerbar.ui.h:2
+msgid "Select None"
+msgstr "Dì-thagh na h-uile"
+
+#: ../data/headerbar.ui.h:4
+msgid "Search"
+msgstr "Lorg"
+
+#: ../data/headerbar.ui.h:5
+msgid "Select"
+msgstr "Tagh"
+
+#: ../data/headerbar.ui.h:6 ../data/PlaylistDialog.ui.h:6
+#| msgid "Cancel"
+msgid "_Cancel"
+msgstr "S_guir dheth"
+
+#: ../data/headerbar.ui.h:7
+msgid "Back"
+msgstr "Air ais"
+
+#: ../data/help-overlay.ui.h:1
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Coitcheann"
+
+#: ../data/help-overlay.ui.h:2
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Dùin an uinneag"
+
+#: ../data/help-overlay.ui.h:3
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Lorg"
+
+#: ../data/help-overlay.ui.h:4
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Cobhair"
+
+#: ../data/help-overlay.ui.h:5
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Ath-ghoiridean"
+
+#: ../data/help-overlay.ui.h:6
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Cluich"
+
+#: ../data/help-overlay.ui.h:7
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Cluich/Cuir ’na stad"
+
+#: ../data/help-overlay.ui.h:8
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "An t-ath òran"
+
+#: ../data/help-overlay.ui.h:9
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "An òran roimhe"
+
+#: ../data/help-overlay.ui.h:10
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Toglaich an t-ath-chluiche"
+
+#: ../data/help-overlay.ui.h:11
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Toglaich a’ chluich air thuaiream"
+
+#: ../data/help-overlay.ui.h:12
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Seòladaireachd"
+
+#: ../data/help-overlay.ui.h:13
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Rach dha na h-albaman"
+
+#: ../data/help-overlay.ui.h:14
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Rach dhan luchd-ciùil"
+
+#: ../data/help-overlay.ui.h:15
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Rach dha na h-òrain"
+
+#: ../data/help-overlay.ui.h:16
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Rach dha na liostaichean-cluich"
+
+#: ../data/help-overlay.ui.h:17
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Air ais"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No music found"
+msgstr "Cha deach ceòl a lorg"
+
+#. Translators: %s will be replaced with a link with text
+#: ../data/NoMusic.ui.h:4
+#, no-c-format
+msgid "The contents of your %s will appear here."
+msgstr "Nochdaidh an t-susbaint a tha ann am %s agad an-seo."
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "Air thuaiream"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "Ath-chluich na h-uile"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "Ath-chluich an t-òran"
+
+#. Causes tracks to play in random order
+#: ../data/PlayerToolbar.ui.h:5
+msgid "Shuffle/Repeat Off"
+msgstr "Air thuaiream/ath-chluich dheth"
+
+#: ../data/PlaylistControls.ui.h:1
+msgid "_Play"
+msgstr "_Cluich"
+
+#: ../data/PlaylistControls.ui.h:2
+msgid "_Delete"
+msgstr "_Sguab às"
+
+#: ../data/PlaylistControls.ui.h:3
+msgid "Playlist Name"
+msgstr "Dealbh na liosta-cluich"
+
+#: ../data/PlaylistDialog.ui.h:1
+msgid "Enter a name for your first playlist"
+msgstr "Cuir a-steach ainm airson a’ chiad liosta-cluich agad"
+
+#: ../data/PlaylistDialog.ui.h:2
+msgid "C_reate"
+msgstr "C_ruthaich"
+
+#: ../data/PlaylistDialog.ui.h:3
+msgid "New Playlist"
+msgstr "Liosta-chluich ùr"
+
+#: ../data/PlaylistDialog.ui.h:4
+msgid "Add"
+msgstr "Cuir ris"
+
+#: ../data/PlaylistDialog.ui.h:5
+msgid "Select Playlist"
+msgstr "Tagh liosta-chluich"
+
+#: ../data/PlaylistDialog.ui.h:7
+msgid "_Add"
+msgstr "_Cuir ris"
+
+#: ../data/SelectionToolbar.ui.h:1
+#| msgid "Add to Playlist"
+msgid "_Add to Playlist"
+msgstr "_Cuir ris an liosta-chluich"
+
+#: ../data/SelectionToolbar.ui.h:2
+#| msgid "Remove from Playlist"
+msgid "_Remove from Playlist"
+msgstr "Thoi_r air falbh on liosta-chluich"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr ""
+#~ "An uiread as motha dhe charactaran a thèid a shealltainn ann an ainm "
+#~ "traca ann an sealladh an luchd-ciùil"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Atharraichidh an roghainn seo an uiread dhe charactaran airson tiotal "
+#~ "traca ann an sealladh an luchd-ciùil mus dèid trì-phuing a shealltainn. "
+#~ "Cuir seo air -1 gus a chur à comas"
+
+#~ msgid "Unknown Album"
+#~ msgstr "Albam nach aithne dhuinn"
+
+#~ msgid "the a an"
+#~ msgstr "a' an am na the a"
+
+#~ msgid "All Artists"
+#~ msgstr "A h-uile luchd-ciùil"
diff --git a/po/gl.po b/po/gl.po
new file mode 100644
index 00000000..190da26b
--- /dev/null
+++ b/po/gl.po
@@ -0,0 +1,693 @@
+# Galician translations for PACKAGE package.
+# Copyright (C) 2012 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Fran Diéguez <frandieguez@gnome.org>, 2012-2022.
+# Fran Dieguez <frandieguez@gnome.org>, 2012-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-12 11:30+0200\n"
+"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
+"Language-Team: Galician <proxecto@trasno.gal>\n"
+"Language: gl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+"X-Project-Style: gnome\n"
+"X-DL-Team: gl\n"
+"X-DL-Module: gnome-music\n"
+"X-DL-Branch: master\n"
+"X-DL-Domain: po\n"
+"X-DL-State: Translating\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Música"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Reproduce e organiza a súa colección de música"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Unha forma doada e pracenteira de reproducir a súa música."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Atope pistas na súa colección local, use as listas de reprodución xeradas "
+"automaticamente ou cree unha nova."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Os desenvolvedores de GNOME Music"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Reprodutor de música"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Música;Reprodutor;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Tamaño da xanela"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Tamaño da xanela (ancho e alto)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Xanela maximizada"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Estado da xanela maximizada."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Modo de repetición da reprodución"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"O valor identifica se se debe repetir ou facer aleatoria a reprodución na "
+"colección. Os valores permitidos son: «none» (a repetición e aleatoreidade "
+"están desactivadas), «song» (repite a canción actual), «all» (repite a lista "
+"de reprodución, non de forma aleatoria), «shuffle» (reproduce "
+"aleatoriamente, presume repetir todo)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Activar ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Activa ou desactiva ReplayGain para os álbums"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Inhibit a suspensión do sistema"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Activa ou desactiva a inhibición da suspensión do sistema ao reproducir "
+"música"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Informar do historial de música a Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Activar ou desactivar o envío de «scrobbles» e o «reproducindo actualmente» "
+"a Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Reproducir"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Reproducir"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Engadir ás cancións _favoritas"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Engadir á lista de reprodución…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Conta de Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Información da música que se escoita"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "Atallos de _teclado"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Axuda"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Sobre Música"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Benvida a Música"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menú"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Seleccionar"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Cancelar"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Buscar"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Atrás"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Xeral"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Pechar xanela"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Buscar"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Axuda"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Atallos"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Reproducir"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Reproducir/Pausar"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Seguinte canción"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Anterior canción"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Trocar repetición"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Trocar aleatorio"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navegación"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Ir aos álbums"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Ir aos artistas"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Ir ás cancións"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Ir ás listas de reprodución"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Ir atrás"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm é un servizo de descubrimento de música que fornece recomendacións "
+"personalizadas baseadas na música que escoita."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Informe de música non configurado"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Iniciar sesión na súa conta de Last.fm para informar da música que escoita."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Iniciar sesión"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Anterior"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Seguinte"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Retirar"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Renomear…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Nome da lista de reprodución"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Feito"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Escriba o nome para a súa primeira lista de reprodución"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "Cr_ear"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Nova lista de reprodución…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Engadir"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Engadir á lista de reprodución"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Engadir"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artistas"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Ver todo"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Álbums"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Cancións"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Seleccionar todo"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Deseleccionar todo"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Prema nos elementos para seleccionalos"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Engadir á lista de reprodución"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Quitar da lista de reprodución"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "O Proxecto GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Fran Diéguez <frandieguez@gnome.org>, 2022-2023"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright Os desenvolvedores de GNOME Music"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Traducido por"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Máis reproducidos"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Nunca reproducidos"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Reproducidos recentemente"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Engadidos recentemente"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Cancións favoritas"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Non foi posíbel reproducir o ficheiro"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Buscar en {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " e "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} requírese para reproducir o ficheiro, pero non está instalado."
+msgstr[1] ""
+"{} requírense para reproducir o ficheiro, pero non están instalados."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Reproducindo música"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Desactivar Aleatorio/Repetir"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Repetir canción"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Repetir todo"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Aleatorio"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Eliminouse a lista de reprodución {}"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Desfacer"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} eliminado de {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Álbum descoñecido"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Artista descoñecido"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "O seu cartafol «Música» de XDG non está estabelecido."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Cartafol de música"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Os contidos de {} aparecerán aquí."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Non se atopou música"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Probe unha busca diferente"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Música de GNOME non puido conectarse a Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Os seus ficheiros de música non poden indexarse sen ter Tracker executándose."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "A versión de Tracker do seu sistema semella desfasada."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Música precisa Tracker versión 3.0.0 ou superior."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Listas de reprodución"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Resultados de artistas"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Resultados de álbums"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{}, {} minuto"
+msgstr[1] "{} minutos"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disco {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Canción {} seleccionadas"
+msgstr[1] "Cancións {} seleccionadas"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Estase informando a Last.fm da música que escoita."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Non se está informando a Last.fm da música que escoita."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Sesión iniciada como {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Configurar"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pausar"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} canción"
+msgstr[1] "{} cancións"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Buscar cancións, artistas, álbums e listas de reprodución"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Unha aplicación de reprodución e xestión de música para GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Visite o sitio web de GNOME Music"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "Música de GNOME é software libre; pode redistribuílo e/ou modificalo "
+#~ "baixo os termos da Licenza Pública Xeral de GNU como se foi publicada "
+#~ "pola Free Software Foundation; tanto na versión 2 da licenza, ou (baixo a "
+#~ "súa elección) unha versión posterior.\n"
+#~ "\n"
+#~ "Música de GNOME distribúese coa esperanza de que lle sexa útil, pero SEN "
+#~ "NINGUNHA GARANTÍA; incluso a garantía implicada de MERCANTIBILIDADE ou "
+#~ "AXEITAMENTE PARA UN PROPÓSITO PARTICULAR. Vexa a Licenza Pública Xeral "
+#~ "para obter máis detalles.\n"
+#~ "\n"
+#~ "Debería ter recibido unha copia da Licenza Pública Xeral de GNU xunto a "
+#~ "Música de GNOME; se non, escriba á Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "Os autores de Música de GNOME concédenlle permiso para que os "
+#~ "complementos de GStreamer non compatíbeis con GPL sexan utilizados e "
+#~ "distribuídos xunto con GStreamer e Música de GNOME. Este permiso está por "
+#~ "enriba do permiso outorgado pola Licenza GPL pola que está cuberto Música "
+#~ "de GNOME. Se modifica este código, pode estender esta excepción á súa "
+#~ "versión do código, pero non está obrigado a facelo. Se non o desexa, "
+#~ "elimine esta declaración de excepción da súa versión.\n"
+#~ "A imaxe de “Magic of the vinyl” por Sami Pyylampi ten licenza CC-BY-SA "
+#~ "2.0 https://www.flickr.com/photos/_spy_/12270839403"
+
+#~| msgid "The contents of your {} will appear here."
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Os contidos do seu cartafol de Música aparecerán aquí"
+
+#~ msgid "GNOME Music"
+#~ msgstr "Música de GNOME"
+
+#~ msgid "Window position"
+#~ msgstr "Posición da xanela"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Posición da xanela (x e y)."
+
+#~ msgid "Loading"
+#~ msgstr "Cargando"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Engadir á lista de reprodución…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Unha forma doada de reproducir a súa música. Descobre música "
+#~ "automaticamente no seu computador, rede local e servizos de internet."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Atope pistas na súa colección local, obteña música desde servidores DLNA "
+#~ "ou tente algo novo cos servizos Jamendo e Magnatune."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Mostrouse o estado inicial"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Estabelecese a verdadeiro cando o valor inicial se mostrou"
+
+#~ msgid "Released"
+#~ msgstr "Publicada"
+
+#~ msgid "Running Length"
+#~ msgstr "Lonxitude da execución"
+
+#~ msgid "Composer"
+#~ msgstr "Compositor"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Reproducir"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Ola DJ"
diff --git a/po/he.po b/po/he.po
new file mode 100644
index 00000000..de58d452
--- /dev/null
+++ b/po/he.po
@@ -0,0 +1,799 @@
+# Hebrew translations for PACKAGE package.
+# Copyright (C) 2013 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Yaron Shahrabani <sh.yaron@gmail.com>, 2013.
+# Yosef Or Boczko <yoseforb@gmail.com>, 2013-2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNOME Music\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-07-28 10:01+0300\n"
+"Last-Translator: Yosef Or Boczko <yoseforb@gmail.com>\n"
+"Language-Team: Hebrew <yoseforb@gmail.com>\n"
+"Language: he\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? "
+"2 : 3)\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Generator: Gtranslator 42.0\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "מוזיקה"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "לנגן ולארגן את אוסף המוזיקה שלך"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "דרך קלה ונעימה לנגן את המוזיקה שלך."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"איתור רצועות באוסף המקומי שלך, נעשה שימוש ברשימות נגינה שנוצרות אוטומטית או "
+"שאפשר להכין אחת חדשה."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "מפתח GNOME Music"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "נגן מוזיקה"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "מוזיקה;מוסיקה;נגן;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "גודל החלון"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "גודל החלון (רוחב וגובה)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "החלון מוגדל"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "החלון במצב מוגדל למילוי המסך."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "מצב חזרה על נגינה"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Enable ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Enables or disables ReplayGain for albums"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Inhibit system suspend"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "Enables or disables inhibiting system suspend while playing music"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "דיווח על היסטוריית המוזיקה ל־Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "ניגון"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_ניגון"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "הוספה לשירים מו_עדפים"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "הוספה לרשימת _נגינה…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "חשבון Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "דיווח על האזנה למוזיקה"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_צירופי מקשים"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "ע_זרה"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "על _אודות מוזיקה"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "ברוך בואך למוזיקה"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "תפריט"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "בחירה"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_ביטול"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "חיפוש"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "חזרה"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "כללי"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "סגירת חלון"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "חיפוש"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "עזרה"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "צירופי מקשים"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "ניגון"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "ניגון/השהיה"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "שיר הבא"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "שיר קודם"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "חזרה על שיר"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "ערבוב שירים"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "ניווט"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "מעבר לאלבומים"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "מעבר לאמנים"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "מעבר לשירים"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "מעבר לרשימות נגינה"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "חזרה"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"‏Last.fm הוא שרת גילוי מוזיקה שמספק לך המלצות אישיות שמבוססות על המוזיקה לה "
+"בחרת להאזין."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "לא מוגדר דיווח מוזיקה"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "יש להיכנס לחשבון Last.fm שלך על מנת לדווח על המוזיקה שמושמעת."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "כניסה"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "הקודם"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "הבא"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "מ_חיקה"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_שינוי שם…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "שם רשימת נגינה"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_סיום"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "נא לתת שם לרשימת הנגינה הראשונה שלך"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "י_צירה"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "רשימת נגינה חדשה…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "הוספה"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "הוספה לרשימת נגינה"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "הו_ספה"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "אומנים"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "להציג הכול"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "אלבומים"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "שירים"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "בחירת הכול"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "ביטול הבחירה"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "יש ללחוץ על פריטים כדי לבחור אותם"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_הוספה לרשימת נגינה"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "ה_סרה מרשימת נגינה"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "מיזם GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "יוסף אור בוצ׳קו <yoseforb@gmail.com>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "כל הזכויות שמורות למפתחי GNOME Music"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "תורגם על ידי"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "הושמע ביותר"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "לעולם לא הושמע"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "הושמע לאחרונה"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "נוסף לאחרונה"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "שירים מועדפים"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "לא ניתן לנגן את הקובץ"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "ל_מצוא בתוך {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " וגם "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} נדרש לניגון הקובץ, אך אינו מותקן."
+msgstr[1] "{} נדרשים לניגון הקובץ, אך אינם מותקנים."
+msgstr[2] "{} נדרשים לניגון הקובץ, אך אינם מותקנים."
+msgstr[3] "{} נדרשים לניגון הקובץ, אך אינם מותקנים."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "מנגן מוזיקה"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "ערבוב/חזרה כבוי"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "חזרה על שיר"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "חזרה על הכול"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "ערבוב"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "רשימת הנגינה {} הוסרה"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "ביטול"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "‏{} הוסר מתוך {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "אלבום לא ידוע"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "אמן לא ידוע"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "תיקיית המוזיקה ב־XDG שלך אינה מוגדרת."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "תיקיית מוזיקה"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "התוכן של {} שלך יופיע כאן."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "לא נמצאה מוזיקה"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "נא לנסות חיפוש שונה"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "אין באפשרות GNOME Music התתחבר ל־Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "לא ניתן לסדר את קובצי המוזיקה שלך באינדקס ללא הפעלת Tracker."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "נראה כי גרסת ה־Tracker שבמערכת שלך אינה עדכנית."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "יישום המוזיקה דורש Tracker בגרסה 3.0.0 ומעלה."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "רשימות נגינה"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "תוצאות אומנים"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "תוצאות אלבומים"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "דקה"
+msgstr[1] "‫{} דקות"
+msgstr[2] "‫{} דקות"
+msgstr[3] "{} דקות"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "דיסק {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "שיר נבחר"
+msgstr[1] "שני שירים נבחרו"
+msgstr[2] "{} שירים נבחרו"
+msgstr[3] "{} שירים נבחרו"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "ההאזנה שלך למוזיקה מדווחת ל־Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "ההאזנה שלך למוזיקה אינה מדווחת ל־Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "נכנסת בשם {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "הגדרה"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "השהיה"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "שיר"
+msgstr[1] "שני שירים"
+msgstr[2] "{} שירים"
+msgstr[3] "{} שירים"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "חיפוש שירים, אמנים, אלבומים ורשימות נגינה"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "נגן ויישום לניהול מוזיקה עבור GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "ביקור באתר GNOME מוזיקה"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "‏GNOME Music היא תכנה חופשית; ניתן להפיצה מחדש ו/או לשנות אותה לפי תנאי "
+#~ "הרישיון הציבורי הכללי של GNU כפי שפורסם על ידי קרן התכנה החופשית; בין אם "
+#~ "גרסה 2 של הרישיון ובין אם (לבחירתך) כל גרסה מאוחרת יותר.\n"
+#~ "‬\n"
+#~ "‏‫\n"
+#~ "‬\n"
+#~ "‫תכנית זו מופצת בתקווה שתביא תועלת אך ללא אחריות כלשהי; אפילו לא האחריות "
+#~ "המשתמעת בדבר מסחריותה או התאמתה למטרה מסוימת. לפרטים נוספים ניתן לעיין "
+#~ "ברישיון הציבורי הכללי של GNU.\n"
+#~ "‬\n"
+#~ "‏‫\n"
+#~ "‬\n"
+#~ "‫עם GNOME Music אמור היה להיות מצורף עותק של הרישיון הציבורי הכללי של GNU; "
+#~ "במידה שלא, ניתן לכתוב ל־Free Software Foundation, Inc., 51 Franklin "
+#~ "Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "‬\n"
+#~ "‏‫\n"
+#~ "‬\n"
+#~ "‫היוצרים של GNOME Music מצהירים בזאת כי הם מעניקים הרשאה להפצה של תוספי "
+#~ "GStreamer שאינם מעוגנים תחת ה־GPL יחד עם GStreamer ו־GNOME Music. הרשאה "
+#~ "זו תקפה על פני ההרשאה הניתנת על־ידי רישיון ה־GPL תחתיו מוגנת התכנית GNOME "
+#~ "Music. כל שינוי בקוד זה עשוי לאלץ אותך להרחיב את החריגה לקוד בגרסה שהכנת, "
+#~ "אך אין כל התחייבות לעשות זאת. אם אין לך עניין לעשות דבר שכזה, יש למחוק את "
+#~ "הצהרת החריגה הזאת מהגרסה שלך."
+
+#~| msgid "The contents of your {} will appear here."
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "התוכן של תיקיית המוזיקה שלך שלך יופיע כאן"
+
+#~ msgid "GNOME Music"
+#~ msgstr "‏GNOME מוזיקה"
+
+#~ msgid "Window position"
+#~ msgstr "מיקום החלון"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "מיקום החלון (x ו־y)."
+
+#~ msgid "Loading"
+#~ msgstr "בטעינה"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "הוספה לרשימת נגינה…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "דרך קלה לנגן את המוזיקה שלךץ מזהה באופן אוטומטי מוזיקה במחשב שלך, ברשת "
+#~ "המקומית ובשרתי אינטרנט."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "למצוא רצועות באוספים המקומיים שלך, לקבל מוזיקה משרתי DLNA או לנסות משהו "
+#~ "חדש עם שרתי Jamendo ו־Magnatune."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Inital state has been displayed"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Set to true when initial state has been displayed"
+
+#~ msgid "Released"
+#~ msgstr "הוצאה לאור"
+
+#~ msgid "Running Length"
+#~ msgstr "משך ההשמעה"
+
+#~ msgid "Composer"
+#~ msgstr "מלחין"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "ניגון"
+
+#~ msgid "Hey DJ"
+#~ msgstr "שלום תקליטן"
+
+#~ msgid "Search mode"
+#~ msgstr "Search mode"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "If true, the search bar is shown."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Notifications mode"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Enables or disables playback notifications"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "Max chars to display in track name on Artist view"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "מוזיקה הוא נגן מוזיקה חדש עבור GNOME"
+
+#~ msgid "Untitled"
+#~ msgstr "ללא כותרת"
+
+#~ msgid "the a an"
+#~ msgstr "ה"
+
+#~ msgid "All"
+#~ msgstr "הכול"
+
+#~ msgid "Artist"
+#~ msgstr "אמן"
+
+#~ msgid "Album"
+#~ msgstr "אלבום"
+
+#~ msgid "Track Title"
+#~ msgstr "כותרת רצועה"
+
+#~ msgid "Local"
+#~ msgstr "מקומי"
+
+#~ msgid "Sources"
+#~ msgstr "מקורות"
+
+#~ msgid "Match"
+#~ msgstr "התאמה"
+
+#~ msgid "%d min"
+#~ msgstr "%d דקות"
+
+#~ msgid "All Artists"
+#~ msgstr "כל האמנים"
+
+#~ msgid "Empty"
+#~ msgstr "ריק"
+
+#~ msgid "_Quit"
+#~ msgstr "י_ציאה"
+
+#~ msgid "Not playing"
+#~ msgstr "לא מתנגן"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "של %s, מתוך %s"
+
+#~ msgid "Select Playlist"
+#~ msgstr "בחירת רשימת השמעה"
+
+#~ msgid "the"
+#~ msgstr "ה"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_רשימת השמעה חדשה"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "לא נמצאה מוזיקה!\n"
+#~ " שים כמה קבצים בתיקייה %s"
+
+#~ msgid "Load More"
+#~ msgstr "טעינת עוד"
+
+#~ msgid "Now _Playing"
+#~ msgstr "מת_נגן כעת"
+
+#~ msgid "----"
+#~ msgstr "----"
+
+#~ msgid "--:--"
+#~ msgstr "--:--"
+
+#, fuzzy
+#~ msgid "0:00"
+#~ msgstr "00:00"
+
+#~ msgid "/"
+#~ msgstr "/"
+
+#~ msgid "If true, do randomized playback through the collection"
+#~ msgstr "If true, do randomized playback through the collection"
diff --git a/po/hr.po b/po/hr.po
new file mode 100644
index 00000000..54b975b4
--- /dev/null
+++ b/po/hr.po
@@ -0,0 +1,748 @@
+# Croatian translation for gnome-music.
+# Copyright (C) 2017 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2022-08-27 13:27+0000\n"
+"PO-Revision-Date: 2022-08-27 22:37+0200\n"
+"Last-Translator: gogo <trebelnik2@gmail.com>\n"
+"Language-Team: Croatian <hr@li.org>\n"
+"Language: hr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\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"
+"X-Generator: Poedit 3.1.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:236
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Glazba"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Slušajte i organizirajte svoju glazbenu kolekciju"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Jednostavan i ugodan način slušanja glazbe."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Potražite pjesme u svojoj lokalnoj fonoteci, koristite automatski stvorene "
+"popise izvođenja ili stvorite nove."
+
+#: data/org.gnome.Music.appdata.xml.in.in:167
+msgid "The GNOME Music developers"
+msgstr "GNOME Glazbeni razvijatelji"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Glazbeni svirač"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Glazba;Svirač;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Veličina prozora"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Veličina prozora (širina i visina)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Prozor uvećan"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Stanje uvećanog prozora."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Način ponavljanja reprodukcije"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Vrijednost određuju treba li ponoviti ili naizmjenično reproducirati "
+"kolekciju. Dopuštene vrijednosti su: “none” (ponavljanje i naizmjenična "
+"reprodukcija su isključeni), “song” (ponovi trenutnu pjesmu), “all” (ponovi "
+"popis izvođenja, bez naizmjenične reprodukcije), “shuffle” (naizmjenična "
+"reprodukcija popisa izvođenja, pretpostavlja ponavljanje svega)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Omogući normalizaciju zvuka"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Omogući ili onemogući normalizaciju zvuka za albume"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Opozovi suspendiranje sustava"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Omogućuje ili onemogućuje opoziv suspendiranja sustava pri slušanju glazbe"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Prijavi povijest slušanja na Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Omogući ili onemogući slanje skroblanja i \"trenutne reprodukcije\" na Last."
+"fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Reproduciraj"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Sviraj"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Dodaj u _omiljene pjesme"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Dodaj na popis izvođenja…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm račun"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Prijavi povijest slušanja"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Prečaci tipkovnice"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Priručnik"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_O Glazbi"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Dobrodošli u Glazbu"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Izbornik"
+
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Odaberi"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Odustani"
+
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Pretraga"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "Natrag"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Općenito"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Zatvori prozor"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Pretraga"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Priručnik"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Prečaci"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Reprodukcija"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Reproduciraj/Pauziraj"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Sljedeća pjesma"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Prijašnja pjesma"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Uklj/Isklj ponavljanje"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Uklj/Isklj ponavljanje"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigacija"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Idi u albume"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Idi u izvođače"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Idi u pjesme"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Idi u popise izvođenja"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Idi natrag"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm je usluga za otkrivanje glazbe koja vam daje personalizirane "
+"preporuke na temelju glazbe koju slušate."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Prijava glazbe nije postavljena"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Prijavite se u svoj Last.fm račun kako bi mogli prijaviti svoje slušanje "
+"glazbe."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Prijava"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Prijašnja"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Sljedeća"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Obriši"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Preimenuj…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Naziv popis izvođenja"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Završeno"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Upišite naziv za vaš prvi popis izvođenja"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "S_tvori"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Novi popis izvođenja…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Dodaj"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Dodaj na popis izvođenja"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Dodaj"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Izvođači"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Prikaži sve"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albumi"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Pjesme"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Odaberi sve"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Bez odabira"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Kliknite na stavku za odabir"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Dodaj na popis izvođenja"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Ukloni s popisa izvođenja"
+
+#: gnomemusic/about.py:238
+msgid "The GNOME Project"
+msgstr "GNOME projekt"
+
+#: gnomemusic/about.py:242
+msgid "translator-credits"
+msgstr ""
+"Launchpad Contributions:\n"
+" gogo https://launchpad.net/~trebelnik-stefina"
+
+#: gnomemusic/about.py:246
+msgid "Copyright The GNOME Music Developers"
+msgstr "Autorsko pravo GNOME Glazbeni razvijatelji"
+
+#: gnomemusic/about.py:249
+msgid "Translated by"
+msgstr "Preveli"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Najslušanije"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Nepreslušano"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Nedavno slušano"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Nedavno dodano"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Omiljene pjesme"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Nemoguća reprodukcija datoteke"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Pretraži u {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " i "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} je potreban za reprodukciju datoteke, ali nije instaliran."
+msgstr[1] "{} su potrebni za reprodukciju datoteke, ali nisu instalirani."
+msgstr[2] "{} su potrebni za reprodukciju datoteke, ali nisu instalirani."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Reprodukcija glazbe"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "Naizmjenično"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Ponovi pjesmu"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Ponovni sve"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr "Naizmjenično/Ponovi isključi"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Popis izvođenja {} uklonjen"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Vrati"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} uklonjeno iz {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Nepoznat album"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Nepoznati izvođač"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Vaš XDG glazbeni direktorij nije postavljen."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Glazbena mapa"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Sadržaj vaše {} će se pojaviti ovdje."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Glazba nije pronađena"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Pokušaj drugačiju pretragu"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Glazba se ne može povezati s Pratiteljem."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Ne može se stvoriti sadržaj vaših glazbenih datoteka bez pokrenutog "
+"Pratitelja."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Izgleda da je inačica vašeg Pratitelja sustava zastarjela."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Glazba treba Pratitelja inačice 3.0.0 ili novijeg."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Popis izvođenja"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Rezultati izvođača"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Rezultati albuma"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minuta"
+msgstr[1] "{} minute"
+msgstr[2] "{} minuta"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disk {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Odabrana {} pjesma"
+msgstr[1] "Odabrane {} pjesme"
+msgstr[2] "Odabrane {} pjesama"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Vaše slušanje glazbe je prijavljeno na Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Vaše slušanje glazbe nije prijavljeno na Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Prijavljeni kao {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Podesi"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pauziraj"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} pjesma"
+msgstr[1] "{} pjesme"
+msgstr[2] "{} pjesama"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr ""
+#~ "Glazbeni svirač i aplikacija upravljanja glazbenom kolekcijom za GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Posjeti GNOME Glazba web stranicu"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME Glazba je slobodan softver; možete ga redistribuirati i/ili "
+#~ "mijenjati pod uvjetima GNU Opće javne licence objavljene od Fundacije "
+#~ "slobodnog softvera; ili inačice 2 Licence ili (po vašemu mišljenju) svake "
+#~ "kasnije inačice.\n"
+#~ "\n"
+#~ "GNOME Glazba je distribuiran u nadi da će biti koristan ali BEZ IKAKVOG "
+#~ "JAMSTVA; čak i bez podrazumjevanog jamstva ili POGODNOSTI ZA ODREĐENU "
+#~ "NAMJENU. Pogledajte GNU Opću javnu licencu za više informacija.\n"
+#~ "\n"
+#~ "Trebali ste dobiti primjerak GNU Opće javne licence uz ovaj program; ako "
+#~ "niste, pišite na adresu Free Software Foundation, Inc., 51 Franklin "
+#~ "Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "Autori GNOME Glazbe ovime odobravaju dozvolu za ne-OJL kompatibilne "
+#~ "GStreamer priključke da se mogu koristiti i distribuirati zajedno s "
+#~ "GStreamerom i GNOME Glazbom. Ova dozvola je iznad i izvan dozvole "
+#~ "odobrene OJL licencom kojom je GNOME Glazba pokrivena. Ako mijenjate "
+#~ "ovaj kôd, morate istaknuti tu iznimku u vašoj inačici kôda, ali Vi niste "
+#~ "dužni to učiniti. Ako to ne želite učiniti, obrišite ovu izjavu iznimke "
+#~ "iz vaše inačice."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Sadržaj vaše Glazbene mape će se pojaviti ovdje."
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME Glazba"
+
+#~ msgid "Window position"
+#~ msgstr "Položaj prozora"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Položaj prozora (x-os i y-os)"
+
+#~ msgid "Loading"
+#~ msgstr "Učitavanje"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Dodaj na popis izvođenja…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Jednostavan način slušanja glazbe. Automatski otkrijte svoju glazbu na "
+#~ "računalu, lokalnoj mreži i internetskim uslugama."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Potražite pjesme u svojoj lokalnoj kolekciji, nabavite glazbu na DLNA "
+#~ "poslužiteljima ili isprobajte nešto novo s Jamenado i Magnatune uslugama."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Početno stanje je prikazano"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Postavite na 'true' kada je početno stanje prikazano"
+
+#~ msgid "Released"
+#~ msgstr "Objavljeno"
+
+#~ msgid "Running Length"
+#~ msgstr "Trajanje"
+
+#~ msgid "Composer"
+#~ msgstr "Skladatelj"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Reproduciraj"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hej DJ"
+
+#~ msgid "All"
+#~ msgstr "Svi"
+
+#~ msgid "Artist"
+#~ msgstr "Izvođač"
+
+#~ msgid "Album"
+#~ msgstr "Album"
+
+#~ msgid "Track Title"
+#~ msgstr "Naslov pjesme"
+
+#~ msgid "Local"
+#~ msgstr "Lokalno"
+
+#~ msgid "Sources"
+#~ msgstr "Izvori"
+
+#~ msgid "Match"
+#~ msgstr "Podudara se"
+
+#~ msgid "Untitled"
+#~ msgstr "Neimenovano"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "_Quit"
+#~ msgstr "_Zatvori"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Glazba je nova GNOME aplikacija za slušanje glazbe."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Odabrana je %d stavka"
+#~ msgstr[1] "Odabrane su %d stavke"
+#~ msgstr[2] "Odabrano je %d stavki"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Empty"
+#~ msgstr "Prazna"
+
+#~ msgid "Search mode"
+#~ msgstr "Način pretraživanja"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Ako je odabrano, traka pretrage je prikazana."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Način obavijesti"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Omogući ili onemogući obavijesti reprodukcije"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Odaberi popis izvođenja"
diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 00000000..1f43e2b1
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,579 @@
+# Hungarian translation for gnome-music.
+# Copyright (C) 2013, 2014, 2015, 2016, 2018, 2019, 2020, 2021, 2022, 2023 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnome-music package.
+#
+# Gabor Kelemen <kelemeng at gnome dot hu>, 2013, 2016.
+# Balázs Meskó <mesko.balazs at fsf dot hu>, 2014, 2015, 2020, 2021.
+# Balázs Úr <ur.balazs at fsf dot hu>, 2013, 2014, 2015, 2016, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-07-26 01:47+0200\n"
+"Last-Translator: Balázs Úr <ur.balazs at fsf dot hu>\n"
+"Language-Team: Hungarian <openscope at fsf dot hu>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 23.04.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Zene"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Zenegyűjtemény rendszerezése és lejátszása"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Könnyű és kellemes módja a zenéje lejátszásának."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Keressen számokat a helyi gyűjteményében, használjon automatikusan "
+"előállított lejátszólistákat vagy állítson össze egyet."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "A GNOME Zene fejlesztői"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Zenelejátszó"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Zene;Lejátszó;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Ablakméret"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Ablak mérete (szélesség és magasság)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Ablak teljes méretű"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Az ablak maximalizált állapota."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Lejátszás ismétlési módja"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Az érték megadja, hogy a gyűjtemény lejátszását ismételni vagy "
+"véletlenszerűsíteni kell. Engedélyezett értékek: „none” (ismétlés és keverés "
+"kikapcsolva), „song” (jelenlegi szám ismétlése), „all” (lejátszólista "
+"ismétlése, nincs keverés), „shuffle” (véletlenszerű lejátszólista, "
+"feltételezi az összes ismétlését)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "ReplayGain engedélyezése"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Engedélyezi vagy letiltja a ReplayGain használatát az albumoknál"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Rendszer felfüggesztésének megakadályozása"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Engedélyezi vagy letiltja a rendszer felfüggesztésének megakadályozását "
+"zenelejátszás közben"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Zenék előzményeinek jelentése a Last.fm felé"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Engedélyezi vagy letiltja az előzmények és a „most játszott” információk "
+"elküldését a Last.fm-nek."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Lejátszás"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Lejátszás"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Hozzáadás a _kedvenc számokhoz"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "Hozzá_adás a lejátszólistához…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm-fiók"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Zenehallgatás jelentése"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Gyorsbillentyűk"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Súgó"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "A Zene _névjegye"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Üdvözli a Zene"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menü"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Kiválasztás"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Mégse"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Keresés"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Vissza"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Általános"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Ablak bezárása"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Keresés"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Súgó"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Gyorsbillentyűk"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Lejátszás"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Lejátszás/szünet"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Következő szám"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Előző szám"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Ismétlés ki/be"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Véletlenszerű lejátszás ki/be"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigáció"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Ugrás az albumokhoz"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Ugrás az előadókhoz"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Ugrás a számokhoz"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Ugrás a lejátszólistákhoz"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Vissza"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"A Last.fm egy zenefelfedező szolgáltatás, amely személyre szabott "
+"ajánlásokat ad az alapján, hogy milyen zenét hallgat."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "A zenejelentés nincs beállítva"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Jelentkezzen be a Last.fm-fiókjába, hogy jelentse, mit hallgat."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Bejelentkezés"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Előző"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Következő"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Törlés"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "Át_nevezés…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Lejátszólista neve"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Kész"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Adjon nevet az első lejátszólistájának"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "Lét_rehozás"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Új lejátszólista…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Hozzáadás"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Hozzáadás a lejátszólistához"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Hozzáadás"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Előadók"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Összes megtekintése"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albumok"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Számok"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Összes kijelölése"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Kijelölés törlése"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Kattintson az elemekre a kiválasztásukhoz"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "Hozzá_adás a lejátszólistához"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Eltávolítás a lejátszólistáról"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "A GNOME projekt"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Úr Balázs <ur dot balazs at fsf dot hu>, 2022."
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright – A GNOME Zene fejlesztői"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Fordította"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Legtöbbet lejátszott"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Sosem lejátszott"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Legutóbb lejátszott"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Legutóbb hozzáadott"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Kedvenc számok"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Nem lehet lejátszani a fájlt"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Keresés ebben: {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " és "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} szükséges a fájl lejátszásához, de nincs telepítve."
+msgstr[1] "{} szükségesek a fájl lejátszásához, de nincsenek telepítve."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Zene lejátszása"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Véletlen/Ismétlés kikapcsolva"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Szám ismétlése"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Összes ismétlése"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Véletlen sorrend"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "A(z) {} lejátszólista eltávolítva"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Visszavonás"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} eltávolítva innen: {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Ismeretlen album"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Ismeretlen előadó"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Az XDG Zenék könyvtára nincs beállítva."
+
+# A ~/Zenék
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Zenék mappa"
+
+# %s = "Zenék mappa"
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "A {} tartalma itt fog megjelenni."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Nem található zene"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Próbáljon egy másik keresést"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "A GNOME Zene nem tudott kapcsolódni a Trackerhez."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "A zenefájlokat nem lehet indexelni a Tracker futtatása nélkül."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "A rendszer Tracker verziója elavultnak tűnik."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "A Zene a Tracker 3.0.0 vagy újabb verzióját igényli."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Lejátszólisták"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Előadók találatai"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Albumok találatai"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} perc"
+msgstr[1] "{} perc"
+
+# FIXME ez lehet, hogy egy lemezcím, vagy sorszám, akkor nem lesz szép.
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Lemez {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} szám kijelölve"
+msgstr[1] "{} szám kijelölve"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "A hallgatott zenék jelentésre kerülnek a Last.fm-nek."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "A hallgatott zenék nem kerülnek jelentésre a Last.fm-nek."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Bejelentkezve mint {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Beállítás"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Szünet"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} szám"
+msgstr[1] "{} szám"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Számok, előadók, albumok és lejátszólisták keresése"
diff --git a/po/id.po b/po/id.po
new file mode 100644
index 00000000..26509695
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,741 @@
+# Indonesian translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# Andika Triwidada <andika@gmail.com>, 2013, 2014, 2015.
+# Dirgita <dirgitadevina@yahoo.co.id>, 2013.
+# Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017-2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-09 20:40+0700\n"
+"Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n"
+"Language-Team: Indonesian <gnome@i15n.org>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.3.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Musik"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Putar dan tata koleksi musik Anda"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Cara mudah dan menyenangkan untuk memainkan musik Anda."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Temukan trek di koleksi lokal Anda, gunakan daftar putar yang dibuat secara "
+"otomatis atau kurasi yang baru."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Para Pengembang GNOME Musik"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Pemutar Musik"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Pemutar;Musik;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Ukuran jendela"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Ukuran jendela (lebar dan tinggi)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Jendela dimaksimalkan"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Keadaan dimaksimalkan jendela."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Mode ulang pemutaran"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Nilai yang mengidentifikasi apakah mengulang atau mengacak pemutaran ulang "
+"koleksi. Nilai yang diizinkan adalah: \"none\" (tanpa pengulangan atau "
+"pengacakan), \"song\" (ulangi lagu saat ini), \"all\" (ulang daftar putar, "
+"tanpa pengacakan), \"shuffle\" (acak daftar putar, mengasumsikan ulang "
+"semua)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Fungsikan ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Mengaktifkan atau menonaktifkan pemberitahuan pemutaran"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Cegah suspensi sistem"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Mengaktifkan atau menonaktifkan pencegah suspensi sistem saat memutar musik"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Laporkan riwayat musik ke Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Aktifkan atau nonaktifkan pengiriman scrobbles dan info \"sedang diputar\" "
+"ke Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Putar"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Putar"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Tambah ke Lagu _Favorit"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "T_ambah ke Daftar Putar…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Akun Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Laporkan Mendengarkan Musik"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "Pintasan Papan _Ketik"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Bantuan"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "Tent_ang Musik"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Selamat Datang di Musik"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menu"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Pilih"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Batal"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Cari"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Mundur"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Umum"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Tutup jendela"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Cari"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Bantuan"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Pintasan"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Putar"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Putar/Tahan"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Lagu selanjutnya"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Lagu sebelumnya"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Jungkitkan pengulangan"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Jungkitkan pengacakan"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigasi"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Ke Album"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Ke Artis"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Ke Lagu"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Ke Daftar Putar"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Mundur"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm adalah layanan penemuan musik yang memberi Anda rekomendasi hasil "
+"personalisasi berdasarkan musik yang Anda dengarkan."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Pelaporan Musik Tidak Disetel"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Masuk ke akun Last.fm Anda untuk melaporkan musik yang Anda dengar."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Masuk"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Sebelumnya"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Selanjutnya"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Hapus"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Ubah Nama…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Nama Daftar Putar"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Selesai"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Masukkan nama daftar putar pertama Anda"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "B_uat"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Daftar Putar Baru…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Tambah"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Tambah ke Daftar Putar"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "T_ambah"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artis"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Tampilkan Semua"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Album"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Lagu"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Pilih Semua"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Pilih Tak Satupun"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Klik pada butir untuk memilihnya"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "T_ambah ke Daftar Putar"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Hapus dari Daftar Puta_r"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Proyek GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"Andika Triwidada <andika@gmail.com>, 2013, 2014, 2015.\n"
+"Dirgita <dirgitadevina@yahoo.co.id>, 2013.\n"
+"Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017-2023."
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Hak Cipta Para Pengembang GNOME Musik"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Diterjemahkan oleh"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Paling Sering Diputar"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Tak Pernah Diputar"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Baru-baru Ini Diputar"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Baru-baru Ini Ditambahkan"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Lagu Favorit"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Tak dapat memutar berkas"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Cari di {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " dan "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} diperlukan untuk memutar berkas, tapi tak terpasang."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Memutar musik"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Acak/Ulang Mati"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Ulangi Lagu"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Ulangi Semua"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Acak"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Daftar putar {} dihapus"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Tak Jadi"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} dihapus dari {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Album tak dikenal"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Artis Tak Dikenal"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Direktori XDG Music Anda tidak disetel."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Folder Musik"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Konten {} Anda akan muncul di sini."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Tak Ada Musik"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Cobalah Pencarian Lain"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Musik tidak dapat terhubung ke Pelacak."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Berkas musik Anda tidak dapat diindeks tanpa Pelacak berjalan."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Versi Pelacak sistem Anda tampaknya sudah usang."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Musik membutuhkan Pelacak versi 3.0.0 atau lebih tinggi."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Daftar Putar"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Hasil Artis"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Hasil Album"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} menit"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Cakram {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Dipilih {} lagu"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Musik yang Anda dengar dilaporkan ke Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Musik yang Anda dengar tidak dilaporkan ke Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Masuk sebagai {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Konfigurasikan"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Tahan"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} Lagu"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Cari lagu, artis, album, dan daftar putar"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Aplikasi manajemen dan pemutar musik bagi GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Kunjungi situs web Musik GNOME"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME Musik adalah perangkat lunak bebas; Anda dapat mendistribusikannya "
+#~ "dan/atau mengubahnya di bawah persyaratan GNU General Public License "
+#~ "sebagaimana dipublikasikan oleh Free Software Foundation; dengan Lisensi "
+#~ "versi 2, atau (sesuai pilihan Anda) sebarang versi lebih baru.\n"
+#~ "\n"
+#~ "GNOME Musik didistribusikan dengan harapan dapat berguna, tetapi TANPA "
+#~ "ADANYA JAMINAN; termasuk tanpa jaminan DAYA JUAL atau KELAIKAN UNTUK "
+#~ "TUJUAN TERTENTU. Lihat GNU General Public License untuk rincian lebih "
+#~ "lanjut.\n"
+#~ "\n"
+#~ "Anda seharusnya menerima salinan dari GNU General Public License bersama "
+#~ "GNOME Musik; jika tidak, kirimkan surat Anda ke Free Software Foundation, "
+#~ "Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n"
+#~ "\n"
+#~ "Para penulis GNOME Musik dengan ini memberikan ijin untuk plugin "
+#~ "GStreamer yang tak kompatibel dengan GPL untuk dipakai dan "
+#~ "didistribusikan bersama dengan GStreamer dan GNOME Musik. Ijin ini di "
+#~ "atas dan di luar hak yang diberikan oleh lisensi GPL yang mencakup GNOME "
+#~ "Musik. Bila Anda mengubah kode ini, Anda boleh memperluas pengecualian "
+#~ "ini ke versi kode Anda, tapi Anda tidak wajib melakukannya. Bila Anda "
+#~ "tak ingin seperti itu, hapuslah pernyataan pengecualian ini dari versi "
+#~ "Anda."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Isi Folder Musik Anda akan muncul di sini"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME Musik"
+
+#~ msgid "Window position"
+#~ msgstr "Posisi jendela"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Posisi jendela (x dan y)."
+
+#~ msgid "Loading"
+#~ msgstr "Memuat"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Tambah ke Daftar Putar…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Cara mudah memainkan musik Anda. Secara otomatis menemukan musik di "
+#~ "komputer Anda, jaringan lokal, dan layanan internet."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Temukan trek di koleksi lokal Anda, dapatkan musik dari server DLNA atau "
+#~ "coba sesuatu yang baru dengan layanan Jamendo dan Magnatune."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Keadaan awal telah ditampilkan"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Diisi dengan true ketika keadaan awal telah ditampilkan"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hey DJ"
+
+#~ msgid "Released"
+#~ msgstr "Dirilis"
+
+#~ msgid "Running Length"
+#~ msgstr "Lama Putar"
+
+#~ msgid "Composer"
+#~ msgstr "Pencipta"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Putar"
+
+#~ msgid "All"
+#~ msgstr "Semua"
+
+#~ msgid "Artist"
+#~ msgstr "Artis"
+
+#~ msgid "Album"
+#~ msgstr "Album"
+
+#~ msgid "Track Title"
+#~ msgstr "Judul Trek"
+
+#~ msgid "Local"
+#~ msgstr "Lokal"
+
+#~ msgid "Sources"
+#~ msgstr "Sumber"
+
+#~ msgid "Match"
+#~ msgstr "Cocok"
+
+#~ msgid "Untitled"
+#~ msgstr "Tanpa judul"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "_Quit"
+#~ msgstr "_Keluar"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Musik adalah aplikasi pemutar musik GNOME yang baru."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Dipilih %d butir"
+
+#~ msgid "Empty"
+#~ msgstr "Kosong"
+
+#~ msgid "Search mode"
+#~ msgstr "Mode cari"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Bila berisi true, bilah pencarian ditampilkan."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Mode pemberitahuan"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Mengaktifkan atau menonaktifkan pemberitahuan pemutaran"
+
+#~ msgid "%d min"
+#~ msgstr "%d mnt"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Pilih Daftar Putar"
diff --git a/po/is.po b/po/is.po
new file mode 100644
index 00000000..68e11bd7
--- /dev/null
+++ b/po/is.po
@@ -0,0 +1,758 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Sveinn í Felli <sv1@fellsnet.is>, 2015, 2017, 2018, 2019, 2021, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2022-08-27 13:27+0000\n"
+"PO-Revision-Date: 2022-10-17 14:03+0000\n"
+"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
+"Language-Team: Icelandic\n"
+"Language: is\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Lokalize 21.12.3\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:236
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Tónlist"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Spila og skipuleggja tónlistarsafnið þitt"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Einföld og þægileg leið til að spila tónlistina þína."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Finnur lög í safninu þínu á tölvunni, notar sjálfvirkt útbúna spilunarlista "
+"eða útbýr nýja."
+
+#: data/org.gnome.Music.appdata.xml.in.in:167
+msgid "The GNOME Music developers"
+msgstr "GNOME Music forritararnir"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Tónlistarspilari"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Tónlist;spilari;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Gluggastærð"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Breidd og hæð glugga."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Gluggi hámarkaður"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Hámörkunargildi glugga."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Endurtekningarhamur afspilunar"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Gildið gefur til kynna hvort afspilun safnsins sé endurtekin eða gerð "
+"handahófskennd. Leyfð gildi eru: “ekkert” (slökkt er á endurtekningu og "
+"stokkun), “lag” (endurtaka núverandi lag), “allt” (endurtaka spilunarlista, "
+"engin stokkun), “stokkun” (stokka spilunarlista, gerir ráð fyrir að "
+"endurtaka allt)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Virkja ReplayGain styrkjöfnun"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Virkjar eða gerir óvirka ReplayGain-styrkjöfnun fyrir hljómplötur"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Koma í veg fyrir svæfingu kerfis"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Virkjar eða gerir óvirkt kerfi sem setur í hvíld á meðan tónlist er spiluð"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Tilkynna tónlistarspilun ti Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Virkjar eða gerir óvirkt að senda til Last.fm upplýsingar um tónlistarspilun "
+"(scrobbling) og upplýsingar um \"í spilun núna\"."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Spila"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "S_pila"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Bæta við í U_ppáhaldslög"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "Bæt_a við spilunarlista…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm notandaaðgangur"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Tilkynna tónlistarspilun"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Flýtivísanir á lyklaborði"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Hjálp"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Um Music tónlistarhugbúnaðinn"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Velkomin í Music-tónlistarspilarann"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Valmynd"
+
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Velja"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Hætta við"
+
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Leita"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "Til baka"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Almennt"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Loka glugga"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Leita"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Hjálp"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Flýtilyklar"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Afspilun"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Spila / Bíða"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Næsta lag"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Fyrra lag"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Víxla endurtekningu af/á"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Víxla stokkun af/á"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Flakk"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Fara í Hljómplötur"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Fara í Flytjendur"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Fara í Lög"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Fara í Spilunarlistar"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Fara til baka"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm er tónlistarveita sem gefur þér perónulegar ráðleggingar byggðar á "
+"þeirri tónlist sem þú hlustar á."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Ekki búið að setja upp tilkynningar um tónlistarspilun"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Skráðu þig inn á Last.fm aðganginn þinn til að tilkynna tónlistarspilunina "
+"þína."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Innskráning"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Fyrra"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Næsta"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Eyða"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "Endu_rnefna…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Heiti spilunarlista"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Lokið"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Settu inn heiti á fyrsta spilunarlistann þinn"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Búa til"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Nýr spilunarlisti…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Bæta við"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Bæta við spilunarlista"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "Bæt_a við"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Flytjendur"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Skoða allt"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Hljómplötur"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Lög"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Velja allt"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Velja ekkert"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Smelltu á atriði til að velja þau"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "Bæt_a við spilunarlista"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Fja_rlægja af spilunarlista"
+
+#: gnomemusic/about.py:238
+msgid "The GNOME Project"
+msgstr "GNOME-verkefnið"
+
+#: gnomemusic/about.py:242
+msgid "translator-credits"
+msgstr "Sveinn í Felli, sv1@fellsnet.is"
+
+#: gnomemusic/about.py:246
+#| msgid "Copyright © 2018 GNOME Music Developers"
+msgid "Copyright The GNOME Music Developers"
+msgstr "Höfundarréttur © GNOME Music forritararnir"
+
+#: gnomemusic/about.py:249
+msgid "Translated by"
+msgstr "Þýtt af"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Mest spilað"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Aldrei spilað"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Nýlega spilað"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Nýlega bætt við"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Uppáhaldslög"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Gat ekki spilað skrána"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Finna í {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " og "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} er nauðsynlegt til að spila skrána, en er ekki uppsett."
+msgstr[1] "{} eru nauðsynleg til að spila skrána, en eru ekki uppsett."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Spilandi tónlist"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "Stokka"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Endurtaka lag"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Endurtaka allt"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr "Stokkun/Endurtekning af"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Spilunarlisti {} fjarlægður"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Afturkalla"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} fjarlægt úr {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Óþekkt hljómplata"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Óþekktur flytjandi"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "XDG-tónlistarmappa hefur ekki verið skilgreind."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Tónlistarmappa"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Innihald {} birtist hér."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Engin tónlist fannst"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Reyna aðra leit"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME tónlistarspilarinn gat ekki tengst Tracker-kerfinu."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Ekki er hægt að gera yfirlitsskrá yfir tónlistarskrár nema Tracker sé í "
+"gangi."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Tracker-útgáfa kerfisins þíns lítur út fyrir að vera úrelt."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Tónlistarspilarinn þarf Tracker útgáfu 3.0.0 eða hærri."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Spilunarlistar"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Niðurstöður um flytjendur"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Niðurstöður um hljómplötur"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} mínúta"
+msgstr[1] "{} mínútur"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Diskur {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Valdi {} lag"
+msgstr[1] "Valdi {} lög"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Tónlistarspilun þín er tilkynnt til Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Tónlistarspilun þín er ekki tilkynnt til Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Skráð inn sem {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Stilla"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Hlé"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} lag"
+msgstr[1] "{} lög"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Tónlistarspilari og forrit fyrir umsýslu tónlistar fyrir GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Fara á heimasíðu GNOME tónlistarspilarans"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "Þetta er frjáls hugbúnaður; þú mátt dreifa honum og/eða breyta samkvæmt "
+#~ "skilmálum í almenna GNU GPL notkunarleyfinu eins og það er gefið út af "
+#~ "Frjálsu hugbúnaðarstofnuninni; annaðhvort útgáfu 2 af GPL-leyfinu, eða "
+#~ "(ef þér sýnist svo) einhverja nýrri útgáfu leyfisins.\n"
+#~ "\n"
+#~ "Hugbúnaðnum er dreift í þeirri von að hann geti verið gagnlegur, en ÁN "
+#~ "ALLRAR ÁBYRGÐAR; einnig án þeirrar ábyrgðar sem gefin er í skyn með "
+#~ "SELJANLEIKA eða EIGINLEIKUM TIL TILTEKINNA NOTA. Sjá almenna GNU GPL "
+#~ "notkunarleyfið fyrir nánari upplýsingar.\n"
+#~ "\n"
+#~ "Það ætti að hafa fylgt afrit af almenna GNU GPL notkunarleyfinu með "
+#~ "forritinu; ef ekki skrifið þá Fjálsu hugbúnarstofnuninni: Free Software "
+#~ "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Höfundar GNOME Music gefa hér með leyfi sitt fyrir því að nota megi "
+#~ "GStreamer viðbætur sem ekki falla undir GPL-notkunarleyfi eða sé ekki "
+#~ "dreift með GStreamer og GNOME Music. Þessi heimild er rétthærri en "
+#~ "kvaðir GPL-skilmálanna sem GNOME Music fellur undir. Ef þú breytir "
+#~ "þessum kóða, geturðu víkkað þessa undanþágu til að ná yfir þína útgáfu "
+#~ "kóðans, en slíkt er ekki skylda. Ef þú ákveður að gera það ekki, eyddu "
+#~ "þá þessari undanþágu út úr þinni útgáfu."
+
+#~| msgid "The contents of your {} will appear here."
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Innihald Tónlist-möppunnar þinnar birtist hér"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME tónlistarspilari"
+
+#~ msgid "Window position"
+#~ msgstr "Staðsetning glugga"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Staðsetning glugga (x og y)."
+
+#~ msgid "Loading"
+#~ msgstr "Hleð inn"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Bæta við spilunarlista…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Einföld leið til að spila tónlistina þína. Finndu sjálfkrafa tónlist á "
+#~ "tölvunni þinni, staðarnetinu og internetþjónustum."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Finndu lög í þínu eigin safni, náðu í tónlist af DLNA-þjónum eða prófaðu "
+#~ "eitthvað alveg nýtt frá þjónustum á borð við Jamendo og Magnatune."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Upphafsstaða var birt"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Setja sem satt þegar upphafsstaða hefur verið birt"
+
+#~ msgid "Released"
+#~ msgstr "Útgefið"
+
+#~ msgid "Running Length"
+#~ msgstr "Spilunartími"
+
+#~ msgid "Composer"
+#~ msgstr "Tónskáld"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Spila"
+
+#~ msgid "Untitled"
+#~ msgstr "Ónefnt"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Plötusnúður"
+
+#~ msgid "All"
+#~ msgstr "Allt"
+
+#~ msgid "Artist"
+#~ msgstr "Flytjandi"
+
+#~ msgid "Album"
+#~ msgstr "Albúm"
+
+#~ msgid "Track Title"
+#~ msgstr "Heiti lags"
+
+#~ msgid "Local"
+#~ msgstr "Staðvært"
+
+#~ msgid "Sources"
+#~ msgstr "Uppruni"
+
+#~ msgid "Match"
+#~ msgstr "Samsvörun"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "_Quit"
+#~ msgstr "_Hætta"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Tónlist/Music er nýi GNOME tónlistarspilarinn."
+
+#~| msgid "gnome-music"
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "Leitarhamur"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Ef hakað er við þetta, birtist leitarstikan."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Tilkynningahamur"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Virkjar eða gerir óvirkar tilkynningar um afspilun"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Valdi %d atriði"
+#~ msgstr[1] "Valdi %d atriði"
+
+#~ msgid "%d min"
+#~ msgstr "%d mín"
+
+#~ msgid "Empty"
+#~ msgstr "Tómt"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Veldu spilunarlista"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an"
+
+#~ msgid "the a an"
+#~ msgstr "the a an hin"
+
+#~ msgid "All Artists"
+#~ msgstr "Allir flytjendur"
+
+#~ msgid "Not playing"
+#~ msgstr "Ekki í spilun"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "eftir %s, af %s"
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 00000000..ac86993a
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,591 @@
+# Italian translation of Gnome Music.
+# Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Free Software Foundation, Inc.
+# Copyright (C) 2020, 2022, 2023 Free Software Foundation, Inc.
+#
+# Convenzioni usate:
+#
+# song & track
+# Tradurre entrambi come brano tranne i casi
+# in cui traccia è più adeguato.
+#
+# browser
+# Ce ne sono due tipi: quello per condivisioni su
+# Bonjour/Zeroconf ed il widget che permette di filtrare
+# per artista/album/autore. Il primo è browser, il
+# secondo catalogo (ove possibile distinguere)
+# Milo Casagrande <milo@milo.name>, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2022, 2023.
+# Gianvito Cavasoli <gianvito@gmx.it>, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-30 09:47+0200\n"
+"Last-Translator: Milo Casagrande <milo@milo.name>\n"
+"Language-Team: Italian <gnome-it-list@gnome.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Launchpad-Export-Date: 2012-03-06 09:28+0000\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Musica"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Riproduce e organizza la collezione musicale"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Un modo semplice e piacevole per riprodurre la propria musica."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Trova i brani nella tua raccolta locale, usa le playlist generate "
+"automaticamente o curane una nuova."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Gli sviluppatori di GNOME Musica"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Riproduttore musicale"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Musica;Riproduttore;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Dimensione finestra"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "La dimensione della finestra (larghezza e altezza)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Finestra massimizzata"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Lo stato di massimizzazione della finestra."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Modalità ripetizione"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Indica se ripetere o riprodurre a caso la libreria musicale. Valori "
+"consentiti sono: \"none\" (ripetizione e riproduzione casuale disabilitati), "
+"\"song\" (ripete il brano corrente), \"all\" (ripete playlist, niente "
+"riproduzione casuale), \"shuffle\" (riproduzione casuale della playlist, "
+"assume di ripetere tutto)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Abilita ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Abilita o disabilita il ReplayGain per gli album"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Inibisce la sospensione del sistema"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Abilita/Disabilita la sospensione del sistema quando viene riprodotta della "
+"musica"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Invia la cronologia musicale a Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Abilita/Disabilita l'invio della musica ascoltata e della musica in "
+"riproduzione a Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Riproduci"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Riproduci"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Aggiungi ai _brani preferiti"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "Aggiungi a _playlist…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Account Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Invia musica ascoltata"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Scorciatoie da tastiera"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "A_iuto"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "I_nformazioni su Musica"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Benvenuti in Musica"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menù"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Seleziona"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "A_nnulla"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Cerca"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Indietro"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Generale"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Chiude la finestra"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Cerca"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Aiuto"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Scorciatoie"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Riproduzione"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Riproduci/Pausa"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Brano successivo"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Brano precedente"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Attiva/Disattiva ripetizione"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Attiva/Disattiva riproduzione casuale"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigazione"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Va agli album"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Va agli artisti"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Va ai brani"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Va alle playlist"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Indietro"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm è un servizio di scoperta musicale che fornisce raccomandazioni "
+"personalizzate in base alla musica ascoltata."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Invio cronologia musicale non attivo"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Accedere al proprio account Last.fm per inviare la cronologia musicale."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Accedi"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Precedente"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Successiva"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Elimina"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Rinomina…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Nome playlist"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Fatto"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Inserire un nome per la prima playlist"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "C_rea"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Nuova playlist…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Aggiungi"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Aggiungi a playlist"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "A_ggiungi"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artisti"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Visualizza tutti"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Album"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Brani"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Seleziona tutto"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Deseleziona tutto"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Fare clic sugli elementi per selezionarli"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "Aggiungi a _playlist"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Rimuovi da playlist"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Il progetto GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Milo Casagrande <milo@milo.name>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright de gli sviluppatori di GNOME Musica"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Milo Casagrande <milo@milo.name>"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Più ascoltati"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Mai ascoltati"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Ascoltati di recente"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Aggiunti di recente"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Brani preferiti"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Impossibile riprodurre il file"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Trova in {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " e "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} è richiesto per riprodurre i file, ma non è installato."
+msgstr[1] "{} sono richiesti per riprodurre il file, ma non sono installati."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Musica in riproduzione"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Mischia/Ripeti disattivati"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Ripeti brano"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Ripeti tutto"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Mischia"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Playlist {} rimossa"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Annulla"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} rimosso da {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Album sconosciuto"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Artista sconosciuto"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "La directory Musica di XDG non è impostata."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Cartella Musica"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Il contenuto della propria «{}» apparirà qui."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Nessuna musica trovata"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Provare con un'altra ricerca"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Impossibile collegarsi a Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Non è possibile indicizzare i propri file musicali senza Tracker in "
+"esecuzione."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "La versione di Tracker del sistema non sembra essere recente."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Musica necessita della versione 3.0.0, o successive, di Tracker."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Playlist"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Risultati artisti"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Risultati album"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minuto"
+msgstr[1] "{} minuti"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disco {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Selezionato {} brano"
+msgstr[1] "Selezionati {} brani"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "La cronologia musicale è inviata a Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "La cronologia musicale non è inviata a Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Accesso eseguito come {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Configura"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pausa"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} brano"
+msgstr[1] "{} brani"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Cerca brani, artisti album e playlist"
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 00000000..cf2bff8d
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,645 @@
+# Japanese translation for gnome-music.
+# Copyright (C) 2013-2015, 2019-2020, 2022 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# DanielaHidemiOyafuso <danielaoyafuso@gmail.com>, 2013.
+# Ikuya Awashiro <ikuya@fruitsbasket.info>, 2014.
+# Kento Tsuji <tuziemon@pclives.org>, 2014.
+# Hajime Taira <htaira@redhat.com>, 2015.
+# Jiro Matsuzawa <jmatsuzawa@gnome.org>, 2015.
+# sicklylife <translation@sicklylife.jp>, 2019-2020, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2022-02-19 12:39+0000\n"
+"PO-Revision-Date: 2022-03-13 20:50+0900\n"
+"Last-Translator: sicklylife <translation@sicklylife.jp>\n"
+"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/application.py:61
+#: gnomemusic/window.py:71
+msgid "Music"
+msgstr "ミュージック"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "音楽コレクションの再生と整理"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr ""
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+
+#: data/org.gnome.Music.appdata.xml.in.in:149
+msgid "The GNOME Music developers"
+msgstr "The GNOME Music developers"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "音楽プレーヤー"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;音楽;楽曲;ミュージック;再生;プレーヤー;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "ウィンドウのサイズ"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "ウィンドウのサイズ (幅と高さ) です。"
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "ウィンドウの最大化"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "ウィンドウの最大化状態です。"
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "プレイバックリピートモード"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"コレクションをリピートかランダム再生するかどうかの値です。使用可能な値: "
+"“none” (リピートとシャッフルを無効にする), “song” (再生中の曲をリピートす"
+"る), “all” (プレイリストをリピート、シャッフルしない), “shuffle” (プレイリス"
+"トをシャッフル、 プレイリストの全曲をリピートする)"
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "ReplayGain を有効にする"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "アルバムの ReplayGain を有効にするかどうか"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+
+#: data/ui/AboutDialog.ui.in:9
+msgid "Copyright © 2018 GNOME Music Developers"
+msgstr "Copyright © 2018 GNOME Music Developers"
+
+#: data/ui/AboutDialog.ui.in:10
+msgid "A music player and management application for GNOME."
+msgstr "音楽の再生と管理をするための GNOME アプリケーションです。"
+
+#: data/ui/AboutDialog.ui.in:12
+msgid "Visit GNOME Music website"
+msgstr "GNOME ミュージックのウェブサイトにアクセスする"
+
+#: data/ui/AboutDialog.ui.in:13
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+
+#: data/ui/AlbumWidget.ui:86 data/ui/PlayerToolbar.ui:88
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:168
+msgid "Play"
+msgstr "再生"
+
+#: data/ui/AlbumWidget.ui:132 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "再生(_P)"
+
+#: data/ui/AlbumWidget.ui:136
+msgid "Add to _Favorite Songs"
+msgstr "お気に入りの曲に追加(_F)"
+
+#: data/ui/AlbumWidget.ui:140 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "プレイリストに追加(_A)…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm アカウント"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "鑑賞した音楽を報告"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "キーボードショートカット(_K)"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "ヘルプ(_H)"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "“ミュージック”について(_A)"
+
+#: data/ui/EmptyView.ui:26 data/ui/InitialState.ui:13
+msgid "Welcome to Music"
+msgstr "“ミュージック”へようこそ"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "メニュー"
+
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "選択"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:211
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "キャンセル(_C)"
+
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "検索"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "戻る"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "全般"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "ウィンドウを閉じる"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "検索する"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "ヘルプを表示する"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "ショートカットを表示する"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "再生"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "再生/一時停止"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "次の曲へ"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "前の曲へ"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "リピートを切り替える"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "シャッフルを切り替える"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "ナビゲーション"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "アルバムに移動する"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "アーティストに移動する"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "曲に移動する"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "プレイリストに移動する"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "戻る"
+
+#: data/ui/InitialState.ui:25
+msgid "The contents of your Music Folder will appear here"
+msgstr "ミュージックフォルダーの内容がここに表示されます"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm は、あなたの鑑賞した音楽の傾向からお勧めの音楽を探し出して提示してく"
+"れる、音楽ディスカバリーサービスです。"
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "音楽の報告をセットアップしていません"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"鑑賞した音楽を報告するために Last.fm のアカウントへログインしてください。"
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "ログイン"
+
+#: data/ui/PlayerToolbar.ui:75
+msgid "Previous"
+msgstr "前"
+
+#: data/ui/PlayerToolbar.ui:107
+msgid "Next"
+msgstr "次"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "削除(_D)"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "名前を変更(_R)…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "プレイリスト名"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "完了(_D)"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "プレイリスト名を入力してください"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "作成(_R)"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "新しいプレイリスト…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "追加"
+
+#: data/ui/PlaylistDialog.ui:200
+msgid "Add to Playlist"
+msgstr "プレイリストに追加"
+
+#: data/ui/PlaylistDialog.ui:220
+msgid "_Add"
+msgstr "追加(_A)"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "アーティスト"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "すべて表示"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:54
+msgid "Albums"
+msgstr "アルバム"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "曲"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "すべて選択"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "選択なし"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "アイテムをクリックして選択"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "プレイリストに追加(_A)"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "プレイリストから削除(_R)"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "最も再生した曲"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "未再生の曲"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "最近再生した曲"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "最近追加した曲"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "お気に入りの曲"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "ファイルを再生できません"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "{} で検索(_F)"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " と "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "ファイルの再生には {} が必要ですが、インストールされていません。"
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "再生中"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "シャッフル"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "1曲リピート"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "すべてリピート"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr "シャッフル/リピートオフ"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "プレイリスト {} を削除しました"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "元に戻す"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} を {} から削除しました"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "不明なアルバム"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "不明なアーティスト"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "XDG の Music ディレクトリを設定していません。"
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "ミュージックフォルダー"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "{}の内容がここに表示されます。"
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "曲が見つかりませんでした"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "他のキーワードを試してください"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME ミュージックが Tracker に接続できませんでした。"
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Tracker を実行していないと音楽ファイルはインデックスされません。"
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Tracker のバージョンが古すぎます。"
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Tracker のバージョン 3.0.0 以降が必要です。"
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "プレイリスト"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "アーティストの検索結果"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "アルバムの検索結果"
+
+#: gnomemusic/widgets/albumwidget.py:240
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} 分"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "ディスク {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} 曲選択"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "鑑賞した音楽が Last.fm に報告されます。"
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "鑑賞した音楽が Last.fm に報告されません。"
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "{} でログイン"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "設定"
+
+#: gnomemusic/widgets/playertoolbar.py:165
+msgid "Pause"
+msgstr "一時停止"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} 曲"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME ミュージック"
+
+#~ msgid "Window position"
+#~ msgstr "ウィンドウの位置"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "ウィンドウの位置 (X 軸と Y 軸) です。"
+
+#~ msgid "Released"
+#~ msgstr "リリース日"
+
+#~ msgid "Running Length"
+#~ msgstr "再生時間"
+
+#~ msgid "Composer"
+#~ msgstr "作曲者"
+
+#~ msgid "Loading"
+#~ msgstr "読み込み中"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "再生"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "再生中の曲の通知を有効にするかどうかの設定です。"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "アーティストビューに表示するトラック名の最大文字数"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "アーティストビューに表示されるトラック名の文字数を設定します。設定値を超え"
+#~ "るとトラック名が省略されます。無効にするには -1 を設定します"
+
+#~ msgid "Untitled"
+#~ msgstr "タイトルなし"
+
+#~ msgid "Not playing"
+#~ msgstr "再生していません"
+
+#~ msgid "Track Title"
+#~ msgstr "トラック名"
+
+#~ msgid "Match"
+#~ msgstr "一致項目"
+
+#~ msgid "All Artists"
+#~ msgstr "すべてのアーティスト"
+
+#~ msgid "Load More"
+#~ msgstr "さらに読み込む"
diff --git a/po/ka.po b/po/ka.po
new file mode 100644
index 00000000..f2a78c82
--- /dev/null
+++ b/po/ka.po
@@ -0,0 +1,576 @@
+# Georgian translation for gnome-music.
+# Copyright (C) 2023 gnome-music's authors
+# This file is distributed under the same license as the gnome-music package.
+# Ekaterine Papava <papava.e@gtu.ge>, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-17 21:26+0200\n"
+"Last-Translator: Ekaterine Papava <papava.e@gtu.ge>\n"
+"Language-Team: Georgian <(nothing)>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "მუსიკა"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "მუსიკის თქვენი კოლექციის დაკვრა და დალაგება"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "ადვილი და სასიამოვნო გზა მუსიკის დასაკრავად."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"იპოვეთ მუსიკა თქვენს ლოკალურ კოლექციაში და გამოიყენეთ ავტომატურად შექმნილი "
+"დასაკრავი სიები. ან შექმენით საკუთარი."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "GNOME Music-ის პროგრამისტები"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "მედია დამკვრელი"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "ფანჯრის ზომა"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "ფანჯრის ზომა (სიგანე, სიმაღლე)"
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "გადიდებული ფანჯარა"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "ფანჯრის სრულად გაშლილი მდგომარეობა."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "დაკვრის გამეორების რეჟიმი"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"მნიშვნელობა განსაზღვრავს, კოლექციაში დაკვრა შემთხვევითი წესით მოხდება, თუ "
+"განმეორებითი. დასაშვები მნიშვნელობებია: \"none\" (შემთხვევითობა და "
+"განმეორებადობა გამორთულია), \"song\" (მიმდინარე სიმღერის გამეორება), "
+"\"all\" (კოლექციის გამეორება, შემთხვევითობის გარეშე), \"shuffle\" (სიმღერის "
+"შემთხვევით არჩევა. ყველას დაკვრა ისედაც იგულისხმება)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "ReplayGain-ის ჩართვა"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "ალბომებისთვის ReplayGain-ის ჩართვა/გამორთვა"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "სისტემის დაძინების გათიშვა"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "მუსიკის დაკვრის მიმდინარეობისას სისტემის დაძინების აკრძალვა"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "გადაეცით მოსმენილი მუსიკა Last.fm-ზე"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"მიმდინარე სიმღერის შესახებ ინფორმაციის Last.fm-ზე გაგზავნის ჩართვა/გამორთვა."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "დაკვრა"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_დაკვრა"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "საყვარელი _სიმღერებში ჩამატება"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_დასაკრავი სიაში დამატება…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm-ის ანგარიში"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "გადაეცით მოსმენილი მუსიკა"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "კლავიატურის მალსახმობები"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_დახმარება"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "Music-ის შესახებ"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "მოგესალმებით Music-ში"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "მენიუ"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "მონიშნეთ"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_გაუქმება"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "ძებნა"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "უკან"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "მთავარი"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "ფანჯრის დახურვა"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "ძებნა"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "დახმარება"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "მალსახმობები"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "დაკვრა"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "დაკვრა/პაუზა"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "შემდეგი სიმღერა"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "წინა სიმღერა"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "გამეორების გადართვა"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "შემთხვევითობის გადართვა"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "ნავიგაცია"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "ალბომებზე გადასვლა"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "შემსრულებლებზე გადასვლა"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "სიმღერებზე გადართვა"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "დასაკრავ სიებზე გადართვა"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "უკან გადასვლა"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm არის მუსიკალური სერვისი, რომელიც გაძლევთ პერსონალურ რეკომენდაციებს "
+"თქვენს მიერ მოსმენილი მუსიკის საფუძველზე."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "დაკრული მუსიკის გადაცემა მორგებული არაა"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "შედით Last.fm-ის თქვენს ანგარიშში დაკრული სიმღერების სიის გადასაცემად."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "შესვლა"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "წინა"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "შემდეგი"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_წაშლა"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_გადარქმევა…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "დასაკრავი სიის სახელი"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_დასრულებულია"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "შეიყვანეთ თქვენი პირველი დასაკრავი სიის სახელი"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_შექმნა"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "ახალი დასაკრავი სია…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "დამატება"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "დასაკრავი სიაში დამატება"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_დამატება"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "შემსრულებლები"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "ყველას ნახვა"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "ალბომები"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "სიმღერები"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "ყველას მონიშვნა"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "მონიშვნის მოხსნა"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "მოსანიშნად დააწკაპუნეთ ელემენტებზე"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_დასაკრავი სიაში დამატება"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_დასაკრავი სიიდან წაშლა"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "პროექტი \"GNOME\""
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "თემური დოღონაძე"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "GNOME Music-ის პროგრამისტები, ყველა უფლება დაცულია"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "თარგმნა"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "ხშირად დაკრული"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "არასდროს-დაკრული"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "ახლახანს დაკრული"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "ახლახანს დამატებული"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "საყვარელი სიმღერები"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "ფაილის დაკვრის შეცდომა"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "{}-ში _მოძებნა"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " და "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "ფაილის დასაკრავად საჭიროა {}, მაგრამ დაყენებული არაა."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "მიმდინარეობს დაკვრა"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "შემთხვევითი/გამეორება გამორთულია"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "სიმღერის გამეორება"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "ყველას გამეორება"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "შემთხვევით"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "დასაკრავი სია წაიშალა: {}"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "დაბრუნება"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} წაიშალა {}-დან"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "უცნობი ალბომი"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "უცნობი შემსრულებელი"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "XDG Music-ის საქაღალდე მითითებული არაა."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "მუსიკის საქაღალდე"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "თქვენი {}-ის შემცველობა აქ გამოჩნდება."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "მუსიკა ნაპოვნი არაა"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "სცადეთ სხვა ძებნა"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Music-ი ტრეკერს ვერ მიუერთდა."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "მუსიკის ფაილების ინდექსაცია გაშვებული ტრეკერის გარეშე შეუძლებელია."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "როგორც ჩანს თქვენი სისტემური ტრეკერი მოძველებულია."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Music-ს ტრეკერის 3.0.0 ან უფრო ახალი ვერსია სჭირდება."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "დასაკრავი სიები"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "ნაპოვნი შემსრულებლები"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "ნაპოვნი ალბომები"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} წუთი"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "დისკი {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "არჩეულია {} სიმღერა"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "თქვენი მოსმენილი სიმღერების სახელები იგზავნება Last.fm-ზე."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "თქვენი მოსმენილი სიმღერების სახელები არ იგზავნება Last.fm-ზე."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "შესული ბრძანდებით, როგორც {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "მორგება"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "შეჩერება"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} სიმღერა"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "მოძებნეთ სიმღერები, შემსრულებლები, ალბომები და დასაკრავი სიები"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "მუსიკის დაკვრისა და მართვის აპლიკაცია GNOME-სთვის."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "GNOME Music-ის ვებ-გვერდზე გადასვლა"
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "მუსიკის თქვენი საქაღალდის შემცველობა აქ გამოჩნდება"
diff --git a/po/kk.po b/po/kk.po
new file mode 100644
index 00000000..15dd75aa
--- /dev/null
+++ b/po/kk.po
@@ -0,0 +1,766 @@
+# Kazakh translation for gnome-music.
+# Copyright (C) 2014 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2014-2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-19 12:51+0600\n"
+"Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n"
+"Language-Team: Kazakh <kk_KZ@googlegroups.com>\n"
+"Language: kk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Музыка"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Музыкалық жинағыңызды ойнау және реттеу"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Музыканы ойнатудың оңай әрі жағымды жолы."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Жергілікті жинақтағы тректерді тауып, автоматты түрде жасалған ойнату "
+"тізімдерін пайдаланыңыз немесе жаңасын жасаңыз."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "GNOME музыкасы әзірлеушілері"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Музыка ойнатқышы"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;Музыка;Плеер;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Терезе өлшемі"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Терезе өлшемі (ені мен биіктігі)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Терезе максималды етілген"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Терезенің максималды күйі."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Ойнату қайталау режимі"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Бұл мән ойнату кезінде жинақ ішінде қайталау және араластыру режимдерін "
+"көрсетеді. Рұқсат етілген мәндері: \"none\" (қайталау және араластыру жоқ), "
+"\"song\" (ағымдағы өлеңді қайталау), \"all\" (ойнату тізімін қайталау, "
+"араластыру жоқ), \"shuffle\" (ойнату тізімін араластырып қолдану, барлығын "
+"қайталауды білдіреді)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "ReplayGain іске қосу"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Альбомдар үшін ReplayGain іске қосу не сөндіру"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Жүйелік ұйықтатуды болдырмау"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Музыканы ойнату кезінде жүйелік ұйықтату режиміне өтуді іске қосады немесе "
+"сөндіреді"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Музыка тарихын Last.fm қызметіне хабарлау"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Тыңдау тарихын және \"ағымдағы ойналуда\" ақпаратын Last.fm қызметіне "
+"жіберуді іске қосады немесе сөндіреді."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Ойнату"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "Ой_нату"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "_Таңдамалы өлеңдерге қосу"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "Ойнату тізіміне қ_осу…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm тіркелгісі"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Музыканы тыңдауды хабарлау"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "П_ернетақта жарлықтары"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Көмек"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "Музыка қолданбасы тур_алы"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Музыкаға қош келдіңіз"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Мәзір"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Таңдау"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "Ба_с тарту"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Іздеу"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Кері"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Жалпы"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Терезені жабу"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Іздеу"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Көмек"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Жарлықтар"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Ойнату"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Аялдату"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Келесі өлең"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Алдыңғы өлең"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Қайталауды іске қосу/сөндіру"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Араластыруды іске қосу/сөндіру"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Навигация"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Альбомдарға өту"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Әртістерге өту"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Өлеңдерге өту"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Ойнату тізімдеріне өту"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Артқа өту"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm – сіз тыңдаған музыкаға негізделген жеке ұсыныстар беретін музыканы "
+"табу қызметі."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Музыканы тыңдауды хабарлау бапталмаған"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Музыка тыңдау туралы хабарлау үшін Last.fm тіркелгісіне кіріңіз."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Кіру"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Алдыңғы"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Келесі"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "Ө_шіру"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "Атын ө_згерту…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Ойнату тізімінің аты"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Дайын"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Бірінші ойнату тізіміңіздің атын енгізіңіз"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Жасау"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Жаңа ойнату тізімі…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Қосу"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Ойнату тізіміне қосу"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "Қо_су"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Әртістер"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Барлығын қарау"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Альбомдар"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Өлеңдер"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Барлығын таңдау"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Ештеңе таңдамау"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Бірнәрсені таңдау үшін оның үстіне шертіңіз"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "Ойнату тізіміне қ_осу"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Ойнату тізімінен өші_ру"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "GNOME жобасы"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Baurzhan Muftakhidinov <baurthefirst@gmail.com>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright © GNOME музыкасы әзірлеушілері"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Аударған"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Ең жиі ойнатылған"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Ешқашан ойналмаған"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Жақында ойналған"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Жақында қосылған"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Таңдамалы өлеңдер"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Файлды ойнату мүмкін емес"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "{} ішінен _табу"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " және "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "файлды ойнату үшін {} керек, бірақ, ол орнатылмаған."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Музыканы ойнату"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Араластыру/қайталау сөндірілген"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Тректі қайталау"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Барлығын қайталау"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Араластыру"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "{} ойнату тізімі өшірілген"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Болдырмау"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} {} ішінен өшірілді"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Белгісіз альбом"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Белгісіз әртіс"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Сіздің XDG музыкалық бумаңыз орнатылмаған."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Музыка бумасы"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "{} құрамасы осында көрсетіледі."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Музыка табылмады"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Басқа сөздерді іздеп көріңіз"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME музыка қолданбасы Трекерге байланыса алмады."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Сіздің музыка файлдарыңызды Трекер орындалып тұрмаса индекстеу мүмкін емес."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Жүйелік Tracker нұсқасы ескірген сияқты."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Музыка қолданбасы Tracker 3.0.0 немесе жоғарылау нұсқасын талап етеді."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Ойнату тізімдері"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Әртістер нәтижелері"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Альбомдар нәтижелері"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} минут"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Диск {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} өлең таңдалды"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Сіздің музыканы тыңдау тарихыңыз Last.fm қызметіне хабарланады."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Сіздің музыканы тыңдау тарихыңыз Last.fm қызметіне хабарланбайды."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "{} ретінде кірген"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Баптау"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Аялдату"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} өлең"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Өлеңдер, әртістер, альбомдар және ойнату тізімдерден іздеу"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Музыканы ойнау және басқаруға арналған GNOME қолданбасы."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "GNOME музыкасы веб сайтын шолу"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME музыкасы еркін бағдарлама; сіз оны Free Software Foundation "
+#~ "шығарған GNU General Public License аясында еркін тарата не/және өзгерте "
+#~ "аласыз; лицензия нұсқасы 2 не (тандауыңызша) кез-келген кейін шыққан.\n"
+#~ "\n"
+#~ "GNOME музыкасы пайдалы болады деген сеніммен таратылады, бірақ ЕШҚАНДАЙ "
+#~ "КЕПІЛДЕМЕ берілмейді; КОММЕРЦИЯЛЫҚ ҚҰНДЫЛЫҚ немесе белгілі бір "
+#~ "МАҚСАТТАРҒА СӘЙКЕС КЕЛЕТІНІ үшін де. Көбірек білу үшін GNU General "
+#~ "Public License қараңыз.\n"
+#~ "\n"
+#~ "Сіз осы GNOME музыкасы бағдарламасымен бірге GNU General Public License "
+#~ "көшірмесін алуыңыз керек еді; олай болмаса, Free Software Foundation, "
+#~ "Inc. ұйымына, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA "
+#~ "адресі бойынша хабарласыңыз.\n"
+#~ "\n"
+#~ "GNOME музыкасы авторлары GPL үйлесімсіз GStreamer плагиндерін GStreamer "
+#~ "және GNOME музыкасы қолданбасымен бірге қолданылып, таратылу құқығын "
+#~ "рұқсат етеді. Бұл рұқсат GNOME музыкасы өзінің GPL лицензиясынан басымды "
+#~ "болады. Егер сіз бұл кодты түрлендіретін болсаңыз, осы рұқсатты кодтың өз "
+#~ "бөлігіңізге де іске асыра аласыз, бірақ бұл міндетті емес. Егер сіз оны "
+#~ "жасамауды таңдасаңыз, лицензияның бұл ерекше бөлігін өз нұсқаңыздан алып "
+#~ "тастаңыз."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Музыка бумаңыздың құрамасы осында көрсетіледі"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME музыкасы"
+
+#~ msgid "Window position"
+#~ msgstr "Терезе орны"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Терезе орны (x және y)."
+
+#~ msgid "Loading"
+#~ msgstr "Жүктелуде"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Ойнату тізіміне қосу…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Музыкаңызды ойнатудың оңай жолы. Компьютеріңізде, жергілікті желіде және "
+#~ "интернет қызметтерінде музыканы автоматты түрде табуға болады."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Жергілікті жинақтан тректерді тауып, музыканы DLNA серверлерден алыңыз "
+#~ "немесе Jamendo мен Magnatune қызметтері арқылы бірнәрсе жаңаны қолданып "
+#~ "көріңіз."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Бастапқы қалып-күйі көрсетілген"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Бастапқы қалып-күйі көрсетілген кезде true болады"
+
+#~ msgid "Released"
+#~ msgstr "Шығарылған"
+
+#~ msgid "Running Length"
+#~ msgstr "Ұзақтығы"
+
+#~ msgid "Composer"
+#~ msgstr "Композитор"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Ойнату"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Сәлем DJ"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "Атаусыз"
+
+#~ msgid "All"
+#~ msgstr "Барлығы"
+
+#~ msgid "Artist"
+#~ msgstr "Әртіс"
+
+#~ msgid "Album"
+#~ msgstr "Альбом"
+
+#~ msgid "Track Title"
+#~ msgstr "Трек аты"
+
+#~ msgid "Local"
+#~ msgstr "Жергілікті"
+
+#~ msgid "Sources"
+#~ msgstr "Қайнар көздер"
+
+#~ msgid "Match"
+#~ msgstr "Сәйкес"
+
+#~ msgid "_Quit"
+#~ msgstr "_Шығу"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "GNOME музыкасы - бұл музыканы ойнайтын жаңа қолданба."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "Іздеу режимі"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Ақиқат болса, іздеу панелі көрсетіледі."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Хабарламалар режимі"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Ойнату хабарламаларын іске қосу не сөндіру"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "%d нәрсе таңдалды"
+
+#~ msgid "%d min"
+#~ msgstr "%d мин"
+
+#~ msgid "Empty"
+#~ msgstr "Бос"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Ойнату тізімін таңдау"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "Әртіс көрінісінде трек атында көрсетілетін таңбалар саны"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Бұл баптау әртіс көрінісінде трек атында қысқартылғанша дейін "
+#~ "көрсетілетін таңбалар санын анықтайды. Сөндіру үшін -1 етіп орнатыңыз"
+
+#~ msgid "the a an"
+#~ msgstr "the a an"
+
+#~ msgid "All Artists"
+#~ msgstr "Барлық әртістер"
+
+#~ msgid "Not playing"
+#~ msgstr "Ойнап тұрған жоқ"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "%s әртісі, %s альбомынан"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Жаңа ойнату тізімі"
diff --git a/po/kn.po b/po/kn.po
new file mode 100644
index 00000000..d42e1d29
--- /dev/null
+++ b/po/kn.po
@@ -0,0 +1,293 @@
+# Kannada translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# karthik339 <karthik339@gmail.com>, 2013
+# Shankar Prasad <prasad.mvs@gmail.com>, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2013-09-18 02:30+0000\n"
+"PO-Revision-Date: 2013-09-18 19:27+0530\n"
+"Last-Translator: Shankar Prasad <svenkate@redhat.com>\n"
+"Language-Team: Kannada <kn@li.org>\n"
+"Language: kn\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "ಕಿಟಕಿಯ ಗಾತ್ರ"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "ಕಿಟಕಿಯ ಗಾತ್ರ (ಅಗಲ ಹಾಗು ಎತ್ತರ)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "ಕಿಟಕಿಯ ಸ್ಥಾನ"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "ಕಿಟಕಿಯ ಸ್ಥಾನ (x ಮತ್ತು y)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "ಕಿಟಕಿಯನ್ನು ಗರಿಷ್ಟಗೊಳಿಸಲಾಗಿದ"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "ಕಿಟಕಿಯ ಗರಿಷ್ಟಗೊಳಿಸಿದ ಸ್ಥಿತಿ."
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "ಸಂಗೀತ ಪುನಃ ಚಲಾಯಿಸುವ ಸ್ಥಿತಿ"
+
+#: ../data/org.gnome.Music.gschema.xml.h:8
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: \"none\", \"song\", \"all\", \"shuffle\"."
+msgstr ""
+"ಸಂಗ್ರಹದ ಮೂಲಕ ಪ್ಲೇಬ್ಯಾಕ್ ಅನ್ನು ಪುನರಾವರ್ತಿಸಬೇಕೆ ಅಥವ ಮನಸ್ಸಿಗೆ ಬಂದಂತೆ ಚಲಾಯಿಸಬೇಕೆ "
+"ಎನ್ನುವುದನ್ನು ಈ ಮೌಲ್ಯವು ಸೂಚಿಸುತ್ತದೆ. ಅನುಮತಿ ಇರುವ ಮೌಲ್ಯಗಳೆಂದರೆ: \"none\", "
+"\"song\", \"all\", \"shuffle\"."
+
+#: ../data/org.gnome.Music.gschema.xml.h:9
+msgid "Search mode"
+msgstr "ಹುಡುಕು ಸ್ಥಿತಿ"
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "If true, the search bar is shown."
+msgstr "ಟ್ರು ಆಗಿದ್ದಲ್ಲಿ, ಹುಡುಕುಪಟ್ಟಿಯನ್ನು ತೋರಿಸಲಾಗುತ್ತದೆ."
+
+#: ../data/gnome-music.desktop.in.h:1 ../gnomemusic/application.py:46
+#: ../gnomemusic/application.py:102 ../gnomemusic/window.py:54
+#: ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "ಸಂಗೀತ "
+
+#: ../data/gnome-music.desktop.in.h:2
+msgid "Music Player"
+msgstr "ಸಂಗೀತ ಚಾಲಕ"
+
+#: ../data/gnome-music.desktop.in.h:3 ../data/gnome-music.appdata.xml.in.h:2
+msgid "Play and organize your music collection"
+msgstr "ನಿಮ್ಮ ಸಂಗ್ರಹದಿಂದ ಸಂಗೀತವನ್ನು ಆಲಿಸಿ ಮತ್ತು ವ್ಯವಸ್ಥಿವಾಗಿರಿಸಿಕೊಳ್ಳಿ"
+
+#: ../data/gnome-music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "GNOME ಮ್ಯೂಸಿಕ್"
+
+#: ../data/gnome-music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "ಮ್ಯೂಸಿಕ್ ಎನ್ನುವುದು GNOMEನ ಹೊಸ ಸಂಗೀತ ಚಾಲನಾ ಅನ್ವಯ"
+
+#: ../gnomemusic/albumArtCache.py:235
+msgid "Untitled"
+msgstr "ಹೆಸರಿಲ್ಲದ"
+
+#: ../gnomemusic/notification.py:70
+msgid "Not playing"
+msgstr "ಚಾಲನೆಯಲ್ಲಿಲ್ಲ"
+
+#: ../gnomemusic/notification.py:77 ../gnomemusic/player.py:349
+#: ../gnomemusic/view.py:228 ../gnomemusic/view.py:373
+#: ../gnomemusic/view.py:587
+msgid "Unknown Artist"
+msgstr "ಗೊತ್ತಿರದ ಕಲಾವಿದ"
+
+#: ../gnomemusic/notification.py:79 ../gnomemusic/view.py:471
+msgid "Unknown Album"
+msgstr "ಗೊತ್ತಿರದ ಆಲ್ಬಮ್"
+
+#. TRANSLATORS: by refers to the artist, from to the album
+#: ../gnomemusic/notification.py:83
+#, python-format
+msgid "by %s, from %s"
+msgstr "%s ರವರ, %s ಇಂದ"
+
+#: ../gnomemusic/notification.py:130
+msgid "Previous"
+msgstr "ಹಿಂದಿನ"
+
+#: ../gnomemusic/notification.py:133
+msgid "Pause"
+msgstr "ವಿರಮಿಸು"
+
+#: ../gnomemusic/notification.py:136
+msgid "Play"
+msgstr "ಚಾಲನೆ ಮಾಡು"
+
+#: ../gnomemusic/notification.py:138
+msgid "Next"
+msgstr "ಮುಂದಿನ"
+
+#: ../gnomemusic/view.py:290
+#, python-format
+msgid ""
+"No Music found!\n"
+" Put some files into the folder %s"
+msgstr ""
+"ಯಾವುದೆ ಸಂಗೀತ ಕಂಡುಬಂದಿಲ್ಲ!\n"
+" %s ಕಡತಕೋಶದಲ್ಲಿ ಕೆಲವು ಕಡತಗಳನ್ನು ಇರಿಸಿ"
+
+#: ../gnomemusic/view.py:297
+msgid "Albums"
+msgstr "ಆಲ್ಬಮ್‌ಗಳು"
+
+#: ../gnomemusic/view.py:329
+msgid "Songs"
+msgstr "ಹಾಡುಗಳು"
+
+#: ../gnomemusic/view.py:480
+msgid "Playlists"
+msgstr "ಸಂಗೀತಪಟ್ಟಿ"
+
+#: ../gnomemusic/view.py:486
+msgid "Artists"
+msgstr "ಕಲಾವಿದರು"
+
+#: ../gnomemusic/view.py:522 ../gnomemusic/view.py:524
+#: ../gnomemusic/widgets.py:443
+msgid "All Artists"
+msgstr "ಎಲ್ಲಾ ಕಲಾವಿದರು"
+
+#: ../gnomemusic/widgets.py:73 ../gnomemusic/widgets.py:93
+msgid "Load More"
+msgstr "ಇನ್ನಷ್ಟು ಸೇರಿಸು"
+
+#: ../gnomemusic/widgets.py:83
+msgid "Loading..."
+msgstr "ಲೋಡ್ ಆಗುತ್ತಿದೆ..."
+
+#: ../gnomemusic/window.py:138
+msgid "Empty"
+msgstr "ಖಾಲಿ"
+
+#: ../data/AboutDialog.ui.in.h:2
+msgid "Copyright © 2013 GNOME Music Developers"
+msgstr "ಹಕ್ಕು © 2013 GNOME ಮ್ಯೂಸಿಕ್ ವಿಕಸನಗಾರರು"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "GNOME ಗಾಗಿನ ಒಂದು ಸಂಗೀತ ಚಾಲಕ ಮತ್ತು ವ್ಯವಸ್ಥಾಪನಾ ಅನ್ವಯವಾಗಿದೆ."
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "GNOME ಮ್ಯೂಸಿಕ್ ಜಾಲತಾಣಕ್ಕೆ ಭೇಟಿಕೊಡಿ"
+
+#: ../data/AboutDialog.ui.in.h:5
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "ಬಿಡುಗಡೆಯಾಗಿರುವುದು"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "ಚಾಲನಾ ಸಮಯ"
+
+#: ../data/app-menu.ui.h:1
+msgid "_New Playlist"
+msgstr "ಹೊಸ ಸಂಗೀತಪಟ್ಟಿ (_N)"
+
+#: ../data/app-menu.ui.h:2
+msgid "_Now Playing"
+msgstr "ಈಗ ಚಲಾಯಿಸುತ್ತಿರುವುದು (_N)"
+
+#: ../data/app-menu.ui.h:3
+msgid "_About Music"
+msgstr "ಸಂಗೀತದ ಬಗೆಗೆ (_A)"
+
+#: ../data/app-menu.ui.h:4
+msgid "_Quit"
+msgstr "ನಿರ್ಗಮಿಸು (_Q)"
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "ಶಫಲ್"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "ಎಲ್ಲಾ ಮರಳಿ ಚಲಾಯಿಸು"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "ಹಾಡನ್ನು ಪುನಃ ಚಲಾಯಿಸು"
+
+#: ../data/PlayerToolbar.ui.h:4
+msgid "Shuffle/Repeat Off"
+msgstr "ಶಫಲ್/ಪುನರಾವರ್ತನೆ ಆಫ್"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No Music Found"
+msgstr "ಯಾವುದೆ ಸಂಗೀತ ಕಂಡುಬಂದಿಲ್ಲ"
+
+#: ../data/headerbar.ui.in.h:1
+msgid "Select All"
+msgstr "ಎಲ್ಲಾ ಆರಿಸು"
+
+#: ../data/headerbar.ui.in.h:2
+msgid "Select None"
+msgstr "ಏನನ್ನೂ ಆರಿಸಬೇಡ"
+
+#: ../data/headerbar.ui.in.h:3
+msgid "Click on items to select them"
+msgstr "ಅಂಶಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಅವುಗಳನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ"
+
+#: ../data/headerbar.ui.in.h:4
+msgid "Cancel"
+msgstr "ರದ್ದುಗೊಳಿಸು"
+
+#: ../data/SelectionToolbar.ui.h:1
+msgid "Add to Playlist"
+msgstr "ಸಂಗೀತಪಟ್ಟಿಗೆ ಸೇರಿಸು"
+
+
diff --git a/po/ko.po b/po/ko.po
new file mode 100644
index 00000000..63fcc355
--- /dev/null
+++ b/po/ko.po
@@ -0,0 +1,755 @@
+# Korean translation for gnome-music.
+# Copyright (C) 2013 gnome-music's authors and many contributors.
+# This file is distributed under the same license as the gnome-music package.
+# Seong-ho Cho <shcho@gnome.org>, 2013-2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-27 02:04+0900\n"
+"Last-Translator: Seong-ho Cho <darkcircle.0426@gmail.com>\n"
+"Language-Team: Korean <gnome-kr@googlegroups.com>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 2.3.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "음악"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "음악 모음을 재생하고 정리합니다"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "음악을 들을 수 있는 쉽고 즐거운 수단."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"로컬 모음집에서 트랙을 찾거나 자동으로 미리 만든 재생 목록을 활용하거나 새 목"
+"록을 구성합니다."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "The GNOME Music developers"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "음악 재생기"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;음악;Player;재생기;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "창 크기"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "창 크기(너비 및 높이)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "창 최대화"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "창 최대화 상태."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "재생 반복 모드"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"모아놓은 음악을 반복 재생할지 무작위로 재생할지 나타내는 값입니다. 사용할 수 "
+"있는 값은 “none”(반복 및 임의 재생 끔), “song”(현재 노래 반복), “all”(재생 목"
+"록 반복, 임의 재생 안함), “shuffle”(재생 목록 임의 재생, 모든 곡 반복으로 간"
+"주)입니다."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "리플레이 게인 활성화"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "앨범의 리플레이 게인을 켜거나 끕니다"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "시스템 대기 모드 진입 중단"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"음악을 재생하는 동안 시스템 대기모드 진입 중단 여부를 활성화하거나 비활성화합"
+"니다"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "last.fm에 음악 재생 기록 보고"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr "last.fm에 음악 취향과 “현재 재생 중” 정보 보내기를 켜거나 끕니다."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "재생"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "재생(_P)"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "즐겨찾는 곡 추가(_F)"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "재생 목록에 추가(_A)…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "last.fm 계정"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "감상 음악 보고"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "키보드 바로 가기 키(_K)"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "도움말(_H)"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "음악 정보(_A)"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "그놈 음악 사용을 환영합니다"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "메뉴"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "선택"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "취소(_C)"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "검색"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "뒤로"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "일반"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "창 닫기"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "검색"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "도움말"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "바로 가기 키"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "재생"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "재생/일시 정지"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "다음 곡"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "이전 곡"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "반복 재생 전환"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "임의 재생 모드 전환"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "탐색"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "앨범으로 이동"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "음악가로 이동"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "즐겨찾는 곡으로 이동"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "재생 목록으로 이동"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "뒤로"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"last.fm은 감상곡에 따라 개인화 추천 서비스를 제공하는 음악 검색 서비스입니다."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "음악 보고를 설정하지 않음"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "감상 음악을 보고하려면 last.fm 계정으로 로그인하십시오."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "로그인"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "이전"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "다음"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "삭제(_D)"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "이름 바꾸기(_R)…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "재생 목록 이름"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "완료(_D)"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "첫 재생 목록 이름을 입력하십시오"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "만들기(_R)"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "새 재생 목록…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "추가"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "재생 목록에 추가"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "추가(_A)"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "음악가"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "모두 보기"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "앨범"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "노래"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "모두 선택"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "선택 안함"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "선택할 항목을 누르십시오"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "재생 목록에 추가(_A)"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "재생 목록에서 제거(_R)"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "그놈 프로젝트"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "조성호 <shcho@gnome.org>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright The GNOME Music Developers"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "번역자"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "가장 많이 재생함"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "재생 안함"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "최근 재생함"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "최근 추가함"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "즐겨찾는 곡"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "파일을 재생할 수 없습니다"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "{}에서 찾기(_F)"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " 및 "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "파일을 재생하려면 {}이(가) 필요하지만 설치하지 않았습니다."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "음악 재생 중"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "뒤섞기/반복 끔"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "한 곡만 반복"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "모두 반복"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "뒤섞기"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "{} 재생 목록을 제거했습니다"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "실행 취소"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} 항목을 {}에서 제거했습니다"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "알 수 없는 앨범"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "알 수 없는 음악가"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "XDG 음악 디렉터리를 설정하지 않았습니다."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "음악 폴더"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "{} 내용은 여기에 나타납니다."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "음악이 없습니다"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "다른 단어/문장으로 검색해보십시오"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "그놈 음악을 트래커에 연결할 수 없습니다."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "트래커를 실행하지 않으면 음악 파일을 색인 처리할 수 없습니다."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "시스템에 설치한 트래커 버전이 오래됐습니다."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "그놈 음악에서는 버전 3.0.0 이상의 트래커가 필요합니다."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "재생 목록"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "음악가 결과"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "앨범 결과"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{}분"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "디스크 {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "음악 {}곡 선택함"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "감상 음악을 last.fm으로 보고합니다."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "감상 음악을 last.fm으로 보고하지 않습니다."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "{} 사용자로 로그인했습니다"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "설정"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "일시 정지"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "노래 {}곡"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "곡, 음악가, 앨범, 재생 목록을 검색합니다"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "그놈용 음악 재생기 및 관리 프로그램."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "그놈 음악 웹사이트를 방문하세요"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "그놈 음악은 자유 소프트웨어 입니다. 자유 소프트웨어 재단이 발표한 GNU 일"
+#~ "반 공중 사용허가서 라이선스 버전 2 또는(여러분의 취향에 따라) 그 이상의 조"
+#~ "항에 따라 재배포 또는 수정할 수 있습니다.\n"
+#~ "\n"
+#~ "그놈 음악을 여러분께서 쓸모 있게 사용하길 바라며 배포하지만, 그 어떤 보증"
+#~ "을 하지 않으며 심지어 상업성 또는 일부 목적의 적합성에 대한 암시적 보증도 "
+#~ "하지 않습니다. 자세한 내용은 GNU 일반 공중 사용허가서를 참조하십시오.\n"
+#~ "\n"
+#~ "그놈 음악과 함께 GNU 일반 공중 사용허가서의 사본을 받아야 합니다. 만약 받"
+#~ "지 못했다면 Free Software Foundation, Inc., 51 Franklin Street, Fifth "
+#~ "Floor, Boston, MA 02110-1301 USA로 요청하십시오.\n"
+#~ "\n"
+#~ "그놈 음악 제작자는 비 GPL 호환 지스트리머 플러그인에 대한 사용을 허가 받았"
+#~ "으며, 지스트리머와 그놈 음악을 함께 배포합니다. 이 권한은 그놈 음악에 대"
+#~ "해 효력을 미치는 GNU 일반 공중 사용허가서에 따라 허가받습니다. 이 코드를 "
+#~ "수정하면, 여러분 버전의 코드에 이 예외를 확장할 수 있겠지만, 의무적인 것"
+#~ "은 아닙니다. 원치 않는다면 여러분의 코드 버전에서 예외 조항을 삭제하십시"
+#~ "오."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "음악 폴더의 내용은 여기에 나타납니다"
+
+#~ msgid "GNOME Music"
+#~ msgstr "그놈 음악"
+
+#~ msgid "Window position"
+#~ msgstr "창 위치"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "창 위치(가로 및 세로)."
+
+#~ msgid "Loading"
+#~ msgstr "불러오는 중"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "재생 목록에 추가…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "음악을 재생하는 간편한 수단입니다. 여러분의 컴퓨터, 로컬 네트워크, 인터넷 "
+#~ "서비스 계정에서 음악을 자동으로 찾습니다."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "로컬 음악 모음에서 트랙을 찾거나, DLNA 서버에서 음악을 가져오거나, 쟈멘도"
+#~ "와 매그너튠 서비스에서 새 음악을 갖아보십시오."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "초기 화면을 표시함"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "초기 화면을 이미 표시했으면 참으로 설정합니다"
+
+#~ msgid "Released"
+#~ msgstr "발매일"
+
+#~ msgid "Running Length"
+#~ msgstr "재생 시간"
+
+#~ msgid "Composer"
+#~ msgstr "작곡가"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "재생"
+
+#~ msgid "Hey DJ"
+#~ msgstr "안녕 DJ~"
+
+#~ msgid "All"
+#~ msgstr "모두"
+
+#~ msgid "Artist"
+#~ msgstr "음악가"
+
+#~ msgid "Album"
+#~ msgstr "앨범"
+
+#~ msgid "Track Title"
+#~ msgstr "트랙 제목"
+
+#~ msgid "Local"
+#~ msgstr "로컬"
+
+#~ msgid "Sources"
+#~ msgstr "원본"
+
+#~ msgid "Match"
+#~ msgstr "일치"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "제목 없음"
+
+#~ msgid "_Quit"
+#~ msgstr "끝내기(_Q)"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "음악은 새로운 그놈 음악 재생 프로그램입니다."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "검색 모드"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "참이면, 검색 표시줄이 나타납니다."
+
+#~ msgid "Notifications mode"
+#~ msgstr "알림 모드"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "재생 알림을 켜거나 끕니다"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "항목 %d개 선택함"
+
+#~ msgid "%d min"
+#~ msgstr "%d분"
+
+#~ msgid "Empty"
+#~ msgstr "비어 있음"
+
+#~ msgid "Select Playlist"
+#~ msgstr "재생 목록 선택"
+
+# 한국어에는 the, a, an을 사용하는 문법이 없으므로 U+200B(zero-width space)를 입력합니다(invisible character,번역함). 손대지 마십시오.
+#~ msgid "the|a|an"
+#~ msgstr " ​"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "음악가 보기에서 트랙 이름을 표시할 때 최대 글자 수"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "이 설정은 음악가 보기 화면에서 트랙 제목 나머지 부분을 날리기 전에 허용할 "
+#~ "글자수를 조정합니다. -1 값을 설정하면 제한 글자수가 없어집니다"
+
+#~ msgid "the a an"
+#~ msgstr "the a an"
+
+#~ msgid "All Artists"
+#~ msgstr "모든 음악가"
+
+#~ msgid "Not playing"
+#~ msgstr "재생 중 아님"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "%s 음악가, %s 앨범"
diff --git a/po/lt.po b/po/lt.po
new file mode 100644
index 00000000..33ec9cc9
--- /dev/null
+++ b/po/lt.po
@@ -0,0 +1,786 @@
+# Lithuanian translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Aurimas Černius <aurisc4@gmail.com>, 2013-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-09-03 22:20+0300\n"
+"Last-Translator: Aurimas Černius <aurisc4@gmail.com>\n"
+"Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\n"
+"Language: lt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"(n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Muzika"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Groti ir tvarkyti muzikos kolekciją"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Lengvas ir malonus būdas klausytis muzikos."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Raskite takelius savo vietinėje kolekcijoje, naudokite automatiškai sukurtus "
+"grojaraščius arba kurkite naujus."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "GNOME Muzikos kūrėjai"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Muzikos grotuvas"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Muzika;Grotuvas;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Lango dydis"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Lango dydis (plotis ir aukštis)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Langas išdidintas"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Lango išdidinimo būsena."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Grojimo kartojimo veiksena"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Vertė nurodo, ar kartoti bei atsitiktine tvarka šokinėti per kolekciją. "
+"Galimos vertės yra: „none“ (kartojimas ir maišymas yra išjungti), "
+"„song“ (kartoti dabartinę dainą), „all“ (kartoti grojaraštį, nemaišyti), "
+"„shuffle“ (maišyti grojaraštį, kartoja viską)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Įjungti ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Įjungia arba išjungia ReplayGain albumams"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Neleisti užmigdyti sistemos"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "Įjungia arba išjungia sistemos užmigdymo draudimą, kol grojama muzika"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Pranešti muzikos istoriją Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Įjungia arba išjungia santraukų „šiuo metu grojama“ siuntimą į Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Groti"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Groti"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Pridėti prie _mėgiamų dainų"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Pridėti į grojaraštį…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm paskyra"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Pranešti klausomą muziką"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Klaviatūros trumpiniai"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Žinynas"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Apie muziką"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Sveiki pradėję naudoti Muziką"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Meniu"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Žymėti"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Atsisakyti"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Paieška"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Grįžti"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Bendra"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Užverti langą"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Paieška"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Žinynas"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Trumpiniai"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Grojimas"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Groti/Pristabdyti"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Kita daina"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Ankstesnė daina"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Perjungti kartojimą"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Perjungti maišymą"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Naršymas"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Pereiti į albumus"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Pereiti į atlikėjus"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Pereiti į dainas"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Pereiti į grojaraščius"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Grįžti"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm yra muzikos aptikimo tarnyba, kuri jums suteikia asmenines "
+"rekomendacijas pagal jūsų klausomą muziką."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Pranešimas apie muziką nenustatytas"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Prisijunkite prie savo Last.fm paskyros ir praneškite apie savo klausomą "
+"muziką."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Prisijungti"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Ankstesnė"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Kita"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Trinti"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "Pe_rvadinti…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Grojaraščio pavadinimas"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "A_tlikta"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Įveskite savo pirmojo grojaraščio pavadinimą"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "Suku_rti"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Naujas grojaraštis…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Pridėti"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Pridėti į grojaraštį"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Pridėti"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Atlikėjai"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Rodyti viską"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albumai"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Dainos"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Žymėti viską"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Nieko nežymėti"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Spauskite ant elementų jiems pažymėti"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Pridėti į grojaraštį"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Pašalinti iš grojaraščio"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "GNOME projektas"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"Išvertė:\n"
+"Aurimas Černius <aurisc4@gmail.com>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Autorių teisės priklauso GNOME Muzikos kūrėjams"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr ""
+"Išvertė:\n"
+"Aurimas Černius"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Dažniausiai grojama"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Niekada negrota"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Neseniai grota"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Neseniai pridėta"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Mėgiama daina"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Nepavyksta groti failo"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Rasti {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " ir "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "Failui pagroti reikalingas {}, bet jis neįdiegtas."
+msgstr[1] "Failui pagroti reikalingi {}, bet jie neįdiegti."
+msgstr[2] "Failui pagroti reikalingi {}, bet jie neįdiegti."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Grojama muzika"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Maišyti/nekartoti"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Kartoti dainą"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Kartoti visus"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Maišyti"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Grojaraštis {} pašalintas"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Atšaukti"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} pašalinta iš {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Nežinomas albumas"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Nežinomas atlikėjas"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Jūsų XDG muzikos katalogas nenustatytas."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Muzikos aplankas"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Čia matysite savo {} aplanko turinį."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Nerasta muzikos"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Bandykite kitą paiešką"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Muzikai nepavyko prisijungti prie Tracker sistemos."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Jūsų muzikos failų negalima indeksuoti be veikiančios Tracker sistemos."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Jūsų sistemos Tracker versija atrodo pasenusi."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Muzikai reikia Tracker versijos 3.0.0 arba naujesnės."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Grojaraščiai"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Atlikėjų rezultatai"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Albumų rezultatai"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minutė"
+msgstr[1] "{} minutės"
+msgstr[2] "{} minučių"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Diskas {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Pažymėta {} daina"
+msgstr[1] "Pažymėtos {} dainos"
+msgstr[2] "Pažymėta {} dainų"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Apie jūsų klausomą muziką bus pranešama Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Apie jūsų klausomą muziką nėra pranešama Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Prisijungta kaip {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Nustatyti"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pristabdyti"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} daina"
+msgstr[1] "{} dainos"
+msgstr[2] "{} dainų"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Ieškoti dainų, atlikėjų, albumų bei grojaraščių"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Muzikos grotuvas ir tvarkymo programa GNOME aplinkai."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Apsilankykite GNOME Muzikos tinklalapyje"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME Muzika yra laisva programinė įranga; galite ją platinti ir(arba) "
+#~ "keisti pagal GNU bendrosios viešosios licencijos (GPL) sąlygas, kaip jas "
+#~ "pateikia Free Software Foundation; licencijos versija 2 arba (jūsų "
+#~ "pasirinkta) bet kuri vėlesnė versija.\n"
+#~ "\n"
+#~ "GNOME Muzika yra platinama tikintis kad ji bus naudinga, bet BE JOKIŲ "
+#~ "GARANTIJŲ; netgi be numanomų PREKYBINIŲ ar TINKAMUMO KONKREČIAM TIKSLUI "
+#~ "garantijų. Daugiau informacijos rasite GNU bendrojoje viešojoje "
+#~ "licencijoje.\n"
+#~ "\n"
+#~ "Jūs turėjote gauti GNU bendrosios viešosios licencijos kopiją kartu su "
+#~ "GNOME Muzika; jei negavote, parašykite Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "GNOME Muzikos autoriai taip pat leidžia kartu su GNOME Muzika ir "
+#~ "GStreamer platinti ir naudoti su GStreamer suderinamus ne-GPL įskiepius. "
+#~ "Šis leidimas yra aukščiau ir plačiau GPL licencijos teikiamų leidimų, "
+#~ "kurie galioja GNOME Muzikai. Jei pakeisite šį kodą, galite šią išimtį "
+#~ "pritaikyti savo kodo versijai, bet neprivalote to daryti. Jei "
+#~ "nepageidaujate, ištrinkite šį punktą iš savo versijos."
+
+#~| msgid "The contents of your {} will appear here."
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Čia matysite savo muzikos aplanko turinį"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME muzika"
+
+#~ msgid "Window position"
+#~ msgstr "Lango padėtis"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Lango padėtis (x ir y)."
+
+#~ msgid "Loading"
+#~ msgstr "Įkeliama"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Pridėti į grojaraštį…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Paprastas būdas groti muziką. Automatiškai aptinka muziką jūsų "
+#~ "kompiuteryje, vietiniame tinkle bei internetinėse tarnybose."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Raskite takelius savo vietinėje kolekcijoje, gaukite muziką iš DLNA "
+#~ "serverių arba pabandykite ką nors naujo su Jamendo ir Magnatune "
+#~ "paslaugomis."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Pradinė būsena buvo parodyta"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Nustatyti teigiamai kai pradinė būsena buvo parodyta"
+
+#~ msgid "Released"
+#~ msgstr "Išleista"
+
+#~ msgid "Running Length"
+#~ msgstr "Grojimo trukmė"
+
+#~ msgid "Composer"
+#~ msgstr "Kompozitorius"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Groti"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Sveikas, DJ"
+
+#~ msgid "All"
+#~ msgstr "Visi"
+
+#~ msgid "Artist"
+#~ msgstr "Atlikėjai"
+
+#~ msgid "Album"
+#~ msgstr "Albumai"
+
+#~ msgid "Track Title"
+#~ msgstr "Takelio pavadinimas"
+
+#~ msgid "Local"
+#~ msgstr "Vietinis"
+
+#~ msgid "Sources"
+#~ msgstr "Šaltiniai"
+
+#~ msgid "Match"
+#~ msgstr "Atitikmuo"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "Nepavadinta"
+
+#~ msgid "_Quit"
+#~ msgstr "_Išeiti"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Muzika yra nauja GNOME muzikos grojimo programa."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "Paieškos veiksena"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Jei teigiama, paieškos juosta yra rodoma."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Pranešimų veiksena"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Įjungia arba išjungia grojimo pranešimus"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Pasirinktas %d elementas"
+#~ msgstr[1] "Pasirinkti %d elementai"
+#~ msgstr[2] "Pasirinkta %d elementų"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Empty"
+#~ msgstr "Tuščia"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Žymėti grojaraštį"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "Daugiausiai simbolių takelio pavadinimui atlikėjo vaizde"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Šis nustatymas keičia simbolių skaičių takelio pavadinime atlikėjo vaizde "
+#~ "iki jo trumpinimo. Išjungimui nustatykite į -1"
+
+#~ msgid "the a an"
+#~ msgstr "the"
+
+#~ msgid "All Artists"
+#~ msgstr "Visi atlikėjai"
+
+#~ msgid "Not playing"
+#~ msgstr "Negroja"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "atlieka %s iš albumo %s"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "Nerasta muzikos!\n"
+#~ " Įdėkite failų į aplanką %s"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Naujas grojaraštis"
diff --git a/po/lv.po b/po/lv.po
new file mode 100644
index 00000000..acbbcdbe
--- /dev/null
+++ b/po/lv.po
@@ -0,0 +1,744 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>, 2013, 2014, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-09-14 20:28+0300\n"
+"Last-Translator: Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>\n"
+"Language-Team: Latvian <lata-l10n@googlegroups.com>\n"
+"Language: lv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 :"
+" 2);\n"
+"X-Generator: Lokalize 22.12.3\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Mūzika"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Atskaņo un organizē savu mūzikas kolekciju"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Vienkāršs un patīkams veids, kā atskaņot savu mūziku."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Atrodi celiņus savā lokālajā kolekcijā, automātiski veido repertuārus vai "
+"izveido jaunus."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "GNOME Mūzikas izstrādātāji"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Mūzikas atskaņotājs"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Mūzika;Atskaņotājs;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Loga izmērs"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Loga izmērs (platums un augstums)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Logs maksimizēts"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Loga stāvoklis — maksimizēts."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Atskaņot atkārtošanās režīmā"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Vērtība nosaka, vai kolekciju atskaņot atkārtojot vai nejauši samaisot. "
+"Atļautās vērtības ir “none” (atkārtošana un samaisīšana ir izslēgta) , "
+"“song” (atkārtot atskaņoto dziesmu), “all” (atkārtot visu repertuāru, "
+"nemaisīt), “shuffle” (samaisīt repertuāru, arī atkārtot)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Ieslēgt ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Ieslēdz vai izslēdz ReplayGain albumiem"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Nomākt sistēmas iesnaušanu"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "Ieslēdz vai izslēdz sistēmas iesnaušanas nomākšanu, kad atskaņo mūziku"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Ziņot Last.fm par mūzikas vēsturi"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Ieslēdz vai izslēdz scrobbles un “palšaik atskaņo” informācijas sūtīšanu uz "
+"Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Atskaņot"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Atskaņot"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Pievienot _iecienītajām dziesmām"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Pievienot repertuāram…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm konts"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Ziņot par mūzikas klausīšanos"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Tastatūras īsinājumtaustiņi"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Palīdzība"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "P_ar mūziku"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Laipni lūdzam Mūzikā"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Izvēlne"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Izvēlēties"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "At_celt"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Meklēt"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Atpakaļ"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Vispārīgi"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Aizvērt logu"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Meklēt"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Palīdzība"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Saīsnes"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Atskaņošana"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Atskaņot / pauzēt"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Nākamā dziesma"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Iepriekšējā dziesma"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Pārslēgt atkārtošanu"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Pārslēgt sajaukšanu"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigācija"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Iet uz albumiem"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Iet uz izpildītājiem"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Iet uz dziesmām"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Iet uz repertuāriem"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Iet atpakaļ"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm ir mūzikas atklāšanas pakalpojums, kas jums dod personalizētus "
+"ieteikumus balstoties uz tā, kādu mūziku jūs klausāties."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Mūzikas ziņošana nav iestatīta"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Ierakstieties savā Last.fm kontā, lai ziņotu par savu mūzikas klausīšanos."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Ierakstīties"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Iepriekšējais"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Nākamais"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Dzēst"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "Pā_rdēvēt…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Repertuāra nosaukums"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Gatavs"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Ievadiet sava pirmā repertuāra nosaukumu"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "Iz_veidot"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Jauns repertuārs…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Pievienot"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Pievienot repertuāram"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Pievienot"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Izpildītāji"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Rādīt visu"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albumi"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Dziesmas"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Izvēlēties visu"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Iezīmēt neko"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Spiediet uz vienumiem, lai tos izvēlētos"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Pievienot repertuāram"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Izņemt no _repertuāra"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "GNOME projekts"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Autortiesības pieder GNOME Mūzikas izstrādātājiem"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Tulkojuši"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Visbiežāk atskaņotās"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Nekad neatskaņotās"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Nesen atskaņotās"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Nesen pievienotās"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Iecienītās dziesmas"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Neizdevās atskaņot datni"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Meklēt mapē {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " un "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "Lai atskaņotu datni, nepieciešams {}, bet tas nav uzinstalēts."
+msgstr[1] "Lai atskaņotu datni, nepieciešami {}, bet tie nav uzinstalēti."
+msgstr[2] "Lai atskaņotu datni, nepieciešami {}, bet tie nav uzinstalēti."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Atskaņo mūziku"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Izslēgt jaukšanu/atkārtošanu"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Atkārtot dziesmu"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Atkārtot visas"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Sajaukt"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Repertuāra {} ir izņemts"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Atsaukt"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} izņemts no {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Nezināms albums"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Nezināms izpildītājs"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Jūsu XDG mūzikas direktorija nav iestatīta."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Mūzikas mape"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Jūsu {} saturs parādīsies šeit"
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Nav atrasta mūzika"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Mēģiniet ar citu meklējamo vārdu"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Mūzika nevarēja savienoties ar Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Nevar indeksēt jūsu mūzikas datnes, ja nedarbojas Tracker."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Jūsu sistēmas Tracker versija ir novecojusi."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Mūzikai vajag Tracker vismaz versiju 3.0.0."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Repertuāri"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Izpildītāju rezultāti"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Albumu rezultāti"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minūte"
+msgstr[1] "{} minūtes"
+msgstr[2] "{} minūšu"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disks (}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Izvēlēta {} dziesma"
+msgstr[1] "Izvēlētas {} dziesmas"
+msgstr[2] "Izvēlētas {} dziesmas"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Jūsu mūzikas klausīšanās tiek ziņota uz Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Jūsu mūzikas klausīšanās netiek tiek ziņota uz Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Ierakstījies kā {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Konfigurēt"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pauzēt"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} dziesma"
+msgstr[1] "{} dziesmas"
+msgstr[2] "{} dziesmu"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Meklēt dziesmas, izpildītājus, albumus un repertuārus"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Mūzikas atskaņošanas un pārvaldības lietotne GNOME vidē."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Apmeklēt GNOME Mūzikas tīmekļa vietni"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME Mūzika ir brīvā programmatūra; jūs varat izplatīt un/vai modificēt "
+#~ "to saskaņā ar GNU Vispārējās Publiskās Licences 2. vai kādas vēlākas "
+#~ "versijas noteikumiem.\n"
+#~ "\n"
+#~ "GNOME Mūzika tiek izplatīts ar cerību, ka tas būs noderīgs. Tas tiek "
+#~ "izplatīts BEZ jebkādas garantijas vai iekļautas ražotāja atbildības par "
+#~ "šo produktu. Sīkāku informāciju meklējiet GNU Vispārējās Publiskās "
+#~ "Licences tekstā.\n"
+#~ "GNU Vispārējās Publiskās Licence ir pieejama kopā ar GNOME Mūzika "
+#~ "instalāciju. Ja tā jums nav pieejama, jūs to varat iegūt no Free Software "
+#~ "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 "
+#~ "USA.\n"
+#~ "\n"
+#~ "GNOME Mūzika autori dod tiesības ar GPL nesavietojamiem GStreamer "
+#~ "spraudņiem tik izplatītiem kopā ar GStreamer un GNOME Mūziku. Šīs "
+#~ "tiesības ir plašākas kā tās, ko sniedz GPL licence, ko izmanto GNOME "
+#~ "Mūzika. Ja vēlaties mainīt šo kodu, jūs varat šo izņēmumu attiecināt arī "
+#~ "uz savas programmas pirmkodu, bet jums nav pienākuma to darīt. Ja "
+#~ "nevēlaties iekļaut izņēmumu, izdzēsiet šo izņēmuma teikumu no savas "
+#~ "versijas."
+
+#~| msgid "The contents of your {} will appear here."
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Jūsu mūzikas mapes saturs parādīsies šeit"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME Mūzika"
+
+#~ msgid "Window position"
+#~ msgstr "Loga novietojums"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Loga novietojums (x un y)."
+
+#~ msgid "Loading"
+#~ msgstr "Ielādē"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Pievienot repertuāram…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Vienkāršs veids, kā atskaņot jūsu mūziku. Automātiski atklājiet mūziku uz "
+#~ "sava datora, lokālajā tīklā vai interneta pakalpojumos."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Atrodiet celiņus jūsu lokālajā kolekcijā, saņemiet mūziku no DLNA "
+#~ "serveriem vai no Jamendo un Magnatune pakalpojumiem."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Sākotnējais stāvoklis tika parādīts"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Iestatiet uz “patiess”, kad sākotnējais stāvoklis ir parādīts"
+
+#~ msgid "Released"
+#~ msgstr "Izlaists"
+
+#~ msgid "Running Length"
+#~ msgstr "Atskaņošanas ilgums"
+
+#~ msgid "Composer"
+#~ msgstr "Komponists"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Atskaņot"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Eu DJ"
+
+#~ msgid "All"
+#~ msgstr "Visi"
+
+#~ msgid "Artist"
+#~ msgstr "Izpildītājs"
+
+#~ msgid "Album"
+#~ msgstr "Albums"
+
+#~ msgid "Track Title"
+#~ msgstr "Celiņa nosaukums"
+
+#~ msgid "Local"
+#~ msgstr "Lokāls"
+
+#~ msgid "Sources"
+#~ msgstr "Avoti"
+
+#~ msgid "Match"
+#~ msgstr "Atbilst"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "Nenosaukts"
+
+#~ msgid "_Quit"
+#~ msgstr "I_ziet"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Mūzika ir jaunā GNOME mūzikas atskaņošanas lietotne."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "Meklēšanas režīms"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Ja patiess, tiks rādīta meklēšanas josla."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Paziņojumu režīms"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Ieslēdz vai izslēdz atskaņošanas paziņojumus"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Izvēlēts %d vienums"
+#~ msgstr[1] "Izvēlēti %d vienumi"
+#~ msgstr[2] "Izvēlēti %d vienumi"
+
+#~ msgid "%d min"
+#~ msgstr "%d minūte"
+
+#~ msgid "Empty"
+#~ msgstr "Tukšs"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Izvēlieties repertuāru"
diff --git a/po/meson.build b/po/meson.build
new file mode 100644
index 00000000..da86d012
--- /dev/null
+++ b/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext(APPLICATION_ID, preset:'glib')
diff --git a/po/mjw.po b/po/mjw.po
new file mode 100644
index 00000000..47517800
--- /dev/null
+++ b/po/mjw.po
@@ -0,0 +1,584 @@
+# Karbi translation for gnome-music.
+# Copyright (C) 2019 gnome-music's Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnome-music package.
+# Jor Teron <jor.teron@gmail.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2019-08-06 10:28+0000\n"
+"PO-Revision-Date: 2019-08-06 20:59+0530\n"
+"Last-Translator: Jor Teron <jor.teron@gmail.com> , Biju Rongpi <bijurongpi3@gmail.com> , Prodip Rongphar "
+"<rongpharprodipsenot@gmail.com>\n"
+"Language-Team: Karbi <karbi.translation@gmail.com>\n"
+"Language: mjw\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2 ; plural=( n!=1 )\n"
+"X-Generator: Gtranslator 2.91.7\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+msgid "GNOME Music"
+msgstr "GNOME Music"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr ""
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid ""
+"An easy way to play your music. Automatically discover music on your "
+"computer, the local network and internet services."
+msgstr ""
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, get music from DLNA servers or try "
+"something new with the Jamendo and Magnatune services."
+msgstr ""
+
+#: data/org.gnome.Music.appdata.xml.in.in:52
+msgid "The GNOME Music developers"
+msgstr "GNOME Music developers"
+
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/application.py:59
+#: gnomemusic/window.py:77
+msgid "Music"
+msgstr "Lotun"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr ""
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Window apun"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Window apun (arpan pen arjon)"
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window position"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window position (x and y)."
+msgstr "Window position (x pen y)."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Window maximized"
+msgstr "Windows pathetan"
+
+#: data/org.gnome.Music.gschema.xml:23
+msgid "Window maximized state."
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:27
+msgid "Playback repeat mode"
+msgstr ""
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:29
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Enable ReplayGain"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables ReplayGain for albums"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Inital state has been displayed"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid "Set to true when initial state has been displayed"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:43
+msgid "Inhibit system suspend"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:44
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+
+#: data/ui/AboutDialog.ui.in:9
+msgid "Copyright © 2018 GNOME Music Developers"
+msgstr "Copyright © 2018 GNOME Music Developers"
+
+#: data/ui/AboutDialog.ui.in:10
+msgid "A music player and management application for GNOME."
+msgstr "Lun-kerot player pen lun management application GNOME phan"
+
+#: data/ui/AboutDialog.ui.in:12
+msgid "Visit GNOME Music website"
+msgstr "GNOME Music website kevur"
+
+#: data/ui/AboutDialog.ui.in:13
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version.\n"
+"\n"
+"“Magic of the vinyl” by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+"https://www.flickr.com/photos/_spy_/12270839403"
+msgstr ""
+
+#: data/ui/AlbumWidget.ui:105
+msgid "Released"
+msgstr "Klang"
+
+#: data/ui/AlbumWidget.ui:121
+msgid "Running Length"
+msgstr "Lun-apor athui"
+
+#: data/ui/AlbumWidget.ui:166 gnomemusic/widgets/searchbar.py:70
+msgid "Composer"
+msgstr "Lunsonsebang"
+
+#: data/ui/AppMenu.ui:21
+msgid "_Keyboard Shortcuts"
+msgstr ""
+
+#: data/ui/AppMenu.ui:35
+msgid "_Help"
+msgstr "_Help"
+
+#: data/ui/AppMenu.ui:49
+msgid "_About Music"
+msgstr "Music _Aputhak"
+
+#: data/ui/HeaderBar.ui:13
+msgid "Menu"
+msgstr "Ason-amung"
+
+#: data/ui/HeaderBar.ui:36
+msgid "Select"
+msgstr "Chongvai"
+
+#: data/ui/HeaderBar.ui:58 data/ui/PlaylistDialog.ui:244
+msgid "_Cancel"
+msgstr ""
+
+#: data/ui/HeaderBar.ui:77
+msgid "Search"
+msgstr "Kiri"
+
+#: data/ui/HeaderBar.ui:100
+msgid "Back"
+msgstr "Aphi"
+
+#: data/ui/help-overlay.ui:13
+msgctxt "shortcut window"
+msgid "General"
+msgstr ""
+
+#: data/ui/help-overlay.ui:17
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr ""
+
+#: data/ui/help-overlay.ui:24
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Kiri"
+
+#: data/ui/help-overlay.ui:31
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Help"
+
+#: data/ui/help-overlay.ui:38
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Shortcuts"
+
+#: data/ui/help-overlay.ui:47
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Kerot-thu"
+
+#: data/ui/help-overlay.ui:51
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Ke-rot/Kesang"
+
+#: data/ui/help-overlay.ui:58
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Dunthu alun"
+
+#: data/ui/help-overlay.ui:65
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Aphi lun"
+
+#: data/ui/help-overlay.ui:72
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Cherui"
+
+#: data/ui/help-overlay.ui:79
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Parlin-parlo"
+
+#: data/ui/help-overlay.ui:88
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigation"
+
+#: data/ui/help-overlay.ui:92
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Lun-athui long dam"
+
+#: data/ui/help-overlay.ui:99
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Lunse long dam"
+
+#: data/ui/help-overlay.ui:106
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Lun long dam"
+
+#: data/ui/help-overlay.ui:113
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Playlists long dam"
+
+#: data/ui/help-overlay.ui:120
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Aphi dam"
+
+#: data/ui/PlayerToolbar.ui:6
+msgid "Shuffle"
+msgstr "Parlin-parlo"
+
+#: data/ui/PlayerToolbar.ui:11
+msgid "Repeat All"
+msgstr "Kado-kawe cherui"
+
+#: data/ui/PlayerToolbar.ui:16
+msgid "Repeat Song"
+msgstr "Isi lun cherui"
+
+#. Causes tracks to play in random order
+#: data/ui/PlayerToolbar.ui:21
+msgid "Shuffle/Repeat Off"
+msgstr "Cherui/Parlin kerot kanghap"
+
+#: data/ui/PlayerToolbar.ui:70
+msgid "Previous"
+msgstr "Aphi"
+
+#: data/ui/PlayerToolbar.ui:86 gnomemusic/widgets/playertoolbar.py:153
+msgid "Play"
+msgstr ""
+
+#: data/ui/PlayerToolbar.ui:102
+msgid "Next"
+msgstr "Dunthu"
+
+#: data/ui/PlaylistContextMenu.ui:5
+msgctxt "context menu item"
+msgid "Play"
+msgstr ""
+
+#: data/ui/PlaylistContextMenu.ui:9
+msgid "Add to Playlist…"
+msgstr ""
+
+#: data/ui/PlaylistContextMenu.ui:13
+msgid "Remove From Playlist"
+msgstr ""
+
+#: data/ui/PlaylistControls.ui:6
+msgid "_Play"
+msgstr ""
+
+#: data/ui/PlaylistControls.ui:10
+msgid "_Delete"
+msgstr ""
+
+#: data/ui/PlaylistControls.ui:14
+msgid "_Rename…"
+msgstr "Amen kela_r…"
+
+#: data/ui/PlaylistControls.ui:40
+msgid "Playlist Name"
+msgstr "Playlist men"
+
+#: data/ui/PlaylistControls.ui:74
+msgid "_Done"
+msgstr "Tanglo"
+
+#: data/ui/PlaylistDialog.ui:66
+msgid "Enter a name for your first playlist"
+msgstr "Nangli playlist cheng men tok ik nangji."
+
+#: data/ui/PlaylistDialog.ui:92
+msgid "C_reate"
+msgstr ""
+
+#: data/ui/PlaylistDialog.ui:155
+msgid "New Playlist…"
+msgstr ""
+
+#: data/ui/PlaylistDialog.ui:169
+msgid "Add"
+msgstr "Kethap"
+
+#: data/ui/PlaylistDialog.ui:241
+msgid "Add to Playlist"
+msgstr ""
+
+#: data/ui/PlaylistDialog.ui:257
+msgid "_Add"
+msgstr "Keth_ap"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Kado-kawe chongvai"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr ""
+
+#: data/ui/SelectionBarMenuButton.ui:31 gnomemusic/widgets/headerbar.py:75
+msgid "Click on items to select them"
+msgstr ""
+
+#: data/ui/SelectionToolbar.ui:9
+msgid "_Add to Playlist"
+msgstr ""
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:673
+msgid "Most Played"
+msgstr "rot ver alun"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:707
+msgid "Never Played"
+msgstr "Rot re pin lun"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:740
+msgid "Recently Played"
+msgstr "Non rot ver lun"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:784
+msgid "Recently Added"
+msgstr ""
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:827
+msgid "Favorite Songs"
+msgstr "Ningdok lun"
+
+#: gnomemusic/gstplayer.py:403
+msgid "Unable to play the file"
+msgstr "Rot un-eh"
+
+#: gnomemusic/gstplayer.py:409
+msgid "_Find in {}"
+msgstr ""
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:420
+msgid " and "
+msgstr " pen "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:423
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:425
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] ""
+msgstr[1] ""
+
+#: gnomemusic/inhibitsuspend.py:72
+msgid "Playing music"
+msgstr "Lun kerot"
+
+#: gnomemusic/utils.py:62
+msgid "Unknown album"
+msgstr "Lun-athui chinine"
+
+#: gnomemusic/utils.py:83
+msgid "Unknown Artist"
+msgstr "Lunse chinine"
+
+#: gnomemusic/views/albumsview.py:61
+msgid "Albums"
+msgstr "Lun-athui"
+
+#: gnomemusic/views/artistsview.py:59
+msgid "Artists"
+msgstr "Lunse"
+
+#: gnomemusic/views/emptyview.py:79
+msgid "Music folder"
+msgstr "Music folder"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:83
+msgid "The contents of your {} will appear here."
+msgstr "Lun ason {} long pen dak klang po."
+
+#: gnomemusic/views/emptyview.py:119
+msgid "Hey DJ"
+msgstr "Oi DJ"
+
+#: gnomemusic/views/emptyview.py:129 gnomemusic/views/emptyview.py:135
+msgid "No music found"
+msgstr "Isi lun ta longle"
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Try a different search"
+msgstr "Kaprek pen ri tha"
+
+#: gnomemusic/views/emptyview.py:143
+msgid "GNOME Music could not connect to Tracker"
+msgstr ""
+
+#: gnomemusic/views/emptyview.py:146
+msgid "Your music files cannot be indexed without Tracker running"
+msgstr ""
+
+#: gnomemusic/views/emptyview.py:154
+msgid "Your system Tracker version seems outdated"
+msgstr ""
+
+#: gnomemusic/views/emptyview.py:157
+msgid "Music needs Tracker version 2.2.0 or higher"
+msgstr ""
+
+#: gnomemusic/views/playlistsview.py:58
+msgid "Playlists"
+msgstr ""
+
+#: gnomemusic/views/searchview.py:363
+msgid "Artists Results"
+msgstr "Lunse Keklang"
+
+#: gnomemusic/views/searchview.py:377
+msgid "Albums Results"
+msgstr "Lun-athui keklang"
+
+#: gnomemusic/views/songsview.py:57
+msgid "Songs"
+msgstr "Lun"
+
+#: gnomemusic/widgets/albumwidget.py:147
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minute"
+msgstr[1] "{} minutes"
+
+#: gnomemusic/widgets/disclistboxwidget.py:82
+msgid "Disc {}"
+msgstr "Disc {}"
+
+#: gnomemusic/widgets/headerbar.py:72
+msgid "Selected {} item"
+msgid_plural "Selected {} items"
+msgstr[0] "Chongvai tang {} hormu"
+msgstr[1] "Chongvai tang son {} hormu"
+
+#: gnomemusic/widgets/notificationspopup.py:168
+msgid "Loading"
+msgstr "Wang bomlo"
+
+#: gnomemusic/widgets/notificationspopup.py:241
+msgid "_Undo"
+msgstr ""
+
+#: gnomemusic/widgets/notificationspopup.py:256
+msgid "Playlist {} removed"
+msgstr ""
+
+#: gnomemusic/widgets/notificationspopup.py:260
+msgid "{} removed from {}"
+msgstr "{} phan {} long pen musi lo"
+
+#: gnomemusic/widgets/playertoolbar.py:150
+msgid "Pause"
+msgstr "Kesang"
+
+#: gnomemusic/widgets/playlistcontrols.py:83
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} Lun"
+msgstr[1] "(} Lun"
+
+#: gnomemusic/widgets/searchbar.py:67 gnomemusic/widgets/searchbar.py:116
+msgid "All"
+msgstr ""
+
+#: gnomemusic/widgets/searchbar.py:68
+msgid "Artist"
+msgstr "Lunse"
+
+#: gnomemusic/widgets/searchbar.py:69
+msgid "Album"
+msgstr "Lun-athui"
+
+#: gnomemusic/widgets/searchbar.py:71
+msgid "Track Title"
+msgstr "Lun amen"
+
+#: gnomemusic/widgets/searchbar.py:117
+msgid "Local"
+msgstr ""
+
+#: gnomemusic/widgets/searchbar.py:286
+msgid "Sources"
+msgstr ""
+
+#: gnomemusic/widgets/searchbar.py:297
+msgid "Match"
+msgstr "Homan"
diff --git a/po/ml.po b/po/ml.po
new file mode 100644
index 00000000..3c8c0d20
--- /dev/null
+++ b/po/ml.po
@@ -0,0 +1,661 @@
+# Malayalam translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Mohammed Sadiq <sadiqpkp@gmail.com>, 2013.
+# Akhilan <akhilkrishnans@gmail.com>, 2013
+# Anish Sheela <aneesh.nl@gmail.com>, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2017-07-31 18:57+0000\n"
+"PO-Revision-Date: 2017-08-05 22:25+0530\n"
+"Last-Translator: Anish Sheela <aneesh.nl@gmail.com>\n"
+"Language-Team: Swatantra Malayalam Computing <discuss@lists.smc.org.in>\n"
+"Language: ml\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.1\n"
+"X-Project-Style: gnome\n"
+
+#: ../data/org.gnome.Music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "ഗ്നോം മ്യൂസിക്ക്"
+
+#: ../data/org.gnome.Music.appdata.xml.in.h:2
+#: ../data/org.gnome.Music.desktop.in.h:3
+msgid "Play and organize your music collection"
+msgstr "ഗാനശേഖരം ക്രമീകരിച്ച് പ്ലേ ചെയ്യുക"
+
+#: ../data/org.gnome.Music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "മ്യൂസിക്ക് പുതിയ സംഗീതം പ്ലേ ചെയ്യാന്നുള്ള ഗ്നോം അപ്ലിക്കേഷന്‍ ആണു. "
+
+#: ../data/org.gnome.Music.desktop.in.h:1 ../gnomemusic/application.py:53
+#: ../gnomemusic/application.py:101 ../gnomemusic/toolbar.py:90
+#: ../gnomemusic/window.py:68 ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "മ്യൂസിക്ക്"
+
+#: ../data/org.gnome.Music.desktop.in.h:2
+msgid "Music Player"
+msgstr "മ്യൂസിക്ക് പ്ലേയര്‍"
+
+#: ../data/org.gnome.Music.desktop.in.h:4
+#| msgid "Music Player"
+msgid "Music;Player;"
+msgstr "മ്യൂസിക്ക്; പ്ലേയര്‍;"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "ജാലകത്തിന്റെ വലിപ്പം"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "ജാലകത്തിന്റെ വലിപ്പം (വീതിയും ഉയരവും)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "ജാലകത്തിന്റെ സ്ഥാനം"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "ജാലകത്തിന്റെ സ്ഥാനം (xഉം yഉം)"
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "ജാലകം പരമാവധിയാക്കി"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "ജാലകം പരമാവധിയാക്കിയ സ്ഥിതി."
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "പ്ലേബാക്ക് തുടരുന്ന വിധം"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: ../data/org.gnome.Music.gschema.xml.h:9
+#| msgid ""
+#| "Value identifies whether to repeat or randomize playback through the "
+#| "collection. Allowed values are: \"none\" (repeat and shuffle are off), "
+#| "\"song\" (repeat current song), \"all\" (repeat playlist, no shuffle), "
+#| "\"shuffle\" (shuffle playlist, presumes repeat all)."
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"പാട്ടുകള്‍ വീണ്ടും കേള്‍ക്കണമോ അതോ ക്രമമല്ലാത്ത കേള്‍ക്കണമോ എന്ന് നോക്കാം. "
+"അനുവദിക്കപ്പെട്ട രീതിക്കള്‍: “none” (ആവര്‍ത്തനവും കലര്‍ത്തലും ഇല്ല), “song” "
+"(നിലവിലെ ഗാനം ആവര്‍ത്തിക്കുക), “all” (ഗാനനിര ആവര്‍ത്തിക്കുക, കലര്‍ത്തല്‍ "
+"ഇല്ല), “shuffle” (ഗാനനിര കലര്‍ത്തുക, ഊഹപ്രകാരം എല്ലാം ആവര്‍ത്തിക്കുക)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "Search mode"
+msgstr "തിരച്ചില്‍ നടപടി"
+
+#: ../data/org.gnome.Music.gschema.xml.h:11
+msgid "If true, the search bar is shown."
+msgstr "ശരിയാണെങ്കില്‍, തിരച്ചില്‍ പട്ട കാണിക്കുന്നതാണ്."
+
+#: ../data/org.gnome.Music.gschema.xml.h:12
+msgid "Notifications mode"
+msgstr "അറിയിപ്പ് മോഡ്"
+
+#: ../data/org.gnome.Music.gschema.xml.h:13
+msgid "Enables or disables playback notifications"
+msgstr "കേള്‍ക്കുന്നതിന്റെ അറിയിപ്പുകള്‍ വേണോ, വേണ്ടയോ"
+
+#: ../data/org.gnome.Music.gschema.xml.h:14
+msgid "Enable ReplayGain"
+msgstr "ReplayGain വേണം"
+
+#: ../data/org.gnome.Music.gschema.xml.h:15
+msgid "Enables or disables ReplayGain for albums"
+msgstr "ആല്‍ബങ്ങള്‍ക്ക് ReplayGain വേണമോ വേണ്ടയോ എന്ന്"
+
+#: ../data/org.gnome.Music.gschema.xml.h:16
+msgid "Inital state has been displayed"
+msgstr "ആദ്യത്തെ അവസ്ഥ കാണിക്കുന്നു"
+
+#: ../data/org.gnome.Music.gschema.xml.h:17
+msgid "Set to true when initial state has been displayed"
+msgstr "ആദ്യത്തെ അവസ്ഥ കാണിക്കുമ്പോള്‍ ട്രൂ ആയി സജ്ജികരിക്കുന്നു"
+
+#: ../gnomemusic/notification.py:55 ../data/PlayerToolbar.ui.h:6
+msgid "Previous"
+msgstr "മുമ്പിലത്തെ"
+
+#: ../gnomemusic/notification.py:58 ../gnomemusic/player.py:558
+msgid "Pause"
+msgstr "വിരാമം"
+
+#: ../gnomemusic/notification.py:61 ../gnomemusic/player.py:561
+#: ../data/PlayerToolbar.ui.h:7
+msgid "Play"
+msgstr "പ്ലേ"
+
+#: ../gnomemusic/notification.py:63 ../data/PlayerToolbar.ui.h:8
+msgid "Next"
+msgstr "അടുത്തത്"
+
+#: ../gnomemusic/player.py:1167
+msgid "Unable to play the file"
+msgstr "ഫയല്‍ കേള്‍പ്പിക്കാന്‍ പറ്റുന്നില്ല"
+
+#. TRANSLATORS: this is a button to launch a codec installer.
+#. %s will be replaced with the software installer's name, e.g.
+#. 'Software' in case of gnome-software.
+#: ../gnomemusic/player.py:1172
+#, python-format
+msgid "_Find in %s"
+msgstr "%s ല്‍ കണ്ടുപിടിക്കുക (_F)"
+
+#. TRANSLATORS: separator for a list of codecs
+#: ../gnomemusic/player.py:1182
+msgid " and "
+msgstr " ഉം "
+
+#. TRANSLATORS: separator for a list of codecs
+#: ../gnomemusic/player.py:1185
+msgid ", "
+msgstr ", "
+
+#: ../gnomemusic/player.py:1186
+#, python-format
+msgid "%s is required to play the file, but is not installed."
+msgid_plural "%s are required to play the file, but are not installed."
+msgstr[0] "ഫയല്‍ കേള്‍പ്പിക്കാന്‍ %s വേണം, പക്ഷേ ഇന്‍സ്റ്റാള്‍ ചെയ്തിട്ടില്ല."
+msgstr[1] "ഫയല്‍ കേള്‍പ്പിക്കാന്‍ %s വേണം, പക്ഷേ ഇന്‍സ്റ്റാള്‍ ചെയ്തിട്ടില്ല."
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:59
+#| msgid "Music Player"
+msgid "Most Played"
+msgstr "എറ്റവും കുടുതല്‍ കേട്ടത്"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:64
+msgid "Never Played"
+msgstr "ഇത് വരെ കേള്‍ക്കാത്തത്"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:69
+msgid "Recently Played"
+msgstr "അടുത്തിടെ കേട്ടത്"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:74
+msgid "Recently Added"
+msgstr "അടുത്തിടെ ചേര്‍ത്തത്"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:79
+msgid "Favorite Songs"
+msgstr "പ്രിയപ്പെട്ട പാട്ടുകള്‍"
+
+#. TRANSLATORS: The following translatable string should be a
+#. vertical bar-separated list of all-lowercase articles that
+#. should be ignored when alphabetizing artists/albums. This
+#. list should include the basic english translatable strings
+#. regardless of language because they are so universal.
+#. If some articles occur more frequently than others, the most
+#. common one should appear first, the least common one last.
+#: ../gnomemusic/query.py:90
+msgid "the|a|an"
+msgstr "the|a|an"
+
+#: ../gnomemusic/searchbar.py:63 ../gnomemusic/searchbar.py:111
+msgid "All"
+msgstr "എല്ലാം"
+
+#: ../gnomemusic/searchbar.py:64
+#| msgid "Artists"
+msgid "Artist"
+msgstr "ഗായകര്‍"
+
+#: ../gnomemusic/searchbar.py:65
+#| msgid "Albums"
+msgid "Album"
+msgstr "ആല്‍ബം"
+
+#: ../gnomemusic/searchbar.py:66 ../data/AlbumWidget.ui.h:3
+msgid "Composer"
+msgstr "സംഗീതജ്ഞന്‍"
+
+#: ../gnomemusic/searchbar.py:67
+msgid "Track Title"
+msgstr "പാട്ടിന്റെ തലക്കെട്ട്"
+
+#: ../gnomemusic/searchbar.py:112
+msgid "Local"
+msgstr "ലോക്കല്‍"
+
+#: ../gnomemusic/searchbar.py:224
+msgid "Sources"
+msgstr "സ്തോതസ്സുകള്‍"
+
+#: ../gnomemusic/searchbar.py:231
+msgid "Match"
+msgstr "ചേര്‍ച്ച"
+
+#: ../gnomemusic/utils.py:63
+msgid "Unknown Artist"
+msgstr "അജ്ഞാത ഗായകന്‍"
+
+#: ../gnomemusic/utils.py:75
+msgid "Untitled"
+msgstr "പേരില്ലാത്തത്"
+
+#: ../gnomemusic/views/albumsview.py:44 ../gnomemusic/views/searchview.py:454
+msgid "Albums"
+msgstr "ആല്‍ബം"
+
+#: ../gnomemusic/views/artistsview.py:52 ../gnomemusic/views/searchview.py:455
+msgid "Artists"
+msgstr "ഗായകര്‍"
+
+#: ../gnomemusic/views/baseview.py:196
+msgid "Selected {} item"
+msgid_plural "Selected {} items"
+msgstr[0] "തെരഞ്ഞെടുത്ത {} ഇനം"
+msgstr[1] "തെരഞ്ഞെടുത്ത {} ഇനങ്ങള്‍"
+
+#: ../gnomemusic/views/baseview.py:201 ../gnomemusic/views/baseview.py:303
+#: ../gnomemusic/widgets/albumwidget.py:198
+#: ../gnomemusic/widgets/artistalbumswidget.py:232 ../data/headerbar.ui.h:3
+msgid "Click on items to select them"
+msgstr "തിരഞ്ഞെടുക്കാനായി ആ ഇനങ്ങളില്‍ ക്ലിക്ക് ചെയ്യുക"
+
+#: ../gnomemusic/views/emptyview.py:51
+#| msgid "Music Player"
+msgid "Music folder"
+msgstr "പാട്ടിന്റെ ഫോള്‍ഡര്‍"
+
+#: ../gnomemusic/views/emptysearchview.py:50
+msgid "Try a different search"
+msgstr "വേറെ തെരച്ചില്‍ നോക്കുക"
+
+#: ../gnomemusic/views/initialstateview.py:50
+msgid "Hey DJ"
+msgstr "ഹായ് ഡിജെ"
+
+#: ../gnomemusic/views/playlistview.py:58 ../gnomemusic/views/searchview.py:457
+msgid "Playlists"
+msgstr "ഗാനനിരകള്‍"
+
+#: ../gnomemusic/views/playlistview.py:420
+#, python-format
+#| msgid "Songs"
+msgid "%d Song"
+msgid_plural "%d Songs"
+msgstr[0] "%d പാട്ട്"
+msgstr[1] "%d പാട്ടുകള്‍"
+
+#: ../gnomemusic/views/searchview.py:456 ../gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "പാട്ടുകള്‍"
+
+#: ../gnomemusic/widgets/albumwidget.py:194
+#: ../gnomemusic/widgets/artistalbumswidget.py:228
+#, python-format
+msgid "Selected %d item"
+msgid_plural "Selected %d items"
+msgstr[0] "തെരഞ്ഞെടുത്ത %d ഇനം"
+msgstr[1] "തെരഞ്ഞെടുത്ത %d ഇനങ്ങള്‍"
+
+#: ../gnomemusic/widgets/albumwidget.py:291
+#: ../gnomemusic/widgets/albumwidget.py:345
+#, python-format
+msgid "%d min"
+msgstr "%d മിനിറ്റ്"
+
+#: ../gnomemusic/widgets/disclistboxwidget.py:189
+msgid "Disc {}"
+msgstr "ഡിസ്ക്ക് {}"
+
+#: ../gnomemusic/window.py:125
+#| msgid "Loading..."
+msgid "Loading"
+msgstr "ലഭ്യമാക്കിക്കൊണ്ടിരിക്കുന്നു"
+
+#. Undo button
+#: ../gnomemusic/window.py:162
+msgid "_Undo"
+msgstr "തിരിച്ചാക്കുക (_U)"
+
+#: ../gnomemusic/window.py:314
+msgid "Empty"
+msgstr "കാലിയാണ്"
+
+#: ../gnomemusic/window.py:390
+msgid "Playlist {} removed"
+msgstr "പാട്ട് പട്ടിക {} കളഞ്ഞു"
+
+#: ../data/AboutDialog.ui.in.h:2
+#| msgid "Copyright © 2013 GNOME Music Developers"
+msgid "Copyright © 2016 GNOME Music Developers"
+msgstr "പകര്‍പ്പാവകാശം © 2016 GNOME Music Developers"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr ""
+"ഗ്നോംനു വേണ്ടിയുള്ള സംഗീതം കേള്‍ക്കാനും നടത്തിപ്പിനും വേണ്ടിയുള്ള "
+"അപ്ലിക്കേഷന്‍."
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "ഗ്നോം മ്യൂസിക്ക് വെബ്താള്‍ സന്ദര്‍ശിക്കുക"
+
+#: ../data/AboutDialog.ui.in.h:5
+#, fuzzy
+#| msgid ""
+#| "GNOME Music is free software; you can redistribute it and/or modify it "
+#| "under the terms of the GNU General Public License as published by the "
+#| "Free Software Foundation; either version 2 of the License, or (at your "
+#| "option) any later version.\n"
+#| "\n"
+#| "GNOME Music is distributed in the hope that it will be useful, but "
+#| "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#| "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#| "Public License for more details.\n"
+#| "\n"
+#| "You should have received a copy of the GNU General Public License along "
+#| "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#| "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#| "\n"
+#| "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#| "GStreamer plugins to be used and distributed together with GStreamer and "
+#| "GNOME Music. This permission is above and beyond the permissions granted "
+#| "by the GPL license by which GNOME Music is covered. If you modify this "
+#| "code, you may extend this exception to your version of the code, but you "
+#| "are not obligated to do so. If you do not wish to do so, delete this "
+#| "exception statement from your version."
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version.\n"
+"\n"
+"“Magic of the vinyl” by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+"https://www.flickr.com/photos/_spy_/12270839403\n"
+msgstr ""
+"ഗ്നോം മ്യൂസിക്ക് ഒരു സൗജന്യ സോഫ്റ്റ്വെയര്‍ ആണ്. ഫ്രീ സോഫ്റ്റ്‍വെയര്‍ "
+"ഫൌണ്ടേഷന്‍‍ പ്രസിദ്ധീകരിക്കുന്ന ഗ്നു ജനറല്‍ പബ്ലിക്ക് ലൈസന്‍സനു കീഴെ "
+"വ്യവസ്ഥകള്‍ അനുസരിച്ചു് താങ്കള്‍ക്കു വീണ്ടും വിതരണം ചെയ്യാനും മാറ്റം "
+"വരുത്താനും കഴിയും; രണ്ടാം പതിപ്പോ (താങ്കളുടെ അഭിപ്രായപ്രകാരം)അല്ലെങ്കില്‍ "
+"അതില്‍ പുതിയ പതിപ്പോ ഉപയോഗിക്കാം.\n"
+"\n"
+"ഗ്നോം മ്യൂസിക്ക് ഉപയോഗപ്പെടും എന്ന വിശ്വാസത്തോടെയാണു വിതരണം ചെയ്തിരിക്കുന്നത്"
+", എന്നാല്‍ ഒരു വാറന്റിയും ഇല്ല."
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "പുറത്തിറങ്ങിയത്"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "സമയദൈര്‍ഘ്യം"
+
+#: ../data/app-menu.ui.h:1
+msgid "_Keyboard Shortcuts"
+msgstr "കീബോഡ് എളുപ്പവഴികള്‍ (_K)"
+
+#: ../data/app-menu.ui.h:2
+msgid "_Help"
+msgstr "സഹായം (_H)"
+
+#: ../data/app-menu.ui.h:3
+#| msgid "_About Music"
+msgid "_About"
+msgstr "ഗ്നോം സംഗീതത്തെ കുറിച്ച് (_H)"
+
+#: ../data/app-menu.ui.h:4
+msgid "_Quit"
+msgstr "പൂട്ടുക (_Q)"
+
+#: ../data/headerbar.ui.h:1
+msgid "Select All"
+msgstr "എല്ലാം തിരഞ്ഞെടുക്കുക"
+
+#: ../data/headerbar.ui.h:2
+msgid "Select None"
+msgstr "ഒന്നും തിരഞ്ഞെടുക്കരുത്"
+
+#: ../data/headerbar.ui.h:4
+#| msgid "Search mode"
+msgid "Search"
+msgstr "തിരച്ചില്‍"
+
+#: ../data/headerbar.ui.h:5
+#| msgid "Select All"
+msgid "Select"
+msgstr "തിരഞ്ഞെടുക്കുക"
+
+#: ../data/headerbar.ui.h:6 ../data/PlaylistDialog.ui.h:6
+#| msgid "Cancel"
+msgid "_Cancel"
+msgstr "റദ്ദാക്കുക (_C)"
+
+#: ../data/headerbar.ui.h:7
+msgid "Back"
+msgstr "പുറകോട്ട്"
+
+#: ../data/help-overlay.ui.h:1
+msgctxt "shortcut window"
+msgid "General"
+msgstr "സാധാരണ"
+
+#: ../data/help-overlay.ui.h:2
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "ജാലകം അടയ്ക്കുക"
+
+#: ../data/help-overlay.ui.h:3
+#| msgid "Search mode"
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "തിരച്ചില്‍"
+
+#: ../data/help-overlay.ui.h:4
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "സഹായം"
+
+#: ../data/help-overlay.ui.h:5
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "കുറുക്ക് വഴികള്‍"
+
+#: ../data/help-overlay.ui.h:6
+#| msgid "Play"
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "കേള്‍ക്കുക"
+
+#: ../data/help-overlay.ui.h:7
+#| msgid "Pause"
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "കേള്‍ക്കുക/നിര്‍ത്തുക"
+
+#: ../data/help-overlay.ui.h:8
+#| msgid "Next"
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "അടുത്ത പാട്ട്"
+
+#: ../data/help-overlay.ui.h:9
+#| msgid "Previous"
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "മുമ്പിലത്തെ പാട്ട്"
+
+#: ../data/help-overlay.ui.h:10
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "വീണ്ടും കേള്‍ക്കുക/വേണ്ട"
+
+#: ../data/help-overlay.ui.h:11
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "ക്രമമില്ലാത്താക്കുക/ക്രമമാക്കുക"
+
+#: ../data/help-overlay.ui.h:12
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr ""
+
+#: ../data/help-overlay.ui.h:13
+#| msgid "Albums"
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "ആല്‍ബത്തിലോട്ട് പോവുക"
+
+#: ../data/help-overlay.ui.h:14
+#| msgid "Artists"
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "ഗായകരിലോട്ട് പോവുക"
+
+#: ../data/help-overlay.ui.h:15
+#| msgid "Songs"
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "പാട്ടുകളിലോട്ട് പോവുക"
+
+#: ../data/help-overlay.ui.h:16
+#| msgid "Add to Playlist"
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "ഗാനനിരയിലേക്കു പോവുക"
+
+#: ../data/help-overlay.ui.h:17
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "പുറകിലോട്ട് പോവുക"
+
+#: ../data/NoMusic.ui.h:1
+#| msgid "No Music Found"
+msgid "No music found"
+msgstr "പാട്ട് ഒന്നും കണ്ടില്ല"
+
+#. Translators: %s will be replaced with a link with text
+#: ../data/NoMusic.ui.h:4
+#, no-c-format
+msgid "The contents of your %s will appear here."
+msgstr "%s ലെ ഉള്ളടക്കം ഇവിടെ വരും."
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "കലര്‍ത്തുക"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "എല്ലാം ആവര്‍ത്തിക്കുക"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "പാട്ട് ആവര്‍ത്തിക്കുക"
+
+#. Causes tracks to play in random order
+#: ../data/PlayerToolbar.ui.h:5
+msgid "Shuffle/Repeat Off"
+msgstr "കലര്‍ത്തല്‍/ആവര്‍ത്തനം നിര്‍ത്തുക"
+
+#: ../data/PlaylistControls.ui.h:1
+#| msgid "Play"
+msgid "_Play"
+msgstr "പ്ലേ (_P)"
+
+#: ../data/PlaylistControls.ui.h:2
+msgid "_Delete"
+msgstr "കളയുക (_D)"
+
+#: ../data/PlaylistControls.ui.h:3
+#| msgid "Playlists"
+msgid "Playlist Name"
+msgstr "ഗാനനിരയുടെ പേര്"
+
+#: ../data/PlaylistDialog.ui.h:1
+msgid "Enter a name for your first playlist"
+msgstr "നിങ്ങളുടെ ആദ്യത്തെ പാട്ട് പട്ടികയ്ക്ക് പേര് തരിക"
+
+#: ../data/PlaylistDialog.ui.h:2
+msgid "C_reate"
+msgstr "ഉണ്ടാക്കുക (_r)"
+
+#: ../data/PlaylistDialog.ui.h:3
+#| msgid "_New Playlist"
+msgid "New Playlist"
+msgstr "പു‌തിയ ഗാനനിര (_N)"
+
+#: ../data/PlaylistDialog.ui.h:4
+msgid "Add"
+msgstr "ചേര്‍ക്കുക"
+
+#: ../data/PlaylistDialog.ui.h:5
+#| msgid "Select All"
+msgid "Select Playlist"
+msgstr "ഗാനനിര തിരഞ്ഞെടുക്കുക"
+
+#: ../data/PlaylistDialog.ui.h:7
+msgid "_Add"
+msgstr "ചേര്‍ക്കുക (_A)"
+
+#: ../data/SelectionToolbar.ui.h:1
+#| msgid "Add to Playlist"
+msgid "_Add to Playlist"
+msgstr "ഗാനനിരയിലേക്കു ചേര്‍ക്കുക (_A)"
+
+#: ../data/SelectionToolbar.ui.h:2
+#| msgid "_New Playlist"
+msgid "_Remove from Playlist"
+msgstr "‌ഗാനനിരയില്‍ നിന്ന് മാറ്റുക"
+
+#~ msgid "Not playing"
+#~ msgstr "പാടുന്നില്ല"
+
+#~ msgid "Unknown Album"
+#~ msgstr "അജ്ഞാത ആല്‍ബം"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "%s കൊണ്ട്‌, %s നിന്നും"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "സംഗീതമൊന്നും കണ്ടെത്തിയില്ല\n"
+#~ "%s എന്ന ഫോള്‍ഡറിലേക്ക് കുറച്ച് രേഖകള്‍ ചേര്‍ക്കുക"
+
+#~ msgid "All Artists"
+#~ msgstr "എല്ലാ ഗായകരും"
+
+#~ msgid "Load More"
+#~ msgstr "കൂടുതല്‍ ലഭ്യമാക്കുക"
+
+#~ msgid "Now _Playing"
+#~ msgstr "ഇപ്പോള്‍ പാടുന്നത്"
diff --git a/po/ms.po b/po/ms.po
new file mode 100644
index 00000000..19aa6e2b
--- /dev/null
+++ b/po/ms.po
@@ -0,0 +1,616 @@
+# Malay translation for gnome-music.
+# Copyright (C) 2020 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# abuyop <abuyop@gmail.com>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2020-01-27 08:27+0000\n"
+"PO-Revision-Date: 2020-01-27 17:58+0800\n"
+"Language-Team: Pasukan Terjemahan GNOME Malaysia\n"
+"Language: ms\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"Last-Translator: abuyop <abuyop@gmail.com>\n"
+"X-Generator: Poedit 2.0.6\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+msgid "GNOME Music"
+msgstr "Muzik GNOME"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Main dan urus koleksi muzik anda"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid ""
+"An easy way to play your music. Automatically discover music on your "
+"computer, the local network and internet services."
+msgstr ""
+"Satu cara mudah memainkan muzik anda. Temui muzik di dalam komputer anda, "
+"rangkaian setempat dan perkhidmatan internet secara automatik."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, get music from DLNA servers or try "
+"something new with the Jamendo and Magnatune services."
+msgstr ""
+"Cari trek-trek dalam koleksi setempat anda, dapatkan muzik menerusi pelayan-"
+"pelayan DLNA atau cuba sesuatu yang baharu dengan perkhidmatan Jamendo dan "
+"Magnatune."
+
+#: data/org.gnome.Music.appdata.xml.in.in:67
+msgid "The GNOME Music developers"
+msgstr "Para Pembangun Muzik GNOME"
+
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/application.py:60
+#: gnomemusic/window.py:77
+msgid "Music"
+msgstr "Muzik"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Pemain Muzik"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Muzik;Pemain;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Saiz tetingkap"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Saiz tetingkap (lebar dan tinggi)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window position"
+msgstr "Kedudukan tetingkap"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window position (x and y)."
+msgstr "Kedudukan tetingkap (x dan y)."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Window maximized"
+msgstr "Tetingkap dimaksimumkan"
+
+#: data/org.gnome.Music.gschema.xml:23
+msgid "Window maximized state."
+msgstr "Keadaan tetingkap dimaksimumkan."
+
+#: data/org.gnome.Music.gschema.xml:27
+msgid "Playback repeat mode"
+msgstr "Mod ulang main balik"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:29
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Nilai dikenal pasti sama ada mahu ulang atau rawakkan main balik menyeluruhi "
+"koleksi. Nilai-nilai dibenarkan adalah: none” (ulang dan kocok dimatikan), "
+"“song” (ulang lagu semasa), “all” (ulang senarai main, tanpa kocok), "
+"“shuffle” (kocok senarai main, sambung ulang semua)."
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Enable ReplayGain"
+msgstr "Benarkan Gandaan Main Semula"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Benarkan atau lumpuhkan Gandaan Main Semula untuk album"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Inital state has been displayed"
+msgstr "Keadaan awal telah dipaparkan"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid "Set to true when initial state has been displayed"
+msgstr "Tetapkan pada benar ketika keadaan awal telah dipaparkan"
+
+#: data/org.gnome.Music.gschema.xml:43
+msgid "Inhibit system suspend"
+msgstr "Rencat tangguh sistem"
+
+#: data/org.gnome.Music.gschema.xml:44
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "Benar atau lumpuhkan perencatan tangguh sistem ketika memainkan muzik"
+
+#: data/org.gnome.Music.gschema.xml:48
+msgid "Report music history to Last.fm"
+msgstr "Lapor sejarah muzik ke Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:49
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Benar atau lumpuhkan penghantaran scrobble dan maklumat \"semasa dimainkan\" "
+"ke Last.fm."
+
+#: data/ui/AboutDialog.ui.in:9
+msgid "Copyright © 2018 GNOME Music Developers"
+msgstr "Hak cipta © 2018 Para Pembangun Muzik GNOME"
+
+#: data/ui/AboutDialog.ui.in:10
+msgid "A music player and management application for GNOME."
+msgstr "Sebuah pemain muzik dan aplikasi pengurusan untuk GNOME."
+
+#: data/ui/AboutDialog.ui.in:12
+msgid "Visit GNOME Music website"
+msgstr "Lawati tapak sesawang Muzik GNOME"
+
+#: data/ui/AboutDialog.ui.in:13
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version.\n"
+"\n"
+"“Magic of the vinyl” by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+"https://www.flickr.com/photos/_spy_/12270839403"
+msgstr ""
+"Muzik GNOME merupakan perisian bebas; anda boleh mengedar ia semula dan/atau "
+"mengubah suainya di bawah terma-terma Lesen Awam Am GNU sepertimana yang "
+"diterbitkan oleh Free Software Foundation; sama ada versi 2 dari Lesen, atau "
+"(mengikut pilihan anda) mana-mana versi terkemudian.\n"
+"\n"
+"Muzik GNOME diedarkan dengan harapan ia akan berguna, tetapi TANPA APA-APA "
+"JAMINAN; tanpa jaminan dikenakan terhadap KEBOLEHDAGANGAN atau KESESUAIAN "
+"ATAS TUJUAN TERTENTU. Sila rujuk Lesen Awam Am GNU untuk perincian lanjut.\n"
+"\n"
+"Anda seharusnya telah menerima satu salinan Lesen Awam Am GNU bersama-sama "
+"dengan Muzik GNOME; jika tiada, sila rujuk kepada Free Software Foundation, "
+"Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"Para pengarang Muzik GNOME dengan ini memberi keizinan penggunaan pemalam-"
+"pemalam GStreamer serasi bukan-GPL dan diedar bersama-sama dengan GStreamer "
+"dan Muzik GNOME. Keizinan ini melangkaui keizinan yang diberikan oleh lesen "
+"GPL yang mana Muzik GNOME diliputi. Jika anda mengubah suai kod ini, anda "
+"boleh lanjutkan pengecualian ini pada versi kod anda, tetapi anda tidak "
+"diwajibkan membuatnya. Jika anda tidak mahu membuatnya, maka padam penyataan "
+"pengecualian ini dari versi anda.\n"
+"\n"
+"“Magic of the vinyl” oleh Sami Pyylampi image dilesenkan oleh CC-BY-SA 2.0 "
+"https://www.flickr.com/photos/_spy_/12270839403"
+
+#: data/ui/AlbumWidget.ui:105
+msgid "Released"
+msgstr "Dilepaskan"
+
+#: data/ui/AlbumWidget.ui:121
+msgid "Running Length"
+msgstr "Tempoh Dijalankan"
+
+#: data/ui/AlbumWidget.ui:166
+msgid "Composer"
+msgstr "Penggubah"
+
+#: data/ui/AppMenu.ui:20
+msgid "Last.fm Account"
+msgstr "Akaun Last.fm"
+
+#: data/ui/AppMenu.ui:39
+msgid "Report Music Listening"
+msgstr "Lapor Pendengaran Muzik"
+
+#: data/ui/AppMenu.ui:70
+msgid "_Keyboard Shortcuts"
+msgstr "Pintasan Papan _Kekunci"
+
+#: data/ui/AppMenu.ui:84
+msgid "_Help"
+msgstr "_Bantuan"
+
+#: data/ui/AppMenu.ui:98
+msgid "_About Music"
+msgstr "Perih_al Muzik"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Menu"
+
+#: data/ui/HeaderBar.ui:39 data/ui/SearchHeaderBar.ui:16
+msgid "Select"
+msgstr "Pilih"
+
+#: data/ui/HeaderBar.ui:61 data/ui/PlaylistDialog.ui:244
+#: data/ui/SearchHeaderBar.ui:38
+msgid "_Cancel"
+msgstr "_Batal"
+
+#: data/ui/HeaderBar.ui:80 data/ui/SearchHeaderBar.ui:57
+msgid "Search"
+msgstr "Gelintar"
+
+#: data/ui/HeaderBar.ui:103
+msgid "Back"
+msgstr "Undur"
+
+#: data/ui/help-overlay.ui:13
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Am"
+
+#: data/ui/help-overlay.ui:17
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Tutup tetingkap"
+
+#: data/ui/help-overlay.ui:24
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Gelintar"
+
+#: data/ui/help-overlay.ui:31
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Bantuan"
+
+#: data/ui/help-overlay.ui:38
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Pintasan"
+
+#: data/ui/help-overlay.ui:47
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Main Balik"
+
+#: data/ui/help-overlay.ui:51
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Main/Jeda"
+
+#: data/ui/help-overlay.ui:58
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Lagu berikutnya"
+
+#: data/ui/help-overlay.ui:65
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Lagu terdahulu"
+
+#: data/ui/help-overlay.ui:72
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Togol ulang"
+
+#: data/ui/help-overlay.ui:79
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Togol kocok"
+
+#: data/ui/help-overlay.ui:88
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigasi"
+
+#: data/ui/help-overlay.ui:92
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Pergi ke Album"
+
+#: data/ui/help-overlay.ui:99
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Pergi ke Artis"
+
+#: data/ui/help-overlay.ui:106
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Pergi ke Lagu"
+
+#: data/ui/help-overlay.ui:113
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Pergi ke Senarai-Main"
+
+#: data/ui/help-overlay.ui:120
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Kembali"
+
+#: data/ui/PlayerToolbar.ui:6
+msgid "Shuffle"
+msgstr "Kocok"
+
+#: data/ui/PlayerToolbar.ui:11
+msgid "Repeat All"
+msgstr "Ulang Semua"
+
+#: data/ui/PlayerToolbar.ui:16
+msgid "Repeat Song"
+msgstr "Ulang Lagu"
+
+#. Causes tracks to play in random order
+#: data/ui/PlayerToolbar.ui:21
+msgid "Shuffle/Repeat Off"
+msgstr "Kocok/Ulang Mati"
+
+#: data/ui/PlayerToolbar.ui:70
+msgid "Previous"
+msgstr "Terdahulu"
+
+#: data/ui/PlayerToolbar.ui:86 gnomemusic/widgets/playertoolbar.py:159
+msgid "Play"
+msgstr "Main"
+
+#: data/ui/PlayerToolbar.ui:102
+msgid "Next"
+msgstr "Berikutnya"
+
+#: data/ui/PlaylistContextMenu.ui:5
+msgctxt "context menu item"
+msgid "Play"
+msgstr "Main"
+
+#: data/ui/PlaylistContextMenu.ui:9
+msgid "Add to Playlist…"
+msgstr "Tambah ke Senarai Main…"
+
+#: data/ui/PlaylistContextMenu.ui:13
+msgid "Remove From Playlist"
+msgstr "Buang dari Senarai Main"
+
+#: data/ui/PlaylistControls.ui:6
+msgid "_Play"
+msgstr "_Main"
+
+#: data/ui/PlaylistControls.ui:10
+msgid "_Delete"
+msgstr "Pa_dam"
+
+#: data/ui/PlaylistControls.ui:14
+msgid "_Rename…"
+msgstr "_Nama Semula…"
+
+#: data/ui/PlaylistControls.ui:40
+msgid "Playlist Name"
+msgstr "Nama Senarai Main"
+
+#: data/ui/PlaylistControls.ui:74
+msgid "_Done"
+msgstr "_Selesai"
+
+#: data/ui/PlaylistDialog.ui:66
+msgid "Enter a name for your first playlist"
+msgstr "Masukkan satu nama untuk senarai main pertama anda"
+
+#: data/ui/PlaylistDialog.ui:92
+msgid "C_reate"
+msgstr "C_ipta"
+
+#: data/ui/PlaylistDialog.ui:155
+msgid "New Playlist…"
+msgstr "Senarai Main Baharu…"
+
+#: data/ui/PlaylistDialog.ui:169
+msgid "Add"
+msgstr "Tambah"
+
+#: data/ui/PlaylistDialog.ui:241
+msgid "Add to Playlist"
+msgstr "Tambah ke Senarai Main"
+
+#: data/ui/PlaylistDialog.ui:257
+msgid "_Add"
+msgstr "T_ambah"
+
+#: data/ui/SearchView.ui:44 gnomemusic/views/artistsview.py:59
+msgid "Artists"
+msgstr "Artis"
+
+#: data/ui/SearchView.ui:54 data/ui/SearchView.ui:107
+msgid "View All"
+msgstr "Lihat Semua"
+
+#: data/ui/SearchView.ui:97 gnomemusic/views/albumsview.py:62
+msgid "Albums"
+msgstr "Album"
+
+#: data/ui/SearchView.ui:150 gnomemusic/views/songsview.py:57
+msgid "Songs"
+msgstr "Lagu"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Pilih Semua"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Jangan Pilih Apa-apa"
+
+#: data/ui/SelectionBarMenuButton.ui:31 gnomemusic/widgets/headerbar.py:75
+msgid "Click on items to select them"
+msgstr "Klik pada item-item untuk memilihnya"
+
+#: data/ui/SelectionToolbar.ui:9
+msgid "_Add to Playlist"
+msgstr "T_ambah ke Senarai Main"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:749
+msgid "Most Played"
+msgstr "Terbanyak Dimainkan"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:786
+msgid "Never Played"
+msgstr "Tidak Sesekali Dimainkan"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:822
+msgid "Recently Played"
+msgstr "Dimainkan Baru-Baru Ini"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:868
+msgid "Recently Added"
+msgstr "Ditambah Baru-Baru Ini"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:913
+msgid "Favorite Songs"
+msgstr "Lagu Kegemaran"
+
+#: gnomemusic/gstplayer.py:403
+msgid "Unable to play the file"
+msgstr "Tidak boleh memainkan fail"
+
+#: gnomemusic/gstplayer.py:409
+msgid "_Find in {}"
+msgstr "_Cari dalam {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:420
+msgid " and "
+msgstr " dan "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:423
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:425
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} diperlukan untuk memainkan fail, tetapi tidak dipasang."
+msgstr[1] "{} diperlukan untuk memainkan fail, tetapi tidak dipasang."
+
+#: gnomemusic/inhibitsuspend.py:72
+msgid "Playing music"
+msgstr "Memainkan muzik"
+
+#: gnomemusic/utils.py:64
+msgid "Unknown album"
+msgstr "Album tidak diketahui"
+
+#: gnomemusic/utils.py:85
+msgid "Unknown Artist"
+msgstr "Artis Tidak Diketahui"
+
+#: gnomemusic/views/emptyview.py:73
+msgid "Your XDG Music directory is not set."
+msgstr "Direktori Muzik XDG anda tidak ditetapkan."
+
+#: gnomemusic/views/emptyview.py:80
+msgid "Music folder"
+msgstr "Folder muzik"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:84
+msgid "The contents of your {} will appear here."
+msgstr "Kandungan {} anda akan muncul di sini."
+
+#: gnomemusic/views/emptyview.py:120
+msgid "Hey DJ"
+msgstr "Hai DJ"
+
+#: gnomemusic/views/emptyview.py:130 gnomemusic/views/emptyview.py:136
+msgid "No music found"
+msgstr "Tiada muzik ditemui"
+
+#: gnomemusic/views/emptyview.py:138
+msgid "Try a different search"
+msgstr "Cuba gelintar lain"
+
+#: gnomemusic/views/emptyview.py:144
+msgid "GNOME Music could not connect to Tracker"
+msgstr "Muzik GNOME tidak dapat bersambung dengan Penjejak"
+
+#: gnomemusic/views/emptyview.py:147
+msgid "Your music files cannot be indexed without Tracker running"
+msgstr "Fail muzik anda tidak dapat diindekskan tanpa menjalankan Penjejak"
+
+#: gnomemusic/views/emptyview.py:155
+msgid "Your system Tracker version seems outdated"
+msgstr "Versi Penjejak sistem anda nampaknya telah lapuk"
+
+#: gnomemusic/views/emptyview.py:158
+msgid "Music needs Tracker version 2.3.0 or higher"
+msgstr "Muzik memerlukan Penjejak versi 2.3.0 atau lebih terkini"
+
+#: gnomemusic/views/playlistsview.py:58
+msgid "Playlists"
+msgstr "Senarai Main"
+
+#: gnomemusic/views/searchview.py:363
+msgid "Artists Results"
+msgstr "Keputusan Artis"
+
+#: gnomemusic/views/searchview.py:377
+msgid "Albums Results"
+msgstr "Keputusan Album"
+
+#: gnomemusic/widgets/albumwidget.py:165
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minit"
+msgstr[1] "{} minit"
+
+#: gnomemusic/widgets/disclistboxwidget.py:76
+msgid "Disc {}"
+msgstr "Cakera {}"
+
+#: gnomemusic/widgets/headerbar.py:72
+msgid "Selected {} item"
+msgid_plural "Selected {} items"
+msgstr[0] "{} item terpilih"
+msgstr[1] "{} item terpilih"
+
+#: gnomemusic/widgets/notificationspopup.py:171
+msgid "Loading"
+msgstr "Memuatkan"
+
+#: gnomemusic/widgets/notificationspopup.py:244
+msgid "_Undo"
+msgstr "_Buat asal"
+
+#: gnomemusic/widgets/notificationspopup.py:259
+msgid "Playlist {} removed"
+msgstr "Senarai main {} telah dibuang"
+
+#: gnomemusic/widgets/notificationspopup.py:263
+msgid "{} removed from {}"
+msgstr "{} telah dibuang daripada {}"
+
+#: gnomemusic/widgets/playertoolbar.py:156
+msgid "Pause"
+msgstr "Jeda"
+
+#: gnomemusic/widgets/playlistcontrols.py:112
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} Lagu"
+msgstr[1] "{} Lagu"
diff --git a/po/nb.po b/po/nb.po
new file mode 100644
index 00000000..0f0afac8
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,596 @@
+# Norwegian bokmål translation of gnome-music.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Kjartan Maraas <kmaraas@gnome.org>, 2012-2022.
+# Åka Sikrom <a4NOSPAMPLEASETHANKYOU@hush.com>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music 4.2\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2022-02-19 12:39+0000\n"
+"PO-Revision-Date: 2022-03-17 14:12+0100\n"
+"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
+"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
+"Language: no\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/application.py:61
+#: gnomemusic/window.py:71
+msgid "Music"
+msgstr "Musikk"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Spill av og organiser musikksamlingen din"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "En enkel og fornøyelig måte å spille din musikk."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr "Finn spor i din lokale samling, bruk automatisk genererte spillelister eller lage en ny."
+
+#: data/org.gnome.Music.appdata.xml.in.in:149
+msgid "The GNOME Music developers"
+msgstr "GNOME Music-utviklerene"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Musikkavspiller"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Musikk;Spiller;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Vindustørrelse"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Vindustørrelse (bredde og høyde)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Vindu maksimert"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Vindu maksimert."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Repeteringsmodus for avspilling"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Verdien bestemmer om samlingen skal spilles av i blandet rekkefølge og/eller "
+"om avspilling skal gjentas. Gyldige verdier er «none» (gjentakelse og "
+"blanding er slått av), «song» (gjenta sangen som spilles av nå), "
+"«all» (gjenta spillelista, uten å blande den) og «shuffle» (bland "
+"spillelista, og - implisitt - gjenta den)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Slå på ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Slår på eller av ReplayGain for album"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Hindre hvilemodus"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "Slår av eller på hindring av hvilemodus når musikk blir spilt av"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Rapporter musikkhistorikk til Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr "Slår av eller på sending av musikkinfo og låt som spilles til Last.fm."
+
+#: data/ui/AboutDialog.ui.in:9
+msgid "Copyright © 2018 GNOME Music Developers"
+msgstr "Opphavsrett © 2016 GNOME Music-utviklerene"
+
+#: data/ui/AboutDialog.ui.in:10
+msgid "A music player and management application for GNOME."
+msgstr "Et program for avspilling og håndtering av musikk for GNOME."
+
+#: data/ui/AboutDialog.ui.in:12
+msgid "Visit GNOME Music website"
+msgstr "Besøk nettstedet for GNOME Music"
+
+#: data/ui/AboutDialog.ui.in:13
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+"GNOME musikk er fri programvare. Du kan redistribuere og/eller endre programmet under betingelsene gitt i GNU General Public License som utgitt av Free Software Foundation; enten versjon 2 av lisensen, eller (hvis du ønsker det) enhver senere versjon.\n"
+"\n"
+"GNOME musikk distribueres i håp om at programmet er nyttig, men uten NOEN GARANTI, ikke engang implisitt garanti om at det er SALGBART eller PASSER ET BESTEMT FORMÅL. Se GNU General Public License for detaljer.\n"
+"\n"
+"Du skal ha mottatt en kopi av GNU General Public License sammen med dette programmet. Hvis dette ikke er tilfelle, kan du skrive til Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n"
+"\n"
+"GNOME musikk utviklerene gir herved rettigheter for bruk og distribusjon av GStreamer-tillegg som ikke er kompatible med GPL sammen med GStreamer og GNOME musikk. Denne rettigheten går foran rettighetene som gis av GPL-lisensen som gjelder for GNOME musikk. Hvis du endrer denne koden kan du bruke dette unntaket for din versjon av koden, men du er ikke pliktig til gjøre dette. Hvis du ikke ønsker å gjøre dette kan du slette denne teksten fra din versjon."
+
+#: data/ui/AlbumWidget.ui:86 data/ui/PlayerToolbar.ui:88
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:168
+msgid "Play"
+msgstr "Spill av"
+
+#: data/ui/AlbumWidget.ui:132 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "S_pill av"
+
+#: data/ui/AlbumWidget.ui:136
+msgid "Add to _Favorite Songs"
+msgstr "Legg til i _favorittlåter"
+
+#: data/ui/AlbumWidget.ui:140 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Legg til i spilleliste …"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm konto"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Rapporter det du lytter til"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Tastatursnarveier"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Hjelp"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Om Musikk"
+
+#: data/ui/EmptyView.ui:26 data/ui/InitialState.ui:13
+msgid "Welcome to Music"
+msgstr "Velkommen til Musikk"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Meny"
+
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Velg"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:211
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "A_vbryt"
+
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Søk"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "Tilbake"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Generelt"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Lukk vindu"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Søk"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Hjelp"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Snarveier"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Avspilling"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Spill av/pause"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Neste sang"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Forrige sang"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Slå av/på gjenta"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Slå av/på tilfeldig rekkefølge"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigasjon"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Gå til album"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Gå til artister"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Gå til sanger"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Gå til spillelister"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Gå tilbake"
+
+#: data/ui/InitialState.ui:25
+msgid "The contents of your Music Folder will appear here"
+msgstr "Innholdet i din musikkmappe vises her."
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm er en tjeneste for utforsking av musikk som gir deg personlige "
+"anbefalinger basert på det du lytter til."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Musikkrapportering er ikke satt opp"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Logg in på din Last.fm konto for å rapportere det du lytter til."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Logg inn"
+
+#: data/ui/PlayerToolbar.ui:75
+msgid "Previous"
+msgstr "Forrige"
+
+#: data/ui/PlayerToolbar.ui:107
+msgid "Next"
+msgstr "Neste"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Slett"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "End_re navn …"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Navn på spilleliste"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "Fer_dig"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Oppgi et navn for din første spilleliste"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Lag"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Ny spilleliste …"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Legg til"
+
+#: data/ui/PlaylistDialog.ui:200
+msgid "Add to Playlist"
+msgstr "Legg til i spilleliste"
+
+#: data/ui/PlaylistDialog.ui:220
+msgid "_Add"
+msgstr "_Legg til"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artister"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Vis alle"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:54
+msgid "Albums"
+msgstr "Album"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Sanger"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Velg alle"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Velg ingen"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Klikk på oppføringer for å velge dem"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Legg til i spilleliste"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Fje_rn fra spilleliste"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Mest spilt"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Aldri spilt"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Nylig spilt"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Nylig lagt til"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Favorittlåter"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Kan ikke spille av filen"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Finn i {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " og "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} kreves for å spille av filen, men er ikke installert."
+msgstr[1] "{} kreves for å spille av filen, men er ikke installert."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Spiller musikk"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "Bland"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Gjenta sang"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Gjenta alle"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr "Bland/Gjenta av"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Spilleliste {} fjernet"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Angre"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} fjernet fra {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Ukjent album"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Ukjent artist"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Din XDG-mappe er ikke satt."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Musikkmappe"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Innholdet i din {} vises her."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Fant ingen musikk"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Prøv et annet søk"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME musikk kunne ikke koble til Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Musikkfilene dine kan ikke indekseres hvis ikke Tracker kjører."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Systemets versjon av Tracker ser ut til å være utdatert."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Musikk trenger Tracker versjon 3.0.0 eller høyere."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Spillelister"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Artistresultater"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Albumresultater"
+
+#: gnomemusic/widgets/albumwidget.py:240
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minutt"
+msgstr[1] "{} minutter"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Plate {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} sang valgt"
+msgstr[1] "{} sanger valgt"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Det du lytter til rapporteres til Last.fm"
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Det du lytter til rapporteres ikke til Last.fm"
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Logget in som {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Konfigurer"
+
+#: gnomemusic/widgets/playertoolbar.py:165
+msgid "Pause"
+msgstr "Pause"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} sang"
+msgstr[1] "{} sanger"
diff --git a/po/ne.po b/po/ne.po
new file mode 100644
index 00000000..8230c8b4
--- /dev/null
+++ b/po/ne.po
@@ -0,0 +1,643 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music gnome 3.14\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2022-08-27 13:27+0000\n"
+"PO-Revision-Date: 2022-09-08 02:34+0545\n"
+"Last-Translator: Pawan Chitrakar <chautari@gmail.com>\n"
+"Language-Team: Nepali Translation Team <chautari@gmail.com>\n"
+"Language: ne\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6 data/org.gnome.Music.desktop.in.in:3
+#: gnomemusic/about.py:236 gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "सङ्गीत"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7 data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "तपाईँको सङ्गीत सङ्ग्रह बजाउनुहोस् र सङ्गठित गर्नुहोस्"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "तपाईंको संगीत बजाउने सजिलो र रमाइलो तरिका।"
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists or curate a "
+"fresh one."
+msgstr ""
+"तपाईँको स्थानीय सङ्कलनमा ट्रयाकहरू फेला पार्नुहोस्, स्वचालित रूपमा सिर्जना गरिएको बजाउने सूची प्रयोग "
+"गर्नुहोस् वा नया सिर्जना गर्नुहोस् ।"
+
+#: data/org.gnome.Music.appdata.xml.in.in:167
+msgid "The GNOME Music developers"
+msgstr "जिनोम सङ्गीत विकासकर्ता"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "सङ्गीत बजाउने"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "सङ्गीत प्लेयर."
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "सञ्झ्याल साइज"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "सञ्झ्यालको उचाइ र चौडाई."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "सञ्झ्यालको अधिकतम स्थिति"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "सञ्झ्यालको अधिकतम स्थिति."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "मोड दोहोर्याउनुहोस्"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the collection. Allowed "
+"values are: “none” (repeat and shuffle are off), “song” (repeat current song), "
+"“all” (repeat playlist, no shuffle), “shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"मानले संग्रहको माध्यमबाट प्लेब्याक दोहोर्याउने वा अनियमित गर्ने कि नगर्ने पहिचान गर्दछ। अनुमति प्राप्त "
+"मानहरू हुन्: \"कुनै पनि छैन\" (पुनरावृत्ति र शफल बन्द छन्), \"गीत\" (पुनरावृत्ति हालको गीत), \"सबै"
+"\" (प्लेलिस्ट दोहोर्याउनुहोस्, कुनै शफल छैन), \"शफल\" (शफल प्लेलिस्ट, सबै दोहोर्याउनुहोस् अनुमान गर्नुहोस्)।"
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "पुन: प्लेगेन सक्षम पार्नुहोस्"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "एल्बमका लागि पुन: प्लेगेन सक्षम वा अक्षम पार्दछ"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "प्रणाली निलम्बन रोक्नुहोस्"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "सङ्गीत बजाउँदा अवरोध प्रणाली निलम्बन सक्षम वा अक्षम पार्दछ"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Last.fm सङ्गीत इतिहास प्रतिवेदन गर्नुहोस्"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid "Enables or disables sending scrobbles and the “currently playing” info to Last.fm."
+msgstr "Last.fm पठाउन स्क्रोब्ल्स र \"हालै बजिरहेको\" सूचना सक्षम वा असक्षम पार्दछ ।"
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87 data/ui/PlaylistControls.ui:101
+#: gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "प्ले गर्नुहोस्"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5 data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "प्ले गर्नुहोस्"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "मनपर्ने गीतहरू थप्नुहोस्"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "बजाइने सुचिमा थप्नुहोस्…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm खाता"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "सङ्गीत सुन्ने प्रतिवेदन गर्नुहोस्"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "कुञ्जीपाटी सर्टकट"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "सहयोग"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "सङ्गीत बारेमा"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "सङ्गीतमा स्वागत छ"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "सूची"
+
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "चयन गर्नुहोस्"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:213 data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_रद्द"
+
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "खोजी"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "पछाडि"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "सामान्य"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "सञ्झ्याल बन्द गर्नुहोस्"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "खोज"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "मद्दत"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "सर्टकटहरू"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "प्लेब्याक"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "प्ले/पज गर्नुहोस्"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "अर्को गीत"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "_अघिल्लो गीत"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "दोहोर्याउने टगल गर्नुहोस्"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "फेरबदल टगल गर्नुहोस्"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "नेभिगेशन"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "एल्बममा जानुहोस्"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "कलाकारहरू मा जानुहोस्"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "गीतहरूमा जानुहोस्"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "बजाइने सुचिमा जानुहोस्"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "पछाडी जानुहोस्"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised recommendations based "
+"on the music you listen to."
+msgstr ""
+"Last.fm एउटा सङ्गीत आविष्कार सेवा हो जसले तपाईँले सुन्नुभएको सङ्गीतको आधारमा व्यक्तिगत सिफारिस दिन्छ।"
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "सङ्गीत रिपोर्टिङ सेटअप छैन"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "तपाईँको सङ्गीत सुन्न प्रतिवेदन गर्न तपाईँको Last.fm खातामा लगइन गर्नुहोस् ।"
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "लगइन"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "अघिल्लो"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "पछिल्लो"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "मेट्नुहोस्"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "पुन: नामाकरण गर्नुहोस्…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "बजाउने सूची नाम"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "गरियो"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "तपाईँको पहिलो बजाउने सूचीका लागि नाम प्रविष्ट गर्नुहोस्"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "सिर्जना गर्नुहोस्"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "नया बजाउने सूची…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "थप्नुहोस्"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "बजाइने सुचिमा थप्नुहोस्"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "थप्नुहोस्"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "कलाकारहरू"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "सबै हेर्नुहोस्"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "एल्बमहरू"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "गीतहरू"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "सबै छान्नुहोस्"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "कुनै पनि चयन नगर्नुहोस्"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "वस्तुहरू चयनका लागि क्लिक गर्नुहोस्"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "बजाइने सुचिमा थप्नुहोस्"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "बजाउने सूची हटाउनुहोस्"
+
+#: gnomemusic/about.py:238
+msgid "The GNOME Project"
+msgstr "जिनोम परियोजना"
+
+#: gnomemusic/about.py:242
+msgid "translator-credits"
+msgstr ""
+"Launchpad Contributions:\n"
+" Michael Terry https://launchpad.net/~mterry\n"
+" Yogesh Ojha https://launchpad.net/~yogeshojha\n"
+" sarojdhakal https://launchpad.net/~lotusnagarkot"
+
+#: gnomemusic/about.py:246
+msgid "Copyright The GNOME Music Developers"
+msgstr "प्रतिलिपि अधिकार जिनोम सङ्गीत विकासकर्ताहरू"
+
+#: gnomemusic/about.py:249
+msgid "Translated by"
+msgstr "अनुवाद"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "धेरै जसो बजाईने"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "कहिल्यै नबजेको"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "हालै बजेको"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "हालै थपेको"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "मनपर्ने गीतहरू"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "फाइल बजाउन असक्षम"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "{} फेला पार्नुहोस्"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " र "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "फाइल बजाउम {} आवश्यक छ, तर स्थापना गरिएको छैन ।"
+msgstr[1] "फाइल बजाउम {} आवश्यक छ, तर स्थापना गरिएको छैन ।"
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "सङ्गीत बजाइने"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "फिट्नुहोस्"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "गाना दोहोर्याउनुस्"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "सबै दोहोर्याउनुस्"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr "फिट्नुहोस्/दोहोर्याउनुस् बन्द"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "बजाउने सूची {} हटाइयो"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "पुर्वस्थितिमा फर्काउनुहोस्"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} बाट {} हटाइयो"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "अज्ञात एल्बम"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "अज्ञात कलाकार"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "तपाईँको XDG सङ्गीत डाइरेक्टरी सेट गरिएको छैन ।"
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "सङ्गीत फोल्डर"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "तपाईँको {} का सामग्रीहरू यहाँ देखा पर्नेछन् ।"
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "सङ्गीत भेटिएन"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "फरक खोज कोशिश गर्नुहोस्"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "जिनोम सङ्गीत ट्र्याकरमा जडान गर्न सकेन ।"
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "ट्र्याकर नचलाईकन तपाईँको सङ्गीत फाइलहरू अनुक्रमण गर्न सकिँदैन ।"
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "तपाईँको प्रणाली ट्र्याकर संस्करण पुरानो जस्तो देखिन्छ ।"
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "सङ्गीतलाई ट्रयाकर संस्करण 3.0.0 वा उच्चको आवश्यकता पर्दछ।"
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "सुचिहरू"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "कलाकारहरू नतिजा"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "एल्बमहरूको नतिजा"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} मिनेट"
+msgstr[1] "{} मिनेट"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "डिस्क {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} गीत छानियो"
+msgstr[1] "{} गीतहरू छानियो"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "तपाईंको संगीत सुन्ने Last.fm मा रिपोर्ट गरिएको छ।"
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "तपाईँको सङ्गीत सुन्ने Last.fm मा रिपोर्ट गरिएको छैन ।"
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "{} लगईन गरियो"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "कन्फिगर"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "पज गर्नुहोस्"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} गीत"
+msgstr[1] "{} गीतहरू"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "जिनोम सङ्गीत बजाउने र व्यवस्थापन अनुप्रयोग."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "जिनोम सङ्गीत वेबसाइट हेर्नुहोस्"
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "तपाईँको सङ्गीत फोल्डरको सामाग्री यहाँ देखा पर्नेछ ।"
+
+#~ msgid "Window position"
+#~ msgstr "सञ्झ्यालको स्थिति"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "सञ्झ्यालको स्थान(X र Y)."
+
+#, fuzzy
+#~ msgid "Search mode"
+#~ msgstr "मोड:"
+
+#, fuzzy
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "विण्डो टास्कबारमा छैनभने ठीक "
+
+#~ msgid "GNOME Music"
+#~ msgstr "जिनोम सङ्गित"
+
+#~ msgid "Untitled"
+#~ msgstr "शीर्षक नदिएको"
+
+#~ msgid "Not playing"
+#~ msgstr "बजेन"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "%s बाट %s देखि"
+
+#~ msgid "All"
+#~ msgstr "सबै"
+
+#~ msgid "Artist"
+#~ msgstr "कलाकार:"
+
+#~ msgid "Album"
+#~ msgstr "एल्बम:"
+
+#~ msgid "Track Title"
+#~ msgstr "गाना शीर्षक"
+
+#~ msgid "Local"
+#~ msgstr "स्थानीय"
+
+#~ msgid "Sources"
+#~ msgstr "स्रोत"
+
+#~ msgid "Match"
+#~ msgstr "सबै मिलाउनुहोस्"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "%d बस्तु चयन भयो"
+#~ msgstr[1] "%d बस्तु चयन भयो"
+
+#~ msgid "All Artists"
+#~ msgstr "कलाकारहरू"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Empty"
+#~ msgstr "खाली"
+
+#, fuzzy
+#~ msgid "Running Length"
+#~ msgstr "चलिरहेको"
+
+#~ msgid "_New Playlist"
+#~ msgstr "नयाँ सूची"
+
+#~ msgid "_Quit"
+#~ msgstr "अन्त्य गर्नुहोस्"
+
+#~ msgid "Select Playlist"
+#~ msgstr "सूचिचयन गर्नुहोस्..."
diff --git a/po/nl.po b/po/nl.po
new file mode 100644
index 00000000..4a365805
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,788 @@
+# Dutch translation for gnome-music.
+#
+# This file is distributed under the same license as the gnome-music package.
+#
+# Erwin Poeze <donnut@outlook.com>, 2013, 2014.
+# Reinout van Schouwen <reinouts@gnome.org>, 2013.
+# Wouter Bolsterlee <wbolster@gnome.org>, 2013.
+# Hannie Dumoleyn <hannie@ubuntu-nl.org>, 2015.
+# Justin van Steijn <jvs@fsfe.org>, 2016.
+# Nathan Follens <nfollens@gnome.org>, 2018-2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-09-03 16:14+0200\n"
+"Last-Translator: Nathan Follens <nfollens@gnome.org>\n"
+"Language-Team: GNOME-NL https://matrix.to/#/#nl:gnome.org\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+"X-Project-Style: gnome\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Muziek"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Beluister en beheer uw muziekverzameling"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Een eenvoudige en aangename manier om uw muziek af te spelen."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Vind nummers in uw lokale bibliotheek, maak gebruik van automatisch "
+"gegenereerde afspeellijsten of stel er zelf eentje samen."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "De GNOME Muziek-ontwikkelaars"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Muziekspeler"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;Muziek;Speler;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Venstergrootte"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Venstergrootte (breedte en hoogte)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Venster gemaximaliseerd"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Venster is gemaximaliseerd."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Modus herhaald afspelen"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Waarde bepaalt of de verzameling herhaald of gehusseld afgespeeld moet "
+"worden. Toegestaan zijn: ‘none’ (uit), ‘song’ (huidige nummer herhalen), "
+"’all’ (afspeellijst herhalen), ‘shuffle’ (speellijst husselen en herhalen)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "ReplayGain inschakelen"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Schakelt ReplayGain in of uit voor albums"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Pauzestand verhinderen"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Schakelt het verhinderen van de pauzestand van het systeem in of uit tijdens "
+"het afspelen van muziek"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Luistergeschiedenis doorgeven aan Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Schakelt het verzenden van scrobbles en de ‘Luistert nu naar’-informatie "
+"naar Last.fm in of uit."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Afspelen"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "Afs_pelen"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Toevoegen aan _favoriete nummers"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "Toevoegen aan _afspeellijst…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm-account"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Luistergeschiedenis doorgeven"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Sneltoetsen"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Hulp"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Over Muziek"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Welkom bij Muziek"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menu"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Selecteren"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Annuleren"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Zoeken"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Terug"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Algemeen"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Venster sluiten"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Zoeken"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Hulp"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Sneltoetsen"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Afspelen"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Afspelen/pauzeren"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Volgend nummer"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Vorig nummer"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Herhalen in-/uitschakelen"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Willekeurig in-/uitschakelen"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigatie"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Naar Albums gaan"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Naar Artiesten gaan"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Naar Nummers gaan"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Naar Afspeellijsten gaan"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Teruggaan"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm is een muziekontdekkingsdienst die u gepersonaliseerde aanbevelingen "
+"geeft op basis van de muziek die u beluistert."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Luistergeschiedenis doorgeven is niet ingesteld"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Meld u aan bij uw Last.fm-account om uw luistergeschiedenis door te geven."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Aanmelden"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Vorige"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Volgende"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "Verwij_deren"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "He_rnoemen…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Afspeellijstnaam"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Klaar"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Voer een naam in voor uw eerste afspeellijst"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Maken"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Nieuwe afspeellijst…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Toevoegen"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Toevoegen aan afspeellijst"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Toevoegen"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artiesten"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Alles tonen"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Muziekalbum"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Nummers"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Alles selecteren"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Niets selecteren"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Klik op items om deze te selecteren"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "Toevoegen aan _afspeellijst"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Ve_rwijderen uit afspeellijst"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Het GNOME-project"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"Erwin Poeze <donnut@outlook.com>\n"
+"Reinout van Schouwen <reinouts@gnome.org>\n"
+"Wouter Bolsterlee <wbolster@gnome.org>\n"
+"Hannie Dumoleyn <hannie@ubuntu-nl.org>\n"
+"Justin van Steijn <jvs@fsfe.org>\n"
+"Nathan Follens <nfollens@gnome.org>\n"
+"Meer info over GNOME-NL https://nl.gnome.org"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright de GNOME Muziek-ontwikkelaars"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Vertaald door"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Meest afgespeeld"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Nooit afgespeeld"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Onlangs afgespeeld"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Onlangs toegevoegd"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Favoriete nummers"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Kan het bestand niet afspelen"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Zoeken in {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " en "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] ""
+"{} is vereist om het bestand af te spelen, maar is niet geïnstalleerd."
+msgstr[1] ""
+"{} zijn vereist om het bestand af te spelen, maar zijn niet geïnstalleerd."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Muziek wordt afgespeeld"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Willekeurig/herhalen uit"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Nummer herhalen"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Alles herhalen"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Willekeurig"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Afspeellijst {} verwijderd"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Ongedaan maken"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} verwijderd uit {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Onbekend album"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Onbekende artiest"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Uw XDG-muziekmap is niet ingesteld."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Muziekmap"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "De inhoud van uw {} zal hier verschijnen."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Geen muziek gevonden"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Probeer een andere zoekopdracht"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Muziek kon geen verbinding maken met Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Uw muziekbestanden kunnen niet geïndexeerd worden zonder dat Tracker wordt "
+"uitgevoerd."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Uw versie van Tracker is verouderd."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Muziek vereist versie 3.0.0 of hoger van Tracker."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Afspeellijsten"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Artiestresultaten"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Albumresultaten"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minuut"
+msgstr[1] "{} minuten"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Schijf {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} nummer geselecteerd"
+msgstr[1] "{} nummers geselecteerd"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Uw luistergeschiedenis wordt doorgegeven aan Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Uw luistergeschiedenis wordt niet doorgegeven aan Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Aangemeld als {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Configureren"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pauzeren"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} nummer"
+msgstr[1] "{} nummers"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Zoek naar nummers, artiesten, albums en afspeellijsten"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Een muziekspeler en beheertoepassing voor Gnome."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Bezoek de Gnome Muziek-website"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "Gnome Muziek is vrije software; u mag het verder verspreiden en/of "
+#~ "wijzigen onder de voorwaarden van de GNU General Public License zoals "
+#~ "gepubliceerd door de Free Software Foundation, naar keuze ofwel onder "
+#~ "versie 2 ofwel onder een nieuwere versie van die licentie.\n"
+#~ "\n"
+#~ "Gnome Muziek wordt uitgegeven in de hoop dat het nuttig is, maar ZONDER "
+#~ "ENIGE GARANTIE; zelfs zonder de impliciete garantie van VERKOOPBAARHEID "
+#~ "of GESCHIKTHEID VOOR EEN BEPAALD DOEL. Zie de GNU General Public License "
+#~ "voor meer details.\n"
+#~ "\n"
+#~ "U zou een kopie van de GNU General Public Licence ontvangen moeten hebben "
+#~ "samen met Gnome Muziek; indien dit niet zo is, schrijf dan naar de Free "
+#~ "Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA "
+#~ "02110-1301 USA.\n"
+#~ "\n"
+#~ "De makers van Gnome Muziek verlenen hierbij toestemming om niet-GPL-"
+#~ "verenigbare GStreamer-plugins te gebruiken en te distribueren samen met "
+#~ "GStreamer en Gnome Muziek. Deze toestemming overstijgt en gaat verder dan "
+#~ "de toestemming verleend door de GPL-licentie waaronder Gnome Muziek "
+#~ "ressorteert. Als u deze code bewerkt kunt u deze uitzondering van "
+#~ "toepassing verklaren op uw versie van de code, maar u bent hiertoe niet "
+#~ "verplicht. Als u besluit de uitzondering niet van toepassing te "
+#~ "verklaring, verwijder dan deze verklaring uit uw versie."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "De inhoud van uw muziekmap zal hier verschijnen"
+
+#~ msgid "GNOME Music"
+#~ msgstr "Gnome Muziek"
+
+#~ msgid "Window position"
+#~ msgstr "Vensterpositie"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Vensterpositie (x en y)."
+
+#~ msgid "Loading"
+#~ msgstr "Laden"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Toevoegen aan afspeellijst…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Een eenvoudige manier om uw muziek af te spelen. Ontdek automatisch "
+#~ "muziek op uw computer, op het lokale netwerk en bij internetdiensten."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Zoek nummers in uw lokale verzameling, haal muziek op van DLNA-servers of "
+#~ "probeer eens iets nieuws met de Jamendo- en Magnatune-diensten."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Initiële status is al weergegeven"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Inschakelen wanneer de initiële status al is weergegeven"
+
+#~ msgid "Released"
+#~ msgstr "Uitgegeven"
+
+#~ msgid "Running Length"
+#~ msgstr "Speelduur"
+
+#~ msgid "Composer"
+#~ msgstr "Componist"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Afspelen"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hoi DJ"
+
+#~ msgid "All"
+#~ msgstr "Alles"
+
+#~ msgid "Artist"
+#~ msgstr "Artiest"
+
+#~ msgid "Album"
+#~ msgstr "Album"
+
+#~ msgid "Track Title"
+#~ msgstr "Titel van het nummer"
+
+#~ msgid "Local"
+#~ msgstr "Lokaal"
+
+#~ msgid "Sources"
+#~ msgstr "Bronnen"
+
+#~ msgid "Match"
+#~ msgstr "Overeenkomst"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "Naamloos"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Muziek is de nieuwe muziekspeler van Gnome."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "Zoekmodus"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Bij ‘true’ wordt de zoekbalk getoond."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Notificatiemodus"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Schakelt afspeelnotificaties in of uit"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "%d item geselecteerd"
+#~ msgstr[1] "%d items geselecteerd"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Empty"
+#~ msgstr "Leeg"
+
+#~ msgid "_Quit"
+#~ msgstr "_Afsluiten"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Afspeellijst selecteren"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an|de|het|een"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr ""
+#~ "Maximum aantal weer te geven tekens in de naam van het nummer in "
+#~ "artiestweergave"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Deze instelling wijzigt het aantal tekens dat wordt weergegeven in de "
+#~ "titel van het nummer in artiestweergave voor deze wordt afgekort. Stel in "
+#~ "als -1 om uit te schakelen"
+
+#~ msgid "the a an"
+#~ msgstr "the de het een a an"
+
+#~ msgid "All Artists"
+#~ msgstr "Alle artiesten"
+
+#~ msgid "Not playing"
+#~ msgstr "Afspelen gestopt"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "door %s, van %s"
diff --git a/po/oc.po b/po/oc.po
new file mode 100644
index 00000000..bdaa8499
--- /dev/null
+++ b/po/oc.po
@@ -0,0 +1,753 @@
+# Occitan translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Cédric Valmary (totenoc.eu) <cvalmary@yahoo.fr>, 2016, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-15 11:15+0200\n"
+"Last-Translator: Quentin PAGÈS\n"
+"Language-Team: Tot En Òc\n"
+"Language: oc\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+"X-Project-Style: gnome\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Musica"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Jogar e organizar vòstra discotèca"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Un biais simple e agradiu de jogar vòstra musica."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Trobatz las pistas de vòstra colleccion locala, utilizatz las listas "
+"d’escota generadas automaticament o creatz-ne una novèla."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Los desvolopaires de l'aplicacion Musica de GNOME"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Lector de musica"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "musica;lector de musica;player;music;legidor;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Talha de la fenèstra"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "La talha de la fenèstra (en largor e nautor)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Fenèstra maximizada"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Estat maximizat de la fenèstra."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Mòde de lectura repeticion"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Valor qu'indican se cal repetir o rendre aleatòria la lectura de las musicas "
+"de la discotèca. Las valors possiblas son : « none » (pas cap, la repeticion "
+"e la mescla son desactivats), « song » (repetís lo tròç actual), « all "
+"» (rejòga tota la lista de lectura, sens mescla), « shuffle » (mescla la "
+"lista de lectura, en supausant de tot rejogar)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Activar ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Activa o desactiva ReplayGain pels albums"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr ""
+"Permet a las aplicacions d'empachar l'ivernacion automatica del sistèma"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Activa o desactiva l’inibicion de la velha del sistèma quand la musica jòga"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Enviar l'istoric musical a Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Activa o desactiva lo mandadís de scrobbles e d’informacion « en lectura » a "
+"Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Lectura"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Legir"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Apondre als _favorits"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Apondre a la lista de lectura…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Compte Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Senhalar las escotas musicalas"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Acorchis de clavièr"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "A_juda"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_A prepaus de Musica"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "La benvenguda a Musica"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menú"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Seleccionar"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "A_nullar"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Recercar"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Retorn"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "General"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Tampar la fenèstra"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Recèrca"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Ajuda"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Acorchis"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Lectura"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Lectura/Pausa"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Tròç seguent"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Tròç precedent"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Bascular la repeticion"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Bascular la lectura aleatòri"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigacion"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Anar als albums"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Anar als artistas"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Anar a las cançons"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Anar a las listas de lectura"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Tornar en arrièr"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm es un servici de descobèrta de musica que vos dòna de recomandacions "
+"personalizadas segon la musica qu’escotatz."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Lo senhalament musical es pas configurat"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Connectatz-vos a vòstre compte Last.fm per enviar vòstras escotas musicalas."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Identificant"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Precedent"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Seguent"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Suprimir"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Renomenar…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Nom de la lista de lectura"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Acabat"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Sasissètz un nom per la primièra lista de lectura"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "C_rear"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Lista de lectura novèla…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Apondre"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Apondre a la lista de lectura"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Apondre"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artistas"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Afichar tot"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albums"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Tròces"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Seleccionar tot"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Seleccionar pas res"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Clicatz suls elements per los seleccionar"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Apondre a la lista de lectura"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Suprimir de la lista de lectura"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Lo projècte GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Quentin PAGÈS"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright Los desvolopaires de l'aplicacion Musica de GNOME"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Traduch per"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Los mai jogats"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Pas jamai jogats"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Jogats recentament"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Aponduts recentament"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Tròces favorits"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Impossible de legir lo fichièr"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Trobar dins {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " e "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} es necessari per legir lo fichièr, mas es pas installat."
+msgstr[1] "{} son necessaris per legir lo fichièr, mas son pas installats."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Lectura"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Desactivar mesclar/repetir"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Repetir lo tròç"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Repetir tot"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Mesclar"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Lista de lectura {} suprimida"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Anullar"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} tirat de {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Album desconegut"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Artista desconegut"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Lo repertòri de musica XDG es pas definit."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Dorsièr de musica"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Lo contengut de vòstre {} s'aficharà aicí."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Cap de musica pas trobada"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Ensajatz una recèrca diferenta"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Musica de GNOME a pas pogut se connectar a Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Vòstres fichièrs musicals pòdon pas s'indexar sens aver Tracker en execucion."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "La version de Tracker de vòstre sistèma sembla despassada."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Musica requerís Tracker version 3.0.0 o superiora."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Listas de lectura"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Resultats artistas"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Resultats albums"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minuta"
+msgstr[1] "{} minutas"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disc {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} cançon seleccionada"
+msgstr[1] "{} cançons seleccionadas"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Vòstra escotas musicalas son senhaladas a Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Vòstra escotas musicalas son senhaladas a Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Connectat coma {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Configurar"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pausa"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} cançon"
+msgstr[1] "{} cançons"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Recercar de cançons, artistas, albums e listas de lectura"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Un lector de musica e una aplicacion de gestion per GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Visitar lo site Web de GNOME Musica"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME Musica es un logicial liure ; podètz lo redistribuir e/o lo "
+#~ "modificar al títol de las clausas de la Licéncia Publica Generala GNU, "
+#~ "tala coma publicada per la Free Software Foundation ; siá la version 2 de "
+#~ "la Licéncia, o (coma voldretz) una version ulteriora quina que foguèsse.\n"
+#~ "\n"
+#~ "Aqueste programa es distribuit dins l'esper que serà utile, mas SENS CAP "
+#~ "DE GARANTIDA ; sens la quita garantida implicita de COMERCIABILITAT o DE "
+#~ "CONFORMITAT A UNA UTILIZACION PARTICULARA. Vejatz la Licéncia Publica "
+#~ "Generala GNU per mai de detalhs.\n"
+#~ "\n"
+#~ "Deuriatz aver recebut un exemplar de la Licéncia Publica Generala GNU amb "
+#~ "aqueste programa ; se es pas lo cas, escrivètz a la Free Software "
+#~ "Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Los autors de l'aplicacion Musica de GNOME acòrdan per la presenta "
+#~ "l'autorizacion d'utilizar d'empeutons GStreamer non compatibles amb la "
+#~ "licéncia GPL e de los distribuir conjuntament a GStreamer e a "
+#~ "l'aplicacion Musica de GNOME. Aquesta permission suplanta e va de delà de "
+#~ "las autorizacions acordadas per la licéncia GPL que cobrís l'aplicacion "
+#~ "Musica de GNOME. Se modificatz aqueste còdi, podètz espandir aquesta "
+#~ "autorizacion a vòstra version del còdi, mas i sètz pas obligats. Se o "
+#~ "desiratz pas, suprimissètz aquesta mencion d'excepcion de vòstra version."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Lo contengut de vòstre dossièr Musica s'aficharà aicí"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME Musica"
+
+#~ msgid "Window position"
+#~ msgstr "Posicion de la fenèstra"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "La posicion de la fenèstra (en x e y)."
+
+#~ msgid "Loading"
+#~ msgstr "Cargament en cors"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Apondre a la lista de lectura…"
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "L'estat initial es estat afichat"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Val « true » (verai) se l'estat inicial es estat afichat"
+
+#~ msgid "Released"
+#~ msgstr "Publicat"
+
+#~ msgid "Running Length"
+#~ msgstr "Durada"
+
+#~ msgid "Composer"
+#~ msgstr "Compositor"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Lectura"
+
+#~ msgid "Hey DJ"
+#~ msgstr "È DJ"
+
+#~ msgid "Search mode"
+#~ msgstr "Mòde de recèrca"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Se true (verai), la barra de recèrca s'aficha."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Mòde de notificacions"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Activa o desactiva las notificacions de lectura"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Musica es la novèla aplicacion de lectura de musica de GNOME."
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an|lo|la|l'|un|una"
+
+#~ msgid "All"
+#~ msgstr "Tot"
+
+#~ msgid "Artist"
+#~ msgstr "Artistas"
+
+#~ msgid "Album"
+#~ msgstr "Albums"
+
+#~ msgid "Track Title"
+#~ msgstr "Títol del tròç"
+
+#~ msgid "Local"
+#~ msgstr "Locala"
+
+#~ msgid "Sources"
+#~ msgstr "Fonts"
+
+#~ msgid "Match"
+#~ msgstr "Correspondéncia"
+
+#~ msgid "Untitled"
+#~ msgstr "Sens títol"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "%d element es seleccionat"
+#~ msgstr[1] "%d elements son seleccionats"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Empty"
+#~ msgstr "Void"
+
+#~ msgid "_Quit"
+#~ msgstr "_Quitar"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr ""
+#~ "Nombre maximum de caractèrs d'afichar dins lo títol del tròç en mòde "
+#~ "vista per artista"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Aqueste paramètre determina lo nombre de caractèrs dins lo títol del tròç "
+#~ "en mòde vista per artista abans que siá acorchit. Definissètz-lo a -1 per "
+#~ "lo desactivar."
+
+#~ msgid "the a an"
+#~ msgstr "the a an la lo lo les las"
+
+#~ msgid "All Artists"
+#~ msgstr "Totes los artistas"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Seleccionar la lista de lectura"
+
+#~ msgid "Not playing"
+#~ msgstr "Pas de lectura en cors"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "per %s, sus %s"
diff --git a/po/pa.po b/po/pa.po
new file mode 100644
index 00000000..d7730d0a
--- /dev/null
+++ b/po/pa.po
@@ -0,0 +1,792 @@
+# Punjabi translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# A S Alam <aalam@users.sf.net>, 2013, 2014, 2021, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-09-01 19:48-0700\n"
+"Last-Translator: A S Alam <aalam@satluj.org>\n"
+"Language-Team: Punjabi <punjabi-users@lists.sf.net>\n"
+"Language: pa\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-DamnedLies-Scope: partial\n"
+"X-Generator: Lokalize 23.04.3\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "ਸੰਗੀਤ"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "ਆਪਣੇ ਸੰਗੀਤ ਭੰਡਾਰ ਨੂੰ ਚਲਾਉ ਅਤੇ ਪਰਬੰਧ ਕਰੋ"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "ਤੁਹਾਡੇ ਸੰਗੀਤ ਨੂੰ ਚਲਾਉਣ ਲਈ ਸਰਲ ਅਤੇ ਸੌਖਾ ਢੰਗ ਹੈ।"
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "ਗਨੋਮ ਸੰਗੀਤ ਡਿਵੈਲਪਰ"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "ਸੰਗੀਤ ਪਲੇਅਰ"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "ਸੰਗੀਤ;ਪਲੇਅਰ;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "ਵਿੰਡੋ ਆਕਾਰ"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "ਵਿੰਡੋ ਆਕਾਰ (ਚੌੜਾਈ ਅਤੇ ਉਚਾਈ)"
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਕੀਤੀ"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਆਕਾਰ ਸਥਿਤੀ।"
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "ਪਲੇਅਬੈਕ ਦੁਹਰਾਓ ਢੰਗ"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"ਭੰਡਾਰ ਰਾਹੀਂ ਦੁਹਰਾਉਣ ਜਾਂ ਰਲਵੇਂ ਰੂਪ ਵਿੱਚ ਚਲਾਉਣ ਦੀ ਚੋਣ ਵਾਸਤੇ ਮੁੱਲ ਪਛਾਣਕਰਤਾ।"
+" ਮਨਜ਼ੂਰ ਮੁੱਲ ਹਨ: "
+"”none” (ਦੁਹਰਾਉਣਾ ਤੇ ਰਲਾਉਣਾ ਬੰਦ ਹੈ), ”song” (ਮੌਜੂਦਾ ਗੀਤ ਦੁਹਰਾਉ), ”all”"
+" (ਪਲੇਅਲਿਸਟ "
+"ਦੁਹਰਾਉ, ਰਲਵੇਂ ਨਹੀਂ), “shuffle” (ਪਲੇਅਲਿਸਟ ਰਲਵਾ ਕੇ ਚਲਾਉ ਅਤੇ ਸਭ ਦੁਹਰਾਉ)।"
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "ਸਿਸਟਮ ਸਸਪੈਂਡ ਤੋਂ ਰੋਕੋ"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+
+#: data/org.gnome.Music.gschema.xml:38
+#| msgid "Your music listening is reported to Last.fm."
+msgid "Report music history to Last.fm"
+msgstr "ਸੰਗੀਤ ਅਤੀਤ Last.fm ਨੂੰ ਰਿਪੋਰਟ ਕਰੋ"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "ਚਲਾਓ"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "ਚਲਾਓ(_P)"
+
+#: data/ui/AlbumWidget.ui:134
+#| msgid "Favorite Songs"
+msgid "Add to _Favorite Songs"
+msgstr "ਮਨਪਸੰਦ ਗੀਤ ਵਿੱਚ ਜੋੜੋ(_F)"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+#| msgid "Add to Playlist…"
+msgid "_Add to Playlist…"
+msgstr "ਪਲੇਅਲਿਸਟ ਵਿੱਚ ਜੋੜੋ(_A)…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm ਖਾਤਾ"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "ਸੰਗੀਤ ਸੁਣਨ ਬਾਰੇ ਰਿਪੋਰਟ"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟ(_K)"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "ਮਦਦ(_H)"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "ਸੰਗੀਤ ਬਾਰੇ(_A)"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "ਸੰਗੀਤ ਲਈ ਜੀ ਆਇਆਂ ਨੂੰ"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "ਮੇਨੂ"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "ਚੁਣੋ"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "ਰੱਦ ਕਰੋ(_C)"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "ਖੋਜ"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "ਪਿੱਛੇ"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "ਆਮ"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "ਵਿੰਡੋ ਬੰਦ ਕਰੋ"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "ਖੋਜੋ"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "ਮਦਦ"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "ਸ਼ਾਰਟਕੱਟ"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "ਚਲਾਓ"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "ਚਲਾਓ/ਵਿਰਾਮ"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "ਅਗਲਾ ਗੀਤ"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "ਪਿਛਲਾ ਗੀਤ"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "ਦੁਹਰਾਉਣਾ ਬਦਲੋ"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "ਰਲਾਉਣ ਨੂੰ ਬਦਲੋ"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "ਨੇਵੀਗੇਸ਼ਨ"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "ਐਲਬਮ ਉੱਤੇ ਜਾਓ"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "ਕਲਾਕਾਰ ਉੱਤੇ ਜਾਓ"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "ਗੀਤ ਉੱਤੇ ਜਾਓ"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "ਪਲੇਅਲਿਸਟ ਉੱਤੇ ਜਾਓ"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "ਪਿੱਛੇ ਜਾਓ"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm ਸੰਗੀ ਖੋਜ ਸੇਵਾ ਹੈ, ਜੋ ਕਿ ਤੁਹਾਨੂੰ ਤੁਹਾਡੇ ਵਲੋਂ ਸੁਣੇ ਗਏ ਸੰਗੀਤ ਦੇ ਮੁਤਾਬਕ"
+" ਤੁਹਾਡੀਆਂ ਨਿੱਜੀ "
+"ਸਿਫਾਰਸ਼ਾਂ ਪੇਸ਼ ਕਰਦੀ ਹੈ।"
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "ਸੰਗੀਤ ਰਿਪੋਰਟ ਕਰਨਾ ਸੈਟਅੱਪ ਨਹੀਂ ਹੈ"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "ਆਪਣੇ ਸੰਗੀਤ ਸੁਣਨ ਬਾਰੇ ਰਿਪੋਰਟ ਦੇਣ ਲਈ ਆਪਣੇ Last.fm ਖਾਤੇ ਵਿੱਚ ਲਾਗਇਨ ਕਰੋ।"
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "ਲਾਗਇਨ"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "ਪਿੱਛੇ"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "ਅੱਗੇ"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "ਹਟਾਓ(_D)"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "ਨਾਂ ਬਦਲੋ(_R)…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "ਪਲੇਅਲਿਸਟ ਨਾਂ"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "ਮੁਕੰਮਲ(_D)"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "ਆਪਣੀ ਪਹਿਲੀ ਪਲੇਅਲਿਸਟ ਲਈ ਨਾਂ ਦਿਓ"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "ਬਣਾਓ(_r)"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "...ਨਵੀਂ ਪਲੇਅਲਿਸਟ"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "ਜੋੜੋ"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "ਪਲੇਅਲਿਸਟ ਵਿੱਚ ਜੋੜੋ"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "ਜੋੜੋ(_A)"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "ਕਲਾਕਾਰ"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "ਸਭ ਵੇਖੋ"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "ਐਲਬਮ"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "ਗੀਤ"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "ਸਭ ਚੁਣੋ"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "ਕੋਈ ਨਾ ਚੁਣੋ"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "ਆਈਟਮਾਂ ਨੂੰ ਚੁਣਨ ਲਈ ਉਹਨਾਂ ਉੱਤੇ ਕਲਿੱਕ ਕਰੋ"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "ਪਲੇਅਲਿਸਟ ਵਿੱਚ ਜੋੜੋ(_A)"
+
+#: data/ui/SongWidgetMenu.ui:19
+#| msgid "Remove From Playlist"
+msgid "_Remove from Playlist"
+msgstr "ਪਲੇਅਲਿਸਟ ਵਿੱਚੋਂ ਹਟਾਓ(_R)"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "ਗਨੋਮ ਪਰੋਜੈਕਟ"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"ਅਮਨਪਰੀਤ ਸਿੰਘ ਆਲਮ (Amanpreet Singh)\n"
+"ਪੰਜਾਬੀ ਓਪਨਸੋਰਸ ਟੀਮ (POST)"
+
+#: gnomemusic/about.py:253
+#| msgid "Copyright © 2018 GNOME Music Developers"
+msgid "Copyright The GNOME Music Developers"
+msgstr "ਕਾਪੀਰਾਈਟ ਗਨੋਮ ਸੰਗੀਤ ਡਿਵੈਲਪਰ"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "ਉਲੱਥਾ ਕੀਤਾ"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "ਸਭ ਤੋਂ ਵੱਧ ਚਲਾਏ"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "ਕਦੇ ਨਹੀਂ ਚਲਾਏ"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "ਹੁਣੇ ਹੁਣੇ ਚਲਾਏ"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "ਹੁਣੇ ਹੁਣੇ ਜੋੜੇ"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "ਮਨਪਸੰਦ ਗੀਤ"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "ਫਾਇਲ ਚਲਾਉਣ ਲਈ ਅਸਮਰੱਥ ਹੈ"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "{} ਵਿੱਚ ਲੱਭੋ(_F)"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " ਅਤੇ "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "ਫਾਇਲ ਚਲਾਉਣ ਲਈ {} ਚਾਹੀਦਾ ਹੈ, ਪਰ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ।"
+msgstr[1] "ਫਾਇਲ ਚਲਾਉਣ ਲਈ {} ਚਾਹੀਦੇ ਹਨ, ਪਰ ਇੰਸਟਾਲ ਨਹੀਂ ਹਨ।"
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "ਸੰਗੀਤ ਚੱਲ ਰਿਹਾ ਹੈ"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "ਰਲਵਾਂ/ਦੁਹਰਾਉਣਾ ਬੰਦ"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "ਗਾਣਾ ਦੁਹਰਾਓ"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "ਸਭ ਦੁਹਰਾਓ"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "ਰਲਵੇਂ"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "ਪਲੇਅਲਿਸਟ {} ਹਟਾਈ"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+#| msgid "_Undo"
+msgid "Undo"
+msgstr "ਵਾਪਸ"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} ਨੂੰ {} ਤੋਂ ਹਟਾਇਆ"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "ਅਣਪਛਾਤੀ ਐਲਬਮ"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "ਅਣਪਛਾਤਾ ਕਲਾਕਾਰ"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "ਤੁਹਾਡਾ XDG ਸੰਗੀਤ ਡਾਇਰੈਕਟਰੀ ਸੈੱਟ ਨਹੀਂ ਹੈ।"
+
+#: gnomemusic/views/emptyview.py:72
+#| msgid "Music folder"
+msgid "Music Folder"
+msgstr "ਸੰਗੀਤ ਫੋਲਡਰ"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "ਤੁਹਾਡੀ {} ਦੀ ਸਮੱਗਰੀ ਇੱਥੇ ਦਿਖਾਈ ਦੇਵੇਗੀ।"
+
+#: gnomemusic/views/emptyview.py:124
+#| msgid "No music found"
+msgid "No Music Found"
+msgstr "ਕੋਈ ਸੰਗੀਤ ਨਹੀਂ ਲੱਭਿਆ"
+
+#: gnomemusic/views/emptyview.py:125
+#| msgid "Try a different search"
+msgid "Try a Different Search"
+msgstr "ਵੱਖਰੀ ਖੋਜ ਕਰਕੇ ਵੇਖੋ"
+
+#: gnomemusic/views/emptyview.py:129
+#| msgid "GNOME Music could not connect to Tracker"
+msgid "GNOME Music could not connect to Tracker."
+msgstr "ਗਨੋਮ ਸੰਗੀਤ ਟਰੈਕਰ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।"
+
+#: gnomemusic/views/emptyview.py:131
+#| msgid "Your music files cannot be indexed without Tracker running"
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"ਤੁਹਾਡੀਆਂ ਸੰਗੀਤ ਫਾਇਲਾਂ ਨੂੰ ਟਰੈਕਰ ਚਲਾਏ ਬਿਨਾਂ ਇੰਡੈਕਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।"
+
+#: gnomemusic/views/emptyview.py:137
+#| msgid "Your system Tracker version seems outdated"
+msgid "Your system Tracker version seems outdated."
+msgstr "ਤੁਹਾਡੇ ਸਿਸਟਮ ਦਾ ਟਰੈਕਰ ਵਰਜ਼ਨ ਪੁਰਾਣਾ ਜਾਪਦਾ ਹੈ।"
+
+#: gnomemusic/views/emptyview.py:139
+#| msgid "Music needs Tracker version 3.0.0 or higher"
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "ਸੰਗੀਤ ਨੂੰ ਟਰੈਕਰ ਵਰਜ਼ਨ 3.0.0 ਜਾਂ ਨਵਾਂ ਚਾਹੀਦਾ ਹੈ।"
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "ਪਲੇਅਲਿਸਟਾਂ"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "ਕਲਾਕਾਰ ਨਤੀਜੇ"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "ਐਲਬਮ ਨਤੀਜੇ"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} ਮਿੰਟ"
+msgstr[1] "{} ਮਿੰਟ"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "ਡਿਸਕ {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "ਚੁਣਿਆ {} ਗੀਤ"
+msgstr[1] "ਚੁਣੇ {} ਗੀਤ"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "ਤੁਹਾਡਾ ਸੰਗੀਤ ਸੁਣਨਾ Last.fm ਨੂੰ ਰਿਪੋਰਟ ਕੀਤਾ ਹੈ"
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "ਤੁਹਾਡਾ ਸੰਗੀਤ ਸੁਣਨਾ Last.fm ਨੂੰ ਰਿਪੋਰਟ ਨਹੀਂ ਕੀਤਾ"
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "{} ਵਜੋਂ ਲਾਗਇਨ ਕੀਤਾ"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "ਸੰਰਚਨਾ"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "ਵਿਰਾਮ"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} ਗੀਤ"
+msgstr[1] "{} ਗੀਤ"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "ਗੀਤ, ਕਲਾਕਾਰ, ਐਲਬਮ ਅਤੇ ਪਲੇਅਲਿਸਟ ਖੋਜੋ"
+
+#~ msgid "GNOME Music"
+#~ msgstr "ਗਨੋਮ ਸੰਗੀਤ"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "ਤੁਹਾਡੇ ਸੰਗੀਤ ਨੂੰ ਚਲਾਉਣ ਦਾ ਸੌਖਾ ਢੰਗ ਹੈ। ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ, ਲੋਕਲ ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ ਸੇਵਾਵਾਂ ਉੱਤੇ "
+#~ "ਆਪਣੇ-ਆਪ ਸੰਗੀਤ ਲੱਭੋ।"
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "ਆਪਣੇ ਲੋਕਲ ਭੰਡਾਰ ਵਿੱਚ ਟਰੈਕ ਲੱਭੋ, DLNA ਸਰਵਰਾਂ ਤੋਂ ਲਵੋ ਜਾਂ Jamendo ਅਤੇ Magnatune ਸੇਵਾਵਾਂ "
+#~ "ਨਾਲ ਕੁਝ ਨਵਾਂ ਵਰਤ ਕੇ ਵੇਖੋ।"
+
+#~ msgid "Window position"
+#~ msgstr "ਵਿੰਡੋ ਸਥਿਤੀ"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "ਵਿੰਡੋ ਸਥਿਤੀ (x ਅਤੇ y)"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "ਗਨੋਮ ਲਈ ਸੰਗੀਤ ਪਲੇਅਰ ਅਤੇ ਪ੍ਰਬੰਧਕ ਐਪਲੀਕੇਸ਼ਨ ਹੈ।"
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "ਗਨੋਮ ਸੰਗੀਤ ਵੈੱਬਸਾਈਟ ਵੇਖੋ"
+
+#~| msgid ""
+#~| "GNOME Music is free software; you can redistribute it and/or modify it "
+#~| "under the terms of the GNU General Public License as published by the "
+#~| "Free Software Foundation; either version 2 of the License, or (at your "
+#~| "option) any later version.\n"
+#~| "\n"
+#~| "GNOME Music is distributed in the hope that it will be useful, but "
+#~| "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~| "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU "
+#~| "General Public License for more details.\n"
+#~| "\n"
+#~| "You should have received a copy of the GNU General Public License along "
+#~| "with GNOME Music; if not, write to the Free Software Foundation, Inc., "
+#~| "51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~| "\n"
+#~| "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~| "GStreamer plugins to be used and distributed together with GStreamer and "
+#~| "GNOME Music. This permission is above and beyond the permissions "
+#~| "granted by the GPL license by which GNOME Music is covered. If you "
+#~| "modify this code, you may extend this exception to your version of the "
+#~| "code, but you are not obligated to do so. If you do not wish to do so, "
+#~| "delete this exception statement from your version."
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version.\n"
+#~ "\n"
+#~ "“Magic of the vinyl” by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+#~ "https://www.flickr.com/photos/_spy_/12270839403"
+#~ msgstr ""
+#~ "ਗਨੋਮ ਸੰਗੀਤ ਇੱਕ ਮੁਕਤ ਸਾਫਟਵੇਅਰ ਹੈ, ਜਿਸ ਨੂੰ ਤੁਸੀਂ ਫਰੀ ਸਾਫਟਵੇਅਰ ਫਾਊਂਨਡੇਸ਼ਨ ਵਲੋਂ ਜਾਰੀ ਗਨੂ ਜਰਨਲ "
+#~ "ਪਬਲਿਕ ਲਾਇਸੈਂਸ ਦੇ ਵਰਜਨ ੨ ਜਾਂ (ਤੁਹਾਡੀ ਚੋਣ ਮੁਤਾਬਕ) ਨਵੇਂ ਵਰਜਨ ਅਧੀਨ ਵੰਡ ਅਤੇ/ਜਾਂ ਸੋਧ ਜਾ ਸਕਦੇ "
+#~ "ਹੋ।\n"
+#~ "\n"
+#~ "ਗਨੋਮ ਸੰਗੀਤ ਨੂੰ ਇਸ ਭਰੋਸੇ ਨਾਲ ਵੰਡਿਆ ਜਾ ਰਿਹਾ ਹੈ ਕਿ ਉਹ ਲਾਭਦਾਇਕ ਹੋਵੇਗਾ, ਪਰ ਬਿਨਾਂ ਕਿਸੇ "
+#~ "ਵਾਰੰਟੀ ਦੇ, ਬਿਨਾਂ ਕਿਸੇ ਖਾਸ ਮਕਸਦ ਲਈ ਠੀਕ ਜਾਂ ਲਾਭਦਾਇਕ ਰਹਿਣ ਦੇ। ਵਧੇਰੇ ਜਾਣਕਾਰੀ ਲਈ ਗਨੂ "
+#~ "ਜਰਨਲ ਪਬਲਿਕ ਲਾਇਸੈਂਸ ਨੂੰ ਵੇਖੋ।\n"
+#~ "\n"
+#~ "ਤੁਸੀਂ ਗਨੂ ਜਰਨਲ ਪਬਲਿਕ ਲਾਇਸੈਂਸ ਦੀ ਨਕਲ ਗਨੋਮ ਸੰਗੀਤ ਨਾਲ ਪਰਾਪਤ ਕੀਤੀ ਹੋਵੇਗੀ, ਜੇਕਰ ਨਹੀਂ ਤਾਂ "
+#~ "ਫਰੀ ਸਾਫਟਵੇਅਰ ਫਾਊਂਨਡੇਸ਼ਨ ੫੧ ਫਰੈਕਲਿਨ ਸਟਰੀਟ, ਪੰਜਵੀਂ ਮੰਜ਼ਲ, ਬੋਸਟਨ, ਐਮ ਏ ੦੨੧੧੦-੧੩੦੧ "
+#~ "ਅਮਰੀਕਾ ਤੋਂ ਪਰਾਪਤ ਕਰਨ ਲਈ ਲਿਖੋ।\n"
+#~ "\n"
+#~ "ਗਨੋਮ ਸੰਗੀਤ ਲੇਖਕਾਂ ਨੇ ਗ਼ੈਰ-GPL ਅਨੁਕੂਲ ਜੀਸਟਰੀਮਰ ਪਲੱਗਇਨ ਨੂੰ ਜੀਸਟਰੀਮਰ ਅਤੇ ਗਨੋਮ ਸੰਗੀਤ ਨਾਲ "
+#~ "ਵਰਤਣ ਅਤੇ ਵੰਡਣ ਲਈ ਮਨਜ਼ੂਰੀ ਦਿੱਤੀ ਹੈ। ਇਹ ਮਨਜ਼ੂਰੀ ਜੀਪੀਐਲ ਲਾਈਸੈਂਸ ਰਾਹੀਂ ਦਿੱਤੀ ਗਈ ਮਨਜੂਰੀ ਤੋਂ "
+#~ "ਉੱਤੇ ਅਤੇ ਵੱਧ ਹੈ, ਜਿਸ ਅਧੀਨ ਗਨੋਮ ਸੰਗੀਤ ਆਉਂਦਾ ਹੈ। ਜੇ ਤੁਸੀਂ ਇਹ ਕੋਡ ਵਿੱਚ ਸੋਧ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਕੋਡ "
+#~ "ਦੇ ਆਪਣੇ ਵਰਜਨ ਲਈ ਇਹ ਛੋਟ ਨੂੰ ਵਧਾ ਸਕਦੇ ਹੋ, ਪਰ ਇਹ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਉੱਤੇ ਕੋਈ ਪਾਬੰਦੀ ਨਹੀਂ ਹੈ। ਜੇ "
+#~ "ਤੁਸੀਂ ਇੰਝ ਨਹੀਂ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਤੁਸੀਂ ਆਪਣੇ ਵਰਜਨ ਤੋਂ ਇਹ ਛੋਟ ਬਿਆਨ ਨੂੰ ਹਟਾ ਸਕਦੇ ਹੋ।\n"
+#~ "\n"
+#~ "ਸਾਮੀ ਪਿਆਲੰਪੀ ਵਲੋਂ “Magic of the vinyl” ਚਿੱਤਰ ਦਾ ਲਸੰਸ CC-BY-SA 2.0 ਦੇ ਅਧੀਨ ਦਿੱਤਾ "
+#~ "ਹੈhttps://www.flickr.com/photos/_spy_/12270839403"
+
+#~ msgid "Released"
+#~ msgstr "ਰੀਲਿਜ਼"
+
+#~ msgid "Running Length"
+#~ msgstr "ਚੱਲਣ ਲੰਬਾਈ"
+
+#~ msgid "Composer"
+#~ msgstr "ਕੰਪੋਜ਼ਰ"
+
+#~| msgid "Loading..."
+#~ msgid "Loading"
+#~ msgstr "ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#~| msgid "Play"
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "ਚਲਾਓ"
+
+#~ msgid "Hey DJ"
+#~ msgstr "ਹੈਲੋ ਡੀਜੇ"
+
+#~ msgid "Search mode"
+#~ msgstr "ਖੋਜ ਢੰਗ"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "ਜੇ ਸਹੀਂ ਹੈ ਤਾਂ ਖੋਜ ਪੱਟੀ ਵੇਖਾਈ ਜਾਂਦੀ ਹੈ।"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "ਸੰਗੀਤ ਨਵੀਂ ਗਨੋਮ ਸੰਗੀਤ ਚਲਾਉਣ ਵਾਲੀ ਐਪਲੀਕੇਸ਼ਨ ਹੈ।"
+
+#~ msgid "Untitled"
+#~ msgstr "ਬਿਨ-ਟਾਈਟਲ"
+
+#~ msgid "Not playing"
+#~ msgstr "ਚੱਲ ਨਹੀਂ ਰਿਹਾ"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "%s ਵਲੋਂ, %s ਵਿੱਚੋਂ"
+
+#~ msgid "All"
+#~ msgstr "ਸਭ"
+
+#~ msgid "Artist"
+#~ msgstr "ਕਲਾਕਾਰ"
+
+#~ msgid "Album"
+#~ msgstr "ਐਲਬਮ"
+
+#~ msgid "Track Title"
+#~ msgstr "ਟਰੈਕ ਨਾਂ"
+
+#~ msgid "Local"
+#~ msgstr "ਲੋਕਲ"
+
+#~ msgid "Sources"
+#~ msgstr "ਸਰੋਤ"
+
+#~ msgid "Match"
+#~ msgstr "ਮੇਲ"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "ਚੁਣੀ %d ਆਈਟਮ"
+#~ msgstr[1] "ਚੁਣੀਆਂ %d ਆਈਟਮਾਂ"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "ਕੋਈ ਸੰਗੀਤ ਨਹੀਂ ਲੱਭਿਆ!\n"
+#~ " %s ਫੋਲਡਰ ਵਿੱਚ ਕੁਝ ਫਾਇਲਾਂ ਰੱਖੋ"
+
+#~ msgid "All Artists"
+#~ msgstr "ਸਭ ਕਲਾਕਾਰ"
+
+#~ msgid "%d min"
+#~ msgstr "%d ਮਿੰਟ"
+
+#~ msgid "Empty"
+#~ msgstr "ਖਾਲੀ"
+
+#~ msgid "_New Playlist"
+#~ msgstr "ਨਵੀਂ ਪਲੇਅਲਿਸਟ(_N)"
+
+#~ msgid "_Quit"
+#~ msgstr "ਬੰਦ ਕਰੋ(_Q)"
+
+#~ msgid "Select Playlist"
+#~ msgstr "ਪਲੇਅਲਿਸਟ ਚੁਣੋ"
+
+#~ msgid "Load More"
+#~ msgstr "ਹੋਰ ਲੋਡ ਕਰੋ"
+
+#~ msgid "New"
+#~ msgstr "ਨਵਾਂ"
+
+#~ msgid "Quit"
+#~ msgstr "ਬਾਹਰ"
+
+#~ msgid "A GNOME 3 application to listen and manage music playlists"
+#~ msgstr "ਸੰਗੀਤ ਪਲੇਅਲਿਸਟ ਸੁਣਨ ਅਤੇ ਉਹਨਾਂ ਦੇ ਪਰਬੰਧ ਲਈ ਗਨੋਮ 3 ਐਪਲੀਕੇਸ਼ਨ"
+
+#~ msgid "%02u:%02u:%02u"
+#~ msgstr "%02u:%02u:%02u"
+
+#~ msgid "%02u:%02u"
+#~ msgstr "%02u:%02u"
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 00000000..5f37f9a4
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,584 @@
+# Polish translation for gnome-music.
+# Copyright © 2012-2023 the gnome-music authors.
+# This file is distributed under the same license as the gnome-music package.
+# Piotr Drąg <piotrdrag@gmail.com>, 2012-2023.
+# Paweł Żołnowski <pawel@zolnowski.name>, 2014-2015.
+# Aviary.pl <community-poland@mozilla.org>, 2012-2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-06 17:33+0200\n"
+"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
+"Language-Team: Polish <community-poland@mozilla.org>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Muzyka"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Odtwarzanie i organizowanie kolekcji muzyki"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Łatwy i przyjemny sposób na odtwarzanie muzyki."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Znajduj utwory w swojej lokalnej kolekcji, korzystaj z automatycznie "
+"tworzonych list odtwarzania lub utwórz własne."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Programiści odtwarzacza muzyki GNOME"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Odtwarzacz muzyki"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr ""
+"Muzyka;Odtwarzacz;Dźwięk;Audio;Piosenka;Utwór;MP3;Ogg;Vorbis;FLAC;CD;Płyta;"
+"Playlista;Lista;odtwarzania;Last.fm;Lastfm;Jamendo;Magnatune;UPnP;DLNA;MPRIS;"
+"ReplayGain;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Rozmiar okna"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Rozmiar okna (szerokość i wysokość)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Maksymalizacja okna"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Stan maksymalizacji okna."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Tryb powtarzania odtwarzania"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Wartość określa, czy powtarzać lub losować kolejność odtwarzania kolekcji. "
+"Dozwolone wartości: „none” (powtarzanie i odtwarzanie losowe wyłączone), "
+"„song” (powtarzanie bieżącego utworu), „all” (powtarzanie listy odtwarzania, "
+"bez odtwarzania losowego), „shuffle” (odtwarzanie losowe i powtarzanie listy "
+"odtwarzania)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Włączenie ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Normalizacja poziomu głośności ReplayGain dla albumów"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Wstrzymanie uśpienia komputera"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "Wstrzymuje uśpienie komputera podczas odtwarzania muzyki"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Zgłaszanie historii odtwarzanej muzyki w serwisie Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Wysyła odsłuchane utwory i informacje o obecnie odtwarzanym do serwisu Last."
+"fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Odtwarza"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "O_dtwórz"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Dodaj do _ulubionych utworów"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Dodaj do listy odtwarzania…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Konto Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Zgłaszanie odsłuchanych utworów"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Skróty klawiszowe"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "Pomo_c"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_O programie"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Witamy w odtwarzaczu muzyki"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menu"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Zaznacza"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Anuluj"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Wyszukuje"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Wstecz"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Ogólne"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Zamknięcie okna"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Wyszukiwanie"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Pomoc"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Skróty"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Odtwarzanie"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Odtwarzanie/wstrzymanie"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Następny utwór"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Poprzedni utwór"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Przełączenie powtarzania"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Przełączenie losowania"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Nawigacja"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Przejście do albumów"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Przejście do wykonawców"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Przejście do utworów"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Przejście do list odtwarzania"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Wstecz"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm to serwis do odkrywania muzyki zapewniający spersonalizowane "
+"polecenia na podstawie odsłuchanych utworów."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Nie skonfigurowano zgłaszania muzyki"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Zgłaszanie odsłuchanych utworów wymaga zalogowania na konto Last.fm."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Zaloguj się"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Poprzedni"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Następny"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Usuń"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Zmień nazwę…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Nazwa listy odtwarzania"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Gotowe"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Nazwa pierwszej listy odtwarzania"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Utwórz"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Nowa lista odtwarzania…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Dodaj"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Dodanie do listy odtwarzania"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Dodaj"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Wykonawcy"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Wyświetl wszystko"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albumy"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Utwory"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Zaznacz wszystko"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Odznacz wszystko"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Kliknięcie elementu zaznacza go"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Dodaj do listy odtwarzania"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Usuń z listy odtwarzania"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Projekt GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"Piotr Drąg <piotrdrag@gmail.com>, 2012-2023\n"
+"Paweł Żołnowski <pawel@zolnowski.name>, 2014-2015\n"
+"Aviary.pl <community-poland@mozilla.org>, 2012-2023"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright © programiści odtwarzacza muzyki GNOME"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Tłumaczenie"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Najczęściej odtwarzane"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Nigdy nieodtworzone"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Ostatnio odtwarzane"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Ostatnio dodane"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Ulubione utwory"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Nie można odtworzyć pliku"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Znajdź w „{}”"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " i "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} jest wymagane do odtworzenia pliku, ale nie jest zainstalowane."
+msgstr[1] "{} są wymagane do odtworzenia pliku, ale nie są zainstalowane."
+msgstr[2] "{} są wymagane do odtworzenia pliku, ale nie są zainstalowane."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Odtwarzanie muzyki"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Wyłączenie losowania/powtarzania"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Powtarzanie utworu"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Powtarzanie wszystkich"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Odtwarzanie losowe"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Usunięto listę odtwarzania „{}”"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Cofnij"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "Usunięto utwór „{}” z listy „{}”"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Nieznany album"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Nieznany wykonawca"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Katalog „Muzyka” standardu XDG nie jest ustawiony."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "katalogu z muzyką"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "W tym miejscu będzie znajdować się zawartość {}."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Nie odnaleziono plików muzycznych"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Proszę spróbować innych słów"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Odtwarzacz muzyki GNOME nie może połączyć się z usługą Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Bez działającej usługi Tracker nie można wykryć plików z muzyką."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Wersja usługi Tracker zainstalowana na komputerze jest przestarzała."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Odtwarzacz muzyki wymaga wersji 3.0.0 lub wyższej."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Listy odtwarzania"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Wyniki wyszukiwania wśród wykonawców"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Wyniki wyszukiwania wśród albumów"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minuta"
+msgstr[1] "{} minuty"
+msgstr[2] "{} minut"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "{}. płyta"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Zaznaczono {} utwór"
+msgstr[1] "Zaznaczono {} utwory"
+msgstr[2] "Zaznaczono {} utworów"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Odsłuchane utwory są zgłaszane w serwisie Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Odsłuchane utwory nie są zgłaszane w serwisie Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Zalogowano jako {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Skonfiguruj"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Wstrzymuje"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} utwór"
+msgstr[1] "{} utwory"
+msgstr[2] "{} utworów"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Wyszukiwanie utworów, wykonawców, albumów i list odtwarzania"
diff --git a/po/pt.po b/po/pt.po
new file mode 100644
index 00000000..b134cd1e
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,781 @@
+# Portuguese translation for gnome-music.
+# Copyright © 2013, 2014 gnome-music
+# This file is distributed under the same license as the gnome-music package.
+# António Lima <amrlima@gmail.com>, 2013.
+# Tiago Santos <tiagofsantos81@sapo.pt>, 2014 - 2017.
+# Pedro Albuquerque <palbuquerque73@openmailbox.com>, 2015.
+# Juliano de Souza Camargo <julianosc@protonmail.com>, 2020.
+# Hugo Carvalho <hugokarvalho@hotmail.com>, 2021, 2022, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-03 12:11+0100\n"
+"Last-Translator: Hugo Carvalho <hugokarvalho@hotmail.com>\n"
+"Language-Team: Portuguese <>\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Música"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Reproduz e organiza a sua coleção de música"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Uma maneira fácil e agradável de tocar a sua música."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Encontre faixas na sua coleção local, use listas de reprodução geradas "
+"automaticamente ou categorize uma nova."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Os Programadores do Música GNOME"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Reprodutor de música"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Reprodutor;Música;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Tamanho da janela"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Tamanho da janela (largura e altura)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Janela maximizada"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Estado maximizado da janela."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Modo de repetição de reprodução"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"O valor identifica se deve repetir ou tornar a reprodução da coleção "
+"aleatória. Os valores permitidos são: “none” (repetir e misturar são "
+"desligados), “song” (repete a música atual), “all” (repete a lista sem "
+"misturar), “shuffle” (misturar a lista e assumir repetir todas)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Ativar ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Ativa ou desativa ReplyGain para álbuns"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Inibir suspensão do sistema"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "Ativa ou desativa a suspensão do sistema quando a tocar música"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Relatar histórico de músicas ao Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Ativa ou desativa envio de \"scrobbles\" e informações de “a tocar” ao Last."
+"fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Reproduzir"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "Re_Produzir"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Adicionar às músicas _favoritas"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Adicionar à lista de reprodução…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Conta Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Relatar músicas tocadas"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Atalhos de teclado"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "A_Juda"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Sobre Música"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Bem-vindo ao Música"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menu"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Selecionar"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Cancelar"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Procurar"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Recuar"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Geral"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Fechar janela"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Procurar"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Ajuda"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Atalhos"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Reproduzir"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Reproduzir/Pausa"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Música seguinte"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Música anterior"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Alternar repetir"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Alternar baralhar"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navegação"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Ir para Álbuns"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Ir para Artistas"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Ir para Canções"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Adicionar à lista de reprodução"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Voltar atrás"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"O Last.fm é um serviço de localização de músicas que dá-lhe recomendações "
+"personalizadas baseadas nas músicas que ouve."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Relatar músicas não configurado"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Inicie sessão na sua conta Last.fm para relatar as músicas que ouve."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Início de sessão"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Anterior"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Seguinte"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Eliminar"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Renomear…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Nome da lista de reprodução"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Terminado"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Introduza um nome para a sua primeira playlist"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "C_riar"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Nova lista de reprodução…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Adicionar"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Adicionar à lista de reprodução"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Adicionar"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artistas"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Ver tudo"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Álbuns"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Músicas"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Selecionar todas"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Não selecionar nenhuma"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Clique nos itens para os selecionar"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Adicionar à lista de reprodução"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Remover da lista de reprodução"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "O Projeto GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Hugo Carvalho <hugokarvalho@hotmail.com>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Direitos de autor Os Programadores do Música GNOME"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Traduzido por"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Mais ouvidos"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Nunca ouvidos"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Ouvidos recentemente"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Adicionados recentemente"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Músicas favoritas"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Impossível reproduzir o ficheiro"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Localizar em {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " e "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} é requerido para reproduzir o ficheiro, mas não está instalado."
+msgstr[1] ""
+"{} são requeridos para reproduzir o ficheiro, mas não estão instalados."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "A tocar música"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Desligar Misturar/Repetir"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Repetir música"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Repetir todas"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Misturar"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Lista {} removida"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Anular"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} removida de {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Álbum desconhecido"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Artista desconhecido"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Seu diretório XDG Music não está definido."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Pasta de música"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "O conteúdo de {} aparece aqui."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Nenhuma música encontrada"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Tente uma pesquisa diferente"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Não foi possível ao Música GNOME estabelecer ligação com o rastreador."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Os seus ficheiros de música não podem ser indexados sem que o rastreador "
+"esteja em execução."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "A versão do rastreador no sistema parece desatualizada."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "O Música precisa de um rastreador com a versão 3.0.0 ou superior."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Listas de reprodução"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Artistas encontrados"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Álbuns encontrados"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minuto"
+msgstr[1] "{} minutos"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disco {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Música {} selecionada"
+msgstr[1] "Musicas {} selecionadas"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "As músicas que ouve são relatadas ao Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "As músicas que ouve não são relatadas ao Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Sessão iniciada como {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Configurar"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pausa"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} música"
+msgstr[1] "{} músicas"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Pesquisar músicas, artistas, álbuns e listas de reprodução"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Uma aplicação para reprodução e gestão de música para o GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Visite a página web do Música"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "O GNOME Música é uma aplicação livre; pode redistribuí-la e/ou alterá-la "
+#~ "sob os termos da Licença Pública Genérica GNU tal como publicada pela "
+#~ "Free Software Foundation; ou a versão 2 da Licença, ou (à sua discrição) "
+#~ "qualquer versão posterior.\n"
+#~ "\n"
+#~ "O GNOME Música é distribuído na esperança de ser útil, mas SEM QUALQUER "
+#~ "GARANTIA; nem mesmo a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO "
+#~ "A QUALQUER PROPÓSITO. Veja a Licença Pública Genérica GNU para mais "
+#~ "detalhes.\n"
+#~ "\n"
+#~ "Deverá ter recebido uma cópia da Licença Pública Genérica GNU juntamente "
+#~ "com o GNOME Música; se não, escreva (em Inglês) para a Free Software "
+#~ "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 "
+#~ "USA.\n"
+#~ "\n"
+#~ "Os autores do GNOME Música concedem aqui permissão para que extensões "
+#~ "compatíveis com o GStreamer não GPL sejam usadas e distribuídas com o "
+#~ "GStreamer e o GNOME Música. Esta permissão está acima das permissões "
+#~ "concedidas pela licença GPL pela qual o GNOME Música é coberto. Se "
+#~ "modificar este código, pode estender a exceção à sua versão do código, "
+#~ "mas não é obrigado a fazê-lo. Se não o quiser fazer, apague esta "
+#~ "declaração de exceção da sua versão."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "O conteúdo da pasta Música aparecerá aqui"
+
+#~ msgid "GNOME Music"
+#~ msgstr "Música"
+
+#~ msgid "Window position"
+#~ msgstr "Posição da janela"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Posição da janela (x e y)."
+
+#~ msgid "Loading"
+#~ msgstr "A carregar"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Adicionar à lista de reprodução…"
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "O estado inicial foi mostrado"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Definido como verdadeiro quando o estado inicial foi mostrado"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hey DJ"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Uma maneira fácil de tocar música. Descobre músicas automaticamente em "
+#~ "seu computador, na rede local ou em serviços na Internet."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Encontre faixas em seu repertório local, transfira músicas de servidores "
+#~ "DLNA ou tente algo novo com os serviços Jamendo e Magnatune."
+
+#~ msgid "Released"
+#~ msgstr "Lançado"
+
+#~ msgid "Running Length"
+#~ msgstr "Duração da execução"
+
+#~ msgid "Composer"
+#~ msgstr "Compositor"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Reproduzir"
+
+#~ msgid "Search mode"
+#~ msgstr "Modo de procura"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Se verdadeiro, a barra de procura é mostrada."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Modo de notificações"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Ativa ou desativa notificações de reprodução"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Música é a nova aplicação de reprodução de música do GNOME"
+
+#~ msgid "the|a|an"
+#~ msgstr "a|um|uma"
+
+#~ msgid "All"
+#~ msgstr "Todas"
+
+#~ msgid "Artist"
+#~ msgstr "Artista"
+
+#~ msgid "Album"
+#~ msgstr "Álbum"
+
+#~ msgid "Track Title"
+#~ msgstr "Título da faixa"
+
+#~ msgid "Local"
+#~ msgstr "Local"
+
+#~ msgid "Sources"
+#~ msgstr "Fontes"
+
+#~ msgid "Match"
+#~ msgstr "Comparar"
+
+#~ msgid "Untitled"
+#~ msgstr "Sem nome"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "%d item selecionado"
+#~ msgstr[1] "%d itens selecionados"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Empty"
+#~ msgstr "Vazia"
+
+#~ msgid "_Quit"
+#~ msgstr "_Sair"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "Nº máximo de caracteres a mostrar no nome da faixa na vista Artista"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Esta definição modifica a quantidade de caracteres do título da faixa na "
+#~ "vista Artista. Defina como -1 para desativar."
+
+#~ msgid "the a an"
+#~ msgstr "o a um uma"
+
+#~ msgid "All Artists"
+#~ msgstr "Todos os artistas"
+
+#~ msgid "Not playing"
+#~ msgstr "Não está a reproduzir"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "por %s, de %s"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Selecionar lista de reprodução"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "Nenhuma música encontrada!\n"
+#~ " Coloque alguns ficheiros na pasta %s"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Nova Lista de Reprodução"
+
+#~ msgid "Load More"
+#~ msgstr "Carregar Mais"
+
+#~ msgid "_Now Playing"
+#~ msgstr "_Agora a Reproduzir"
diff --git a/po/pt_BR.po b/po/pt_BR.po
new file mode 100644
index 00000000..754d4c30
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,587 @@
+# Brazilian Portuguese translation for gnome-music.
+# Copyright (C) 2022 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Georges Basile Stavracas Neto <georges.stavracas@gmail.com>, 2013.
+# Antonio Fernandes C. Neto <fernandesn@gnome.org>, 2013.
+# Avelino <adelino.avelino@academico.ifrn.edu.br>, 2013.
+# Ricardo Barbosa <barbosa.cisco@gmail.com>, 2014.
+# Felipe Braga <fbobraga@gmail.com>, 2015.
+# Fábio Nogueira <fnogueira@gnome.org> 2018.
+# Henrique Machado Campos <henriquecamposrj@gmail.com>, 2020.
+# Rafael Fontenelle <rafaelff@gnome.org>, 2012-2021.
+# Enrico Nicoletto <hiko@duck.com>, 2013-2016, 2021-2022.
+# Matheus Barbosa <mdpb.matheus@gmail.com>, 2022.
+# Leônidas Araújo <leorusvellt@hotmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2022-08-31 10:45+0000\n"
+"PO-Revision-Date: 2022-08-31 08:46-0300\n"
+"Last-Translator: Leônidas Araújo <leorusvellt@hotmail.com>\n"
+"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"X-Generator: Gtranslator 40.0\n"
+"X-Project-Style: gnome\n"
+"X-DL-Team: pt_BR\n"
+"X-DL-Module: gnome-music\n"
+"X-DL-Branch: master\n"
+"X-DL-Domain: po\n"
+"X-DL-State: Translating\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:236
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Música"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Reproduza e organize sua coleção de músicas"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Uma maneira fácil e agradável de reproduzir sua música."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Localize faixas na sua coleção local, use listas de reprodução geradas "
+"automaticamente ou faça a curadoria de uma nova."
+
+#: data/org.gnome.Music.appdata.xml.in.in:167
+msgid "The GNOME Music developers"
+msgstr "Os Desenvolvedores do GNOME Música"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Reprodutor de músicas"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Música;Músicas;Music;Reprodutor;Tocador;Player;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Tamanho da janela"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Tamanho da janela (largura e altura)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Janela maximizada"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Estado de janela maximizada."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Modo de repetição de reprodução"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"O valor identifica se deve ou não repetir ou embaralhar a reprodução pela "
+"coleção. Valores aceitos são: “none” (repete e embaralha), “song” (repete a "
+"música atual), “all” (repete a lista de reprodução, sem embaralhar), "
+"“shuffle” (embaralha lista de reprodução, supõe repetição de tudo)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Habilitar ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Habilita ou desabilita ReplayGain por álbuns"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Inibir suspensão do sistema"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Habilita ou desabilita inibição de suspensão do sistema enquanto reproduz "
+"música"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Relatar histórico de músicas para o Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Habilita ou desabilita enviar scrobbles e a informação “currently playing” "
+"para o Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Reproduzir"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Reproduzir"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Adicionar para músicas _favoritas"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Adicionar para lista de reprodução…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Conta do Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Relatar música sendo ouvida"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "A_talhos de teclado"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "A_juda"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Sobre o Música"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Boas vindas ao Música"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Menu"
+
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Selecionar"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Cancelar"
+
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Pesquisar"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "Voltar"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Geral"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Fecha a janela"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Pesquisa"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Ajuda"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Atalhos"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Reprodução"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Reproduz/pausa"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Próxima música"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Música anterior"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Alterna a repetição"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Alterna o embaralhamento"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navegação"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Vai para álbuns"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Vai para artistas"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Vai para músicas"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Vai para listas de reprodução"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Volta"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm é um serviço de descoberta de músicas que fornece recomendações "
+"personalizadas com base nas músicas que você ouve."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Relatório de música não configurado"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Faça login sua conta do Last.fm para relatar suas músicas."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Entrar"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Anterior"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Próxima"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "E_xcluir"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Renomear…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Nome da lista de reprodução"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Finalizado"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Digite um nome para sua primeira lista de reprodução"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "C_riar"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Nova lista de reprodução…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Adicionar"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Adicionar para lista de reprodução"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Adicionar"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artistas"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Ver tudo"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Álbuns"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Músicas"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Selecionar todos"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Selecionar nenhum"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Clique nos itens para selecioná-los"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Adicionar para lista de reprodução"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Remover da lista de reprodução"
+
+#: gnomemusic/about.py:238
+msgid "The GNOME Project"
+msgstr "O Projeto GNOME"
+
+#: gnomemusic/about.py:242
+msgid "translator-credits"
+msgstr "créditos-do-tradutor"
+
+#: gnomemusic/about.py:246
+msgid "Copyright The GNOME Music Developers"
+msgstr "Direitos autorais dos desenvolvedores do GNOME Música"
+
+#: gnomemusic/about.py:249
+msgid "Translated by"
+msgstr "Traduzido por"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Mais tocadas"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Nunca tocadas"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Recentemente tocadas"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Recentemente adicionadas"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Músicas favoritas"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Não foi possível reproduzir o arquivo"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Procurar em {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " e "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} é necessário para reproduzir o arquivo, mas não está instalado."
+msgstr[1] ""
+"{} são necessários para reproduzir o arquivo, mas não estão instalados."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Reproduzindo música"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "Embaralhar"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Repetir música"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Repetir tudo"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr "Desligar embaralhar/repetir"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Lista de reprodução {} removida"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Desfazer"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} removida de {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Álbum desconhecido"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Artista desconhecido"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Seu diretório de XDG Músicas não está definido."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Pasta Músicas"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "O conteúdo da sua {} irá aparecer aqui."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Nenhuma música encontrada"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Tente uma pesquisa diferente"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "O GNOME Música não conseguiu se conectar ao Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Seus arquivos de música não podem ser indexados sem o Tracker em execução."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "A versão do Tracker do seu sistema parece estar desatualizada."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "O Música precisa do Tracker na versão 3.0.0 ou mais novo."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Listas de reprodução"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Resultados de artistas"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Resultados de álbuns"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minuto"
+msgstr[1] "{} minutos"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disco {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} música selecionada"
+msgstr[1] "{} músicas selecionadas"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "A música sendo ouvida é relatada à Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "A música sendo ouvida não é relatada à Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Autenticado como {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Configurar"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pausar"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} música"
+msgstr[1] "{} músicas"
diff --git a/po/ro.po b/po/ro.po
new file mode 100644
index 00000000..fc225b1d
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,776 @@
+# Romanian translation for gnome-music.
+# Copyright (C) 2014 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Bogdan Mințoi <mintoi.bogdan@gmail.com>, 2014.
+# Daniel Șerbănescu <daniel [at] serbanescu [dot] dk>, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-07-29 14:15+0300\n"
+"Last-Translator: Florentina Mușat <florentina [dot] musat [dot] 28 [at] "
+"gmail [dot] com>\n"
+"Language-Team: Gnome Romanian Translation Team <gnomero-list@lists."
+"sourceforge.net>\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
+"20)) ? 1 : 2);\n"
+"X-Generator: Poedit 3.3.2\n"
+"X-Project-Style: gnome\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Muzică"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Redă și organizează colecția dumneavoastră de muzică"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Un mod ușor și plăcut de a reda muzica."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Găsiți piese în colecția locală, utilizați liste de redare generate automat "
+"sau creeați una manual."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Dezvoltatorii Muzică GNOME"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Player pentru muzică"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;Muzică;Redare;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Dimensiune fereastră"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Dimensiune fereastră (lățime și înălțime)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Fereastră maximizată"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Starea ferestrei maximizată."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Mod de repetare a redării"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Valoarea identifică dacă redarea se face repetitiv sau aleatoriu din "
+"colecție. Valorile permise sunt: „nimic” (repetiția și redarea aleatorie "
+"sunt dezactivate), „melodie” (se repetă doar melodia actuală), „tot” (se "
+"repetă toată lista de redare, fără amestecare), „amestecare” (amestecă lista "
+"de redare, implică repetarea întregii liste)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Activează ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Activează sau dezactivează ReplayGain pentru albume"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Inhibă suspendarea sistemului"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Activează sau dezactivează inhibarea suspendării sistemului în timpul "
+"redării de muzică"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Raportează istoricul muzicii la Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Activează sau dezactivează trimiterea de scrobbles și de informații de la "
+"„se redă acum” către Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Redă"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Redare"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Adaugă la Melodii _favorite"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Adaugă în lista de redare…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Cont Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Raportează ascultarea de muzică"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "S_curtături de tastatură"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Ajutor"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Despre Muzică"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Bine ați venit la Muzică"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Meniu"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Selectează"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Anulează"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Caută"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Înapoi"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Generale"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Închide fereastra"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Caută"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Ajutor"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Scurtături"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Redare"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Redare/Pauză"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Melodia următoare"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Melodia precedentă"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Comută repetarea"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Comută amestecarea"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigare"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Navighează la albume"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Navighează la artiști"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Navighează la melodii"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Navighează la listele de redare"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Înapoi"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm este un serviciu de descoperire de muzică ce vă oferă recomandări "
+"personalizate pe baza muzicii pe care o ascultați."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Raportarea de muzică nu este stabilită"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Autentificați-vă la contul Last.fm pentru a raporta ascultarea de muzică."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Autentificare"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Precedenta"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Următoarea"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "Ș_terge"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Redenumește…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Numele listei de redare"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Gata"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Introduceți un nume pentru prima listă de redare"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "C_reează"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Listă de redare nouă…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Adaugă"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Adaugă în lista de redare"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Adaugă"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artiști"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Vizualizează toate"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albume"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Melodii"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Selectează toate"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Deselectează toate"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Clic pe obiecte pentru a le selecta"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Adaugă în lista de redare"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Elimină din lista de redare"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Proiectul GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"Florentina Mușat <florentina [dot] musat [dot] 28 [at] gmail [dot] com>, "
+"2020-2023"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Drepturi de autor dezvoltatorii Music GNOME"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Tradus de"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Cele mai redate"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Niciodată redate"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Redate recent"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Adăugate recent"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Melodii favorite"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Nu s-a putut reda fișierul"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Caută în {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " și "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} este necesar pentru a reda fișierul, dar nu este instalat."
+msgstr[1] "{} sunt necesare pentru a reda fișierul, dar nu sunt instalate."
+msgstr[2] "{} sunt necesare pentru a reda fișierul, dar nu sunt instalate."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Se redă muzica"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Amestecare/Repetare oprită"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Repetă piesa"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Repetă toate"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Amestecă"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Listă de redare {} eliminată"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Anulează"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} eliminat de la {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Album necunoscut"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Artist necunoscut"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Directorul de muzică XDG nu este stabilit."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Dosar de muzică"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Conținuturile a {} vor apărea aici."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Nu s-a găsit muzică"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Încercați o altă căutare"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Muzică GNOME nu s-a putut conecta la Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Fișierele de muzică nu pot fi indexate fără ca Tracker să ruleze."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Versiunea de Tracker din sistem pare învechită."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Muzică are nevoie de Tracker versiunea 3.0.0 sau mai nouă."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Liste de redare"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Rezultate artiști"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Rezultate albume"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minut"
+msgstr[1] "{} minute"
+msgstr[2] "{} de minute"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disc {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "A fost selectat {} cântec"
+msgstr[1] "A fost selectat {} cântece"
+msgstr[2] "A fost selectat {} de cântece"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Ascultarea de muzică este raportată la Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Ascultarea de muzică nu este raportată la Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Autentificat ca {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Configurează"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pauză"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} melodie"
+msgstr[1] "{} melodii"
+msgstr[2] "{} de melodii"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Caută melodii, artiști, albume și liste de redare"
+
+#~ msgid "GNOME Music"
+#~ msgstr "Muzică GNOME"
+
+#~ msgid "Window position"
+#~ msgstr "Poziție fereastră"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Poziție fereastră (x și y)."
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "O aplicație de administrare și redare de muzică pentru GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Vizitați situl web al GNOME Music"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "Muzică GNOME este un software liber; îl puteți redistribui și/sau "
+#~ "modifica în conformitate cu termenii Licenței Publice Generale GNU așa "
+#~ "cum este publicată de Free Software Foundation; fie versiunea 2 a "
+#~ "Licenței, fie (la latitudinea dumneavoastră) orice versiune ulterioară.\n"
+#~ "\n"
+#~ "Muzică GNOME este distribuit cu speranța că va fi util, dar FĂRĂ NICIO "
+#~ "GARANȚIE, fără nici măcar a garanției implicite de VANDABILITATE sau "
+#~ "CONFORMITATE UNUI ANUMIT SCOP. Citiți Licența Publică Generală GNU "
+#~ "pentru mai multe detalii.\n"
+#~ "\n"
+#~ "Ar trebui să fi primit o copie a Licenței Publice Generale GNU împreună "
+#~ "cu Muzică GNOME; dacă nu, scrieți la Free Software Foundation, Inc., 51 "
+#~ "Franklin St., Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "Autorii Muzică GNOME vă oferă permisiunea de a folosi module non-GPL "
+#~ "compatibile cu GStreamer și de a le distribui împreună cu GStreamer și "
+#~ "Muzică GNOME. Această permisiune depășește termenii licenței GPL sub "
+#~ "care Muzică GNOME este pus la dispoziția publicului. Dacă modificați "
+#~ "acest cod, aveți posibilitatea să adăugați această excepție la versiunea "
+#~ "dumneavoastră de cod, dar nu sunteți obligat să o faceți. Dacă nu doriți "
+#~ "acest lucru, ștergeți această declarație din versiunea dumneavoastră."
+
+#~ msgid "Loading"
+#~ msgstr "Se încarcă"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "_Adaugă în lista de redare…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "O modalitate ușoară de a reda muzica deținută. Descoperă automat muzica "
+#~ "de pe calculator, rețeaua locală și servicii de pe internet."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Găsește piese în colecția locală, obțineți muzică de la servere DLNA sau "
+#~ "încercați ceva nou cu noile servicii Jamendo și Magnatune."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Starea inițială a fost afișată"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Stabiliți la adevărat când starea inițială a fost afișată"
+
+#~ msgid "Released"
+#~ msgstr "Lansat"
+
+#~ msgid "Running Length"
+#~ msgstr "Lungimea piesei"
+
+#~ msgid "Composer"
+#~ msgstr "Compozitor"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Redare"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Salut DJ"
+
+#~ msgid "All"
+#~ msgstr "Toate"
+
+#~ msgid "Artist"
+#~ msgstr "Artist"
+
+#~ msgid "Album"
+#~ msgstr "Album"
+
+#~ msgid "Track Title"
+#~ msgstr "Titlul piesei"
+
+#~ msgid "Local"
+#~ msgstr "Local"
+
+#~ msgid "Sources"
+#~ msgstr "Surse"
+
+#~ msgid "Match"
+#~ msgstr "Potrivire"
+
+#~ msgid "Untitled"
+#~ msgstr "Fără titlu"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "_Quit"
+#~ msgstr "_Ieșire"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Muzică este noua aplicație GNOME pentru redare de muzică."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Selectat %d element"
+#~ msgstr[1] "Selectat %d elemente"
+#~ msgstr[2] "Selectat %d de elemente"
+
+#~ msgid "Empty"
+#~ msgstr "Gol"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Search mode"
+#~ msgstr "Mod de căutare"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Dacă este adevărat, bara de căutare va fi afișată."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Mod de notificări"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Actvează sau dezactivează notificările de redare"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Selectează lista de redare"
+
+#~ msgid "Not playing"
+#~ msgstr "Nu este în redare"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "de %s, de la %s"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "Nu s-a găsit nicio muzică!\n"
+#~ " Adăugați câteva fișiere în dosarul %s"
+
+#~ msgid "All Artists"
+#~ msgstr "Toți artiștii"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Listă de redare nouă"
+
+#~ msgid "Load More"
+#~ msgstr "Încarcă mai mult"
+
+#~ msgid "Now _Playing"
+#~ msgstr "Acum _se redă"
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 00000000..b876dd1a
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,654 @@
+# Russian translation for gnome-music.
+# Copyright (C) 2012 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Andrew Archer <razandale@gmail.com>, 2014.
+# Mihail Gurin <mikegurin@yandex.ru>, 2014.
+# Ivan Komaritsyn <vantu5z@mail.ru>, 2015.
+# Yuri Myasoedov <ymyasoedov@yandex.ru>, 2012, 2014, 2015.
+# Stas Solovey <whats_up@tut.by>, 2012-2018, 2019.
+# Артемий Судаков <finziyr@yandex.ru>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-07-28 12:00+0300\n"
+"Last-Translator: Aleksandr Melman <Alexmelman88@gmail.com>\n"
+"Language-Team: Русский <gnome-cyr@gnome.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\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"
+"X-Generator: Poedit 3.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Музыка"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Воспроизведение и управление музыкальной коллекцией"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Лёгкий и приятный способ послушать вашу музыку."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Ищите треки в вашей коллекции, пользуйтесь автоматическими списками "
+"воспроизведения или соберите свой свежий."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Разработчики приложения Музыка GNOME"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Музыкальный проигрыватель"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Музыкальный;Проигрыватель;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Размер окна"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Размер окна (ширина и высота)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Развёрнутое окно"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Режим развёрнутого окна."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Режим повторного воспроизведения"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Значение управляет повтором или случайным воспроизведением коллекции. "
+"Допустимые значения: «none» (повтор и случайный порядок отключены), "
+"«song» (повторять текущую композицию), «all» (повторять список "
+"воспроизведения, случайный порядок отключён), «shuffle» (случайный порядок "
+"включён)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Включить ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Включает или выключает функцию ReplayGain для альбомов"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Запретить переход системы в режим ожидания"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Включает или выключает запрет перехода системы в режим ожидания при "
+"воспроизведении музыки"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Отправлять историю прослушивания на Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Включает или отключает отправку скробблов и информации о «текущем "
+"воспроизведении» на Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Воспроизвести"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Воспроизвести"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Добавить в _избранные песни"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Добавить в список воспроизведения…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Аккаунт Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Отправлять историю прослушивания"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Комбинации клавиш"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Справка"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_О приложении"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Добро пожаловать в Музыку"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Меню"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Выбрать"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Отмена"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Поиск"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Назад"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Основное"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Закрыть окно"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Поиск"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Справка"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Комбинации"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Воспроизведение"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Приостановить/Продолжить"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Следующая песня"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Предыдущая песня"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Переключение режима повтора"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Переключение режима случайного порядка"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Навигация"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Перейти к разделу Альбомы"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Перейти к разделу Исполнители"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Перейти к разделу Песни"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Перейти к разделу Списки воспроизведения"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Перейти назад"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm — это сервис поиска музыки, который дает вам персональные "
+"рекомендации на основе музыки, которую вы слушаете."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Отправка музыки не настроена"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Войдите в свою учетную запись Last.fm, чтобы отправлять историю "
+"прослушивания музыки."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Войти"
+
+# Предыдущая композиция
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Предыдущая"
+
+# Следующая композиция
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Следующая"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Удалить"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Переименовать…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Имя списка воспроизведения"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Готово"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Введите имя вашего первого списка воспроизведения"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Создать"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Создать список воспроизведения…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Добавить"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Добавить в список воспроизведения"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Добавить"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Исполнители"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Посмотреть все"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Альбомы"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Песни"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Выбрать все"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Снять выделение"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Нажмите, чтобы выбрать"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Добавить в список воспроизведения"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Удалить из списка воспроизведения"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "The GNOME Project"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"Andrew Archer <razandale@gmail.com>, 2014\n"
+"Mihail Gurin <mikegurin@yandex.ru>, 2014\n"
+"Ivan Komaritsyn <vantu5z@mail.ru>, 2015\n"
+"Yuri Myasoedov <ymyasoedov@yandex.ru>, 2012, 2014, 2015\n"
+"Stas Solovey <whats_up@tut.by>, 2012-2018, 2019\n"
+"Артемий Судаков <finziyr@yandex.ru>, 2020\n"
+"Aleksandr Melman <alexmelman88@gmail.com>, 2022"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Авторское право © Разработчики приложения Музыка GNOME"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Перевод"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Часто воспроизводимое"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Никогда не воспроизводилось"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Недавно воспроизводилось"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Недавно добавлено"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Избранные песни"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Не удалось воспроизвести файл"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Найти в {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " и "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "Для воспроизведения файла требуется {}, но не установлен."
+msgstr[1] "Для воспроизведения файла требуются {}, но не установлены."
+msgstr[2] "Для воспроизведения файла требуются {}, но не установлены."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Воспроизведение музыки"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Случайный порядок/Повтор выключены"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Повторять песню"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Повторять все"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "В случайном порядке"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Список воспроизведения {} удалён"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Отменить"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} удалено из {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Неизвестный альбом"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Неизвестный исполнитель"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Переменная директории XDG Музыки не установлена."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Папка Музыка"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Содержимое {} появится здесь."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Музыка не найдена"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Попробуйте изменить параметры поиска"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Музыке GNOME не удалось подключиться к Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Ваши музыкальные файлы не могут быть проиндексированы без запущенного "
+"Tracker."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Версия вашей системы Tracker кажется устаревшей."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Для Музыки необходим Tracker версии 3.0.0 или выше."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Списки воспроизведения"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Результаты по исполнителям"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Результаты по альбомам"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} минута"
+msgstr[1] "{} минуты"
+msgstr[2] "{} минут"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Диск {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Выбрана {} песня"
+msgstr[1] "Выбрано {} песни"
+msgstr[2] "Выбрано {} песен"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "История воспроизведения отправлена на Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "История воспроизведения не отправлена на Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Вы вошли как {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Настроить"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Приостановить"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} песня"
+msgstr[1] "{} песни"
+msgstr[2] "{} песен"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Поиск песен, исполнителей, альбомов и списков воспроизведения"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Воспроизведение и управление музыкальной коллекцией в GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Посетить веб-сайт приложения"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "Приложение «Музыка GNOME» является свободным программным обеспечением, вы "
+#~ "можете распространять и/или изменять его в соответствии с условиями GNU "
+#~ "General Public License, опубликованной Free Software Foundation, либо GNU "
+#~ "General Public License v2, либо (на ваш выбор) любой более поздней "
+#~ "версии.\n"
+#~ "\n"
+#~ "Приложение «Музыка GNOME» распространяется в надежде, что оно будет "
+#~ "полезным, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемых гарантий "
+#~ "КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ. См. GNU "
+#~ "General Public License для более подробной информации.\n"
+#~ "\n"
+#~ "Вы должны были получить копию GNU General Public License вместе с "
+#~ "приложением «Музыка GNOME»; а если нет, напишите в Free Software "
+#~ "Foundation, Inc, 51 Franklin Street, пятый этаж, Boston, MA 02110-1301 "
+#~ "США.\n"
+#~ "\n"
+#~ "Авторы приложения «Музыка GNOME» предоставляют разрешение на "
+#~ "использование не-GPL совместимых модулей GStreamer, которые будут "
+#~ "поставлены с GStreamer и «Музыка GNOME». Это разрешение выше и вне "
+#~ "разрешений, предоставленных лицензией GPL, которой защищено приложение "
+#~ "«Музыка GNOME». При изменении этого кода, вы можете распространить данное "
+#~ "исключение на вашу версию кода, но вы не обязаны это делать. Если вы не "
+#~ "хотите распространить данное исключение на вашу версию кода, просто "
+#~ "удалите данное заявление об исключении из вашей версии кода."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Содержимое папки Музыка появится здесь"
diff --git a/po/sk.po b/po/sk.po
new file mode 100644
index 00000000..ebd3b984
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,798 @@
+# Slovak translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Dušan Kazik <prescott66@gmail.com>, 2013, 2014, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2022-08-27 13:27+0000\n"
+"PO-Revision-Date: 2022-10-07 14:36+0200\n"
+"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
+"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
+"Language: sk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:236
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Hudba"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Prehráva a organizuje vašu hudobnú zbierku"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Jednoduchý a príjemný spôsob prehrávania vašej hudby."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Nájdite stopy vo vašej miestnej zbierke, použite automaticky vygenerované "
+"zoznamy skladieb alebo vytvorte svoj vlastný."
+
+#: data/org.gnome.Music.appdata.xml.in.in:167
+msgid "The GNOME Music developers"
+msgstr "Vývojári aplikácie Hudba prostredia GNOME"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Prehrávač hudby"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Hudba;Hudobný;Prehrávač;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Veľkosť okna"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Veľkosť okna (šírka a výška)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Maximalizované okno"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Maximalizovaný stav okna."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Režim opakovaného prehrávania"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Hodnota, ktorá udáva, či sa má opakovať, alebo zamiešať prehrávanie zbierky. "
+"Dovolené hodnoty sú: „none“(opakovanie a zamiešanie je vypnuté), "
+"„song“(opakovanie aktuálnej skladby), „all“(opakovanie zoznamu piesní, bez "
+"zamiešania), „shuffle“(zamiešanie zoznamu skladieb, použije sa opakovanie "
+"všetkých skladieb)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Povoliť ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Povolí alebo zakáže ReplayGain pre albumy"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Potlačiť uspatie systému"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "Povolí alebo zakáže potlačenie uspatia systému počas prehrávania hudby"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Nahlásiť históriu hudby službe Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Povolí alebo zakáže odosielanie názvov skladieb (scrobbling) a informáciu "
+"„aktuálne prehrávané“ službe Last.fm."
+
+# tooltip
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Prehrá"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Prehrať"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Pridať _medzi obľúbené skladby"
+
+# gtk button
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Pridať do zoznamu skladieb…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Účet služby Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Nahlásiť počúvanie hudby"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Klávesové skratky"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Pomocník"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_O aplikácii Hudba"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Vitajte v aplikácii Hudba"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Ponuka"
+
+# tooltip
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Vyberie"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Zrušiť"
+
+# DK:tooltip
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Vyhľadá"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "Späť"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Všeobecné"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Zavretie okna"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Vyhľadanie"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Pomocník"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Skratky"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Prehrávanie"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Prehranie/Pozastavenie"
+
+# DK: skladba
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Nasledujúca skladba"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Predchádzajúca skladba"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Prepnutie opakovania"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Prepnutie zamiešania"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigácia"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Prejdenie na albumy"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Prejdenie na interpretov"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Prejdenie na skladby"
+
+# gtk button
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Prejdenie na zoznamy skladieb"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Prejdenie späť"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm je služba na objavovanie hudby, ktorá vám poskytuje personalizované "
+"odporúčania založené na hudbe, ktorú počúvate."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Nahlásenie hudby nie je nastavené"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Pre nahlásenie vami počúvanej hudby, sa prihláste do služby Last.fm."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Prihlásiť"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Predchádzajúca"
+
+# DK: skladba
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Nasledujúca"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "O_dstrániť"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Premenovať…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Názov zoznamu skladieb"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Dokončiť"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Zadajte názov vášho prvého zoznamu skladieb"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "Vytvo_riť"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Nový zoznam skladieb…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Pridať"
+
+# gtk button
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Pridanie do zoznamu skladieb"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Pridať"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Interpreti"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Zobraziť všetko"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albumy"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Skladby"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Vybrať všetko"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Zrušiť výber"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Kliknutím na položku ju vyberiete"
+
+# gtk button
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Pridať do zoznamu skladieb"
+
+# gtk button
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "O_dstrániť zo zoznamu skladieb"
+
+#: gnomemusic/about.py:238
+msgid "The GNOME Project"
+msgstr "Projekt GNOME"
+
+#: gnomemusic/about.py:242
+msgid "translator-credits"
+msgstr "Dušan Kazik <prescott66@gmail.com>"
+
+#: gnomemusic/about.py:246
+msgid "Copyright The GNOME Music Developers"
+msgstr "Autorské práva: vývojári aplikácie Hudba prostredia GNOME"
+
+#: gnomemusic/about.py:249
+msgid "Translated by"
+msgstr "Preložili"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Najviac prehrávané"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Nikdy neprehraté"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Nedávno prehrávané"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Nedávno pridané"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Obľúbené skladby"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Nie je možné prehrať tento súbor"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Nájsť v aplikácii {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " a "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] ""
+"Kodeky {} sú potrebné na prehranie tohto súboru, ale nie sú nainštalované."
+msgstr[1] ""
+"Kodek {} je potrebný na prehranie tohto súboru, ale nie je nainštalovaný."
+msgstr[2] ""
+"Kodeky {} sú potrebné na prehranie tohto súboru, ale nie sú nainštalované."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Prehráva sa hudba"
+
+# GtkRadioMenuItem
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "Zamiešať"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Opakovať skladbu"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Opakovať všetko"
+
+# GtkRadioMenuItem
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr "Vypnúť zamiešanie/opakovanie"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Zoznam skladieb {} bol odstránený"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Vrátiť späť"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "Skladba {} odstránená zo zoznamu skladieb {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Neznámy album"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Neznámy interpret"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Váš hudobný XDG adresár nie je nastavený."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "priečinku s hudbou"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Tu sa zobrazí obsah vášho {}."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Nenašla sa žiadna hudba"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Skúste vyhľadať niečo iné"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Aplikácii Hudba prostredia GNOME sa nepodarilo pripojiť k sledovaču."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Vaše hudobné súbory nemôžu byť indexované bez spusteného sledovača."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Zdá sa, že verzia vášho systémového sledovača je zastaralá."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Aplikácia Hudba vyžaduje verziu sledovača 3.0.0 alebo vyššiu."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Zoznamy skladieb"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Výsledky s interpretami"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Výsledky s albumami"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minút"
+msgstr[1] "{} minúta"
+msgstr[2] "{} minúty"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disk č. {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Vybraných {} skladieb"
+msgstr[1] "Vybraná {} skladba"
+msgstr[2] "Vybrané {} skladby"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Vami počúvaná hudba je nahlásená službe Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Vami počúvaná hudba nie je nahlásená službe Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Prihlásený ako {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Nastaviť"
+
+# tooltip
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Pozastaví"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} skladieb"
+msgstr[1] "{} skladba"
+msgstr[2] "{} skladby"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Aplikácia na prehrávanie a správu hudby prostredia GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Navštíviť domovskú stránku aplikácie Hudba prostredia GNOME"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "Aplikácia Hudba prostredia GNOME je slobodný softvér; môžete ho ďalej "
+#~ "šíriť a upravovať podľa ustanovení licencie GNU General Public Licence "
+#~ "(Všeobecná zverejňovacia licencia GNU), vydávanej nadáciou Free Software "
+#~ "Foundation a to buď podľa 2. verzie tejto licencie, alebo (podľa vášho "
+#~ "uváženia) ktorejkoľvek neskoršej verzie.\n"
+#~ "\n"
+#~ "Tento program je rozširovaný v nádeji, že bude užitočný, avšak BEZ "
+#~ "AKEJKOĽVEK ZÁRUKY. Neposkytujú sa ani odvodené záruky PREDAJNOSTI alebo "
+#~ "VHODNOSTI NA URČITÝ ÚČEL. Ďalšie podrobnosti hľadajte v licencii GNU "
+#~ "General Public License.\n"
+#~ "\n"
+#~ "Kópiu licencie GNU General Public License by ste mali dostať spolu s "
+#~ "týmto programom. Ak sa tak nestalo, napíšte na adresu Free Software "
+#~ "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Autori programu Hudba prostredia GNOME týmto vyhlasujú, že udeľujú právo "
+#~ "použiť a distribuovať zásuvné moduly knižnice GStreamer, ktoré nie sú "
+#~ "kompatibilné s GPL, spolu s týmto programom. Toto právo je nadrámec práv "
+#~ "zaručených licenciou GPL, pod ktorú tento program spadá. Ak upravíte "
+#~ "zdrojový kód tohto programu, môžete túto výnimku použiť aj na vašu verziu "
+#~ "kódu, no nie ste povinný tak urobiť. Ak to nechcete urobiť, vymažte z "
+#~ "túto výnimku z vyhlásenia vo vašej verzii kódu."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Tu sa zobrazí obsah vášho priečinku s hudbou"
+
+#~ msgid "GNOME Music"
+#~ msgstr "Hudba prostredia GNOME"
+
+#~ msgid "Window position"
+#~ msgstr "Pozícia okna"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Pozícia okna (x a y)."
+
+#~ msgid "Loading"
+#~ msgstr "Načítava sa"
+
+# gtk button
+#~ msgid "Add to Playlist…"
+#~ msgstr "Pridať do zoznamu skladieb…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Jednoduchý spôsob ako prehrávať vašu hudbu. Automaticky objavujte hudbu "
+#~ "vo vašom počítači, sieti a internetových službách."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Nájdite skladby vo vašej miestnej zbierke, získajte hudbu zo serverov "
+#~ "DLNA, alebo vyskúšajte niečo nové so službami Jamendo a Magnatune."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Počiatočný stav bol zobrazený"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Nastavte na hodnotu TRUE, keď počiatočný stav bol zobrazený"
+
+#~ msgid "Released"
+#~ msgstr "Vydaný"
+
+#~ msgid "Running Length"
+#~ msgstr "Dĺžka"
+
+#~ msgid "Composer"
+#~ msgstr "Skladateľ"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Prehrať"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hey DJ"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Hudba je nová aplikácia na prehrávanie hudby v prostredí GNOME."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "Režim vyhľadávania"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Ak je nastavené na true, bude zobrazený panel vyhľadávania."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Režim oznámení"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Povolí alebo zakáže oznámenia o prehrávaní"
+
+#~ msgid "All"
+#~ msgstr "Všetko"
+
+#~ msgid "Artist"
+#~ msgstr "Interpret"
+
+#~ msgid "Album"
+#~ msgstr "Album"
+
+#~ msgid "Track Title"
+#~ msgstr "Názov stopy"
+
+#~ msgid "Local"
+#~ msgstr "Miestne"
+
+#~ msgid "Sources"
+#~ msgstr "Zdroje"
+
+#~ msgid "Match"
+#~ msgstr "Vhodné hľadanému výrazu"
+
+# uri
+#~ msgid "Untitled"
+#~ msgstr "Nepomenovaný"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Vybraných %d položiek"
+#~ msgstr[1] "Vybraná %d položka"
+#~ msgstr[2] "Vybrané %d položky"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Empty"
+#~ msgstr "Prázdne"
+
+#~ msgid "_Quit"
+#~ msgstr "U_končiť"
+
+# dialog title
+#~ msgid "Select Playlist"
+#~ msgstr "Výber zoznamu skladieb"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr ""
+#~ "Maximálne počet zobrazených znakov názvu stopy v zobrazení interpreta"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Toto nastavenie upravuje počet znakov názvu skladby v zobrazení "
+#~ "interpreta. Znaky nad tento počet budú nahradené výpustkom. Na zakázanie "
+#~ "tejto funkcie zadajte hodnotu -1."
+
+#~ msgid "the a an"
+#~ msgstr "the"
+
+#~ msgid "All Artists"
+#~ msgstr "Všetci interpreti"
+
+#~ msgid "Not playing"
+#~ msgstr "Neprehráva sa"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "od interpreta %s, z albumu %s"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "Nenašla sa žiadna hudba!\n"
+#~ "Vložte nejaké súbory do priečinka %s"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Nový zoznam skladieb"
+
+#~ msgid "Load More"
+#~ msgstr "Načítať viac"
diff --git a/po/sl.po b/po/sl.po
new file mode 100644
index 00000000..e46d2f7f
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,939 @@
+# Slovenian translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# Matej Urbančič <mateju@src.gnome.org>, 2009–2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-29 08:38+0000\n"
+"PO-Revision-Date: 2023-07-29 15:46+0200\n"
+"Last-Translator: Matej Urbančič <mateju@src.gnome.org>\n"
+"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
+"Language: sl_SI\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
+"n%100==4 ? 3 : 0);\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Glasba"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Predvajanje in upravljanje glasbene zbirke"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Enostaven in uporabniku prijazen način predvajanja glasbe."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Iskanje posnetkov v krajevnih zbirkah in uporaba samodejnega ali "
+"načrtovanega pripravljanja seznamov predvajanja."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Razvijalci programa GNOME Glasba"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Predvajalnik glasbe"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Glasba;Predvajalnik;Music;Albumi;izvajalci;skladbe;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Velikost okna"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Velikost okna (širina in višina)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Razpeto okno"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Razpeto stanje okna."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Način ponavljanja predvajanja"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Vrednost določa, ali naj se predvajanje posnetkov izvaja naključno ali "
+"ponavljajoče. Dovoljene možnosti so: »brez« (ponavljanje in mešanje skladb "
+"je onemogočeno, »posnetek« (ponavljaj trenutni posnetek) , »vse« (ponavljaj "
+"seznam predvajanja brez mešanja) in »premešano« (vrstni red je premešan, "
+"ponovljene pa bodo vse skladbe)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "_Omogoči ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Omogoči ali onemogoči podporo ReplayGain za albume"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Prepreči sistemski prehod v pripravljenost"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Preklopi možnost preprečevanja prehoda v stanje pripravljenosti med "
+"predvajanjem glasbe."
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Pošiljaj zgodovino poslušane glasbe na Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Omogoči oziroma onemogoči pošiljanje podatkov »trenutno predvajanih skladb« "
+"na Last.fm"
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Predvajaj"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Predvajaj"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "_Dodaj med priljubljene"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Dodaj na seznam predvajanja …"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Račun Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Poročaj o poslušanju glasbe"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Tipkovne bližnjice"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "Pomo_č"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_O programu"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Dobrodošli"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Meni"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Izberi"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Prekliči"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Iskanje"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Nazaj"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Splošno"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Zapre okno"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Začne iskanje"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Pokaže pomoč"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Tipkovne bližnjice"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Predvajanje"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Preklopi Predvajanje/Premor"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Skoči na naslednjo skladbo"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Skoči na predhodno skladbo"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Preklopi ponavljanje"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Preklopi premešanje"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Upravljanje"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Skoči na pogled albumov"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Skoči na pogled izvajalcev"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Skoči na pogled skladb"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Skoči na sezname predvajanja"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Skoči na predhodni pogled"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Spletišče Last.fm je storitev odkrivanja glasbe, ki omogoča priporočila, "
+"oblikovana po glasbi, ki jo najpogosteje poslušate."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Omejitev poročanja o poslušanju glasbe"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Prijavite se v račun Last.fm za poročanje o poslušanju glasbe"
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Prijava"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Predhodna"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Naslednja"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Izbriši"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "P_reimenuj …"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Ime seznama predvajanja"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Končano"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Ime prvega seznama predvajanja"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Ustvari"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Nov seznam predvajanja …"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Dodaj"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Dodaj na seznam predvajanja"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Dodaj"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Izvajalci"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Pokaži vse"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albumi"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Skladbe"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Izberi vse"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Odstrani izbor"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "S klikom se predmeti izberejo."
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "Dodaj na _seznam predvajanja"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Odstrani s seznama predvajanja"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Projekt GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Matej Urbančič <mateju@src.gnome.org>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Avtorske pravice razvijalcev programa GNOME Glasba"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Prevod:"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Najpogosteje predvajano"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Nikoli predvajano"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Nedavno predvajano"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Nedavno dodano"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Priljubljeni posnetki"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Datoteke ni mogoče predvajati."
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Najdi v {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr "in "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} so zahtevani za predvajanje datoteke, vendar niso nameščeni."
+msgstr[1] "{} je zahtevan za predvajanje datoteke, vendar ni nameščen."
+msgstr[2] "{} sta zahtevana za predvajanje datoteke, vendar nista nameščena."
+msgstr[3] "{} so zahtevani za predvajanje datoteke, vendar niso nameščeni."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Predvajanje glasbe"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Onemogoči premešanje/ponavljanje"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Ponovi skladbo"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Ponovi vse"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Premešaj"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Seznam predvajanja {} je odstranjen"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Razveljavi"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} odstranjen iz {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Neznan album"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Neznan izvajalec"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Mapa glasbe XDG ni nastavljena."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Glasbena mapa"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Vsebina {} bo prikazana na tem mestu."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Ni shranjene glasbe"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Poskusite drugačno iskanje"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Ni mogoče vzpostaviti povezave s programom Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Glasbenih datotek brez zagnanega programa Tracker ni mogoče indeksirati."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Sistemska različica paketa Tracker je videti zastarela."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr ""
+"Program Music zahteva namestitev različice paketa Tracker 3.0.0 ali višje."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Seznami predvajanja"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Izvajalci"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Albumi"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minut"
+msgstr[1] "{} minuta"
+msgstr[2] "{} minuti"
+msgstr[3] "{} minute"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disk {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Izbranih je {} skladb"
+msgstr[1] "Izbrana je {} skladba"
+msgstr[2] "Izbrani sta {} skladbi"
+msgstr[3] "Izbrane so {} skladbe"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Poročilo o poslušanju glasbe je poslano na Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Podatki poslušanja glasbe niso posredovani na Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Trenutno je dejavna prijava {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Nastavi"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Premor"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} skladb"
+msgstr[1] "{} skladba"
+msgstr[2] "{} skladbi"
+msgstr[3] "{} skladbe"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Poišči skladbe, izvajalce, albume in sezname predvajanj"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Program GNOME za upravljanje in predvajanje glasbe."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Spletna stran programa GNOME Glasba"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "Program GNOME Music je prosta programska oprema; dovoljeno je razširjanje "
+#~ "in spreminjanje pod pogoji Splošnega Javnega Dovoljenja (GNU), kot je "
+#~ "objavljena pri Free Software Foundation; različice 2 ali katerekoli "
+#~ "kasnejše.\n"
+#~ "\n"
+#~ "Program se razširja v upanju, da bo koristen, vendar pa brez VSAKRŠNEGA "
+#~ "JAMSTVA; tudi brez posredne zagotovitve CENOVNE VREDNOSTI ali PRIMERNOSTI "
+#~ "ZA DOLOČEN NAMEN. Za več podrobnosti si oglejte dovoljenje.\n"
+#~ "\n"
+#~ "\n"
+#~ "Skupaj s programom bi morali prejeti tudi kopijo Splošnega Javnega "
+#~ "dovoljenja GNU /GNU GPL). V primeru, da je niste, si oglejte <http://www."
+#~ "gnu.org/licenses/>.\n"
+#~ "\n"
+#~ "Avtorji programa GNOME Music dovolijo uporabo in razširjanje z "
+#~ "dovoljenjem neskladnih vstavkov programa GStreamer. Dovoljenje presega "
+#~ "Splošno Javno dovoljenje, s katerim je avtorsko zaščiten program GNOME "
+#~ "Music. V kolikor boste spreminjali to kodo, lahko razširite izjemo na "
+#~ "različico kode, vendar tega niste dolžni narediti. Če tega ne želite, "
+#~ "izbrišite izjavo izjeme iz vaše različice."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Vsebina glasbene mape bo prikazana na tem mestu."
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME Glasba"
+
+#~ msgid "Window position"
+#~ msgstr "Položaj okna"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Položaj okna (osi x in y)."
+
+#~ msgid "Loading"
+#~ msgstr "Nalaganje"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Dodaj na seznam predvajanja …"
+
+#~ msgid "Remove From Playlist"
+#~ msgstr "Odstrani s seznama predvajanja"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Enostaven način za predvajanje glasbe. Samodejno odkrivanje glasbe na "
+#~ "računalniku, v krajevnem omrežju in prek internetnih storitev."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Iskanje posnetkov v zbirki, pridobivanje glasbe prek strežnikov DLNA in "
+#~ "iskanje s storitvami Jamendo in Magnatune."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Začetno stanje je onemogočeno"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Izbrana možnost določa, da je bilo začetno stanje prikazano."
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version.\n"
+#~ "\n"
+#~ "“Magic of the vinyl” by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+#~ "https://www.flickr.com/photos/_spy_/12270839403"
+#~ msgstr ""
+#~ "GNOME Glasba je prosta programska oprema; program lahko razširjate in/ali "
+#~ "spreminjate pod pogoji Splošnega Javnega Dovoljenja GNU (angleško: GNU "
+#~ "General Public License), kot je objavljen s strani ustanove Free Software "
+#~ "Foundation; različice 2 ali (po želji) katerekoli kasnejše različice.\n"
+#~ "\n"
+#~ "Program se razširja v upanju, da bo uporabniku koristen, vendar BREZ "
+#~ "VSAKRŠNE GARANCIJE; tudi brez posrednega zagotovila JAMSTVA CENOVNE "
+#~ "VREDNOSTI in PRIMERNOSTI ZA DOLOČENO UPORABO. Za več podrobnosti si "
+#~ "poglejte določila Splošnega Javnega Dovoljenja GNU.\n"
+#~ "\n"
+#~ "Kopijo tega dokumenta bi morali prejeti skupaj s programom, v kolikor pa "
+#~ "je niste, si dovoljenje poglejte na spletni strani <http://www.gnu.org/"
+#~ "licenses>, oziroma pišite na naslov organizacije Free Software "
+#~ "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 "
+#~ "USA.\n"
+#~ "\n"
+#~ "Avtorji programa GNOME Music dovoljujejo uporabo ne-GPL skladnih vstavkov "
+#~ "GStreamer skupaj s programom. To dovoljenje presega dovoljenja GPL, ki "
+#~ "pokriva program. V kolikor spreminjate to kodo, lahko razširite izjemo na "
+#~ "vašo različico kode, ni pa to nujno. Če ne želite, izbrišite to trditev "
+#~ "iz vaše različice.\n"
+#~ "\n"
+#~ "Slika Samija Pyylampija »Magic of the vinyl« je objavljena z dovoljenjem "
+#~ "CC-BY-SA 2.0 https://www.flickr.com/photos/_spy_/12270839403"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hej, DJ"
+
+#~ msgid "Released"
+#~ msgstr "Izdano"
+
+#~ msgid "Running Length"
+#~ msgstr "Skupna dolžina"
+
+#~ msgid "Composer"
+#~ msgstr "Skladatelj"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Predvajaj"
+
+#~ msgid "All"
+#~ msgstr "Vse"
+
+#~ msgid "Artist"
+#~ msgstr "Izvajalec"
+
+#~ msgid "Album"
+#~ msgstr "Album"
+
+#~ msgid "Track Title"
+#~ msgstr "Naslov skladbe"
+
+#~ msgid "Local"
+#~ msgstr "Krajevno"
+
+#~ msgid "Sources"
+#~ msgstr "Viri"
+
+#~ msgid "Match"
+#~ msgstr "Se sklada"
+
+#~ msgid "Untitled"
+#~ msgstr "Neimenovano"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "_Quit"
+#~ msgstr "_Končaj"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Glasba je program za predvajanje glasbe za namizje GNOME."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Izbranih je %d predmetov"
+#~ msgstr[1] "Izbran je %d predmet"
+#~ msgstr[2] "Izbrana sta %d predmeta"
+#~ msgstr[3] "Izbrani so %d predmeti"
+
+#~ msgid "Empty"
+#~ msgstr "Prazno"
+
+#~ msgid "Search mode"
+#~ msgstr "Iskalni način"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Izbrana možnost določa prikaz iskalne vrstice."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Način obvestil"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Omogoči prikaz obvestil predvajanja"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Izbor seznama predvajanja"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an"
+
+#~ msgid ""
+#~ "Value identifies whether to repeat or randomize playback through the "
+#~ "collection. Allowed values are: \"none\" (repeat and shuffle are off), "
+#~ "\"song\" (repeat current song), \"all\" (repeat playlist, no shuffle), "
+#~ "\"shuffle\" (shuffle playlist, presumes repeat all)."
+#~ msgstr ""
+#~ "Vrednost določa, ali naj se predvajanje posnetkov izvaja naključno ali "
+#~ "ponavljajoče. Dovoljene možnosti so: \"brez\" (ponavljanje in mešanje "
+#~ "skladb je onemogočeno, \"posnetek\" (ponavljaj trenutni posnetek) , "
+#~ "\"vse\" (ponavljaj seznam predvajanja brez mešanja) in "
+#~ "\"premešano\" (vrstni red je premešan, ponovljene pa bodo vse skladbe)."
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "Največje število znakov naslova sledi v pogledu izvajalca"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Nastavitev določa število znakov naslova sledi v pogledu izvajalcev, "
+#~ "preden je okrajšan. Vrednost -1 onemogoči nastavitev."
+
+#~ msgid "the a an"
+#~ msgstr "the a an"
+
+#~ msgid "All Artists"
+#~ msgstr "Vsi izvajalci"
+
+#~ msgid "Copyright © 2013 GNOME Music Developers"
+#~ msgstr "Avtorske pravice © 2013 Razvijalci programa GNOME Music"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version.\n"
+#~ "\n"
+#~ "\"Magic of the vinyl\" by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+#~ "https://www.flickr.com/photos/_spy_/12270839403\n"
+#~ msgstr ""
+#~ "Program Gnome Music je opredeljen kot prosta programska oprema; lahko ga "
+#~ "razširjate in/ali spreminjate pod pogoji Splošnega Javnega Dovoljenja GNU "
+#~ "(angleško: GNU General Public License), kot ga je objavila ustanova Free "
+#~ "Software Foundation; različice 3 ali (po želji) katerekoli kasnejše "
+#~ "različice.\n"
+#~ "\n"
+#~ "Program se razširja v upanju, da bo uporabniku koristen, vendar BREZ "
+#~ "VSAKRŠNE GARANCIJE; tudi brez posrednega zagotovila JAMSTVA CENOVNE "
+#~ "VREDNOSTI in PRIMERNOSTI ZA DOLOČENO UPORABO. Za več podrobnosti si "
+#~ "poglejte določila Splošnega Javnega Dovoljenja GNU.\n"
+#~ "\n"
+#~ "Kopijo tega dokumenta bi morali prejeti skupaj s programom, v kolikor pa "
+#~ "je niste, si dovoljenje poglejte na spletni strani <http://www.gnu.org/"
+#~ "licenses>.\n"
+#~ "\n"
+#~ "Avtorji programa GNOME Music dovoljujejo uporabo ne-GPL skladnih vstavkov "
+#~ "GStreamer skupaj s programom. To dovoljenje presega dovoljenja GPL, ki "
+#~ "pokriva program. V kolikor spreminjate to kodo, lahko razširite izjomo na "
+#~ "vašo različico kodo, ni pa to nujno. Če ne želite, izbrišite to trditev "
+#~ "iz vaše različice.\n"
+#~ "\n"
+#~ "Slika Samija Pyylampija \"Magic of the vinyl\" je objavljena z "
+#~ "dovoljenjem CC-BY-SA 2.0 https://www.flickr.com/photos/_spy_/12270839403\n"
+
+#~ msgid "Cancel"
+#~ msgstr "Prekliči"
+
+#~ msgid "Not playing"
+#~ msgstr "Ni predvajanja"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "%s (album %s)"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "Posnetkov ni mogoče najti!\n"
+#~ " Nekaj datotek je treba kopirati v mapo %s"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Nov seznam predvajanja"
+
+#~ msgid "Load More"
+#~ msgstr "Naloži dodatne"
+
+#~ msgid "Now _Playing"
+#~ msgstr "_Predvajanje"
+
+#~ msgid "<span color='grey'>Released</span>"
+#~ msgstr "<span color='grey'>Objavljeno</span>"
+
+#~ msgid "<span color='grey'>Running Length</span>"
+#~ msgstr "<span color='grey'>Dolžina predvajanja</span>"
+
+#~ msgid "----"
+#~ msgstr "----"
+
+#~ msgid "--:--"
+#~ msgstr "--:--"
+
+#~ msgid "00:00"
+#~ msgstr "00:00"
+
+#~ msgid "/"
+#~ msgstr "/"
+
+#~ msgid "If true, do randomized playback through the collection"
+#~ msgstr "Izbrana možnost določa naključno predvajanje posnetkov v zbirki"
diff --git a/po/sr.po b/po/sr.po
new file mode 100644
index 00000000..e2c289d4
--- /dev/null
+++ b/po/sr.po
@@ -0,0 +1,791 @@
+# Serbian translation for gnome-music.
+# Courtesy of Prevod.org team (http://prevod.org/) -- 2013–2017.
+# This file is distributed under the same license as the gnome-music package.
+# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2013–2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2022-09-06 03:05+0000\n"
+"PO-Revision-Date: 2022-09-06 10:03+0200\n"
+"Last-Translator: Марко М. Костић <marko.m.kostic@gmail.com>\n"
+"Language-Team: српски <gnome-sr@googlegroups.org>\n"
+"Language: sr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Project-Style: gnome\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:236
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Музика"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Слушајте и уређујте музичку збирку"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Лаган и угодан начин за пуштање музике."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Нађите нумере у вашој локалној збирци, користите самостворене спискове "
+"нумера или направите нови."
+
+#: data/org.gnome.Music.appdata.xml.in.in:167
+msgid "The GNOME Music developers"
+msgstr "Програмери Гномове музике"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Програм за музику"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;музика;пусти;пуштач;плејер;muzika;pusti;puštač;plejer;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Величина прозора"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Величина прозора (ширина и висина)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Увећан прозор"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Стање увећаног прозора."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Режим понављања пуштања"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Вредност која одређује да ли ће пуштање кроз збирку бити поновљено или "
+"насумично. Допуштене вредности су: „none“ (понављање и мешање су искључени), "
+"„song“ (понавља текућу песму), „all“ (понавља списак нумера, не меша), "
+"„shuffle“ (меша списак нумера, подразумева понављање свега)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Укључује појачање понављања"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Укључује или искључује појачање понављања за албуме"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Спречи обуставу система"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Омогућава или онемогућава спречавање обуставе система док се пушта музика"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Пошаљи музички историјат на Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Омогућава или онемогућава слање скроблова и податке о тренутном слушању на "
+"Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Пусти"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Пусти"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Додај у _омиљене песме"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Додај на списак нумера…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm налог"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Пошаљи податке о слушању"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Пречице тастатуре"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "По_моћ"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_О Музици"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Добро дошли у Музику"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Изборник"
+
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Изабери"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Откажи"
+
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Потражи"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "Назад"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Опште"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Затвара прозор"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Претрага"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Помоћ"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Пречице"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Пуштање"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Пушта/паузира"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Следећа песма"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Претходна песма"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Прекидач за понављање"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Прекидач за мешање"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Навигација"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Иде на албуме"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Иде на извођаче"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Иде на песме"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Иде на списак нумера"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Иде назад"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm је услуга за откривање музике која вам даје персонализоване "
+"препоруке на основу музике коју слушате."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Пријављивање музике није подешено"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Пријавите се уз помоћ вашег Last.fm налога да бите пријавили ваше слушалачке "
+"навике."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Пријава"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Претходно"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Наредно"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Обриши"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Преименуј…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Назив списка нумера"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Готово"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Унесите назив за ваш први списак нумера"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "_Направи"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Нови списак нумера…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Додај"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Додај на списак нумера"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Додај"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Извођачи"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Прикажи све"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Албуми"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Песме"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Изабери све"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Поништи избор"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Кликните на ставке да их изаберете"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Додај на списак нумера"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Уклони са списка нуме_ра"
+
+#: gnomemusic/about.py:238
+msgid "The GNOME Project"
+msgstr "Гномов пројекат"
+
+#: gnomemusic/about.py:242
+msgid "translator-credits"
+msgstr ""
+"Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
+"Марко М. Костић <marko.m.kostic@gmail.com>\n"
+"https://гном.срб — превод Гнома на српски језик."
+
+#: gnomemusic/about.py:246
+msgid "Copyright The GNOME Music Developers"
+msgstr "Ауторска права програмери Гномове музике"
+
+#: gnomemusic/about.py:249
+msgid "Translated by"
+msgstr "Превод"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Највише пуштане"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Никад пуштане"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Недавно пуштане"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Недавно додате"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Омиљене песме"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Не могу да пустим датотеку"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Пронађи у {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " и "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} је потребан за пуштање датотеке али није инсталиран."
+msgstr[1] "{} су потребни за пуштање датотеке али нису инсталирани."
+msgstr[2] "{} су потребни за пуштање датотеке али нису инсталирани."
+msgstr[3] "{} је потребан за пуштање датотеке али није инсталиран."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Пуштам музику"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "Насумично"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Понови песму"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Понови све"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr "Искључи мешање/понављање"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Списак нумера {} је уклоњен"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Опозови"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "Ставка {} уклоњена из {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Непознат албум"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Непознат извођач"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "XDG музичка фасцикла није постављена."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Фасцикла са музиком"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Садржај фасцикле „{}“ ће се појавити овде."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Нисам пронашао музику"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Пробајте са другачијом претрагом"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Гномова Музика није могла да се повеже на Трагача."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Ваше музичке датотеке не могу бити пописане уколико Трагач није покренут."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Издање вашег системског трагача делује застарело."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Музици је потребан трагач (Tracker) издања 3.0.0 или новијег."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Списак нумера"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Резултати извођача"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Резултати албума"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} минут"
+msgstr[1] "{} минута"
+msgstr[2] "{} минута"
+msgstr[3] "{} минут"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Диск {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Изабрана је {} песма"
+msgstr[1] "Изабране су {} песме"
+msgstr[2] "Изабрано је {} песми"
+msgstr[3] "Изабрана је једна песма"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Ваше слушалачке навике се шаљу на Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Ваше слушалачке навике се не шаљу на Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Пријављен као {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Подеси"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Застани"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} песма"
+msgstr[1] "{} песме"
+msgstr[2] "{} песама"
+msgstr[3] "{} песма"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Гномов програм за пуштање и управљање музиком."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Посетите веб страницу Гномове музике"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "Овај програм је слободан софтвер; можете га прослеђивати\n"
+#~ "и/или мењати под условима Гнуове опште јавне лиценце коју је\n"
+#~ "објавила Задужбина слободног софтвера; верзије 2 лиценце,\n"
+#~ "или (по вашем избору) било које новије верзије.\n"
+#~ "\n"
+#~ "Овај програм се расподељује у нади да ће бити користан,\n"
+#~ "али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ; чак и без примењене гаранције\n"
+#~ "ТРЖИШНЕ ВРЕДНОСТИ или ПРИЛАГОЂЕНОСТИ ОДРЕЂЕНОЈ НАМЕНИ.\n"
+#~ "Погледајте Гнуову општу јавну лиценцу за више детаља.\n"
+#~ "\n"
+#~ "Требали сте да примите примерак ГНУ Опште јавне лиценце\n"
+#~ "уз овај програм; ако нисте, пишите Задужбини слободног\n"
+#~ "софтвера на адресу: „Free Software Foundation, Inc.,\n"
+#~ "51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.“\n"
+#~ "\n"
+#~ "Аутори Гномове музике безусловно гарантују овлашћења за коришћење и "
+#~ "расподелу прикључака Гстримера који нису сагласни са ОЈЛ-ом уз Гстример и "
+#~ "Гномову музику. Ово овлашћење је изнад и испод овлашћења које обезбеђује "
+#~ "ОЈЛ дозвола којом је покривена Гномова музика. Ако измените овај код, "
+#~ "можете да проширите овај изузетак на ваше издање кода, али нисте обавезни "
+#~ "да то и урадите. Ако не желите да урадите ово, обришите стање овог "
+#~ "изузетка из вашег издања."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Садржај фасцикле „Музика“ појавиће се овде"
+
+#~ msgid "GNOME Music"
+#~ msgstr "Гномова музика"
+
+#~ msgid "Window position"
+#~ msgstr "Положај прозора"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Положај прозора (положено и усправно)."
+
+#~ msgid "Loading"
+#~ msgstr "Учитавам"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Додај на списак нумера…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Једноставан начин за слушање ваше музике. Аутоматски откријте музику на "
+#~ "вашем рачунару, локалној мрежи и на интернет услугама."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Нађите нумере у вашој локалној збирци, добавите музику са ДЛНА сервера "
+#~ "или пробајте нешто ново са Џамендо и Магнатјун услугама."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Почетно стање је приказано"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Постави на тачно када се почетно стање прикаже"
+
+#~ msgid "Released"
+#~ msgstr "Издат"
+
+#~ msgid "Running Length"
+#~ msgstr "Дужина трајања"
+
+#~ msgid "Composer"
+#~ msgstr "Композитор"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Пусти"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Хеј! Ди-џеј!"
+
+#~ msgid "All"
+#~ msgstr "Све"
+
+#~ msgid "Artist"
+#~ msgstr "Извођач"
+
+#~ msgid "Album"
+#~ msgstr "Албум"
+
+#~ msgid "Track Title"
+#~ msgstr "Наслов нумере"
+
+#~ msgid "Local"
+#~ msgstr "Месно"
+
+#~ msgid "Sources"
+#~ msgstr "Извори"
+
+#~ msgid "Match"
+#~ msgstr "Поклопи"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "Без наслова"
+
+#~ msgid "_Quit"
+#~ msgstr "_Изађи"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Музика је нови Гномов програм за пуштање музике."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "Режим претраге"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Ако је изабрано, биће приказана трака за претрагу."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Режим обавештавања"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Укључује или искључује обавештења пуштања"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Изабрана је %d ставка"
+#~ msgstr[1] "Изабране су %d ставке"
+#~ msgstr[2] "Изабрано је %d ставки"
+#~ msgstr[3] "Изабрана је %d ставка"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Empty"
+#~ msgstr "Празно"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Изаберите списак нумера"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "Највише знакова за приказ у називу нумере у прегледу извођача"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Ово подешавање мења број знакова за наслов нумере у прегледу извођача пре "
+#~ "његовог скраћивања. Поставите на -1 да га искључите"
+
+#~ msgid "the a an"
+#~ msgstr "the"
+
+#~ msgid "All Artists"
+#~ msgstr "Сви извођачи"
+
+#~ msgid "Not playing"
+#~ msgstr "Сада пуштам"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "изводи %s, са „%s“"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "Нисам пронашао музику!\n"
+#~ " Пребаците неке датотеке у фасциклу „%s“"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Нови списак нумера"
+
+#~ msgid "Load More"
+#~ msgstr "Учитај још"
diff --git a/po/sr@latin.po b/po/sr@latin.po
new file mode 100644
index 00000000..45ffae0f
--- /dev/null
+++ b/po/sr@latin.po
@@ -0,0 +1,650 @@
+# Serbian translation for gnome-music.
+# Courtesy of Prevod.org team (http://prevod.org/) -- 2013—2017.
+# This file is distributed under the same license as the gnome-music package.
+# Miroslav Nikolić <miroslavnikolic@rocketmail.com>, 2013—2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2018-02-24 22:43+0000\n"
+"PO-Revision-Date: 2018-02-25 08:21+0100\n"
+"Last-Translator: Marko M. Kostić <marko.m.kostic@gmail.com>\n"
+"Language-Team: srpski <gnome-sr@googlegroups.org>\n"
+"Language: sr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Project-Style: gnome\n"
+"X-Generator: Poedit 2.0.6\n"
+
+#: data/org.gnome.Music.appdata.xml.in:6
+msgid "GNOME Music"
+msgstr "Gnomova muzika"
+
+#: data/org.gnome.Music.appdata.xml.in:7 data/org.gnome.Music.desktop.in:5
+msgid "Play and organize your music collection"
+msgstr "Slušajte i uređujte muzičku zbirku"
+
+#: data/org.gnome.Music.appdata.xml.in:9
+msgid "Music is the new GNOME music playing application."
+msgstr "Muzika je novi Gnomov program za puštanje muzike."
+
+#: data/org.gnome.Music.desktop.in:3 gnomemusic/application.py:55
+#: gnomemusic/application.py:104 gnomemusic/toolbar.py:92
+#: gnomemusic/window.py:68 data/AboutDialog.ui.in:7
+msgid "Music"
+msgstr "Muzika"
+
+#: data/org.gnome.Music.desktop.in:4
+msgid "Music Player"
+msgstr "Program za muziku"
+
+#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+#: data/org.gnome.Music.desktop.in:7
+msgid "org.gnome.Music"
+msgstr "org.gnome.Music"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in:13
+msgid "Music;Player;"
+msgstr "muzika;pusti;puštač;plejer;muzika;pusti;puštač;plejer;Music;Player;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Veličina prozora"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Veličina prozora (širina i visina)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window position"
+msgstr "Položaj prozora"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window position (x and y)."
+msgstr "Položaj prozora (položeno i uspravno)."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Window maximized"
+msgstr "Uvećan prozor"
+
+#: data/org.gnome.Music.gschema.xml:23
+msgid "Window maximized state."
+msgstr "Stanje uvećanog prozora."
+
+#: data/org.gnome.Music.gschema.xml:27
+msgid "Playback repeat mode"
+msgstr "Režim ponavljanja puštanja"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:29
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Vrednost koja određuje da li će puštanje kroz zbirku biti ponovljeno ili "
+"nasumično. Dopuštene vrednosti su: „none“ (ponavljanje i mešanje su isključeni), "
+"„song“ (ponavlja tekuću pesmu), „all“ (ponavlja spisak numera, ne meša), "
+"„shuffle“ (meša spisak numera, podrazumeva ponavljanje svega)."
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Search mode"
+msgstr "Režim pretrage"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "If true, the search bar is shown."
+msgstr "Ako je izabrano, biće prikazana traka za pretragu."
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Notifications mode"
+msgstr "Režim obaveštavanja"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid "Enables or disables playback notifications"
+msgstr "Uključuje ili isključuje obaveštenja puštanja"
+
+#: data/org.gnome.Music.gschema.xml:43
+msgid "Enable ReplayGain"
+msgstr "Uključuje pojačanje ponavljanja"
+
+#: data/org.gnome.Music.gschema.xml:44
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Uključuje ili isključuje pojačanje ponavljanja za albume"
+
+#: data/org.gnome.Music.gschema.xml:48
+msgid "Inital state has been displayed"
+msgstr "Početno stanje je prikazano"
+
+#: data/org.gnome.Music.gschema.xml:49
+msgid "Set to true when initial state has been displayed"
+msgstr "Postavi na tačno kada se početno stanje prikaže"
+
+#: gnomemusic/notification.py:55 data/PlayerToolbar.ui:70
+msgid "Previous"
+msgstr "Prethodno"
+
+#: gnomemusic/notification.py:58 gnomemusic/player.py:536
+msgid "Pause"
+msgstr "Zastani"
+
+#: gnomemusic/notification.py:61 gnomemusic/player.py:539
+#: data/PlayerToolbar.ui:87 data/PlaylistContextMenu.ui:5
+msgid "Play"
+msgstr "Pusti"
+
+#: gnomemusic/notification.py:63 data/PlayerToolbar.ui:104
+msgid "Next"
+msgstr "Naredno"
+
+#: gnomemusic/player.py:1076
+msgid "Unable to play the file"
+msgstr "Ne mogu da pustim datoteku"
+
+#. TRANSLATORS: this is a button to launch a codec installer.
+#. %s will be replaced with the software installer's name, e.g.
+#. 'Software' in case of gnome-software.
+#: gnomemusic/player.py:1081
+#, python-format
+msgid "_Find in %s"
+msgstr "_Pronađi u %s"
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/player.py:1091
+msgid " and "
+msgstr " i "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/player.py:1094
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/player.py:1095
+#, python-format
+msgid "%s is required to play the file, but is not installed."
+msgid_plural "%s are required to play the file, but are not installed."
+msgstr[0] "%s je potreban za puštanje datoteke ali nije instaliran."
+msgstr[1] "%s su potrebni za puštanje datoteke ali nisu instalirani."
+msgstr[2] "%s su potrebni za puštanje datoteke ali nisu instalirani."
+msgstr[3] "%s je potreban za puštanje datoteke ali nije instaliran."
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/playlists.py:58
+msgid "Most Played"
+msgstr "Najviše puštane"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/playlists.py:63
+msgid "Never Played"
+msgstr "Nikad puštane"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/playlists.py:68
+msgid "Recently Played"
+msgstr "Nedavno puštane"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/playlists.py:73
+msgid "Recently Added"
+msgstr "Nedavno dodate"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/playlists.py:78
+msgid "Favorite Songs"
+msgstr "Omiljene pesme"
+
+#: gnomemusic/searchbar.py:64 gnomemusic/searchbar.py:114
+msgid "All"
+msgstr "Sve"
+
+#: gnomemusic/searchbar.py:65
+msgid "Artist"
+msgstr "Izvođač"
+
+#: gnomemusic/searchbar.py:66
+msgid "Album"
+msgstr "Album"
+
+#: gnomemusic/searchbar.py:67 data/AlbumWidget.ui:171
+msgid "Composer"
+msgstr "Kompozitor"
+
+#: gnomemusic/searchbar.py:68
+msgid "Track Title"
+msgstr "Naslov numere"
+
+#: gnomemusic/searchbar.py:115
+msgid "Local"
+msgstr "Mesno"
+
+#: gnomemusic/searchbar.py:258
+msgid "Sources"
+msgstr "Izvori"
+
+#: gnomemusic/searchbar.py:266
+msgid "Match"
+msgstr "Poklopi"
+
+#: gnomemusic/utils.py:75
+msgid "Unknown Artist"
+msgstr "Nepoznat izvođač"
+
+#: gnomemusic/utils.py:87
+msgid "Untitled"
+msgstr "Bez naslova"
+
+#: gnomemusic/views/albumsview.py:45 gnomemusic/views/searchview.py:501
+msgid "Albums"
+msgstr "Albumi"
+
+#: gnomemusic/views/artistsview.py:56 gnomemusic/views/searchview.py:503
+msgid "Artists"
+msgstr "Izvođači"
+
+#: gnomemusic/views/baseview.py:188
+msgid "Selected {} item"
+msgid_plural "Selected {} items"
+msgstr[0] "Izabrana je {} stavka"
+msgstr[1] "Izabrane su {} stavke"
+msgstr[2] "Izabrano je {} stavki"
+msgstr[3] "Izabrana je {} stavka"
+
+#: gnomemusic/views/baseview.py:193 gnomemusic/views/baseview.py:284
+#: gnomemusic/widgets/albumwidget.py:189
+#: gnomemusic/widgets/artistalbumswidget.py:232 data/headerbar.ui:32
+msgid "Click on items to select them"
+msgstr "Kliknite na stavke da ih izaberete"
+
+#: gnomemusic/views/emptysearchview.py:53
+msgid "Try a different search"
+msgstr "Probajte sa drugačijom pretragom"
+
+#: gnomemusic/views/emptyview.py:51
+msgid "Music folder"
+msgstr "Fascikla sa muzikom"
+
+#: gnomemusic/views/initialstateview.py:50
+msgid "Hey DJ"
+msgstr "Hej! Didžej!"
+
+#: gnomemusic/views/playlistview.py:63 gnomemusic/views/searchview.py:507
+msgid "Playlists"
+msgstr "Spisak numera"
+
+#: gnomemusic/views/playlistview.py:604
+#, python-format
+msgid "%d Song"
+msgid_plural "%d Songs"
+msgstr[0] "%d pesma"
+msgstr[1] "%d pesme"
+msgstr[2] "%d pesama"
+msgstr[3] "%d pesma"
+
+#: gnomemusic/views/playlistview.py:647
+msgid "Playlist {} removed"
+msgstr "Spisak numera {} je uklonjen"
+
+#: gnomemusic/views/playlistview.py:653
+msgid "{} removed from {}"
+msgstr "Stavka {} uklonjena iz {}"
+
+#: gnomemusic/views/searchview.py:505 gnomemusic/views/songsview.py:55
+msgid "Songs"
+msgstr "Pesme"
+
+#: gnomemusic/widgets/albumwidget.py:185
+#: gnomemusic/widgets/artistalbumswidget.py:228
+#, python-format
+msgid "Selected %d item"
+msgid_plural "Selected %d items"
+msgstr[0] "Izabrana je %d stavka"
+msgstr[1] "Izabrane su %d stavke"
+msgstr[2] "Izabrano je %d stavki"
+msgstr[3] "Izabrana je %d stavka"
+
+#: gnomemusic/widgets/albumwidget.py:281 gnomemusic/widgets/albumwidget.py:326
+#, python-format
+msgid "%d min"
+msgstr "%d min"
+
+#: gnomemusic/widgets/disclistboxwidget.py:192
+msgid "Disc {}"
+msgstr "Disk {}"
+
+#: gnomemusic/widgets/notificationspopup.py:169
+msgid "Loading"
+msgstr "Učitavam"
+
+#: gnomemusic/widgets/notificationspopup.py:231
+msgid "_Undo"
+msgstr "_Opozovi"
+
+#: gnomemusic/window.py:273
+msgid "Empty"
+msgstr "Prazno"
+
+#: data/AboutDialog.ui.in:9
+msgid "Copyright © 2018 GNOME Music Developers"
+msgstr "Autorska prava © 2018 Programeri Gnomove muzike"
+
+#: data/AboutDialog.ui.in:10
+msgid "A music player and management application for GNOME."
+msgstr "Gnomov program za puštanje i upravljanje muzikom."
+
+#: data/AboutDialog.ui.in:12
+msgid "Visit GNOME Music website"
+msgstr "Posetite veb stranicu Gnomove muzike"
+
+#: data/AboutDialog.ui.in:13
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version.\n"
+"\n"
+"“Magic of the vinyl” by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+"https://www.flickr.com/photos/_spy_/12270839403\n"
+msgstr ""
+"Ovaj program je slobodan softver; možete ga prosleđivati\n"
+"i/ili menjati pod uslovima Gnuove opšte javne licence koju je\n"
+"objavila Zadužbina slobodnog softvera; verzije 2 licence,\n"
+"ili (po vašem izboru) bilo koje novije verzije.\n"
+"\n"
+"Ovaj program se raspodeljuje u nadi da će biti koristan,\n"
+"ali BEZ IKAKVE GARANCIJE; čak i bez primenjene garancije\n"
+"TRŽIŠNE VREDNOSTI ili PRILAGOĐENOSTI ODREĐENOJ NAMENI.\n"
+"Pogledajte Gnuovu opštu javnu licencu za više detalja.\n"
+"\n"
+"Trebali ste da primite primerak GNU Opšte javne licence\n"
+"uz ovaj program; ako niste, pišite Zadužbini slobodnog\n"
+"softvera na adresu: „Free Software Foundation, Inc., 51 Franklin Street, "
+"Fifth Floor, Boston, MA 02110-1301 USA.“\n"
+"\n"
+"Autori Gnomove muzike bezuslovno garantuju ovlašćenja za korišćenje i "
+"raspodelu priključaka Gstrimera koji nisu saglasni sa OJL-om uz Gstrimer i "
+"Gnomovu muziku. Ovo ovlašćenje je iznad i ispod ovlašćenja koje obezbeđuje "
+"OJL dozvola kojom je pokrivena Gnomova muzika. Ako izmenite ovaj kod, "
+"možete da proširite ovaj izuzetak na vaše izdanje koda, ali niste obavezni da "
+"to i uradite. Ako ne želite da uradite ovo, obrišite stanje ovog izuzetka iz "
+"vašeg izdanja.\n"
+"\n"
+"Slika \"Magic of the vinyl\" od Samija Pilampija je licencirana pod CC-BY-SA "
+"2.0 https://www.flickr.com/photos/_spy_/12270839403\n"
+
+#: data/AlbumWidget.ui:110
+msgid "Released"
+msgstr "Izdat"
+
+#: data/AlbumWidget.ui:126
+msgid "Running Length"
+msgstr "Dužina trajanja"
+
+#: data/app-menu.ui:5
+msgid "_Keyboard Shortcuts"
+msgstr "_Prečice tastature"
+
+#: data/app-menu.ui:9
+msgid "_Help"
+msgstr "Po_moć"
+
+#: data/app-menu.ui:15
+msgid "_About"
+msgstr "_O programu"
+
+#: data/app-menu.ui:19
+msgid "_Quit"
+msgstr "_Izađi"
+
+#: data/headerbar.ui:7
+msgid "Select All"
+msgstr "Izaberi sve"
+
+#: data/headerbar.ui:11
+msgid "Select None"
+msgstr "Poništi izbor"
+
+#: data/headerbar.ui:66
+msgid "Search"
+msgstr "Potraži"
+
+#: data/headerbar.ui:89
+msgid "Select"
+msgstr "Izaberi"
+
+#: data/headerbar.ui:111 data/PlaylistDialog.ui:264
+msgid "_Cancel"
+msgstr "_Otkaži"
+
+#: data/headerbar.ui:129
+msgid "Back"
+msgstr "Nazad"
+
+#: data/help-overlay.ui:13
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Opšte"
+
+#: data/help-overlay.ui:17
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Zatvara prozor"
+
+#: data/help-overlay.ui:24
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Pretraga"
+
+#: data/help-overlay.ui:31
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Pomoć"
+
+#: data/help-overlay.ui:38
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Prečice"
+
+#: data/help-overlay.ui:47
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Puštanje"
+
+#: data/help-overlay.ui:51
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Pušta/pauzira"
+
+#: data/help-overlay.ui:58
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Sledeća pesma"
+
+#: data/help-overlay.ui:65
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Prethodna pesma"
+
+#: data/help-overlay.ui:72
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Prekidač za ponavljanje"
+
+#: data/help-overlay.ui:79
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Prekidač za mešanje"
+
+#: data/help-overlay.ui:88
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigacija"
+
+#: data/help-overlay.ui:92
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Ide na albume"
+
+#: data/help-overlay.ui:99
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Ide na izvođače"
+
+#: data/help-overlay.ui:106
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Ide na pesme"
+
+#: data/help-overlay.ui:113
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Ide na spisak numera"
+
+#: data/help-overlay.ui:120
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Ide nazad"
+
+#: data/NoMusic.ui:35
+msgid "No music found"
+msgstr "Nisam pronašao muziku"
+
+#. Translators: %s will be replaced with a link with text 'Music folder'
+#: data/NoMusic.ui:55
+#, python-format
+msgid "The contents of your %s will appear here."
+msgstr "Sadržaj fascikle „%s“ će se pojaviti ovde."
+
+#: data/PlayerToolbar.ui:6
+msgid "Shuffle"
+msgstr "Nasumično"
+
+#: data/PlayerToolbar.ui:11
+msgid "Repeat All"
+msgstr "Ponovi sve"
+
+#: data/PlayerToolbar.ui:16
+msgid "Repeat Song"
+msgstr "Ponovi pesmu"
+
+#. Causes tracks to play in random order
+#: data/PlayerToolbar.ui:21
+msgid "Shuffle/Repeat Off"
+msgstr "Isključi mešanje/ponavljanje"
+
+#: data/PlaylistContextMenu.ui:9
+msgid "Add to Playlist…"
+msgstr "Dodaj na spisak numera…"
+
+#: data/PlaylistContextMenu.ui:13
+msgid "Remove From Playlist"
+msgstr "Ukloni sa spiska numera…"
+
+#: data/PlaylistControls.ui:6
+msgid "_Play"
+msgstr "_Pusti"
+
+#: data/PlaylistControls.ui:10
+msgid "_Delete"
+msgstr "_Obriši"
+
+#: data/PlaylistControls.ui:14
+msgid "_Rename…"
+msgstr "_Preimenuj…"
+
+#: data/PlaylistControls.ui:33
+msgid "Playlist Name"
+msgstr "Naziv spiska numera"
+
+#: data/PlaylistControls.ui:65
+msgid "_Done"
+msgstr "_Gotovo"
+
+#: data/PlaylistDialog.ui:63
+msgid "Enter a name for your first playlist"
+msgstr "Unesite naziv za vaš prvi spisak numera"
+
+#: data/PlaylistDialog.ui:88
+msgid "C_reate"
+msgstr "_Napravi"
+
+#: data/PlaylistDialog.ui:157
+msgid "New Playlist"
+msgstr "Novi spisak numera"
+
+#: data/PlaylistDialog.ui:170
+msgid "Add"
+msgstr "Dodaj"
+
+#: data/PlaylistDialog.ui:261
+msgid "Select Playlist"
+msgstr "Izaberite spisak numera"
+
+#: data/PlaylistDialog.ui:276
+msgid "_Add"
+msgstr "_Dodaj"
+
+#: data/SelectionToolbar.ui:9
+msgid "_Add to Playlist"
+msgstr "_Dodaj na spisak numera"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "Najviše znakova za prikaz u nazivu numere u pregledu izvođača"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Ovo podešavanje menja broj znakova za naslov numere u pregledu izvođača pre "
+#~ "njegovog skraćivanja. Postavite na -1 da ga isključite"
+
+#~ msgid "Unknown Album"
+#~ msgstr "Nepoznat album"
+
+#~ msgid "the a an"
+#~ msgstr "the"
+
+#~ msgid "All Artists"
+#~ msgstr "Svi izvođači"
+
+#~ msgid "Not playing"
+#~ msgstr "Sada puštam"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "izvodi %s, sa „%s“"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "Nisam pronašao muziku!\n"
+#~ " Prebacite neke datoteke u fasciklu „%s“"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Novi spisak numera"
+
+#~ msgid "Load More"
+#~ msgstr "Učitaj još"
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 00000000..26872376
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,776 @@
+# Swedish translation for gnome-music.
+# Copyright © 2014-2023 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2014, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+# Sebastian Rasmussen <sebras@gmail.com>, 2015.
+# Marcus Gisslén <marcus.gisslen@gmail.com>, 2015.
+# Luna Jernberg <droidbittin@gmail.com>, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-07-04 10:02+0200\n"
+"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Musik"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Spela och organisera din musiksamling"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Ett lätt och behagligt sätt att spela upp din musik."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Hitta spår i din lokala samling, använd automatiskt genererade spellistor "
+"eller sammanställ en ny."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "GNOME Musik-utvecklarna"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Musikspelare"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Musik;Spelare;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Fönsterstorlek"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Fönsterstorlek (bredd och höjd)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Fönster maximerat"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Tillstånd för maximerat fönster."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Upprepningsläge för uppspelning"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Värdet avgör om uppspelning av samlingen ska upprepas eller vara i "
+"slumpmässig ordning. Tillåtna värden är ”none” (låtar spelas i ordning utan "
+"att upprepas), ”song” (aktuell låt upprepas), ”all” (spellistan spelas i "
+"ordning och börjar sedan om), ”shuffle” (låtar spelas i slumpmässig ordning, "
+"detta medför upprepning av alla)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Aktivera uppspelningsförstärkning"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Aktiverar eller inaktiverar uppspelningsförstärkning för album"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Hindra vänteläge för systemet"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Aktiverar eller inaktiverar hindrande av vänteläge för systemet då musik "
+"spelas upp"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Rapportera musikhistorik till Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Aktiverar eller inaktiverar sändning av skrobblingar och ”spelar nu”-info "
+"till Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Spela"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Spela"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Lägg till i _favoritlåtar"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Lägg till i spellista…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm-konto"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Rapportera musiklyssnande"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Tangentbordsgenvägar"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Hjälp"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Om Musik"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Välkommen till Musik"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Meny"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Välj"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Avbryt"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Sök"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Bakåt"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Allmänt"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Stäng fönster"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Sök"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Hjälp"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Genvägar"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Uppspelning"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Spela upp/Gör paus"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Nästa låt"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Föregående låt"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Växla repetera"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Växla blandad uppspelning"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Navigering"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Gå till Album"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Gå till Artister"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Gå till Låtar"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Gå till Spellistor"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Gå bakåt"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm är en musikupptäcktstjänst som ger dig personliga rekommendationer "
+"beroende på musiken du lyssnar på."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Musikrapportering ej konfigurerad"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Logga in på ditt Last.fm-konto för att rapportera ditt musiklyssnande."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Logga in"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Föregående"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Nästa"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Ta bort"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Byt namn…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Namn på spellista"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Färdig"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Ange ett namn för din första spellista"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "S_kapa"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Ny spellista…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Lägg till"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Lägg till i spellista"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Lägg till"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Artister"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Visa alla"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Album"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Låtar"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Markera alla"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Avmarkera alla"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Klicka på objekt för att välja dem"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Lägg till i spellista"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "_Ta bort från spellista"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "GNOME-projektet"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
+"Sebastian Rasmussen <sebras@gmail.com>\n"
+"Marcus Gisslén <marcus.gisslen@gmail.com>\n"
+"Luna Jernberg <droidbittin@gmail.com>\n"
+"\n"
+"Skicka synpunkter på översättningen till\n"
+"<tp-sv@listor.tp-sv.se>."
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Copyright GNOME Musik-utvecklarna"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Översatt av"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Mest spelade"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Aldrig spelade"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Nyligen spelade"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Nyligen tillagda"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Favoritlåtar"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Kan inte spela upp filen"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Hitta i {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " och "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "{} krävs för att spela upp filen men är inte installerad."
+msgstr[1] "{} krävs för att spela upp filen men är inte installerade."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Spelar upp musik"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Spela i ordning utan upprepning"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Upprepa låt"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Upprepa alla"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Spela i slumpmässig ordning"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Spellista {} borttagen"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Ångra"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} borttagen från {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Okänt album"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Okänd artist"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Din XDG-musikkatalog är inte inställd."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Musikmapp"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Innehållet i din {} kommer att visas här."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Ingen musik hittades"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Försök med en annan sökning"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Musik kunde inte ansluta till Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Dina musikfiler kan inte indexeras utan att Tracker körs."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Ditt systems version av Tracker verkar gammal."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Musik kräver version 3.0.0 eller högre av Tracker."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Spellistor"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Artistresultat"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Albumresultat"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} minut"
+msgstr[1] "{} minuter"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Skiva {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Markerade {} låt"
+msgstr[1] "Markerade {} låtar"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Ditt musiklyssnande rapporteras till Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Ditt musiklyssnande rapporteras inte till Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Inloggad som {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Konfigurera"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Gör paus"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} låt"
+msgstr[1] "{} låtar"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Sök låtar, artister, album och spellistor"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Ett program för uppspelning och hantering av musik för GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Besök webbplatsen för GNOME Musik"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME Musik är fri programvara. Du kan distribuera det och/eller "
+#~ "modifiera det under villkoren i GNU General Public License, publicerad av "
+#~ "Free Software Foundation, antingen version 2 eller (om du så vill) någon "
+#~ "senare version.\n"
+#~ "\n"
+#~ "GNOME Musik distribueras i hopp om att det ska vara användbart, men UTAN "
+#~ "NÅGON SOM HELST GARANTI, även utan underförstådd garanti om SÄLJBARHET "
+#~ "eller LÄMPLIGHET FÖR NÅGOT SPECIELLT ÄNDAMÅL. Se GNU General Public "
+#~ "License för ytterligare information.\n"
+#~ "\n"
+#~ "Du bör ha fått en kopia av GNU General Public License tillsammans med "
+#~ "GNOME Musik. Om inte, skriv till Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "Upphovsmännen för GNOME Musik ger härmed tillåtelse för användning och "
+#~ "distribution av ej GPL-kompatibla GStreamer-insticksmoduler tillsammans "
+#~ "med GStreamer och GNOME Musik. Denna tillåtelse är bortom tillåtelserna "
+#~ "som ges av GPL-licensen, vilken täcker GNOME Musik. Om du ändrar denna "
+#~ "kod kan du om du vill överföra detta undantag till din version av koden, "
+#~ "men du är inte tvungen att göra det. Ta bort detta undantag från din "
+#~ "version om du inte vill använda det."
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Innehållet i din Musikmapp kommer att visas här"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME Musik"
+
+#~ msgid "Window position"
+#~ msgstr "Fönsterposition"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Fönsterposition (x och y)."
+
+#~ msgid "Loading"
+#~ msgstr "Läser in"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Lägg till i spellista…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Ett lätt sätt att spela din musik. Upptäck automatiskt musik på din "
+#~ "dator, det lokala nätverket samt på internettjänster."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Hitta spår i din lokala samling, erhåll musik från DLNA-servrar eller "
+#~ "pröva någonting nytt med Jamendo och Magnatune-tjänsterna."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Initialtillstånd har visats"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Satt till true när initialtillstånd har visats"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hej DJ"
+
+#~ msgid "Released"
+#~ msgstr "Utgiven"
+
+#~ msgid "Running Length"
+#~ msgstr "Speltid"
+
+#~ msgid "Composer"
+#~ msgstr "Kompositör"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Spela"
+
+#~ msgid "All"
+#~ msgstr "Alla"
+
+#~ msgid "Artist"
+#~ msgstr "Artist"
+
+#~ msgid "Album"
+#~ msgstr "Album"
+
+#~ msgid "Track Title"
+#~ msgstr "Låttitel"
+
+#~ msgid "Local"
+#~ msgstr "Lokal"
+
+#~ msgid "Sources"
+#~ msgstr "Källor"
+
+#~ msgid "Match"
+#~ msgstr "Träff"
+
+#~ msgid "Untitled"
+#~ msgstr "Namnlös"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "_Quit"
+#~ msgstr "A_vsluta"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Musik är det nya GNOME-programmet för att spela musik."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "Sökläge"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Visar sökraden om sant."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Aviseringsläge"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Aktiverar eller inaktiverar uppspelningsaviseringar"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Markerade %d objekt"
+#~ msgstr[1] "Markerade %d objekt"
+
+#~ msgid "%d min"
+#~ msgstr "%d min"
+
+#~ msgid "Empty"
+#~ msgstr "Tom"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Välj spellista"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "Maximalt antal tecken att visa i spårnamnet i artistvyn"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Denna inställning modifierar antalet tecken för spårtiteln i artistvyn "
+#~ "innan den blir elliptiserad. Sätt denna till -1 för att inaktivera"
+
+#~ msgid "the a an"
+#~ msgstr "the"
+
+#~ msgid "All Artists"
+#~ msgstr "Alla artister"
+
+#~ msgid "Not playing"
+#~ msgstr "Spelar inte"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "av %s, från %s"
diff --git a/po/ta.po b/po/ta.po
new file mode 100644
index 00000000..14599a22
--- /dev/null
+++ b/po/ta.po
@@ -0,0 +1,273 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# அருள்ராஜன் அ லை <alarulrajan@gmail.com>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2013-10-26 09:39+0000\n"
+"PO-Revision-Date: 2013-10-27 09:44+0530\n"
+"Last-Translator: அருள்ராஜன் அ லை <alarulrajan@gmail.com>\n"
+"Language-Team: தமிழ் <>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Gtranslator 2.91.6\n"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "சாளர அளவு"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "சாளர அளவு (அகலம் மற்றும் உயரம்)"
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "சாளர அமைவிடம்"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "சாளர அமைவிடம் (x மற்றும் y)"
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "சாளரம் பெரிதாக்கப்பட்டது"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "சாளரம் பெரிதாக்கப்பட்ட நிலை."
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "பாடலை மீண்டும் இயக்குமுறை"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: ../data/org.gnome.Music.gschema.xml.h:9
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: \"none\" (repeat and shuffle are off), \"song"
+"\" (repeat current song), \"all\" (repeat playlist, no shuffle), \"shuffle"
+"\" (shuffle playlist, presumes repeat all)."
+msgstr ""
+"தொகுப்பில் பாடலை மீண்டும் இயக்க அல்லது வரிசையின்றி இயக்க மதிப்பு தீர்மானிக்கும். "
+"அனுமதிக்கப்பட்ட மதிப்புகள்: \"none\" (மீண்டும் மீண்டும் பாடுவதும் கலக்குவதுமில்லை), \"song"
+"\", \"all\", \"shuffle\"."
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "Search mode"
+msgstr "தேடல் முறைமை"
+
+#: ../data/org.gnome.Music.gschema.xml.h:11
+msgid "If true, the search bar is shown."
+msgstr "உண்மையெனில், தேடல் பட்டி காட்டப்படும்."
+
+#: ../data/gnome-music.desktop.in.h:1 ../gnomemusic/application.py:46
+#: ../gnomemusic/application.py:102 ../gnomemusic/window.py:54
+#: ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "இசை"
+
+#: ../data/gnome-music.desktop.in.h:2
+msgid "Music Player"
+msgstr "இசைப்பான்"
+
+#: ../data/gnome-music.desktop.in.h:3 ../data/gnome-music.appdata.xml.in.h:2
+msgid "Play and organize your music collection"
+msgstr "இசை தொகுப்பைப் பாடவும் நிர்வகிக்கவும்"
+
+#: ../data/gnome-music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "GNOME இசை"
+
+#: ../data/gnome-music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "Music என்பது GNOME-ன் புதிய இசை பயன்பாடு"
+
+#: ../gnomemusic/albumArtCache.py:235
+msgid "Untitled"
+msgstr "தலைப்பிடப்படாத"
+
+#: ../gnomemusic/notification.py:70
+msgid "Not playing"
+msgstr "பாடவில்லை"
+
+#: ../gnomemusic/notification.py:77 ../gnomemusic/player.py:350
+#: ../gnomemusic/view.py:229 ../gnomemusic/view.py:377
+#: ../gnomemusic/view.py:591
+msgid "Unknown Artist"
+msgstr "கலைஞர் யாரெனத் தெரியவில்லை"
+
+#: ../gnomemusic/notification.py:79 ../gnomemusic/view.py:475
+msgid "Unknown Album"
+msgstr "ஆல்பம் எதுவெனத் தெரியவில்லை"
+
+#. TRANSLATORS: by refers to the artist, from to the album
+#: ../gnomemusic/notification.py:83
+#, python-format
+msgid "by %s, from %s"
+msgstr "%s-இலிருந்து %s-ஆல்"
+
+#: ../gnomemusic/notification.py:123
+msgid "Previous"
+msgstr "முந்தைய"
+
+#: ../gnomemusic/notification.py:126
+msgid "Pause"
+msgstr "இடைநிறுத்து"
+
+#: ../gnomemusic/notification.py:129
+msgid "Play"
+msgstr "பாடு"
+
+#: ../gnomemusic/notification.py:131
+msgid "Next"
+msgstr "அடுத்தது"
+
+#: ../gnomemusic/view.py:294
+#, python-format
+msgid ""
+"No Music found!\n"
+" Put some files into the folder %s"
+msgstr ""
+"பாடல்கள் ஏதும் கிடைக்கவில்லை!\n"
+"அடைவு %s- சில கோப்புகளை இடவும்"
+
+#: ../gnomemusic/view.py:301
+msgid "Albums"
+msgstr "ஆல்பங்கள்"
+
+#: ../gnomemusic/view.py:333
+msgid "Songs"
+msgstr "பாடல்கள்"
+
+#: ../gnomemusic/view.py:484
+msgid "Playlists"
+msgstr "பாடல்வரிசைகள்"
+
+#: ../gnomemusic/view.py:490
+msgid "Artists"
+msgstr "கலைஞர்கள்"
+
+#: ../gnomemusic/view.py:526 ../gnomemusic/view.py:528
+#: ../gnomemusic/widgets.py:443
+msgid "All Artists"
+msgstr "அனைத்து கலைஞர்கள்"
+
+#: ../gnomemusic/widgets.py:73 ../gnomemusic/widgets.py:93
+msgid "Load More"
+msgstr "இன்னும் ஏற்ற"
+
+#: ../gnomemusic/widgets.py:83
+msgid "Loading..."
+msgstr "ஏற்றுகிறது ..."
+
+#: ../gnomemusic/window.py:165
+msgid "Empty"
+msgstr "வெறுமையாக உள்ளது"
+
+#: ../data/AboutDialog.ui.in.h:2
+msgid "Copyright © 2013 GNOME Music Developers"
+msgstr "காப்புரிமை © 2013 GNOME Music Developers"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "GNOME-க்கான இசைப்பான் மற்றும் மேலாண்மைப் பயன்பாடு"
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "GNOME Music வலைத்தளத்திற்கு வாருங்கள்"
+
+#: ../data/AboutDialog.ui.in.h:5
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "வெளியிடப்பட்டது"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "ஓடும் நீளம்"
+
+#: ../data/app-menu.ui.h:1
+msgid "_New Playlist"
+msgstr "புதிய பாடல்வரிசை"
+
+#: ../data/app-menu.ui.h:2
+msgid "Now _Playing"
+msgstr "தற்போது இசைப்பது"
+
+#: ../data/app-menu.ui.h:3
+msgid "_About Music"
+msgstr "GNome Music -ப் பற்றி"
+
+#: ../data/app-menu.ui.h:4
+msgid "_Quit"
+msgstr "வெளியேறு"
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "கலக்கு"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "மறுமுறை அனைத்தும்"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "மறுமுறை பாடல்"
+
+#: ../data/PlayerToolbar.ui.h:4
+msgid "Shuffle/Repeat Off"
+msgstr "கலக்குதல்/மறுமுறை நிறுத்து"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No Music Found"
+msgstr "பாடல்கள் ஏதும் கிடைக்கவில்லை"
+
+#: ../data/headerbar.ui.in.h:1
+msgid "Select All"
+msgstr "அனைத்தும் தேர்ந்தெடு"
+
+#: ../data/headerbar.ui.in.h:2
+msgid "Select None"
+msgstr "எதுவும் தேர்ந்தெடுக்க வேண்டாம்"
+
+#: ../data/headerbar.ui.in.h:3
+msgid "Click on items to select them"
+msgstr "பொருட்களைத் தேர்ந்தெடுக்க அவற்றின் மீது சொடுக்கவும்"
+
+#: ../data/headerbar.ui.in.h:4
+msgid "Cancel"
+msgstr "ரத்து"
+
+#: ../data/SelectionToolbar.ui.h:1
+msgid "Add to Playlist"
+msgstr "பாடல்வரிசையில் சேர்"
diff --git a/po/te.po b/po/te.po
new file mode 100644
index 00000000..c0071f6a
--- /dev/null
+++ b/po/te.po
@@ -0,0 +1,339 @@
+# Telugu translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Praveen Illa <mail2ipn@gmail.com>, 2013, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-03-21 15:21+0000\n"
+"PO-Revision-Date: 2014-03-21 23:06+0530\n"
+"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
+"Language-Team: indlinux-telugu@lists.sourceforge.net\n"
+"Language: te\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.5.4\n"
+"X-Project-Style: gnome\n"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "కిటికీ పరిమాణం"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "కిటికీ పరిమాణం (వెడల్పు మరియు ఎత్తు)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "కిటికీ స్థానము"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "కిటికీ స్థానము (x మరియు y)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "కిటికీ పెద్దగాచేయబడింది"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "కిటికీ పెద్దగాచేయబడిన స్థితి."
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "ప్లేబ్యాక్ పునరావృత రీతి"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: ../data/org.gnome.Music.gschema.xml.h:9
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: \"none\" (repeat and shuffle are off), \"song"
+"\" (repeat current song), \"all\" (repeat playlist, no shuffle), \"shuffle"
+"\" (shuffle playlist, presumes repeat all)."
+msgstr ""
+"మీ పాటల సేకరణను పునరావృతం చేయాలో లేదా యాదృచ్ఛికంగా ఆడాలో మీరిచ్చే ఈ విలువలు గుర్తిస్తాయి. అనుమతించబడిన "
+"విలువలు: \"none\" (పునరావృతం మరియు గులకరించు ఆపివేయబడి), \"song\" (ప్రస్థుత పాటను "
+"పునరావృతం చేస్తుంది), \"all\" (పాటలజాబితా పునరావృతం చేయబడుతుంది, గులకరించబడదు), \"shuffle"
+"\" (పాటలజాబితాను గులకరిస్తుంది, అన్నిటి పునరావృతాన్ని ప్రెస్యుమ్ చేస్తుంది)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "Search mode"
+msgstr "శోధన రీతి"
+
+#: ../data/org.gnome.Music.gschema.xml.h:11
+msgid "If true, the search bar is shown."
+msgstr "ఒకవేళ నిజమైతే, శోధన పట్టీ చూపించబడును."
+
+#: ../data/gnome-music.desktop.in.h:1 ../gnomemusic/application.py:46
+#: ../gnomemusic/application.py:102 ../gnomemusic/window.py:58
+#: ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "సంగీతం"
+
+#: ../data/gnome-music.desktop.in.h:2
+msgid "Music Player"
+msgstr "సంగీత ప్రదర్శకం"
+
+#: ../data/gnome-music.desktop.in.h:3 ../data/gnome-music.appdata.xml.in.h:2
+msgid "Play and organize your music collection"
+msgstr "మీ సంగీత సేకరణను ప్రదర్శించి, నిర్వహించుకోండి"
+
+#: ../data/gnome-music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "గ్నోమ్ సంగీతం"
+
+#: ../data/gnome-music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "సంగీతం అనేది సరికొత్త గ్నోమ్ సంగీత ప్రదర్శక అనువర్తనం."
+
+#: ../gnomemusic/albumArtCache.py:235 ../gnomemusic/albumArtCache.py:243
+msgid "Untitled"
+msgstr "పేరులేదు"
+
+#: ../gnomemusic/notification.py:70
+msgid "Not playing"
+msgstr "ప్రదర్శించుటలేదు"
+
+#: ../gnomemusic/notification.py:79 ../gnomemusic/player.py:365
+#: ../gnomemusic/searchbar.py:31 ../gnomemusic/view.py:253
+#: ../gnomemusic/view.py:455 ../gnomemusic/view.py:676
+#: ../gnomemusic/view.py:990
+msgid "Unknown Artist"
+msgstr "తెలియని కళాకారుడు"
+
+#: ../gnomemusic/notification.py:81 ../gnomemusic/searchbar.py:32
+#: ../gnomemusic/view.py:553
+msgid "Unknown Album"
+msgstr "తెలియని ఆల్బమ్"
+
+#. TRANSLATORS: by refers to the artist, from to the album
+#: ../gnomemusic/notification.py:85
+#, python-format
+msgid "by %s, from %s"
+msgstr "గాయకులు %s, %s నుండి"
+
+#: ../gnomemusic/notification.py:125
+msgid "Previous"
+msgstr "మునుపటిది"
+
+#: ../gnomemusic/notification.py:128
+msgid "Pause"
+msgstr "నిలిపివేయి"
+
+#: ../gnomemusic/notification.py:131
+msgid "Play"
+msgstr "ఆడించు"
+
+#: ../gnomemusic/notification.py:133
+msgid "Next"
+msgstr "తరువాతది"
+
+#: ../gnomemusic/view.py:197 ../gnomemusic/widgets.py:261
+#: ../gnomemusic/window.py:244
+#, python-format
+msgid "Selected %d item"
+msgid_plural "Selected %d items"
+msgstr[0] "%d అంశం ఎంచుకోబడింది"
+msgstr[1] "%d అంశాలు ఎంచుకోబడ్డాయి"
+
+#: ../gnomemusic/view.py:199 ../gnomemusic/widgets.py:263
+#: ../gnomemusic/window.py:248 ../gnomemusic/window.py:262
+#: ../data/headerbar.ui.in.h:3
+msgid "Click on items to select them"
+msgstr "అంశాలను ఎంచుకోవడానికి వాటిపై నొక్కండి"
+
+#: ../gnomemusic/view.py:322
+#, python-format
+msgid ""
+"No Music found!\n"
+" Put some files into the folder %s"
+msgstr ""
+"ఎటువంటి సంగీతం కనపడలేదు!\n"
+" దయచేసి %s సంచయంలో కొన్ని సంగీత దస్త్రాలను పెట్టండి"
+
+#: ../gnomemusic/view.py:329
+msgid "Albums"
+msgstr "ఆల్బమ్లు"
+
+#: ../gnomemusic/view.py:402
+msgid "Songs"
+msgstr "పాటలు"
+
+#: ../gnomemusic/view.py:566
+msgid "Artists"
+msgstr "గాయకులు"
+
+#: ../gnomemusic/view.py:611 ../gnomemusic/view.py:613
+#: ../gnomemusic/widgets.py:451
+msgid "All Artists"
+msgstr "అందరు గాయకులు"
+
+#: ../gnomemusic/view.py:743
+msgid "Playlists"
+msgstr "పాటలజాబితాలు"
+
+#: ../gnomemusic/view.py:1007
+#, python-format
+msgid "%d Song"
+msgid_plural "%d Songs"
+msgstr[0] "%d పాట"
+msgstr[1] "%d పాటలు"
+
+#: ../gnomemusic/widgets.py:75 ../gnomemusic/widgets.py:95
+msgid "Load More"
+msgstr "మరిన్ని నింపు"
+
+#: ../gnomemusic/widgets.py:85
+msgid "Loading..."
+msgstr "ఎక్కిస్తున్నాము..."
+
+#: ../gnomemusic/widgets.py:670
+msgid "New Playlist"
+msgstr "కొత్త పాటలజాబితా"
+
+#: ../gnomemusic/window.py:209
+msgid "Empty"
+msgstr "ఏమీలేవు"
+
+#: ../data/AboutDialog.ui.in.h:2
+msgid "Copyright © 2013 GNOME Music Developers"
+msgstr "నకలుహక్కు © 2013 గ్నోమ్ సంగీతం వికాసకులు"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "సంగీత నిర్వహణకై గ్నోమ్ కోసం రూపొందించిన సంగీత ప్రదర్శక అనువర్తనం."
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "గ్నోమ్ సంగీతం జాలగూడును సందర్శించండి"
+
+#: ../data/AboutDialog.ui.in.h:5
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+"గ్నోమ్ సంగీతం అనేది ఒక స్వేచ్ఛా సాఫ్ట్‌వేర్: దీనిని మీరు ఫ్రీ సాఫ్ట్‌వేర్ ఫౌండేషన్ ప్రచురించిన గ్నూ జనరల్ పబ్లిక్ "
+"లైసెన్స్ రూపాంతరం ౨, లేదా (మీ ఇష్టాన్ని బట్టి) ఏదైనా తరువాత రూపాంతరపు నిబంధనలకు అనుగుణంగా "
+"పునఃపంపిణీ చెయ్యవచ్చు మరియు/లేదా సవరించుకోవచ్చు.\n"
+"\n"
+"గ్నోమ్ సంగీతం సమాజానికి ఉపయోగపడుతుంది అనే ఆశతో , ఏవిధమైన పూచీకత్తులు లేకుండా, కనీసం వ్యాపారానికి గాని "
+"లేదా ఒక ఖచ్చితమైన ప్రయోజనానికి ఉపయోగించవచ్చని భావించిన పూచీకత్తులు కూడా లేకుండా పంచబడుతుంది.మరిన్ని "
+"వివరాలకు గ్నూ జనరల్ పబ్లిక్ లైసెన్సుని చూడండి.\n"
+"\n"
+"గ్నోమ్ సంగీతంతో పాటు మీరు గ్నూ జనరల్ పబ్లిక్ లైసెన్సు నకలును పొంది ఉంటారు, లేనిపక్షంలో, Free "
+"Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston. "
+"MA02110-1301, USA కు వ్రాయండి.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "విడుదలైంది"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "నిడివి"
+
+#: ../data/app-menu.ui.h:1
+msgid "_New Playlist"
+msgstr "కొత్త పాటలజాబితా (_N)"
+
+#: ../data/app-menu.ui.h:2
+msgid "_Help"
+msgstr "సహాయం (_H)"
+
+#: ../data/app-menu.ui.h:3
+msgid "_About"
+msgstr "గురించి (_A)"
+
+#: ../data/app-menu.ui.h:4
+msgid "_Quit"
+msgstr "నిష్క్రమించు (_Q)"
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "గులకరించు"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "అన్నీ పునరావృతం"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "పాటను పునరావృతంచేయి"
+
+#: ../data/PlayerToolbar.ui.h:4
+msgid "Shuffle/Repeat Off"
+msgstr "గులకరించు/పునరావృతించు ఆపు"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No Music Found"
+msgstr "ఎటువంటి సంగీతం దొరకలేదు"
+
+#: ../data/headerbar.ui.in.h:1
+msgid "Select All"
+msgstr "అన్నీ ఎంచుకోండి"
+
+#: ../data/headerbar.ui.in.h:2
+msgid "Select None"
+msgstr "ఎంపిక రద్దు"
+
+#: ../data/headerbar.ui.in.h:4 ../data/PlaylistDialog.ui.in.h:2
+msgid "Cancel"
+msgstr "రద్దుచేయి"
+
+#: ../data/SelectionToolbar.ui.h:1
+msgid "Add to Playlist"
+msgstr "పాటలజాబితాకు కలుపు"
+
+#: ../data/SelectionToolbar.ui.h:2
+msgid "Remove from Playlist"
+msgstr "జాబితా నుండి తీసివేయి"
+
+#: ../data/PlaylistControls.ui.h:1
+msgid "_Play"
+msgstr "ఆడించు (_P)"
+
+#: ../data/PlaylistControls.ui.h:2
+msgid "_Delete"
+msgstr "తొలగించు (_D)"
+
+#: ../data/PlaylistDialog.ui.in.h:1
+msgid "Select Playlist"
+msgstr "పాటలజాబితాను ఎంచుకోండి"
+
+#: ../data/PlaylistDialog.ui.in.h:3
+msgid "Select"
+msgstr "ఎంచుకోండి"
+
+#~ msgid "Now _Playing"
+#~ msgstr "ఇప్పుడు ఆడుతున్నది (_P)"
diff --git a/po/tg.po b/po/tg.po
new file mode 100644
index 00000000..d9985e85
--- /dev/null
+++ b/po/tg.po
@@ -0,0 +1,531 @@
+# Tajik translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# Victor Ibragimov <victor.ibragimov@gmail.com>, 2013, 2014, 2015
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2015-06-24 19:21+0000\n"
+"PO-Revision-Date: 2015-06-25 10:34+0500\n"
+"Last-Translator: Victor Ibragimov <victor.ibragimov@gmail.com>\n"
+"Language-Team: Tajik <tg@li.org>\n"
+"Language: tg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.7.5\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "Андозаи равзана"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "Андозаи равзана (бар ва баландӣ)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "Мавқеи равзана"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "Мавқеи равзана (x ва y)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "Равзана дар ҳадди аксар"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "Вазъияти равзана дар ҳадди аксар"
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "Ҳолати такрори пахш"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: ../data/org.gnome.Music.gschema.xml.h:9
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: \"none\" (repeat and shuffle are off), \"song"
+"\" (repeat current song), \"all\" (repeat playlist, no shuffle), \"shuffle"
+"\" (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Қиматҳо такрорӣ ё тасодуфии пахшро дар тамоми коллексия муайян мекунанд. "
+"Қиматҳои иҷозашуда: \"none\" (такрорӣ ва тасодуфӣ хомӯш мебошанд), \"song"
+"\" (такрор кардани суруди ҷорӣ), \"all\" (такрор кардани рӯйхати пахш, бе "
+"тасодуфӣ), \"shuffle\" (тасодуфии рӯйхати пахш, пахши ҳамаи сурудҳоро такрор "
+"мекунад)."
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "Search mode"
+msgstr "Ҳолати ҷустуҷӯ"
+
+#: ../data/org.gnome.Music.gschema.xml.h:11
+msgid "If true, the search bar is shown."
+msgstr "Агар \"true\" бошад, навори ҷустуҷӯ намоиш дода мешавад."
+
+#: ../data/org.gnome.Music.gschema.xml.h:12
+msgid "Notifications mode"
+msgstr "Реҷаи огоҳӣ"
+
+#: ../data/org.gnome.Music.gschema.xml.h:13
+msgid "Enables or disables playback notifications"
+msgstr "Огоҳиҳои пахшро фаъол ё ғайрифаъол мекунад"
+
+#: ../data/org.gnome.Music.gschema.xml.h:14
+msgid "Max chars to display in track name on Artist view"
+msgstr ""
+"Шумораи имконпазири аломатҳо барои намоиш дар номи роҳча дар намуди ҳунарманд"
+
+#: ../data/org.gnome.Music.gschema.xml.h:15
+msgid ""
+"This setting modifies the amount of chars for track title on Artist view "
+"before its been ellipsized. Set this to -1 to disable"
+msgstr ""
+"Ин танзим шумораи аломатҳоро дар унвони реҷаи ҳунарманд пеш аз гирд кардани "
+"он тағйир медиҳад. Барои ғайрифаъол кардан, онро ба -1 танзим кунед"
+
+#: ../data/org.gnome.Music.gschema.xml.h:16
+msgid "Enable ReplayGain"
+msgstr "Фаъол кардани ReplayGain"
+
+#: ../data/org.gnome.Music.gschema.xml.h:17
+msgid "Enables or disables ReplayGain for albums"
+msgstr "ReplayGain барои албомҳо фаъол ё ғайрифаъол мекунад"
+
+#: ../data/org.gnome.Music.gschema.xml.h:18
+msgid "Inital state has been displayed"
+msgstr "Вазъияти ибтидоӣ намоиш дода шуд"
+
+#: ../data/org.gnome.Music.gschema.xml.h:19
+msgid "Set to true when initial state has been displayed"
+msgstr "Вақте ки вазъияти ибтидоӣ намоиш дода мешавад, ба TRUE танзим кунед"
+
+#: ../data/gnome-music.desktop.in.h:1 ../gnomemusic/application.py:50
+#: ../gnomemusic/application.py:113 ../gnomemusic/window.py:59
+#: ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "Мусиқӣ"
+
+#: ../data/gnome-music.desktop.in.h:2
+msgid "Music Player"
+msgstr "Плеери мусиқӣ"
+
+#: ../data/gnome-music.desktop.in.h:3 ../data/gnome-music.appdata.xml.in.h:2
+msgid "Play and organize your music collection"
+msgstr "Коллексияи мусиқии худро мураттаб ва пахш кунед"
+
+#: ../data/gnome-music.desktop.in.h:4
+msgid "Music;Player;"
+msgstr "Мусиқӣ;Плеер;"
+
+#: ../data/gnome-music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "Мусиқии GNOME"
+
+#: ../data/gnome-music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "Мусиқии GNOME - барномаи нави пахши мусиқӣ мебошад."
+
+#: ../gnomemusic/albumArtCache.py:103 ../gnomemusic/albumArtCache.py:111
+msgid "Untitled"
+msgstr "Беном"
+
+#: ../gnomemusic/mpris.py:148 ../gnomemusic/notification.py:100
+#: ../gnomemusic/player.py:571 ../gnomemusic/view.py:564
+#: ../gnomemusic/view.py:995 ../gnomemusic/view.py:1451
+msgid "Unknown Album"
+msgstr "Албоми номаълум"
+
+#: ../gnomemusic/mpris.py:164 ../gnomemusic/notification.py:98
+#: ../gnomemusic/player.py:562 ../gnomemusic/view.py:223
+#: ../gnomemusic/view.py:464 ../gnomemusic/view.py:737
+#: ../gnomemusic/view.py:1177 ../gnomemusic/view.py:1449
+#: ../gnomemusic/view.py:1496 ../gnomemusic/widgets.py:235
+#: ../gnomemusic/widgets.py:638
+msgid "Unknown Artist"
+msgstr "Ҳунарманди номаълум"
+
+#: ../gnomemusic/notification.py:89
+msgid "Not playing"
+msgstr "Ҳозир пахш намекунад"
+
+#. TRANSLATORS: by refers to the artist, from to the album
+#: ../gnomemusic/notification.py:104
+#, python-format
+msgid "by %s, from %s"
+msgstr "Ҳунарманди %s, албоми %s"
+
+#: ../gnomemusic/notification.py:125 ../data/PlayerToolbar.ui.h:5
+msgid "Previous"
+msgstr "Қаблӣ"
+
+#: ../gnomemusic/notification.py:128 ../gnomemusic/player.py:519
+msgid "Pause"
+msgstr "Таваққуф"
+
+#: ../gnomemusic/notification.py:131 ../gnomemusic/player.py:522
+#: ../data/PlayerToolbar.ui.h:6
+msgid "Play"
+msgstr "Пахш кардан"
+
+#: ../gnomemusic/notification.py:133 ../data/PlayerToolbar.ui.h:7
+msgid "Next"
+msgstr "Навбатӣ"
+
+#: ../gnomemusic/player.py:980
+msgid "Unable to play the file"
+msgstr "Файл пахш карда намешавад"
+
+#. TRANSLATORS: this is a button to launch a codec installer.
+#. %s will be replaced with the software installer's name, e.g.
+#. 'Software' in case of gnome-software.
+#: ../gnomemusic/player.py:985
+#, python-format
+msgid "_Find in %s"
+msgstr "_Ёфтан дар %s"
+
+#. TRANSLATORS: separator for a list of codecs
+#: ../gnomemusic/player.py:995
+msgid " and "
+msgstr " ва "
+
+#. TRANSLATORS: separator for a list of codecs
+#: ../gnomemusic/player.py:998
+msgid ", "
+msgstr ", "
+
+#: ../gnomemusic/player.py:999
+#, python-format
+msgid "%s is required to play the file, but is not installed."
+msgid_plural "%s are required to play the file, but are not installed."
+msgstr[0] "%s барои пахш кардани файл лозим аст, вале он насб нашудааст."
+msgstr[1] "%s барои пахш кардани файл лозим аст, вале он насб нашудааст."
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:49
+msgid "Most Played"
+msgstr "Бисёр маротиба пахш карда шуд"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:56
+msgid "Never Played"
+msgstr "Ҳеҷ вақт пахш карда нашуд"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:63
+msgid "Recently Played"
+msgstr "Дар қарибӣ пахш карда шуд"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:70
+msgid "Recently Added"
+msgstr "Дар қарибӣ илова карда шуд"
+
+#. TRANSLATORS: this is a playlist name
+#: ../gnomemusic/playlists.py:77
+msgid "Favorite Songs"
+msgstr "Сурудҳои баргузида"
+
+#. TRANSLATORS: _("the") should be a space-separated list of all-lowercase articles
+#. (such as 'the') that should be ignored when alphabetizing artists/albums. This
+#. list should include 'the' regardless of language. If some articles occur more
+#. frequently than others, most common should appear first, least common last.
+#: ../gnomemusic/query.py:69
+msgid "the a an"
+msgstr "the a an"
+
+#: ../gnomemusic/searchbar.py:58 ../gnomemusic/searchbar.py:101
+msgid "All"
+msgstr "Ҳама"
+
+#: ../gnomemusic/searchbar.py:59
+msgid "Artist"
+msgstr "Ҳунарманд"
+
+#: ../gnomemusic/searchbar.py:60
+msgid "Album"
+msgstr "Албом"
+
+#: ../gnomemusic/searchbar.py:61
+msgid "Track Title"
+msgstr "Унвони роҳча"
+
+#: ../gnomemusic/searchbar.py:102
+msgid "Local"
+msgstr "Маҳаллӣ"
+
+#: ../gnomemusic/searchbar.py:204
+msgid "Sources"
+msgstr "Манбаҳо"
+
+#: ../gnomemusic/searchbar.py:211
+msgid "Match"
+msgstr "Мутобиқат"
+
+#: ../gnomemusic/view.py:191 ../gnomemusic/widgets.py:267
+#: ../gnomemusic/widgets.py:515 ../gnomemusic/window.py:302
+#, python-format
+msgid "Selected %d item"
+msgid_plural "Selected %d items"
+msgstr[0] "%d объект интихоб шудааст"
+msgstr[1] "%d объект интихоб шудаанд"
+
+#: ../gnomemusic/view.py:193 ../gnomemusic/widgets.py:269
+#: ../gnomemusic/widgets.py:517 ../gnomemusic/window.py:306
+#: ../gnomemusic/window.py:318 ../data/headerbar.ui.h:3
+msgid "Click on items to select them"
+msgstr "Барои интихоби объект онро зер кунед"
+
+#: ../gnomemusic/view.py:279
+msgid "Music folder"
+msgstr "Ҷузвдони мусиқӣ"
+
+#: ../gnomemusic/view.py:298
+msgid "Hey DJ"
+msgstr "Hey DJ"
+
+#: ../gnomemusic/view.py:306 ../gnomemusic/view.py:1720
+msgid "Albums"
+msgstr "Албомҳо"
+
+#: ../gnomemusic/view.py:398 ../gnomemusic/view.py:1722
+msgid "Songs"
+msgstr "Сурудҳо"
+
+#: ../gnomemusic/view.py:596 ../gnomemusic/view.py:1721
+msgid "Artists"
+msgstr "Ҳунармандон"
+
+#: ../gnomemusic/view.py:642 ../gnomemusic/view.py:644
+#: ../gnomemusic/widgets.py:524
+msgid "All Artists"
+msgstr "Ҳамаи ҳунармандон"
+
+#: ../gnomemusic/view.py:822 ../gnomemusic/view.py:1723
+msgid "Playlists"
+msgstr "Феҳристҳои пахш"
+
+#: ../gnomemusic/view.py:1188
+#, python-format
+msgid "%d Song"
+msgid_plural "%d Songs"
+msgstr[0] "%d суруд"
+msgstr[1] "%d суруд"
+
+#: ../gnomemusic/view.py:1325
+msgid "Try a different search"
+msgstr "Ҷустуҷӯи дигареро кӯшиш кунед"
+
+#: ../gnomemusic/widgets.py:308 ../gnomemusic/widgets.py:342
+#, python-format
+msgid "%d min"
+msgstr "%d дақиқа"
+
+#: ../gnomemusic/widgets.py:762
+msgid "New Playlist"
+msgstr "Феҳристи пахши нав"
+
+#: ../gnomemusic/window.py:248
+msgid "Empty"
+msgstr "Холӣ кардан"
+
+#: ../gnomemusic/window.py:330
+msgid "Loading"
+msgstr "Дар ҳоли боркунӣ"
+
+#: ../gnomemusic/window.py:345
+msgid "_Undo"
+msgstr "_Ботил сохтан"
+
+#: ../gnomemusic/window.py:346
+#, python-format
+msgid "Playlist %s removed"
+msgstr "Феҳристҳои пахши %s тоза шуд"
+
+#: ../data/AboutDialog.ui.in.h:2
+msgid "Copyright © 2013 GNOME Music Developers"
+msgstr "Ҳуқуқи муаллиф © 2013 Барноманависони Мусиқии GNOME"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "Плеери мусиқӣ ва барномаи идоракунӣ барои GNOME."
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "Гузариш ба вебсайти Мусиқии GNOME"
+
+#: ../data/AboutDialog.ui.in.h:5
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version.\n"
+"\n"
+"\"Magic of the vinyl\" by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+"https://www.flickr.com/photos/_spy_/12270839403\n"
+msgstr ""
+"Мусиқии GNOME нармафзори ройгон аст; Шумо метавонед онро мувофиқи шартҳои "
+"Иҷозатномаи иҷтимоии умумии GNU, чи тавре ки Иҷозатномаи мазкур аз ҷониби "
+"Фонди Мусиқии GNOME - нармафзорест, ки ройнгон нашр шудааст, ва шумо "
+"метавонед онро дар асоси шартҳои Иҷозатномаи ҷамъиятии умумии GNU, версияи "
+"Иҷозатномаи рақами 2 ё ягон версияи охирин, пахш кунед ва/ё тағйир диҳед.\n"
+"\n"
+"Мо умедворем, ки шумо аз истифодабарии нармафзори Мусиқии GNOME фоида "
+"мегиред, вале мо ба шумо ЯГОН КАФОЛАТ НАМЕДИҲЕМ; ҳатто барои мақсадҳои "
+"ТИҶОРӢ шумо ё ягон МАҚСАДҲОИ МАХСУСИ ШУМО ягон кафолат намедиҳем. Барои "
+"маълумоти муфассал Иҷозатномаи иҷтимоии умумии GNU-ро мутолиа кунед.\n"
+"\n"
+"Шумо бояд нусхаи Иҷозатномаи иҷтимоии умумии GNU-ро якҷоя бо нармафзори "
+"Мусиқии GNOME қабул кунед. Агар қабул накунед, метавонед барои гирифтани "
+"нусхаи иҷозатнома ба суроғаи мо нависед: The Free Software Foundation, Inc., "
+"51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n"
+"\n"
+"Муаллифони нармафзори Мусиқии GNOME иҷозат медиҳанд, то ки шумо тавонед "
+"плагинҳои GStreamer-ро, ки ба Иҷозатномаи GPL мувофиқа намекунанд, якҷоя бо "
+"GStreamer ва Мусиқии GNOME истифода баред. Ин иҷозат ба иҷозатномаи GPL-и "
+"нармафзори Мусиқии GNOME мувофиқат намекунад ва метавонад онро тавсиф "
+"накунад. Агар шумо ин рамзро тағйир диҳед, метавонед истисноро ба версияи "
+"рамзи худ васеъ кунед, вале шумо барои кардани ин вазифадор намебошед. Агар "
+"кардани ин нахоҳед, баёнияи ин истисноро аз версияи худ тоза кунед.\n"
+"\n"
+"\"Magic of the vinyl\" by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+"https://www.flickr.com/photos/_spy_/12270839403\n"
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "Санаи нашр"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "Давомнокии пахш"
+
+#: ../data/app-menu.ui.h:1
+msgid "_Help"
+msgstr "_Кумак"
+
+#: ../data/app-menu.ui.h:2
+msgid "_About"
+msgstr "_Дар бораи барнома"
+
+#: ../data/app-menu.ui.h:3
+msgid "_Quit"
+msgstr "_Хуруҷ"
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "Тасодуфӣ"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "Ҳамаро такрор кардан"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "Такрор кардани суруд"
+
+#: ../data/PlayerToolbar.ui.h:4
+msgid "Shuffle/Repeat Off"
+msgstr "Хомӯш кардани тасодуфӣ/такрорӣ"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No music found"
+msgstr "Ягон мусиқӣ ёфт нашуд"
+
+#: ../data/NoMusic.ui.h:3
+#, no-c-format
+msgid "The contents of your %s will appear here."
+msgstr "Муҳтавои %s дар ин ҷо намоиш дода мешавад."
+
+#: ../data/headerbar.ui.h:1
+msgid "Select All"
+msgstr "Ҳамаро интихоб кардан"
+
+#: ../data/headerbar.ui.h:2
+msgid "Select None"
+msgstr "Ҳеҷ чизро интихоб накардан"
+
+#: ../data/headerbar.ui.h:4
+msgid "Search"
+msgstr "Ҷустуҷӯ"
+
+#: ../data/headerbar.ui.h:5 ../data/PlaylistDialog.ui.h:3
+msgid "Select"
+msgstr "Интихоб кардан"
+
+#: ../data/headerbar.ui.h:6 ../data/PlaylistDialog.ui.h:2
+msgid "Cancel"
+msgstr "Бекор кардан"
+
+#: ../data/headerbar.ui.h:7
+msgid "Back"
+msgstr "Ба қафо"
+
+#: ../data/SelectionToolbar.ui.h:1
+msgid "Add to Playlist"
+msgstr "Илова кардан ба феҳристи пахш"
+
+#: ../data/SelectionToolbar.ui.h:2
+msgid "Remove from Playlist"
+msgstr "Тоза кардан аз феҳристи пахш"
+
+#: ../data/PlaylistControls.ui.h:1
+msgid "_Play"
+msgstr "_Пахш кардан"
+
+#: ../data/PlaylistControls.ui.h:2
+msgid "_Delete"
+msgstr "_Нест кардан"
+
+#: ../data/PlaylistControls.ui.h:3
+msgid "Playlist Name"
+msgstr "Номи феҳристи пахш"
+
+#: ../data/PlaylistDialog.ui.h:1
+msgid "Select Playlist"
+msgstr "Интихоби феҳристи пахш"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "Ягон мусиқӣ ёфт нашуд!\n"
+#~ "Баъзе файлҳоро ба ҷузвдони %s гузоред"
+
+#~ msgid "Load More"
+#~ msgstr "Бештар бор кардан"
+
+#~ msgid "_New Playlist"
+#~ msgstr "_Феҳристи пахши нав"
+
+#~ msgid "Selected %d items"
+#~ msgstr "%d объект интихоб шудаанд"
+
+#~| msgid "Songs"
+#~ msgid "%d Songs"
+#~ msgstr "%d суруд"
+
+#~ msgid "Now _Playing"
+#~ msgstr "_Ҳозир пахш мекунад"
diff --git a/po/tr.po b/po/tr.po
new file mode 100644
index 00000000..071ad19e
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,578 @@
+# Turkish translation for gnome-music.
+# Copyright (C) 2013-2023 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# Gökhan Gurbetoğlu <ggurbet@gmail.com>, 2014, 2015.
+# Necdet Yücel <necdetyucel@gmail.com>, 2014, 2015.
+# Muhammet Kara <muhammetk@gmail.com>, 2013, 2014, 2015.
+# Osman Karagöz <osmank3@gmail.com>, 2017.
+# Furkan Tokaç <developmentft@gmail.com>, 2017.
+# Doğa Deniz Arıcı <bluegreenbrain@gmail.com>, 2018.
+# Sabri Ünal <libreajans@gmail.com>, 2019-2020, 2023.
+# Emin Tufan Çetin <etcetin@gmail.com>, 2013-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-07-29 23:17+0300\n"
+"Last-Translator: Sabri Ünal <libreajans@gmail.com>\n"
+"Language-Team: Turkish <takim@gnome.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.2.2\n"
+"X-POOTLE-MTIME: 1433363480.000000\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Müzik"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Müzik derleminizi çalın ve yönetin"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Müziğinizi dinlemenin kolay ve hoş yolu."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Yerel derleminizdeki parçaları bulun, kendiliğinden oluşturulan çalma "
+"listelerini kullanın veya yenisini oluşturun."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "GNOME Müzik Geliştiricileri"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Müzik Çalar"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Müzik;Çalar;Çalıcı;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Pencere boyutu"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Pencere boyutu (genişlik ve yükseklik)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Pencere büyültüldüğünde"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Pencerenin büyütülmüş durumu."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Çalma yineleme kipi"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Bu değer, derlemdeki parçaların yinelemeli mi yoksa karışık mı çalınacağını "
+"belirtir. İzin verilen değerler şunlardır: “none” (yineleme ve karıştırma "
+"kapalı), “song” (geçerli şarkıyı yinele), “all” (çalma listesini yinele, "
+"karıştırma), “shuffle” (çalma listesini karıştır, tümü yinelenebilir)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "ReplayGain’i etkinleştir"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Albümler için ReplayGain’i etkinleştirir ya da devre dışı bırakır"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Sistemin askıya alınmasını önle"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Müzik çalarken sistemin askıya alınmasını önlemeyi etkinleştir veya devre "
+"dışı bırak"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Müzik geçmişini Last.fm’e bildir"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Last.fm’e skroplamaları ve “şu anda çalan” bilgilerini göndermeyi "
+"etkinleştirir veya devre dışı bırakır."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Çal"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "_Çal"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "_Gözde Şarkılara Ekle"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "Çalma Listesine _Ekle…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm Hesabı"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Müzik Dinlemeyi Bildir"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Klavye Kısayolları"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Yardım"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "Müzik _Hakkında"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Müzikʼe Hoş Geldiniz"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Menü"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Seç"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Vazgeç"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Ara"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Geri"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Genel"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Pencereyi kapat"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Ara"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Yardım"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Kısayollar"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Kayıttan yürüt"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Çal/Duraklat"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Sonraki şarkı"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Önceki şarkı"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Yinelemeyi aç/kapa"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Karıştırmayı aç/kapa"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Gezinme"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Albümlere git"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Sanatçılara git"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Şarkılara git"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Çalma Listelerine git"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Geri git"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm, dinlediğiniz müziğe göre kişiselleştirilmiş öneriler sunan müzik "
+"keşif hizmetidir."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Müzik Bildirimi Kurulmadı"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "Müzik dinlemenizi bildirmek için Last.fm hesabınıza giriş yapın."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Giriş"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Önceki"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Sonraki"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "_Sil"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Yeniden Adlandır…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Çalma Listesi Adı"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Bitti"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "İlk çalma listeniz için ad girin"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "Oluştu_r"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Yeni Çalma Listesi…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Ekle"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Çalma Listesine Ekle"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Ekle"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Sanatçılar"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Tümünü Görüntüle"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Albümler"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Şarkılar"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Tümünü Seç"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Hiçbirini Seçme"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Seçmek için ögelere tıklayın"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "Çalma Listesine _Ekle"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Çalma Listesinden _Kaldır"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "GNOME Projesi"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr "Emin Tufan Çetin <etcetin@gmail.com>"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "Telif Hakkı GNOME Müzik Geliştiricileri"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Çeviren"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "En Çok Çalınanlar"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Hiç Çalınmayanlar"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Son Çalınanlar"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Yeni Eklenenler"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Gözde Şarkılar"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Dosya çalınamıyor"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "{} içinde _bul"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " ve "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "Dosyayı çalmak için {} gerekiyor ancak kurulu değil."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Çalan müzik"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Karıştırma/Yineleme Kapalı"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Şarkıyı Yinele"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Tümünü Yinele"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "Karıştır"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "{} çalma listesi kaldırıldı"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Geri Al"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{}, {}ʼden silindi"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Bilinmeyen albüm"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Bilinmeyen Sanatçı"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "XDG Müzik dizini ayarlanmadı."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Müzik Klasörü"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "{} içeriğiniz burada görünecek."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Müzik Bulunamadı"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Başka Arama Deneyin"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME Müzik, Trackerʼa bağlanamadı."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Müzik dosyalarınız Tracker çalışmadan dizinlenemez."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Sisteminizin Tracker sürümü eski görünüyor."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Müzik, Trackerʼın 3.0.0 sürümünü veya üstünü gerektirmektedir."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Çalma Listeleri"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Sanatçı Sonuçları"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Albüm Sonuçları"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} dakika"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Disk {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "{} şarkı seçildi"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Müzik dinlemeniz Last.fm’e bildirildi."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Müzik dinlemeniz Last.fm’e bildirilmedi."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "{} olarak giriş yapıldı"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Yapılandır"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Duraklat"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} Şarkı"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Şarkıları, sanatçıları, albümleri ve çalma listelerini ara"
diff --git a/po/uk.po b/po/uk.po
new file mode 100644
index 00000000..e980d647
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,695 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Daniel Korostil <ted.korostiled@gmail.com>, 2013, 2014, 2015, 2016, 2017.
+# Eugene Strezhnev <strezhnev.ua@gmail.com>, 2019.
+# Danylo Korostil <ted.korostiled@gmail.com>, 2019.
+# Yuri Chornoivan <yurchor@ukr.net>, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: 1.0\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-07-28 21:23+0300\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n"
+"X-Generator: Lokalize 20.12.0\n"
+"X-Project-Style: gnome\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "Музика"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Грати та впорядковувати вашу музичну збірку"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Простий і приємний спосіб відтворення вашої музики."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Шукайте композиції у вашій локальній збірці, користуйтеся автоматично "
+"створеними списками відтворення або створюйте вручну нові списки відтворення."
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "Розробники Музики GNOME"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Програвач музики"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Музика;Програвач;Плеєр;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Розмір вікна"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Розмір вікна (ширина і висота)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "Вікно розгорнуто"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "Стан розгорнутого вікна."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "Режим повторного програвання"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Значення, яке визначає, чи програвати збірку повторно, чи навмання. "
+"Допустимі значення: «none» (без повторювання і перемішування), "
+"«song» (повторювати одну пісню), «all» (повторювати список композицій, без "
+"змішування), «shuffle» (перемішати композиції у списку, допускаються "
+"повторювання)."
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "Увімкнути ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Вмикає або вимикає ReplayGain для альбомів"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "Пригнічення зупинки системи"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr ""
+"Вмикає або вимикає пригнічення зупинки системи під час програвання музики"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "Надсилати журнал відтворення на Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Вмикає або вимикає надсилання журналу відтворення та даних щодо поточного "
+"відтворення музики на Last.fm."
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "Програти"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "Про_грати"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "Додати до _улюблених пісень"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "_Додати до списку композицій…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Обліковий запис Last.fm"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "Сповіщати щодо відтворення музики"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "_Клавіатурні скорочення"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "_Довідка"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "_Про «Музику»"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "Вітаємо у «Музиці»"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "Меню"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "Вибрати"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "_Скасувати"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "Пошук"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "Назад"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Загальне"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Закрити вікно"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Пошук"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Довідка"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Скорочення"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Відтворення"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Програти/призупинити"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Наступна пісня"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Попередня пісня"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Перемкнути повторення"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Перемкнути довільний порядок"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Пересування"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Перейти до альбомів"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Перейти до виконавців"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Перейти до пісень"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Перейти до списків композицій"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Повернутися"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm — служба ознайомлення з музикою, яка надає вам персоналізовані "
+"рекомендації на основі даних щодо музики, яку ви слухаєте."
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "Надсилання журналів відтворення не налаштовано"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Увійдіть до вашого облікового запису на Last.fm, щоб надіслати дані журналу "
+"відтворення."
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "Увійти"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "Попередня"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "Наступна"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "В_илучити"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "_Перейменувати…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "Назва списку композицій"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "_Зроблено"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "Введіть назву вашого першого списку композицій"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "С_творити"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "Створити список композицій…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "Додати"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "Додати до списку композицій"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "_Додати"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "Виконавці"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "Переглянути все"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "Альбоми"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "Пісні"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Вибрати все"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Не вибирати"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "Натисніть на об'єкти, щоб вибрати їх"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "_Додати до списку композицій"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "Ви_лучити зі списку"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "Проєкт GNOME"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"Данило Коростіль <ted.korostiled@gmail.com>, 2013–2019\n"
+"Євген Стрежньов <strezhnev.ua@gmail.com>, 2019\n"
+"Юрій Чорноіван <yurchor@ukr.net>, 2020–2022"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "© Розробники Музики GNOME"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "Переклад"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "Часто слухали"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "Ніколи не слухали"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "Недавно слухали"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "Недавно додано"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "Улюблені пісні"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Неможливо відтворити файл"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Знайти в {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " і "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "Потрібний {}, щоб програти файл, але його не встановлено."
+msgstr[1] "Потрібно {}, щоб програти файл, але їх не встановлено."
+msgstr[2] "Потрібно {}, щоб програти файл, але їх не встановлено."
+msgstr[3] "Потрібний {}, щоб програти файл, але його не встановлено."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Програється музика"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "Довільний порядок/Повторення вимкнено"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "Повторювати пісню"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "Повторювати все"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "У довільному порядку"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "Список композицій {} вилучено"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "Скасувати"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} вилучено з {}"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "Невідомий альбом"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "Невідомий виконавець"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Не вказано музичної теки XDG."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Тека з музикою"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Тут з'явиться вміст {}."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Музики не знайдено"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Спробуйте пошукати інакше"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Музика GNOME не може з'єднатись з Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "Музика не може бути індексована без запущеного Tracker."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Схоже, версія програми Tracker застаріла."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Для роботи «Музики» потрібна програма Tracker версії 3.0.0 або вище."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Списки композицій"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "Виконавці"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "Альбоми"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} хвилина"
+msgstr[1] "{} хвилини"
+msgstr[2] "{} хвилин"
+msgstr[3] "{} хвилина"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "Диск {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Вибрано {} композицію"
+msgstr[1] "Вибрано {} композиції"
+msgstr[2] "Вибрано {} композицій"
+msgstr[3] "Вибрано {} композицію"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "Ваш журнал відтворення надіслано на Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Ваш журнал відтворення не надіслано на Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "Вхід до системи від імені {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "Налаштувати"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "Призупинити"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} пісня"
+msgstr[1] "{} пісні"
+msgstr[2] "{} пісень"
+msgstr[3] "{} пісня"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "Пошук композицій, виконавців, альбомів та списків відтворення"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "Програма для програвання і впорядкування музики в GNOME."
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "Відвідати сайт Музики GNOME"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "«Музика GNOME» є вільним програмним забезпеченням (ПЗ); ви можете "
+#~ "розповсюджувати її та/чи модифікувати її згідно з умовами ЗАГАЛЬНОЇ "
+#~ "ГРОМАДСЬКОЇ ЛІЦЕНЗІЇ (GPL) GNU як опубліковано Free Software Foundation; "
+#~ "версії 2 цієї Ліцензії, або (на ваш розсуд) будь якої наступної версії.\n"
+#~ "\n"
+#~ "Музика GNOME розповсюджується з надією, що вона стане у пригоді, але БЕЗ "
+#~ "ЖОДНИХ ГАРАНТІЙ; навіть не маючи на увазі гарантії ПРИДАТНОСТІ ДЛЯ "
+#~ "ПРОДАЖУ або ПРИДАТНОСТІ ДО КОНКРЕТНОЇ МЕТИ. Див. ЗАГАЛЬНУ ГРОМАДСЬКУ "
+#~ "ЛІЦЕНЗІЮ (GPL) GNU для отримання детальної інформації.\n"
+#~ "\n"
+#~ "Ви маєте отримати копію ЗАГАЛЬНОЇ ГРОМАДСЬКОЇ ЛІЦЕНЗІЇ (GPL) GNU з цим "
+#~ "примірником Музика GNOME; якщо ні, напишіть в Free Software Foundation, "
+#~ "Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "Розробники Музики GNOME дають дозвіл на використання та розповсюдження "
+#~ "додатків GStreamer не сумісних з GPL, разом із GStreamer та Музикою "
+#~ "GNOME. Цей дозвіл вище і за межами дозволів, наданих ліцензією GPL, якою "
+#~ "охоплюється Музика GNOME.Якщо ви змінюєте цей код, ви можете розширити "
+#~ "цей виняток на свою версію коду, але не зобов'язані цього робити. У цьому "
+#~ "разі, вилучіть заяву про цей виняток зі своєї версії."
+
+#~| msgid "The contents of your {} will appear here."
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "Тут з'явиться вміст вашої теки «Музика»."
+
+#~ msgid "GNOME Music"
+#~ msgstr "Музика GNOME"
+
+#~ msgid "Window position"
+#~ msgstr "Позиція вікна"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "Розташування вікна (x та y)."
+
+#~ msgid "Loading"
+#~ msgstr "Завантаження"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "Додати до списку композицій…"
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Початковий стан вже було показано"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Увімкнуто, якщо початковий стан вже було показано"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Агов, ді-джею!"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Простий спосіб слухати музику. Автоматично виявляє музику на комп'ютері, "
+#~ "у локальній мережі та в інтернеті."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Знаходь композиції у локальній збірці, отримай музику з DLNA серверів або "
+#~ "спробуй щось нове з сервісами Jamendo та Magnatune."
+
+#~ msgid "Released"
+#~ msgstr "Випущено"
+
+#~ msgid "Running Length"
+#~ msgstr "Тривалість виконання"
+
+#~ msgid "Composer"
+#~ msgstr "Композитор"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Відтворити"
diff --git a/po/vi.po b/po/vi.po
new file mode 100644
index 00000000..71342898
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,742 @@
+# Vietnamese translations for gnome-music package
+# Bản dịch Tiếng Việt dành cho gói gnome-music.
+# This file is distributed under the same license as the gnome-music package.
+# Trần Ngọc Quân <vnwildman@gmail.com>, 2016-2019, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2021-09-19 11:12+0000\n"
+"PO-Revision-Date: 2021-09-24 09:09+0700\n"
+"Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
+"Language-Team: Vietnamese <gnome-vi-list@gnome.org>\n"
+"Language: vi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Gtranslator 3.38.0\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+msgid "GNOME Music"
+msgstr "Nhạc GNOME"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "Phát nhạc và tổ chức các tập nhạc"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "Một cách dễ dàng và thú vị để bạn phát nhạc của mình."
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"Tìm các rãnh nhạc trong bộ sưu tập nội bộ của bạn, dùng các danh sách phát "
+"ddwwocj tạo tự động hay sắp xếp một danh sách mới."
+
+#: data/org.gnome.Music.appdata.xml.in.in:149
+msgid "The GNOME Music developers"
+msgstr "Nhóm phát triển Nhạc GNOME"
+
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/application.py:60
+#: gnomemusic/window.py:71
+msgid "Music"
+msgstr "Nhạc"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "Bộ phát nhạc"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;Nhạc;Phát nhạc;Nhac;Phat Nhac;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "Kích cỡ cửa sổ"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "Kích thước cửa sổ (rộng và cao)."
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window position"
+msgstr "Vị trí cửa sổ"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window position (x and y)."
+msgstr "Vị trí cửa sổ (x và y)."
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Window maximized"
+msgstr "Cửa sổ đã phóng to"
+
+#: data/org.gnome.Music.gschema.xml:23
+msgid "Window maximized state."
+msgstr "Cửa sổ ở trạng thái phóng to hết cỡ."
+
+#: data/org.gnome.Music.gschema.xml:27
+msgid "Playback repeat mode"
+msgstr "Chế độ lặp phát lại"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:29
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"Giá trị định nghĩa xem có lặp hay phát ngẫu nhiên xuyên suốt bộ sưu tập. Các "
+"giá trị được phép là: \"none\" (tắt lặp và xáo trộn), \"song\" (lặp bài hát "
+"hiện tại), \"all\" (lặp mọi danh sách phát, không xáo trộn), \"shuffle"
+"\" (xáo trộn danh sách phát, coi là lặp tất cả)."
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Enable ReplayGain"
+msgstr "Bật ReplayGain"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables ReplayGain for albums"
+msgstr "Bật hay tắt ReplayGain với các tuyển tập"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Inhibit system suspend"
+msgstr "Ngăn cản hệ thống tạm ngưng"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "Bật hay tắt việc ngăn cản hệ thống tạm ngưng khi đang phát nhạc"
+
+#: data/org.gnome.Music.gschema.xml:43
+msgid "Report music history to Last.fm"
+msgstr "Báo cáo lịch sử sử dụng âm nhạc cho Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:44
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr ""
+"Cho phép hoặc vô hiệu hóa việc gửi scrobbles và thông tin \"hiện đang chơi\" "
+"cho Last.fm."
+
+#: data/ui/AboutDialog.ui.in:9
+msgid "Copyright © 2018 GNOME Music Developers"
+msgstr "Bản quyền © 2018 Nhóm phát triển Nhạc GNOME"
+
+#: data/ui/AboutDialog.ui.in:10
+msgid "A music player and management application for GNOME."
+msgstr "Một ứng dụng phát và quản lý nhạc dành cho GNOME."
+
+#: data/ui/AboutDialog.ui.in:12
+msgid "Visit GNOME Music website"
+msgstr "Truy cập trang thông tin điện tử của Nhạc GNOME"
+
+#: data/ui/AboutDialog.ui.in:13
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+"Nhạc GNOME là phần mềm miễn phí; bạn có thể phân phối lại nó và/hoặc sửa đổi "
+"nó theo các điều khoản của Giấy phép Công cộng GNU như được xuất bản bởi Tổ "
+"chức Phần mềm Tự do; hoặc phiên bản 2 của Giấy phép, hoặc (tùy chọn của bạn) "
+"bất kỳ phiên bản nào mới hơn.\n"
+"\n"
+"Nhạc GNOME được phân phối với hy vọng rằng nó sẽ hữu ích, nhưng KHÔNG CÓ BẤT "
+"KỲ BẢO HÀNH NÀO; thậm chí không có bảo hành ngụ ý về KHẢ NĂNG BÁN ĐƯỢC HOẶC "
+"SỰ PHÙ HỢP CHO MỘT MỤC ĐÍCH CỤ THỂ. Xem Giấy phép Công cộng GNU để biết "
+"thêm chi tiết.\n"
+"\n"
+"Bạn nên nhận được một bản sao của Giấy phép Công cộng GNU cùng với Nhạc "
+"GNOME; nếu không, hãy viết thư cho Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"Các tác giả Nhạc GNOME theo đây cấp quyền cho các plugin GStreamer không "
+"tương thích GPL được sử dụng và phân phối cùng với GStreamer và Nhạc GNOME. "
+"Quyền này ở trên và ngoài các quyền được cấp bởi giấy phép GPL mà Nhạc GNOME "
+"bao trùm. Nếu bạn sửa đổi mã này, bạn có thể mở rộng ngoại lệ này cho phiên "
+"bản mã của mình, nhưng bạn không bắt buộc phải làm như vậy. Nếu bạn không "
+"muốn làm như vậy, hãy xóa điều khoản ngoại lệ này khỏi phiên bản của bạn."
+
+#: data/ui/AlbumWidget.ui:104 data/ui/PlayerToolbar.ui:122
+#: data/ui/PlaylistControls.ui:121 data/ui/SongWidgetMenu.ui:19
+#: gnomemusic/widgets/playertoolbar.py:177
+msgid "Play"
+msgstr "Phát"
+
+#: data/ui/AlbumWidget.ui:163 data/ui/PlaylistControls.ui:6
+msgid "_Play"
+msgstr "_Phát"
+
+#: data/ui/AlbumWidget.ui:167
+msgid "Add to _Favorite Songs"
+msgstr "Thêm vào _Bài hát ưa thích"
+
+#: data/ui/AlbumWidget.ui:171
+msgid "_Add to Playlist…"
+msgstr "Thêm vào d_anh sách phát…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Tài khoản Last.fm"
+
+#: data/ui/AppMenu.ui:38
+msgid "Report Music Listening"
+msgstr "Báo cáo đang nghe Nhạc gì"
+
+#: data/ui/AppMenu.ui:63
+msgid "_Keyboard Shortcuts"
+msgstr "_Phím tắt"
+
+#: data/ui/AppMenu.ui:74
+msgid "_Help"
+msgstr "T_rợ giúp"
+
+#: data/ui/AppMenu.ui:85
+msgid "_About Music"
+msgstr "G_iới thiệu Nhạc"
+
+#: data/ui/EmptyView.ui:35
+msgid "Welcome to Music"
+msgstr "Chào mừng bạn dùng \"Nhạc\""
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "Trình đơn"
+
+#: data/ui/HeaderBar.ui:39 data/ui/SearchHeaderBar.ui:16
+msgid "Select"
+msgstr "Chọn"
+
+#: data/ui/HeaderBar.ui:60 data/ui/PlaylistDialog.ui:211
+#: data/ui/SearchHeaderBar.ui:37
+msgid "_Cancel"
+msgstr "T_hôi"
+
+#: data/ui/HeaderBar.ui:79 data/ui/SearchHeaderBar.ui:56
+msgid "Search"
+msgstr "Tìm kiếm"
+
+#: data/ui/HeaderBar.ui:102
+msgid "Back"
+msgstr "Lùi"
+
+#: data/ui/help-overlay.ui:13
+msgctxt "shortcut window"
+msgid "General"
+msgstr "Chung"
+
+#: data/ui/help-overlay.ui:17
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "Đóng cửa sổ"
+
+#: data/ui/help-overlay.ui:24
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "Tìm kiếm"
+
+#: data/ui/help-overlay.ui:31
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "Trợ giúp"
+
+#: data/ui/help-overlay.ui:38
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "Phím tắt"
+
+#: data/ui/help-overlay.ui:47
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "Phát lại"
+
+#: data/ui/help-overlay.ui:51
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "Phát/Dừng"
+
+#: data/ui/help-overlay.ui:58
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "Bài hát kế tiếp"
+
+#: data/ui/help-overlay.ui:65
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "Bài hát kế trước"
+
+#: data/ui/help-overlay.ui:72
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "Bật/tắt lặp"
+
+#: data/ui/help-overlay.ui:79
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "Bật/tắt xáo trộn"
+
+#: data/ui/help-overlay.ui:88
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "Điều hướng"
+
+#: data/ui/help-overlay.ui:92
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "Chuyển tới Tuyển tập"
+
+#: data/ui/help-overlay.ui:99
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "Chuyển tới Nghệ sỹ"
+
+#: data/ui/help-overlay.ui:106
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "Chuyển tới Bài hát"
+
+#: data/ui/help-overlay.ui:113
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "Chuyển tới Danh sách phát"
+
+#: data/ui/help-overlay.ui:120
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "Quay lại"
+
+#: data/ui/LastfmDialog.ui:24
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"Last.fm là một dịch vụ khám phá âm nhạc cung cấp cho bạn các đề xuất được cá "
+"nhân hóa dựa trên nhạc bạn nghe."
+
+#: data/ui/LastfmDialog.ui:35 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Music Reporting Not Setup"
+msgstr "Chưa cài đặt báo cáo Nhạc"
+
+#: data/ui/LastfmDialog.ui:49 gnomemusic/widgets/lastfmdialog.py:61
+msgid "Login to your Last.fm account to report your music listening."
+msgstr ""
+"Đăng nhập vào tài khoản Last.fm của bạn để báo cáo việc nghe nhạc của bạn."
+
+#: data/ui/LastfmDialog.ui:60 gnomemusic/widgets/lastfmdialog.py:59
+msgid "Login"
+msgstr "Đăng nhập"
+
+#: data/ui/LoadingNotification.ui:16
+msgid "Loading"
+msgstr "Đang tải"
+
+#: data/ui/PlayerToolbar.ui:105
+msgid "Previous"
+msgstr "Kế trước"
+
+#: data/ui/PlayerToolbar.ui:139
+msgid "Next"
+msgstr "Kế tiếp"
+
+#: data/ui/PlaylistControls.ui:10
+msgid "_Delete"
+msgstr "_Xóa"
+
+#: data/ui/PlaylistControls.ui:14
+msgid "_Rename…"
+msgstr "Đổ_i tên…"
+
+#: data/ui/PlaylistControls.ui:44
+msgid "Playlist Name"
+msgstr "Tên Danh sách phát"
+
+#: data/ui/PlaylistControls.ui:77
+msgid "_Done"
+msgstr "_Xong"
+
+#: data/ui/PlaylistDialog.ui:66
+msgid "Enter a name for your first playlist"
+msgstr "Nhận vào tên cho danh sách phát đầu tiên của bạn"
+
+#: data/ui/PlaylistDialog.ui:88
+msgid "C_reate"
+msgstr "Tạ_o"
+
+#: data/ui/PlaylistDialog.ui:156
+msgid "New Playlist…"
+msgstr "Danh sách phát mới…"
+
+#: data/ui/PlaylistDialog.ui:167
+msgid "Add"
+msgstr "Thêm"
+
+#: data/ui/PlaylistDialog.ui:208
+msgid "Add to Playlist"
+msgstr "Thêm vào danh sách phát"
+
+#: data/ui/PlaylistDialog.ui:224
+msgid "_Add"
+msgstr "T_hêm"
+
+#: data/ui/PlaylistNotification.ui:22
+msgid "_Undo"
+msgstr "_Hủy bước"
+
+#: data/ui/SearchView.ui:47 gnomemusic/views/artistsview.py:46
+msgid "Artists"
+msgstr "Nghệ sĩ"
+
+#: data/ui/SearchView.ui:57 data/ui/SearchView.ui:108
+msgid "View All"
+msgstr "Hiện tất cả"
+
+#: data/ui/SearchView.ui:98 gnomemusic/views/albumsview.py:50
+msgid "Albums"
+msgstr "Tuyển tập"
+
+#: data/ui/SearchView.ui:149 gnomemusic/views/songsview.py:47
+msgid "Songs"
+msgstr "Bài hát"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "Chọn tất cả"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "Không chọn gì"
+
+#: data/ui/SelectionBarMenuButton.ui:30 gnomemusic/widgets/headerbar.py:71
+msgid "Click on items to select them"
+msgstr "Bấm vào từng mục để chọn chúng"
+
+#: data/ui/SelectionToolbar.ui:9
+msgid "_Add to Playlist"
+msgstr "T_hêm vào danh sách phát"
+
+#: data/ui/SongWidgetMenu.ui:29
+msgid "Add to Playlist…"
+msgstr "Thêm vào danh sách phát…"
+
+#: data/ui/SongWidgetMenu.ui:39
+msgid "Remove From Playlist"
+msgstr "Loại khỏi danh sách phát"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:884
+msgid "Most Played"
+msgstr "Phát nhiều nhất"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:938
+msgid "Never Played"
+msgstr "Chưa phát lần nào"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:991
+msgid "Recently Played"
+msgstr "Mới phát"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1054
+msgid "Recently Added"
+msgstr "Mới thêm"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1117
+msgid "Favorite Songs"
+msgstr "Bài hát ưa thích"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "Không thể phát tập tin"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "_Tìm trong {}"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " và "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr ", "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] ""
+"{} là cần thiết để có thể phát tập tin nhưng mà nó lại chưa được cài đặt."
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "Đang phát nhạc"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:45
+msgid "Shuffle"
+msgstr "Xáo trộn"
+
+#: gnomemusic/player.py:46
+msgid "Repeat Song"
+msgstr "Lặp bài hát"
+
+#: gnomemusic/player.py:47
+msgid "Repeat All"
+msgstr "Lặp tất cả"
+
+#: gnomemusic/player.py:48
+msgid "Shuffle/Repeat Off"
+msgstr "Tắt xáo trộn/lặp"
+
+#: gnomemusic/utils.py:80
+msgid "Unknown album"
+msgstr "Tập nhạc chưa biết"
+
+#: gnomemusic/utils.py:101
+msgid "Unknown Artist"
+msgstr "Nghệ sĩ chưa biết"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "Thư mục Nhạc XDG của bạn chưa được đặt."
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "Thư mục nhạc"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "Nội dung của {} của bạn sẽ xuất hiện ở đây."
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "Không tìm thấy bài hát nào"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "Thử tìm kiếm khác"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "Nhạc GNOME không thể kết nối đến Tracker."
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr ""
+"Các tập tin nhạc của bạn không thể được đánh mục lục mà không có Tracker "
+"đang chạy."
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "Phiên bản Tracker của bạn có vẻ lỗi thời."
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "Nhạc cần Tracker phiên bản 3.0.0 trở lên."
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "Danh sách phát"
+
+#: gnomemusic/views/searchview.py:420
+msgid "Artists Results"
+msgstr "Kết quả Nghệ sĩ"
+
+#: gnomemusic/views/searchview.py:435
+msgid "Albums Results"
+msgstr "Kết quả Tuyển tập"
+
+#: gnomemusic/widgets/albumwidget.py:237
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} phút"
+
+#: gnomemusic/widgets/disclistboxwidget.py:75
+msgid "Disc {}"
+msgstr "Đĩa {}"
+
+#: gnomemusic/widgets/headerbar.py:68
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "Đã chọn {} bài hát"
+
+#: gnomemusic/widgets/lastfmdialog.py:65
+msgid "Your music listening is reported to Last.fm."
+msgstr "Nghe nhạc của bạn được báo cáo cho Last.fm."
+
+#: gnomemusic/widgets/lastfmdialog.py:67
+msgid "Your music listening is not reported to Last.fm."
+msgstr "Nghe nhạc của bạn không được báo cáo cho Last.fm."
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Logged in as {}"
+msgstr "Đăng nhập dưới danh nghĩa {}"
+
+#: gnomemusic/widgets/lastfmdialog.py:72
+msgid "Configure"
+msgstr "Cấu hình"
+
+#: gnomemusic/widgets/notificationspopup.py:216
+msgid "Playlist {} removed"
+msgstr "Danh sách phát {} đã bị xóa bỏ"
+
+#: gnomemusic/widgets/notificationspopup.py:220
+msgid "{} removed from {}"
+msgstr "{} bị xóa khỏi {}"
+
+#: gnomemusic/widgets/playertoolbar.py:174
+msgid "Pause"
+msgstr "Tạm dừng"
+
+#: gnomemusic/widgets/playlistcontrols.py:132
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} bài hát"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "Một cách đơn giản để phát nhạc. Tự động dò tìm nhạc trên máy tính của "
+#~ "bạn, mạng nội bộ hoặc các dịch vụ internet."
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "Tìm các rãnh trong bộ sưu tập nội bộ của bạn, lấy nhạc từ máy phục vụ "
+#~ "DLNA hoặc thử một số cái mới với các dịch vụ Jamendo và Magnatune."
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "Tình trạng khởi tạo đã được hiển thị"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "Chọn nó khi muốn hiển thị tình trạng ban đầu"
+
+#~ msgid "Released"
+#~ msgstr "Được phát hành"
+
+#~ msgid "Running Length"
+#~ msgstr "Tổng thời lượng"
+
+#~ msgid "Composer"
+#~ msgstr "Nhà soạn nhạc"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "Phát"
+
+#~ msgid "Hey DJ"
+#~ msgstr "Hey DJ"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "Không tiêu đề"
+
+#~ msgid "All"
+#~ msgstr "Tất cả"
+
+#~ msgid "Artist"
+#~ msgstr "Nghệ sĩ"
+
+#~ msgid "Album"
+#~ msgstr "Tuyển tập"
+
+#~ msgid "Track Title"
+#~ msgstr "Tiêu đề rãnh"
+
+#~ msgid "Local"
+#~ msgstr "Nội bộ"
+
+#~ msgid "Sources"
+#~ msgstr "Nguồn"
+
+#~ msgid "Match"
+#~ msgstr "Khớp"
+
+#~ msgid "_Quit"
+#~ msgstr "_Thoát"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "Nhạc là một ứng dụng phát nhạc mới dành cho GNOME."
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "Chế độ tìm kiếm"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "Nếu được chọn, thanh tìm kiếm sẽ được hiển thị."
+
+#~ msgid "Notifications mode"
+#~ msgstr "Chế độ thông báo"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "Bật hay tắt thông báo phát lại"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "Đã chọn %d mục"
+
+#~ msgid "%d min"
+#~ msgstr "%d phút"
+
+#~ msgid "Empty"
+#~ msgstr "Trống"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Chọn Danh sách phát"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr ""
+#~ "Số lượng ký tự tối đa được hiện thị trong tên rãnh trên bộ hiển thị Nghệ "
+#~ "sỹ"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "Cài đặt này sửa đổi số lượng ký tự cho tiêu đề rãnh trên bộ trình bày "
+#~ "Nghệ sỹ trước khi nó được lửng hóa. Đặt nó bằng -1 để tắt"
+
+#~ msgid "the a an"
+#~ msgstr "cái một"
+
+#~ msgid "All Artists"
+#~ msgstr "Mọi nghệ sỹ"
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644
index 00000000..bd2fa43c
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,786 @@
+# Chinese (China) translation for gnome-music.
+# Copyright (C) 2013-2019 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# tuhaihe <1132321739qq@gmail.com>, 2013.
+# Tong Hui <tonghuix@gmail.com>, 2013.
+# sphinx <yishanj@gmail.com>, 2014.
+# Mingcong Bai <jeffbai@aosc.xyz>, 2018.
+# Dingzhong Chen <wsxy162@gmail.com>, 2018, 2019.
+# Cheng Lu <chenglu1990@gmail.com>, 2016, 2020.
+# lumingzh <lumingzh@qq.com>, 2022-2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2023-07-04 07:49+0000\n"
+"PO-Revision-Date: 2023-08-05 15:22+0800\n"
+"Last-Translator: lumingzh <lumingzh@qq.com>\n"
+"Language-Team: Chinese - China <i18n-zh@googlegroups.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"X-Generator: Gtranslator 42.0\n"
+"X-DamnedLies-Scope: partial\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:243
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "音乐"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "播放与管理您的音乐集"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "简单而愉快的播放音乐的方式。"
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr ""
+"在您的本地收藏中寻找音轨,使用自动生成的播放列表或者自行编辑生成播放列表。"
+
+#: data/org.gnome.Music.appdata.xml.in.in:182
+msgid "The GNOME Music developers"
+msgstr "GNOME“音乐”开发者"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "音乐播放器"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;音乐;播放器;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "窗口大小"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "窗口大小(宽度与高度)。"
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "窗口最大化"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "窗口最大化状态。"
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "重复播放模式"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"该值定义是否重复或随机播放音乐合集。有效值包括:“none”(关闭重复和随"
+"机)、“song”(重复当前歌曲)、“all”(重复播放列表,非随机)、“shuffle”(随机"
+"播放列表,假定重复全部)。"
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "启用回放增益"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "启用或禁用专辑的回放增益"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "阻止系统挂起"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "播放音乐时是否阻止系统休眠"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "将您的音乐历史记录报告给 Last.fm"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr "启用或禁用向 Last.fm 发送当前播放的曲目以及“正在播放”信息的功能。"
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "播放"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "播放(_P)"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "添加至收藏歌曲(_F)"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "添加到播放列表(_A)…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm 帐号"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "报告音乐收听情况"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "键盘快捷键(_K)"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "帮助(_H)"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "关于“音乐”(_A)"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "欢迎使用音乐应用"
+
+#: data/ui/HeaderBar.ui:17
+msgid "Menu"
+msgstr "菜单"
+
+#: data/ui/HeaderBar.ui:25 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "选择"
+
+#: data/ui/HeaderBar.ui:31 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "取消(_C)"
+
+#: data/ui/HeaderBar.ui:43 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "搜索"
+
+#: data/ui/HeaderBar.ui:51
+msgid "Back"
+msgstr "后退"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "常规"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "关闭窗口"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "搜索"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "帮助"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "快捷键"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "播放"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "播放/暂停"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "下一首歌曲"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "上一首歌曲"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "重复播放"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "随机播放"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "导航"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "转到专辑"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "转到艺术家"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "转到歌曲"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "转到播放列表"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "返回"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr "Last.fm 是一项音乐发现服务,可根据您的所收听的音乐为您提供个性化推荐。"
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "音乐报告没有设置"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "登录您的 Last.fm 帐号以便报告您的音乐收听情况。"
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "登录"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "上一首"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "下一首"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "移除(_D)"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "重命名(_R)…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "播放列表名"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "完成(_D)"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "输入您首个播放列表的名称"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "创建(_R)"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "新建播放列表…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "添加"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "添加到播放列表"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "添加(_A)"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "艺术家"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "查看所有"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "专辑"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "歌曲"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "全选"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "全不选"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "点击条目以选中它们"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "添加到播放列表(_A)"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "从播放列表移除(_R)"
+
+#: gnomemusic/about.py:245
+msgid "The GNOME Project"
+msgstr "GNOME 项目"
+
+#: gnomemusic/about.py:249
+msgid "translator-credits"
+msgstr ""
+"tuhaihe <1132321739qq@gmail.com>, 2013\n"
+"Tong Hui <tonghuix@gmail.com>, 2013\n"
+"sphinx <yishanj@gmail.com>, 2014\n"
+"Mingcong Bai <jeffbai@aosc.xyz>, 2018\n"
+"Dingzhong Chen <wsxy162@gmail.com>, 2018, 2019\n"
+"Cheng Lu <chenglu1990@gmail.com>, 2016, 2020\n"
+"lumingzh <lumingzh@qq.com>, 2022\n"
+"Boyuan Yang <byang@debian.org>, 2022"
+
+#: gnomemusic/about.py:253
+msgid "Copyright The GNOME Music Developers"
+msgstr "版权所有 GNOME“音乐”开发者"
+
+#: gnomemusic/about.py:256
+msgid "Translated by"
+msgstr "翻译贡献者"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "最多播放"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "从未播放"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "最近播放"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "最近添加"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "收藏歌曲"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "无法播放该文件"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "在 {} 中查找(_F)"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " 和 "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr "、 "
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "需要 {} 来播放该文件,但它尚未安装。"
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "正在播放音乐"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle/Repeat Off"
+msgstr "关闭“随机/重复播放”"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "重复播放"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "全部重播"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle"
+msgstr "随机播放"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "播放列表 {} 已移除"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "撤消"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "{} 已从 {} 移除"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "未知专辑"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "未知艺术家"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "您的 XDG 音乐目录没有设置。"
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "音乐文件夹"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "{} 的内容将会显示在此处。"
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "未找到音乐"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "尝试不同的搜索"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "GNOME 音乐无法连接到 Tracker。"
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "在 Tracker 未运行时无法对你的音乐文件进行索引。"
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "您的系统 Tracker 版本似乎已过时。"
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "音乐需要 Tracker 版本 3.0.0 或更高。"
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "播放列表"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "艺术家结果"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "专辑结果"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} 分钟"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "唱片 {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "已选中 {} 首歌曲"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "您的音乐收听情况将报告给 Last.fm。"
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "您的音乐收听情况不会报告给 Last.fm。"
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "以 {} 登录"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "设置"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "暂停"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} 首歌曲"
+
+#: gnomemusic/widgets/searchheaderbar.py:66
+msgid "Search songs, artists, albums and playlists"
+msgstr "搜索歌曲、艺术家、专辑和播放列表"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "GNOME 音乐播放及管理程序。"
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "访问“GNOME 音乐”网站"
+
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "GNOME 音乐是自由软件;您可以在自由软件基金会发布的 GNU 通用公共许可证的条"
+#~ "款下重新分发和(或)修改它;您可以选择使用 GPL 第二版,或(按照您的意愿)"
+#~ "任何更新的版本。\n"
+#~ "\n"
+#~ "GNOME 音乐分发的目的是希望它物有所用,但是没有任何担保;没有对其适销性和某"
+#~ "一特定目的下的适用性的任何即便是暗示的担保。请查阅 GNU 通用公共许可证以获"
+#~ "得更多信息。\n"
+#~ "\n"
+#~ "您应当已经跟 GNOME 音乐一起收到一份 GNU 通用公众许可证的副本;如果没有,请"
+#~ "写信至:Free Software Foundation, Inc.,\n"
+#~ "51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
+#~ "\n"
+#~ "GNOME 音乐的作者在此对非 GPL 兼容的 GStreamer 插件同 GNOME 音乐及 "
+#~ "GStreamer 一道使用及分发给予许可。该许可优于并覆盖在 GNOME 音乐的 GPL 授权"
+#~ "许可之上。如果您修改该代码,您可以将该例外扩展到您的代码,但非强制。如果您"
+#~ "不愿意如此,从您的版本中删除该例外声明。"
+
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "您的音乐文件夹的内容将会显示在此处"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME 音乐"
+
+#~ msgid "Window position"
+#~ msgstr "窗口位置"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "窗口位置(水平和竖直)。"
+
+#~ msgid "Loading"
+#~ msgstr "正在加载"
+
+#~ msgid "Add to Playlist…"
+#~ msgstr "添加到播放列表…"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr "简单易用的音乐播放器。自动探索电脑上和网络上的音乐。"
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "在你的本地收藏中寻找音乐,从 DLNA 服务器或是 Jamendo 和 Magnatune 上获得新"
+#~ "音乐。"
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "初始状态已被显示"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "当初始状态被显示时设置为 true"
+
+#~ msgid "Released"
+#~ msgstr "发布时间"
+
+#~ msgid "Running Length"
+#~ msgstr "总时长"
+
+#~ msgid "Composer"
+#~ msgstr "作曲"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "播放"
+
+#~ msgid "Hey DJ"
+#~ msgstr "嘿 DJ"
+
+#~ msgid "All"
+#~ msgstr "全部"
+
+#~ msgid "Artist"
+#~ msgstr "艺术家"
+
+#~ msgid "Album"
+#~ msgstr "专辑"
+
+#~ msgid "Track Title"
+#~ msgstr "音轨标题"
+
+#~ msgid "Local"
+#~ msgstr "本地"
+
+#~ msgid "Sources"
+#~ msgstr "来源"
+
+#~ msgid "Match"
+#~ msgstr "匹配"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "Untitled"
+#~ msgstr "无标题"
+
+#~ msgid "_Quit"
+#~ msgstr "退出(_Q)"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "“音乐”是一款新的 GNOME 音乐播放应用。"
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "已选择 %d 个项目"
+
+#~ msgid "Empty"
+#~ msgstr "空"
+
+#~ msgid "Search mode"
+#~ msgstr "搜索模式"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "如果为真,则显示搜索框。"
+
+#~ msgid "Notifications mode"
+#~ msgstr "通知模式"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "启用或禁用播放的通知"
+
+#~ msgid "%d min"
+#~ msgstr "%d 分钟"
+
+#~ msgid "Select Playlist"
+#~ msgstr "选择播放列表"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "在艺术家视图中显示音轨名称的最多字符数"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "此设置改变艺术家视图中音轨标题在省略号前显示的字符数量。设为 -1 则禁用"
+
+#, fuzzy
+#~ msgid "the a an"
+#~ msgstr "the a an"
+
+#~ msgid "All Artists"
+#~ msgstr "全部艺术家"
+
+#~ msgid "Not playing"
+#~ msgstr "尚未播放"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "艺术家:%s,专辑:%s"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "没有找到音乐!\n"
+#~ "请将音乐文件放入文件夹 %s"
+
+#~ msgid "_New Playlist"
+#~ msgstr "新建播放列表(_N)"
+
+#~ msgid "Load More"
+#~ msgstr "加载更多"
+
+#~ msgid "Now _Playing"
+#~ msgstr "正在播放(_P)"
+
+#~ msgid "----"
+#~ msgstr "----"
+
+#~ msgid "--:--"
+#~ msgstr "--:--"
+
+#, fuzzy
+#~ msgid "0:00"
+#~ msgstr "00:00"
+
+#~ msgid "/"
+#~ msgstr "/"
diff --git a/po/zh_HK.po b/po/zh_HK.po
new file mode 100644
index 00000000..9eaea02f
--- /dev/null
+++ b/po/zh_HK.po
@@ -0,0 +1,325 @@
+# Chinese (Hong Kong) translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+"music&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-03-05 19:58+0000\n"
+"PO-Revision-Date: 2014-03-09 11:57+0800\n"
+"Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\n"
+"Language-Team: Chinese (Hong Kong) <community@linuxhall.org>\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.6.3\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../data/org.gnome.Music.gschema.xml.h:1
+msgid "Window size"
+msgstr "視窗尺寸"
+
+#: ../data/org.gnome.Music.gschema.xml.h:2
+msgid "Window size (width and height)."
+msgstr "視窗大小 (闊度與高度)。"
+
+#: ../data/org.gnome.Music.gschema.xml.h:3
+msgid "Window position"
+msgstr "視窗位置"
+
+#: ../data/org.gnome.Music.gschema.xml.h:4
+msgid "Window position (x and y)."
+msgstr "視窗位置 (x 與 y)。"
+
+#: ../data/org.gnome.Music.gschema.xml.h:5
+msgid "Window maximized"
+msgstr "視窗已最大化"
+
+#: ../data/org.gnome.Music.gschema.xml.h:6
+msgid "Window maximized state."
+msgstr "視窗為最大化狀態。"
+
+#: ../data/org.gnome.Music.gschema.xml.h:7
+msgid "Playback repeat mode"
+msgstr "重複播放模式"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: ../data/org.gnome.Music.gschema.xml.h:9
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: \"none\" (repeat and shuffle are off), \"song"
+"\" (repeat current song), \"all\" (repeat playlist, no shuffle), \"shuffle"
+"\" (shuffle playlist, presumes repeat all)."
+msgstr "用來辨別是要重複播放收藏集或是亂數播放的值。允許的值有:「none」(不重複也不隨機)、「song」(重複目前曲目)、「all」(重複播放清單曲目,不隨機) 和「shuffle」(隨機播放清單曲目,假定全部重複)。"
+
+#: ../data/org.gnome.Music.gschema.xml.h:10
+msgid "Search mode"
+msgstr "搜尋模式"
+
+#: ../data/org.gnome.Music.gschema.xml.h:11
+msgid "If true, the search bar is shown."
+msgstr "如果設定為 true,則顯示搜尋工具列。"
+
+#: ../data/gnome-music.desktop.in.h:1 ../gnomemusic/application.py:46
+#: ../gnomemusic/application.py:102 ../gnomemusic/window.py:57
+#: ../data/AboutDialog.ui.in.h:1
+msgid "Music"
+msgstr "音樂"
+
+#: ../data/gnome-music.desktop.in.h:2
+msgid "Music Player"
+msgstr "音樂播放器"
+
+#: ../data/gnome-music.desktop.in.h:3 ../data/gnome-music.appdata.xml.in.h:2
+msgid "Play and organize your music collection"
+msgstr "播放與組織你的音樂收藏集"
+
+#: ../data/gnome-music.appdata.xml.in.h:1
+msgid "GNOME Music"
+msgstr "GNOME Music"
+
+#: ../data/gnome-music.appdata.xml.in.h:3
+msgid "Music is the new GNOME music playing application."
+msgstr "Music 是新的 GNOME 音樂播放應用程式。"
+
+#: ../gnomemusic/albumArtCache.py:235 ../gnomemusic/albumArtCache.py:243
+msgid "Untitled"
+msgstr "無標題"
+
+#: ../gnomemusic/notification.py:70
+msgid "Not playing"
+msgstr "不播放"
+
+#: ../gnomemusic/notification.py:79 ../gnomemusic/player.py:365
+#: ../gnomemusic/view.py:249 ../gnomemusic/view.py:437
+#: ../gnomemusic/view.py:650 ../gnomemusic/view.py:964
+msgid "Unknown Artist"
+msgstr "不明的演出者"
+
+#: ../gnomemusic/notification.py:81 ../gnomemusic/view.py:535
+msgid "Unknown Album"
+msgstr "不明的專輯"
+
+#. TRANSLATORS: by refers to the artist, from to the album
+#: ../gnomemusic/notification.py:85
+#, python-format
+msgid "by %s, from %s"
+msgstr "歌手 %s,專輯 %s"
+
+#: ../gnomemusic/notification.py:125
+msgid "Previous"
+msgstr "前一首"
+
+#: ../gnomemusic/notification.py:128
+msgid "Pause"
+msgstr "暫停"
+
+#: ../gnomemusic/notification.py:131
+msgid "Play"
+msgstr "播放"
+
+#: ../gnomemusic/notification.py:133
+msgid "Next"
+msgstr "下一首"
+
+#: ../gnomemusic/view.py:193 ../gnomemusic/widgets.py:261
+#: ../gnomemusic/window.py:211
+#, python-format
+msgid "Selected %d item"
+msgid_plural "Selected %d items"
+msgstr[0] "己選擇 %d 項目"
+
+#: ../gnomemusic/view.py:195 ../gnomemusic/widgets.py:263
+#: ../gnomemusic/window.py:215 ../gnomemusic/window.py:229
+#: ../data/headerbar.ui.in.h:3
+msgid "Click on items to select them"
+msgstr "點按項目來選取它們"
+
+#: ../gnomemusic/view.py:318
+#, python-format
+msgid ""
+"No Music found!\n"
+" Put some files into the folder %s"
+msgstr ""
+"找不到音樂!\n"
+" 請將檔案放到資料夾 %s"
+
+#: ../gnomemusic/view.py:325
+msgid "Albums"
+msgstr "專輯"
+
+#: ../gnomemusic/view.py:391
+msgid "Songs"
+msgstr "歌曲"
+
+#: ../gnomemusic/view.py:548
+msgid "Artists"
+msgstr "演出者"
+
+#: ../gnomemusic/view.py:585 ../gnomemusic/view.py:587
+#: ../gnomemusic/widgets.py:451
+msgid "All Artists"
+msgstr "所有演出者"
+
+#: ../gnomemusic/view.py:717
+msgid "Playlists"
+msgstr "播放清單"
+
+#: ../gnomemusic/view.py:981
+#, python-format
+#| msgid "Songs"
+msgid "%d Song"
+msgid_plural "%d Songs"
+msgstr[0] "%d 歌曲"
+
+#: ../gnomemusic/widgets.py:75 ../gnomemusic/widgets.py:95
+msgid "Load More"
+msgstr "載入更多"
+
+#: ../gnomemusic/widgets.py:85
+msgid "Loading..."
+msgstr "正在載入…"
+
+#: ../gnomemusic/widgets.py:670
+#| msgid "_New Playlist"
+msgid "New Playlist"
+msgstr "新增播放清單"
+
+#: ../gnomemusic/window.py:181
+msgid "Empty"
+msgstr "清空"
+
+#: ../data/AboutDialog.ui.in.h:2
+msgid "Copyright © 2013 GNOME Music Developers"
+msgstr "版權所有 © 2013 GNOME Music 開發隊伍"
+
+#: ../data/AboutDialog.ui.in.h:3
+msgid "A music player and management application for GNOME."
+msgstr "GNOME 的音樂播放器與管理程式。"
+
+#: ../data/AboutDialog.ui.in.h:4
+msgid "Visit GNOME Music website"
+msgstr "參訪 GNOME Music 網站"
+
+#: ../data/AboutDialog.ui.in.h:5
+msgid ""
+"GNOME Music is free software; you can redistribute it and/or modify it under "
+"the terms of the GNU General Public License as published by the Free "
+"Software Foundation; either version 2 of the License, or (at your option) "
+"any later version.\n"
+"\n"
+"GNOME Music is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for "
+"more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along with "
+"GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+"Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"The GNOME Music authors hereby grant permission for non-GPL compatible "
+"GStreamer plugins to be used and distributed together with GStreamer and "
+"GNOME Music. This permission is above and beyond the permissions granted by "
+"the GPL license by which GNOME Music is covered. If you modify this code, "
+"you may extend this exception to your version of the code, but you are not "
+"obligated to do so. If you do not wish to do so, delete this exception "
+"statement from your version."
+msgstr ""
+"GNOME Music 是自由軟件,你可以遵照自由軟件基金會 (Free Software Foundation) 出版的 GNU 通用公共授權條款 (GNU General Public License) 第二版來修改和重新發佈這一程式,或者自由選擇使用之後的任何版本。\n"
+"\n"
+"發佈 GNOME Music 程式的目的是希望它有用,但「沒有任何擔保」;甚至也沒有「可以銷售」或「適合特定目的」等隱示性擔保。詳細內容請參閱 GNU 通用公共授權。\n"
+"\n"
+"你應該已經隨程式一起收到一份 GNU 通用公共授權的副本。如果還沒有,請寫信給:Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+"\n"
+"GNOME Music 作者羣特此授予不兼容於 GPL 授權的 GStreamer 外掛程式能隨 GStreamer 及 GNOME Music 一同使用、散佈之許可。這項許可高於且超出 GNOME Music 遵照之 GPL 授權所授予之許可範圍。如果你修改此份程式碼,你可以將此例外條款擴及至你自身的版本上,但你沒有義務必須也這麼作。如果你不希望有此例外條款,請將例外聲明從你的版本中移除。"
+
+#: ../data/AlbumWidget.ui.h:1
+msgid "Released"
+msgstr "發行"
+
+#: ../data/AlbumWidget.ui.h:2
+msgid "Running Length"
+msgstr "播放長度"
+
+#: ../data/app-menu.ui.h:1
+msgid "_New Playlist"
+msgstr "新增播放清單(_N)"
+
+#: ../data/app-menu.ui.h:2
+msgid "_Help"
+msgstr "求助(_H)"
+
+#: ../data/app-menu.ui.h:3
+msgid "_About"
+msgstr "關於(_A)"
+
+#: ../data/app-menu.ui.h:4
+msgid "_Quit"
+msgstr "結束(_Q)"
+
+#: ../data/PlayerToolbar.ui.h:1
+msgid "Shuffle"
+msgstr "亂數"
+
+#: ../data/PlayerToolbar.ui.h:2
+msgid "Repeat All"
+msgstr "全部重複播放"
+
+#: ../data/PlayerToolbar.ui.h:3
+msgid "Repeat Song"
+msgstr "重複播放歌曲"
+
+#: ../data/PlayerToolbar.ui.h:4
+msgid "Shuffle/Repeat Off"
+msgstr "亂數/重複播放關閉"
+
+#: ../data/NoMusic.ui.h:1
+msgid "No Music Found"
+msgstr "找不到音樂"
+
+#: ../data/headerbar.ui.in.h:1
+msgid "Select All"
+msgstr "全選"
+
+#: ../data/headerbar.ui.in.h:2
+msgid "Select None"
+msgstr "取消全選"
+
+#: ../data/headerbar.ui.in.h:4 ../data/PlaylistDialog.ui.in.h:2
+msgid "Cancel"
+msgstr "取消"
+
+#: ../data/SelectionToolbar.ui.h:1
+msgid "Add to Playlist"
+msgstr "加入至播放清單"
+
+#: ../data/SelectionToolbar.ui.h:2
+#| msgid "Add to Playlist"
+msgid "Remove from Playlist"
+msgstr "從播放清單移除"
+
+#: ../data/PlaylistControls.ui.h:1
+#| msgid "Play"
+msgid "_Play"
+msgstr "播放(_P)"
+
+#: ../data/PlaylistControls.ui.h:2
+msgid "_Delete"
+msgstr "刪除(_D)"
+
+#: ../data/PlaylistDialog.ui.in.h:1
+#| msgid "Select All"
+msgid "Select Playlist"
+msgstr "選擇播放清單"
+
+#: ../data/PlaylistDialog.ui.in.h:3
+#| msgid "Select All"
+msgid "Select"
+msgstr "選擇"
+
+#~ msgid "Now _Playing"
+#~ msgstr "現正播放(_N)"
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644
index 00000000..aad1e8cc
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,788 @@
+# Chinese (Taiwan) translation for gnome-music.
+# Copyright (C) 2013 gnome-music's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-music package.
+#
+# pan93412 <pan93412@gmail.com>, 2019.
+# Freddy Cheng <freddy4212@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-music master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
+"POT-Creation-Date: 2022-08-31 19:15+0000\n"
+"PO-Revision-Date: 2022-10-18 21:08+0800\n"
+"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
+"Language-Team: Chinese - Taiwan <chinese-l10n@googlegroups.com>\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: data/org.gnome.Music.appdata.xml.in.in:6
+#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/about.py:236
+#: gnomemusic/application.py:61 gnomemusic/window.py:71
+msgid "Music"
+msgstr "音樂"
+
+#: data/org.gnome.Music.appdata.xml.in.in:7
+#: data/org.gnome.Music.desktop.in.in:5
+msgid "Play and organize your music collection"
+msgstr "播放與管理您所收藏的音樂"
+
+#: data/org.gnome.Music.appdata.xml.in.in:9
+msgid "An easy and pleasant way to play your music."
+msgstr "一種輕鬆且愉悅的音樂播放方式。"
+
+#: data/org.gnome.Music.appdata.xml.in.in:12
+msgid ""
+"Find tracks in your local collection, use automatically generated playlists "
+"or curate a fresh one."
+msgstr "尋找您電腦中的音樂,並能自動產生或是自行編排播放列表。"
+
+#: data/org.gnome.Music.appdata.xml.in.in:167
+msgid "The GNOME Music developers"
+msgstr "GNOME 音樂開發群"
+
+#: data/org.gnome.Music.desktop.in.in:4
+msgid "Music Player"
+msgstr "音樂播放器"
+
+#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+#: data/org.gnome.Music.desktop.in.in:13
+msgid "Music;Player;"
+msgstr "Music;Player;音樂;播放器;mp3;聽音樂;歌;lastfm;"
+
+#: data/org.gnome.Music.gschema.xml:12
+msgid "Window size"
+msgstr "視窗尺寸"
+
+#: data/org.gnome.Music.gschema.xml:13
+msgid "Window size (width and height)."
+msgstr "視窗大小 (寬度,高度)。"
+
+#: data/org.gnome.Music.gschema.xml:17
+msgid "Window maximized"
+msgstr "視窗最大化"
+
+#: data/org.gnome.Music.gschema.xml:18
+msgid "Window maximized state."
+msgstr "是否要最大化視窗。"
+
+#: data/org.gnome.Music.gschema.xml:22
+msgid "Playback repeat mode"
+msgstr "重複播放模式"
+
+#. Translators: Don't translate allowed values, just the description in the brackets
+#: data/org.gnome.Music.gschema.xml:24
+msgid ""
+"Value identifies whether to repeat or randomize playback through the "
+"collection. Allowed values are: “none” (repeat and shuffle are off), "
+"“song” (repeat current song), “all” (repeat playlist, no shuffle), "
+"“shuffle” (shuffle playlist, presumes repeat all)."
+msgstr ""
+"用來辨別是要重複播放蒐藏或隨機播放的值。允許的值有:\n"
+"「none」(不重複也不隨機)\n"
+"「song」(重複目前曲目)\n"
+"「all」(重複播放清單曲目,不隨機)\n"
+"「shuffle」(隨機播放清單曲目,假定全部重複)"
+
+#: data/org.gnome.Music.gschema.xml:28
+msgid "Enable ReplayGain"
+msgstr "啟用播放增益"
+
+#: data/org.gnome.Music.gschema.xml:29
+msgid "Enables or disables ReplayGain for albums"
+msgstr "啟用或停用專輯的播放增益"
+
+#: data/org.gnome.Music.gschema.xml:33
+msgid "Inhibit system suspend"
+msgstr "防止系統暫停"
+
+#: data/org.gnome.Music.gschema.xml:34
+msgid "Enables or disables inhibiting system suspend while playing music"
+msgstr "啟用或停用音樂播放時的防止系統進入暫停"
+
+#: data/org.gnome.Music.gschema.xml:38
+msgid "Report music history to Last.fm"
+msgstr "將音樂記錄上傳至《Last.fm》"
+
+#: data/org.gnome.Music.gschema.xml:39
+msgid ""
+"Enables or disables sending scrobbles and the “currently playing” info to "
+"Last.fm."
+msgstr "啟用/停用上傳音樂記錄及「目前播放」資訊至《Last.fm》。"
+
+#: data/ui/AlbumWidget.ui:84 data/ui/PlayerToolbar.ui:87
+#: data/ui/PlaylistControls.ui:101 gnomemusic/widgets/playertoolbar.py:170
+msgid "Play"
+msgstr "播放"
+
+#: data/ui/AlbumWidget.ui:130 data/ui/PlaylistControls.ui:5
+#: data/ui/SongWidgetMenu.ui:11
+msgid "_Play"
+msgstr "播放(_P)"
+
+#: data/ui/AlbumWidget.ui:134
+msgid "Add to _Favorite Songs"
+msgstr "加入喜愛的歌曲(_F)"
+
+#: data/ui/AlbumWidget.ui:138 data/ui/SongWidgetMenu.ui:15
+msgid "_Add to Playlist…"
+msgstr "加入播放清單(_A)…"
+
+#: data/ui/AppMenu.ui:23 data/ui/LastfmDialog.ui:8
+msgid "Last.fm Account"
+msgstr "Last.fm 帳號"
+
+#: data/ui/AppMenu.ui:36
+msgid "Report Music Listening"
+msgstr "上傳音樂聆聽紀錄"
+
+#: data/ui/AppMenu.ui:58
+msgid "_Keyboard Shortcuts"
+msgstr "鍵盤捷徑鍵(_K)"
+
+#: data/ui/AppMenu.ui:68
+msgid "_Help"
+msgstr "求助(_H)"
+
+#: data/ui/AppMenu.ui:78
+msgid "_About Music"
+msgstr "關於音樂(_A)"
+
+#: data/ui/EmptyView.ui:30
+msgid "Welcome to Music"
+msgstr "歡迎使用《音樂》"
+
+#: data/ui/HeaderBar.ui:16
+msgid "Menu"
+msgstr "選單"
+
+#: data/ui/HeaderBar.ui:24 data/ui/SearchHeaderBar.ui:15
+msgid "Select"
+msgstr "選取音樂"
+
+#: data/ui/HeaderBar.ui:30 data/ui/PlaylistDialog.ui:213
+#: data/ui/SearchHeaderBar.ui:20
+msgid "_Cancel"
+msgstr "取消(_C)"
+
+#: data/ui/HeaderBar.ui:42 data/ui/SearchHeaderBar.ui:32
+msgid "Search"
+msgstr "搜尋"
+
+#: data/ui/HeaderBar.ui:50
+msgid "Back"
+msgstr "返回"
+
+#: data/ui/help-overlay.ui:11
+msgctxt "shortcut window"
+msgid "General"
+msgstr "一般"
+
+#: data/ui/help-overlay.ui:14
+msgctxt "shortcut window"
+msgid "Close window"
+msgstr "關閉視窗"
+
+#: data/ui/help-overlay.ui:20
+msgctxt "shortcut window"
+msgid "Search"
+msgstr "搜尋"
+
+#: data/ui/help-overlay.ui:26
+msgctxt "shortcut window"
+msgid "Help"
+msgstr "求助"
+
+#: data/ui/help-overlay.ui:32
+msgctxt "shortcut window"
+msgid "Shortcuts"
+msgstr "捷徑鍵"
+
+#: data/ui/help-overlay.ui:40
+msgctxt "shortcut window"
+msgid "Playback"
+msgstr "播放控制"
+
+#: data/ui/help-overlay.ui:43
+msgctxt "shortcut window"
+msgid "Play/Pause"
+msgstr "播放/暫停"
+
+#: data/ui/help-overlay.ui:49
+msgctxt "shortcut window"
+msgid "Next song"
+msgstr "下一首"
+
+#: data/ui/help-overlay.ui:55
+msgctxt "shortcut window"
+msgid "Previous song"
+msgstr "上一首"
+
+#: data/ui/help-overlay.ui:61
+msgctxt "shortcut window"
+msgid "Toggle repeat"
+msgstr "切換重複播放模式"
+
+#: data/ui/help-overlay.ui:67
+msgctxt "shortcut window"
+msgid "Toggle shuffle"
+msgstr "切換隨機播放模式"
+
+#: data/ui/help-overlay.ui:75
+msgctxt "shortcut window"
+msgid "Navigation"
+msgstr "導覽"
+
+#: data/ui/help-overlay.ui:78
+msgctxt "shortcut window"
+msgid "Go to Albums"
+msgstr "前往專輯分頁"
+
+#: data/ui/help-overlay.ui:84
+msgctxt "shortcut window"
+msgid "Go to Artists"
+msgstr "前往演出者分頁"
+
+#: data/ui/help-overlay.ui:90
+msgctxt "shortcut window"
+msgid "Go to Songs"
+msgstr "前往歌曲分頁"
+
+#: data/ui/help-overlay.ui:96
+msgctxt "shortcut window"
+msgid "Go to Playlists"
+msgstr "前往播放清單分頁"
+
+#: data/ui/help-overlay.ui:102
+msgctxt "shortcut window"
+msgid "Go back"
+msgstr "返回"
+
+#: data/ui/LastfmDialog.ui:21
+msgid ""
+"Last.fm is a music discovery service that gives you personalised "
+"recommendations based on the music you listen to."
+msgstr ""
+"《Last.fm》是一種音樂探索服務,能根據您的聆聽習慣提供個人化的音樂建議。"
+
+#: data/ui/LastfmDialog.ui:31 gnomemusic/widgets/lastfmdialog.py:57
+msgid "Music Reporting Not Setup"
+msgstr "音樂聆聽紀錄上傳功能尚未初始化"
+
+#: data/ui/LastfmDialog.ui:44 gnomemusic/widgets/lastfmdialog.py:60
+msgid "Login to your Last.fm account to report your music listening."
+msgstr "登入您的《Last.fm》帳號後便能上傳音樂聆聽紀錄。"
+
+#: data/ui/LastfmDialog.ui:55 gnomemusic/widgets/lastfmdialog.py:58
+msgid "Login"
+msgstr "登入"
+
+#: data/ui/PlayerToolbar.ui:74
+msgid "Previous"
+msgstr "上一曲"
+
+#: data/ui/PlayerToolbar.ui:106
+msgid "Next"
+msgstr "下一曲"
+
+#: data/ui/PlaylistControls.ui:9
+msgid "_Delete"
+msgstr "刪除(_D)"
+
+#: data/ui/PlaylistControls.ui:13
+msgid "_Rename…"
+msgstr "重新命名(_R)…"
+
+#: data/ui/PlaylistControls.ui:28
+msgid "Playlist Name"
+msgstr "播放清單名稱"
+
+#: data/ui/PlaylistControls.ui:62
+msgid "_Done"
+msgstr "完成(_D)"
+
+#: data/ui/PlaylistDialog.ui:52
+msgid "Enter a name for your first playlist"
+msgstr "為您的第一個播放清單命名"
+
+#: data/ui/PlaylistDialog.ui:77
+msgid "C_reate"
+msgstr "建立(_R)"
+
+#: data/ui/PlaylistDialog.ui:146
+msgid "New Playlist…"
+msgstr "新播放清單…"
+
+#: data/ui/PlaylistDialog.ui:161
+msgid "Add"
+msgstr "加入"
+
+#: data/ui/PlaylistDialog.ui:202
+msgid "Add to Playlist"
+msgstr "加入播放清單"
+
+#: data/ui/PlaylistDialog.ui:222
+msgid "_Add"
+msgstr "加入(_A)"
+
+#: data/ui/SearchView.ui:33 gnomemusic/views/artistsview.py:51
+msgid "Artists"
+msgstr "演出者"
+
+#: data/ui/SearchView.ui:42 data/ui/SearchView.ui:84
+msgid "View All"
+msgstr "檢視全部"
+
+#: data/ui/SearchView.ui:75 gnomemusic/views/albumsview.py:56
+msgid "Albums"
+msgstr "專輯"
+
+#: data/ui/SearchView.ui:117 gnomemusic/views/songsview.py:52
+msgid "Songs"
+msgstr "歌曲"
+
+#: data/ui/SelectionBarMenuButton.ui:7
+msgid "Select All"
+msgstr "全選"
+
+#: data/ui/SelectionBarMenuButton.ui:11
+msgid "Select None"
+msgstr "取消全選"
+
+#: data/ui/SelectionBarMenuButton.ui:19 gnomemusic/widgets/headerbar.py:69
+msgid "Click on items to select them"
+msgstr "點一下即可選取項目"
+
+#: data/ui/SelectionToolbar.ui:8
+msgid "_Add to Playlist"
+msgstr "加入播放清單(_A)"
+
+#: data/ui/SongWidgetMenu.ui:19
+msgid "_Remove from Playlist"
+msgstr "自播放清單中移除(_R)"
+
+#: gnomemusic/about.py:238
+msgid "The GNOME Project"
+msgstr "GNOME 專案"
+
+#: gnomemusic/about.py:242
+msgid "translator-credits"
+msgstr ""
+"Yi-Jyun Pan <pan93412@gmail.com>, 2019.\n"
+"Freddy Cheng <freddy4212@gmail.com>, 2922."
+
+#: gnomemusic/about.py:246
+msgid "Copyright The GNOME Music Developers"
+msgstr "著作權所有 ©《音樂》開發者群"
+
+#: gnomemusic/about.py:249
+msgid "Translated by"
+msgstr "翻譯者"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:894
+msgid "Most Played"
+msgstr "最常播放"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:948
+msgid "Never Played"
+msgstr "從未播放"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1001
+msgid "Recently Played"
+msgstr "近期播放"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1064
+msgid "Recently Added"
+msgstr "近期加入"
+
+#. TRANSLATORS: this is a playlist name
+#: gnomemusic/grilowrappers/grltrackerplaylists.py:1127
+msgid "Favorite Songs"
+msgstr "喜愛的歌曲"
+
+#: gnomemusic/gstplayer.py:408
+msgid "Unable to play the file"
+msgstr "無法播放該檔案"
+
+#: gnomemusic/gstplayer.py:414
+msgid "_Find in {}"
+msgstr "於「{}」中尋找(_F)"
+
+#. TRANSLATORS: separator for two codecs
+#: gnomemusic/gstplayer.py:424
+msgid " and "
+msgstr " 與 "
+
+#. TRANSLATORS: separator for a list of codecs
+#: gnomemusic/gstplayer.py:427
+msgid ", "
+msgstr "、"
+
+#: gnomemusic/gstplayer.py:429
+msgid "{} is required to play the file, but is not installed."
+msgid_plural "{} are required to play the file, but are not installed."
+msgstr[0] "需安裝「{}」後才能播放該檔案。"
+
+#: gnomemusic/inhibitsuspend.py:63
+msgid "Playing music"
+msgstr "播放中的音樂"
+
+#. Translators: "shuffle" causes tracks to play in random order.
+#: gnomemusic/player.py:44
+msgid "Shuffle"
+msgstr "隨機播放"
+
+#: gnomemusic/player.py:45
+msgid "Repeat Song"
+msgstr "單曲重複播放"
+
+#: gnomemusic/player.py:46
+msgid "Repeat All"
+msgstr "全部重複播放"
+
+#: gnomemusic/player.py:47
+msgid "Shuffle/Repeat Off"
+msgstr "隨機/重複播放關閉"
+
+#: gnomemusic/playlisttoast.py:55
+msgid "Playlist {} removed"
+msgstr "已移除「{}」"
+
+#: gnomemusic/playlisttoast.py:56 gnomemusic/songtoast.py:65
+msgid "Undo"
+msgstr "還原"
+
+#: gnomemusic/songtoast.py:64
+msgid "{} removed from {}"
+msgstr "「{}」已從「{}」中移除"
+
+#: gnomemusic/utils.py:92
+msgid "Unknown album"
+msgstr "不明專輯"
+
+#: gnomemusic/utils.py:113
+msgid "Unknown Artist"
+msgstr "不明演出者"
+
+#: gnomemusic/views/emptyview.py:65
+msgid "Your XDG Music directory is not set."
+msgstr "尚未設定 XDG 音樂目錄。"
+
+#: gnomemusic/views/emptyview.py:72
+msgid "Music Folder"
+msgstr "音樂資料夾"
+
+#. TRANSLATORS: This is a label to display a link to open user's music
+#. folder. {} will be replaced with the translated text 'Music folder'
+#: gnomemusic/views/emptyview.py:76
+msgid "The contents of your {} will appear here."
+msgstr "您位於{}中的內容會顯示於此。"
+
+#: gnomemusic/views/emptyview.py:124
+msgid "No Music Found"
+msgstr "找不到音樂"
+
+#: gnomemusic/views/emptyview.py:125
+msgid "Try a Different Search"
+msgstr "請嘗試不同的搜尋內容"
+
+#: gnomemusic/views/emptyview.py:129
+msgid "GNOME Music could not connect to Tracker."
+msgstr "《音樂》無法連接《Tracker》。"
+
+#: gnomemusic/views/emptyview.py:131
+msgid "Your music files cannot be indexed without Tracker running."
+msgstr "倘若《Tracker》未執行便無法檢索音樂檔案。"
+
+#: gnomemusic/views/emptyview.py:137
+msgid "Your system Tracker version seems outdated."
+msgstr "系統所安裝的《Tracker》版本似乎過舊。"
+
+#: gnomemusic/views/emptyview.py:139
+msgid "Music needs Tracker version 3.0.0 or higher."
+msgstr "《音樂》需要《Tracker》3.0.0 以上的版本。"
+
+#: gnomemusic/views/playlistsview.py:45
+msgid "Playlists"
+msgstr "播放清單"
+
+#: gnomemusic/views/searchview.py:304
+msgid "Artists Results"
+msgstr "演出者搜尋結果"
+
+#: gnomemusic/views/searchview.py:318
+msgid "Albums Results"
+msgstr "專輯搜尋結果"
+
+#: gnomemusic/widgets/albumwidget.py:245
+msgid "{} minute"
+msgid_plural "{} minutes"
+msgstr[0] "{} 分鐘"
+
+#: gnomemusic/widgets/discbox.py:75
+msgid "Disc {}"
+msgstr "光碟 {}"
+
+#: gnomemusic/widgets/headerbar.py:66
+msgid "Selected {} song"
+msgid_plural "Selected {} songs"
+msgstr[0] "己選取 {} 首歌"
+
+#: gnomemusic/widgets/lastfmdialog.py:64
+msgid "Your music listening is reported to Last.fm."
+msgstr "您的音樂聆聽紀錄將會上傳至《Last.fm》。"
+
+#: gnomemusic/widgets/lastfmdialog.py:66
+msgid "Your music listening is not reported to Last.fm."
+msgstr "您的音樂聆聽紀錄不會上傳至《Last.fm》。"
+
+#. TRANSLATORS: displays the username of the Last.fm account
+#: gnomemusic/widgets/lastfmdialog.py:70
+msgid "Logged in as {}"
+msgstr "以「{}」登入"
+
+#: gnomemusic/widgets/lastfmdialog.py:71
+msgid "Configure"
+msgstr "設定"
+
+#: gnomemusic/widgets/playertoolbar.py:167
+msgid "Pause"
+msgstr "暫停"
+
+#: gnomemusic/widgets/playlistcontrols.py:130
+msgid "{} Song"
+msgid_plural "{} Songs"
+msgstr[0] "{} 首歌曲"
+
+#~ msgid "A music player and management application for GNOME."
+#~ msgstr "GNOME 的音樂播放與管理應用程式。"
+
+#~ msgid "Visit GNOME Music website"
+#~ msgstr "造訪《音樂》網站"
+
+#~| msgid ""
+#~| "GNOME Music is free software; you can redistribute it and/or modify it "
+#~| "under the terms of the GNU General Public License as published by the "
+#~| "Free Software Foundation; either version 2 of the License, or (at your "
+#~| "option) any later version.\n"
+#~| "\n"
+#~| "GNOME Music is distributed in the hope that it will be useful, but "
+#~| "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~| "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU "
+#~| "General Public License for more details.\n"
+#~| "\n"
+#~| "You should have received a copy of the GNU General Public License along "
+#~| "with GNOME Music; if not, write to the Free Software Foundation, Inc., "
+#~| "51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~| "\n"
+#~| "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~| "GStreamer plugins to be used and distributed together with GStreamer and "
+#~| "GNOME Music. This permission is above and beyond the permissions "
+#~| "granted by the GPL license by which GNOME Music is covered. If you "
+#~| "modify this code, you may extend this exception to your version of the "
+#~| "code, but you are not obligated to do so. If you do not wish to do so, "
+#~| "delete this exception statement from your version.\n"
+#~| "\n"
+#~| "“Magic of the vinyl” by Sami Pyylampi image is licensed by CC-BY-SA 2.0 "
+#~| "https://www.flickr.com/photos/_spy_/12270839403"
+#~ msgid ""
+#~ "GNOME Music is free software; you can redistribute it and/or modify it "
+#~ "under the terms of the GNU General Public License as published by the "
+#~ "Free Software Foundation; either version 2 of the License, or (at your "
+#~ "option) any later version.\n"
+#~ "\n"
+#~ "GNOME Music is distributed in the hope that it will be useful, but "
+#~ "WITHOUT ANY WARRANTY; without even the implied warranty of "
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General "
+#~ "Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License along "
+#~ "with GNOME Music; if not, write to the Free Software Foundation, Inc., 51 "
+#~ "Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "The GNOME Music authors hereby grant permission for non-GPL compatible "
+#~ "GStreamer plugins to be used and distributed together with GStreamer and "
+#~ "GNOME Music. This permission is above and beyond the permissions granted "
+#~ "by the GPL license by which GNOME Music is covered. If you modify this "
+#~ "code, you may extend this exception to your version of the code, but you "
+#~ "are not obligated to do so. If you do not wish to do so, delete this "
+#~ "exception statement from your version."
+#~ msgstr ""
+#~ "《音樂》為自由軟體,您可以遵照自由軟體基金會 (Free Software Foundation) 所"
+#~ "出版的 《GNU 通用公共授權條款》 (GNU General Public License) 第二版來修改"
+#~ "和重新發布這一程式;您也能自由選擇之後的任何版本做使用。\n"
+#~ "\n"
+#~ "我們將《音樂》無償提供給所有人使用,但「沒有任何擔保責任」;甚至也沒有「可"
+#~ "以銷售」或「適合特定目的」等隱示性擔保。詳情請參閱《GNU 通用公共授權條"
+#~ "款》。\n"
+#~ "\n"
+#~ "您應該已隨本程式一起收到一份《GNU 通用公共授權條款》的副本。倘若您尚未收"
+#~ "到,請寫封信至:Free Software Foundation, Inc., 51 Franklin Street, Fifth "
+#~ "Floor, Boston, MA 02110-1301 USA.\n"
+#~ "\n"
+#~ "《GNOME 音樂》作者群特此授予不相容於 GPL 授權的 GStreamer 外掛程式能隨 "
+#~ "GStreamer 及《GNOME 音樂》一同使用、散佈之許可。這項許可高於且超出《GNOME "
+#~ "音樂》遵照之 GPL 授權所授予之許可範圍。如果您修改此份程式碼,您可以將此例"
+#~ "外條款擴及至您自身的版本上,但您沒有義務必須跟著這麼作。如果您不希望有此例"
+#~ "外條款,請將例外聲明從您的版本中移除。"
+
+#~| msgid "The contents of your {} will appear here."
+#~ msgid "The contents of your Music Folder will appear here"
+#~ msgstr "您位於音樂資料夾中的內容會顯示於此"
+
+#~ msgid "GNOME Music"
+#~ msgstr "GNOME 音樂"
+
+#~ msgid ""
+#~ "An easy way to play your music. Automatically discover music on your "
+#~ "computer, the local network and internet services."
+#~ msgstr ""
+#~ "用簡單的方式播放音樂,自動探索您電腦、區域網路和網際網路服務中的音樂。"
+
+#~ msgid ""
+#~ "Find tracks in your local collection, get music from DLNA servers or try "
+#~ "something new with the Jamendo and Magnatune services."
+#~ msgstr ""
+#~ "在您的本地集合中找尋曲目,從 DLNA 伺服器取得音樂或透過 Jamendo 和 "
+#~ "Magnatune 服務找尋些新音樂。"
+
+#~ msgid "Window position"
+#~ msgstr "視窗位置"
+
+#~ msgid "Window position (x and y)."
+#~ msgstr "視窗位置 (x 與 y)。"
+
+#~ msgid "Inital state has been displayed"
+#~ msgstr "已顯示初始狀態"
+
+#~ msgid "Set to true when initial state has been displayed"
+#~ msgstr "當顯示初始狀態設定為 true"
+
+#~ msgid "Released"
+#~ msgstr "發行"
+
+#~ msgid "Running Length"
+#~ msgstr "播放長度"
+
+#~ msgid "Composer"
+#~ msgstr "作曲家"
+
+#~ msgid "Loading"
+#~ msgstr "正在載入"
+
+#~ msgctxt "context menu item"
+#~ msgid "Play"
+#~ msgstr "播放"
+
+#~ msgid "Hey DJ"
+#~ msgstr "嘿 DJ"
+
+#~ msgid "Untitled"
+#~ msgstr "無標題"
+
+#~ msgid "All"
+#~ msgstr "全部"
+
+#~ msgid "Artist"
+#~ msgstr "演出者"
+
+#~ msgid "Album"
+#~ msgstr "專輯"
+
+#~ msgid "Track Title"
+#~ msgstr "曲目標題"
+
+#~ msgid "Local"
+#~ msgstr "本機"
+
+#~ msgid "Sources"
+#~ msgstr "來源"
+
+#~ msgid "Match"
+#~ msgstr "比對"
+
+#~ msgid "@icon@"
+#~ msgstr "@icon@"
+
+#~ msgid "_Quit"
+#~ msgstr "結束(_Q)"
+
+#~ msgid "Music is the new GNOME music playing application."
+#~ msgstr "《音樂》是新的 GNOME 音樂播放應用程式。"
+
+#~ msgid "org.gnome.Music"
+#~ msgstr "org.gnome.Music"
+
+#~ msgid "Search mode"
+#~ msgstr "搜尋模式"
+
+#~ msgid "If true, the search bar is shown."
+#~ msgstr "如果設定為 true,則顯示搜尋工具列。"
+
+#~ msgid "Notifications mode"
+#~ msgstr "通知模式"
+
+#~ msgid "Enables or disables playback notifications"
+#~ msgstr "啟用或停用播放通知"
+
+#~ msgid "Selected %d item"
+#~ msgid_plural "Selected %d items"
+#~ msgstr[0] "己選擇 %d 項目"
+
+#~ msgid "%d min"
+#~ msgstr "%d 分鐘"
+
+#~ msgid "Empty"
+#~ msgstr "清空"
+
+#~ msgid "Select Playlist"
+#~ msgstr "選擇播放清單"
+
+#~ msgid "the|a|an"
+#~ msgstr "the|a|an"
+
+#~ msgid "Max chars to display in track name on Artist view"
+#~ msgstr "在演出者檢視的音軌名稱中顯示的最大字元數"
+
+#~ msgid ""
+#~ "This setting modifies the amount of chars for track title on Artist view "
+#~ "before its been ellipsized. Set this to -1 to disable"
+#~ msgstr ""
+#~ "這個設定值會修改演出者檢視的音軌名稱在省略前顯示的最大字元數。將其設定為 "
+#~ "-1 則為停用"
+
+#~ msgid "the a an"
+#~ msgstr "the a an"
+
+#~ msgid "All Artists"
+#~ msgstr "所有演出者"
+
+#~ msgid "Not playing"
+#~ msgstr "不播放"
+
+#~ msgid "by %s, from %s"
+#~ msgstr "歌手 %s,專輯 %s"
+
+#~ msgid ""
+#~ "No Music found!\n"
+#~ " Put some files into the folder %s"
+#~ msgstr ""
+#~ "找不到音樂!\n"
+#~ " 請將檔案放到資料夾 %s"
+
+#~ msgid "_New Playlist"
+#~ msgstr "新增播放清單(_N)"
+
+#~ msgid "Load More"
+#~ msgstr "載入更多"
+
+#~ msgid "Now _Playing"
+#~ msgstr "現正播放(_N)"
diff --git a/subprojects/.gitignore b/subprojects/.gitignore
new file mode 100644
index 00000000..355164c1
--- /dev/null
+++ b/subprojects/.gitignore
@@ -0,0 +1 @@
+*/
diff --git a/subprojects/grilo-plugins.wrap b/subprojects/grilo-plugins.wrap
new file mode 100644
index 00000000..88ab98a6
--- /dev/null
+++ b/subprojects/grilo-plugins.wrap
@@ -0,0 +1,4 @@
+[wrap-git]
+directory = grilo-plugins
+url = https://gitlab.gnome.org/GNOME/grilo-plugins.git
+revision = head
diff --git a/subprojects/grilo.wrap b/subprojects/grilo.wrap
new file mode 100644
index 00000000..ca4e8905
--- /dev/null
+++ b/subprojects/grilo.wrap
@@ -0,0 +1,4 @@
+[wrap-git]
+directory = grilo
+url = https://gitlab.gnome.org/GNOME/grilo.git
+revision = head
diff --git a/subprojects/shared-modules/CODEOWNERS b/subprojects/shared-modules/CODEOWNERS
new file mode 100644
index 00000000..864e266c
--- /dev/null
+++ b/subprojects/shared-modules/CODEOWNERS
@@ -0,0 +1,21 @@
+# Fallback on Flathub admins for unowned shared modules
+* @flathub/reviewers
+
+/dbus-glib/ @TingPing
+/clutter/ @A6GibKm
+/gtk2/ @TingPing
+/gudev/ @Erick555
+/intltool/ @TingPing
+/libappindicator/ @TingPing
+/libcanberra/ @hadess
+/libsecret/ @Lctrs
+/libusb/ @A6GibKm
+/openjpeg/ @mbridon
+/physfs/ @Mailaender
+/python2.7/ @bilelmoussaoui
+/linux-audio/ @hfiguiere
+/lua5.1/ @Unrud
+/mac/ @enzo1982 @Eonfge
+/pygtk/ @Eonfge
+/gzdoom/ @Eonfge
+/vorbisgain/ @Eonfge
diff --git a/subprojects/shared-modules/README.md b/subprojects/shared-modules/README.md
new file mode 100644
index 00000000..cde47075
--- /dev/null
+++ b/subprojects/shared-modules/README.md
@@ -0,0 +1,38 @@
+This repository contains commonly shared modules and is intended to be used as a git submodule.
+
+To use shared modules for packaging an application, add the submodule:
+
+```
+git submodule add https://github.com/flathub/shared-modules.git
+```
+
+Then modules from this repository can be specified in a manifest JSON file like this:
+
+```json
+"modules": [
+ "shared-modules/SDL/SDL-1.2.15.json",
+ {
+ "name": "foo"
+ }
+]
+```
+
+To update the submodule:
+
+```
+git submodule update --remote --merge
+```
+
+To remove the submodule:
+
+```
+git submodule deinit -f -- shared-modules
+rm -rf .git/modules/shared-modules
+git rm -f shared-modules
+rm .gitmodules
+```
+
+
+[See the description in the Flathub wiki](https://github.com/flathub/flathub/wiki/App-Requirements#shared-modules) for more information.
+
+Please do not request adding modules unless they have many users in the Flathub repository.
diff --git a/subprojects/shared-modules/SDL/SDL-1.2.15.json b/subprojects/shared-modules/SDL/SDL-1.2.15.json
new file mode 100644
index 00000000..4d00288b
--- /dev/null
+++ b/subprojects/shared-modules/SDL/SDL-1.2.15.json
@@ -0,0 +1,40 @@
+{
+ "name": "SDL1",
+ "rm-configure": true,
+ "config-opts": ["--disable-static"],
+ "cleanup": [
+ "/bin",
+ "/share/man",
+ "/share/aclocal",
+ "/include",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/lib/*.a"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://www.libsdl.org/release/SDL-1.2.15.tar.gz",
+ "sha256": "d6d316a793e5e348155f0dd93b979798933fb98aa1edebcc108829d6474aad00"
+ },
+ {
+ "type": "patch",
+ "path": "sdl-libx11-build.patch"
+ },
+ {
+ "type": "patch",
+ "path": "sdl-check-for-SDL_VIDEO_X11_BACKINGSTORE.patch"
+ },
+ {
+ "type": "script",
+ "dest-filename": "autogen.sh",
+ "commands": [
+ "sed -i -e 's/.*AM_PATH_ESD.*//' configure.in",
+ "cp -p /usr/share/automake-*/config.{sub,guess} build-scripts",
+ "aclocal",
+ "libtoolize",
+ "autoconf"
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/SDL/SDL_Pango-0.1.2-API-adds.patch b/subprojects/shared-modules/SDL/SDL_Pango-0.1.2-API-adds.patch
new file mode 100644
index 00000000..6b1f2d05
--- /dev/null
+++ b/subprojects/shared-modules/SDL/SDL_Pango-0.1.2-API-adds.patch
@@ -0,0 +1,118 @@
+diff -Naupr SDL_Pango-0.1.2.orig/src/SDL_Pango.c SDL_Pango-0.1.2/src/SDL_Pango.c
+--- SDL_Pango-0.1.2.orig/src/SDL_Pango.c 2004-12-10 10:06:33.000000000 +0100
++++ SDL_Pango-0.1.2/src/SDL_Pango.c 2006-09-29 17:42:09.000000000 +0200
+@@ -723,13 +723,8 @@ SDLPango_CopyFTBitmapToSurface(
+ SDL_UnlockSurface(surface);
+ }
+
+-/*!
+- Create a context which contains Pango objects.
+-
+- @return A pointer to the context as a SDLPango_Context*.
+-*/
+ SDLPango_Context*
+-SDLPango_CreateContext()
++SDLPango_CreateContext_GivenFontDesc(const char* font_desc)
+ {
+ SDLPango_Context *context = g_malloc(sizeof(SDLPango_Context));
+ G_CONST_RETURN char *charset;
+@@ -743,8 +738,7 @@ SDLPango_CreateContext()
+ pango_context_set_language (context->context, pango_language_from_string (charset));
+ pango_context_set_base_dir (context->context, PANGO_DIRECTION_LTR);
+
+- context->font_desc = pango_font_description_from_string(
+- MAKE_FONT_NAME (DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE));
++ context->font_desc = pango_font_description_from_string(font_desc);
+
+ context->layout = pango_layout_new (context->context);
+
+@@ -762,6 +756,17 @@ SDLPango_CreateContext()
+ }
+
+ /*!
++ Create a context which contains Pango objects.
++
++ @return A pointer to the context as a SDLPango_Context*.
++*/
++SDLPango_Context*
++SDLPango_CreateContext()
++{
++ SDLPango_CreateContext_GivenFontDesc(MAKE_FONT_NAME(DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE));
++}
++
++/*!
+ Free a context.
+
+ @param *context [i/o] Context to be free
+@@ -1053,6 +1058,20 @@ SDLPango_SetMarkup(
+ pango_layout_set_font_description (context->layout, context->font_desc);
+ }
+
++void
++SDLPango_SetText_GivenAlignment(
++ SDLPango_Context *context,
++ const char *text,
++ int length,
++ SDLPango_Alignment alignment)
++{
++ pango_layout_set_attributes(context->layout, NULL);
++ pango_layout_set_text (context->layout, text, length);
++ pango_layout_set_auto_dir (context->layout, TRUE);
++ pango_layout_set_alignment (context->layout, alignment);
++ pango_layout_set_font_description (context->layout, context->font_desc);
++}
++
+ /*!
+ Set plain text to context.
+ Text must be utf-8.
+@@ -1067,11 +1086,7 @@ SDLPango_SetText(
+ const char *text,
+ int length)
+ {
+- pango_layout_set_attributes(context->layout, NULL);
+- pango_layout_set_text (context->layout, text, length);
+- pango_layout_set_auto_dir (context->layout, TRUE);
+- pango_layout_set_alignment (context->layout, PANGO_ALIGN_LEFT);
+- pango_layout_set_font_description (context->layout, context->font_desc);
++ SDLPango_SetText_GivenAlignment(context, text, length, SDLPANGO_ALIGN_LEFT);
+ }
+
+ /*!
+diff -Naupr SDL_Pango-0.1.2.orig/src/SDL_Pango.h SDL_Pango-0.1.2/src/SDL_Pango.h
+--- SDL_Pango-0.1.2.orig/src/SDL_Pango.h 2004-12-10 10:06:33.000000000 +0100
++++ SDL_Pango-0.1.2/src/SDL_Pango.h 2006-09-29 17:42:09.000000000 +0200
+@@ -109,12 +109,20 @@ typedef enum {
+ SDLPANGO_DIRECTION_NEUTRAL /*! Neutral */
+ } SDLPango_Direction;
+
+-
++/*!
++ Specifies alignment of text. See Pango reference for detail
++*/
++typedef enum {
++ SDLPANGO_ALIGN_LEFT,
++ SDLPANGO_ALIGN_CENTER,
++ SDLPANGO_ALIGN_RIGHT
++} SDLPango_Alignment;
+
+ extern DECLSPEC int SDLCALL SDLPango_Init();
+
+ extern DECLSPEC int SDLCALL SDLPango_WasInit();
+
++extern DECLSPEC SDLPango_Context* SDLCALL SDLPango_CreateContext_GivenFontDesc(const char* font_desc);
+ extern DECLSPEC SDLPango_Context* SDLCALL SDLPango_CreateContext();
+
+ extern DECLSPEC void SDLCALL SDLPango_FreeContext(
+@@ -157,6 +165,12 @@ extern DECLSPEC void SDLCALL SDLPango_Se
+ const char *markup,
+ int length);
+
++extern DECLSPEC void SDLCALL SDLPango_SetText_GivenAlignment(
++ SDLPango_Context *context,
++ const char *text,
++ int length,
++ SDLPango_Alignment alignment);
++
+ extern DECLSPEC void SDLCALL SDLPango_SetText(
+ SDLPango_Context *context,
+ const char *markup,
diff --git a/subprojects/shared-modules/SDL/SDL_image-1.2.12.json b/subprojects/shared-modules/SDL/SDL_image-1.2.12.json
new file mode 100644
index 00000000..5e1692b6
--- /dev/null
+++ b/subprojects/shared-modules/SDL/SDL_image-1.2.12.json
@@ -0,0 +1,19 @@
+{
+ "name": "SDL_image",
+ "config-opts": ["--disable-static"],
+ "rm-configure": true,
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://www.libsdl.org/projects/SDL_image/release/SDL_image-1.2.12.tar.gz",
+ "sha256": "0b90722984561004de84847744d566809dbb9daf732a9e503b91a1b5a84e5699"
+ },
+ {
+ "type": "script",
+ "dest-filename": "autogen.sh",
+ "commands": [
+ "AUTOMAKE=\"automake --foreign\" autoreconf -vfi"
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/SDL/SDL_mixer-1.2.12.json b/subprojects/shared-modules/SDL/SDL_mixer-1.2.12.json
new file mode 100644
index 00000000..ba5a6276
--- /dev/null
+++ b/subprojects/shared-modules/SDL/SDL_mixer-1.2.12.json
@@ -0,0 +1,22 @@
+{
+ "name": "SDL_mixer",
+ "config-opts": ["--disable-static"],
+ "rm-configure": true,
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-1.2.12.tar.gz",
+ "sha256": "1644308279a975799049e4826af2cfc787cad2abb11aa14562e402521f86992a"
+ },
+ {
+ "type": "script",
+ "dest-filename": "autogen.sh",
+ "commands": [
+ "rm acinclude/libtool.m4",
+ "rm acinclude/lt*",
+ "AUTOMAKE=\"automake --foreign\" autoreconf -vfi -I acinclude",
+ "cp -p /usr/share/automake-*/config.{sub,guess} build-scripts"
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/SDL/SDL_net-1.2.8.json b/subprojects/shared-modules/SDL/SDL_net-1.2.8.json
new file mode 100644
index 00000000..9d3e896c
--- /dev/null
+++ b/subprojects/shared-modules/SDL/SDL_net-1.2.8.json
@@ -0,0 +1,19 @@
+{
+ "name": "SDL_net",
+ "config-opts": ["--disable-static"],
+ "rm-configure": true,
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://www.libsdl.org/projects/SDL_net/release/SDL_net-1.2.8.tar.gz",
+ "sha256": "5f4a7a8bb884f793c278ac3f3713be41980c5eedccecff0260411347714facb4"
+ },
+ {
+ "type": "script",
+ "dest-filename": "autogen.sh",
+ "commands": [
+ "AUTOMAKE=\"automake --foreign\" autoreconf -vfi"
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/SDL/SDL_pango-0.1.2.json b/subprojects/shared-modules/SDL/SDL_pango-0.1.2.json
new file mode 100644
index 00000000..fdbef4d1
--- /dev/null
+++ b/subprojects/shared-modules/SDL/SDL_pango-0.1.2.json
@@ -0,0 +1,23 @@
+{
+ "name": "SDL_pango",
+ "config-opts": ["--disable-static"],
+ "rm-configure": true,
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://downloads.sourceforge.net/project/sdlpango/SDL_Pango/0.1.2/SDL_Pango-0.1.2.tar.gz",
+ "sha256": "7f75d3b97acf707c696ea126424906204ebfa07660162de925173cdd0257eba4"
+ },
+ {
+ "type": "patch",
+ "path": "SDL_Pango-0.1.2-API-adds.patch"
+ },
+ {
+ "type": "script",
+ "dest-filename": "autogen.sh",
+ "commands": [
+ "autoreconf -vfi"
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/SDL/SDL_ttf-2.0.11.json b/subprojects/shared-modules/SDL/SDL_ttf-2.0.11.json
new file mode 100644
index 00000000..c5a04d51
--- /dev/null
+++ b/subprojects/shared-modules/SDL/SDL_ttf-2.0.11.json
@@ -0,0 +1,22 @@
+{
+ "name": "SDL_ttf",
+ "config-opts": ["--disable-static"],
+ "rm-configure": true,
+ "config-opts": [
+ "ac_cv_path_FREETYPE_CONFIG=pkg-config freetype2"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://www.libsdl.org/projects/SDL_ttf/release/SDL_ttf-2.0.11.tar.gz",
+ "sha256": "724cd895ecf4da319a3ef164892b72078bd92632a5d812111261cde248ebcdb7"
+ },
+ {
+ "type": "script",
+ "dest-filename": "autogen.sh",
+ "commands": [
+ "AUTOMAKE=\"automake --foreign\" autoreconf -vfi"
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/SDL/sdl-check-for-SDL_VIDEO_X11_BACKINGSTORE.patch b/subprojects/shared-modules/SDL/sdl-check-for-SDL_VIDEO_X11_BACKINGSTORE.patch
new file mode 100644
index 00000000..c29811d7
--- /dev/null
+++ b/subprojects/shared-modules/SDL/sdl-check-for-SDL_VIDEO_X11_BACKINGSTORE.patch
@@ -0,0 +1,24 @@
+Description: Do not harness backing store by default
+ xorg-server 1.15 enables backing store if composite extension is enabled
+ (default settings). Harnessing backing store through compositor leads to
+ tearing effect.
+ This patch reverts default harnessing backing store to conditional use if
+ SDL_VIDEO_X11_BACKINGSTORE environment variable exists.
+Origin: https://bugs.launchpad.net/ubuntu/+source/libsdl1.2/+bug/1280665/comments/1
+Bug: https://bugzilla.libsdl.org/show_bug.cgi?id=2383
+Bug-Debian: https://bugs.debian.org/747168
+
+--- a/src/video/x11/SDL_x11video.c
++++ b/src/video/x11/SDL_x11video.c
+@@ -1088,10 +1088,8 @@
+ }
+ }
+
+-#if 0 /* This is an experiment - are the graphics faster now? - nope. */
+ if ( SDL_getenv("SDL_VIDEO_X11_BACKINGSTORE") )
+-#endif
+- /* Cache the window in the server, when possible */
++ /* Cache the window in the server when possible, on request */
+ {
+ Screen *xscreen;
+ XSetWindowAttributes a;
diff --git a/subprojects/shared-modules/SDL/sdl-libx11-build.patch b/subprojects/shared-modules/SDL/sdl-libx11-build.patch
new file mode 100644
index 00000000..5bb14d4b
--- /dev/null
+++ b/subprojects/shared-modules/SDL/sdl-libx11-build.patch
@@ -0,0 +1,59 @@
+
+# HG changeset patch
+# User Azamat H. Hackimov <azamat.hackimov@gmail.com>
+# Date 1370184533 -21600
+# Node ID 91ad7b43317a6387e115ecdf63a49137f47e42c8
+# Parent f7fd5c3951b9ed922fdf696f7182e71b58a13268
+Fix compilation with libX11 >= 1.5.99.902.
+
+These changes fixes bug #1769 for SDL 1.2
+(http://bugzilla.libsdl.org/show_bug.cgi?id=1769).
+
+diff -r f7fd5c3951b9 -r 91ad7b43317a configure.in
+--- a/configure.in Wed Apr 17 00:56:53 2013 -0700
++++ b/configure.in Sun Jun 02 20:48:53 2013 +0600
+@@ -1169,6 +1169,17 @@
+ if test x$definitely_enable_video_x11_xrandr = xyes; then
+ AC_DEFINE(SDL_VIDEO_DRIVER_X11_XRANDR)
+ fi
++ AC_MSG_CHECKING(for const parameter to _XData32)
++ have_const_param_xdata32=no
++ AC_TRY_COMPILE([
++ #include <X11/Xlibint.h>
++ extern int _XData32(Display *dpy,register _Xconst long *data,unsigned len);
++ ],[
++ ],[
++ have_const_param_xdata32=yes
++ AC_DEFINE(SDL_VIDEO_DRIVER_X11_CONST_PARAM_XDATA32)
++ ])
++ AC_MSG_RESULT($have_const_param_xdata32)
+ fi
+ fi
+ }
+diff -r f7fd5c3951b9 -r 91ad7b43317a include/SDL_config.h.in
+--- a/include/SDL_config.h.in Wed Apr 17 00:56:53 2013 -0700
++++ b/include/SDL_config.h.in Sun Jun 02 20:48:53 2013 +0600
+@@ -283,6 +283,7 @@
+ #undef SDL_VIDEO_DRIVER_WINDIB
+ #undef SDL_VIDEO_DRIVER_WSCONS
+ #undef SDL_VIDEO_DRIVER_X11
++#undef SDL_VIDEO_DRIVER_X11_CONST_PARAM_XDATA32
+ #undef SDL_VIDEO_DRIVER_X11_DGAMOUSE
+ #undef SDL_VIDEO_DRIVER_X11_DYNAMIC
+ #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT
+diff -r f7fd5c3951b9 -r 91ad7b43317a src/video/x11/SDL_x11sym.h
+--- a/src/video/x11/SDL_x11sym.h Wed Apr 17 00:56:53 2013 -0700
++++ b/src/video/x11/SDL_x11sym.h Sun Jun 02 20:48:53 2013 +0600
+@@ -165,7 +165,11 @@
+ */
+ #ifdef LONG64
+ SDL_X11_MODULE(IO_32BIT)
++#if SDL_VIDEO_DRIVER_X11_CONST_PARAM_XDATA32
++SDL_X11_SYM(int,_XData32,(Display *dpy,register _Xconst long *data,unsigned len),(dpy,data,len),return)
++#else
+ SDL_X11_SYM(int,_XData32,(Display *dpy,register long *data,unsigned len),(dpy,data,len),return)
++#endif
+ SDL_X11_SYM(void,_XRead32,(Display *dpy,register long *data,long len),(dpy,data,len),)
+ #endif
+
+
diff --git a/subprojects/shared-modules/SDL/sdl12-compat.json b/subprojects/shared-modules/SDL/sdl12-compat.json
new file mode 100644
index 00000000..c0227763
--- /dev/null
+++ b/subprojects/shared-modules/SDL/sdl12-compat.json
@@ -0,0 +1,14 @@
+{
+ "name": "sdl12-compat",
+ "buildsystem": "cmake-ninja",
+ "cleanup": [
+ "bin/sdl-config"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/libsdl-org/sdl12-compat/archive/refs/tags/release-1.2.52.tar.gz",
+ "sha256": "5bd7942703575554670a8767ae030f7921a0ac3c5e2fd173a537b7c7a8599014"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/cld2/CMakeLists.txt b/subprojects/shared-modules/cld2/CMakeLists.txt
new file mode 100644
index 00000000..d25f857f
--- /dev/null
+++ b/subprojects/shared-modules/cld2/CMakeLists.txt
@@ -0,0 +1,155 @@
+cmake_minimum_required(VERSION 2.8)
+project (cld2)
+enable_language(CXX)
+
+set (VERSION "0.0.197")
+set (common_SOURCE_FILES
+ internal/cldutil.cc
+ internal/cldutil_shared.cc
+ internal/compact_lang_det.cc
+ internal/compact_lang_det_hint_code.cc
+ internal/compact_lang_det_impl.cc
+ internal/debug.cc
+ internal/fixunicodevalue.cc
+ internal/generated_entities.cc
+ internal/generated_language.cc
+ internal/generated_ulscript.cc
+ internal/getonescriptspan.cc
+ internal/lang_script.cc
+ internal/offsetmap.cc
+ internal/scoreonescriptspan.cc
+ internal/tote.cc
+ internal/utf8statetable.cc
+ )
+
+set (cld2_SOURCE_FILES
+ internal/generated_distinct_bi_0.cc
+ internal/cld_generated_cjk_uni_prop_80.cc
+ internal/cld2_generated_cjk_compatible.cc
+ internal/cld_generated_cjk_delta_bi_4.cc
+ internal/cld2_generated_quadchrome_2.cc
+ internal/cld2_generated_deltaoctachrome.cc
+ internal/cld2_generated_distinctoctachrome.cc
+ internal/cld_generated_score_quad_octa_2.cc
+ )
+
+set (cld2_full_SOURCE_FILES
+ internal/generated_distinct_bi_0.cc
+ internal/cld_generated_cjk_uni_prop_80.cc
+ internal/cld2_generated_cjk_compatible.cc
+ internal/cld_generated_cjk_delta_bi_32.cc
+ internal/cld2_generated_quad0122.cc
+ internal/cld2_generated_deltaocta0122.cc
+ internal/cld2_generated_distinctocta0122.cc
+ internal/cld_generated_score_quad_octa_0122.cc
+ )
+
+set (cld2_dynamic_SOURCE_FILES
+ internal/cld2_dynamic_data.cc
+ internal/cld2_dynamic_data_loader.cc
+ )
+
+add_library(cld2 SHARED ${common_SOURCE_FILES} ${cld2_SOURCE_FILES})
+set_target_properties(cld2 PROPERTIES
+ ENABLE_EXPORTS On
+ OUTPUT_NAME cld2
+ VERSION ${VERSION}
+ SOVERSION 0
+ )
+add_library(cld2_full SHARED ${cld2_full_SOURCE_FILES})
+set_target_properties(cld2_full PROPERTIES
+ ENABLE_EXPORTS On
+ OUTPUT_NAME cld2_full
+ VERSION ${VERSION}
+ SOVERSION 0
+ )
+
+add_library(cld2_dynamic SHARED ${cld2_dynamic_SOURCE_FILES})
+set_target_properties(cld2_dynamic PROPERTIES
+ ENABLE_EXPORTS On
+ OUTPUT_NAME cld2_dynamic
+ VERSION ${VERSION}
+ SOVERSION 0
+ COMPILE_FLAGS "-DCLD2_DYNAMIC_MODE"
+ )
+install(TARGETS cld2 DESTINATION lib/${CMAKE_LIBRARY_ARCHITECTURE})
+install(TARGETS cld2_full DESTINATION lib/${CMAKE_LIBRARY_ARCHITECTURE})
+install(TARGETS cld2_dynamic DESTINATION lib/${CMAKE_LIBRARY_ARCHITECTURE})
+
+set (cld2_internal_HEADERS
+ internal/cld2_dynamic_compat.h
+ internal/cld2_dynamic_data_extractor.h
+ internal/cld2_dynamic_data.h
+ internal/cld2_dynamic_data_loader.h
+ internal/cld2tablesummary.h
+ internal/cldutil.h
+ internal/cldutil_offline.h
+ internal/cldutil_shared.h
+ internal/compact_lang_det_hint_code.h
+ internal/compact_lang_det_impl.h
+ internal/debug.h
+ internal/fixunicodevalue.h
+ internal/generated_language.h
+ internal/generated_ulscript.h
+ internal/getonescriptspan.h
+ internal/integral_types.h
+ internal/lang_script.h
+ internal/langspan.h
+ internal/offsetmap.h
+ internal/port.h
+ internal/scoreonescriptspan.h
+ internal/stringpiece.h
+ internal/tote.h
+ internal/unittest_data.h
+ internal/utf8acceptinterchange.h
+ internal/utf8prop_lettermarkscriptnum.h
+ internal/utf8repl_lettermarklower.h
+ internal/utf8scannot_lettermarkspecial.h
+ internal/utf8statetable.h
+ )
+
+install(FILES ${cld2_internal_HEADERS} DESTINATION include/cld2/internal)
+set (cld2_public_HEADERS
+ public/compact_lang_det.h
+ public/encodings.h
+ )
+install(FILES ${cld2_public_HEADERS} DESTINATION include/cld2/public)
+
+set (full_SOURCE_FILES
+ internal/cld_generated_cjk_uni_prop_80.cc
+ internal/cld2_generated_cjk_compatible.cc
+ internal/cld_generated_cjk_delta_bi_32.cc
+ internal/generated_distinct_bi_0.cc
+ internal/cld2_generated_quad0122.cc
+ internal/cld2_generated_deltaocta0122.cc
+ internal/cld2_generated_distinctocta0122.cc
+ internal/cld_generated_score_quad_octa_0122.cc
+ )
+
+add_executable(compact_lang_det_test_full ${full_SOURCE_FILES} internal/compact_lang_det_test.cc)
+add_executable(cld2_unittest_full ${full_SOURCE_FILES} internal/cld2_unittest_full.cc)
+add_executable(cld2_unittest_full_avoid ${full_SOURCE_FILES} internal/cld2_unittest_full.cc)
+set_target_properties(cld2_unittest_full_avoid PROPERTIES COMPILE_FLAGS "-Davoid_utf8_string_constants")
+
+add_executable(cld2_dynamic_data_tool internal/cld2_dynamic_data_extractor.cc internal/cld2_dynamic_data_tool.cc)
+add_executable(compact_lang_det_dynamic_test_chrome ${common_SOURCE_FILES} internal/cld2_dynamic_data_extractor.cc internal/compact_lang_det_test.cc)
+add_executable(cld2_dynamic_unittest ${common_SOURCE_FILES} internal/cld2_unittest.cc)
+set_target_properties(compact_lang_det_dynamic_test_chrome PROPERTIES COMPILE_FLAGS "-DCLD2_DYNAMIC_MODE")
+set_target_properties(cld2_dynamic_unittest PROPERTIES COMPILE_FLAGS "-DCLD2_DYNAMIC_MODE")
+
+add_executable(compact_lang_det_test_chrome_2 internal/compact_lang_det_test.cc)
+add_executable(compact_lang_det_test_chrome_16 internal/compact_lang_det_test.cc)
+add_executable(cld2_unittest_chrome_2 internal/cld2_unittest.cc)
+add_executable(cld2_unittest_avoid_chrome_2 internal/cld2_unittest.cc)
+set_target_properties(cld2_unittest_avoid_chrome_2 PROPERTIES COMPILE_FLAGS "-Davoid_utf8_string_constants")
+
+target_link_libraries(compact_lang_det_test_full cld2)
+target_link_libraries(cld2_unittest_full cld2)
+target_link_libraries(cld2_unittest_full_avoid cld2)
+target_link_libraries(cld2_dynamic_data_tool cld2 cld2_dynamic)
+target_link_libraries(compact_lang_det_dynamic_test_chrome cld2_dynamic)
+target_link_libraries(cld2_dynamic_unittest cld2_dynamic)
+target_link_libraries(compact_lang_det_test_chrome_2 cld2)
+target_link_libraries(compact_lang_det_test_chrome_16 cld2)
+target_link_libraries(cld2_unittest_chrome_2 cld2)
+target_link_libraries(cld2_unittest_avoid_chrome_2 cld2)
diff --git a/subprojects/shared-modules/cld2/cld2.json b/subprojects/shared-modules/cld2/cld2.json
new file mode 100644
index 00000000..8487e31e
--- /dev/null
+++ b/subprojects/shared-modules/cld2/cld2.json
@@ -0,0 +1,24 @@
+{
+ "name": "cld2",
+ "buildsystem": "simple",
+ "build-options": {
+ "cxxflags": "-std=c++98"
+ },
+ "build-commands": [
+ "cp CMakeLists.txt ./cld2",
+ "cd cld2 && mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=/app -DCMAKE_BUILD_TYPE=Release",
+ "cd cld2/build && make && make install"
+ ],
+ "sources":[
+ {
+ "type": "git",
+ "url": "https://github.com/CLD2Owners/cld2.git",
+ "commit": "84b58a5d7690ebf05a91406f371ce00c3daf31c0",
+ "dest": "cld2"
+ },
+ {
+ "type": "file",
+ "path": "CMakeLists.txt"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/clutter/clutter.json b/subprojects/shared-modules/clutter/clutter.json
new file mode 100644
index 00000000..a47b207d
--- /dev/null
+++ b/subprojects/shared-modules/clutter/clutter.json
@@ -0,0 +1,69 @@
+{
+ "name": "clutter-gtk",
+ "cleanup": [
+ "/share/gtk-doc"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/clutter-gtk/1.8/clutter-gtk-1.8.4.tar.xz",
+ "sha256": "521493ec038973c77edcb8bc5eac23eed41645117894aaee7300b2487cb42b06"
+ }
+ ],
+ "modules": [
+ {
+ "name": "cogl",
+ "config-opts": [
+ "--disable-cogl-gst",
+ "--disable-gtk-doc",
+ "--enable-xlib-egl-platform",
+ "--enable-wayland-egl-platform"
+ ],
+ "cleanup": [
+ "/share/gtk-doc",
+ "/share/cogl/examples-data"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/cogl/1.22/cogl-1.22.8.tar.xz",
+ "sha256": "a805b2b019184710ff53d0496f9f0ce6dcca420c141a0f4f6fcc02131581d759"
+ }
+ ]
+ },
+ {
+ "name": "clutter",
+ "config-opts": [
+ "--disable-gtk-doc",
+ "--enable-egl-backend",
+ "--enable-wayland-backend"
+ ],
+ "cleanup": [
+ "/share/gtk-doc"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/clutter/1.26/clutter-1.26.4.tar.xz",
+ "sha256": "8b48fac159843f556d0a6be3dbfc6b083fc6d9c58a20a49a6b4919ab4263c4e6"
+ }
+ ]
+ },
+ {
+ "name": "clutter-gst",
+ "config-opts": [
+ "--disable-gtk-doc"
+ ],
+ "cleanup": [
+ "/share/gtk-doc"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/clutter-gst/3.0/clutter-gst-3.0.27.tar.xz",
+ "sha256": "fe69bd6c659d24ab30da3f091eb91cd1970026d431179b0724f13791e8ad9f9d"
+ }
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/dbus-glib/dbus-glib.json b/subprojects/shared-modules/dbus-glib/dbus-glib.json
new file mode 100644
index 00000000..f8b90905
--- /dev/null
+++ b/subprojects/shared-modules/dbus-glib/dbus-glib.json
@@ -0,0 +1,23 @@
+{
+ "name": "dbus-glib",
+ "cleanup": [
+ "*.la",
+ "/bin",
+ "/etc",
+ "/include",
+ "/libexec",
+ "/share/gtk-doc",
+ "/share/man"
+ ],
+ "config-opts": [
+ "--disable-static",
+ "--disable-gtk-doc"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://dbus.freedesktop.org/releases/dbus-glib/dbus-glib-0.112.tar.gz",
+ "sha256": "7d550dccdfcd286e33895501829ed971eeb65c614e73aadb4a08aeef719b143a"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/glew/glew.json b/subprojects/shared-modules/glew/glew.json
new file mode 100644
index 00000000..ae326a23
--- /dev/null
+++ b/subprojects/shared-modules/glew/glew.json
@@ -0,0 +1,30 @@
+{
+ "name": "glew",
+ "no-autogen": true,
+ "make-args": [
+ "GLEW_PREFIX=${FLATPAK_DEST}",
+ "GLEW_DEST=${FLATPAK_DEST}",
+ "LIBDIR=${FLATPAK_DEST}/lib",
+ "CFLAGS.EXTRA:=${CFLAGS} -fPIC",
+ "LDFLAGS.EXTRA=${LDFLAGS}"
+ ],
+ "make-install-args": [
+ "GLEW_PREFIX=${FLATPAK_DEST}",
+ "GLEW_DEST=${FLATPAK_DEST}",
+ "LIBDIR=${FLATPAK_DEST}/lib",
+ "CFLAGS.EXTRA:=${CFLAGS} -fPIC",
+ "LDFLAGS.EXTRA=${LDFLAGS}"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://downloads.sourceforge.net/project/glew/glew/2.2.0/glew-2.2.0.tgz",
+ "sha256": "d4fc82893cfb00109578d0a1a2337fb8ca335b3ceccf97b97e5cc7f08e4353e1"
+ }
+ ],
+ "cleanup": [
+ "/include",
+ "/lib/pkgconfig",
+ "/lib/*.a"
+ ]
+}
diff --git a/subprojects/shared-modules/glu/glu-9.json b/subprojects/shared-modules/glu/glu-9.json
new file mode 100644
index 00000000..2dfb70b4
--- /dev/null
+++ b/subprojects/shared-modules/glu/glu-9.json
@@ -0,0 +1,12 @@
+{
+ "name": "glu",
+ "config-opts": ["--disable-static"],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://mesa.freedesktop.org/archive/glu/glu-9.0.2.tar.xz",
+ "sha256": "6e7280ff585c6a1d9dfcdf2fca489251634b3377bfc33c29e4002466a38d02d4"
+ }
+ ],
+ "cleanup": [ "/include", "/lib/*.a", "/lib/*.la", "/lib/pkgconfig" ]
+}
diff --git a/subprojects/shared-modules/gtk2/arc-gtk2-theme-Replace-Inkscape-dependency-with-rsvg-convert.patch b/subprojects/shared-modules/gtk2/arc-gtk2-theme-Replace-Inkscape-dependency-with-rsvg-convert.patch
new file mode 100644
index 00000000..90e09509
--- /dev/null
+++ b/subprojects/shared-modules/gtk2/arc-gtk2-theme-Replace-Inkscape-dependency-with-rsvg-convert.patch
@@ -0,0 +1,180 @@
+From d5e0034183564df5fec8e4dde1705116c7b38021 Mon Sep 17 00:00:00 2001
+From: Patrick Griffis <tingping@tingping.se>
+Date: Sat, 16 May 2020 18:00:36 -0700
+Subject: [PATCH] Replace Inkscape dependency with rsvg-convert
+
+rsvg-convert is a *much* smaller dependency that all systems with
+a functioning GTK installation should have easy access to.
+---
+ common/gtk-2.0/Makefile.am | 6 +-----
+ common/gtk-2.0/render-asset.sh | 16 ++++++++--------
+ common/gtk-3.0/common.am | 12 ++----------
+ common/xfwm4/Makefile.am | 6 +-----
+ common/xfwm4/render-asset.sh | 16 ++++++++--------
+ configure.ac | 8 ++------
+ 6 files changed, 22 insertions(+), 42 deletions(-)
+
+diff --git a/common/gtk-2.0/Makefile.am b/common/gtk-2.0/Makefile.am
+index 010823a..873013a 100644
+--- a/common/gtk-2.0/Makefile.am
++++ b/common/gtk-2.0/Makefile.am
+@@ -35,11 +35,7 @@ $(light): $(srcdir)/light/assets.svg | light/assets
+ $(dark): $(srcdir)/dark/assets.svg | dark/assets
+
+ $(light) $(dark):
+-if INKSCAPE_1_0_OR_NEWER
+- $(INKSCAPE) --export-id-only --export-filename="$@" --export-id="$(basename $(notdir $@))" --export-dpi=$(if $(filter $(OPTION_GTK2_HIDPI),true),192,96) "$<" >/dev/null
+-else !INKSCAPE_1_0_OR_NEWER
+- $(INKSCAPE) --export-id-only --export-png="$@" --export-id="$(basename $(notdir $@))" --export-dpi=$(if $(filter $(OPTION_GTK2_HIDPI),true),192,96) "$<" >/dev/null
+-endif
++ $(RSVG_CONVERT) --format=png --output="$@" --export-id="$(basename $(notdir $@))" --dpi-x=$(if $(filter $(OPTION_GTK2_HIDPI),true),192,96) --dpi-y=$(if $(filter $(OPTION_GTK2_HIDPI),true),192,96) "$<" >/dev/null
+ $(OPTIPNG) -o7 --quiet "$@"
+
+ menubar-toolbar/%-dark.png: dark/assets/%.png | menubar-toolbar
+diff --git a/common/gtk-2.0/render-asset.sh b/common/gtk-2.0/render-asset.sh
+index 6685414..f6198af 100755
+--- a/common/gtk-2.0/render-asset.sh
++++ b/common/gtk-2.0/render-asset.sh
+@@ -1,7 +1,7 @@
+ #!/bin/bash
+ set -ueo pipefail
+
+-INKSCAPE="$(which inkscape)"
++RSVG_CONVERT="$(which rsvg-convert)"
+ OPTIPNG="$(which optipng)"
+
+ ASSETS_DIR="$1"
+@@ -14,9 +14,9 @@ if [[ -f "${result_file}" ]] ; then
+ echo "${result_file} already exists."
+ else
+ echo "Rendering '${result_file}'"
+- "$INKSCAPE" --export-id="$i" \
+- --export-id-only \
+- --export-png="${result_file}" "$SRC_FILE" >/dev/null \
++ "$RSVG_CONVERT" --export-id="$i" \
++ --format=png
++ --output="${result_file}" "$SRC_FILE" >/dev/null \
+ && "$OPTIPNG" -o7 --quiet "${result_file}"
+ fi
+
+@@ -26,10 +26,10 @@ if [[ "$OPTION_GTK2_HIDPI" == "true" ]]; then
+ echo "${result_file_hidpi} already exists."
+ else
+ echo "Rendering '${result_file_hidpi}'"
+- "$INKSCAPE" --export-id="$i" \
+- --export-id-only \
+- --export-dpi=192 \
+- --export-png="${result_file_hidpi}" "$SRC_FILE" >/dev/null \
++ "$RSVG_CONVERT" --export-id="$i" \
++ --dpi-x=192 --dpi-y=192 \
++ --format=png
++ --output="${result_file_hidpi}" "$SRC_FILE" >/dev/null \
+ && "$OPTIPNG" -o7 --quiet "${result_file_hidpi}"
+ fi
+ fi
+diff --git a/common/gtk-3.0/common.am b/common/gtk-3.0/common.am
+index a93d01d..9e4b102 100644
+--- a/common/gtk-3.0/common.am
++++ b/common/gtk-3.0/common.am
+@@ -14,19 +14,11 @@ clean:
+ rm -rf assets/ light/ dark/ darker/ lighter/
+
+ $(normal): $(srcdir)/assets.svg | assets
+-if INKSCAPE_1_0_OR_NEWER
+- $(INKSCAPE) --export-id-only --export-filename="$@" --export-id="$(basename $(notdir $@))" --export-dpi=96 "$<" >/dev/null
+-else !INKSCAPE_1_0_OR_NEWER
+- $(INKSCAPE) --export-id-only --export-png="$@" --export-id="$(basename $(notdir $@))" --export-dpi=96 "$<" >/dev/null
+-endif
++ $(RSVG_CONVERT) --format=png --output="$@" --export-id="$(basename $(notdir $@))" --dpi-y=96 --dpi-x=96 "$<" >/dev/null
+ $(OPTIPNG) -o7 --quiet "$@"
+
+ $(hidpi): $(srcdir)/assets.svg | assets
+-if INKSCAPE_1_0_OR_NEWER
+- $(INKSCAPE) --export-id-only --export-filename="$@" --export-id="$(patsubst %@2,%,$(basename $(notdir $@)))" --export-dpi=192 "$<" >/dev/null
+-else !INKSCAPE_1_0_OR_NEWER
+- $(INKSCAPE) --export-id-only --export-png="$@" --export-id="$(patsubst %@2,%,$(basename $(notdir $@)))" --export-dpi=192 "$<" >/dev/null
+-endif
++ $(RSVG_CONVERT) --format=png --output="$@" --export-id="$(patsubst %@2,%,$(basename $(notdir $@)))" --dpi-y=192 --dpi-x=192 "$<" >/dev/null
+ $(OPTIPNG) -o7 --quiet "$@"
+
+ .PHONY: normal hidpi clean
+diff --git a/common/xfwm4/Makefile.am b/common/xfwm4/Makefile.am
+index e5fbdc5..1f21183 100644
+--- a/common/xfwm4/Makefile.am
++++ b/common/xfwm4/Makefile.am
+@@ -17,11 +17,7 @@ $(light): $(srcdir)/light/assets.svg | light/assets
+ $(dark): $(srcdir)/dark/assets.svg | dark/assets
+
+ $(light) $(dark):
+-if INKSCAPE_1_0_OR_NEWER
+- $(INKSCAPE) --export-id-only --export-filename="$@" --export-id="$(basename $(notdir $@))" --export-dpi=$(if $(filter $(OPTION_GTK2_HIDPI),true),192,96) "$<" >/dev/null
+-else !INKSCAPE_1_0_OR_NEWER
+- $(INKSCAPE) --export-id-only --export-png="$@" --export-id="$(basename $(notdir $@))" --export-dpi=$(if $(filter $(OPTION_GTK2_HIDPI),true),192,96) "$<" >/dev/null
+-endif
++ $(RSVG_CONVERT) --format=png --output="$@" --export-id="$(basename $(notdir $@))" --dpi-y=$(if $(filter $(OPTION_GTK2_HIDPI),true),192,96) --dpi-x=$(if $(filter $(OPTION_GTK2_HIDPI),true),192,96) "$<" >/dev/null
+ $(OPTIPNG) -o7 --quiet "$@"
+
+ .PHONY: light dark clean
+diff --git a/common/xfwm4/render-asset.sh b/common/xfwm4/render-asset.sh
+index 6685414..f6198af 100755
+--- a/common/xfwm4/render-asset.sh
++++ b/common/xfwm4/render-asset.sh
+@@ -1,7 +1,7 @@
+ #!/bin/bash
+ set -ueo pipefail
+
+-INKSCAPE="$(which inkscape)"
++RSVG_CONVERT="$(which rsvg-convert)"
+ OPTIPNG="$(which optipng)"
+
+ ASSETS_DIR="$1"
+@@ -14,9 +14,9 @@ if [[ -f "${result_file}" ]] ; then
+ echo "${result_file} already exists."
+ else
+ echo "Rendering '${result_file}'"
+- "$INKSCAPE" --export-id="$i" \
+- --export-id-only \
+- --export-png="${result_file}" "$SRC_FILE" >/dev/null \
++ "$RSVG_CONVERT" --export-id="$i" \
++ --format=png
++ --output="${result_file}" "$SRC_FILE" >/dev/null \
+ && "$OPTIPNG" -o7 --quiet "${result_file}"
+ fi
+
+@@ -26,10 +26,10 @@ if [[ "$OPTION_GTK2_HIDPI" == "true" ]]; then
+ echo "${result_file_hidpi} already exists."
+ else
+ echo "Rendering '${result_file_hidpi}'"
+- "$INKSCAPE" --export-id="$i" \
+- --export-id-only \
+- --export-dpi=192 \
+- --export-png="${result_file_hidpi}" "$SRC_FILE" >/dev/null \
++ "$RSVG_CONVERT" --export-id="$i" \
++ --dpi-x=192 --dpi-y=192 \
++ --format=png
++ --output="${result_file_hidpi}" "$SRC_FILE" >/dev/null \
+ && "$OPTIPNG" -o7 --quiet "${result_file_hidpi}"
+ fi
+ fi
+diff --git a/configure.ac b/configure.ac
+index f0725f1..1a52cc7 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -48,12 +48,8 @@ AM_CONDITIONAL([GNOME_SHELL_3_32_OR_NEWER], [test "0$GNOME_SHELL_VERSMNR" -ge 31
+ AS_IF([test "x$ENABLE_CINNAMON" != xno], [ARC_CINNAMON])
+
+ AS_IF([test "x$ENABLE_GTK2" != xno -o "x$ENABLE_GTK3" != xno -o "x$ENABLE_XFWM" != xno], [
+- AC_PATH_PROG([INKSCAPE], [inkscape])
+- AS_IF([test "x$ac_cv_path_INKSCAPE" = x], [AC_MSG_ERROR([inkscape not found])])
+- AS_IF([test "x$ac_cv_path_INKSCAPE" != x],
+- [INKSCAPE_VERSMJR=`inkscape --version 2> /dev/null | cut -d' ' -f2 | cut -d'.' -f1`]
+- AM_CONDITIONAL([INKSCAPE_1_0_OR_NEWER], [test "x$INKSCAPE_VERSMJR" = x1])
+- )
++ AC_PATH_PROG([RSVG_CONVERT], [rsvg-convert])
++ AS_IF([test "x$ac_cv_path_RSVG_CONVERT" = x], [AC_MSG_ERROR([rsvg-convert not found])])
+ AC_PATH_PROG([OPTIPNG], [optipng])
+ AS_IF([test "x$ac_cv_path_OPTIPNG" = x], [AC_MSG_ERROR([optipng not found])])
+ ])
+--
+2.26.0
+
diff --git a/subprojects/shared-modules/gtk2/gtk2-common-themes.json b/subprojects/shared-modules/gtk2/gtk2-common-themes.json
new file mode 100644
index 00000000..5f4f791d
--- /dev/null
+++ b/subprojects/shared-modules/gtk2/gtk2-common-themes.json
@@ -0,0 +1,250 @@
+{
+ "name": "gtk2-common-themes",
+ "buildsystem": "simple",
+ "build-commands": [],
+ "modules": [
+ {
+ "name": "sassc",
+ "// NOTE": "This is used by Yaru, Greybird, and Materia",
+ "cleanup": ["*"],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/sass/sassc/archive/3.5.0.tar.gz",
+ "sha256": "26f54e31924b83dd706bc77df5f8f5553a84d51365f0e3c566df8de027918042"
+ },
+ {
+ "type": "script",
+ "commands": ["autoreconf -si"]
+ }
+ ],
+ "modules": [
+ {
+ "name": "libsass",
+ "cleanup": ["*"],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/sass/libsass/archive/3.5.4.tar.gz",
+ "sha256": "5f61cbcddaf8e6ef7a725fcfa5d05297becd7843960f245197ebb655ff868770"
+ },
+ {
+ "type": "script",
+ "commands": ["autoreconf -si"]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "gtk2-murrine-engine",
+ "rm-configure": true,
+ "// NOTE": "Used by Arc and CrosAdapta",
+ "cleanup": [
+ "*.la"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/murrine/0.98/murrine-0.98.2.tar.xz",
+ "sha256": "e9c68ae001b9130d0f9d1b311e8121a94e5c134b82553ba03971088e57d12c89"
+ },
+ {
+ "type": "patch",
+ "path": "murrine-engine-fix-crash.patch"
+ },
+ {
+ "type": "script",
+ "commands": [
+ "rm config.guess",
+ "autoreconf -si"
+ ]
+ }
+ ]
+ },
+ {
+ "name": "cros-adapta-gtk2-theme",
+ "// NOTE": "This is used by Chrome OS",
+ "buildsystem": "simple",
+ "build-commands": [
+ "install -Dm644 index.theme ${FLATPAK_DEST}/share/themes/CrosAdapta/index.theme",
+ "cp -r gtk-2.0 ${FLATPAK_DEST}/share/themes/CrosAdapta"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://chromium.googlesource.com/chromiumos/third_party/cros-adapta",
+ "commit": "eb6d8c1832b9181926df107faf41a80887fd982c"
+ }
+ ]
+ },
+ {
+ "name": "arc-gtk2-theme",
+ "// NOTE": "This is used by Solus and is popular",
+ "// FIXME": "This has a dependency on inkscape and my patch isn't quite good enough sadly",
+ "disabled": true,
+ "config-opts": [
+ "--disable-gnome-shell",
+ "--disable-cinnamon",
+ "--disable-gtk3",
+ "--disable-metacity",
+ "--disable-xfwm",
+ "--disable-plank",
+ "--disable-openbox",
+ "--disable-unity"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/jnsh/arc-theme/releases/download/20200513/arc-theme-20200513.tar.xz",
+ "sha256": "cd268b878d6ad7c81b7acc0f89b66e26ee9a9a92eafb03b792318d51707f1962"
+ },
+ {
+ "type": "patch",
+ "path": "arc-gtk2-theme-Replace-Inkscape-dependency-with-rsvg-convert.patch"
+ },
+ {
+ "type": "shell",
+ "commands": ["sed -i 's|\"$srcdir/configure\" $@||' autogen.sh"]
+ }
+ ],
+ "modules": [
+ {
+ "name": "optipng",
+ "cleanup": ["*"],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://prdownloads.sourceforge.net/optipng/optipng-0.7.7.tar.gz",
+ "sha256": "4f32f233cef870b3f95d3ad6428bfe4224ef34908f1b42b0badf858216654452"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "breeze-gtk2-theme",
+ "// NOTE": "This is used by some KDE distros",
+ "// FIXME": "This is disabled because breeze depends on KDecoration/Qt5...",
+ "disabled": true,
+ "buildsystem": "cmake-ninja",
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/KDE/breeze-gtk/archive/v5.18.90.tar.gz",
+ "sha256": "73ff1fee8afb2fc498075d1693a664f6a749b763606d4548f74e225983107730"
+ }
+ ],
+ "modules": [
+ {
+ "name": "extra-cmake-modules",
+ "buildsystem": "cmake-ninja",
+ "cleanup": ["*"],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/KDE/extra-cmake-modules/archive/v5.70.0.tar.gz",
+ "sha256": "0e6d0694b2372cbdbc9e64abcaaac21196a15355b360e02e2e833885ae0c62f2"
+ }
+ ]
+ },
+ {
+ "name": "breeze",
+ "buildsystem": "cmake-ninja",
+ "cleanup": ["*"],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/KDE/breeze/archive/v5.18.90.tar.gz",
+ "sha256": "55e42656601dd79db1bc40589764606ec203c7f99c84340deed6e3847a4fdaf6"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "elementary-gtk2-theme",
+ "// NOTE": "This is used by Elementary OS",
+ "buildsystem": "meson",
+ "cleanup": [
+ "/share/themes/elementary/gtk-3.0",
+ "/share/themes/elementary/plank",
+ "/share/plank"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/elementary/stylesheet/archive/5.4.2.tar.gz",
+ "sha256": "3bc37723daf4ce0b7c9ce4c125ef0055affe8d6654981388ec87d4a23a1ae0ec"
+ }
+ ]
+ },
+ {
+ "name": "yaru-gtk2-theme",
+ "// NOTE": "This is used by Ubuntu",
+ "buildsystem": "meson",
+ "config-opts": [
+ "-Dicons=false",
+ "-Dsounds=false",
+ "-Dgnome-shell=false",
+ "-Dsessions=false"
+ ],
+ "cleanup": [
+ "/share/themes/Yaru*/gtk-3.0",
+ "/share/themes/Yaru*/gtk-3.20",
+ "/share/themes/Yaru*/unity"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/ubuntu/yaru/archive/20.10.1.tar.gz",
+ "sha256": "9da2605088674edf2694a8215b7344fb5209b308dd8220ea21667a914dc8c55d"
+ }
+ ]
+ },
+ {
+ "name": "greybird-gtk2-theme",
+ "// NOTE": "This is used by many XFCE distros",
+ "buildsystem": "meson",
+ "cleanup": [
+ "/share/themes/Greybird*/xfwm4",
+ "/share/themes/Greybird*/gnome-shell",
+ "/share/themes/Greybird*/gtk-3.0",
+ "/share/themes/Greybird*/metacity-1",
+ "/share/themes/Greybird*/xfce-notify-4.0",
+ "/share/themes/Greybird*/plank",
+ "/share/themes/Greybird*/unity",
+ "/share/themes/Greybird*/*.emerald"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/shimmerproject/Greybird/archive/v3.22.12.tar.gz",
+ "sha256": "410804cd5daca33cbc5c7c4a179f3a334ced87f408e515fc5d9c083a04bec4bc"
+ }
+ ]
+ },
+ {
+ "name": "materia-gtk2-theme",
+ "// NOTE": "This is used by Ubuntu Studio",
+ "buildsystem": "meson",
+ "cleanup": [
+ "/share/themes/Materia*/xfwm4",
+ "/share/themes/Materia*/gnome-shell",
+ "/share/themes/Materia*/gtk-3.0",
+ "/share/themes/Materia*/metacity-1",
+ "/share/themes/Materia*/cinnamon",
+ "/share/themes/Materia*/chrome",
+ "/share/themes/Materia*/plank",
+ "/share/themes/Materia*/unity"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://github.com/nana-4/materia-theme.git",
+ "commit": "b36b379c9256b67e5f63a60c6faf6912f1845b66"
+ }
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/gtk2/gtk2-fix-crash-in-show-uri.patch b/subprojects/shared-modules/gtk2/gtk2-fix-crash-in-show-uri.patch
new file mode 100644
index 00000000..27b27300
--- /dev/null
+++ b/subprojects/shared-modules/gtk2/gtk2-fix-crash-in-show-uri.patch
@@ -0,0 +1,30 @@
+From 536da7a15c1737bc63c8ecba5ccac40cc2170860 Mon Sep 17 00:00:00 2001
+From: Matthias Clasen <mclasen@redhat.com>
+Date: Mon, 19 Apr 2021 16:39:53 -0400
+Subject: [PATCH] Fix a possible crash in gtk_show_uri
+
+g_file_get_basename can return NULL.
+Deal with it somehow.
+
+Fixes: #3883
+---
+ gdk/x11/gdkapplaunchcontext-x11.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/gdk/x11/gdkapplaunchcontext-x11.c b/gdk/x11/gdkapplaunchcontext-x11.c
+index 8051229ba5..2341bb2e1f 100644
+--- a/gdk/x11/gdkapplaunchcontext-x11.c
++++ b/gdk/x11/gdkapplaunchcontext-x11.c
+@@ -45,6 +45,9 @@ get_display_name (GFile *file,
+ if (name == NULL)
+ {
+ name = g_file_get_basename (file);
++ if (name == NULL)
++ name = g_file_get_uri (file);
++
+ if (!g_utf8_validate (name, -1, NULL))
+ {
+ tmp = name;
+--
+GitLab
+
diff --git a/subprojects/shared-modules/gtk2/gtk2-use-adwaita-theme.patch b/subprojects/shared-modules/gtk2/gtk2-use-adwaita-theme.patch
new file mode 100644
index 00000000..e0350545
--- /dev/null
+++ b/subprojects/shared-modules/gtk2/gtk2-use-adwaita-theme.patch
@@ -0,0 +1,80 @@
+diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c
+index 186a8f5cb2..f5c39b5afe 100644
+--- a/gdk/x11/gdkevents-x11.c
++++ b/gdk/x11/gdkevents-x11.c
+@@ -3000,6 +3000,50 @@ check_transform (const gchar *xsettings_name,
+ return TRUE;
+ }
+
++static gchar *
++gtk_rc_get_theme_dir (void)
++{
++ const gchar *var;
++ gchar *path;
++
++ var = g_getenv ("GTK_DATA_PREFIX");
++
++ if (var)
++ path = g_build_filename (var, "share", "themes", NULL);
++ else
++ path = g_build_filename ("/app", "share", "themes", NULL);
++
++ return path;
++}
++
++static gboolean
++theme_name_valid (XSettingsSetting *setting)
++{
++ gboolean res = FALSE;
++
++ if (setting->type == XSETTINGS_TYPE_STRING)
++ {
++ char *theme_name = setting->data.v_string;
++ gchar *theme_dir = gtk_rc_get_theme_dir ();
++ gchar *path = g_build_filename (theme_dir, theme_name, "gtk-2.0", "gtkrc", NULL);
++
++ if (g_file_test (path, G_FILE_TEST_EXISTS))
++ res = TRUE;
++ else if (g_str_has_suffix (theme_name, "-Dark") ||
++ g_str_has_suffix (theme_name, "-dark"))
++ {
++ setting->data.v_string = g_strdup ("Adwaita-dark");
++ g_free (theme_name);
++ res = TRUE;
++ }
++
++ g_free (theme_dir);
++ g_free (path);
++ }
++
++ return res;
++}
++
+ /**
+ * gdk_screen_get_setting:
+ * @screen: the #GdkScreen where the setting is located
+@@ -3050,6 +3094,11 @@ gdk_screen_get_setting (GdkScreen *screen,
+ if (result != XSETTINGS_SUCCESS)
+ goto out;
+
++ if (strcmp (name, "gtk-theme-name") == 0 &&
++ (setting->type != XSETTINGS_TYPE_STRING ||
++ !theme_name_valid (setting)))
++ goto out;
++
+ switch (setting->type)
+ {
+ case XSETTINGS_TYPE_INT:
+diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
+index 3fbbf00548..5c0a4b33d2 100644
+--- a/gtk/gtksettings.c
++++ b/gtk/gtksettings.c
+@@ -312,7 +312,7 @@ gtk_settings_class_init (GtkSettingsClass *class)
+ #ifdef G_OS_WIN32
+ "MS-Windows",
+ #else
+- "Raleigh",
++ "Adwaita",
+ #endif
+ GTK_PARAM_READWRITE),
+ NULL);
diff --git a/subprojects/shared-modules/gtk2/gtk2.json b/subprojects/shared-modules/gtk2/gtk2.json
new file mode 100644
index 00000000..bfca223a
--- /dev/null
+++ b/subprojects/shared-modules/gtk2/gtk2.json
@@ -0,0 +1,112 @@
+{
+ "name": "gnome-themes-extra",
+ "rm-configure": true,
+ "config-opts": [
+ "--disable-dependency-tracking",
+ "--disable-gtk3-engine"
+ ],
+ "cleanup": [
+ "/share/themes/Adwaita/gtk-3.0",
+ "/share/themes/Adwaita-dark/gtk-3.0",
+ "/share/themes/HighContrast/gtk-3.0",
+ "*.la"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/gnome-themes-extra/3.28/gnome-themes-extra-3.28.tar.xz",
+ "sha256": "7c4ba0bff001f06d8983cfc105adaac42df1d1267a2591798a780bac557a5819"
+ },
+ {
+ "type": "shell",
+ "//": "We want to avoid generating icons as its 99% of the build time and gnome runtime has it",
+ "commands": [
+ "sed -i 's/icons//' themes/HighContrast/Makefile.am"
+ ]
+ },
+ {
+ "type": "script",
+ "commands": [
+ "autoreconf -fsi"
+ ]
+ }
+ ],
+ "modules": [
+ "../intltool/intltool-0.51.json",
+ {
+ "name": "gtk2",
+ "cleanup": [
+ "/bin",
+ "/share/gtk-2.0",
+ "/share/aclocal",
+ "/share/gtk-doc",
+ "/lib/pkgconfig",
+ "/lib/gtk-2.0/include",
+ "/include",
+ "*.la"
+ ],
+ "x-cpe": {
+ "product": "gtk+"
+ },
+ "config-opts": [
+ "--disable-dependency-tracking",
+ "--disable-gtk-doc-html",
+ "--disable-introspection",
+ "--with-xinput=xfree"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/gtk+/2.24/gtk+-2.24.33.tar.xz",
+ "sha256": "ac2ac757f5942d318a311a54b0c80b5ef295f299c2a73c632f6bfb1ff49cc6da"
+ },
+ {
+ "type": "patch",
+ "path": "gtk2-use-adwaita-theme.patch"
+ },
+ {
+ "type": "patch",
+ "path": "gtk2-fix-crash-in-show-uri.patch"
+ }
+ ]
+ },
+ {
+ "name": "ibus-gtk2",
+ "config-opts": [
+ "--disable-xim",
+ "--disable-dconf",
+ "--disable-gconf",
+ "--disable-memconf",
+ "--disable-schemas-compile",
+ "--disable-schemas-install",
+ "--disable-gtk3",
+ "--disable-setup",
+ "--disable-ui",
+ "--disable-engine",
+ "--disable-python-library",
+ "--disable-libnotify",
+ "--disable-emoji-dict",
+ "--disable-appindicator",
+ "--disable-glibtest",
+ "--disable-tests",
+ "--disable-unicode-dict",
+ "--disable-introspection",
+ "--disable-python2"
+ ],
+ "make-install-args": [
+ "-C", "client/gtk2"
+ ],
+ "post-install": [
+ "gtk-query-immodules-2.0 > immodules.cache",
+ "install immodules.cache -t $(pkg-config --variable=libdir gtk+-2.0)/gtk-2.0/2.10.0/"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/ibus/ibus/releases/download/1.5.23/ibus-1.5.23.tar.gz",
+ "sha256": "b7e8d5bdb7d71a5ba4ee43cdf374675f77121a71c1679c9b9e7e02875bd0e150"
+ }
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/gtk2/murrine-engine-fix-crash.patch b/subprojects/shared-modules/gtk2/murrine-engine-fix-crash.patch
new file mode 100644
index 00000000..6200e771
--- /dev/null
+++ b/subprojects/shared-modules/gtk2/murrine-engine-fix-crash.patch
@@ -0,0 +1,12 @@
+Index: gtk2-engines-murrine-0.98.2/src/murrine_style.c
+===================================================================
+--- gtk2-engines-murrine-0.98.2.orig/src/murrine_style.c
++++ gtk2-engines-murrine-0.98.2/src/murrine_style.c
+@@ -2171,6 +2171,7 @@ murrine_style_draw_layout (GtkStyle
+ cairo_t *cr;
+ cr = murrine_begin_paint (window, area);
+ cairo_translate (cr, x+xos, y+yos);
++ pango_cairo_update_layout (cr, layout);
+ pango_cairo_layout_path (cr, layout);
+ murrine_set_color_rgba (cr, &temp, 0.5);
+ cairo_stroke (cr);
diff --git a/subprojects/shared-modules/gudev/gudev.json b/subprojects/shared-modules/gudev/gudev.json
new file mode 100644
index 00000000..50d9c6b9
--- /dev/null
+++ b/subprojects/shared-modules/gudev/gudev.json
@@ -0,0 +1,33 @@
+{
+ "name": "gudev",
+ "buildsystem": "meson",
+ "config-opts": [
+ "-Dtests=disabled",
+ "-Dvapi=disabled",
+ "-Dintrospection=disabled",
+ "-Dgtk_doc=false"
+ ],
+ "cleanup": [
+ "/include",
+ "/etc",
+ "/libexec",
+ "/sbin",
+ "/lib/pkgconfig",
+ "/lib/systemd",
+ "/man",
+ "/share/aclocal",
+ "/share/doc",
+ "/share/gtk-doc",
+ "/share/man",
+ "/share/pkgconfig",
+ "*.la",
+ "*.a"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/libgudev/237/libgudev-237.tar.xz",
+ "sha256": "0d06b21170d20c93e4f0534dbb9b0a8b4f1119ffb00b4031aaeb5b9148b686aa"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/gzdoom/description.patch b/subprojects/shared-modules/gzdoom/description.patch
new file mode 100644
index 00000000..5f760cca
--- /dev/null
+++ b/subprojects/shared-modules/gzdoom/description.patch
@@ -0,0 +1,18 @@
+diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp
+index b421b1b35..9f0b16948 100644
+--- a/src/d_iwad.cpp
++++ b/src/d_iwad.cpp
+@@ -683,9 +683,10 @@ int FIWadManager::IdentifyVersion (TArray<FString> &wadfiles, const char *iwad,
+ "2. Edit your ~/Library/Preferences/" GAMENAMELOWERCASE ".ini and add the directories\n"
+ "of your iwads to the list beneath [IWADSearch.Directories]");
+ #else
+- "1. Place one or more of these wads in ~/.config/" GAMENAMELOWERCASE "/.\n"
+- "2. Edit your ~/.config/" GAMENAMELOWERCASE "/" GAMENAMELOWERCASE ".ini and add the directories of your\n"
+- "iwads to the list beneath [IWADSearch.Directories]");
++ "1. Place one or more of these wads in ~/.var/app/org.zdoom.GZDoom/.config/" GAMENAMELOWERCASE "/\n"
++ "2. Edit your ~/.var/app/org.zdoom.GZDoom/.config/" GAMENAMELOWERCASE "/" GAMENAMELOWERCASE ".ini and\n"
++ " add the directories of your iwads to the list beneath [IWADSearch.Directories]\n"
++ "3. Validate your Flatpak permissions, so that Flatpak has access to your directories with wads");
+ #endif
+ }
+ int pick = 0;
diff --git a/subprojects/shared-modules/gzdoom/gzdoom.json b/subprojects/shared-modules/gzdoom/gzdoom.json
new file mode 100644
index 00000000..1ab16bdc
--- /dev/null
+++ b/subprojects/shared-modules/gzdoom/gzdoom.json
@@ -0,0 +1,50 @@
+{
+ "name": "gzdoom",
+ "buildsystem": "cmake-ninja",
+ "config-opts": [
+ "-DCMAKE_BUILD_TYPE=RelWithDebInfo"
+ ],
+ "cleanup": [
+ "/lib/*.a",
+ "/lib/*.la",
+ "/lib/pkgconfig",
+ "/include"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://github.com/coelckers/gzdoom.git",
+ "tag": "g4.7.1",
+ "commit": "107ff702423686414680d6458fea63a2647692c4"
+ },
+ {
+ "type": "file",
+ "url": "https://github.com/coelckers/gzdoom/raw/g4.7.1/soundfont/gzdoom.sf2",
+ "sha256": "fca3e514b635a21789d4224e84865d2954a2a914d46b64aa8219ddb565c44869"
+ },
+ /* I've discussed these patches upstream and a special -DFLATPAK_BUNDLE has been approved */
+ {
+ "type": "patch",
+ "path": "description.patch"
+ }
+ ],
+ "post-install": [
+ "install -Dm 644 gzdoom.sf2 /app/share/sounds/sf2/gzdoom.sf2"
+ ],
+ "modules": [
+ {
+ "name": "zmusic",
+ "buildsystem": "cmake-ninja",
+ "config-opts": [
+ "-DCMAKE_BUILD_TYPE=RelWithDebInfo"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/coelckers/ZMusic/archive/1.1.8.tar.gz",
+ "sha256": "73082f661b7b0bb33348d1d186c132deec9132a1613480348a00172b49c9fd68"
+ }
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/intltool/intltool-0.51.json b/subprojects/shared-modules/intltool/intltool-0.51.json
new file mode 100644
index 00000000..c1f7d269
--- /dev/null
+++ b/subprojects/shared-modules/intltool/intltool-0.51.json
@@ -0,0 +1,15 @@
+{
+ "name": "intltool",
+ "cleanup": [ "*" ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/intltool/trunk/0.51.0/+download/intltool-0.51.0.tar.gz",
+ "sha256": "67c74d94196b153b774ab9f89b2fa6c6ba79352407037c8c14d5aeb334e959cd"
+ },
+ {
+ "type": "patch",
+ "path": "intltool-perl5.26-regex-fixes.patch"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/intltool/intltool-perl5.26-regex-fixes.patch b/subprojects/shared-modules/intltool/intltool-perl5.26-regex-fixes.patch
new file mode 100644
index 00000000..234b82bd
--- /dev/null
+++ b/subprojects/shared-modules/intltool/intltool-perl5.26-regex-fixes.patch
@@ -0,0 +1,59 @@
+Description: Escape "{", to prevent complaints from perl 5.22 and 5.26
+Author: Roderich Schupp <roderich.schupp@gmail.com>
+Author: gregor herrmann <gregoa@debian.org>
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=788705
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=826471
+Bug-Upstream: https://bugs.launchpad.net/intltool/+bug/1490906
+
+Index: intltool-0.51.0/intltool-update.in
+===================================================================
+--- intltool-0.51.0.orig/intltool-update.in 2017-07-23 17:24:35.113169465 +0200
++++ intltool-0.51.0/intltool-update.in 2017-07-23 17:24:35.109169052 +0200
+@@ -1062,13 +1062,13 @@
+ }
+ }
+
+- if ($str =~ /^(.*)\${?([A-Z_]+)}?(.*)$/)
++ if ($str =~ /^(.*)\$\{?([A-Z_]+)}?(.*)$/)
+ {
+ my $rest = $3;
+ my $untouched = $1;
+ my $sub = "";
+ # Ignore recursive definitions of variables
+- $sub = $varhash{$2} if defined $varhash{$2} and $varhash{$2} !~ /\${?$2}?/;
++ $sub = $varhash{$2} if defined $varhash{$2} and $varhash{$2} !~ /\$\{?$2}?/;
+
+ return SubstituteVariable ("$untouched$sub$rest");
+ }
+@@ -1190,10 +1190,10 @@
+ $name =~ s/\(+$//g;
+ $version =~ s/\(+$//g;
+
+- $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/);
+- $varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/);
+- $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/);
+- $varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/);
++ $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\$\{?AC_PACKAGE_NAME}?/);
++ $varhash{"PACKAGE"} = $name if (not $name =~ /\$\{?PACKAGE}?/);
++ $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\$\{?AC_PACKAGE_VERSION}?/);
++ $varhash{"VERSION"} = $version if (not $name =~ /\$\{?VERSION}?/);
+ }
+
+ if ($conf_source =~ /^AC_INIT\(([^,\)]+),([^,\)]+)[,]?([^,\)]+)?/m)
+@@ -1219,11 +1219,11 @@
+ $version =~ s/\(+$//g;
+ $bugurl =~ s/\(+$//g if (defined $bugurl);
+
+- $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/);
+- $varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/);
+- $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/);
+- $varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/);
+- $varhash{"PACKAGE_BUGREPORT"} = $bugurl if (defined $bugurl and not $bugurl =~ /\${?\w+}?/);
++ $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\$\{?AC_PACKAGE_NAME}?/);
++ $varhash{"PACKAGE"} = $name if (not $name =~ /\$\{?PACKAGE}?/);
++ $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\$\{?AC_PACKAGE_VERSION}?/);
++ $varhash{"VERSION"} = $version if (not $name =~ /\$\{?VERSION}?/);
++ $varhash{"PACKAGE_BUGREPORT"} = $bugurl if (defined $bugurl and not $bugurl =~ /\$\{?\w+}?/);
+ }
+
+ # \s makes this not work, why?
diff --git a/subprojects/shared-modules/lame/lame-3.99.5.json b/subprojects/shared-modules/lame/lame-3.99.5.json
new file mode 100644
index 00000000..3b431dca
--- /dev/null
+++ b/subprojects/shared-modules/lame/lame-3.99.5.json
@@ -0,0 +1,37 @@
+{
+ "name": "lame",
+ "rm-configure": true,
+ "config-opts": ["--disable-static"],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://downloads.sourceforge.net/lame/lame-3.99.5.tar.gz",
+ "sha256": "24346b4158e4af3bd9f2e194bb23eb473c75fb7377011523353196b19b9a23ff"
+ },
+ {
+ "type": "patch",
+ "path": "lame-msse.patch"
+ },
+ {
+ "type": "patch",
+ "path": "lame-gtk1-ac-directives.patch"
+ },
+ {
+ "type": "patch",
+ "path": "lame-ansi2knr2devnull.patch"
+ },
+ {
+ "type": "patch",
+ "path": "lame-tinfo.patch",
+ "strip-components": 0
+ },
+ {
+ "type": "script",
+ "dest-filename": "autogen.sh",
+ "commands": [
+ "autoreconf -vfi"
+ ]
+ }
+ ],
+ "cleanup": ["/bin", "/include", "/share/doc", "/share/man", "*.la"]
+}
diff --git a/subprojects/shared-modules/lame/lame-ansi2knr2devnull.patch b/subprojects/shared-modules/lame/lame-ansi2knr2devnull.patch
new file mode 100644
index 00000000..c427345e
--- /dev/null
+++ b/subprojects/shared-modules/lame/lame-ansi2knr2devnull.patch
@@ -0,0 +1,43 @@
+Description: Patch out remaining ansi2knr.
+Author: Dimitri John Ledkov <xnox@ubuntu.com>
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755111
+--- a/configure.in
++++ b/configure.in
+@@ -78,7 +78,6 @@
+ fi
+
+ dnl more automake stuff
+-AM_C_PROTOTYPES
+
+ AC_CHECK_HEADER(dmalloc.h)
+ if test "${ac_cv_header_dmalloc_h}" = "yes"; then
+--- a/doc/man/Makefile.am
++++ b/doc/man/Makefile.am
+@@ -1,6 +1,6 @@
+ ## $Id: Makefile.am,v 1.1 2000/10/22 11:39:44 aleidinger Exp $
+
+-AUTOMAKE_OPTIONS = foreign ansi2knr
++AUTOMAKE_OPTIONS = foreign
+
+ man_MANS = lame.1
+ EXTRA_DIST = ${man_MANS}
+--- a/libmp3lame/i386/Makefile.am
++++ b/libmp3lame/i386/Makefile.am
+@@ -1,6 +1,6 @@
+ ## $Id: Makefile.am,v 1.26 2011/04/04 09:42:34 aleidinger Exp $
+
+-AUTOMAKE_OPTIONS = foreign $(top_srcdir)/ansi2knr
++AUTOMAKE_OPTIONS = foreign
+
+ DEFS = @DEFS@ @CONFIG_DEFS@
+
+--- a/doc/html/Makefile.am
++++ b/doc/html/Makefile.am
+@@ -1,6 +1,6 @@
+ ## $Id: Makefile.am,v 1.7 2010/09/30 20:58:40 jaz001 Exp $
+
+-AUTOMAKE_OPTIONS = foreign ansi2knr
++AUTOMAKE_OPTIONS = foreign
+
+ docdir = $(datadir)/doc
+ pkgdocdir = $(docdir)/$(PACKAGE)
diff --git a/subprojects/shared-modules/lame/lame-gtk1-ac-directives.patch b/subprojects/shared-modules/lame/lame-gtk1-ac-directives.patch
new file mode 100644
index 00000000..7e0d3fe4
--- /dev/null
+++ b/subprojects/shared-modules/lame/lame-gtk1-ac-directives.patch
@@ -0,0 +1,205 @@
+Description: Include GTK-1 autoconf directives in build system.
+Origin: http://anonscm.debian.org/gitweb/?p=pkg-multimedia/lame.git;a=tree;f=debian/patches
+Forwarded: yes
+Applied-Upstream: http://lame.cvs.sf.net/viewvc/lame/lame/acinclude.m4?revision=1.6
+
+--- a/acinclude.m4
++++ b/acinclude.m4
+@@ -85,4 +85,197 @@
+ [AC_MSG_WARN(can't check for IEEE854 compliant 80 bit floats)]
+ )])]) # alex_IEEE854_FLOAT80
+
++# Configure paths for GTK+
++# Owen Taylor 97-11-3
+
++dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
++dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS
++dnl
++AC_DEFUN([AM_PATH_GTK],
++[dnl
++dnl Get the cflags and libraries from the gtk-config script
++dnl
++AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)],
++ gtk_config_prefix="$withval", gtk_config_prefix="")
++AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)],
++ gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="")
++AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program],
++ , enable_gtktest=yes)
++
++ for module in . $4
++ do
++ case "$module" in
++ gthread)
++ gtk_config_args="$gtk_config_args gthread"
++ ;;
++ esac
++ done
++
++ if test x$gtk_config_exec_prefix != x ; then
++ gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
++ if test x${GTK_CONFIG+set} != xset ; then
++ GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
++ fi
++ fi
++ if test x$gtk_config_prefix != x ; then
++ gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
++ if test x${GTK_CONFIG+set} != xset ; then
++ GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
++ fi
++ fi
++
++ AC_PATH_PROG(GTK_CONFIG, gtk-config, no)
++ min_gtk_version=ifelse([$1], ,0.99.7,$1)
++ AC_MSG_CHECKING(for GTK - version >= $min_gtk_version)
++ no_gtk=""
++ if test "$GTK_CONFIG" = "no" ; then
++ no_gtk=yes
++ else
++ GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
++ GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
++ gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \
++ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
++ gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
++ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
++ gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
++ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
++ if test "x$enable_gtktest" = "xyes" ; then
++ ac_save_CFLAGS="$CFLAGS"
++ ac_save_LIBS="$LIBS"
++ CFLAGS="$CFLAGS $GTK_CFLAGS"
++ LIBS="$GTK_LIBS $LIBS"
++dnl
++dnl Now check if the installed GTK is sufficiently new. (Also sanity
++dnl checks the results of gtk-config to some extent
++dnl
++ rm -f conf.gtktest
++ AC_TRY_RUN([
++#include <gtk/gtk.h>
++#include <stdio.h>
++#include <stdlib.h>
++
++int
++main ()
++{
++ int major, minor, micro;
++ char *tmp_version;
++
++ system ("touch conf.gtktest");
++
++ /* HP/UX 9 (%@#!) writes to sscanf strings */
++ tmp_version = g_strdup("$min_gtk_version");
++ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
++ printf("%s, bad version string\n", "$min_gtk_version");
++ exit(1);
++ }
++
++ if ((gtk_major_version != $gtk_config_major_version) ||
++ (gtk_minor_version != $gtk_config_minor_version) ||
++ (gtk_micro_version != $gtk_config_micro_version))
++ {
++ printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
++ $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
++ gtk_major_version, gtk_minor_version, gtk_micro_version);
++ printf ("*** was found! If gtk-config was correct, then it is best\n");
++ printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
++ printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
++ printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
++ printf("*** required on your system.\n");
++ printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n");
++ printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n");
++ printf("*** before re-running configure\n");
++ }
++#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION)
++ else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
++ (gtk_minor_version != GTK_MINOR_VERSION) ||
++ (gtk_micro_version != GTK_MICRO_VERSION))
++ {
++ printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
++ GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
++ printf("*** library (version %d.%d.%d)\n",
++ gtk_major_version, gtk_minor_version, gtk_micro_version);
++ }
++#endif /* defined (GTK_MAJOR_VERSION) ... */
++ else
++ {
++ if ((gtk_major_version > major) ||
++ ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
++ ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
++ {
++ return 0;
++ }
++ else
++ {
++ printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
++ gtk_major_version, gtk_minor_version, gtk_micro_version);
++ printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
++ major, minor, micro);
++ printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
++ printf("***\n");
++ printf("*** If you have already installed a sufficiently new version, this error\n");
++ printf("*** probably means that the wrong copy of the gtk-config shell script is\n");
++ printf("*** being found. The easiest way to fix this is to remove the old version\n");
++ printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n");
++ printf("*** correct copy of gtk-config. (In this case, you will have to\n");
++ printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
++ printf("*** so that the correct libraries are found at run-time))\n");
++ }
++ }
++ return 1;
++}
++],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
++ CFLAGS="$ac_save_CFLAGS"
++ LIBS="$ac_save_LIBS"
++ fi
++ fi
++ if test "x$no_gtk" = x ; then
++ AC_MSG_RESULT(yes)
++ ifelse([$2], , :, [$2])
++ else
++ AC_MSG_RESULT(no)
++ if test "$GTK_CONFIG" = "no" ; then
++ echo "*** The gtk-config script installed by GTK could not be found"
++ echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in"
++ echo "*** your path, or set the GTK_CONFIG environment variable to the"
++ echo "*** full path to gtk-config."
++ else
++ if test -f conf.gtktest ; then
++ :
++ else
++ echo "*** Could not run GTK test program, checking why..."
++ CFLAGS="$CFLAGS $GTK_CFLAGS"
++ LIBS="$LIBS $GTK_LIBS"
++ AC_TRY_LINK([
++#include <gtk/gtk.h>
++#include <stdio.h>
++], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ],
++ [ echo "*** The test program compiled, but did not run. This usually means"
++ echo "*** that the run-time linker is not finding GTK or finding the wrong"
++ echo "*** version of GTK. If it is not finding GTK, you'll need to set your"
++ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
++ echo "*** to the installed location Also, make sure you have run ldconfig if that"
++ echo "*** is required on your system"
++ echo "***"
++ echo "*** If you have an old version installed, it is best to remove it, although"
++ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
++ echo "***"
++ echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
++ echo "*** came with the system with the command"
++ echo "***"
++ echo "*** rpm --erase --nodeps gtk gtk-devel" ],
++ [ echo "*** The test program failed to compile or link. See the file config.log for the"
++ echo "*** exact error that occured. This usually means GTK was incorrectly installed"
++ echo "*** or that you have moved GTK since it was installed. In the latter case, you"
++ echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ])
++ CFLAGS="$ac_save_CFLAGS"
++ LIBS="$ac_save_LIBS"
++ fi
++ fi
++ GTK_CFLAGS=""
++ GTK_LIBS=""
++ ifelse([$3], , :, [$3])
++ fi
++ AC_SUBST(GTK_CFLAGS)
++ AC_SUBST(GTK_LIBS)
++ rm -f conf.gtktest
++])
diff --git a/subprojects/shared-modules/lame/lame-msse.patch b/subprojects/shared-modules/lame/lame-msse.patch
new file mode 100644
index 00000000..4b71a2ed
--- /dev/null
+++ b/subprojects/shared-modules/lame/lame-msse.patch
@@ -0,0 +1,17 @@
+Description: Build xmm_quantize_sub.c with -msse
+Author: Sebastian Ramacher <sramacher@debian.org>
+Bug: http://sourceforge.net/p/lame/bugs/443/
+Bug-Debian: https://bugs.debian.org/760047
+Forwarded: http://sourceforge.net/p/lame/bugs/443/
+Last-Update: 2014-08-31
+
+--- lame-3.99.5+repack1.orig/libmp3lame/vector/Makefile.am
++++ lame-3.99.5+repack1/libmp3lame/vector/Makefile.am
+@@ -20,6 +20,7 @@ xmm_sources = xmm_quantize_sub.c
+
+ if WITH_XMM
+ liblamevectorroutines_la_SOURCES = $(xmm_sources)
++liblamevectorroutines_la_CFLAGS = -msse
+ endif
+
+ noinst_HEADERS = lame_intrin.h
diff --git a/subprojects/shared-modules/lame/lame-tinfo.patch b/subprojects/shared-modules/lame/lame-tinfo.patch
new file mode 100644
index 00000000..cb570e78
--- /dev/null
+++ b/subprojects/shared-modules/lame/lame-tinfo.patch
@@ -0,0 +1,23 @@
+initscr is not used anywhere in lame sourcetree, check for used tgetent instead
+check for separate tinfo library optionally built out from libncurses source tree,
+like used in debian and gentoo
+- ssuominen@g.o
+
+http://bugs.gentoo.org/454322
+
+--- configure.in
++++ configure.in
+@@ -372,9 +372,10 @@
+
+ AC_CHECK_HEADERS(termcap.h)
+ AC_CHECK_HEADERS(ncurses/termcap.h)
+-AC_CHECK_LIB(termcap, initscr, HAVE_TERMCAP="termcap")
+-AC_CHECK_LIB(curses, initscr, HAVE_TERMCAP="curses")
+-AC_CHECK_LIB(ncurses, initscr, HAVE_TERMCAP="ncurses")
++AC_CHECK_LIB(termcap, tgetent, HAVE_TERMCAP="termcap")
++AC_CHECK_LIB(curses, tgetent, HAVE_TERMCAP="curses")
++AC_CHECK_LIB(ncurses, tgetent, HAVE_TERMCAP="ncurses")
++AC_CHECK_LIB(tinfo, tgetent, HAVE_TERMCAP="tinfo")
+
+ AM_ICONV
+
diff --git a/subprojects/shared-modules/libappindicator/Makefile b/subprojects/shared-modules/libappindicator/Makefile
new file mode 100644
index 00000000..58192455
--- /dev/null
+++ b/subprojects/shared-modules/libappindicator/Makefile
@@ -0,0 +1,10 @@
+all: libappindicator-gtk3-introspection-12.10.json libappindicator-gtk3-12.10.json libappindicator-gtk2-12.10.json
+
+libappindicator-gtk3-introspection-12.10.json: libappindicator.json.in
+ sed -e 's/@GTK_VER@/3/g' -e 's/@INTROSPECTION@/yes/g' $< > $@
+
+libappindicator-gtk3-12.10.json: libappindicator.json.in
+ sed -e 's/@GTK_VER@/3/g' -e 's/@INTROSPECTION@/no/g' $< > $@
+
+libappindicator-gtk2-12.10.json: libappindicator.json.in
+ sed -e 's/@GTK_VER@/2/g' -e 's/@INTROSPECTION@/no/g' $< > $@ \ No newline at end of file
diff --git a/subprojects/shared-modules/libappindicator/libappindicator-fix-crash-from-incorrect-signal-emission.patch b/subprojects/shared-modules/libappindicator/libappindicator-fix-crash-from-incorrect-signal-emission.patch
new file mode 100644
index 00000000..28927a37
--- /dev/null
+++ b/subprojects/shared-modules/libappindicator/libappindicator-fix-crash-from-incorrect-signal-emission.patch
@@ -0,0 +1,74 @@
+--- libappindicator-12.10.0/src/app-indicator.c 2012-07-11 13:28:34.415113869 -0400
++++ wrk/src/app-indicator.c 2020-03-19 12:14:47.813191652 -0400
+@@ -443,7 +443,7 @@
+ G_STRUCT_OFFSET (AppIndicatorClass, new_icon),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+- G_TYPE_NONE, 0, G_TYPE_NONE);
++ G_TYPE_NONE, 0);
+
+ /**
+ * AppIndicator::new-attention-icon:
+@@ -457,7 +457,7 @@
+ G_STRUCT_OFFSET (AppIndicatorClass, new_attention_icon),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+- G_TYPE_NONE, 0, G_TYPE_NONE);
++ G_TYPE_NONE, 0);
+
+ /**
+ * AppIndicator::new-status:
+@@ -505,7 +505,7 @@
+ G_STRUCT_OFFSET (AppIndicatorClass, connection_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__BOOLEAN,
+- G_TYPE_NONE, 1, G_TYPE_BOOLEAN, G_TYPE_NONE);
++ G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+
+ /**
+ * AppIndicator::new-icon-theme-path:
+@@ -1175,7 +1175,7 @@
+ gchar * guide = priv->label_guide != NULL ? priv->label_guide : "";
+
+ g_signal_emit(G_OBJECT(self), signals[NEW_LABEL], 0,
+- label, guide, TRUE);
++ label, guide);
+ if (priv->dbus_registration != 0 && priv->connection != NULL) {
+ GError * error = NULL;
+
+@@ -1490,7 +1490,7 @@
+ static void
+ theme_changed_cb (GtkIconTheme * theme, gpointer user_data)
+ {
+- g_signal_emit (user_data, signals[NEW_ICON], 0, TRUE);
++ g_signal_emit (user_data, signals[NEW_ICON], 0);
+
+ AppIndicator * self = (AppIndicator *)user_data;
+ AppIndicatorPrivate *priv = self->priv;
+@@ -1904,7 +1904,7 @@
+ }
+
+ if (changed) {
+- g_signal_emit (self, signals[NEW_ATTENTION_ICON], 0, TRUE);
++ g_signal_emit (self, signals[NEW_ATTENTION_ICON], 0);
+
+ if (self->priv->dbus_registration != 0 && self->priv->connection != NULL) {
+ GError * error = NULL;
+@@ -1982,7 +1982,7 @@
+ }
+
+ if (changed) {
+- g_signal_emit (self, signals[NEW_ICON], 0, TRUE);
++ g_signal_emit (self, signals[NEW_ICON], 0);
+
+ if (self->priv->dbus_registration != 0 && self->priv->connection != NULL) {
+ GError * error = NULL;
+@@ -2048,7 +2048,7 @@
+
+ self->priv->icon_theme_path = g_strdup(icon_theme_path);
+
+- g_signal_emit (self, signals[NEW_ICON_THEME_PATH], 0, self->priv->icon_theme_path, TRUE);
++ g_signal_emit (self, signals[NEW_ICON_THEME_PATH], 0, self->priv->icon_theme_path);
+
+ if (self->priv->dbus_registration != 0 && self->priv->connection != NULL) {
+ GError * error = NULL;
diff --git a/subprojects/shared-modules/libappindicator/libappindicator-fix-crash-iterating-icon-themes.patch b/subprojects/shared-modules/libappindicator/libappindicator-fix-crash-iterating-icon-themes.patch
new file mode 100644
index 00000000..44f6fe48
--- /dev/null
+++ b/subprojects/shared-modules/libappindicator/libappindicator-fix-crash-iterating-icon-themes.patch
@@ -0,0 +1,11 @@
+--- libappindicator-12.10.0/src/app-indicator.c
++++ libappindicator-12.10.0/src/app-indicator.c
+@@ -1606,7 +1606,7 @@ status_icon_changes (AppIndicator * self, gpointer data)
+ gint n_elements, i;
+ gboolean found=FALSE;
+ gtk_icon_theme_get_search_path(icon_theme, &path, &n_elements);
+- for (i=0; i< n_elements || path[i] == NULL; i++) {
++ for (i=0; i< n_elements; i++) {
+ if(g_strcmp0(path[i], self->priv->icon_theme_path) == 0) {
+ found=TRUE;
+ break;
diff --git a/subprojects/shared-modules/libappindicator/libappindicator-ftbfs.patch b/subprojects/shared-modules/libappindicator/libappindicator-ftbfs.patch
new file mode 100644
index 00000000..93d31af6
--- /dev/null
+++ b/subprojects/shared-modules/libappindicator/libappindicator-ftbfs.patch
@@ -0,0 +1,20 @@
+From: Olivier Tilloy <olivier.tilloy@canonical.com>
+Date: Tue 2018-03-20 12:47:56 +0000
+Subject: [PATCH] libappindicator FTBFS on bionic
+
+Fix build failures on bionic,
+and update Vcs-* fields in debian/control. (LP: #1757121)
+
+Approved by: Marco Trevisan (Treviño)
+---
+--- libappindicator-12.10.0/src/app-indicator.c 2017-02-15 14:10:41 +0000
++++ libappindicator-12.10.0/src/app-indicator.c 2018-03-20 12:38:59 +0000
+@@ -2196,7 +2196,7 @@ app_indicator_set_secondary_activate_tar
+
+ g_return_if_fail (GTK_IS_WIDGET (menuitem));
+
+- priv->sec_activate_target = g_object_ref(G_OBJECT(menuitem));
++ priv->sec_activate_target = g_object_ref(menuitem);
+ priv->sec_activate_enabled = widget_is_menu_child(self, menuitem);
+ g_signal_connect(menuitem, "parent-set", G_CALLBACK(sec_activate_target_parent_changed), self);
+ }
diff --git a/subprojects/shared-modules/libappindicator/libappindicator-gtk2-12.10.json b/subprojects/shared-modules/libappindicator/libappindicator-gtk2-12.10.json
new file mode 100644
index 00000000..4e1d38fa
--- /dev/null
+++ b/subprojects/shared-modules/libappindicator/libappindicator-gtk2-12.10.json
@@ -0,0 +1,130 @@
+{
+ "name": "libappindicator",
+ "build-options": {
+ "cflags": "-Wno-error",
+ "make-args": [ "-j1" ]
+ },
+ "rm-configure": true,
+ "config-opts": [
+ "--disable-static",
+ "--disable-gtk-doc",
+ "--disable-tests",
+ "--disable-mono-tests",
+ "--enable-introspection=no",
+ "--with-gtk=2"
+ ],
+ "cleanup": [
+ "/include",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/share/gtk-doc",
+ "/share/gir-1.0"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/libappindicator/12.10/12.10.0/+download/libappindicator-12.10.0.tar.gz",
+ "sha256": "d5907c1f98084acf28fd19593cb70672caa0ca1cf82d747ba6f4830d4cc3b49f"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-ftbfs.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-no-python.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-fix-crash-from-incorrect-signal-emission.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-fix-crash-iterating-icon-themes.patch"
+ },
+ {
+ "type": "script",
+ "commands": ["autoreconf -sfi"],
+ "dest-filename": "autogen.sh"
+ }
+ ],
+ "modules": [
+ "../intltool/intltool-0.51.json",
+ "../dbus-glib/dbus-glib.json",
+ {
+ "name": "libdbusmenu",
+ "build-options": {
+ "cflags": "-Wno-error",
+ "env": {
+ "HAVE_VALGRIND_FALSE": "#",
+ "HAVE_VALGRIND_TRUE": ""
+ }
+ },
+ "cleanup": [
+ "/include",
+ "/libexec",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/share/doc",
+ "/share/libdbusmenu",
+ "/share/gtk-doc",
+ "/share/gir-1.0"
+ ],
+ "config-opts": [
+ "--disable-static",
+ "--disable-gtk-doc",
+ "--enable-introspection=no",
+ "--disable-vala",
+ "--disable-dumper",
+ "--disable-tests",
+ "--with-gtk=2"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/libdbusmenu/16.04/16.04.0/+download/libdbusmenu-16.04.0.tar.gz",
+ "sha256": "b9cc4a2acd74509435892823607d966d424bd9ad5d0b00938f27240a1bfa878a"
+ }
+ ]
+ },
+ {
+ "name": "libindicator",
+ "build-options": {
+ "cflags": "-Wno-error"
+ },
+ "cleanup": [
+ "/include",
+ "/libexec",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/share/libindicator",
+ "/share/gtk-doc",
+ "/share/gir-1.0"
+ ],
+ "config-opts": [
+ "--disable-static",
+ "--disable-tests",
+ "--with-gtk=2"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/libindicator/12.10/12.10.1/+download/libindicator-12.10.1.tar.gz",
+ "sha256": "b2d2e44c10313d5c9cd60db455d520f80b36dc39562df079a3f29495e8f9447f"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "# FTBFS fix",
+ "sed -e '/LIBINDICATOR_LIBS/ s/\\$LIBM/ $LIBM/' -i configure.ac"
+ ]
+ },
+ {
+ "type": "script",
+ "commands": ["autoreconf -sfi"],
+ "dest-filename": "autogen.sh"
+ }
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/libappindicator/libappindicator-gtk3-12.10.json b/subprojects/shared-modules/libappindicator/libappindicator-gtk3-12.10.json
new file mode 100644
index 00000000..c613f8fb
--- /dev/null
+++ b/subprojects/shared-modules/libappindicator/libappindicator-gtk3-12.10.json
@@ -0,0 +1,130 @@
+{
+ "name": "libappindicator",
+ "build-options": {
+ "cflags": "-Wno-error",
+ "make-args": [ "-j1" ]
+ },
+ "rm-configure": true,
+ "config-opts": [
+ "--disable-static",
+ "--disable-gtk-doc",
+ "--disable-tests",
+ "--disable-mono-tests",
+ "--enable-introspection=no",
+ "--with-gtk=3"
+ ],
+ "cleanup": [
+ "/include",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/share/gtk-doc",
+ "/share/gir-1.0"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/libappindicator/12.10/12.10.0/+download/libappindicator-12.10.0.tar.gz",
+ "sha256": "d5907c1f98084acf28fd19593cb70672caa0ca1cf82d747ba6f4830d4cc3b49f"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-ftbfs.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-no-python.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-fix-crash-from-incorrect-signal-emission.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-fix-crash-iterating-icon-themes.patch"
+ },
+ {
+ "type": "script",
+ "commands": ["autoreconf -sfi"],
+ "dest-filename": "autogen.sh"
+ }
+ ],
+ "modules": [
+ "../intltool/intltool-0.51.json",
+ "../dbus-glib/dbus-glib.json",
+ {
+ "name": "libdbusmenu",
+ "build-options": {
+ "cflags": "-Wno-error",
+ "env": {
+ "HAVE_VALGRIND_FALSE": "#",
+ "HAVE_VALGRIND_TRUE": ""
+ }
+ },
+ "cleanup": [
+ "/include",
+ "/libexec",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/share/doc",
+ "/share/libdbusmenu",
+ "/share/gtk-doc",
+ "/share/gir-1.0"
+ ],
+ "config-opts": [
+ "--disable-static",
+ "--disable-gtk-doc",
+ "--enable-introspection=no",
+ "--disable-vala",
+ "--disable-dumper",
+ "--disable-tests",
+ "--with-gtk=3"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/libdbusmenu/16.04/16.04.0/+download/libdbusmenu-16.04.0.tar.gz",
+ "sha256": "b9cc4a2acd74509435892823607d966d424bd9ad5d0b00938f27240a1bfa878a"
+ }
+ ]
+ },
+ {
+ "name": "libindicator",
+ "build-options": {
+ "cflags": "-Wno-error"
+ },
+ "cleanup": [
+ "/include",
+ "/libexec",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/share/libindicator",
+ "/share/gtk-doc",
+ "/share/gir-1.0"
+ ],
+ "config-opts": [
+ "--disable-static",
+ "--disable-tests",
+ "--with-gtk=3"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/libindicator/12.10/12.10.1/+download/libindicator-12.10.1.tar.gz",
+ "sha256": "b2d2e44c10313d5c9cd60db455d520f80b36dc39562df079a3f29495e8f9447f"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "# FTBFS fix",
+ "sed -e '/LIBINDICATOR_LIBS/ s/\\$LIBM/ $LIBM/' -i configure.ac"
+ ]
+ },
+ {
+ "type": "script",
+ "commands": ["autoreconf -sfi"],
+ "dest-filename": "autogen.sh"
+ }
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/libappindicator/libappindicator-gtk3-introspection-12.10.json b/subprojects/shared-modules/libappindicator/libappindicator-gtk3-introspection-12.10.json
new file mode 100644
index 00000000..c49742ed
--- /dev/null
+++ b/subprojects/shared-modules/libappindicator/libappindicator-gtk3-introspection-12.10.json
@@ -0,0 +1,130 @@
+{
+ "name": "libappindicator",
+ "build-options": {
+ "cflags": "-Wno-error",
+ "make-args": [ "-j1" ]
+ },
+ "rm-configure": true,
+ "config-opts": [
+ "--disable-static",
+ "--disable-gtk-doc",
+ "--disable-tests",
+ "--disable-mono-tests",
+ "--enable-introspection=yes",
+ "--with-gtk=3"
+ ],
+ "cleanup": [
+ "/include",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/share/gtk-doc",
+ "/share/gir-1.0"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/libappindicator/12.10/12.10.0/+download/libappindicator-12.10.0.tar.gz",
+ "sha256": "d5907c1f98084acf28fd19593cb70672caa0ca1cf82d747ba6f4830d4cc3b49f"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-ftbfs.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-no-python.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-fix-crash-from-incorrect-signal-emission.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-fix-crash-iterating-icon-themes.patch"
+ },
+ {
+ "type": "script",
+ "commands": ["autoreconf -sfi"],
+ "dest-filename": "autogen.sh"
+ }
+ ],
+ "modules": [
+ "../intltool/intltool-0.51.json",
+ "../dbus-glib/dbus-glib.json",
+ {
+ "name": "libdbusmenu",
+ "build-options": {
+ "cflags": "-Wno-error",
+ "env": {
+ "HAVE_VALGRIND_FALSE": "#",
+ "HAVE_VALGRIND_TRUE": ""
+ }
+ },
+ "cleanup": [
+ "/include",
+ "/libexec",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/share/doc",
+ "/share/libdbusmenu",
+ "/share/gtk-doc",
+ "/share/gir-1.0"
+ ],
+ "config-opts": [
+ "--disable-static",
+ "--disable-gtk-doc",
+ "--enable-introspection=yes",
+ "--disable-vala",
+ "--disable-dumper",
+ "--disable-tests",
+ "--with-gtk=3"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/libdbusmenu/16.04/16.04.0/+download/libdbusmenu-16.04.0.tar.gz",
+ "sha256": "b9cc4a2acd74509435892823607d966d424bd9ad5d0b00938f27240a1bfa878a"
+ }
+ ]
+ },
+ {
+ "name": "libindicator",
+ "build-options": {
+ "cflags": "-Wno-error"
+ },
+ "cleanup": [
+ "/include",
+ "/libexec",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/share/libindicator",
+ "/share/gtk-doc",
+ "/share/gir-1.0"
+ ],
+ "config-opts": [
+ "--disable-static",
+ "--disable-tests",
+ "--with-gtk=3"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/libindicator/12.10/12.10.1/+download/libindicator-12.10.1.tar.gz",
+ "sha256": "b2d2e44c10313d5c9cd60db455d520f80b36dc39562df079a3f29495e8f9447f"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "# FTBFS fix",
+ "sed -e '/LIBINDICATOR_LIBS/ s/\\$LIBM/ $LIBM/' -i configure.ac"
+ ]
+ },
+ {
+ "type": "script",
+ "commands": ["autoreconf -sfi"],
+ "dest-filename": "autogen.sh"
+ }
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/libappindicator/libappindicator-no-python.patch b/subprojects/shared-modules/libappindicator/libappindicator-no-python.patch
new file mode 100644
index 00000000..587cddec
--- /dev/null
+++ b/subprojects/shared-modules/libappindicator/libappindicator-no-python.patch
@@ -0,0 +1,888 @@
+diff --git a/bindings/Makefile.am b/bindings/Makefile.am
+index d1f6d73..dccca6c 100644
+--- a/bindings/Makefile.am
++++ b/bindings/Makefile.am
+@@ -3,7 +3,6 @@ SUBDIRS = \
+ vala
+ else
+ SUBDIRS = \
+- python \
+ vala
+ endif
+
+diff --git a/bindings/python/Makefile.am b/bindings/python/Makefile.am
+deleted file mode 100644
+index fe95c02..0000000
+--- a/bindings/python/Makefile.am
++++ /dev/null
+@@ -1,39 +0,0 @@
+-defsdir = $(datadir)/pygtk/2.0/defs
+-defs_DATA = appindicator.defs
+-
+-#CFLAGS = -Wall -Werror
+-INCLUDES = \
+- -I$(top_srcdir)/src \
+- -DG_LOG_DOMAIN=\"appindicator-python\" \
+- -DDATADIR=\"$(datadir)\" \
+- -DLIBDIR=\"$(libdir)\" \
+- $(APPINDICATOR_PYTHON_CFLAGS) \
+- $(PYTHON_INCLUDES)
+-
+-pkgpythondir = $(pyexecdir)
+-pkgpyexecdir = $(pyexecdir)
+-
+-pkgappindicatordir = $(pkgpythondir)/appindicator
+-pkgappindicator_PYTHON = __init__.py
+-
+-appindicatordir = $(pkgpyexecdir)/appindicator
+-appindicator_LTLIBRARIES = _appindicator.la
+-
+-_appindicator_la_LDFLAGS = -module -avoid-version -export-symbols-regex init_appindicator
+-_appindicator_la_LIBADD = $(APPINDICATOR_PYTHON_LIBS) -L$(top_builddir)/src/.libs -lappindicator
+-_appindicator_la_SOURCES = appindicatormodule.c
+-nodist__appindicator_la_SOURCES = appindicator.c
+-
+-CLEANFILES = appindicator.c
+-EXTRA_DIST = appindicator.override.in appindicator-arg-types.py $(defs_DATA)
+-appindicator.c: $(defs_DATA) appindicator.override
+-
+-%.c: %.defs
+- ($(PYGTK_CODEGEN) \
+- --register $(PYGTK_DEFSDIR)/gtk-types.defs \
+- --register $(PYGTK_DEFSDIR)/gdk-types.defs \
+- --load-types $(srcdir)/appindicator-arg-types.py \
+- --override $*.override \
+- --prefix py$* $(srcdir)/$*.defs) > gen-$*.c \
+- && cp gen-$*.c $*.c \
+- && rm -f gen-$*.c
+diff --git a/bindings/python/__init__.py b/bindings/python/__init__.py
+deleted file mode 100644
+index 20e2140..0000000
+--- a/bindings/python/__init__.py
++++ /dev/null
+@@ -1,27 +0,0 @@
+-# Python bindings for libappindicator.
+-#
+-# Copyright 2009 Canonical Ltd.
+-#
+-# Authors:
+-# Eitan Isaacson <eitan@ascender.com>
+-# Neil Jagdish Patel <neil.patel@canonical.com>
+-#
+-# This program is free software: you can redistribute it and/or modify it
+-# under the terms of either or both of the following licenses:
+-#
+-# 1) the GNU Lesser General Public License version 3, as published by the
+-# Free Software Foundation; and/or
+-# 2) the GNU Lesser General Public License version 2.1, as published by
+-# the Free Software Foundation.
+-#
+-# This program is distributed in the hope that it will be useful, but
+-# WITHOUT ANY WARRANTY; without even the implied warranties of
+-# MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
+-# PURPOSE. See the applicable version of the GNU Lesser General Public
+-# License for more details.
+-#
+-# You should have received a copy of both the GNU Lesser General Public
+-# License version 3 and version 2.1 along with this program. If not, see
+-# <http://www.gnu.org/licenses/>
+-
+-from _appindicator import *
+diff --git a/bindings/python/appindicator-arg-types.py b/bindings/python/appindicator-arg-types.py
+deleted file mode 100644
+index 9d74aa0..0000000
+--- a/bindings/python/appindicator-arg-types.py
++++ /dev/null
+@@ -1,27 +0,0 @@
+-# Python bindings for libappindicator.
+-#
+-# Copyright 2009 Canonical Ltd.
+-#
+-# Authors:
+-# Eitan Isaacson <eitan@ascender.com>
+-#
+-# This program is free software: you can redistribute it and/or modify it
+-# under the terms of either or both of the following licenses:
+-#
+-# 1) the GNU Lesser General Public License version 3, as published by the
+-# Free Software Foundation; and/or
+-# 2) the GNU Lesser General Public License version 2.1, as published by
+-# the Free Software Foundation.
+-#
+-# This program is distributed in the hope that it will be useful, but
+-# WITHOUT ANY WARRANTY; without even the implied warranties of
+-# MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
+-# PURPOSE. See the applicable version of the GNU Lesser General Public
+-# License for more details.
+-#
+-# You should have received a copy of both the GNU Lesser General Public
+-# License version 3 and version 2.1 along with this program. If not, see
+-# <http://www.gnu.org/licenses/>
+-
+-import argtypes
+-
+diff --git a/bindings/python/appindicator.defs b/bindings/python/appindicator.defs
+deleted file mode 100644
+index 4fcc2d5..0000000
+--- a/bindings/python/appindicator.defs
++++ /dev/null
+@@ -1,200 +0,0 @@
+-;; -*- scheme -*-
+-; object definitions ...
+-(define-object Indicator
+- (in-module "App")
+- (parent "GObject")
+- (c-name "AppIndicator")
+- (gtype-id "APP_TYPE_INDICATOR")
+-)
+-
+-;; Enumerations and flags ...
+-
+-(define-enum IndicatorCategory
+- (in-module "App")
+- (c-name "AppIndicatorCategory")
+- (gtype-id "APP_INDICATOR_TYPE_INDICATOR_CATEGORY")
+- (values
+- '("ApplicationStatus" "APP_INDICATOR_CATEGORY_APPLICATION_STATUS")
+- '("Communications" "APP_INDICATOR_CATEGORY_COMMUNICATIONS")
+- '("SystemServices" "APP_INDICATOR_CATEGORY_SYSTEM_SERVICES")
+- '("Hardware" "APP_INDICATOR_CATEGORY_HARDWARE")
+- '("Other" "APP_INDICATOR_CATEGORY_OTHER")
+- )
+-)
+-
+-(define-enum IndicatorStatus
+- (in-module "App")
+- (c-name "AppIndicatorStatus")
+- (gtype-id "APP_INDICATOR_TYPE_INDICATOR_STATUS")
+- (values
+- '("Passive" "APP_INDICATOR_STATUS_PASSIVE")
+- '("Active" "APP_INDICATOR_STATUS_ACTIVE")
+- '("NeedsAttention" "APP_INDICATOR_STATUS_ATTENTION")
+- )
+-)
+-
+-;; From app-indicator.h
+-
+-(define-function app_indicator_get_type
+- (c-name "app_indicator_get_type")
+- (return-type "GType")
+-)
+-
+-(define-function app_indicator_new_with_path
+- (c-name "app_indicator_new_with_path")
+- (is-constructor-of "AppIndicator")
+- (return-type "AppIndicator*")
+- (parameters
+- '("const-gchar*" "id")
+- '("const-gchar*" "icon_name")
+- '("AppIndicatorCategory" "category")
+- '("const-gchar*" "icon_theme_path" (null-ok) (default "NULL"))
+- )
+-)
+-
+-(define-method set_status
+- (of-object "AppIndicator")
+- (c-name "app_indicator_set_status")
+- (return-type "none")
+- (parameters
+- '("AppIndicatorStatus" "status")
+- )
+-)
+-
+-(define-method set_attention_icon
+- (of-object "AppIndicator")
+- (c-name "app_indicator_set_attention_icon_full")
+- (return-type "none")
+- (parameters
+- '("const-gchar*" "icon_name")
+- '("const-gchar*" "icon_desc" (null-ok) (default "NULL"))
+- )
+-)
+-
+-(define-method set_menu
+- (of-object "AppIndicator")
+- (c-name "app_indicator_set_menu")
+- (return-type "none")
+- (parameters
+- '("GtkMenu*" "menu")
+- )
+-)
+-
+-(define-method set_icon
+- (of-object "AppIndicator")
+- (c-name "app_indicator_set_icon_full")
+- (return-type "none")
+- (parameters
+- '("const-gchar*" "icon_name")
+- '("const-gchar*" "icon_desc" (null-ok) (default "NULL"))
+- )
+-)
+-
+-(define-method set_label
+- (of-object "AppIndicator")
+- (c-name "app_indicator_set_label")
+- (return-type "none")
+- (parameters
+- '("const-gchar*" "label" (null-ok))
+- '("const-gchar*" "guide" (null-ok) (default "NULL"))
+- )
+-)
+-
+-(define-method set_ordering_index
+- (of-object "AppIndicator")
+- (c-name "app_indicator_set_ordering_index")
+- (parameters
+- '("guint32" "ordering_index")
+- )
+-)
+-
+-(define-method set_icon_theme_path
+- (of-object "AppIndicator")
+- (c-name "app_indicator_set_icon_theme_path")
+- (return-type "none")
+- (parameters
+- '("const-gchar*" "icon_theme_path" (null-ok))
+- )
+-)
+-
+-(define-method get_id
+- (of-object "AppIndicator")
+- (c-name "app_indicator_get_id")
+- (return-type "const-gchar*")
+-)
+-
+-(define-method get_category
+- (of-object "AppIndicator")
+- (c-name "app_indicator_get_category")
+- (return-type "AppIndicatorCategory")
+-)
+-
+-(define-method get_status
+- (of-object "AppIndicator")
+- (c-name "app_indicator_get_status")
+- (return-type "AppIndicatorStatus")
+-)
+-
+-(define-method get_icon
+- (of-object "AppIndicator")
+- (c-name "app_indicator_get_icon")
+- (return-type "const-gchar*")
+-)
+-
+-(define-method get_icon_desc
+- (of-object "AppIndicator")
+- (c-name "app_indicator_get_icon_desc")
+- (return-type "const-gchar*")
+-)
+-
+-(define-method get_icon_theme_path
+- (of-object "AppIndicator")
+- (c-name "app_indicator_get_icon_theme_path")
+- (return-type "const-gchar*")
+-)
+-
+-(define-method get_attention_icon
+- (of-object "AppIndicator")
+- (c-name "app_indicator_get_attention_icon")
+- (return-type "const-gchar*")
+-)
+-
+-(define-method get_attention_icon_desc
+- (of-object "AppIndicator")
+- (c-name "app_indicator_get_attention_icon_desc")
+- (return-type "const-gchar*")
+-)
+-
+-(define-method get_menu
+- (of-object "AppIndicator")
+- (c-name "app_indicator_get_menu")
+- (return-type "GtkMenu*")
+-)
+-
+-(define-method get_label
+- (of-object "AppIndicator")
+- (c-name "app_indicator_get_label")
+- (return-type "const-gchar*")
+-)
+-
+-(define-method get_label_guide
+- (of-object "AppIndicator")
+- (c-name "app_indicator_get_label_guide")
+- (return-type "const-gchar*")
+-)
+-
+-(define-method get_ordering_index
+- (of-object "AppIndicator")
+- (c-name "app_indicator_get_ordering_index")
+- (return-type "guint32")
+-)
+-
+-(define-method build_menu_from_desktop
+- (of-object "AppIndicator")
+- (c-name "app_indicator_build_menu_from_desktop")
+- (return-type "none")
+- (parameters
+- '("const-gchar*" "desktop_file")
+- '("const-gchar*" "desktop_profile")
+- )
+-)
+diff --git a/bindings/python/appindicator.override.in b/bindings/python/appindicator.override.in
+deleted file mode 100644
+index 84d3159..0000000
+--- a/bindings/python/appindicator.override.in
++++ /dev/null
+@@ -1,65 +0,0 @@
+-/*
+-Python bindings for libappindicator.
+-
+-Copyright 2009 Canonical Ltd.
+-
+-Authors:
+- Eitan Isaacson <eitan@ascender.com> (original)
+- Neil Jagdish Patel <neil.patel@canonical.com>
+-
+-This program is free software: you can redistribute it and/or modify it
+-under the terms of either or both of the following licenses:
+-
+-1) the GNU Lesser General Public License version 3, as published by the
+-Free Software Foundation; and/or
+-2) the GNU Lesser General Public License version 2.1, as published by
+-the Free Software Foundation.
+-
+-This program is distributed in the hope that it will be useful, but
+-WITHOUT ANY WARRANTY; without even the implied warranties of
+-MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
+-PURPOSE. See the applicable version of the GNU Lesser General Public
+-License for more details.
+-
+-You should have received a copy of both the GNU Lesser General Public
+-License version 3 and version 2.1 along with this program. If not, see
+-<http://www.gnu.org/licenses/>
+-*/
+-%%
+-headers
+-#include <Python.h>
+-#include "@top_srcdir@/src/app-indicator.h"
+-#include "@top_builddir@/src/app-indicator-enum-types.h"
+-#include <glib.h>
+-#include "pygobject.h"
+-#include "pyglib.h"
+-#include <pygtk/pygtk.h>
+-
+-typedef PyObject* (*to_pyobject_func) (gpointer data);
+-
+-#define APP_TYPE_INDICATOR APP_INDICATOR_TYPE
+-
+-void
+-_appindicator_add_constants(PyObject *module, const gchar *strip_prefix)
+-{
+-#ifdef VERSION
+- PyModule_AddStringConstant(module, "__version__", VERSION);
+-#endif
+- pyg_enum_add(module,
+- "IndicatorCategory",
+- strip_prefix,
+- APP_INDICATOR_TYPE_INDICATOR_CATEGORY);
+-
+- pyg_enum_add(module,
+- "IndicatorStatus",
+- strip_prefix,
+- APP_INDICATOR_TYPE_INDICATOR_STATUS);
+-
+- if (PyErr_Occurred())
+- PyErr_Print();
+-}
+-%%
+-modulename appindicator
+-%%
+-import gobject.GObject as PyGObject_Type
+-import gtk.Menu as PyGtkMenu_Type
+diff --git a/bindings/python/appindicatormodule.c b/bindings/python/appindicatormodule.c
+deleted file mode 100644
+index b66639c..0000000
+--- a/bindings/python/appindicatormodule.c
++++ /dev/null
+@@ -1,49 +0,0 @@
+-/*
+-Python bindings for libappindicator.
+-
+-Copyright 2009 Canonical Ltd.
+-
+-Authors:
+- Eitan Isaacson <eitan@ascender.com>
+- Neil Jagdish Patel <neil.patel@canonical.com>
+-
+-This program is free software: you can redistribute it and/or modify it
+-under the terms of either or both of the following licenses:
+-
+-1) the GNU Lesser General Public License version 3, as published by the
+-Free Software Foundation; and/or
+-2) the GNU Lesser General Public License version 2.1, as published by
+-the Free Software Foundation.
+-
+-This program is distributed in the hope that it will be useful, but
+-WITHOUT ANY WARRANTY; without even the implied warranties of
+-MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
+-PURPOSE. See the applicable version of the GNU Lesser General Public
+-License for more details.
+-
+-You should have received a copy of both the GNU Lesser General Public
+-License version 3 and version 2.1 along with this program. If not, see
+-<http://www.gnu.org/licenses/>
+-*/
+-#include <pygobject.h>
+-
+-void pyappindicator_register_classes (PyObject *d);
+-extern PyMethodDef pyappindicator_functions[];
+-
+-DL_EXPORT(void)
+-init_appindicator(void)
+-{
+- PyObject *m, *d;
+-
+- init_pygobject ();
+-
+- m = Py_InitModule ("_appindicator", pyappindicator_functions);
+- d = PyModule_GetDict (m);
+-
+- pyappindicator_register_classes (d);
+-
+- _appindicator_add_constants (m, "APP_INDICATOR_");
+- if (PyErr_Occurred ()) {
+- Py_FatalError ("can't initialise module appindicator");
+- }
+-}
+diff --git a/configure b/configure
+index 5174b3f..8ff732c 100755
+--- a/configure
++++ b/configure
+@@ -13703,363 +13703,6 @@ else
+ fi
+
+
+-###########################
+-# Python
+-###########################
+-
+-PYGTK_REQUIRED=2.14.0
+-PYGOBJECT_REQUIRED=0.22
+-
+-
+-
+-
+-
+- if test -n "$PYTHON"; then
+- # If the user set $PYTHON, use it and don't search something else.
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version >= 2.3.5" >&5
+-$as_echo_n "checking whether $PYTHON version >= 2.3.5... " >&6; }
+- prog="import sys, string
+-# split strings by '.' and convert to numeric. Append some zeros
+-# because we need at least 4 digits for the hex conversion.
+-minver = map(int, string.split('2.3.5', '.')) + [0, 0, 0]
+-minverhex = 0
+-for i in xrange(0, 4): minverhex = (minverhex << 8) + minver[i]
+-sys.exit(sys.hexversion < minverhex)"
+- if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5
+- ($PYTHON -c "$prog") >&5 2>&5
+- ac_status=$?
+- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+- (exit $ac_status); }; then :
+- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+-$as_echo "yes" >&6; }
+-else
+- as_fn_error $? "too old" "$LINENO" 5
+-fi
+- am_display_PYTHON=$PYTHON
+- else
+- # Otherwise, try each interpreter until we find one that satisfies
+- # VERSION.
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 2.3.5" >&5
+-$as_echo_n "checking for a Python interpreter with version >= 2.3.5... " >&6; }
+-if ${am_cv_pathless_PYTHON+:} false; then :
+- $as_echo_n "(cached) " >&6
+-else
+-
+- for am_cv_pathless_PYTHON in python python2 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5 none; do
+- test "$am_cv_pathless_PYTHON" = none && break
+- prog="import sys, string
+-# split strings by '.' and convert to numeric. Append some zeros
+-# because we need at least 4 digits for the hex conversion.
+-minver = map(int, string.split('2.3.5', '.')) + [0, 0, 0]
+-minverhex = 0
+-for i in xrange(0, 4): minverhex = (minverhex << 8) + minver[i]
+-sys.exit(sys.hexversion < minverhex)"
+- if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5
+- ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5
+- ac_status=$?
+- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+- (exit $ac_status); }; then :
+- break
+-fi
+- done
+-fi
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5
+-$as_echo "$am_cv_pathless_PYTHON" >&6; }
+- # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
+- if test "$am_cv_pathless_PYTHON" = none; then
+- PYTHON=:
+- else
+- # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args.
+-set dummy $am_cv_pathless_PYTHON; ac_word=$2
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+-$as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_path_PYTHON+:} false; then :
+- $as_echo_n "(cached) " >&6
+-else
+- case $PYTHON in
+- [\\/]* | ?:[\\/]*)
+- ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
+- ;;
+- *)
+- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+-for as_dir in $PATH
+-do
+- IFS=$as_save_IFS
+- test -z "$as_dir" && as_dir=.
+- for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+- ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
+- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+- break 2
+- fi
+-done
+- done
+-IFS=$as_save_IFS
+-
+- ;;
+-esac
+-fi
+-PYTHON=$ac_cv_path_PYTHON
+-if test -n "$PYTHON"; then
+- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
+-$as_echo "$PYTHON" >&6; }
+-else
+- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+-$as_echo "no" >&6; }
+-fi
+-
+-
+- fi
+- am_display_PYTHON=$am_cv_pathless_PYTHON
+- fi
+-
+-
+- if test "$PYTHON" = :; then
+- as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5
+- else
+-
+-
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5
+-$as_echo_n "checking for $am_display_PYTHON version... " >&6; }
+-if ${am_cv_python_version+:} false; then :
+- $as_echo_n "(cached) " >&6
+-else
+- am_cv_python_version=`$PYTHON -c "import sys; print sys.version[:3]"`
+-fi
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5
+-$as_echo "$am_cv_python_version" >&6; }
+- PYTHON_VERSION=$am_cv_python_version
+-
+-
+-
+- PYTHON_PREFIX='${prefix}'
+-
+- PYTHON_EXEC_PREFIX='${exec_prefix}'
+-
+-
+-
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5
+-$as_echo_n "checking for $am_display_PYTHON platform... " >&6; }
+-if ${am_cv_python_platform+:} false; then :
+- $as_echo_n "(cached) " >&6
+-else
+- am_cv_python_platform=`$PYTHON -c "import sys; print sys.platform"`
+-fi
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5
+-$as_echo "$am_cv_python_platform" >&6; }
+- PYTHON_PLATFORM=$am_cv_python_platform
+-
+-
+-
+-
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5
+-$as_echo_n "checking for $am_display_PYTHON script directory... " >&6; }
+-if ${am_cv_python_pythondir+:} false; then :
+- $as_echo_n "(cached) " >&6
+-else
+- am_cv_python_pythondir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(0,0,prefix='$PYTHON_PREFIX')" 2>/dev/null ||
+- echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"`
+-fi
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5
+-$as_echo "$am_cv_python_pythondir" >&6; }
+- pythondir=$am_cv_python_pythondir
+-
+-
+-
+- pkgpythondir=\${pythondir}/$PACKAGE
+-
+-
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5
+-$as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; }
+-if ${am_cv_python_pyexecdir+:} false; then :
+- $as_echo_n "(cached) " >&6
+-else
+- am_cv_python_pyexecdir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(1,0,prefix='$PYTHON_EXEC_PREFIX')" 2>/dev/null ||
+- echo "${PYTHON_EXEC_PREFIX}/lib/python${PYTHON_VERSION}/site-packages"`
+-fi
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5
+-$as_echo "$am_cv_python_pyexecdir" >&6; }
+- pyexecdir=$am_cv_python_pyexecdir
+-
+-
+-
+- pkgpyexecdir=\${pyexecdir}/$PACKAGE
+-
+-
+-
+- fi
+-
+-
+-
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for headers required to compile python extensions" >&5
+-$as_echo_n "checking for headers required to compile python extensions... " >&6; }
+-py_prefix=`$PYTHON -c "import sys; print sys.prefix"`
+-py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"`
+-PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}"
+-if test "$py_prefix" != "$py_exec_prefix"; then
+- PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}"
+-fi
+-
+-save_CPPFLAGS="$CPPFLAGS"
+-CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES"
+-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h. */
+-#include <Python.h>
+-_ACEOF
+-if ac_fn_c_try_cpp "$LINENO"; then :
+- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+-$as_echo "found" >&6; }
+-
+-else
+- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+-$as_echo "not found" >&6; }
+-as_fn_error $? "could not find Python headers" "$LINENO" 5
+-fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
+-CPPFLAGS="$save_CPPFLAGS"
+-
+-
+-
+-pkg_failed=no
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for APPINDICATOR_PYTHON" >&5
+-$as_echo_n "checking for APPINDICATOR_PYTHON... " >&6; }
+-
+-if test -n "$APPINDICATOR_PYTHON_CFLAGS"; then
+- pkg_cv_APPINDICATOR_PYTHON_CFLAGS="$APPINDICATOR_PYTHON_CFLAGS"
+- elif test -n "$PKG_CONFIG"; then
+- if test -n "$PKG_CONFIG" && \
+- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"
+- pygtk-2.0 >= \$PYGTK_REQUIRED
+- gtk+-2.0 >= \$GTK_REQUIRED_VERSION
+- pygobject-2.0 >= \$PYGOBJECT_REQUIRED
+- \""; } >&5
+- ($PKG_CONFIG --exists --print-errors "
+- pygtk-2.0 >= $PYGTK_REQUIRED
+- gtk+-2.0 >= $GTK_REQUIRED_VERSION
+- pygobject-2.0 >= $PYGOBJECT_REQUIRED
+- ") 2>&5
+- ac_status=$?
+- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+- test $ac_status = 0; }; then
+- pkg_cv_APPINDICATOR_PYTHON_CFLAGS=`$PKG_CONFIG --cflags "
+- pygtk-2.0 >= $PYGTK_REQUIRED
+- gtk+-2.0 >= $GTK_REQUIRED_VERSION
+- pygobject-2.0 >= $PYGOBJECT_REQUIRED
+- " 2>/dev/null`
+- test "x$?" != "x0" && pkg_failed=yes
+-else
+- pkg_failed=yes
+-fi
+- else
+- pkg_failed=untried
+-fi
+-if test -n "$APPINDICATOR_PYTHON_LIBS"; then
+- pkg_cv_APPINDICATOR_PYTHON_LIBS="$APPINDICATOR_PYTHON_LIBS"
+- elif test -n "$PKG_CONFIG"; then
+- if test -n "$PKG_CONFIG" && \
+- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"
+- pygtk-2.0 >= \$PYGTK_REQUIRED
+- gtk+-2.0 >= \$GTK_REQUIRED_VERSION
+- pygobject-2.0 >= \$PYGOBJECT_REQUIRED
+- \""; } >&5
+- ($PKG_CONFIG --exists --print-errors "
+- pygtk-2.0 >= $PYGTK_REQUIRED
+- gtk+-2.0 >= $GTK_REQUIRED_VERSION
+- pygobject-2.0 >= $PYGOBJECT_REQUIRED
+- ") 2>&5
+- ac_status=$?
+- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+- test $ac_status = 0; }; then
+- pkg_cv_APPINDICATOR_PYTHON_LIBS=`$PKG_CONFIG --libs "
+- pygtk-2.0 >= $PYGTK_REQUIRED
+- gtk+-2.0 >= $GTK_REQUIRED_VERSION
+- pygobject-2.0 >= $PYGOBJECT_REQUIRED
+- " 2>/dev/null`
+- test "x$?" != "x0" && pkg_failed=yes
+-else
+- pkg_failed=yes
+-fi
+- else
+- pkg_failed=untried
+-fi
+-
+-
+-
+-if test $pkg_failed = yes; then
+- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+-$as_echo "no" >&6; }
+-
+-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+- _pkg_short_errors_supported=yes
+-else
+- _pkg_short_errors_supported=no
+-fi
+- if test $_pkg_short_errors_supported = yes; then
+- APPINDICATOR_PYTHON_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "
+- pygtk-2.0 >= $PYGTK_REQUIRED
+- gtk+-2.0 >= $GTK_REQUIRED_VERSION
+- pygobject-2.0 >= $PYGOBJECT_REQUIRED
+- " 2>&1`
+- else
+- APPINDICATOR_PYTHON_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "
+- pygtk-2.0 >= $PYGTK_REQUIRED
+- gtk+-2.0 >= $GTK_REQUIRED_VERSION
+- pygobject-2.0 >= $PYGOBJECT_REQUIRED
+- " 2>&1`
+- fi
+- # Put the nasty error message in config.log where it belongs
+- echo "$APPINDICATOR_PYTHON_PKG_ERRORS" >&5
+-
+- as_fn_error $? "Package requirements (
+- pygtk-2.0 >= $PYGTK_REQUIRED
+- gtk+-2.0 >= $GTK_REQUIRED_VERSION
+- pygobject-2.0 >= $PYGOBJECT_REQUIRED
+- ) were not met:
+-
+-$APPINDICATOR_PYTHON_PKG_ERRORS
+-
+-Consider adjusting the PKG_CONFIG_PATH environment variable if you
+-installed software in a non-standard prefix.
+-
+-Alternatively, you may set the environment variables APPINDICATOR_PYTHON_CFLAGS
+-and APPINDICATOR_PYTHON_LIBS to avoid the need to call pkg-config.
+-See the pkg-config man page for more details." "$LINENO" 5
+-elif test $pkg_failed = untried; then
+- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+-$as_echo "no" >&6; }
+- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
+-is in your PATH or set the PKG_CONFIG environment variable to the full
+-path to pkg-config.
+-
+-Alternatively, you may set the environment variables APPINDICATOR_PYTHON_CFLAGS
+-and APPINDICATOR_PYTHON_LIBS to avoid the need to call pkg-config.
+-See the pkg-config man page for more details.
+-
+-To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+-See \`config.log' for more details" "$LINENO" 5; }
+-else
+- APPINDICATOR_PYTHON_CFLAGS=$pkg_cv_APPINDICATOR_PYTHON_CFLAGS
+- APPINDICATOR_PYTHON_LIBS=$pkg_cv_APPINDICATOR_PYTHON_LIBS
+- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+-$as_echo "yes" >&6; }
+-
+-fi
+-
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pygtk defs" >&5
+-$as_echo_n "checking for pygtk defs... " >&6; }
+-PYGTK_DEFSDIR=`$PKG_CONFIG --variable=defsdir pygtk-2.0`
+-
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYGTK_DEFSDIR" >&5
+-$as_echo "$PYGTK_DEFSDIR" >&6; }
+-
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pygtk codegen" >&5
+-$as_echo_n "checking for pygtk codegen... " >&6; }
+-PYGTK_CODEGEN="$PYTHON `$PKG_CONFIG --variable=codegendir pygtk-2.0`/codegen.py"
+-
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYGTK_CODEGEN" >&5
+-$as_echo "$PYGTK_CODEGEN" >&6; }
+
+ #########################
+ # Check if build tests
+@@ -14358,7 +14001,7 @@ fi
+ # Files
+ ###########################
+
+-ac_config_files="$ac_config_files Makefile src/Makefile src/appindicator-0.1.pc src/appindicator3-0.1.pc bindings/Makefile bindings/python/Makefile bindings/python/appindicator.override bindings/vala/Makefile bindings/vala/examples/Makefile tests/Makefile example/Makefile docs/Makefile docs/reference/Makefile docs/reference/version.xml docs/reference/libappindicator-docs.sgml"
++ac_config_files="$ac_config_files Makefile src/Makefile src/appindicator-0.1.pc src/appindicator3-0.1.pc bindings/Makefile bindings/vala/Makefile bindings/vala/examples/Makefile tests/Makefile example/Makefile docs/Makefile docs/reference/Makefile docs/reference/version.xml docs/reference/libappindicator-docs.sgml"
+
+
+ if test "x$has_mono" = "xtrue" ; then
+@@ -15437,8 +15080,6 @@ do
+ "src/appindicator-0.1.pc") CONFIG_FILES="$CONFIG_FILES src/appindicator-0.1.pc" ;;
+ "src/appindicator3-0.1.pc") CONFIG_FILES="$CONFIG_FILES src/appindicator3-0.1.pc" ;;
+ "bindings/Makefile") CONFIG_FILES="$CONFIG_FILES bindings/Makefile" ;;
+- "bindings/python/Makefile") CONFIG_FILES="$CONFIG_FILES bindings/python/Makefile" ;;
+- "bindings/python/appindicator.override") CONFIG_FILES="$CONFIG_FILES bindings/python/appindicator.override" ;;
+ "bindings/vala/Makefile") CONFIG_FILES="$CONFIG_FILES bindings/vala/Makefile" ;;
+ "bindings/vala/examples/Makefile") CONFIG_FILES="$CONFIG_FILES bindings/vala/examples/Makefile" ;;
+ "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+diff --git a/configure.ac b/configure.ac
+index ee03390..4713b22 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -181,33 +181,6 @@ AM_CONDITIONAL(BUILD_MONO_TEST, test x${have_nunit} = xyes)
+ with_localinstall="no"
+ AC_ARG_ENABLE(localinstall, AS_HELP_STRING([--enable-localinstall], [install all of the files localy instead of system directories (for distcheck)]), with_localinstall=$enableval, with_localinstall=no)
+
+-###########################
+-# Python
+-###########################
+-
+-PYGTK_REQUIRED=2.14.0
+-PYGOBJECT_REQUIRED=0.22
+-
+-AM_PATH_PYTHON(2.3.5)
+-AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(could not find Python headers)])
+-
+-PKG_CHECK_MODULES(APPINDICATOR_PYTHON,
+- [
+- pygtk-2.0 >= $PYGTK_REQUIRED
+- gtk+-2.0 >= $GTK_REQUIRED_VERSION
+- pygobject-2.0 >= $PYGOBJECT_REQUIRED
+- ])
+-
+-AC_MSG_CHECKING(for pygtk defs)
+-PYGTK_DEFSDIR=`$PKG_CONFIG --variable=defsdir pygtk-2.0`
+-AC_SUBST(PYGTK_DEFSDIR)
+-AC_MSG_RESULT($PYGTK_DEFSDIR)
+-
+-AC_MSG_CHECKING(for pygtk codegen)
+-PYGTK_CODEGEN="$PYTHON `$PKG_CONFIG --variable=codegendir pygtk-2.0`/codegen.py"
+-AC_SUBST(PYGTK_CODEGEN)
+-AC_MSG_RESULT($PYGTK_CODEGEN)
+-
+ #########################
+ # Check if build tests
+ #########################
+@@ -239,8 +212,6 @@ src/Makefile
+ src/appindicator-0.1.pc
+ src/appindicator3-0.1.pc
+ bindings/Makefile
+-bindings/python/Makefile
+-bindings/python/appindicator.override
+ bindings/vala/Makefile
+ bindings/vala/examples/Makefile
+ tests/Makefile \ No newline at end of file
diff --git a/subprojects/shared-modules/libappindicator/libappindicator.json.in b/subprojects/shared-modules/libappindicator/libappindicator.json.in
new file mode 100644
index 00000000..3e53a81a
--- /dev/null
+++ b/subprojects/shared-modules/libappindicator/libappindicator.json.in
@@ -0,0 +1,130 @@
+{
+ "name": "libappindicator",
+ "build-options": {
+ "cflags": "-Wno-error",
+ "make-args": [ "-j1" ]
+ },
+ "rm-configure": true,
+ "config-opts": [
+ "--disable-static",
+ "--disable-gtk-doc",
+ "--disable-tests",
+ "--disable-mono-tests",
+ "--enable-introspection=@INTROSPECTION@",
+ "--with-gtk=@GTK_VER@"
+ ],
+ "cleanup": [
+ "/include",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/share/gtk-doc",
+ "/share/gir-1.0"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/libappindicator/12.10/12.10.0/+download/libappindicator-12.10.0.tar.gz",
+ "sha256": "d5907c1f98084acf28fd19593cb70672caa0ca1cf82d747ba6f4830d4cc3b49f"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-ftbfs.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-no-python.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-fix-crash-from-incorrect-signal-emission.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libappindicator-fix-crash-iterating-icon-themes.patch"
+ },
+ {
+ "type": "script",
+ "commands": ["autoreconf -sfi"],
+ "dest-filename": "autogen.sh"
+ }
+ ],
+ "modules": [
+ "../intltool/intltool-0.51.json",
+ "../dbus-glib/dbus-glib.json",
+ {
+ "name": "libdbusmenu",
+ "build-options": {
+ "cflags": "-Wno-error",
+ "env": {
+ "HAVE_VALGRIND_FALSE": "#",
+ "HAVE_VALGRIND_TRUE": ""
+ }
+ },
+ "cleanup": [
+ "/include",
+ "/libexec",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/share/doc",
+ "/share/libdbusmenu",
+ "/share/gtk-doc",
+ "/share/gir-1.0"
+ ],
+ "config-opts": [
+ "--disable-static",
+ "--disable-gtk-doc",
+ "--enable-introspection=@INTROSPECTION@",
+ "--disable-vala",
+ "--disable-dumper",
+ "--disable-tests",
+ "--with-gtk=@GTK_VER@"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/libdbusmenu/16.04/16.04.0/+download/libdbusmenu-16.04.0.tar.gz",
+ "sha256": "b9cc4a2acd74509435892823607d966d424bd9ad5d0b00938f27240a1bfa878a"
+ }
+ ]
+ },
+ {
+ "name": "libindicator",
+ "build-options": {
+ "cflags": "-Wno-error"
+ },
+ "cleanup": [
+ "/include",
+ "/libexec",
+ "/lib/pkgconfig",
+ "/lib/*.la",
+ "/share/libindicator",
+ "/share/gtk-doc",
+ "/share/gir-1.0"
+ ],
+ "config-opts": [
+ "--disable-static",
+ "--disable-tests",
+ "--with-gtk=@GTK_VER@"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://launchpad.net/libindicator/12.10/12.10.1/+download/libindicator-12.10.1.tar.gz",
+ "sha256": "b2d2e44c10313d5c9cd60db455d520f80b36dc39562df079a3f29495e8f9447f"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "# FTBFS fix",
+ "sed -e '/LIBINDICATOR_LIBS/ s/\\$LIBM/ $LIBM/' -i configure.ac"
+ ]
+ },
+ {
+ "type": "script",
+ "commands": ["autoreconf -sfi"],
+ "dest-filename": "autogen.sh"
+ }
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/libcanberra/0001-gtk-Don-t-assume-all-GdkDisplays-are-GdkX11Displays-.patch b/subprojects/shared-modules/libcanberra/0001-gtk-Don-t-assume-all-GdkDisplays-are-GdkX11Displays-.patch
new file mode 100644
index 00000000..763c3a99
--- /dev/null
+++ b/subprojects/shared-modules/libcanberra/0001-gtk-Don-t-assume-all-GdkDisplays-are-GdkX11Displays-.patch
@@ -0,0 +1,123 @@
+From d6dd5cdf45c1aac6c0519c8a4f5f89321770fb53 Mon Sep 17 00:00:00 2001
+From: Michael Meeks <michael.meeks@suse.com>
+Date: Fri, 9 Nov 2012 16:16:40 +0000
+Subject: [PATCH] gtk: Don't assume all GdkDisplays are GdkX11Displays:
+ broadway/wayland
+
+Co-Authored-By: Bastien Nocera <hadess@hadess.net>
+---
+ src/canberra-gtk-module.c | 15 +++++++++++++++
+ src/canberra-gtk.c | 28 ++++++++++++++++++++++------
+ 2 files changed, 37 insertions(+), 6 deletions(-)
+
+diff --git a/src/canberra-gtk-module.c b/src/canberra-gtk-module.c
+index 67791f0..c1532ab 100644
+--- a/src/canberra-gtk-module.c
++++ b/src/canberra-gtk-module.c
+@@ -307,6 +307,11 @@ static gint window_get_desktop(GdkDisplay *d, GdkWindow *w) {
+ guchar *data = NULL;
+ gint ret = -1;
+
++#ifdef GDK_IS_X11_DISPLAY
++ if (!GDK_IS_X11_DISPLAY(d))
++ return 0;
++#endif
++
+ if (XGetWindowProperty(GDK_DISPLAY_XDISPLAY(d), GDK_WINDOW_XID(w),
+ gdk_x11_get_xatom_by_name_for_display(d, "_NET_WM_DESKTOP"),
+ 0, G_MAXLONG, False, XA_CARDINAL, &type_return,
+@@ -335,6 +340,11 @@ static gint display_get_desktop(GdkDisplay *d) {
+ guchar *data = NULL;
+ gint ret = -1;
+
++#ifdef GDK_IS_X11_DISPLAY
++ if (!GDK_IS_X11_DISPLAY(d))
++ return 0;
++#endif
++
+ if (XGetWindowProperty(GDK_DISPLAY_XDISPLAY(d), DefaultRootWindow(GDK_DISPLAY_XDISPLAY(d)),
+ gdk_x11_get_xatom_by_name_for_display(d, "_NET_CURRENT_DESKTOP"),
+ 0, G_MAXLONG, False, XA_CARDINAL, &type_return,
+@@ -365,6 +375,11 @@ static gboolean window_is_xembed(GdkDisplay *d, GdkWindow *w) {
+ gboolean ret = FALSE;
+ Atom xembed;
+
++#ifdef GDK_IS_X11_DISPLAY
++ if (!GDK_IS_X11_DISPLAY(d))
++ return FALSE;
++#endif
++
+ /* Gnome Panel applets are XEMBED windows. We need to make sure we
+ * ignore them */
+
+diff --git a/src/canberra-gtk.c b/src/canberra-gtk.c
+index 34446f5..47285f8 100644
+--- a/src/canberra-gtk.c
++++ b/src/canberra-gtk.c
+@@ -185,6 +185,11 @@ static gint window_get_desktop(GdkDisplay *d, GdkWindow *w) {
+ guchar *data = NULL;
+ gint ret = -1;
+
++#ifdef GDK_IS_X11_DISPLAY
++ if (!GDK_IS_X11_DISPLAY(d))
++ return 0;
++#endif
++
+ if (XGetWindowProperty(GDK_DISPLAY_XDISPLAY(d), GDK_WINDOW_XID(w),
+ gdk_x11_get_xatom_by_name_for_display(d, "_NET_WM_DESKTOP"),
+ 0, G_MAXLONG, False, XA_CARDINAL, &type_return,
+@@ -254,18 +259,28 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) {
+
+ if (gtk_widget_get_realized(GTK_WIDGET(w))) {
+ GdkWindow *dw = NULL;
++#ifdef GDK_IS_X11_DISPLAY
+ GdkScreen *screen = NULL;
++#endif
+ GdkDisplay *display = NULL;
+ gint x = -1, y = -1, width = -1, height = -1, screen_width = -1, screen_height = -1;
+
+- if ((dw = gtk_widget_get_window(GTK_WIDGET(w))))
+- if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_XID, "%lu", (unsigned long) GDK_WINDOW_XID(dw))) < 0)
+- return ret;
++ if ((dw = gtk_widget_get_window(GTK_WIDGET(w)))) {
++#ifdef GDK_IS_X11_DISPLAY
++ if (GDK_IS_X11_DISPLAY(display)) {
++ if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_XID, "%lu", (unsigned long) GDK_WINDOW_XID(dw))) < 0)
++ return ret;
++ }
++#endif
++ }
+
+ if ((display = gtk_widget_get_display(GTK_WIDGET(w)))) {
+- if ((t = gdk_display_get_name(display)))
++#ifdef GDK_IS_X11_DISPLAY
++ if (GDK_IS_X11_DISPLAY(display) && (t = gdk_display_get_name(display))) {
+ if ((ret = ca_proplist_sets(p, CA_PROP_WINDOW_X11_DISPLAY, t)) < 0)
+ return ret;
++ }
++#endif
+
+ if (dw) {
+ gint desktop = window_get_desktop(display, dw);
+@@ -276,7 +291,8 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) {
+ }
+ }
+
+- if ((screen = gtk_widget_get_screen(GTK_WIDGET(w)))) {
++#ifdef GDK_IS_X11_DISPLAY
++ if (GDK_IS_X11_DISPLAY(display) && (screen = gtk_widget_get_screen(GTK_WIDGET(w)))) {
+
+ if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_SCREEN, "%i", gdk_screen_get_number(screen))) < 0)
+ return ret;
+@@ -285,7 +301,7 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) {
+ if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_MONITOR, "%i", gdk_screen_get_monitor_at_window(screen, dw))) < 0)
+ return ret;
+ }
+-
++#endif
+ /* FIXME, this might cause a round trip */
+
+ if (dw) {
+--
+2.34.1
+
diff --git a/subprojects/shared-modules/libcanberra/libcanberra.json b/subprojects/shared-modules/libcanberra/libcanberra.json
new file mode 100644
index 00000000..ac441941
--- /dev/null
+++ b/subprojects/shared-modules/libcanberra/libcanberra.json
@@ -0,0 +1,35 @@
+{
+ "name": "libcanberra",
+ "cleanup": [
+ "*.la",
+ "/bin",
+ "/etc",
+ "/include",
+ "/libexec",
+ "/share/gtk-doc",
+ "/share/man"
+ ],
+ "config-opts": [
+ "--disable-static",
+ "--disable-gtk-doc",
+ "--disable-oss",
+ "--enable-pulse",
+ "--disable-udev",
+ "--disable-gtk",
+ "--enable-gtk3",
+ "--disable-lynx"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "http://0pointer.de/lennart/projects/libcanberra/libcanberra-0.30.tar.xz",
+ "sha256": "c2b671e67e0c288a69fc33dc1b6f1b534d07882c2aceed37004bf48c601afa72",
+ "git-init" : true
+ },
+ {
+ "type": "patch",
+ "path": "0001-gtk-Don-t-assume-all-GdkDisplays-are-GdkX11Displays-.patch",
+ "use-git-am": true
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/libmad/Provide-Thumb-2-alternative-code-for-MAD_F_MLN.diff b/subprojects/shared-modules/libmad/Provide-Thumb-2-alternative-code-for-MAD_F_MLN.diff
new file mode 100644
index 00000000..46415107
--- /dev/null
+++ b/subprojects/shared-modules/libmad/Provide-Thumb-2-alternative-code-for-MAD_F_MLN.diff
@@ -0,0 +1,34 @@
+From: Dave Martin
+Subject: "rsc" doesnt exist anymore in thumb2
+
+diff --git a/fixed.h b/fixed.h
+index 4b58abf..ba4bc26 100644
+--- a/fixed.h
++++ b/fixed.h
+@@ -275,12 +275,25 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y)
+ : "+r" (lo), "+r" (hi) \
+ : "%r" (x), "r" (y))
+
++#ifdef __thumb__
++/* In Thumb-2, the RSB-immediate instruction is only allowed with a zero
++ operand. If needed this code can also support Thumb-1
++ (simply append "s" to the end of the second two instructions). */
++# define MAD_F_MLN(hi, lo) \
++ asm ("rsbs %0, %0, #0\n\t" \
++ "sbc %1, %1, %1\n\t" \
++ "sub %1, %1, %2" \
++ : "+&r" (lo), "=&r" (hi) \
++ : "r" (hi) \
++ : "cc")
++#else /* ! __thumb__ */
+ # define MAD_F_MLN(hi, lo) \
+ asm ("rsbs %0, %2, #0\n\t" \
+ "rsc %1, %3, #0" \
+- : "=r" (lo), "=r" (hi) \
++ : "=&r" (lo), "=r" (hi) \
+ : "0" (lo), "1" (hi) \
+ : "cc")
++#endif /* __thumb__ */
+
+ # define mad_f_scale64(hi, lo) \
+ ({ mad_fixed_t __result; \
diff --git a/subprojects/shared-modules/libmad/libmad-0.15.1b-cflags-O2.patch b/subprojects/shared-modules/libmad/libmad-0.15.1b-cflags-O2.patch
new file mode 100644
index 00000000..61b4b13b
--- /dev/null
+++ b/subprojects/shared-modules/libmad/libmad-0.15.1b-cflags-O2.patch
@@ -0,0 +1,12 @@
+diff -Naur libmad-0.15.1b-orig/configure.ac libmad-0.15.1b/configure.ac
+--- libmad-0.15.1b-orig/configure.ac 2007-07-01 12:58:13.000000000 -0600
++++ libmad-0.15.1b/configure.ac 2007-07-01 12:59:13.000000000 -0600
+@@ -105,7 +105,7 @@
+ shift
+ ;;
+ -O2)
+- optimize="-O"
++ optimize="-O2"
+ shift
+ ;;
+ -fomit-frame-pointer)
diff --git a/subprojects/shared-modules/libmad/libmad-0.15.1b-cflags.patch b/subprojects/shared-modules/libmad/libmad-0.15.1b-cflags.patch
new file mode 100644
index 00000000..2ec44e34
--- /dev/null
+++ b/subprojects/shared-modules/libmad/libmad-0.15.1b-cflags.patch
@@ -0,0 +1,146 @@
+diff -Naur libmad-0.15.1b-orig/configure.ac libmad-0.15.1b/configure.ac
+--- libmad-0.15.1b-orig/configure.ac 2007-06-30 20:22:31.000000000 -0600
++++ libmad-0.15.1b/configure.ac 2007-06-30 20:25:31.000000000 -0600
+@@ -122,74 +122,74 @@
+ esac
+ done
+
+-if test "$GCC" = yes
+-then
+- if test -z "$arch"
+- then
+- case "$host" in
+- i386-*) ;;
+- i?86-*) arch="-march=i486" ;;
+- arm*-empeg-*) arch="-march=armv4 -mtune=strongarm1100" ;;
+- armv4*-*) arch="-march=armv4 -mtune=strongarm" ;;
+- powerpc-*) ;;
+- mips*-agenda-*) arch="-mcpu=vr4100" ;;
+- mips*-luxsonor-*) arch="-mips1 -mcpu=r3000 -Wa,-m4010" ;;
+- esac
+- fi
+-
+- case "$optimize" in
+- -O|"-O "*)
+- optimize="-O"
+- optimize="$optimize -fforce-mem"
+- optimize="$optimize -fforce-addr"
+- : #x optimize="$optimize -finline-functions"
+- : #- optimize="$optimize -fstrength-reduce"
+- optimize="$optimize -fthread-jumps"
+- optimize="$optimize -fcse-follow-jumps"
+- optimize="$optimize -fcse-skip-blocks"
+- : #x optimize="$optimize -frerun-cse-after-loop"
+- : #x optimize="$optimize -frerun-loop-opt"
+- : #x optimize="$optimize -fgcse"
+- optimize="$optimize -fexpensive-optimizations"
+- optimize="$optimize -fregmove"
+- : #* optimize="$optimize -fdelayed-branch"
+- : #x optimize="$optimize -fschedule-insns"
+- optimize="$optimize -fschedule-insns2"
+- : #? optimize="$optimize -ffunction-sections"
+- : #? optimize="$optimize -fcaller-saves"
+- : #> optimize="$optimize -funroll-loops"
+- : #> optimize="$optimize -funroll-all-loops"
+- : #x optimize="$optimize -fmove-all-movables"
+- : #x optimize="$optimize -freduce-all-givs"
+- : #? optimize="$optimize -fstrict-aliasing"
+- : #* optimize="$optimize -fstructure-noalias"
+-
+- case "$host" in
+- arm*-*)
+- optimize="$optimize -fstrength-reduce"
+- ;;
+- mips*-*)
+- optimize="$optimize -fstrength-reduce"
+- optimize="$optimize -finline-functions"
+- ;;
+- i?86-*)
+- optimize="$optimize -fstrength-reduce"
+- ;;
+- powerpc-apple-*)
+- # this triggers an internal compiler error with gcc2
+- : #optimize="$optimize -fstrength-reduce"
+-
+- # this is really only beneficial with gcc3
+- : #optimize="$optimize -finline-functions"
+- ;;
+- *)
+- # this sometimes provokes bugs in gcc 2.95.2
+- : #optimize="$optimize -fstrength-reduce"
+- ;;
+- esac
+- ;;
+- esac
+-fi
++#if test "$GCC" = yes
++#then
++# if test -z "$arch"
++# then
++# case "$host" in
++# i386-*) ;;
++# i?86-*) arch="-march=i486" ;;
++# arm*-empeg-*) arch="-march=armv4 -mtune=strongarm1100" ;;
++# armv4*-*) arch="-march=armv4 -mtune=strongarm" ;;
++# powerpc-*) ;;
++# mips*-agenda-*) arch="-mcpu=vr4100" ;;
++# mips*-luxsonor-*) arch="-mips1 -mcpu=r3000 -Wa,-m4010" ;;
++# esac
++# fi
++#
++# case "$optimize" in
++# -O|"-O "*)
++# optimize="-O"
++# optimize="$optimize -fforce-mem"
++# optimize="$optimize -fforce-addr"
++# : #x optimize="$optimize -finline-functions"
++# : #- optimize="$optimize -fstrength-reduce"
++# optimize="$optimize -fthread-jumps"
++# optimize="$optimize -fcse-follow-jumps"
++# optimize="$optimize -fcse-skip-blocks"
++# : #x optimize="$optimize -frerun-cse-after-loop"
++# : #x optimize="$optimize -frerun-loop-opt"
++# : #x optimize="$optimize -fgcse"
++# optimize="$optimize -fexpensive-optimizations"
++# optimize="$optimize -fregmove"
++# : #* optimize="$optimize -fdelayed-branch"
++# : #x optimize="$optimize -fschedule-insns"
++# optimize="$optimize -fschedule-insns2"
++# : #? optimize="$optimize -ffunction-sections"
++# : #? optimize="$optimize -fcaller-saves"
++# : #> optimize="$optimize -funroll-loops"
++# : #> optimize="$optimize -funroll-all-loops"
++# : #x optimize="$optimize -fmove-all-movables"
++# : #x optimize="$optimize -freduce-all-givs"
++# : #? optimize="$optimize -fstrict-aliasing"
++# : #* optimize="$optimize -fstructure-noalias"
++#
++# case "$host" in
++# arm*-*)
++# optimize="$optimize -fstrength-reduce"
++# ;;
++# mips*-*)
++# optimize="$optimize -fstrength-reduce"
++# optimize="$optimize -finline-functions"
++# ;;
++# i?86-*)
++# optimize="$optimize -fstrength-reduce"
++# ;;
++# powerpc-apple-*)
++# # this triggers an internal compiler error with gcc2
++# : #optimize="$optimize -fstrength-reduce"
++#
++# # this is really only beneficial with gcc3
++# : #optimize="$optimize -finline-functions"
++# ;;
++# *)
++# # this sometimes provokes bugs in gcc 2.95.2
++# : #optimize="$optimize -fstrength-reduce"
++# ;;
++# esac
++# ;;
++# esac
++#fi
+
+ case "$host" in
+ mips*-agenda-*)
diff --git a/subprojects/shared-modules/libmad/libmad-0.15.1b-multiarch.patch b/subprojects/shared-modules/libmad/libmad-0.15.1b-multiarch.patch
new file mode 100644
index 00000000..51bf663b
--- /dev/null
+++ b/subprojects/shared-modules/libmad/libmad-0.15.1b-multiarch.patch
@@ -0,0 +1,37 @@
+diff -up libmad-0.15.1b/Makefile.am.orig libmad-0.15.1b/Makefile.am
+--- libmad-0.15.1b/Makefile.am.orig 2009-01-25 14:35:56.000000000 +0200
++++ libmad-0.15.1b/Makefile.am 2009-01-25 18:35:07.000000000 +0200
+@@ -110,15 +110,28 @@ mad.h: config.status config.h Makefile.a
+ echo "# ifdef __cplusplus"; \
+ echo 'extern "C" {'; \
+ echo "# endif"; echo; \
+- if [ ".$(FPM)" != "." ]; then \
+- echo ".$(FPM)" | sed -e 's|^\.-D|# define |'; echo; \
+- fi; \
++ echo "# ifdef __i386__"; \
++ echo "# define FPM_INTEL"; \
++ echo "# define SIZEOF_LONG 4"; \
++ echo "# endif"; \
++ echo "#ifdef __x86_64__";\
++ echo "# define FPM_64BIT"; \
++ echo "# define SIZEOF_LONG 8"; \
++ echo "# endif"; \
++ echo "#ifdef __powerpc__"; \
++ echo "#define FPM_PPC"; \
++ echo "#define SIZEOF_LONG 4"; \
++ echo "#endif"; \
++ echo "#ifdef __powerpc64__"; \
++ echo "#define FPM_PPC"; \
++ echo "#define SIZEOF_LONG 8"; \
++ echo "#endif"; echo; \
+ sed -ne 's/^# *define *\(HAVE_.*_ASM\).*/# define \1/p' \
+ config.h; echo; \
+ sed -ne 's/^# *define *OPT_\(SPEED\|ACCURACY\).*/# define OPT_\1/p' \
+ config.h; echo; \
+- sed -ne 's/^# *define *\(SIZEOF_.*\)/# define \1/p' \
+- config.h; echo; \
++ echo "# define SIZEOF_INT 4"; \
++ echo "# define SIZEOF_LONG_LONG 8"; echo; \
+ for header in $(exported_headers); do \
+ echo; \
+ sed -n -f $(srcdir)/mad.h.sed $(srcdir)/$$header; \
diff --git a/subprojects/shared-modules/libmad/libmad-0.15.1b-ppc.patch b/subprojects/shared-modules/libmad/libmad-0.15.1b-ppc.patch
new file mode 100644
index 00000000..fa6ee383
--- /dev/null
+++ b/subprojects/shared-modules/libmad/libmad-0.15.1b-ppc.patch
@@ -0,0 +1,13 @@
+--- libmad-0.15.1b/fixed.h~ 2004-02-17 02:02:03.000000000 +0000
++++ libmad-0.15.1b/fixed.h 2009-07-19 13:03:08.000000000 +0100
+@@ -379,8 +379,8 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t
+ asm ("addc %0,%2,%3\n\t" \
+ "adde %1,%4,%5" \
+ : "=r" (lo), "=r" (hi) \
+- : "%r" (lo), "r" (__lo), \
+- "%r" (hi), "r" (__hi) \
++ : "0" (lo), "r" (__lo), \
++ "1" (hi), "r" (__hi) \
+ : "xer"); \
+ })
+ # endif
diff --git a/subprojects/shared-modules/libmad/libmad.json b/subprojects/shared-modules/libmad/libmad.json
new file mode 100644
index 00000000..cfebd20e
--- /dev/null
+++ b/subprojects/shared-modules/libmad/libmad.json
@@ -0,0 +1,49 @@
+{
+ "name" : "libmad",
+ "post-install": [
+ "install -d $FLATPAK_DEST/lib/pkgconfig",
+ "install -Dm644 -t $FLATPAK_DEST/lib/pkgconfig mad.pc"
+ ],
+ "sources" : [
+ {
+ "type" : "archive",
+ "url" : "https://downloads.sourceforge.net/project/mad/libmad/0.15.1b/libmad-0.15.1b.tar.gz",
+ "sha256" : "bbfac3ed6bfbc2823d3775ebb931087371e142bb0e9bb1bee51a76a6e0078690"
+ },
+ {
+ "type": "patch",
+ "path": "libmad-0.15.1b-multiarch.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libmad-0.15.1b-ppc.patch"
+ },
+ {
+ "type": "patch",
+ "path": "Provide-Thumb-2-alternative-code-for-MAD_F_MLN.diff"
+ },
+ {
+ "type": "patch",
+ "path": "libmad.thumb.diff"
+ },
+ {
+ "type": "patch",
+ "path": "libmad-0.15.1b-cflags.patch"
+ },
+ {
+ "type": "patch",
+ "path": "libmad-0.15.1b-cflags-O2.patch"
+ },
+ {
+ "type": "file",
+ "path": "mad.pc"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "cp /usr/share/gnu-config/config.sub .",
+ "cp /usr/share/gnu-config/config.guess ."
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/libmad/libmad.thumb.diff b/subprojects/shared-modules/libmad/libmad.thumb.diff
new file mode 100644
index 00000000..13edde21
--- /dev/null
+++ b/subprojects/shared-modules/libmad/libmad.thumb.diff
@@ -0,0 +1,12 @@
+--- ./imdct_l_arm.S.orig 2010-02-25 13:25:23.000000000 +0100
++++ ./imdct_l_arm.S 2010-02-25 13:27:26.000000000 +0100
+@@ -468,7 +468,7 @@
+
+ @----
+
+- add r2, pc, #(imdct36_long_karray-.-8) @ r2 = base address of Knn array (PIC safe ?)
++ adr r2, imdct36_long_karray
+
+
+ loop:
+
diff --git a/subprojects/shared-modules/libmad/mad.pc b/subprojects/shared-modules/libmad/mad.pc
new file mode 100644
index 00000000..15d85311
--- /dev/null
+++ b/subprojects/shared-modules/libmad/mad.pc
@@ -0,0 +1,11 @@
+prefix=/app
+exec_prefix=/app
+libdir=/app/lib
+includedir=/app/include
+
+Name: mad
+Description: MPEG Audio Decoder
+Requires:
+Version: 0.15.1b
+Libs: -L/app/lib} -lmad -lm
+Cflags: -I/app/include \ No newline at end of file
diff --git a/subprojects/shared-modules/libsecret/libsecret.json b/subprojects/shared-modules/libsecret/libsecret.json
new file mode 100644
index 00000000..ae347bba
--- /dev/null
+++ b/subprojects/shared-modules/libsecret/libsecret.json
@@ -0,0 +1,23 @@
+{
+ "name": "libsecret",
+ "buildsystem": "meson",
+ "config-opts": [
+ "-Dmanpage=false",
+ "-Dvapi=false",
+ "-Dgtk_doc=false",
+ "-Dintrospection=false"
+ ],
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/pkgconfig",
+ "/share/man"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/libsecret/0.20/libsecret-0.20.5.tar.xz",
+ "sha256": "3fb3ce340fcd7db54d87c893e69bfc2b1f6e4d4b279065ffe66dac9f0fd12b4d"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/libusb/libusb.json b/subprojects/shared-modules/libusb/libusb.json
new file mode 100644
index 00000000..21dddf80
--- /dev/null
+++ b/subprojects/shared-modules/libusb/libusb.json
@@ -0,0 +1,19 @@
+{
+ "name": "libusb",
+ "config-opts": [ "--disable-static" ],
+ "cleanup": [
+ "/lib/*.la",
+ "/lib/pkgconfig",
+ "/include"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/libusb/libusb/releases/download/v1.0.26/libusb-1.0.26.tar.bz2",
+ "sha256": "12ce7a61fc9854d1d2a1ffe095f7b5fac19ddba095c259e6067a46500381b5a5"
+ }
+ ],
+ "post-install": [
+ "install -Dm644 COPYING /app/share/licenses/libusb/COPYING"
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/dssi.json b/subprojects/shared-modules/linux-audio/dssi.json
new file mode 100644
index 00000000..ec33fd37
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/dssi.json
@@ -0,0 +1,29 @@
+{
+ "name": "dssi",
+ "rm-configure": true,
+ "config-opts": [
+ "--disable-static"
+ ],
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/dssi",
+ "/lib/pkgconfig",
+ "/share/man",
+ "*.la"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "http://download.sf.net/sourceforge/dssi/dssi-1.1.1.tar.gz",
+ "sha256": "f2c82b073a947c8255284249097667f9b14e660bf86186f3fcd3b3b3e087814e"
+ },
+ {
+ "type": "script",
+ "commands": [
+ "autoreconf -fiv"
+ ],
+ "dest-filename": "autogen.sh"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/fftw3f-static.json b/subprojects/shared-modules/linux-audio/fftw3f-static.json
new file mode 100644
index 00000000..66757499
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/fftw3f-static.json
@@ -0,0 +1,44 @@
+{
+ "name": "fftw3f",
+ "config-opts": [
+ "--enable-threads",
+ "--enable-static",
+ "--disable-shared",
+ "--enable-float"
+ ],
+ "build-options": {
+ "cflags": "-fPIC",
+ "arch": {
+ "x86_64": {
+ "config-opts": [
+ "--enable-sse2",
+ "--enable-avx",
+ "--enable-avx-128-fma"
+ ]
+ },
+ "aarch64": {
+ "config-opts": [
+ "--enable-neon"
+ ]
+ }
+ }
+ },
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://www.fftw.org/fftw-3.3.10.tar.gz",
+ "sha256": "56c932549852cddcfafdab3820b0200c7742675be92179e59e6215b340e26467"
+ }
+ ],
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/cmake",
+ "/lib/pkgconfig",
+ "/share/info",
+ "/share/man",
+ "*.a",
+ "*.la",
+ "*.so"
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/fftw3f.json b/subprojects/shared-modules/linux-audio/fftw3f.json
new file mode 100644
index 00000000..ee10c757
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/fftw3f.json
@@ -0,0 +1,41 @@
+{
+ "name": "fftw3f",
+ "config-opts": [
+ "--enable-threads",
+ "--enable-shared",
+ "--disable-static",
+ "--enable-float"
+ ],
+ "build-options": {
+ "arch": {
+ "x86_64": {
+ "config-opts": [
+ "--enable-sse2",
+ "--enable-avx",
+ "--enable-avx-128-fma"
+ ]
+ },
+ "aarch64": {
+ "config-opts": [
+ "--enable-neon"
+ ]
+ }
+ }
+ },
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://www.fftw.org/fftw-3.3.10.tar.gz",
+ "sha256": "56c932549852cddcfafdab3820b0200c7742675be92179e59e6215b340e26467"
+ }
+ ],
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/cmake",
+ "/lib/pkgconfig",
+ "/share/man",
+ "*.la",
+ "*.so"
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/fluidsynth2-static.json b/subprojects/shared-modules/linux-audio/fluidsynth2-static.json
new file mode 100644
index 00000000..67cea185
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/fluidsynth2-static.json
@@ -0,0 +1,27 @@
+{
+ "name": "fluidsynth",
+ "buildsystem": "cmake-ninja",
+ "build-options": {
+ "cflags": "-fPIC",
+ "cxxflags": "-fPIC"
+ },
+ "config-opts": [
+ "-DLIB_SUFFIX=",
+ "-DBUILD_SHARED_LIBS=OFF"
+ ],
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/pkgconfig",
+ "/share/man",
+ "*.so",
+ "*.a"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/FluidSynth/fluidsynth/archive/v2.2.8.tar.gz",
+ "sha256": "7c29a5cb7a2755c8012d941d1335da7bda957bbb0a86b7c59215d26773bb51fe"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/fluidsynth2.json b/subprojects/shared-modules/linux-audio/fluidsynth2.json
new file mode 100644
index 00000000..a22a060b
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/fluidsynth2.json
@@ -0,0 +1,21 @@
+{
+ "name": "fluidsynth",
+ "buildsystem": "cmake-ninja",
+ "config-opts": [
+ "-DLIB_SUFFIX="
+ ],
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/pkgconfig",
+ "/share/man",
+ "*.so"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/FluidSynth/fluidsynth/archive/v2.2.8.tar.gz",
+ "sha256": "7c29a5cb7a2755c8012d941d1335da7bda957bbb0a86b7c59215d26773bb51fe"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/jack2.json b/subprojects/shared-modules/linux-audio/jack2.json
new file mode 100644
index 00000000..9077fea3
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/jack2.json
@@ -0,0 +1,23 @@
+{
+ "name": "jack2",
+ "buildsystem": "simple",
+ "build-commands": [
+ "./waf configure --prefix=$FLATPAK_DEST --htmldir=$FLATPAK_DEST/share/doc/jack/ --classic",
+ "./waf build -j $FLATPAK_BUILDER_N_JOBS",
+ "./waf install"
+ ],
+ "cleanup": [
+ "/include",
+ "/lib/jack",
+ "/lib/libjack*",
+ "/lib/pkgconfig",
+ "/share/man"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/jackaudio/jack2/archive/v1.9.17.tar.gz",
+ "sha256": "38f674bbc57852a8eb3d9faa1f96a0912d26f7d5df14c11005ad499c8ae352f2"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/ladspa.json b/subprojects/shared-modules/linux-audio/ladspa.json
new file mode 100644
index 00000000..d3637fff
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/ladspa.json
@@ -0,0 +1,17 @@
+{
+ "name": "ladspa",
+ "no-autogen": true,
+ "subdir": "src",
+ "make-install-args": [
+ "INSTALL_PLUGINS_DIR=/app/lib/ladspa",
+ "INSTALL_INCLUDE_DIR=/app/include",
+ "INSTALL_BINARY_DIR=/app/bin"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "http://www.ladspa.org/download/ladspa_sdk_1.17.tgz",
+ "sha256": "27d24f279e4b81bd17ecbdcc38e4c42991bb388826c0b200067ce0eb59d3da5b"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/lash.json b/subprojects/shared-modules/linux-audio/lash.json
new file mode 100644
index 00000000..4d0ccb28
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/lash.json
@@ -0,0 +1,41 @@
+{
+ "name": "lash",
+ "rm-configure": true,
+ "config-opts": [
+ "--disable-static",
+ "--disable-serv-inst",
+ "CFLAGS=-D_GNU_SOURCE"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.savannah.gnu.org/releases/lash/lash-0.5.4.tar.gz",
+ "sha256": "105a7da84415c4725c6bcad28e70f23aeb4534f94fc80ca262b6a2cef2226c16"
+ },
+ {
+ "type": "patch",
+ "strip-components": 0,
+ "path": "patches/lash-0.5.3-no-static-lib.patch"
+ },
+ {
+ "type": "patch",
+ "path": "patches/lash-gcc47.patch"
+ },
+ {
+ "type": "patch",
+ "path": "patches/lash-linking.patch"
+ },
+ {
+ "type": "patch",
+ "strip-components": 0,
+ "path": "patches/lash-configure.patch"
+ },
+ {
+ "type": "script",
+ "commands": [
+ "autoreconf -fiv"
+ ],
+ "dest-filename": "autogen.sh"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/libinstpatch.json b/subprojects/shared-modules/linux-audio/libinstpatch.json
new file mode 100644
index 00000000..fb00c206
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/libinstpatch.json
@@ -0,0 +1,17 @@
+{
+ "name": "libinstpatch",
+ "buildsystem": "cmake-ninja",
+ "config-opts": [
+ "-DLIB_SUFFIX="
+ ],
+ "cleanup": [
+ "/share/doc"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/swami/libinstpatch/archive/v1.1.6.tar.gz",
+ "sha256": "8e9861b04ede275d712242664dab6ffa9166c7940fea3b017638681d25e10299"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/liblo-static.json b/subprojects/shared-modules/linux-audio/liblo-static.json
new file mode 100644
index 00000000..4ca2eb77
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/liblo-static.json
@@ -0,0 +1,25 @@
+{
+ "name": "liblo",
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/pkgconfig",
+ "*.la",
+ "*.a",
+ "*.so"
+ ],
+ "build-options": {
+ "cflags": "-fPIC"
+ },
+ "config-opts": [
+ "--enable-static",
+ "--disable-shared"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "http://download.sf.net/sourceforge/liblo/liblo-0.31.tar.gz",
+ "sha256": "2b4f446e1220dcd624ecd8405248b08b7601e9a0d87a0b94730c2907dbccc750"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/liblo.json b/subprojects/shared-modules/linux-audio/liblo.json
new file mode 100644
index 00000000..17de750e
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/liblo.json
@@ -0,0 +1,17 @@
+{
+ "name": "liblo",
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/pkgconfig",
+ "*.la",
+ "*.so"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "http://download.sf.net/sourceforge/liblo/liblo-0.31.tar.gz",
+ "sha256": "2b4f446e1220dcd624ecd8405248b08b7601e9a0d87a0b94730c2907dbccc750"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/lilv.json b/subprojects/shared-modules/linux-audio/lilv.json
new file mode 100644
index 00000000..2c080535
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/lilv.json
@@ -0,0 +1,100 @@
+{
+ "name": "lilv",
+ "buildsystem": "simple",
+ "build-commands": [
+ "python3 ./waf configure --prefix=$FLATPAK_DEST",
+ "python3 ./waf build -j $FLATPAK_BUILDER_N_JOBS",
+ "python3 ./waf install"
+ ],
+ "modules": [
+ {
+ "name": "serd",
+ "buildsystem": "simple",
+ "build-commands": [
+ "python3 ./waf configure --prefix=$FLATPAK_DEST",
+ "python3 ./waf build -j $FLATPAK_BUILDER_N_JOBS",
+ "python3 ./waf install"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.drobilla.net/serd-0.30.10.tar.bz2",
+ "sha256": "affa80deec78921f86335e6fc3f18b80aefecf424f6a5755e9f2fa0eb0710edf"
+ }
+ ],
+ "post-install": [
+ "install -Dm644 -t /app/share/licenses/serd COPYING"
+ ],
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/pkgconfig",
+ "/share/man"
+ ]
+ },
+ {
+ "name": "sord",
+ "buildsystem": "simple",
+ "build-commands": [
+ "python3 ./waf configure --prefix=$FLATPAK_DEST",
+ "python3 ./waf build -j $FLATPAK_BUILDER_N_JOBS",
+ "python3 ./waf install"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.drobilla.net/sord-0.16.8.tar.bz2",
+ "sha256": "7c289d2eaabf82fa6ac219107ce632d704672dcfb966e1a7ff0bbc4ce93f5e14"
+ }
+ ],
+ "post-install": [
+ "install -Dm644 -t /app/share/licenses/sord COPYING"
+ ],
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/pkgconfig",
+ "/share/man"
+ ]
+ },
+ {
+ "name": "sratom",
+ "buildsystem": "simple",
+ "build-commands": [
+ "python3 ./waf configure --prefix=$FLATPAK_DEST",
+ "python3 ./waf build -j $FLATPAK_BUILDER_N_JOBS",
+ "python3 ./waf install"
+ ],
+ "cleanup": [
+ "/include",
+ "/lib/pkgconfig"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.drobilla.net/sratom-0.6.8.tar.bz2",
+ "sha256": "3acb32b1adc5a2b7facdade2e0818bcd6c71f23f84a1ebc17815bb7a0d2d02df"
+ }
+ ],
+ "post-install": [
+ "install -Dm644 -t /app/share/licenses/sratom COPYING"
+ ]
+ }
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.drobilla.net/lilv-0.24.12.tar.bz2",
+ "sha256": "26a37790890c9c1f838203b47f5b2320334fe92c02a4d26ebbe2669dbd769061"
+ }
+ ],
+ "post-install": [
+ "install -Dm644 -t /app/share/licenses/lilv COPYING"
+ ],
+ "cleanup": [
+ "/bin",
+ "/etc",
+ "/lib/pkgconfig",
+ "/share/man"
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/lrdf.json b/subprojects/shared-modules/linux-audio/lrdf.json
new file mode 100644
index 00000000..29d19dd5
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/lrdf.json
@@ -0,0 +1,50 @@
+{
+ "name": "lrdf",
+ "rm-configure": true,
+ "cleanup": [
+ "/include",
+ "/lib/pkgconfig",
+ "*.so"
+ ],
+ "config-opts": [
+ "--disable-static"
+ ],
+ "modules": [
+ "ladspa.json",
+ {
+ "name": "raptor2",
+ "cleanup": [
+ "/include",
+ "/lib/pkgconfig",
+ "/share/gtk-doc",
+ "*.so"
+ ],
+ "config-opts": [
+ "--disable-documentation",
+ "--disable-static"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "http://download.librdf.org/source/raptor2-2.0.15.tar.gz",
+ "sha256": "ada7f0ba54787b33485d090d3d2680533520cd4426d2f7fb4782dd4a6a1480ed"
+ }
+ ]
+ }
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/swh/LRDF/tarball/0.5.0",
+ "dest-filename": "swh-LRDF-0.5.0-0-g7ebc032.tar.gz",
+ "sha256": "013002b91ef209827fe99552b8c7f0b569cddb3d6f1439bedbd8bafe1956a93c"
+ },
+ {
+ "type": "script",
+ "commands": [
+ "autoreconf -fiv"
+ ],
+ "dest-filename": "autogen.sh"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/lv2.json b/subprojects/shared-modules/linux-audio/lv2.json
new file mode 100644
index 00000000..5cf5a67c
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/lv2.json
@@ -0,0 +1,26 @@
+{
+ "name": "lv2",
+ "buildsystem": "simple",
+ "build-commands": [
+ "python3 ./waf configure --prefix=$FLATPAK_DEST --lv2dir=$FLATPAK_DEST/lib/lv2 --copy-headers",
+ "python3 ./waf build -j $FLATPAK_BUILDER_N_JOBS",
+ "python3 ./waf install"
+ ],
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/pkgconfig",
+ "/share"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://lv2plug.in/spec/lv2-1.18.2.tar.bz2",
+ "sha256": "4e891fbc744c05855beb5dfa82e822b14917dd66e98f82b8230dbd1c7ab2e05e"
+ }
+ ],
+ "post-install": [
+ "install -Dm644 -t $FLATPAK_DEST/share/licenses/lv2 COPYING",
+ "ln -sf lv2.pc $FLATPAK_DEST/lib/pkgconfig/lv2core.pc"
+ ]
+}
diff --git a/subprojects/shared-modules/linux-audio/patches/lash-0.5.3-no-static-lib.patch b/subprojects/shared-modules/linux-audio/patches/lash-0.5.3-no-static-lib.patch
new file mode 100644
index 00000000..54d1cd7b
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/patches/lash-0.5.3-no-static-lib.patch
@@ -0,0 +1,10 @@
+--- lash-1.0.pc.in~ 2007-10-07 06:33:27.000000000 -0700
++++ lash-1.0.pc.in 2007-10-07 06:35:00.000000000 -0700
+@@ -7,6 +7,5 @@
+ Description: Audio session management
+ Requires: @PC_REQUIRES@
+ Version: @PACKAGE_VERSION@
+-Libs: -llash
+-Libs.static: -lpthread -luuid
++Libs: -llash -lpthread -luuid
+ Cflags: -I${includedir}/lash-1.0
diff --git a/subprojects/shared-modules/linux-audio/patches/lash-configure.patch b/subprojects/shared-modules/linux-audio/patches/lash-configure.patch
new file mode 100644
index 00000000..ba9bb8ba
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/patches/lash-configure.patch
@@ -0,0 +1,11 @@
+--- configure.ac 2007-11-14 16:58:51.000000000 -0500
++++ configure.ac.new 2019-01-24 13:48:46.284377086 -0500
+@@ -2,7 +2,7 @@
+ AC_CONFIG_SRCDIR([lash/types.h])
+ AC_CONFIG_HEADER([config.h])
+ AM_INIT_AUTOMAKE
+-AM_ACLOCAL_INCLUDE([m4])
++dnl AM_ACLOCAL_INCLUDE([m4])
+
+ ### Check for programs ###
+ AC_LANG([C])
diff --git a/subprojects/shared-modules/linux-audio/patches/lash-gcc47.patch b/subprojects/shared-modules/linux-audio/patches/lash-gcc47.patch
new file mode 100644
index 00000000..41710ca5
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/patches/lash-gcc47.patch
@@ -0,0 +1,11 @@
+diff -rupN lash-0.5.4.old/liblash/lash.c lash-0.5.4/liblash/lash.c
+--- lash-0.5.4.old/liblash/lash.c 2007-03-09 10:34:40.000000000 -0500
++++ lash-0.5.4/liblash/lash.c 2012-07-22 18:17:46.003963521 -0400
+@@ -22,6 +22,7 @@
+ #include <string.h>
+ #include <strings.h>
+ #include <pthread.h>
++#include <sys/resource.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
+ #include <sys/socket.h>
diff --git a/subprojects/shared-modules/linux-audio/patches/lash-linking.patch b/subprojects/shared-modules/linux-audio/patches/lash-linking.patch
new file mode 100644
index 00000000..e46d1647
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/patches/lash-linking.patch
@@ -0,0 +1,90 @@
+diff -rupN lash-0.5.4.old/clients/control/Makefile.am lash-0.5.4/clients/control/Makefile.am
+--- lash-0.5.4.old/clients/control/Makefile.am 2007-01-13 13:20:03.000000000 -0500
++++ lash-0.5.4/clients/control/Makefile.am 2010-02-10 03:08:04.000000000 -0500
+@@ -18,6 +18,6 @@ lash_control_CFLAGS = $(LASH_CFLAGS)
+
+ lash_control_LDADD = \
+ $(top_builddir)/liblash/liblash.la \
+- $(LASH_LIBS) @READLINE_LIBS@
++ $(LASH_LIBS) @READLINE_LIBS@ -luuid
+
+ endif
+diff -rupN lash-0.5.4.old/clients/control/Makefile.in lash-0.5.4/clients/control/Makefile.in
+--- lash-0.5.4.old/clients/control/Makefile.in 2007-11-14 17:00:09.000000000 -0500
++++ lash-0.5.4/clients/control/Makefile.in 2010-02-10 03:09:26.000000000 -0500
+@@ -236,7 +236,7 @@ AM_CPPFLAGS = -I$(top_srcdir)
+ @HAVE_READLINE_TRUE@lash_control_CFLAGS = $(LASH_CFLAGS)
+ @HAVE_READLINE_TRUE@lash_control_LDADD = \
+ @HAVE_READLINE_TRUE@ $(top_builddir)/liblash/liblash.la \
+-@HAVE_READLINE_TRUE@ $(LASH_LIBS) @READLINE_LIBS@
++@HAVE_READLINE_TRUE@ $(LASH_LIBS) @READLINE_LIBS@ -luuid
+
+ all: all-am
+
+diff -rupN lash-0.5.4.old/clients/panel/Makefile.am lash-0.5.4/clients/panel/Makefile.am
+--- lash-0.5.4.old/clients/panel/Makefile.am 2005-09-13 01:22:59.000000000 -0400
++++ lash-0.5.4/clients/panel/Makefile.am 2010-02-10 03:17:10.000000000 -0500
+@@ -13,7 +13,7 @@ lash_panel_CFLAGS = \
+
+ lash_panel_LDADD = \
+ $(top_builddir)/liblash/liblash.la \
+- $(GTK2_LIBS)
++ $(GTK2_LIBS) -luuid
+
+ if HAVE_GTK2
+ bin_PROGRAMS = lash_panel
+diff -rupN lash-0.5.4.old/clients/panel/Makefile.in lash-0.5.4/clients/panel/Makefile.in
+--- lash-0.5.4.old/clients/panel/Makefile.in 2007-11-14 17:00:09.000000000 -0500
++++ lash-0.5.4/clients/panel/Makefile.in 2010-02-10 03:17:23.000000000 -0500
+@@ -230,7 +230,7 @@ lash_panel_CFLAGS = \
+
+ lash_panel_LDADD = \
+ $(top_builddir)/liblash/liblash.la \
+- $(GTK2_LIBS)
++ $(GTK2_LIBS) -luuid
+
+ all: all-am
+
+diff -rupN lash-0.5.4.old/clients/synth/Makefile.am lash-0.5.4/clients/synth/Makefile.am
+--- lash-0.5.4.old/clients/synth/Makefile.am 2005-09-13 01:22:59.000000000 -0400
++++ lash-0.5.4/clients/synth/Makefile.am 2010-02-10 03:22:39.000000000 -0500
+@@ -20,4 +20,4 @@ lash_synth_LDADD = \
+ $(JACK_LIBS) \
+ $(ALSA_LIBS) \
+ $(GTK2_LIBS) \
+- -lpthread
++ -lpthread -lm
+diff -rupN lash-0.5.4.old/clients/synth/Makefile.in lash-0.5.4/clients/synth/Makefile.in
+--- lash-0.5.4.old/clients/synth/Makefile.in 2007-11-14 17:00:10.000000000 -0500
++++ lash-0.5.4/clients/synth/Makefile.in 2010-02-10 03:22:51.000000000 -0500
+@@ -238,7 +238,7 @@ lash_synth_LDADD = \
+ $(JACK_LIBS) \
+ $(ALSA_LIBS) \
+ $(GTK2_LIBS) \
+- -lpthread
++ -lpthread -lm
+
+ all: all-am
+
+diff -rupN lash-0.5.4.old/lashd/Makefile.am lash-0.5.4/lashd/Makefile.am
+--- lash-0.5.4.old/lashd/Makefile.am 2006-09-16 16:27:46.000000000 -0400
++++ lash-0.5.4/lashd/Makefile.am 2010-07-23 15:13:59.000000000 -0400
+@@ -32,6 +32,7 @@ lashd_LDADD = \
+ $(ALSA_LIBS) \
+ $(XML2_LIBS) \
+ $(UUID_LIBS) \
++ -lpthread \
+ $(top_builddir)/liblash/liblash.la
+
+ lashd_CFLAGS = \
+diff -rupN lash-0.5.4.old/lashd/Makefile.in lash-0.5.4/lashd/Makefile.in
+--- lash-0.5.4.old/lashd/Makefile.in 2007-11-14 17:00:10.000000000 -0500
++++ lash-0.5.4/lashd/Makefile.in 2010-07-23 15:14:29.000000000 -0400
+@@ -262,6 +262,7 @@ lashd_LDADD = \
+ $(ALSA_LIBS) \
+ $(XML2_LIBS) \
+ $(UUID_LIBS) \
++ -lpthread \
+ $(top_builddir)/liblash/liblash.la
+
+ lashd_CFLAGS = \
diff --git a/subprojects/shared-modules/linux-audio/patches/stk-install.sh b/subprojects/shared-modules/linux-audio/patches/stk-install.sh
new file mode 100644
index 00000000..e2d9c9b7
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/patches/stk-install.sh
@@ -0,0 +1,54 @@
+
+INCLUDE_DIR=/app/include
+DATA_DIR=/app/share
+LIB_DIR=/app/lib
+BIN_DIR=/app/bin
+
+
+
+
+install -Dm644 -t $INCLUDE_DIR/stk include/*
+install -Dm644 -t $LIB_DIR src/libstk.*
+install -Dm644 -t $DATA_DIR/stk/rawwaves rawwaves/*.raw
+
+#cp -pr projects/demo/tcl $DATA_DIR/stk/demo
+#cp -pr projects/demo/scores $DATA_DIR/stk/demo
+#cp -p projects/demo/demo $BIN_DIR/stk-demo
+#cp -p projects/demo/Md2Skini $BIN_DIR/Md2Skini
+#for f in Banded Drums Modal Physical Shakers StkDemo Voice ; do
+# chmod +x projects/demo/$f
+# sed -e 's,\./demo,$BIN_DIR/stk-demo,' -e '1i#! /bin/sh' \
+# -i projects/demo/$f
+# cp -p projects/demo/$f $DATA_DIR/stk/demo
+#done
+
+#cp -pr projects/examples/midifiles $DATA_DIR/stk/examples
+#cp -pr projects/examples/rawwaves $DATA_DIR/stk/examples
+#cp -pr projects/examples/scores $DATA_DIR/stk/examples
+#for f in sine sineosc foursine audioprobe midiprobe duplex play \
+# record inetIn inetOut rtsine crtsine bethree controlbee \
+# threebees playsmf grains ; do
+# cp -p projects/examples/$f $BIN_DIR/stk-$f
+# # absolute links, will be shortened later
+# ln -s $BIN_DIR/stk-$f $DATA_DIR/stk/examples/$f
+#done
+
+install -Dm644 -t $DATA_DIR/stk/effects projects/effects/tcl
+install -Dm644 -t $BIN_DIR/stk-effects projects/effects/effects
+sed -e 's,\./effects,$BIN_DIR/stk-effects,' -e '1i#! /bin/sh' \
+ -i projects/effects/StkEffects
+install -Dm644 -t $DATA_DIR/stk/effects projects/effects/StkEffects
+
+install -Dm644 -t $DATA_DIR/stk/ragamatic projects/ragamatic/tcl
+install -Dm644 -t $DATA_DIR/stk/ragamatic projects/ragamatic/rawwaves
+install -Dm644 -t $BIN_DIR/stk-ragamat projects/ragamatic/ragamat
+sed -e 's,\./ragamat,$BIN_DIR/stk-ragamat,' -e '1i#! /bin/sh' \
+ -i projects/ragamatic/Raga
+install -Dm644 -t $DATA_DIR/stk/ragamatic projects/ragamatic/Raga
+
+install -Dm644 -t $DATA_DIR/stk/eguitar projects/eguitar/tcl
+install -Dm644 -t $DATA_DIR/stk/eguitar projects/eguitar/scores
+install -Dm644 -t $BIN_DIR/stk-eguitar projects/eguitar/eguitar
+sed -e 's,\./eguitar,$BIN_DIR/stk-eguitar,' -e '1i#! /bin/sh' \
+ -i projects/eguitar/ElectricGuitar
+install -Dm644 -t $DATA_DIR/stk/eguitar projects/eguitar/ElectricGuitar
diff --git a/subprojects/shared-modules/linux-audio/stk.json b/subprojects/shared-modules/linux-audio/stk.json
new file mode 100644
index 00000000..cf4d8f93
--- /dev/null
+++ b/subprojects/shared-modules/linux-audio/stk.json
@@ -0,0 +1,28 @@
+{
+ "name": "stk",
+ "build-commands": [
+ "make -j $FLATPAK_BUILDER_N_JOBS -C src",
+ "make -j $FLATPAK_BUILDER_N_JOBS -C projects/effects libeffects",
+ "make -j $FLATPAK_BUILDER_N_JOBS -C projects/ragamatic libragamat",
+ "make -j $FLATPAK_BUILDER_N_JOBS -C projects/eguitar libeguitar"
+ ],
+ "post-install": [
+ "sh ./stk-install.sh"
+ ],
+ "cleanup": [
+ "/bin/*",
+ "/include",
+ "*.a"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "http://ccrma.stanford.edu/software/stk/release/stk-4.6.1.tar.gz",
+ "sha256": "e77ba3c80cdd93ca02c34098b9b7f918df3d648c87f1ed5d94fe854debd6d101"
+ },
+ {
+ "type": "file",
+ "path": "patches/stk-install.sh"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/lua5.1/lua-5.1.5-so.patch b/subprojects/shared-modules/lua5.1/lua-5.1.5-so.patch
new file mode 100644
index 00000000..5fc61a08
--- /dev/null
+++ b/subprojects/shared-modules/lua5.1/lua-5.1.5-so.patch
@@ -0,0 +1,43 @@
+diff -ur lua-5.1.4/src/Makefile lua-5.1.4-new/src/Makefile
+--- lua-5.1.4/src/Makefile 2008-01-19 20:37:58.000000000 +0100
++++ lua-5.1.4-new/src/Makefile 2012-02-23 18:26:43.000000000 +0100
+@@ -23,6 +23,7 @@
+ PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris
+
+ LUA_A= liblua.a
++LUA_SO= liblua.so
+ CORE_O= lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o \
+ lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o \
+ lundump.o lvm.o lzio.o
+@@ -36,7 +37,7 @@
+ LUAC_O= luac.o print.o
+
+ ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)
+-ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
++ALL_T= $(LUA_A) $(LUA_SO) $(LUA_T) $(LUAC_T)
+ ALL_A= $(LUA_A)
+
+ default: $(PLAT)
+@@ -51,6 +52,11 @@
+ $(AR) $@ $?
+ $(RANLIB) $@
+
++$(LUA_SO): $(CORE_O) $(LIB_O)
++ $(CC) -shared -ldl -Wl,-soname,$(LUA_SO).$(V) -o $@.$(R) $? -lm $(MYLDFLAGS)
++ ln -sf $(LUA_SO).$(R) $(LUA_SO).$(V)
++ ln -sf $(LUA_SO).$(R) $(LUA_SO)
++
+ $(LUA_T): $(LUA_O) $(LUA_A)
+ $(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)
+
+--- lua-5.1.4/Makefile 2008-08-12 02:40:48.000000000 +0200
++++ lua-5.1.4-new/Makefile 2012-02-23 19:06:32.000000000 +0100
+@@ -53,7 +53,7 @@
+ all: $(PLAT)
+
+ $(PLATS) clean:
+- cd src && $(MAKE) $@
++ cd src && $(MAKE) $@ V=$(V) R=$(R)
+
+ test: dummy
+ src/lua test/hello.lua
diff --git a/subprojects/shared-modules/lua5.1/lua-5.1.5.json b/subprojects/shared-modules/lua5.1/lua-5.1.5.json
new file mode 100644
index 00000000..896cadb9
--- /dev/null
+++ b/subprojects/shared-modules/lua5.1/lua-5.1.5.json
@@ -0,0 +1,38 @@
+{
+ "name": "lua-5.1",
+ "buildsystem": "simple",
+ "build-commands": [
+ "make -j $FLATPAK_BUILDER_N_JOBS CFLAGS=\"$CFLAGS -fPIC -DLUA_USE_LINUX\" linux",
+ "make INSTALL_TOP=$FLATPAK_DEST TO_LIB='liblua.a liblua.so.5.1.5' install",
+ "ln -sf liblua.so.5.1.5 $FLATPAK_DEST/lib/liblua.so",
+ "ln -sf liblua.so.5.1.5 $FLATPAK_DEST/lib/liblua.so.5.1",
+ "install -Dm0644 etc/lua.pc $FLATPAK_DEST/lib/pkgconfig/lua.pc",
+ "ln -sf lua.pc $FLATPAK_DEST/lib/pkgconfig/lua51.pc",
+ "ln -sf lua.pc $FLATPAK_DEST/lib/pkgconfig/lua5.1.pc",
+ "ln -sf lua.pc $FLATPAK_DEST/lib/pkgconfig/lua-5.1.pc"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://www.lua.org/ftp/lua-5.1.5.tar.gz",
+ "sha256": "2640fc56a795f29d28ef15e13c34a47e223960b0240e8cb0a82d9b0738695333"
+ },
+ {
+ "type": "patch",
+ "path": "lua-5.1.5-so.patch"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "sed -i \"s|/usr/local|$FLATPAK_DEST|\" etc/lua.pc src/luaconf.h"
+ ]
+ }
+ ],
+ "cleanup": [
+ "*.a",
+ "/bin",
+ "/include",
+ "/lib/pkgconfig",
+ "/man"
+ ]
+}
diff --git a/subprojects/shared-modules/lua5.3/lua-5.3.5.json b/subprojects/shared-modules/lua5.3/lua-5.3.5.json
new file mode 100644
index 00000000..c789fd65
--- /dev/null
+++ b/subprojects/shared-modules/lua5.3/lua-5.3.5.json
@@ -0,0 +1,46 @@
+{
+ "name": "lua-5.3",
+ "buildsystem": "simple",
+ "build-commands": [
+ "make -j $FLATPAK_BUILDER_N_JOBS CFLAGS=\"$CFLAGS -fPIC -DLUA_USE_LINUX\" linux",
+ "make TO_LIB=liblua.so.5.3.5 INSTALL_TOP=$FLATPAK_DEST install",
+ "ln -sf liblua.so.5.3.5 $FLATPAK_DEST/lib/liblua.so",
+ "ln -sf liblua.so.5.3.5 $FLATPAK_DEST/lib/liblua.so.5.3",
+ "make INSTALL_TOP=${FLATPAK_DEST} pc > lua.pc",
+ "cat lua.pc.in >> lua.pc",
+ "install -Dm644 lua.pc $FLATPAK_DEST/lib/pkgconfig/lua.pc",
+ "ln -sf lua.pc $FLATPAK_DEST/lib/pkgconfig/lua53.pc",
+ "ln -sf lua.pc $FLATPAK_DEST/lib/pkgconfig/lua5.3.pc",
+ "ln -sf lua.pc $FLATPAK_DEST/lib/pkgconfig/lua-5.3.pc"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://www.lua.org/ftp/lua-5.3.5.tar.gz",
+ "sha256": "0c2eed3f960446e1a3e4b9a1ca2f3ff893b6ce41942cf54d5dd59ab4b3b058ac"
+ },
+ {
+ "type": "patch",
+ "path": "makefile-add-liblua.so-rule.patch"
+ },
+ {
+ "type": "file",
+ "path": "lua.pc.in"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "sed -i \"s|/usr/local/|$FLATPAK_DEST/|;s|LUA_IDSIZE 60|LUA_IDSIZE 512|\" src/luaconf.h",
+ "# Lua 5.3.5 has wrong release version in its Makefile. Fix it.",
+ "sed 's/^R= \$V.4/R= \$V.5/' -i Makefile",
+ "sed -i '12 a\\\\n#define LUA_COMPAT_5_1\\n#define LUA_COMPAT_5_2' src/luaconf.h"
+ ]
+ }
+ ],
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/pkgconfig",
+ "/share/man"
+ ]
+}
diff --git a/subprojects/shared-modules/lua5.3/lua.pc.in b/subprojects/shared-modules/lua5.3/lua.pc.in
new file mode 100644
index 00000000..6698f8bc
--- /dev/null
+++ b/subprojects/shared-modules/lua5.3/lua.pc.in
@@ -0,0 +1,8 @@
+exec_prefix=${prefix}
+
+Name: Lua
+Description: An Extensible Extension Language
+Version: ${version}
+Requires:
+Libs: -L${libdir} -llua -lm
+Cflags: -I${includedir} \ No newline at end of file
diff --git a/subprojects/shared-modules/lua5.3/makefile-add-liblua.so-rule.patch b/subprojects/shared-modules/lua5.3/makefile-add-liblua.so-rule.patch
new file mode 100644
index 00000000..f675d4d4
--- /dev/null
+++ b/subprojects/shared-modules/lua5.3/makefile-add-liblua.so-rule.patch
@@ -0,0 +1,47 @@
+diff --git a/Makefile b/Makefile
+index 7fa91c8..dccf485 100644
+--- a/Makefile
++++ b/Makefile
+@@ -52,7 +52,7 @@ R= $V.0
+ all: $(PLAT)
+
+ $(PLATS) clean:
+- cd src && $(MAKE) $@
++ cd src && $(MAKE) $@ V=$(V) R=$(R)
+
+ test: dummy
+ src/lua -v
+diff --git a/src/Makefile b/src/Makefile
+index 2e7a412..fa5769f 100644
+--- a/src/Makefile
++++ b/src/Makefile
+@@ -29,6 +29,7 @@ MYOBJS=
+ PLATS= aix bsd c89 freebsd generic linux macosx mingw posix solaris
+
+ LUA_A= liblua.a
++LUA_SO= liblua.so
+ CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o \
+ lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o \
+ ltm.o lundump.o lvm.o lzio.o
+@@ -43,7 +44,7 @@ LUAC_T= luac
+ LUAC_O= luac.o
+
+ ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O)
+-ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
++ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)
+ ALL_A= $(LUA_A)
+
+ # Targets start here.
+@@ -59,6 +60,12 @@ $(LUA_A): $(BASE_O)
+ $(AR) $@ $(BASE_O)
+ $(RANLIB) $@
+
++$(LUA_SO): $(CORE_O) $(LIB_O)
++ $(CC) -shared -ldl -Wl,-soname,$(LUA_SO).$(V) -o $@.$(R) $? -lm $(MYLDFLAGS)
++ ln -sf $(LUA_SO).$(R) $(LUA_SO).$(V)
++ ln -sf $(LUA_SO).$(R) $(LUA_SO)
++
++
+ $(LUA_T): $(LUA_O) $(LUA_A)
+ $(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)
+ \ No newline at end of file
diff --git a/subprojects/shared-modules/lua5.4/lua-5.4.json b/subprojects/shared-modules/lua5.4/lua-5.4.json
new file mode 100644
index 00000000..a164fb83
--- /dev/null
+++ b/subprojects/shared-modules/lua5.4/lua-5.4.json
@@ -0,0 +1,44 @@
+{
+ "name": "lua-5.4",
+ "buildsystem": "simple",
+ "build-commands": [
+ "make -j $FLATPAK_BUILDER_N_JOBS CFLAGS=\"$CFLAGS -fPIC -DLUA_USE_LINUX\" linux",
+ "make TO_LIB=liblua.so.5.4.4 INSTALL_TOP=$FLATPAK_DEST install",
+ "ln -sf liblua.so.5.4.4 $FLATPAK_DEST/lib/liblua.so",
+ "ln -sf liblua.so.5.4.4 $FLATPAK_DEST/lib/liblua.so.5.4",
+ "make INSTALL_TOP=${FLATPAK_DEST} pc > lua.pc",
+ "cat lua.pc.in >> lua.pc",
+ "install -Dm644 lua.pc $FLATPAK_DEST/lib/pkgconfig/lua.pc",
+ "ln -sf lua.pc $FLATPAK_DEST/lib/pkgconfig/lua54.pc",
+ "ln -sf lua.pc $FLATPAK_DEST/lib/pkgconfig/lua5.4.pc",
+ "ln -sf lua.pc $FLATPAK_DEST/lib/pkgconfig/lua-5.4.pc"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://www.lua.org/ftp/lua-5.4.4.tar.gz",
+ "sha256": "164c7849653b80ae67bec4b7473b884bf5cc8d2dca05653475ec2ed27b9ebf61"
+ },
+ {
+ "type": "patch",
+ "path": "makefile-add-liblua.so-rule.patch"
+ },
+ {
+ "type": "file",
+ "path": "lua.pc.in"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "sed -i \"s|/usr/local/|$FLATPAK_DEST/|;s|LUA_IDSIZE 60|LUA_IDSIZE 512|\" src/luaconf.h",
+ "sed -i '12 a\\\\n#define LUA_COMPAT_5_1\\n#define LUA_COMPAT_5_2' src/luaconf.h"
+ ]
+ }
+ ],
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/pkgconfig",
+ "/share/man"
+ ]
+}
diff --git a/subprojects/shared-modules/lua5.4/lua.pc.in b/subprojects/shared-modules/lua5.4/lua.pc.in
new file mode 100644
index 00000000..6698f8bc
--- /dev/null
+++ b/subprojects/shared-modules/lua5.4/lua.pc.in
@@ -0,0 +1,8 @@
+exec_prefix=${prefix}
+
+Name: Lua
+Description: An Extensible Extension Language
+Version: ${version}
+Requires:
+Libs: -L${libdir} -llua -lm
+Cflags: -I${includedir} \ No newline at end of file
diff --git a/subprojects/shared-modules/lua5.4/makefile-add-liblua.so-rule.patch b/subprojects/shared-modules/lua5.4/makefile-add-liblua.so-rule.patch
new file mode 100644
index 00000000..7452f106
--- /dev/null
+++ b/subprojects/shared-modules/lua5.4/makefile-add-liblua.so-rule.patch
@@ -0,0 +1,42 @@
+--- a/Makefile 2021-12-24 10:55:05.836294155 -0500
++++ b/Makefile 2021-03-02 15:04:35.000000000 -0500
+@@ -52,7 +52,7 @@
+ all: $(PLAT)
+
+ $(PLATS) help test clean:
+- @cd src && $(MAKE) $@
++ @cd src && $(MAKE) $@ V=$(V) R=$(R)
+
+ install: dummy
+ cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_LMOD) $(INSTALL_CMOD)
+--- a/src/Makefile 2021-12-24 10:56:23.279935521 -0500
++++ b/src/Makefile 2021-02-09 13:47:17.000000000 -0500
+@@ -32,6 +32,7 @@
+ PLATS= guess aix bsd c89 freebsd generic linux linux-readline macosx mingw posix solaris
+
+ LUA_A= liblua.a
++LUA_SO= liblua.so
+ CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o
+ LIB_O= lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o
+ BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS)
+@@ -44,7 +44,7 @@
+ LUAC_O= luac.o
+
+ ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O)
+-ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
++ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)
+ ALL_A= $(LUA_A)
+
+ # Targets start here.
+@@ -60,6 +60,11 @@
+ $(AR) $@ $(BASE_O)
+ $(RANLIB) $@
+
++$(LUA_SO): $(CORE_O) $(LIB_O)
++ $(CC) -shared -ldl -Wl,-soname,$(LUA_SO).$(V) -o $@.$(R) $? -lm $(MYLDFLAGS)
++ ln -sf $(LUA_SO).$(R) $(LUA_SO).$(V)
++ ln -sf $(LUA_SO).$(R) $(LUA_SO)
++
+ $(LUA_T): $(LUA_O) $(LUA_A)
+ $(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)
+
diff --git a/subprojects/shared-modules/mac/mac.json b/subprojects/shared-modules/mac/mac.json
new file mode 100644
index 00000000..101b3dc2
--- /dev/null
+++ b/subprojects/shared-modules/mac/mac.json
@@ -0,0 +1,19 @@
+{
+ "name": "libmac",
+ "subdir": "Source/Projects/NonWindows",
+ "no-autogen": true,
+ "make-install-args": [
+ "prefix=/app"
+ ],
+ "cleanup": [
+ "/include/MAC"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://freac.org/patches/MAC_SDK_723.zip",
+ "sha256": "1d17d469dd2b4652e19cb91aa7cf76786fec999871a8f5729cd24064f989e9ae",
+ "strip-components": 0
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/physfs/physfs.json b/subprojects/shared-modules/physfs/physfs.json
new file mode 100644
index 00000000..5cc06271
--- /dev/null
+++ b/subprojects/shared-modules/physfs/physfs.json
@@ -0,0 +1,18 @@
+{
+ "name": "PhysicsFS",
+ "buildsystem": "cmake-ninja",
+ "config-opts": [ "-DPHYSFS_BUILD_TEST=OFF", "-DPHYSFS_BUILD_STATIC=OFF" ],
+ "cleanup": [
+ "/include",
+ "/lib/pkgconfig",
+ "/bin"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://icculus.org/physfs/downloads/physfs-3.0.2.tar.bz2",
+ "sha256": "304df76206d633df5360e738b138c94e82ccf086e50ba84f456d3f8432f9f863",
+ "size": 194888
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/pygame/audiofile-gcc6.patch b/subprojects/shared-modules/pygame/audiofile-gcc6.patch
new file mode 100644
index 00000000..89afb6d8
--- /dev/null
+++ b/subprojects/shared-modules/pygame/audiofile-gcc6.patch
@@ -0,0 +1,21 @@
+From b62c902dd258125cac86cd2df21fc898035a43d3 Mon Sep 17 00:00:00 2001
+From: Michael Pruett <michael@68k.org>
+Date: Mon, 29 Aug 2016 23:08:26 -0500
+Subject: [PATCH] Fix undefined behavior in sign conversion.
+Origin: https://github.com/mpruett/audiofile/commit/b62c902dd258125cac86cd2df21fc898035a43d3
+
+---
+diff --git a/libaudiofile/modules/SimpleModule.h b/libaudiofile/modules/SimpleModule.h
+index 03c6c69..bad85ad 100644
+--- a/libaudiofile/modules/SimpleModule.h
++++ b/libaudiofile/modules/SimpleModule.h
+@@ -123,7 +123,8 @@ struct signConverter
+ typedef typename IntTypes<Format>::UnsignedType UnsignedType;
+
+ static const int kScaleBits = (Format + 1) * CHAR_BIT - 1;
+- static const int kMinSignedValue = -1 << kScaleBits;
++ static const int kMaxSignedValue = (((1 << (kScaleBits - 1)) - 1) << 1) + 1;
++ static const int kMinSignedValue = -kMaxSignedValue - 1;
+
+ struct signedToUnsigned : public std::unary_function<SignedType, UnsignedType>
+ {
diff --git a/subprojects/shared-modules/pygame/fluidsynth-no-rawmidi.patch b/subprojects/shared-modules/pygame/fluidsynth-no-rawmidi.patch
new file mode 100644
index 00000000..88a89742
--- /dev/null
+++ b/subprojects/shared-modules/pygame/fluidsynth-no-rawmidi.patch
@@ -0,0 +1,69 @@
+diff -rupN fluidsynth-1.1.6.orig/src/drivers/fluid_alsa.c fluidsynth-1.1.6/src/drivers/fluid_alsa.c
+--- fluidsynth-1.1.6.orig/src/drivers/fluid_alsa.c 2012-08-16 05:01:13.000000000 +0100
++++ fluidsynth-1.1.6/src/drivers/fluid_alsa.c 2017-02-28 21:26:57.033244239 +0000
+@@ -96,7 +96,7 @@ struct fluid_alsa_formats_t fluid_alsa_f
+ };
+
+
+-
++#if 0
+ /*
+ * fluid_alsa_rawmidi_driver_t
+ *
+@@ -119,7 +119,7 @@ fluid_midi_driver_t* new_fluid_alsa_rawm
+
+ int delete_fluid_alsa_rawmidi_driver(fluid_midi_driver_t* p);
+ static void fluid_alsa_midi_run(void* d);
+-
++#endif
+
+ /*
+ * fluid_alsa_seq_driver_t
+@@ -535,7 +535,7 @@ static void fluid_alsa_audio_run_s16 (vo
+ *
+ */
+
+-
++#if 0
+ void fluid_alsa_rawmidi_driver_settings(fluid_settings_t* settings)
+ {
+ fluid_settings_register_str(settings, "midi.alsa.device", "default", 0, NULL, NULL);
+@@ -698,7 +698,7 @@ fluid_alsa_midi_run(void* d)
+ }
+ }
+ }
+-
++#endif
+ /**************************************************************
+ *
+ * Alsa sequencer
+diff -rupN fluidsynth-1.1.6.orig/src/drivers/fluid_mdriver.c fluidsynth-1.1.6/src/drivers/fluid_mdriver.c
+--- fluidsynth-1.1.6.orig/src/drivers/fluid_mdriver.c 2012-08-16 05:01:13.000000000 +0100
++++ fluidsynth-1.1.6/src/drivers/fluid_mdriver.c 2017-02-28 21:24:43.887833321 +0000
+@@ -24,11 +24,13 @@
+
+ /* ALSA */
+ #if ALSA_SUPPORT
++#if 0
+ fluid_midi_driver_t* new_fluid_alsa_rawmidi_driver(fluid_settings_t* settings,
+ handle_midi_event_func_t handler,
+ void* event_handler_data);
+ int delete_fluid_alsa_rawmidi_driver(fluid_midi_driver_t* p);
+ void fluid_alsa_rawmidi_driver_settings(fluid_settings_t* settings);
++#endif
+
+ fluid_midi_driver_t* new_fluid_alsa_seq_driver(fluid_settings_t* settings,
+ handle_midi_event_func_t handler,
+@@ -109,10 +111,12 @@ struct fluid_mdriver_definition_t fluid_
+ fluid_oss_midi_driver_settings },
+ #endif
+ #if ALSA_SUPPORT
++#if 0
+ { "alsa_raw",
+ new_fluid_alsa_rawmidi_driver,
+ delete_fluid_alsa_rawmidi_driver,
+ fluid_alsa_rawmidi_driver_settings },
++#endif
+ { "alsa_seq",
+ new_fluid_alsa_seq_driver,
+ delete_fluid_alsa_seq_driver,
diff --git a/subprojects/shared-modules/pygame/portmidi-no-java.patch b/subprojects/shared-modules/pygame/portmidi-no-java.patch
new file mode 100644
index 00000000..00ef8eaa
--- /dev/null
+++ b/subprojects/shared-modules/pygame/portmidi-no-java.patch
@@ -0,0 +1,105 @@
+diff -rupN portmidi.orig/CMakeLists.txt portmidi/CMakeLists.txt
+--- portmidi.orig/CMakeLists.txt 2010-09-20 15:57:48.000000000 +0100
++++ portmidi/CMakeLists.txt 2017-03-03 13:50:58.494561245 +0000
+@@ -71,7 +71,3 @@ add_subdirectory(pm_common)
+ add_subdirectory(pm_test)
+
+ add_subdirectory(pm_dylib)
+-
+-# Cannot figure out how to make an xcode Java application with CMake
+-add_subdirectory(pm_java)
+-
+diff -rupN portmidi.orig/pm_common/CMakeLists.txt portmidi/pm_common/CMakeLists.txt
+--- portmidi.orig/pm_common/CMakeLists.txt 2010-09-20 15:57:48.000000000 +0100
++++ portmidi/pm_common/CMakeLists.txt 2017-03-03 14:02:32.851938051 +0000
+@@ -67,14 +67,6 @@ if(UNIX)
+ message(STATUS "SYSROOT: " ${CMAKE_OSX_SYSROOT})
+ else(APPLE)
+ # LINUX settings...
+- include(FindJNI)
+- message(STATUS "JAVA_JVM_LIB_PATH is " ${JAVA_JVM_LIB_PATH})
+- message(STATUS "JAVA_INCLUDE_PATH is " ${JAVA_INCLUDE_PATH})
+- message(STATUS "JAVA_INCLUDE_PATH2 is " ${JAVA_INCLUDE_PATH2})
+- message(STATUS "JAVA_JVM_LIBRARY is " ${JAVA_JVM_LIBRARY})
+- set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
+- # libjvm.so is found relative to JAVA_INCLUDE_PATH:
+- set(JAVAVM_LIB ${JAVA_JVM_LIBRARY}/libjvm.so)
+
+ set(LINUXSRC pmlinuxalsa pmlinux finddefault)
+ prepend_path(LIBSRC ../pm_linux/ ${LINUXSRC})
+@@ -99,7 +91,6 @@ else(UNIX)
+ set(PM_NEEDED_LIBS winmm.lib)
+ endif(WIN32)
+ endif(UNIX)
+-set(JNI_EXTRA_LIBS ${PM_NEEDED_LIBS} ${JAVA_JVM_LIBRARY})
+
+ # this completes the list of library sources by adding shared code
+ list(APPEND LIBSRC pmutil portmidi)
+@@ -109,19 +100,11 @@ add_library(portmidi-static ${LIBSRC})
+ set_target_properties(portmidi-static PROPERTIES OUTPUT_NAME "portmidi_s")
+ target_link_libraries(portmidi-static ${PM_NEEDED_LIBS})
+
+-# define the jni library
+-include_directories(${JAVA_INCLUDE_PATHS})
+-
+-set(JNISRC ${LIBSRC} ../pm_java/pmjni/pmjni.c)
+-add_library(pmjni SHARED ${JNISRC})
+-target_link_libraries(pmjni ${JNI_EXTRA_LIBS})
+-set_target_properties(pmjni PROPERTIES EXECUTABLE_EXTENSION "jnilib")
+-
+ # install the libraries (Linux and Mac OS X command line)
+ if(UNIX)
+- INSTALL(TARGETS portmidi-static pmjni
+- LIBRARY DESTINATION /usr/local/lib
+- ARCHIVE DESTINATION /usr/local/lib)
++ INSTALL(TARGETS portmidi-static
++ LIBRARY DESTINATION /app/lib
++ ARCHIVE DESTINATION /app/lib)
+ # .h files installed by pm_dylib/CMakeLists.txt, so don't need them here
+ # INSTALL(FILES portmidi.h ../porttime/porttime.h
+ # DESTINATION /usr/local/include)
+diff -rupN portmidi.orig/pm_dylib/CMakeLists.txt portmidi/pm_dylib/CMakeLists.txt
+--- portmidi.orig/pm_dylib/CMakeLists.txt 2009-11-20 00:41:10.000000000 +0000
++++ portmidi/pm_dylib/CMakeLists.txt 2017-03-03 14:03:56.807104521 +0000
+@@ -63,7 +63,6 @@ if(UNIX)
+ message(STATUS "SYSROOT: " ${CMAKE_OSX_SYSROOT})
+ else(APPLE)
+ # LINUX settings...
+- include(FindJNI)
+ # message(STATUS "JAVA_JVM_LIB_PATH is " ${JAVA_JVM_LIB_PATH})
+ # message(STATUS "JAVA_INCLUDE_PATH is " ${JAVA_INCLUDE_PATH})
+ # note: should use JAVA_JVM_LIB_PATH, but it is not set properly
+@@ -75,12 +74,7 @@ if(UNIX)
+ # JAVA_INCLUDE_PATH2; if no, then we need to make both JAVA_INCLUDE_PATH
+ # and JAVA_INCLUDE_PATH2 set by user (will need clear documentation
+ # because JAVA_INCLUDE_PATH2 is pretty obscure)
+- set(JAVA_INCLUDE_PATH ${JAVA_INCLUDE_PATH-UNKNOWN}
+- CACHE STRING "where to find Java SDK include directory")
+- set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH}/linux)
+- # libjvm.so is found relative to JAVA_INCLUDE_PATH:
+- set(JAVAVM_LIB ${JAVA_INCLUDE_PATH}/../jre/lib/i386/client/libjvm.so)
+-
++
+ set(LINUXSRC pmlinuxalsa pmlinux finddefault)
+ prepend_path(LIBSRC ../pm_linux/ ${LINUXSRC})
+ list(APPEND LIBSRC ../porttime/ptlinux)
+@@ -106,7 +100,6 @@ else(UNIX)
+ # message(STATUS "JAVAVM_LIB: " ${JAVAVM_LIB})
+ endif(WIN32)
+ endif(UNIX)
+-set(JNI_EXTRA_LIBS ${PM_NEEDED_LIBS} ${JAVAVM_LIB})
+
+ # this completes the list of library sources by adding shared code
+ set(SHARED_FILES pmutil portmidi)
+@@ -120,8 +113,8 @@ target_link_libraries(portmidi-dynamic $
+ # install the libraries (Linux and Mac OS X command line)
+ if(UNIX)
+ INSTALL(TARGETS portmidi-dynamic
+- LIBRARY DESTINATION /usr/local/lib
+- ARCHIVE DESTINATION /usr/local/lib)
++ LIBRARY DESTINATION /app/lib
++ ARCHIVE DESTINATION /app/lib)
+ INSTALL(FILES ../pm_common/portmidi.h ../porttime/porttime.h
+- DESTINATION /usr/local/include)
++ DESTINATION /app/include)
+ endif(UNIX)
diff --git a/subprojects/shared-modules/pygame/pygame-1.9.6.json b/subprojects/shared-modules/pygame/pygame-1.9.6.json
new file mode 100644
index 00000000..d3c84c77
--- /dev/null
+++ b/subprojects/shared-modules/pygame/pygame-1.9.6.json
@@ -0,0 +1,112 @@
+{
+ "name": "pygame",
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://files.pythonhosted.org/packages/0f/9c/78626be04e193c0624842090fe5555b3805c050dfaa81c8094d6441db2be/pygame-1.9.6.tar.gz",
+ "sha256": "301c6428c0880ecd4a9e3951b80e539c33863b6ff356a443db1758de4f297957"
+ }
+ ],
+ "buildsystem": "simple",
+ "build-commands": [
+ "pip3 install --ignore-installed --no-deps --prefix=/app ."
+ ],
+ "build-options": {
+ "env": {
+ "PORTMIDI_INC_PORTTIME": "1",
+ "PYGAME_EXTRA_BASE": "/app"
+ },
+ "arch": {
+ "aarch64": {
+ "env": {
+ "ORIGLIBDIRS": "/lib:/lib64:/lib/aarch64-linux-gnu"
+ }
+ },
+ "arm": {
+ "env": {
+ "ORIGLIBDIRS": "/lib:/lib/arm-linux-gnueabihf"
+ }
+ },
+ "i386": {
+ "env": {
+ "ORIGLIBDIRS": "/lib:/lib/i386-linux-gnu"
+ }
+ },
+ "x86_64": {
+ "env": {
+ "ORIGLIBDIRS": "/lib:/lib64:/lib/x86_64-linux-gnu"
+ }
+ }
+ }
+ },
+ "modules": [
+ "../SDL/SDL-1.2.15.json",
+ "../SDL/SDL_image-1.2.12.json",
+ "../SDL/SDL_ttf-2.0.11.json",
+ "../smpeg/smpeg-0.4.5.json",
+ "../SDL/SDL_mixer-1.2.12.json",
+ {
+ "name": "audiofile",
+ "sources": [
+ {
+ "type": "archive",
+ "url": "http://audiofile.68k.org/audiofile-0.3.6.tar.gz",
+ "sha256": "cdc60df19ab08bfe55344395739bb08f50fc15c92da3962fac334d3bff116965"
+ },
+ {
+ "type": "patch",
+ "path": "audiofile-gcc6.patch"
+ }
+ ]
+ },
+ {
+ "name": "libmikmod",
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://sourceforge.net/projects/mikmod/files/libmikmod/3.3.11.1/libmikmod-3.3.11.1.tar.gz",
+ "sha256": "ad9d64dfc8f83684876419ea7cd4ff4a41d8bcd8c23ef37ecb3a200a16b46d19"
+ }
+ ]
+ },
+ {
+ "name": "fluidsynth",
+ "buildsystem": "cmake-ninja",
+ "config-opts": [
+ "-DCMAKE_BUILD_TYPE=Release"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/FluidSynth/fluidsynth/archive/refs/tags/v1.1.11.tar.gz",
+ "sha256": "da8878ff374d12392eecf87e96bad8711b8e76a154c25a571dd8614d1af80de8"
+ },
+ {
+ "type": "patch",
+ "path": "fluidsynth-no-rawmidi.patch"
+ }
+ ]
+ },
+ {
+ "name": "portmidi",
+ "buildsystem": "cmake-ninja",
+ "config-opts": [
+ "-DCMAKE_BUILD_TYPE=Release",
+ "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY:STRING=/app/lib",
+ "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:STRING=/app/lib",
+ "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:STRING=/app/bin"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "http://downloads.sourceforge.net/project/portmedia/portmidi/217/portmidi-src-217.zip",
+ "sha256": "08e9a892bd80bdb1115213fb72dc29a7bf2ff108b378180586aa65f3cfd42e0f"
+ },
+ {
+ "type": "patch",
+ "path": "portmidi-no-java.patch"
+ }
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/pygtk/pygtk.json b/subprojects/shared-modules/pygtk/pygtk.json
new file mode 100644
index 00000000..5319e4b3
--- /dev/null
+++ b/subprojects/shared-modules/pygtk/pygtk.json
@@ -0,0 +1,107 @@
+{
+ "name": "pygtk",
+ "config-opts": [
+ "--disable-docs"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/pygtk/2.24/pygtk-2.24.0.tar.gz",
+ "sha256": "6e3e54fa6e65a69ac60bd58cb2e60a57f3346ac52efe995f3d10b6c38c972fd8"
+ },
+ {
+ "type": "patch",
+ "path": "pygtk.patch"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "cp -p /usr/share/automake-*/config.{sub,guess} ."
+ ]
+ }
+ ],
+ "cleanup": [
+ "/bin",
+ "/include/pygtk-2.0",
+ "*.la",
+ "/lib/pkgconfig",
+ "/lib/pygtk",
+ "/share/gtk-doc",
+ "/share/pygtk"
+ ],
+ "modules": [
+ {
+ "name": "python2-pycairo",
+ "buildsystem": "meson",
+ "config-opts": [
+ "-Dpython=python2"
+ ],
+ "cleanup": [
+ "/include/pycairo",
+ "/lib/pkgconfig",
+ "/lib/python2.7/site-packages/cairo/include"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://github.com/pygobject/pycairo/releases/download/v1.18.2/pycairo-1.18.2.tar.gz",
+ "sha256": "dcb853fd020729516e8828ad364084e752327d4cff8505d20b13504b32b16531"
+ }
+ ]
+ },
+ {
+ "name": "pygobject",
+ "config-opts": [
+ "--disable-glibtest"
+ ],
+ "cleanup": [
+ "/bin",
+ "/include/pygtk-2.0",
+ "*.la",
+ "/lib/pkgconfig",
+ "/share/gtk-doc",
+ "/share/pygobject"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/pygobject/2.28/pygobject-2.28.7.tar.xz",
+ "sha256": "bb9d25a3442ca7511385a7c01b057492095c263784ef31231ffe589d83a96a5a"
+ }
+ ]
+ },
+ {
+ "name": "libglade",
+ "rm-configure": true,
+ "cleanup": [
+ "/bin",
+ "/include/libglade-2.0",
+ "*.a",
+ "*.la",
+ "/lib/pkgconfig",
+ "/share/gtk-doc",
+ "/share/xml/libglade"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/libglade/2.6/libglade-2.6.4.tar.gz",
+ "sha256": "c41d189b68457976069073e48d6c14c183075d8b1d8077cb6dfb8b7c5097add3"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "rm -f config.guess"
+ ]
+ },
+ {
+ "type": "script",
+ "commands": [
+ "autoreconf -fiv"
+ ],
+ "dest-filename": "autogen.sh"
+ }
+ ]
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/pygtk/pygtk.patch b/subprojects/shared-modules/pygtk/pygtk.patch
new file mode 100644
index 00000000..ba4141e3
--- /dev/null
+++ b/subprojects/shared-modules/pygtk/pygtk.patch
@@ -0,0 +1,39 @@
+From 877164b6b70780468a31d8211f29421b6f34b0c8 Mon Sep 17 00:00:00 2001
+From: Mathieu Bridon <bochecha@daitauha.fr>
+Date: Thu, 24 Oct 2019 22:58:36 +0200
+Subject: [PATCH] Drop the PangoFont find_shaper virtual method
+
+This API has been removed from Pango 1.44.6, because it was completely
+unused by anything.
+
+However, PyGTK tries to bind everything, even unused API.
+
+Removing this from PyGTK means we can build it against the latest Pango
+again.
+---
+ pango.defs | 9 ---------
+ 1 file changed, 9 deletions(-)
+
+diff --git a/pango.defs b/pango.defs
+index 2a79ecc..862667a 100644
+--- a/pango.defs
++++ b/pango.defs
+@@ -1391,15 +1391,6 @@
+ )
+ )
+
+-(define-virtual find_shaper
+- (of-object "PangoFont")
+- (return-type "PangoEngineShape*")
+- (parameters
+- '("PangoLanguage*" "lang")
+- '("guint32" "ch")
+- )
+-)
+-
+ (define-virtual get_glyph_extents
+ (of-object "PangoFont")
+ (return-type "none")
+--
+2.21.0
+
diff --git a/subprojects/shared-modules/python2.7/python-2.7.json b/subprojects/shared-modules/python2.7/python-2.7.json
new file mode 100644
index 00000000..afdef902
--- /dev/null
+++ b/subprojects/shared-modules/python2.7/python-2.7.json
@@ -0,0 +1,52 @@
+{
+ "name": "python-2.7",
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz",
+ "sha256": "b62c0e7937551d0cc02b8fd5cb0f544f9405bafc9a54d3808ed4594812edef43"
+ }
+ ],
+ "config-opts": [
+ "--enable-shared",
+ "--with-ensurepip=yes",
+ "--with-system-expat",
+ "--with-system-ffi",
+ "--enable-loadable-sqlite-extensions",
+ "--with-dbmliborder=gdbm",
+ "--enable-unicode=ucs4"
+ ],
+ "post-install": [
+ /* Theres seem to be a permissions missmatch that causes the debug stripping to fail */
+ "chmod 644 $FLATPAK_DEST/lib/libpython2.7.so.1.0"
+ ],
+ "cleanup": [
+ "/bin/2to3*",
+ "/bin/easy_install*",
+ "/bin/idle*",
+ "/bin/pydoc*",
+ "/bin/python*-config",
+ "/bin/pyvenv*",
+ "/include",
+ "/lib/pkgconfig",
+ "/lib/python*/config",
+ "/share",
+
+ /* Test scripts */
+ "/lib/python*/test",
+ "/lib/python*/*/test",
+ "/lib/python*/*/tests",
+ "/lib/python*/lib-tk/test",
+ "/lib/python*/lib-dynload/_*_test.*.so",
+ "/lib/python*/lib-dynload/_test*.*.so",
+
+ /* Unused modules */
+ "/lib/python*/idlelib",
+ "/lib/python*/tkinter*",
+ "/lib/python*/turtle*",
+ "/lib/python*/lib2to3*",
+
+ /* Static library */
+ "/lib/python2.7/config/libpython2.7.a"
+ ]
+}
diff --git a/subprojects/shared-modules/qt4/disable-sslv3.patch b/subprojects/shared-modules/qt4/disable-sslv3.patch
new file mode 100644
index 00000000..5ebd9741
--- /dev/null
+++ b/subprojects/shared-modules/qt4/disable-sslv3.patch
@@ -0,0 +1,54 @@
+diff -u -r qt-everywhere-opensource-src-4.8.7/src/network/ssl/qsslsocket_openssl.cpp qt-everywhere-opensource-src-4.8.7-nossl3/src/network/ssl/qsslsocket_openssl.cpp
+--- qt-everywhere-opensource-src-4.8.7/src/network/ssl/qsslsocket_openssl.cpp 2015-05-07 16:14:44.000000000 +0200
++++ qt-everywhere-opensource-src-4.8.7-nossl3/src/network/ssl/qsslsocket_openssl.cpp 2016-03-04 11:29:17.119300898 +0100
+@@ -267,7 +267,11 @@
+ #endif
+ break;
+ case QSsl::SslV3:
++#ifndef OPENSSL_NO_SSL3
+ ctx = q_SSL_CTX_new(client ? q_SSLv3_client_method() : q_SSLv3_server_method());
++#else
++ ctx = 0; // SSL 3 not supported by the system, but chosen deliberately -> error
++#endif
+ break;
+ case QSsl::SecureProtocols: // SslV2 will be disabled below
+ case QSsl::TlsV1SslV3: // SslV2 will be disabled below
+diff -u -r qt-everywhere-opensource-src-4.8.7/src/network/ssl/qsslsocket_openssl_symbols.cpp qt-everywhere-opensource-src-4.8.7-nossl3/src/network/ssl/qsslsocket_openssl_symbols.cpp
+--- qt-everywhere-opensource-src-4.8.7/src/network/ssl/qsslsocket_openssl_symbols.cpp 2015-05-07 16:14:44.000000000 +0200
++++ qt-everywhere-opensource-src-4.8.7-nossl3/src/network/ssl/qsslsocket_openssl_symbols.cpp 2016-03-04 11:28:52.806050135 +0100
+@@ -228,13 +228,17 @@
+ #ifndef OPENSSL_NO_SSL2
+ DEFINEFUNC(const SSL_METHOD *, SSLv2_client_method, DUMMYARG, DUMMYARG, return 0, return)
+ #endif
++#ifndef OPENSSL_NO_SSL3
+ DEFINEFUNC(const SSL_METHOD *, SSLv3_client_method, DUMMYARG, DUMMYARG, return 0, return)
++#endif
+ DEFINEFUNC(const SSL_METHOD *, SSLv23_client_method, DUMMYARG, DUMMYARG, return 0, return)
+ DEFINEFUNC(const SSL_METHOD *, TLSv1_client_method, DUMMYARG, DUMMYARG, return 0, return)
+ #ifndef OPENSSL_NO_SSL2
+ DEFINEFUNC(const SSL_METHOD *, SSLv2_server_method, DUMMYARG, DUMMYARG, return 0, return)
+ #endif
++#ifndef OPENSSL_NO_SSL3
+ DEFINEFUNC(const SSL_METHOD *, SSLv3_server_method, DUMMYARG, DUMMYARG, return 0, return)
++#endif
+ DEFINEFUNC(const SSL_METHOD *, SSLv23_server_method, DUMMYARG, DUMMYARG, return 0, return)
+ DEFINEFUNC(const SSL_METHOD *, TLSv1_server_method, DUMMYARG, DUMMYARG, return 0, return)
+ #else
+@@ -822,13 +826,17 @@
+ #ifndef OPENSSL_NO_SSL2
+ RESOLVEFUNC(SSLv2_client_method)
+ #endif
++#ifndef OPENSSL_NO_SSL3
+ RESOLVEFUNC(SSLv3_client_method)
++#endif
+ RESOLVEFUNC(SSLv23_client_method)
+ RESOLVEFUNC(TLSv1_client_method)
+ #ifndef OPENSSL_NO_SSL2
+ RESOLVEFUNC(SSLv2_server_method)
+ #endif
++#ifndef OPENSSL_NO_SSL3
+ RESOLVEFUNC(SSLv3_server_method)
++#endif
+ RESOLVEFUNC(SSLv23_server_method)
+ RESOLVEFUNC(TLSv1_server_method)
+ RESOLVEFUNC(X509_NAME_entry_count)
diff --git a/subprojects/shared-modules/qt4/fixgcc11.patch b/subprojects/shared-modules/qt4/fixgcc11.patch
new file mode 100644
index 00000000..b0fd3d1b
--- /dev/null
+++ b/subprojects/shared-modules/qt4/fixgcc11.patch
@@ -0,0 +1,11 @@
+--- a/tools/linguist/linguist/messagemodel.cpp 2021-06-07 12:18:43.713434493 +0200
++++ b/tools/linguist/linguist/messagemodel.cpp 2021-06-07 12:24:24.828016548 +0200
+@@ -183,7 +183,7 @@
+ if (ContextItem *c = one->findContext(oc->context())) {
+ for (int j = 0; j < oc->messageCount(); ++j) {
+ MessageItem *m = oc->messageItem(j);
+- if (c->findMessage(m->text(), m->comment()) >= 0)
++ if (c->findMessage(m->text(), m->comment()))
+ ++inBoth;
+ }
+ }
diff --git a/subprojects/shared-modules/qt4/fixgcc9.patch b/subprojects/shared-modules/qt4/fixgcc9.patch
new file mode 100644
index 00000000..6501a83c
--- /dev/null
+++ b/subprojects/shared-modules/qt4/fixgcc9.patch
@@ -0,0 +1,31 @@
+--- qt-everywhere-opensource-src-4.8.7/src/corelib/global/qglobal.h 2015-05-07 16:14:48.000000000 +0200
++++ qt-everywhere-opensource-src-4.8.7-gcc9/src/corelib/global/qglobal.h 2020-05-28 16:24:45.160340385 +0200
+@@ -2482,22 +2482,22 @@
+
+ #endif /* Q_NO_TYPESAFE_FLAGS */
+
+-#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_RVCT)
++#if (defined(Q_CC_GNU) && !defined(Q_CC_RVCT))
+ /* make use of typeof-extension */
+ template <typename T>
+ class QForeachContainer {
+ public:
+- inline QForeachContainer(const T& t) : c(t), brk(0), i(c.begin()), e(c.end()) { }
++ inline QForeachContainer(const T& t) : c(t), i(c.begin()), e(c.end()), control(1) { }
+ const T c;
+- int brk;
+ typename T::const_iterator i, e;
++ int control;
+ };
+
+ #define Q_FOREACH(variable, container) \
+ for (QForeachContainer<__typeof__(container)> _container_(container); \
+- !_container_.brk && _container_.i != _container_.e; \
+- __extension__ ({ ++_container_.brk; ++_container_.i; })) \
+- for (variable = *_container_.i;; __extension__ ({--_container_.brk; break;}))
++ _container_.control && _container_.i != _container_.e; \
++ ++_container_.i, _container_.control ^= 1) \
++ for (variable = *_container_.i; _container_.control; _container_.control = 0)
+
+ #else
+
diff --git a/subprojects/shared-modules/qt4/qt4-4.8.7-minimal.json b/subprojects/shared-modules/qt4/qt4-4.8.7-minimal.json
new file mode 100644
index 00000000..00cc5706
--- /dev/null
+++ b/subprojects/shared-modules/qt4/qt4-4.8.7-minimal.json
@@ -0,0 +1,118 @@
+{
+ "name": "qt4",
+ "config-opts": [
+ "-verbose",
+ "-confirm-license",
+ "-opensource",
+ "-release",
+ "-shared",
+ "-no-static",
+ "-fast",
+ "-datadir", "/app/lib/qt4",
+ "-importdir", "/app/lib/qt4/imports",
+ "-plugindir", "/app/lib/qt4/plugins",
+ "-translationdir", "/app/share/qt4/translations",
+ "-accessibility",
+ "-exceptions",
+ "-fontconfig",
+ "-glib",
+ "-dbus-linked",
+ "-openssl-linked",
+ "-optimized-qmake",
+ "-system-libjpeg",
+ "-system-libpng",
+ "-system-libtiff",
+ "-system-proxies",
+ "-system-zlib",
+ "-no-cups",
+ "-no-declarative",
+ "-no-gtkstyle",
+ "-no-javascript-jit",
+ "-no-libmng",
+ "-no-multimedia",
+ "-no-nis",
+ "-no-opengl",
+ "-no-phonon",
+ "-no-phonon-backend",
+ "-no-qt3support",
+ "-no-rpath",
+ "-no-script",
+ "-no-scripttools",
+ "-no-sql-db2",
+ "-no-sql-ibase",
+ "-no-sql-mysql",
+ "-no-sql-oci",
+ "-no-sql-odbc",
+ "-no-sql-psql",
+ "-no-sql-sqlite",
+ "-no-sql-sqlite2",
+ "-no-sql-sqlite_symbian",
+ "-no-sql-symsql",
+ "-no-sql-tds",
+ "-no-svg",
+ "-no-webkit",
+ "-no-xmlpatterns",
+ "-nomake", "demos",
+ "-nomake", "docs",
+ "-nomake", "examples"
+ ],
+ "build-options": {
+ "env": {
+ "CXXFLAGS": "-std=gnu++98 -O2",
+ "LD_LIBRARY_PATH": "/run/build/qt4/lib/"
+ }
+ },
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.qt.io/archive/qt/4.8/4.8.7/qt-everywhere-opensource-src-4.8.7.tar.gz",
+ "sha256": "e2882295097e47fe089f8ac741a95fef47e0a73a3f3cdf21b56990638f626ea0"
+ },
+ {
+ "type": "patch",
+ "path": "qt4-aarch64.patch"
+ },
+ {
+ "type": "patch",
+ "path": "disable-sslv3.patch"
+ },
+ {
+ "type": "patch",
+ "path": "fixgcc9.patch"
+ },
+ {
+ "type": "patch",
+ "path": "fixgcc11.patch"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "sed -i \"s|-O2|${CXXFLAGS}|\" mkspecs/common/{g++,gcc}-base.conf",
+ "sed -i \"/^QMAKE_LFLAGS_RPATH/s| -Wl,-rpath,||g\" mkspecs/common/gcc-base-unix.conf",
+ "sed -i \"/^QMAKE_LFLAGS\s/s|+=|+= ${LDFLAGS}|g\" mkspecs/common/gcc-base.conf"
+ ]
+ },
+ {
+ "type": "file",
+ "path": "qt4-openssl-1.1.patch"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "echo -e '#include<openssl/opensslv.h>\nint main(){return OPENSSL_VERSION_NUMBER>=0x010100000L?0:1;}' >has_openssl_1_1.c",
+ "gcc ${CFLAGS} has_openssl_1_1.c -o has_openssl_1_1",
+ "if ./has_openssl_1_1; then patch -p1 -i qt4-openssl-1.1.patch; fi"
+ ]
+ }
+ ],
+ "cleanup": [
+ "/bin",
+ "/include",
+ "/lib/*.a",
+ "/lib/*.la",
+ "/lib/*.prl",
+ "/lib/pkgconfig",
+ "/lib/qt4/mkspecs",
+ "/lib/qt4/q3porting.xml"
+ ]
+}
diff --git a/subprojects/shared-modules/qt4/qt4-aarch64.patch b/subprojects/shared-modules/qt4/qt4-aarch64.patch
new file mode 100644
index 00000000..cbe815de
--- /dev/null
+++ b/subprojects/shared-modules/qt4/qt4-aarch64.patch
@@ -0,0 +1,514 @@
+diff -up qt-everywhere-opensource-src-4.8.7/include/QtCore/headers.pri.aarch64 qt-everywhere-opensource-src-4.8.7/include/QtCore/headers.pri
+--- qt-everywhere-opensource-src-4.8.7/include/QtCore/headers.pri.aarch64 2015-05-08 21:48:32.714057739 -0500
++++ qt-everywhere-opensource-src-4.8.7/include/QtCore/headers.pri 2015-05-08 21:53:21.088761971 -0500
+@@ -1,3 +1,3 @@
+-SYNCQT.HEADER_FILES = ../corelib/kernel/qabstracteventdispatcher.h ../corelib/kernel/qabstractitemmodel.h ../corelib/kernel/qbasictimer.h ../corelib/kernel/qcoreapplication.h ../corelib/kernel/qcoreevent.h ../corelib/kernel/qeventloop.h ../corelib/kernel/qfunctions_nacl.h ../corelib/kernel/qfunctions_vxworks.h ../corelib/kernel/qfunctions_wince.h ../corelib/kernel/qmath.h ../corelib/kernel/qmetaobject.h ../corelib/kernel/qmetatype.h ../corelib/kernel/qmimedata.h ../corelib/kernel/qobject.h ../corelib/kernel/qobjectcleanuphandler.h ../corelib/kernel/qobjectdefs.h ../corelib/kernel/qpointer.h ../corelib/kernel/qsharedmemory.h ../corelib/kernel/qsignalmapper.h ../corelib/kernel/qsocketnotifier.h ../corelib/kernel/qsystemsemaphore.h ../corelib/kernel/qtimer.h ../corelib/kernel/qtranslator.h ../corelib/kernel/qvariant.h ../corelib/animation/qabstractanimation.h ../corelib/animation/qanimationgroup.h ../corelib/animation/qparallelanimationgroup.h ../corelib/animation/qpauseanimation.h ../corelib/animation/qpropertyanimation.h ../corelib/animation/qsequentialanimationgroup.h ../corelib/animation/qvariantanimation.h ../corelib/arch/qatomic_alpha.h ../corelib/arch/qatomic_arch.h ../corelib/arch/qatomic_arm.h ../corelib/arch/qatomic_armv5.h ../corelib/arch/qatomic_armv6.h ../corelib/arch/qatomic_armv7.h ../corelib/arch/qatomic_avr32.h ../corelib/arch/qatomic_bfin.h ../corelib/arch/qatomic_bootstrap.h ../corelib/arch/qatomic_generic.h ../corelib/arch/qatomic_i386.h ../corelib/arch/qatomic_ia64.h ../corelib/arch/qatomic_integrity.h ../corelib/arch/qatomic_m68k.h ../corelib/arch/qatomic_macosx.h ../corelib/arch/qatomic_mips.h ../corelib/arch/qatomic_parisc.h ../corelib/arch/qatomic_powerpc.h ../corelib/arch/qatomic_s390.h ../corelib/arch/qatomic_sh.h ../corelib/arch/qatomic_sh4a.h ../corelib/arch/qatomic_sparc.h ../corelib/arch/qatomic_symbian.h ../corelib/arch/qatomic_vxworks.h ../corelib/arch/qatomic_windows.h ../corelib/arch/qatomic_windowsce.h ../corelib/arch/qatomic_x86_64.h ../corelib/tools/qalgorithms.h ../corelib/tools/qbitarray.h ../corelib/tools/qbytearray.h ../corelib/tools/qbytearraymatcher.h ../corelib/tools/qcache.h ../corelib/tools/qchar.h ../corelib/tools/qcontainerfwd.h ../corelib/tools/qcontiguouscache.h ../corelib/tools/qcryptographichash.h ../corelib/tools/qdatetime.h ../corelib/tools/qeasingcurve.h ../corelib/tools/qelapsedtimer.h ../corelib/tools/qhash.h ../corelib/tools/qiterator.h ../corelib/tools/qline.h ../corelib/tools/qlinkedlist.h ../corelib/tools/qlist.h ../corelib/tools/qlocale.h ../corelib/tools/qlocale_blackberry.h ../corelib/tools/qmap.h ../corelib/tools/qmargins.h ../corelib/tools/qpair.h ../corelib/tools/qpoint.h ../corelib/tools/qqueue.h ../corelib/tools/qrect.h ../corelib/tools/qregexp.h ../corelib/tools/qscopedpointer.h ../corelib/tools/qscopedvaluerollback.h ../corelib/tools/qset.h ../corelib/tools/qshareddata.h ../corelib/tools/qsharedpointer.h ../corelib/tools/qsharedpointer_impl.h ../corelib/tools/qsize.h ../corelib/tools/qstack.h ../corelib/tools/qstring.h ../corelib/tools/qstringbuilder.h ../corelib/tools/qstringlist.h ../corelib/tools/qstringmatcher.h ../corelib/tools/qtextboundaryfinder.h ../corelib/tools/qtimeline.h ../corelib/tools/qvarlengtharray.h ../corelib/tools/qvector.h ../corelib/plugin/qfactoryinterface.h ../corelib/plugin/qlibrary.h ../corelib/plugin/qplugin.h ../corelib/plugin/qpluginloader.h ../corelib/plugin/quuid.h ../corelib/xml/qxmlstream.h ../corelib/thread/qatomic.h ../corelib/thread/qbasicatomic.h ../corelib/thread/qmutex.h ../corelib/thread/qreadwritelock.h ../corelib/thread/qsemaphore.h ../corelib/thread/qthread.h ../corelib/thread/qthreadstorage.h ../corelib/thread/qwaitcondition.h ../corelib/statemachine/qabstractstate.h ../corelib/statemachine/qabstracttransition.h ../corelib/statemachine/qeventtransition.h ../corelib/statemachine/qfinalstate.h ../corelib/statemachine/qhistorystate.h ../corelib/statemachine/qsignaltransition.h ../corelib/statemachine/qstate.h ../corelib/statemachine/qstatemachine.h ../corelib/concurrent/qfuture.h ../corelib/concurrent/qfutureinterface.h ../corelib/concurrent/qfuturesynchronizer.h ../corelib/concurrent/qfuturewatcher.h ../corelib/concurrent/qrunnable.h ../corelib/concurrent/qtconcurrentcompilertest.h ../corelib/concurrent/qtconcurrentexception.h ../corelib/concurrent/qtconcurrentfilter.h ../corelib/concurrent/qtconcurrentfilterkernel.h ../corelib/concurrent/qtconcurrentfunctionwrappers.h ../corelib/concurrent/qtconcurrentiteratekernel.h ../corelib/concurrent/qtconcurrentmap.h ../corelib/concurrent/qtconcurrentmapkernel.h ../corelib/concurrent/qtconcurrentmedian.h ../corelib/concurrent/qtconcurrentreducekernel.h ../corelib/concurrent/qtconcurrentresultstore.h ../corelib/concurrent/qtconcurrentrun.h ../corelib/concurrent/qtconcurrentrunbase.h ../corelib/concurrent/qtconcurrentstoredfunctioncall.h ../corelib/concurrent/qtconcurrentthreadengine.h ../corelib/concurrent/qthreadpool.h ../corelib/io/qabstractfileengine.h ../corelib/io/qbuffer.h ../corelib/io/qdatastream.h ../corelib/io/qdebug.h ../corelib/io/qdir.h ../corelib/io/qdiriterator.h ../corelib/io/qfile.h ../corelib/io/qfileinfo.h ../corelib/io/qfilesystemwatcher.h ../corelib/io/qfsfileengine.h ../corelib/io/qiodevice.h ../corelib/io/qprocess.h ../corelib/io/qresource.h ../corelib/io/qsettings.h ../corelib/io/qtemporaryfile.h ../corelib/io/qtextstream.h ../corelib/io/qurl.h ../corelib/global/qconfig-dist.h ../corelib/global/qconfig-large.h ../corelib/global/qconfig-medium.h ../corelib/global/qconfig-minimal.h ../corelib/global/qconfig-nacl.h ../corelib/global/qconfig-small.h ../corelib/global/qendian.h ../corelib/global/qfeatures.h ../corelib/global/qglobal.h ../corelib/global/qlibraryinfo.h ../corelib/global/qnamespace.h ../corelib/global/qnumeric.h ../corelib/global/qt_windows.h ../corelib/global/qconfig.h ../corelib/codecs/qtextcodec.h ../corelib/codecs/qtextcodecplugin.h ../../include/QtCore/QtCore
++SYNCQT.HEADER_FILES = ../corelib/kernel/qabstracteventdispatcher.h ../corelib/kernel/qabstractitemmodel.h ../corelib/kernel/qbasictimer.h ../corelib/kernel/qcoreapplication.h ../corelib/kernel/qcoreevent.h ../corelib/kernel/qeventloop.h ../corelib/kernel/qfunctions_nacl.h ../corelib/kernel/qfunctions_vxworks.h ../corelib/kernel/qfunctions_wince.h ../corelib/kernel/qmath.h ../corelib/kernel/qmetaobject.h ../corelib/kernel/qmetatype.h ../corelib/kernel/qmimedata.h ../corelib/kernel/qobject.h ../corelib/kernel/qobjectcleanuphandler.h ../corelib/kernel/qobjectdefs.h ../corelib/kernel/qpointer.h ../corelib/kernel/qsharedmemory.h ../corelib/kernel/qsignalmapper.h ../corelib/kernel/qsocketnotifier.h ../corelib/kernel/qsystemsemaphore.h ../corelib/kernel/qtimer.h ../corelib/kernel/qtranslator.h ../corelib/kernel/qvariant.h ../corelib/animation/qabstractanimation.h ../corelib/animation/qanimationgroup.h ../corelib/animation/qparallelanimationgroup.h ../corelib/animation/qpauseanimation.h ../corelib/animation/qpropertyanimation.h ../corelib/animation/qsequentialanimationgroup.h ../corelib/animation/qvariantanimation.h ../corelib/arch/qatomic_aarch64.h ../corelib/arch/qatomic_alpha.h ../corelib/arch/qatomic_arch.h ../corelib/arch/qatomic_arm.h ../corelib/arch/qatomic_armv5.h ../corelib/arch/qatomic_armv6.h ../corelib/arch/qatomic_armv7.h ../corelib/arch/qatomic_avr32.h ../corelib/arch/qatomic_bfin.h ../corelib/arch/qatomic_bootstrap.h ../corelib/arch/qatomic_generic.h ../corelib/arch/qatomic_i386.h ../corelib/arch/qatomic_ia64.h ../corelib/arch/qatomic_integrity.h ../corelib/arch/qatomic_m68k.h ../corelib/arch/qatomic_macosx.h ../corelib/arch/qatomic_mips.h ../corelib/arch/qatomic_parisc.h ../corelib/arch/qatomic_powerpc.h ../corelib/arch/qatomic_s390.h ../corelib/arch/qatomic_sh.h ../corelib/arch/qatomic_sh4a.h ../corelib/arch/qatomic_sparc.h ../corelib/arch/qatomic_symbian.h ../corelib/arch/qatomic_vxworks.h ../corelib/arch/qatomic_windows.h ../corelib/arch/qatomic_windowsce.h ../corelib/arch/qatomic_x86_64.h ../corelib/tools/qalgorithms.h ../corelib/tools/qbitarray.h ../corelib/tools/qbytearray.h ../corelib/tools/qbytearraymatcher.h ../corelib/tools/qcache.h ../corelib/tools/qchar.h ../corelib/tools/qcontainerfwd.h ../corelib/tools/qcontiguouscache.h ../corelib/tools/qcryptographichash.h ../corelib/tools/qdatetime.h ../corelib/tools/qeasingcurve.h ../corelib/tools/qelapsedtimer.h ../corelib/tools/qhash.h ../corelib/tools/qiterator.h ../corelib/tools/qline.h ../corelib/tools/qlinkedlist.h ../corelib/tools/qlist.h ../corelib/tools/qlocale.h ../corelib/tools/qlocale_blackberry.h ../corelib/tools/qmap.h ../corelib/tools/qmargins.h ../corelib/tools/qpair.h ../corelib/tools/qpoint.h ../corelib/tools/qqueue.h ../corelib/tools/qrect.h ../corelib/tools/qregexp.h ../corelib/tools/qscopedpointer.h ../corelib/tools/qscopedvaluerollback.h ../corelib/tools/qset.h ../corelib/tools/qshareddata.h ../corelib/tools/qsharedpointer.h ../corelib/tools/qsharedpointer_impl.h ../corelib/tools/qsize.h ../corelib/tools/qstack.h ../corelib/tools/qstring.h ../corelib/tools/qstringbuilder.h ../corelib/tools/qstringlist.h ../corelib/tools/qstringmatcher.h ../corelib/tools/qtextboundaryfinder.h ../corelib/tools/qtimeline.h ../corelib/tools/qvarlengtharray.h ../corelib/tools/qvector.h ../corelib/plugin/qfactoryinterface.h ../corelib/plugin/qlibrary.h ../corelib/plugin/qplugin.h ../corelib/plugin/qpluginloader.h ../corelib/plugin/quuid.h ../corelib/xml/qxmlstream.h ../corelib/thread/qatomic.h ../corelib/thread/qbasicatomic.h ../corelib/thread/qmutex.h ../corelib/thread/qreadwritelock.h ../corelib/thread/qsemaphore.h ../corelib/thread/qthread.h ../corelib/thread/qthreadstorage.h ../corelib/thread/qwaitcondition.h ../corelib/statemachine/qabstractstate.h ../corelib/statemachine/qabstracttransition.h ../corelib/statemachine/qeventtransition.h ../corelib/statemachine/qfinalstate.h ../corelib/statemachine/qhistorystate.h ../corelib/statemachine/qsignaltransition.h ../corelib/statemachine/qstate.h ../corelib/statemachine/qstatemachine.h ../corelib/concurrent/qfuture.h ../corelib/concurrent/qfutureinterface.h ../corelib/concurrent/qfuturesynchronizer.h ../corelib/concurrent/qfuturewatcher.h ../corelib/concurrent/qrunnable.h ../corelib/concurrent/qtconcurrentcompilertest.h ../corelib/concurrent/qtconcurrentexception.h ../corelib/concurrent/qtconcurrentfilter.h ../corelib/concurrent/qtconcurrentfilterkernel.h ../corelib/concurrent/qtconcurrentfunctionwrappers.h ../corelib/concurrent/qtconcurrentiteratekernel.h ../corelib/concurrent/qtconcurrentmap.h ../corelib/concurrent/qtconcurrentmapkernel.h ../corelib/concurrent/qtconcurrentmedian.h ../corelib/concurrent/qtconcurrentreducekernel.h ../corelib/concurrent/qtconcurrentresultstore.h ../corelib/concurrent/qtconcurrentrun.h ../corelib/concurrent/qtconcurrentrunbase.h ../corelib/concurrent/qtconcurrentstoredfunctioncall.h ../corelib/concurrent/qtconcurrentthreadengine.h ../corelib/concurrent/qthreadpool.h ../corelib/io/qabstractfileengine.h ../corelib/io/qbuffer.h ../corelib/io/qdatastream.h ../corelib/io/qdebug.h ../corelib/io/qdir.h ../corelib/io/qdiriterator.h ../corelib/io/qfile.h ../corelib/io/qfileinfo.h ../corelib/io/qfilesystemwatcher.h ../corelib/io/qfsfileengine.h ../corelib/io/qiodevice.h ../corelib/io/qprocess.h ../corelib/io/qresource.h ../corelib/io/qsettings.h ../corelib/io/qtemporaryfile.h ../corelib/io/qtextstream.h ../corelib/io/qurl.h ../corelib/global/qconfig-dist.h ../corelib/global/qconfig-large.h ../corelib/global/qconfig-medium.h ../corelib/global/qconfig-minimal.h ../corelib/global/qconfig-nacl.h ../corelib/global/qconfig-small.h ../corelib/global/qendian.h ../corelib/global/qfeatures.h ../corelib/global/qglobal.h ../corelib/global/qlibraryinfo.h ../corelib/global/qnamespace.h ../corelib/global/qnumeric.h ../corelib/global/qt_windows.h ../corelib/global/qconfig.h ../corelib/codecs/qtextcodec.h ../corelib/codecs/qtextcodecplugin.h ../../include/QtCore/QtCore
+ SYNCQT.HEADER_CLASSES = ../../include/QtCore/QAbstractEventDispatcher ../../include/QtCore/QModelIndex ../../include/QtCore/QPersistentModelIndex ../../include/QtCore/QModelIndexList ../../include/QtCore/QAbstractItemModel ../../include/QtCore/QAbstractTableModel ../../include/QtCore/QAbstractListModel ../../include/QtCore/QBasicTimer ../../include/QtCore/QCoreApplication ../../include/QtCore/QtCleanUpFunction ../../include/QtCore/QEvent ../../include/QtCore/QTimerEvent ../../include/QtCore/QChildEvent ../../include/QtCore/QCustomEvent ../../include/QtCore/QDynamicPropertyChangeEvent ../../include/QtCore/QEventLoop ../../include/QtCore/QMetaMethod ../../include/QtCore/QMetaEnum ../../include/QtCore/QMetaProperty ../../include/QtCore/QMetaClassInfo ../../include/QtCore/QMetaType ../../include/QtCore/QMetaTypeId ../../include/QtCore/QMetaTypeId2 ../../include/QtCore/QMimeData ../../include/QtCore/QObjectList ../../include/QtCore/QObjectData ../../include/QtCore/QObject ../../include/QtCore/QObjectUserData ../../include/QtCore/QObjectCleanupHandler ../../include/QtCore/QGenericArgument ../../include/QtCore/QGenericReturnArgument ../../include/QtCore/QArgument ../../include/QtCore/QReturnArgument ../../include/QtCore/QMetaObject ../../include/QtCore/QMetaObjectAccessor ../../include/QtCore/QMetaObjectExtraData ../../include/QtCore/QPointer ../../include/QtCore/QSharedMemory ../../include/QtCore/QSignalMapper ../../include/QtCore/QSocketNotifier ../../include/QtCore/QSystemSemaphore ../../include/QtCore/QTimer ../../include/QtCore/QTranslator ../../include/QtCore/QVariant ../../include/QtCore/QVariantList ../../include/QtCore/QVariantMap ../../include/QtCore/QVariantHash ../../include/QtCore/QVariantComparisonHelper ../../include/QtCore/QAbstractAnimation ../../include/QtCore/QAnimationDriver ../../include/QtCore/QAnimationGroup ../../include/QtCore/QParallelAnimationGroup ../../include/QtCore/QPauseAnimation ../../include/QtCore/QPropertyAnimation ../../include/QtCore/QSequentialAnimationGroup ../../include/QtCore/QVariantAnimation ../../include/QtCore/QtAlgorithms ../../include/QtCore/QBitArray ../../include/QtCore/QBitRef ../../include/QtCore/QByteArray ../../include/QtCore/QByteRef ../../include/QtCore/QByteArrayMatcher ../../include/QtCore/QCache ../../include/QtCore/QLatin1Char ../../include/QtCore/QChar ../../include/QtCore/QtContainerFwd ../../include/QtCore/QContiguousCacheData ../../include/QtCore/QContiguousCacheTypedData ../../include/QtCore/QContiguousCache ../../include/QtCore/QCryptographicHash ../../include/QtCore/QDate ../../include/QtCore/QTime ../../include/QtCore/QDateTime ../../include/QtCore/QEasingCurve ../../include/QtCore/QElapsedTimer ../../include/QtCore/QHashData ../../include/QtCore/QHashDummyValue ../../include/QtCore/QHashDummyNode ../../include/QtCore/QHashNode ../../include/QtCore/QHash ../../include/QtCore/QMultiHash ../../include/QtCore/QHashIterator ../../include/QtCore/QMutableHashIterator ../../include/QtCore/QLine ../../include/QtCore/QLineF ../../include/QtCore/QLinkedListData ../../include/QtCore/QLinkedListNode ../../include/QtCore/QLinkedList ../../include/QtCore/QLinkedListIterator ../../include/QtCore/QMutableLinkedListIterator ../../include/QtCore/QListData ../../include/QtCore/QList ../../include/QtCore/QListIterator ../../include/QtCore/QMutableListIterator ../../include/QtCore/QSystemLocale ../../include/QtCore/QLocale ../../include/QtCore/QBBSystemLocaleData ../../include/QtCore/QMapData ../../include/QtCore/QMapNode ../../include/QtCore/QMapPayloadNode ../../include/QtCore/QMap ../../include/QtCore/QMultiMap ../../include/QtCore/QMapIterator ../../include/QtCore/QMutableMapIterator ../../include/QtCore/QMargins ../../include/QtCore/QPair ../../include/QtCore/QPoint ../../include/QtCore/QPointF ../../include/QtCore/QQueue ../../include/QtCore/QRect ../../include/QtCore/QRectF ../../include/QtCore/QRegExp ../../include/QtCore/QScopedPointerDeleter ../../include/QtCore/QScopedPointerArrayDeleter ../../include/QtCore/QScopedPointerPodDeleter ../../include/QtCore/QScopedPointer ../../include/QtCore/QScopedArrayPointer ../../include/QtCore/QScopedValueRollback ../../include/QtCore/QSet ../../include/QtCore/QSetIterator ../../include/QtCore/QMutableSetIterator ../../include/QtCore/QSharedData ../../include/QtCore/QSharedDataPointer ../../include/QtCore/QExplicitlySharedDataPointer ../../include/QtCore/QSharedPointer ../../include/QtCore/QWeakPointer ../../include/QtCore/QSize ../../include/QtCore/QSizeF ../../include/QtCore/QStack ../../include/QtCore/QStdWString ../../include/QtCore/QString ../../include/QtCore/QLatin1String ../../include/QtCore/QCharRef ../../include/QtCore/QConstString ../../include/QtCore/QStringRef ../../include/QtCore/QLatin1Literal ../../include/QtCore/QAbstractConcatenable ../../include/QtCore/QConcatenable ../../include/QtCore/QStringBuilder ../../include/QtCore/QStringListIterator ../../include/QtCore/QMutableStringListIterator ../../include/QtCore/QStringList ../../include/QtCore/QStringMatcher ../../include/QtCore/QTextBoundaryFinder ../../include/QtCore/QTimeLine ../../include/QtCore/QVarLengthArray ../../include/QtCore/QVectorData ../../include/QtCore/QVectorTypedData ../../include/QtCore/QVector ../../include/QtCore/QVectorIterator ../../include/QtCore/QMutableVectorIterator ../../include/QtCore/QFactoryInterface ../../include/QtCore/QLibrary ../../include/QtCore/QtPlugin ../../include/QtCore/QtPluginInstanceFunction ../../include/QtCore/QPluginLoader ../../include/QtCore/QUuid ../../include/QtCore/QXmlStreamStringRef ../../include/QtCore/QXmlStreamAttribute ../../include/QtCore/QXmlStreamAttributes ../../include/QtCore/QXmlStreamNamespaceDeclaration ../../include/QtCore/QXmlStreamNamespaceDeclarations ../../include/QtCore/QXmlStreamNotationDeclaration ../../include/QtCore/QXmlStreamNotationDeclarations ../../include/QtCore/QXmlStreamEntityDeclaration ../../include/QtCore/QXmlStreamEntityDeclarations ../../include/QtCore/QXmlStreamEntityResolver ../../include/QtCore/QXmlStreamReader ../../include/QtCore/QXmlStreamWriter ../../include/QtCore/QAtomicInt ../../include/QtCore/QAtomicPointer ../../include/QtCore/QBasicAtomicInt ../../include/QtCore/QBasicAtomicPointer ../../include/QtCore/QMutex ../../include/QtCore/QMutexLocker ../../include/QtCore/QMutexData ../../include/QtCore/QReadWriteLock ../../include/QtCore/QReadLocker ../../include/QtCore/QWriteLocker ../../include/QtCore/QSemaphore ../../include/QtCore/QThread ../../include/QtCore/QThreadStorageData ../../include/QtCore/QThreadStorage ../../include/QtCore/QWaitCondition ../../include/QtCore/QAbstractState ../../include/QtCore/QAbstractTransition ../../include/QtCore/QEventTransition ../../include/QtCore/QFinalState ../../include/QtCore/QHistoryState ../../include/QtCore/QSignalTransition ../../include/QtCore/QState ../../include/QtCore/QStateMachine ../../include/QtCore/QFuture ../../include/QtCore/QFutureIterator ../../include/QtCore/QMutableFutureIterator ../../include/QtCore/QFutureInterfaceBase ../../include/QtCore/QFutureInterface ../../include/QtCore/QFutureSynchronizer ../../include/QtCore/QFutureWatcherBase ../../include/QtCore/QFutureWatcher ../../include/QtCore/QRunnable ../../include/QtCore/QtConcurrentFilter ../../include/QtCore/QtConcurrentMap ../../include/QtCore/QtConcurrentRun ../../include/QtCore/QThreadPool ../../include/QtCore/QAbstractFileEngine ../../include/QtCore/QAbstractFileEngineHandler ../../include/QtCore/QAbstractFileEngineIterator ../../include/QtCore/QBuffer ../../include/QtCore/QDataStream ../../include/QtCore/QtDebug ../../include/QtCore/QDebug ../../include/QtCore/QNoDebug ../../include/QtCore/QDir ../../include/QtCore/QDirIterator ../../include/QtCore/QFile ../../include/QtCore/QFileInfo ../../include/QtCore/QFileInfoList ../../include/QtCore/QFileInfoListIterator ../../include/QtCore/QFileSystemWatcher ../../include/QtCore/QFSFileEngine ../../include/QtCore/QIODevice ../../include/QtCore/Q_PID ../../include/QtCore/QProcessEnvironment ../../include/QtCore/QProcess ../../include/QtCore/QResource ../../include/QtCore/QSettings ../../include/QtCore/QTemporaryFile ../../include/QtCore/QTextStream ../../include/QtCore/QTextStreamFunction ../../include/QtCore/QTextStreamManipulator ../../include/QtCore/QTS ../../include/QtCore/QTextIStream ../../include/QtCore/QTextOStream ../../include/QtCore/QUrl ../../include/QtCore/QtEndian ../../include/QtCore/QtGlobal ../../include/QtCore/QIntegerForSize ../../include/QtCore/QNoImplicitBoolCast ../../include/QtCore/Q_INT8 ../../include/QtCore/Q_UINT8 ../../include/QtCore/Q_INT16 ../../include/QtCore/Q_UINT16 ../../include/QtCore/Q_INT32 ../../include/QtCore/Q_UINT32 ../../include/QtCore/Q_INT64 ../../include/QtCore/Q_UINT64 ../../include/QtCore/Q_LLONG ../../include/QtCore/Q_ULLONG ../../include/QtCore/Q_LONG ../../include/QtCore/Q_ULONG ../../include/QtCore/QSysInfo ../../include/QtCore/QtMsgHandler ../../include/QtCore/QGlobalStatic ../../include/QtCore/QGlobalStaticDeleter ../../include/QtCore/QBool ../../include/QtCore/QTypeInfo ../../include/QtCore/QFlag ../../include/QtCore/QIncompatibleFlag ../../include/QtCore/QFlags ../../include/QtCore/QForeachContainer ../../include/QtCore/QForeachContainerBase ../../include/QtCore/QLibraryInfo ../../include/QtCore/Qt ../../include/QtCore/QInternal ../../include/QtCore/QCOORD ../../include/QtCore/QtConfig ../../include/QtCore/QTextCodec ../../include/QtCore/QTextEncoder ../../include/QtCore/QTextDecoder ../../include/QtCore/QTextCodecFactoryInterface ../../include/QtCore/QTextCodecPlugin
+ SYNCQT.PRIVATE_HEADER_FILES = ../corelib/kernel/qabstracteventdispatcher_p.h ../corelib/kernel/qabstractitemmodel_p.h ../corelib/kernel/qcore_mac_p.h ../corelib/kernel/qcore_symbian_p.h ../corelib/kernel/qcore_unix_p.h ../corelib/kernel/qcoreapplication_p.h ../corelib/kernel/qcorecmdlineargs_p.h ../corelib/kernel/qcoreglobaldata_p.h ../corelib/kernel/qcrashhandler_p.h ../corelib/kernel/qeventdispatcher_blackberry_p.h ../corelib/kernel/qeventdispatcher_glib_p.h ../corelib/kernel/qeventdispatcher_symbian_p.h ../corelib/kernel/qeventdispatcher_unix_p.h ../corelib/kernel/qeventdispatcher_win_p.h ../corelib/kernel/qfunctions_p.h ../corelib/kernel/qmetaobject_p.h ../corelib/kernel/qobject_p.h ../corelib/kernel/qsharedmemory_p.h ../corelib/kernel/qsystemerror_p.h ../corelib/kernel/qsystemsemaphore_p.h ../corelib/kernel/qtranslator_p.h ../corelib/kernel/qvariant_p.h ../corelib/kernel/qwineventnotifier_p.h ../corelib/animation/qabstractanimation_p.h ../corelib/animation/qanimationgroup_p.h ../corelib/animation/qparallelanimationgroup_p.h ../corelib/animation/qpropertyanimation_p.h ../corelib/animation/qsequentialanimationgroup_p.h ../corelib/animation/qvariantanimation_p.h ../corelib/tools/qbytedata_p.h ../corelib/tools/qdatetime_p.h ../corelib/tools/qharfbuzz_p.h ../corelib/tools/qlocale_data_p.h ../corelib/tools/qlocale_p.h ../corelib/tools/qlocale_tools_p.h ../corelib/tools/qpodlist_p.h ../corelib/tools/qringbuffer_p.h ../corelib/tools/qscopedpointer_p.h ../corelib/tools/qsimd_p.h ../corelib/tools/qtools_p.h ../corelib/tools/qunicodetables_p.h ../corelib/plugin/qelfparser_p.h ../corelib/plugin/qfactoryloader_p.h ../corelib/plugin/qlibrary_p.h ../corelib/plugin/qsystemlibrary_p.h ../corelib/xml/qxmlstream_p.h ../corelib/xml/qxmlutils_p.h ../corelib/thread/qmutex_p.h ../corelib/thread/qmutexpool_p.h ../corelib/thread/qorderedmutexlocker_p.h ../corelib/thread/qreadwritelock_p.h ../corelib/thread/qthread_p.h ../corelib/statemachine/qabstractstate_p.h ../corelib/statemachine/qabstracttransition_p.h ../corelib/statemachine/qeventtransition_p.h ../corelib/statemachine/qhistorystate_p.h ../corelib/statemachine/qsignaleventgenerator_p.h ../corelib/statemachine/qsignaltransition_p.h ../corelib/statemachine/qstate_p.h ../corelib/statemachine/qstatemachine_p.h ../corelib/concurrent/qfutureinterface_p.h ../corelib/concurrent/qfuturewatcher_p.h ../corelib/concurrent/qthreadpool_p.h ../corelib/io/qabstractfileengine_p.h ../corelib/io/qdatastream_p.h ../corelib/io/qdataurl_p.h ../corelib/io/qdir_p.h ../corelib/io/qfile_p.h ../corelib/io/qfileinfo_p.h ../corelib/io/qfilesystemengine_p.h ../corelib/io/qfilesystementry_p.h ../corelib/io/qfilesystemiterator_p.h ../corelib/io/qfilesystemmetadata_p.h ../corelib/io/qfilesystemwatcher_dnotify_p.h ../corelib/io/qfilesystemwatcher_fsevents_p.h ../corelib/io/qfilesystemwatcher_inotify_p.h ../corelib/io/qfilesystemwatcher_kqueue_p.h ../corelib/io/qfilesystemwatcher_p.h ../corelib/io/qfilesystemwatcher_symbian_p.h ../corelib/io/qfilesystemwatcher_win_p.h ../corelib/io/qfsfileengine_iterator_p.h ../corelib/io/qfsfileengine_p.h ../corelib/io/qiodevice_p.h ../corelib/io/qnoncontiguousbytedevice_p.h ../corelib/io/qprocess_p.h ../corelib/io/qresource_iterator_p.h ../corelib/io/qresource_p.h ../corelib/io/qsettings_p.h ../corelib/io/qtldurl_p.h ../corelib/io/qurltlds_p.h ../corelib/io/qwindowspipewriter_p.h ../corelib/global/qnumeric_p.h ../corelib/global/qt_pch.h ../corelib/codecs/qfontlaocodec_p.h ../corelib/codecs/qiconvcodec_p.h ../corelib/codecs/qisciicodec_p.h ../corelib/codecs/qlatincodec_p.h ../corelib/codecs/qsimplecodec_p.h ../corelib/codecs/qtextcodec_p.h ../corelib/codecs/qtsciicodec_p.h ../corelib/codecs/qutfcodec_p.h
+diff -up qt-everywhere-opensource-src-4.8.7/include/QtCore/qatomic_aarch64.h.aarch64 qt-everywhere-opensource-src-4.8.7/include/QtCore/qatomic_aarch64.h
+--- qt-everywhere-opensource-src-4.8.7/include/QtCore/qatomic_aarch64.h.aarch64 2015-05-08 21:48:32.715057744 -0500
++++ qt-everywhere-opensource-src-4.8.7/include/QtCore/qatomic_aarch64.h 2015-05-08 21:48:32.715057744 -0500
+@@ -0,0 +1 @@
++#include "../../src/corelib/arch/qatomic_aarch64.h"
+diff -up qt-everywhere-opensource-src-4.8.7/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri.aarch64 qt-everywhere-opensource-src-4.8.7/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri
+--- qt-everywhere-opensource-src-4.8.7/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri.aarch64 2015-05-07 09:14:47.000000000 -0500
++++ qt-everywhere-opensource-src-4.8.7/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri 2015-05-08 21:48:33.268061013 -0500
+@@ -66,6 +66,12 @@ contains(JAVASCRIPTCORE_JIT,no) {
+ }
+ }
+
++# Hack around AARCH64 fail wrt JSValue.h
++equals(QT_ARCH, aarch64) {
++ message("JavaScriptCore aarch64 hack: -fpermissive")
++ QMAKE_CXXFLAGS += -fpermissive
++}
++
+ wince* {
+ INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/ce-compat
+ SOURCES += $$QT_SOURCE_TREE/src/3rdparty/ce-compat/ce_time.c
+diff -up qt-everywhere-opensource-src-4.8.7/src/3rdparty/webkit/Source/JavaScriptCore/JavaScriptCore.pri.aarch64 qt-everywhere-opensource-src-4.8.7/src/3rdparty/webkit/Source/JavaScriptCore/JavaScriptCore.pri
+--- qt-everywhere-opensource-src-4.8.7/src/3rdparty/webkit/Source/JavaScriptCore/JavaScriptCore.pri.aarch64 2015-05-07 09:14:45.000000000 -0500
++++ qt-everywhere-opensource-src-4.8.7/src/3rdparty/webkit/Source/JavaScriptCore/JavaScriptCore.pri 2015-05-08 21:48:33.268061013 -0500
+@@ -63,6 +63,12 @@ contains (CONFIG, text_breaking_with_icu
+ DEFINES += WTF_USE_QT_ICU_TEXT_BREAKING=1
+ }
+
++# Hack around AARCH64 fail wrt JSValue.h
++equals(QT_ARCH, aarch64) {
++ message("JavaScriptCore aarch64 hack: -fpermissive")
++ QMAKE_CXXFLAGS += -fpermissive
++}
++
+ wince* {
+ INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/ce-compat
+ INCLUDEPATH += $$PWD/../JavaScriptCore/os-win32
+diff -up qt-everywhere-opensource-src-4.8.7/src/3rdparty/webkit/Source/JavaScriptCore/wtf/Platform.h.aarch64 qt-everywhere-opensource-src-4.8.7/src/3rdparty/webkit/Source/JavaScriptCore/wtf/Platform.h
+--- qt-everywhere-opensource-src-4.8.7/src/3rdparty/webkit/Source/JavaScriptCore/wtf/Platform.h.aarch64 2015-05-07 09:14:45.000000000 -0500
++++ qt-everywhere-opensource-src-4.8.7/src/3rdparty/webkit/Source/JavaScriptCore/wtf/Platform.h 2015-05-08 21:48:33.269061019 -0500
+@@ -369,7 +369,16 @@
+
+ #endif /* ARM */
+
+-#if CPU(ARM) || CPU(MIPS) || CPU(SH4)
++/* CPU(AARCH64) - AArch64 */
++#if defined(__aarch64__)
++#define WTF_CPU_AARCH64 1
++#if defined(__AARCH64EB__)
++#define WTF_CPU_BIG_ENDIAN 1
++#endif
++#endif
++
++/* Not sure about this one, qt5-qtwebkit doesn't include it -- rex */
++#if CPU(ARM) || CPU(MIPS) || CPU(SH4) || CPU(AARCH64)
+ #define WTF_CPU_NEEDS_ALIGNED_ACCESS 1
+ #endif
+
+@@ -1003,7 +1012,7 @@
+ || CPU(SPARC64) \
+ || CPU(S390X) \
+ || CPU(PPC64) \
+- || CPU(MIPS64)
++ || CPU(MIPS64) || CPU(AARCH64)
+ #define WTF_USE_JSVALUE64 1
+ #else
+ #define WTF_USE_JSVALUE32_64 1
+diff -up qt-everywhere-opensource-src-4.8.7/src/corelib/arch/aarch64/qatomic_aarch64.cpp.aarch64 qt-everywhere-opensource-src-4.8.7/src/corelib/arch/aarch64/qatomic_aarch64.cpp
+--- qt-everywhere-opensource-src-4.8.7/src/corelib/arch/aarch64/qatomic_aarch64.cpp.aarch64 2015-05-08 21:48:33.269061019 -0500
++++ qt-everywhere-opensource-src-4.8.7/src/corelib/arch/aarch64/qatomic_aarch64.cpp 2015-05-08 21:48:33.269061019 -0500
+@@ -0,0 +1,70 @@
++/****************************************************************************
++**
++** Copyright (C) 2012, 2013 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the QtCore module of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include <QtCore/qglobal.h>
++
++#include <unistd.h>
++#ifdef _POSIX_PRIORITY_SCHEDULING
++# include <sched.h>
++#endif
++#include <time.h>
++
++QT_BEGIN_NAMESPACE
++
++QT_USE_NAMESPACE
++
++Q_CORE_EXPORT void qt_atomic_yield(int *count)
++{
++#ifdef _POSIX_PRIORITY_SCHEDULING
++ if((*count)++ < 50) {
++ sched_yield();
++ } else
++#endif
++ {
++ struct timespec tm;
++ tm.tv_sec = 0;
++ tm.tv_nsec = 2000001;
++ nanosleep(&tm, NULL);
++ *count = 0;
++ }
++}
++
++QT_END_NAMESPACE
+diff -up qt-everywhere-opensource-src-4.8.7/src/corelib/arch/arch.pri.aarch64 qt-everywhere-opensource-src-4.8.7/src/corelib/arch/arch.pri
+--- qt-everywhere-opensource-src-4.8.7/src/corelib/arch/arch.pri.aarch64 2015-05-07 09:14:48.000000000 -0500
++++ qt-everywhere-opensource-src-4.8.7/src/corelib/arch/arch.pri 2015-05-08 21:48:33.270061025 -0500
+@@ -31,7 +31,9 @@ integrity:HEADERS += arch/qatomic_integr
+ arch/qatomic_s390.h \
+ arch/qatomic_x86_64.h \
+ arch/qatomic_sh.h \
+- arch/qatomic_sh4a.h
++ arch/qatomic_sh4a.h \
++ arch/qatomic_aarch64.h \
++
+
+ QT_ARCH_CPP = $$QT_SOURCE_TREE/src/corelib/arch/$$QT_ARCH
+ DEPENDPATH += $$QT_ARCH_CPP
+diff -up qt-everywhere-opensource-src-4.8.7/src/corelib/arch/qatomic_aarch64.h.aarch64 qt-everywhere-opensource-src-4.8.7/src/corelib/arch/qatomic_aarch64.h
+--- qt-everywhere-opensource-src-4.8.7/src/corelib/arch/qatomic_aarch64.h.aarch64 2015-05-08 21:48:33.270061025 -0500
++++ qt-everywhere-opensource-src-4.8.7/src/corelib/arch/qatomic_aarch64.h 2015-05-08 21:48:33.270061025 -0500
+@@ -0,0 +1,335 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the QtCore module of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QATOMIC_AARCH64_H
++#define QATOMIC_AARCH64_H
++
++QT_BEGIN_HEADER
++
++QT_BEGIN_NAMESPACE
++
++#define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
++
++inline bool QBasicAtomicInt::isReferenceCountingNative()
++{ return true; }
++inline bool QBasicAtomicInt::isReferenceCountingWaitFree()
++{ return false; }
++
++#define Q_ATOMIC_INT_TEST_AND_SET_IS_ALWAYS_NATIVE
++
++inline bool QBasicAtomicInt::isTestAndSetNative()
++{ return true; }
++inline bool QBasicAtomicInt::isTestAndSetWaitFree()
++{ return false; }
++
++#define Q_ATOMIC_INT_FETCH_AND_STORE_IS_ALWAYS_NATIVE
++
++inline bool QBasicAtomicInt::isFetchAndStoreNative()
++{ return true; }
++inline bool QBasicAtomicInt::isFetchAndStoreWaitFree()
++{ return false; }
++
++#define Q_ATOMIC_INT_FETCH_AND_ADD_IS_ALWAYS_NATIVE
++
++inline bool QBasicAtomicInt::isFetchAndAddNative()
++{ return true; }
++inline bool QBasicAtomicInt::isFetchAndAddWaitFree()
++{ return false; }
++
++#define Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetNative()
++{ return true; }
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetWaitFree()
++{ return false; }
++
++#define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreNative()
++{ return true; }
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreWaitFree()
++{ return false; }
++
++#define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddNative()
++{ return true; }
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree()
++{ return false; }
++
++#ifndef Q_DATA_MEMORY_BARRIER
++# define Q_DATA_MEMORY_BARRIER asm volatile("dmb sy\n":::"memory")
++#endif
++#ifndef Q_COMPILER_MEMORY_BARRIER
++# define Q_COMPILER_MEMORY_BARRIER asm volatile("":::"memory")
++#endif
++
++inline bool QBasicAtomicInt::ref()
++{
++ int newValue;
++
++ Q_COMPILER_MEMORY_BARRIER;
++ newValue = __atomic_add_fetch(&_q_value, 1, __ATOMIC_ACQ_REL);
++ Q_COMPILER_MEMORY_BARRIER;
++
++ return newValue != 0;
++}
++
++inline bool QBasicAtomicInt::deref()
++{
++ int newValue;
++
++ Q_COMPILER_MEMORY_BARRIER;
++ newValue = __atomic_sub_fetch(&_q_value, 1, __ATOMIC_ACQ_REL);
++ Q_COMPILER_MEMORY_BARRIER;
++
++ return newValue != 0;
++}
++
++inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
++{
++ bool val;
++
++ Q_COMPILER_MEMORY_BARRIER;
++ val = __atomic_compare_exchange_n (&_q_value, &expectedValue, newValue,
++ false, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
++ Q_COMPILER_MEMORY_BARRIER;
++ return val;
++}
++
++inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
++{
++ int val;
++ Q_COMPILER_MEMORY_BARRIER;
++ val = __atomic_exchange_n(&_q_value, newValue, __ATOMIC_RELAXED);
++ Q_COMPILER_MEMORY_BARRIER;
++ return val;
++}
++
++inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
++{
++ int val;
++ Q_COMPILER_MEMORY_BARRIER;
++ val = __atomic_fetch_add(&_q_value, valueToAdd, __ATOMIC_RELAXED);
++ Q_COMPILER_MEMORY_BARRIER;
++ return val;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
++{
++ bool val;
++ Q_COMPILER_MEMORY_BARRIER;
++ val = __atomic_compare_exchange_n (&_q_value, &expectedValue, newValue,
++ false, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
++ Q_COMPILER_MEMORY_BARRIER;
++ return val;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
++{
++ T *val;
++ Q_COMPILER_MEMORY_BARRIER;
++ val = __atomic_exchange_n(&_q_value, newValue, __ATOMIC_RELAXED);
++ Q_COMPILER_MEMORY_BARRIER;
++ return val;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
++{
++ T *val;
++ Q_COMPILER_MEMORY_BARRIER;
++ val = __atomic_fetch_add(&_q_value, valueToAdd, __ATOMIC_RELAXED);
++ Q_COMPILER_MEMORY_BARRIER;
++ return val;
++}
++
++inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
++{
++ bool returnValue = testAndSetRelaxed(expectedValue, newValue);
++ Q_DATA_MEMORY_BARRIER;
++ return returnValue;
++}
++
++inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
++{
++ Q_DATA_MEMORY_BARRIER;
++ return testAndSetRelaxed(expectedValue, newValue);
++}
++
++inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
++{
++ Q_DATA_MEMORY_BARRIER;
++ bool returnValue = testAndSetRelaxed(expectedValue, newValue);
++ Q_COMPILER_MEMORY_BARRIER;
++ return returnValue;
++}
++
++inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
++{
++ int returnValue = fetchAndStoreRelaxed(newValue);
++ Q_DATA_MEMORY_BARRIER;
++ return returnValue;
++}
++
++inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
++{
++ Q_DATA_MEMORY_BARRIER;
++ return fetchAndStoreRelaxed(newValue);
++}
++
++inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue)
++{
++ Q_DATA_MEMORY_BARRIER;
++ int returnValue = fetchAndStoreRelaxed(newValue);
++ Q_COMPILER_MEMORY_BARRIER;
++ return returnValue;
++}
++
++inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
++{
++ int returnValue = fetchAndAddRelaxed(valueToAdd);
++ Q_DATA_MEMORY_BARRIER;
++ return returnValue;
++}
++
++inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
++{
++ Q_DATA_MEMORY_BARRIER;
++ return fetchAndAddRelaxed(valueToAdd);
++}
++
++inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd)
++{
++ Q_DATA_MEMORY_BARRIER;
++ int returnValue = fetchAndAddRelaxed(valueToAdd);
++ Q_COMPILER_MEMORY_BARRIER;
++ return returnValue;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
++{
++ bool returnValue = testAndSetRelaxed(expectedValue, newValue);
++ Q_DATA_MEMORY_BARRIER;
++ return returnValue;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
++{
++ Q_DATA_MEMORY_BARRIER;
++ return testAndSetRelaxed(expectedValue, newValue);
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue)
++{
++ Q_DATA_MEMORY_BARRIER;
++ bool returnValue = testAndSetAcquire(expectedValue, newValue);
++ Q_COMPILER_MEMORY_BARRIER;
++ return returnValue;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
++{
++ T *returnValue = fetchAndStoreRelaxed(newValue);
++ Q_DATA_MEMORY_BARRIER;
++ return returnValue;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
++{
++ Q_DATA_MEMORY_BARRIER;
++ return fetchAndStoreRelaxed(newValue);
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreOrdered(T *newValue)
++{
++ Q_DATA_MEMORY_BARRIER;
++ T *returnValue = fetchAndStoreRelaxed(newValue);
++ Q_COMPILER_MEMORY_BARRIER;
++ return returnValue;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
++{
++ T *returnValue = fetchAndAddRelaxed(valueToAdd);
++ Q_DATA_MEMORY_BARRIER;
++ return returnValue;
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
++{
++ Q_DATA_MEMORY_BARRIER;
++ return fetchAndAddRelaxed(valueToAdd);
++}
++
++template <typename T>
++Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd)
++{
++ Q_DATA_MEMORY_BARRIER;
++ T *returnValue = fetchAndAddRelaxed(valueToAdd);
++ Q_COMPILER_MEMORY_BARRIER;
++ return returnValue;
++}
++
++#undef Q_DATA_MEMORY_BARRIER
++#undef Q_COMPILER_MEMORY_BARRIER
++
++QT_END_NAMESPACE
++
++QT_END_HEADER
++
++#endif // QATOMIC_AARCH64_H
+diff -up qt-everywhere-opensource-src-4.8.7/src/corelib/arch/qatomic_arch.h.aarch64 qt-everywhere-opensource-src-4.8.7/src/corelib/arch/qatomic_arch.h
+--- qt-everywhere-opensource-src-4.8.7/src/corelib/arch/qatomic_arch.h.aarch64 2015-05-07 09:14:48.000000000 -0500
++++ qt-everywhere-opensource-src-4.8.7/src/corelib/arch/qatomic_arch.h 2015-05-08 21:48:33.271061031 -0500
+@@ -94,6 +94,8 @@ QT_BEGIN_HEADER
+ # include "QtCore/qatomic_sh4a.h"
+ #elif defined(QT_ARCH_NACL)
+ # include "QtCore/qatomic_generic.h"
++#elif defined(QT_ARCH_AARCH64)
++# include "QtCore/qatomic_aarch64.h"
+ #else
+ # error "Qt has not been ported to this architecture"
+ #endif
diff --git a/subprojects/shared-modules/qt4/qt4-openssl-1.1.patch b/subprojects/shared-modules/qt4/qt4-openssl-1.1.patch
new file mode 100644
index 00000000..87baef87
--- /dev/null
+++ b/subprojects/shared-modules/qt4/qt4-openssl-1.1.patch
@@ -0,0 +1,409 @@
+Description: Compile with openssl-1.1.0
+ * Most changes are related to openssl structures are now opaque.
+ * The network/ssl threading setup has been disabled because the
+ old openssl threading model has been removed and is apparently
+ no longer needed.
+ * A number of new functions had to be imported (see changes to
+ src/network/ssl/qsslsocket_openssl_symbols.cpp)
+Author: Gert Wollny <gw.fossdev@gmail.com>
+Last-Update: 2016-06-28
+Bug-Debian: http://bugs.debian.org/828522
+
+--- a/src/network/ssl/qsslcertificate.cpp
++++ b/src/network/ssl/qsslcertificate.cpp
+@@ -259,10 +259,10 @@
+ QByteArray QSslCertificate::version() const
+ {
+ QMutexLocker lock(QMutexPool::globalInstanceGet(d.data()));
+- if (d->versionString.isEmpty() && d->x509)
++ if (d->versionString.isEmpty() && d->x509) {
+ d->versionString =
+- QByteArray::number(qlonglong(q_ASN1_INTEGER_get(d->x509->cert_info->version)) + 1);
+-
++ QByteArray::number(qlonglong(q_X509_get_version(d->x509)) + 1);
++ }
+ return d->versionString;
+ }
+
+@@ -276,7 +276,7 @@
+ {
+ QMutexLocker lock(QMutexPool::globalInstanceGet(d.data()));
+ if (d->serialNumberString.isEmpty() && d->x509) {
+- ASN1_INTEGER *serialNumber = d->x509->cert_info->serialNumber;
++ ASN1_INTEGER *serialNumber = q_X509_get_serialNumber(d->x509);
+ // if we cannot convert to a long, just output the hexadecimal number
+ if (serialNumber->length > 4) {
+ QByteArray hexString;
+@@ -489,24 +489,33 @@
+ QSslKey key;
+
+ key.d->type = QSsl::PublicKey;
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ X509_PUBKEY *xkey = d->x509->cert_info->key;
++#else
++ X509_PUBKEY *xkey = q_X509_get_X509_PUBKEY(d->x509);
++#endif
+ EVP_PKEY *pkey = q_X509_PUBKEY_get(xkey);
+ Q_ASSERT(pkey);
+
+- if (q_EVP_PKEY_type(pkey->type) == EVP_PKEY_RSA) {
++ int key_id;
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
++ key_id = q_EVP_PKEY_type(pkey->type);
++#else
++ key_id = q_EVP_PKEY_base_id(pkey);
++#endif
++ if (key_id == EVP_PKEY_RSA) {
+ key.d->rsa = q_EVP_PKEY_get1_RSA(pkey);
+ key.d->algorithm = QSsl::Rsa;
+ key.d->isNull = false;
+- } else if (q_EVP_PKEY_type(pkey->type) == EVP_PKEY_DSA) {
++ } else if (key_id == EVP_PKEY_DSA) {
+ key.d->dsa = q_EVP_PKEY_get1_DSA(pkey);
+ key.d->algorithm = QSsl::Dsa;
+ key.d->isNull = false;
+- } else if (q_EVP_PKEY_type(pkey->type) == EVP_PKEY_DH) {
++ } else if (key_id == EVP_PKEY_DH) {
+ // DH unsupported
+ } else {
+ // error?
+ }
+-
+ q_EVP_PKEY_free(pkey);
+ return key;
+ }
+--- a/src/network/ssl/qsslkey.cpp
++++ b/src/network/ssl/qsslkey.cpp
+@@ -321,8 +321,19 @@
+ {
+ if (d->isNull)
+ return -1;
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ return (d->algorithm == QSsl::Rsa)
+ ? q_BN_num_bits(d->rsa->n) : q_BN_num_bits(d->dsa->p);
++#else
++ if (d->algorithm == QSsl::Rsa) {
++ return q_RSA_bits(d->rsa);
++ }else{
++ BIGNUM *p = NULL;
++ q_DSA_get0_pqg(d->dsa, &p, NULL, NULL);
++ return q_BN_num_bits(p);
++ }
++#endif
++
+ }
+
+ /*!
+--- a/src/network/ssl/qsslsocket_openssl.cpp
++++ b/src/network/ssl/qsslsocket_openssl.cpp
+@@ -93,6 +93,7 @@
+ bool QSslSocketPrivate::s_loadedCiphersAndCerts = false;
+ bool QSslSocketPrivate::s_loadRootCertsOnDemand = false;
+
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ /* \internal
+
+ From OpenSSL's thread(3) manual page:
+@@ -174,6 +175,8 @@
+ }
+ } // extern "C"
+
++#endif //OPENSSL_VERSION_NUMBER >= 0x10100000L
++
+ QSslSocketBackendPrivate::QSslSocketBackendPrivate()
+ : ssl(0),
+ ctx(0),
+@@ -222,9 +225,12 @@
+ ciph.d->encryptionMethod = descriptionList.at(4).mid(4);
+ ciph.d->exportable = (descriptionList.size() > 6 && descriptionList.at(6) == QLatin1String("export"));
+
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ ciph.d->bits = cipher->strength_bits;
+ ciph.d->supportedBits = cipher->alg_bits;
+-
++#else
++ ciph.d->bits = q_SSL_CIPHER_get_bits(cipher, &ciph.d->supportedBits);
++#endif
+ }
+ return ciph;
+ }
+@@ -367,7 +373,7 @@
+ //
+ // See also: QSslContext::fromConfiguration()
+ if (caCertificate.expiryDate() >= QDateTime::currentDateTime()) {
+- q_X509_STORE_add_cert(ctx->cert_store, (X509 *)caCertificate.handle());
++ q_X509_STORE_add_cert(q_SSL_CTX_get_cert_store(ctx), (X509 *)caCertificate.handle());
+ }
+ }
+
+@@ -504,8 +510,10 @@
+ */
+ void QSslSocketPrivate::deinitialize()
+ {
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ q_CRYPTO_set_id_callback(0);
+ q_CRYPTO_set_locking_callback(0);
++#endif
+ }
+
+ /*!
+@@ -526,13 +534,17 @@
+ return false;
+
+ // Check if the library itself needs to be initialized.
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ QMutexLocker locker(openssl_locks()->initLock());
++#endif
+ if (!s_libraryLoaded) {
+ s_libraryLoaded = true;
+
+ // Initialize OpenSSL.
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ q_CRYPTO_set_id_callback(id_function);
+ q_CRYPTO_set_locking_callback(locking_function);
++#endif
+ if (q_SSL_library_init() != 1)
+ return false;
+ q_SSL_load_error_strings();
+@@ -571,7 +583,9 @@
+
+ void QSslSocketPrivate::ensureCiphersAndCertsLoaded()
+ {
+- QMutexLocker locker(openssl_locks()->initLock());
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
++ QMutexLocker locker(openssl_locks()->initLock());
++#endif
+ if (s_loadedCiphersAndCerts)
+ return;
+ s_loadedCiphersAndCerts = true;
+@@ -663,13 +677,18 @@
+ STACK_OF(SSL_CIPHER) *supportedCiphers = q_SSL_get_ciphers(mySsl);
+ for (int i = 0; i < q_sk_SSL_CIPHER_num(supportedCiphers); ++i) {
+ if (SSL_CIPHER *cipher = q_sk_SSL_CIPHER_value(supportedCiphers, i)) {
+- if (cipher->valid) {
++
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
++ if (cipher->valid) {
++#endif
+ QSslCipher ciph = QSslSocketBackendPrivate::QSslCipher_from_SSL_CIPHER(cipher);
+ if (!ciph.isNull()) {
+ if (!ciph.name().toLower().startsWith(QLatin1String("adh")))
+ ciphers << ciph;
+ }
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ }
++#endif
+ }
+ }
+
+--- a/src/network/ssl/qsslsocket_openssl_symbols_p.h
++++ b/src/network/ssl/qsslsocket_openssl_symbols_p.h
+@@ -399,7 +399,25 @@
+ PEM_ASN1_write_bio((int (*)(void*, unsigned char**))q_i2d_DSAPrivateKey,PEM_STRING_DSA,\
+ bp,(char *)x,enc,kstr,klen,cb,u)
+ #endif
++
++X509_STORE * q_SSL_CTX_get_cert_store(const SSL_CTX *ctx);
++ASN1_INTEGER * q_X509_get_serialNumber(X509 *x);
++
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ #define q_SSL_CTX_set_options(ctx,op) q_SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,(op),NULL)
++#define q_X509_get_version(x) X509_get_version(x)
++#else
++int q_EVP_PKEY_id(const EVP_PKEY *pkey);
++int q_EVP_PKEY_base_id(const EVP_PKEY *pkey);
++int q_SSL_CIPHER_get_bits(const SSL_CIPHER *cipher, int *alg_bits);
++long q_SSL_CTX_set_options(SSL_CTX *ctx, long options);
++long q_X509_get_version(X509 *x);
++X509_PUBKEY * q_X509_get_X509_PUBKEY(X509 *x);
++int q_RSA_bits(const RSA *rsa);
++int q_DSA_security_bits(const DSA *dsa);
++void q_DSA_get0_pqg(const DSA *d, BIGNUM **p, BIGNUM **q, BIGNUM **g);
++#endif
++
+ #define q_SKM_sk_num(type, st) ((int (*)(const STACK_OF(type) *))q_sk_num)(st)
+ #define q_SKM_sk_value(type, st,i) ((type * (*)(const STACK_OF(type) *, int))q_sk_value)(st, i)
+ #define q_sk_GENERAL_NAME_num(st) q_SKM_sk_num(GENERAL_NAME, (st))
+@@ -410,8 +428,15 @@
+ #define q_sk_SSL_CIPHER_value(st, i) q_SKM_sk_value(SSL_CIPHER, (st), (i))
+ #define q_SSL_CTX_add_extra_chain_cert(ctx,x509) \
+ q_SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509)
++
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ #define q_X509_get_notAfter(x) X509_get_notAfter(x)
+ #define q_X509_get_notBefore(x) X509_get_notBefore(x)
++#else
++ASN1_TIME *q_X509_get_notAfter(X509 *x);
++ASN1_TIME *q_X509_get_notBefore(X509 *x);
++#endif
++
+ #define q_EVP_PKEY_assign_RSA(pkey,rsa) q_EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\
+ (char *)(rsa))
+ #define q_EVP_PKEY_assign_DSA(pkey,dsa) q_EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\
+--- a/src/network/ssl/qsslsocket_openssl_symbols.cpp
++++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp
+@@ -290,6 +290,22 @@
+ DEFINEFUNC(void, OPENSSL_add_all_algorithms_conf, void, DUMMYARG, return, DUMMYARG)
+ DEFINEFUNC3(int, SSL_CTX_load_verify_locations, SSL_CTX *ctx, ctx, const char *CAfile, CAfile, const char *CApath, CApath, return 0, return)
+ DEFINEFUNC(long, SSLeay, void, DUMMYARG, return 0, return)
++DEFINEFUNC(X509_STORE *, SSL_CTX_get_cert_store, const SSL_CTX *ctx, ctx, return 0, return)
++
++DEFINEFUNC(ASN1_INTEGER *, X509_get_serialNumber, X509 *x, x, return 0, return)
++#if OPENSSL_VERSION_NUMBER >= 0x10100000L
++DEFINEFUNC(int, EVP_PKEY_id, const EVP_PKEY *pkey, pkey, return 0, return)
++DEFINEFUNC(int, EVP_PKEY_base_id, const EVP_PKEY *pkey, pkey, return 0, return)
++DEFINEFUNC2(int, SSL_CIPHER_get_bits, const SSL_CIPHER *cipher, cipher, int *alg_bits, alg_bits, return 0, return)
++DEFINEFUNC2(long, SSL_CTX_set_options, SSL_CTX *ctx, ctx, long options, options, return 0, return)
++DEFINEFUNC(long, X509_get_version, X509 *x, x, return 0, return)
++DEFINEFUNC(X509_PUBKEY *, X509_get_X509_PUBKEY, X509 *x, x, return 0, return)
++DEFINEFUNC(int, RSA_bits, const RSA *rsa, rsa, return 0, return)
++DEFINEFUNC(int, DSA_security_bits, const DSA *dsa, dsa, return 0, return)
++DEFINEFUNC(ASN1_TIME *, X509_get_notAfter, X509 *x, x, return 0, return)
++DEFINEFUNC(ASN1_TIME *, X509_get_notBefore, X509 *x, x, return 0, return)
++DEFINEFUNC4(void, DSA_get0_pqg, const DSA *d, d, BIGNUM **p, p, BIGNUM **q, q, BIGNUM **g, g, return, return)
++#endif
+
+ #ifdef Q_OS_SYMBIAN
+ #define RESOLVEFUNC(func, ordinal, lib) \
+@@ -801,6 +817,7 @@
+ RESOLVEFUNC(SSL_CTX_use_PrivateKey)
+ RESOLVEFUNC(SSL_CTX_use_RSAPrivateKey)
+ RESOLVEFUNC(SSL_CTX_use_PrivateKey_file)
++ RESOLVEFUNC(SSL_CTX_get_cert_store)
+ RESOLVEFUNC(SSL_accept)
+ RESOLVEFUNC(SSL_clear)
+ RESOLVEFUNC(SSL_connect)
+@@ -823,6 +840,23 @@
+ RESOLVEFUNC(SSL_set_connect_state)
+ RESOLVEFUNC(SSL_shutdown)
+ RESOLVEFUNC(SSL_write)
++
++ RESOLVEFUNC(X509_get_serialNumber)
++#if OPENSSL_VERSION_NUMBER >= 0x10100000L
++ RESOLVEFUNC(SSL_CTX_ctrl)
++ RESOLVEFUNC(EVP_PKEY_id)
++ RESOLVEFUNC(EVP_PKEY_base_id)
++ RESOLVEFUNC(SSL_CIPHER_get_bits)
++ RESOLVEFUNC(SSL_CTX_set_options)
++ RESOLVEFUNC(X509_get_version)
++ RESOLVEFUNC(X509_get_X509_PUBKEY)
++ RESOLVEFUNC(RSA_bits)
++ RESOLVEFUNC(DSA_security_bits)
++ RESOLVEFUNC(DSA_get0_pqg)
++ RESOLVEFUNC(X509_get_notAfter)
++ RESOLVEFUNC(X509_get_notBefore)
++#endif
++
+ #ifndef OPENSSL_NO_SSL2
+ RESOLVEFUNC(SSLv2_client_method)
+ #endif
+--- qt-everywhere-opensource-src-4.8.7/src/network/ssl/qsslkey.cpp.0131~ 2017-03-15 02:22:37.053244125 +0100
++++ qt-everywhere-opensource-src-4.8.7/src/network/ssl/qsslkey.cpp 2017-03-15 02:22:37.055244057 +0100
+@@ -328,7 +328,7 @@ int QSslKey::length() const
+ if (d->algorithm == QSsl::Rsa) {
+ return q_RSA_bits(d->rsa);
+ }else{
+- BIGNUM *p = NULL;
++ const BIGNUM *p = NULL;
+ q_DSA_get0_pqg(d->dsa, &p, NULL, NULL);
+ return q_BN_num_bits(p);
+ }
+--- qt-everywhere-opensource-src-4.8.7/src/network/ssl/qsslsocket_openssl_symbols.cpp.0131~ 2017-03-15 02:22:37.054244091 +0100
++++ qt-everywhere-opensource-src-4.8.7/src/network/ssl/qsslsocket_openssl_symbols.cpp 2017-03-15 02:29:41.155236836 +0100
+@@ -111,16 +111,16 @@ DEFINEFUNC(int, ASN1_STRING_length, ASN1
+ DEFINEFUNC2(int, ASN1_STRING_to_UTF8, unsigned char **a, a, ASN1_STRING *b, b, return 0, return);
+ DEFINEFUNC4(long, BIO_ctrl, BIO *a, a, int b, b, long c, c, void *d, d, return -1, return)
+ DEFINEFUNC(int, BIO_free, BIO *a, a, return 0, return)
+-DEFINEFUNC(BIO *, BIO_new, BIO_METHOD *a, a, return 0, return)
++DEFINEFUNC(BIO *, BIO_new, const BIO_METHOD *a, a, return 0, return)
+ DEFINEFUNC2(BIO *, BIO_new_mem_buf, void *a, a, int b, b, return 0, return)
+ DEFINEFUNC3(int, BIO_read, BIO *a, a, void *b, b, int c, c, return -1, return)
+-DEFINEFUNC(BIO_METHOD *, BIO_s_mem, void, DUMMYARG, return 0, return)
++DEFINEFUNC(const BIO_METHOD *, BIO_s_mem, void, DUMMYARG, return 0, return)
+ DEFINEFUNC3(int, BIO_write, BIO *a, a, const void *b, b, int c, c, return -1, return)
+ DEFINEFUNC(int, BN_num_bits, const BIGNUM *a, a, return 0, return)
+ DEFINEFUNC(int, CRYPTO_num_locks, DUMMYARG, DUMMYARG, return 0, return)
+ DEFINEFUNC(void, CRYPTO_set_locking_callback, void (*a)(int, int, const char *, int), a, return, DUMMYARG)
+ DEFINEFUNC(void, CRYPTO_set_id_callback, unsigned long (*a)(), a, return, DUMMYARG)
+-DEFINEFUNC(void, CRYPTO_free, void *a, a, return, DUMMYARG)
++DEFINEFUNC(void, OPENSSL_free, void *a, a, return, DUMMYARG)
+ DEFINEFUNC(void, DSA_free, DSA *a, a, return, DUMMYARG)
+ #if OPENSSL_VERSION_NUMBER < 0x00908000L
+ DEFINEFUNC3(X509 *, d2i_X509, X509 **a, a, unsigned char **b, b, long c, c, return 0, return)
+@@ -300,7 +300,7 @@ DEFINEFUNC(int, RSA_bits, const RSA *rs
+ DEFINEFUNC(int, DSA_security_bits, const DSA *dsa, dsa, return 0, return)
+ DEFINEFUNC(ASN1_TIME *, X509_get_notAfter, X509 *x, x, return 0, return)
+ DEFINEFUNC(ASN1_TIME *, X509_get_notBefore, X509 *x, x, return 0, return)
+-DEFINEFUNC4(void, DSA_get0_pqg, const DSA *d, d, BIGNUM **p, p, BIGNUM **q, q, BIGNUM **g, g, return, return)
++DEFINEFUNC4(void, DSA_get0_pqg, const DSA *d, d, const BIGNUM **p, p, const BIGNUM **q, q, const BIGNUM **g, g, return, return)
+ #endif
+
+ #ifdef Q_OS_SYMBIAN
+--- qt-everywhere-opensource-src-4.8.7/src/network/ssl/qsslsocket_openssl_symbols_p.h.0131~ 2017-03-15 02:22:37.054244091 +0100
++++ qt-everywhere-opensource-src-4.8.7/src/network/ssl/qsslsocket_openssl_symbols_p.h 2017-03-15 02:29:50.192986268 +0100
+@@ -59,6 +59,9 @@
+ QT_BEGIN_NAMESPACE
+
+ #define DUMMYARG
++#ifndef OPENSSL_NO_SSL2
++#define OPENSSL_NO_SSL2 1
++#endif
+
+ #if !defined QT_LINKED_OPENSSL
+ // **************** Shared declarations ******************
+@@ -207,16 +210,16 @@ int q_ASN1_STRING_length(ASN1_STRING *a)
+ int q_ASN1_STRING_to_UTF8(unsigned char **a, ASN1_STRING *b);
+ long q_BIO_ctrl(BIO *a, int b, long c, void *d);
+ int q_BIO_free(BIO *a);
+-BIO *q_BIO_new(BIO_METHOD *a);
++BIO *q_BIO_new(const BIO_METHOD *a);
+ BIO *q_BIO_new_mem_buf(void *a, int b);
+ int q_BIO_read(BIO *a, void *b, int c);
+-BIO_METHOD *q_BIO_s_mem();
++const BIO_METHOD *q_BIO_s_mem();
+ int q_BIO_write(BIO *a, const void *b, int c);
+ int q_BN_num_bits(const BIGNUM *a);
+ int q_CRYPTO_num_locks();
+ void q_CRYPTO_set_locking_callback(void (*a)(int, int, const char *, int));
+ void q_CRYPTO_set_id_callback(unsigned long (*a)());
+-void q_CRYPTO_free(void *a);
++void q_OPENSSL_free(void *a);
+ void q_DSA_free(DSA *a);
+ #if OPENSSL_VERSION_NUMBER >= 0x00908000L
+ // 0.9.8 broke SC and BC by changing this function's signature.
+@@ -326,7 +329,6 @@ void q_SSL_set_accept_state(SSL *a);
+ void q_SSL_set_connect_state(SSL *a);
+ int q_SSL_shutdown(SSL *a);
+ #if OPENSSL_VERSION_NUMBER >= 0x10000000L
+-const SSL_METHOD *q_SSLv2_client_method();
+ const SSL_METHOD *q_SSLv3_client_method();
+ const SSL_METHOD *q_SSLv23_client_method();
+ const SSL_METHOD *q_TLSv1_client_method();
+@@ -335,7 +337,6 @@ const SSL_METHOD *q_SSLv3_server_method(
+ const SSL_METHOD *q_SSLv23_server_method();
+ const SSL_METHOD *q_TLSv1_server_method();
+ #else
+-SSL_METHOD *q_SSLv2_client_method();
+ SSL_METHOD *q_SSLv3_client_method();
+ SSL_METHOD *q_SSLv23_client_method();
+ SSL_METHOD *q_TLSv1_client_method();
+@@ -415,7 +416,7 @@ long q_X509_get_version(X509 *x);
+ X509_PUBKEY * q_X509_get_X509_PUBKEY(X509 *x);
+ int q_RSA_bits(const RSA *rsa);
+ int q_DSA_security_bits(const DSA *dsa);
+-void q_DSA_get0_pqg(const DSA *d, BIGNUM **p, BIGNUM **q, BIGNUM **g);
++void q_DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g);
+ #endif
+
+ #define q_SKM_sk_num(type, st) ((int (*)(const STACK_OF(type) *))q_sk_num)(st)
+--- qt-everywhere-opensource-src-4.8.7/src/network/ssl/qsslcertificate.cpp.omv~ 2017-03-15 02:27:18.143322736 +0100
++++ qt-everywhere-opensource-src-4.8.7/src/network/ssl/qsslcertificate.cpp 2017-03-15 02:29:56.215819741 +0100
+@@ -696,7 +696,7 @@
+ unsigned char *data = 0;
+ int size = q_ASN1_STRING_to_UTF8(&data, q_X509_NAME_ENTRY_get_data(e));
+ info[QString::fromUtf8(obj)] = QString::fromUtf8((char*)data, size);
+- q_CRYPTO_free(data);
++ q_OPENSSL_free(data);
+ }
+ return info;
+ }
diff --git a/subprojects/shared-modules/smpeg/smpeg-0.4.5.json b/subprojects/shared-modules/smpeg/smpeg-0.4.5.json
new file mode 100644
index 00000000..a931bac9
--- /dev/null
+++ b/subprojects/shared-modules/smpeg/smpeg-0.4.5.json
@@ -0,0 +1,45 @@
+{
+ "name": "smpeg",
+ "config-opts": ["--disable-static"],
+ "cleanup": [
+ "/bin",
+ "/man"
+ ],
+ "rm-configure": true,
+ "sources": [
+ {
+ "type": "archive",
+ "url": "http://http.debian.net/debian/pool/main/s/smpeg/smpeg_0.4.5+cvs20030824.orig.tar.gz",
+ "sha256": "1276ea797dd9fde8a12dd3f33f180153922544c28ca9fc7b477c018876be1916"
+ },
+ {
+ "type": "shell",
+ "commands": [
+ "sed -i '/^## libtool.m4/,/^#####/d' acinclude.m4"
+ ]
+ },
+ {
+ "type": "script",
+ "dest-filename": "autogen.sh",
+ "commands": [
+ "AUTOMAKE=\"automake --foreign --add-missing --force-missing\" autoreconf -vfi"
+ ]
+ },
+ {
+ "type": "patch",
+ "path": "smpeg-am-prog-as.patch"
+ },
+ {
+ "type": "patch",
+ "path": "smpeg-export-mpegaudio-class.patch"
+ },
+ {
+ "type": "patch",
+ "path": "smpeg-no-gtk.patch"
+ },
+ {
+ "type": "patch",
+ "path": "smpeg-gcc6.patch"
+ }
+ ]
+}
diff --git a/subprojects/shared-modules/smpeg/smpeg-am-prog-as.patch b/subprojects/shared-modules/smpeg/smpeg-am-prog-as.patch
new file mode 100644
index 00000000..36197d71
--- /dev/null
+++ b/subprojects/shared-modules/smpeg/smpeg-am-prog-as.patch
@@ -0,0 +1,12 @@
+Index: smpeg-0.4.5+cvs20030824/configure.in
+===================================================================
+--- smpeg-0.4.5+cvs20030824.orig/configure.in
++++ smpeg-0.4.5+cvs20030824/configure.in
+@@ -57,6 +57,7 @@
+ AC_LIBTOOL_WIN32_DLL
+ AM_PROG_LIBTOOL
+ AC_PROG_INSTALL
++AM_PROG_AS
+
+ dnl Ugh.
+ AS="$CC"
diff --git a/subprojects/shared-modules/smpeg/smpeg-export-mpegaudio-class.patch b/subprojects/shared-modules/smpeg/smpeg-export-mpegaudio-class.patch
new file mode 100644
index 00000000..9ecb9b58
--- /dev/null
+++ b/subprojects/shared-modules/smpeg/smpeg-export-mpegaudio-class.patch
@@ -0,0 +1,17 @@
+--- smpeg-0.4.5+cvs20030824.orig/MPEGaudio.h
++++ smpeg-0.4.5+cvs20030824/MPEGaudio.h
+@@ -149,6 +149,14 @@
+ };
+
+ /* The actual MPEG audio class */
++
++class MPEGaudio;
++void Play_MPEGaudioSDL(void *udata, Uint8 *stream, int len);
++int Play_MPEGaudio(MPEGaudio *audio, Uint8 *stream, int len);
++#ifdef THREADED_AUDIO
++int Decode_MPEGaudio(void *udata);
++#endif
++
+ class MPEGaudio : public MPEGerror, public MPEGaudioaction {
+
+ friend void Play_MPEGaudioSDL(void *udata, Uint8 *stream, int len);
diff --git a/subprojects/shared-modules/smpeg/smpeg-gcc6.patch b/subprojects/shared-modules/smpeg/smpeg-gcc6.patch
new file mode 100644
index 00000000..21b30da5
--- /dev/null
+++ b/subprojects/shared-modules/smpeg/smpeg-gcc6.patch
@@ -0,0 +1,40 @@
+Description: Fix compiling with GCC 6.
+Author: Johannes Brandstätter <jbrandst@2ds.eu>
+Bug-Debian: https://bugs.debian.org/811742
+Last-Update: <2016-09-24>
+
+Index: smpeg-0.4.5+cvs20030824/audio/huffmantable.cpp
+===================================================================
+--- smpeg-0.4.5+cvs20030824.orig/audio/huffmantable.cpp
++++ smpeg-0.4.5+cvs20030824/audio/huffmantable.cpp
+@@ -9,6 +9,7 @@
+ #include "config.h"
+ #endif
+
++#include <climits>
+ #include "MPEGaudio.h"
+
+ static const unsigned int
+@@ -550,11 +551,11 @@ htd33[ 31][2]={{ 16, 1},{ 8, 1},{ 4,
+
+ const HUFFMANCODETABLE MPEGaudio::ht[HTN]=
+ {
+- { 0, 0-1, 0-1, 0, 0, htd33},
++ { 0, UINT_MAX, UINT_MAX, 0, 0, htd33},
+ { 1, 2-1, 2-1, 0, 7,htd01},
+ { 2, 3-1, 3-1, 0, 17,htd02},
+ { 3, 3-1, 3-1, 0, 17,htd03},
+- { 4, 0-1, 0-1, 0, 0, htd33},
++ { 4, UINT_MAX, UINT_MAX, 0, 0, htd33},
+ { 5, 4-1, 4-1, 0, 31,htd05},
+ { 6, 4-1, 4-1, 0, 31,htd06},
+ { 7, 6-1, 6-1, 0, 71,htd07},
+@@ -564,7 +565,7 @@ const HUFFMANCODETABLE MPEGaudio::ht[HTN
+ {11, 8-1, 8-1, 0,127,htd11},
+ {12, 8-1, 8-1, 0,127,htd12},
+ {13,16-1,16-1, 0,511,htd13},
+- {14, 0-1, 0-1, 0, 0, htd33},
++ {14, UINT_MAX, UINT_MAX, 0, 0, htd33},
+ {15,16-1,16-1, 0,511,htd15},
+ {16,16-1,16-1, 1,511,htd16},
+ {17,16-1,16-1, 2,511,htd16},
diff --git a/subprojects/shared-modules/smpeg/smpeg-no-gtk.patch b/subprojects/shared-modules/smpeg/smpeg-no-gtk.patch
new file mode 100644
index 00000000..792596cf
--- /dev/null
+++ b/subprojects/shared-modules/smpeg/smpeg-no-gtk.patch
@@ -0,0 +1,37 @@
+From 62cda978596a323cd7042722f906df906007e5b5 Mon Sep 17 00:00:00 2001
+From: Cosimo Cecchi <cosimoc@gnome.org>
+Date: Sat, 15 Apr 2017 13:24:39 -0700
+Subject: [PATCH] Comment out GTK detection
+
+---
+ configure.in | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/configure.in b/configure.in
+index 20b1355..2cb4753 100644
+--- a/configure.in
++++ b/configure.in
+@@ -208,13 +208,13 @@ AC_ARG_ENABLE(gtk_player,
+ [ --enable-gtk-player build a GTk sample SMPEG player [default=yes]],
+ , enable_gtk_player=yes)
+ have_gtk=no
+-if test x$enable_gtk_player = xyes; then
+- AM_PATH_GTK(1.2.1, have_gtk=yes)
+- if test x$have_gtk = xyes; then
+- CFLAGS="$CFLAGS $GTK_CFLAGS"
+- fi
+- AC_SUBST(GTK_LIBS)
+-fi
++dnl if test x$enable_gtk_player = xyes; then
++dnl AM_PATH_GTK(1.2.1, have_gtk=yes)
++dnl if test x$have_gtk = xyes; then
++dnl CFLAGS="$CFLAGS $GTK_CFLAGS"
++dnl fi
++dnl AC_SUBST(GTK_LIBS)
++dnl fi
+ AM_CONDITIONAL(HAVE_GTK, test x$have_gtk = xyes)
+
+ dnl See if we can build the Mesa player
+--
+2.12.2
+
diff --git a/subprojects/shared-modules/vorbisgain/0001-temp_files.patch b/subprojects/shared-modules/vorbisgain/0001-temp_files.patch
new file mode 100644
index 00000000..4e6d6706
--- /dev/null
+++ b/subprojects/shared-modules/vorbisgain/0001-temp_files.patch
@@ -0,0 +1,75 @@
+Description: Apply patch to use temp files, which are dependent
+ on the file which is beeing processed, instead always using the same
+ filename, which can result to data loss in scenarios where two or more
+ vorbis processes are running parallel.
+Author: Pavel N. Krivitsky <pavel@krivitsky.name>
+Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=505164
+Forwarded: no
+---
+ vorbis.c | 17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+--- a/vorbis.c
++++ b/vorbis.c
+@@ -56,7 +56,7 @@
+ #define PROGRESS_FORMAT_SIZE 8
+ #define MIN_FILENAME_SIZE 5
+ #define MIN_MIDDLE_TRUNCATE_SIZE 20
+-#define TEMP_NAME "vorbisgain.tmpXXXXXX"
++#define TEMP_EXT ".vgain.tmpXXXXXX"
+
+
+ /**
+@@ -684,11 +684,10 @@
+ }
+ }
+
+- /* Make sure temp is in same folder as file. And yes, the malloc is larger
+- * than necessary (and not always needed). Lets keep it simple though (at
+- * the expense of a few bytes)...
++ /* Construct a temporary file name by appending TEMP_EXT to
++ * the name of the file being modified.
+ */
+- temp_name = malloc(strlen(filename) + sizeof(TEMP_NAME));
++ temp_name = malloc(strlen(filename)*sizeof(char) + sizeof(TEMP_EXT));
+
+ if (temp_name == NULL)
+ {
+@@ -697,7 +696,7 @@
+ }
+
+ strcpy(temp_name, filename);
+- strcpy((char *) last_path(temp_name), TEMP_NAME);
++ strcat(temp_name, TEMP_EXT);
+
+ #ifdef WIN32
+ temp_name = _mktemp(temp_name);
+@@ -779,6 +778,7 @@
+ file_error(_("Note: Couldn't set mode for file '%s': "), filename);
+ }
+
++#if 0 /* Disable for Debian, this surprises people and is not useful --liw */
+ utime_buf.actime = stat_buf.st_atime;
+ utime_buf.modtime = stat_buf.st_mtime;
+
+@@ -786,6 +786,7 @@
+ {
+ file_error(_("Note: Couldn't set time for file '%s': "), filename);
+ }
++#endif
+
+ result = 0;
+
+@@ -817,10 +818,10 @@
+
+ if (delete_temp)
+ {
+- if (remove(TEMP_NAME) != 0)
++ if (remove(temp_name) != 0)
+ {
+ file_error(_("Note: Couldn't remove temporary file '%s': "),
+- TEMP_NAME);
++ temp_name);
+ }
+ }
+
diff --git a/subprojects/shared-modules/vorbisgain/0002-errno.patch b/subprojects/shared-modules/vorbisgain/0002-errno.patch
new file mode 100644
index 00000000..b01f2ad8
--- /dev/null
+++ b/subprojects/shared-modules/vorbisgain/0002-errno.patch
@@ -0,0 +1,33 @@
+Description: Zero errno before readdir call.
+From: http://bugs.debian.org/375110
+Forwarded: no
+---
+ recurse.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/recurse.c
++++ b/recurse.c
+@@ -408,6 +408,7 @@
+ */
+ static int read_dir(DIRECTORY *directory)
+ {
++ errno = 0;
+ directory->entry = readdir(directory->dir);
+
+ if (directory->entry != NULL)
+@@ -622,6 +623,7 @@
+ /* Check for wildcards */
+ settings->pattern = last_path(my_path);
+
++#if 0 /* Disable for Debian, as it suprises people. --liw */
+ if (contains_pattern(settings->pattern))
+ {
+ /* Strip last part of path */
+@@ -637,6 +639,7 @@
+ }
+ }
+ else
++#endif
+ {
+ settings->pattern = NULL;
+ }
diff --git a/subprojects/shared-modules/vorbisgain/0003-manpage.patch b/subprojects/shared-modules/vorbisgain/0003-manpage.patch
new file mode 100644
index 00000000..8aaeaf1c
--- /dev/null
+++ b/subprojects/shared-modules/vorbisgain/0003-manpage.patch
@@ -0,0 +1,248 @@
+Description: Man page says --silent, should be --skip
+From: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=355783
+Forwarded: no
+---
+ vorbisgain.1 | 60 ++++++++++++-----------------------------------------------
+ 1 file changed, 13 insertions(+), 47 deletions(-)
+
+--- a/vorbisgain.1
++++ b/vorbisgain.1
+@@ -2,10 +2,8 @@
+ .\" groff -man -Tascii vorbisgain.1
+ .\"
+ .TH vorbisgain 1 "2004 Jan 3" "" "VorbisGain"
+-
+ .SH NAME
+ vorbisgain \- calculate the replay gain for Ogg Vorbis files
+-
+ .SH SYNOPSIS
+ .B vorbisgain
+ [
+@@ -16,7 +14,6 @@
+ .I album gain
+ ]
+ .I input_files \fR...
+-
+ .SH DESCRIPTION
+ .B vorbisgain
+ calculates the ReplayGain values for the named Ogg Vorbis input files and
+@@ -27,7 +24,6 @@
+ uses a default target level of 89 dB, rather than the 83 dB recommended by the
+ ReplayGain standard, when calculating the gain to apply. (Some players include
+ a pre-amplification setting with which the target level can be changed.)
+-
+ .PP
+ .B vorbisgain
+ input files must be Ogg Vorbis I files with 1 or 2 channels and a sample rate
+@@ -35,21 +31,16 @@
+ kHz. If an input file contains multiple streams (i.e., it is chained), the
+ streams must all have the same format, in terms of sampling frequency and
+ number of channels.
+-
+ .PP
+ All streams in a chained file are processed, but the ReplayGain tags are
+ only written to (or removed from) the first stream.
+-
+ .SH OPTIONS
+-
+ .IP "-h, --help"
+ Show command help.
+-
+ .IP "-a, --album"
+ Activates album mode, in which the album gain (sometimes called the audiophile
+ gain) is calculated in addition to the track gain (sometimes called the radio
+ gain).
+-
+ .IP "-g n, --album-gain=n"
+ Sets the album gain value to use. Default is to calculate it, if
+ .I -a
+@@ -59,38 +50,31 @@
+ dB, specifying the
+ .B change
+ in volume that should be applied.
+-
+ .IP "-c, --clean"
+ Remove any ReplayGain tags from the specified files. If a file does not
+ contain any ReplayGain tags, the file is not modified.
+-
+ .IP "-C, --convert"
+ Convert old format ReplayGain tags to a new format (see section TAG FORMAT
+ below for details). If a file does not contain all ReplayGain tags that are
+ needed for a conversion, the file is not modified. The album peak tag is
+ only created if
+ .I -a
+-is specified, and the album gain value is then checked for concistency.
++is specified, and the album gain value is then checked for consistency.
+ Otherwise any album gain is converted without any checks.
+-
+ .IP "-d, --display-only"
+ Display the result only; do not write anything to disk. This applies to all
+ options.
+-
+ .IP "-f, --fast"
+ Only calculate the gain for files that do not contain all replay gain tags
+ needed (the album gain and peak tags are only considered if
+ .I -a
+ has been specified).
+-
+ .IP "-n, --no-progress"
+ Only display results, but don't show progress in percentages and times. This
+ can be useful if the output is piped into other programs.
+-
+ .IP "-q, --quiet"
+ Do not display any output while processing. Only error and warning messages will
+ be printed.
+-
+ .IP "-r, --recursive"
+ Enter directories (recursively) and search for files, if directories or file
+ patterns are specified.
+@@ -98,65 +82,51 @@
+ Only available if
+ .B vorbisgain
+ was configured with --enable-recursive.
+-
+-.IP "-s, --silent"
+-Sliently skip any non-Vorbis files found. Vorbis files that can't be processed
++.IP "-s, --skip"
++Silently skip any non-Vorbis files found. Vorbis files that can't be processed
+ for some reason are skipped as well, though not silently. Default is to stop
+ when such files are encountered.
+-
+ .IP "-v, --version"
+ Display the version of the program.
+-
+ .SH EXAMPLES
+-
+ Simplest version. Calculate the track gain and peak only.
+ .PP
+ .RS
+ vorbisgain somefile.ogg
+ .RE
+-
+ .PP
+ Note that the following examples are only possible if
+ .B vorbisgain
+ was configured with --enable-recursive.
+-
+ .PP
+ Calculate the album gain and peak, in addition to the track gain and peak, for
+ all .ogg files in the directory "music" (and all subdirectories). All files in
+ one directory are treated as belonging to the same album. Files that already
+ have ReplayGain tags are not re-calculated. Note the quotes, as they cause the
+ shell to not do any filename globbing:
+-
+ .PP
+ .RS
+ vorbisgain -a -f -r "music/*.ogg"
+ .RE
+-
+ .PP
+ Calculate the album gain. The files specified before the directory "album"
+ are treated as one album, the files in the directory "album" as another
+ album and the remaining files as a third album:
+-
+ .PP
+ .RS
+ vorbisgain -a -r a.ogg b.ogg c.ogg album d.ogg e.ogg f.ogg
+ .RE
+-
+ .PP
+ Remove all replaygain tags from a collection of oggs:
+-
+ .PP
+ .RS
+ vorbisgain -c -r "music/*.ogg"
+ .RE
+-
+ .SH TAG FORMAT
+-
+ .B vorbisgain
+ creates tags like these (when in
+ .I -a
+ mode):
+-
+ .PP
+ .RS
+ REPLAYGAIN_TRACK_GAIN=-7.03 dB
+@@ -170,18 +140,15 @@
+ .RS
+ REPLAYGAIN_ALBUM_PEAK=1.21822226
+ .RE
+-
+ .PP
+ Gain specifies how much the volume should be changed before playback, in dB.
+ Peak is the maximum sample value of the file before any gain has been
+ applied, where 1.0 means "full sample value" (32,767 when decoding to signed
+ 16 bit samples).
+-
+ .PP
+ Earlier versions of
+ .B vorbisgain
+ (before 0.30) created the following tags:
+-
+ .PP
+ .RS
+ RG_RADIO
+@@ -192,7 +159,6 @@
+ .RS
+ RG_AUDIOPHILE
+ .RE
+-
+ .PP
+ When
+ .I -c
+@@ -200,44 +166,44 @@
+ REPLAYGAIN_TRACK_PEAK, RG_AUDIOPHILE to REPLAYGAIN_ALBUM_GAIN and
+ REPLAYGAIN_ALBUM_PEAK is calculated as the maximum of all RG_PEAK tags in
+ the album.
+-
+ .SH AUTHORS
+-
+ .TP
+ Program Code:
+ .br
+ Gian-Carlo Pascutto <gcp@sjeng.org>
+ .br
+ Magnus Holmgren <lear@algonet.se>
+-
+ .TP
+ ReplayGain Analysis Code:
+ .br
+ Glen Sawyer <glensawyer@hotmail.com>
+ .br
+ Frank Klemm (http://www.uni-jena.de/~pfk/)
+-
+ .TP
+ Man Page:
+ .br
+ Magnus Holmgren <lear@algonet.se>
+-
+ .SH BUGS
+-
+ None known.
+-
+ .SH SEE ALSO
+-
+ .TP
+ http://sjeng.org/vorbisgain.html
+ Home page for VorbisGain. The latest version, and a Windows executable,
+ can be found here.
+-
+ .TP
+ http://www.replaygain.org/
+ Contains detailed information about ReplayGain and how it is calculated.
+-
+ .TP
+ http://www.hydrogenaudio.org/
+ Discussion forum for audio compression and related issues, including Ogg
+ Vorbis and VorbisGain.
++.SH NOTE
++The version of vorbisgain packaged for Debian differs in two ways from
++the upstream version. First, it does not retain the modification time
++of the input file: if tags are changed in a file, the mtime will change.
++Second, it does not try to process wildcards in filenames. This makes
++it impossible to say "process all foo*.ogg in all subdirectories", but
++also avoids problems with filenames that actually contain wildcards.
++Without this change, "vorbisgain *.ogg" in a directory with a file that
++contains a question mark would result in that file being treated as
++being in a different album.
diff --git a/subprojects/shared-modules/vorbisgain/0004-vorbisgain_mtime.patch b/subprojects/shared-modules/vorbisgain/0004-vorbisgain_mtime.patch
new file mode 100644
index 00000000..0abd7ce1
--- /dev/null
+++ b/subprojects/shared-modules/vorbisgain/0004-vorbisgain_mtime.patch
@@ -0,0 +1,183 @@
+Description: When a file's metadata is updated, the mtime is changed
+ to the current time. Whether this is correct or not is often a
+ religious issue (metadata-vs-data), but, generally, all other
+ tag-editing software choose to keep the timestamp.
+ .
+ Since the upstream fixed the issue, it is bad to ignore the fix
+ altogether. At the very least, there should be a command-line
+ option to follow the upstream and The Only Right(tm) behaviour.
+Author: Adam Borowski <kilobyte@angband.pl>
+Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=445958
+---
+ vorbis.c | 18 ++++++++++--------
+ vorbis.h | 2 +-
+ vorbisgain.1 | 7 ++++++-
+ vorbisgain.c | 20 ++++++++++++++------
+ vorbisgain.h | 1 +
+ 5 files changed, 32 insertions(+), 16 deletions(-)
+
+--- a/vorbis.c
++++ b/vorbis.c
+@@ -557,7 +557,8 @@
+ * message has been printed).
+ */
+ int write_gains(const char *filename, float track_peak, float track_gain,
+- float album_peak, float album_gain, int verbose, int remove_tags)
++ float album_peak, float album_gain, int verbose, int remove_tags,
++ SETTINGS* settings)
+ {
+ struct stat stat_buf;
+ struct utimbuf utime_buf;
+@@ -778,15 +779,16 @@
+ file_error(_("Note: Couldn't set mode for file '%s': "), filename);
+ }
+
+-#if 0 /* Disable for Debian, this surprises people and is not useful --liw */
+- utime_buf.actime = stat_buf.st_atime;
+- utime_buf.modtime = stat_buf.st_mtime;
+-
+- if (utime(filename, &utime_buf) != 0)
++ if (!settings->trample_mtime)
+ {
+- file_error(_("Note: Couldn't set time for file '%s': "), filename);
++ utime_buf.actime = stat_buf.st_atime;
++ utime_buf.modtime = stat_buf.st_mtime;
++
++ if (utime(filename, &utime_buf) != 0)
++ {
++ file_error(_("Note: Couldn't set time for file '%s': "), filename);
++ }
+ }
+-#endif
+
+ result = 0;
+
+--- a/vorbisgain.1
++++ b/vorbisgain.1
+@@ -72,6 +72,10 @@
+ .IP "-n, --no-progress"
+ Only display results, but don't show progress in percentages and times. This
+ can be useful if the output is piped into other programs.
++.IP "-p, --preserve-mtime"
++Do not trample upon the timestamps of any files being worked on. This obeys
++the expected data-vs-metadata behaviour, but can confuse some naive
++archivers.
+ .IP "-q, --quiet"
+ Do not display any output while processing. Only error and warning messages will
+ be printed.
+@@ -200,7 +204,8 @@
+ .SH NOTE
+ The version of vorbisgain packaged for Debian differs in two ways from
+ the upstream version. First, it does not retain the modification time
+-of the input file: if tags are changed in a file, the mtime will change.
++of the input file by default: if tags are changed in a file, the mtime will
++change; you can specify "-p" to get the normal behaviour.
+ Second, it does not try to process wildcards in filenames. This makes
+ it impossible to say "process all foo*.ogg in all subdirectories", but
+ also avoids problems with filenames that actually contain wildcards.
+--- a/vorbisgain.c
++++ b/vorbisgain.c
+@@ -235,7 +235,7 @@
+ {
+ if (write_gains(file->filename, file->track_peak,
+ file->track_gain, album_peak, file->album_gain,
+- !settings->quiet, 0) < 0)
++ !settings->quiet, 0, settings) < 0)
+ {
+ return -1;
+ }
+@@ -288,7 +288,7 @@
+ else
+ {
+ if (write_gains(file->filename, NO_PEAK, NO_GAIN,
+- NO_PEAK, NO_GAIN, !settings->quiet, 1) < 0)
++ NO_PEAK, NO_GAIN, !settings->quiet, 1, settings) < 0)
+ {
+ return -1;
+ }
+@@ -425,7 +425,8 @@
+ if (!settings->album)
+ {
+ if (!settings->display_only && write_gains(file->filename,
+- file->track_peak, file->track_gain, NO_PEAK, NO_GAIN, 0, 0) < 0)
++ file->track_peak, file->track_gain, NO_PEAK, NO_GAIN, 0, 0,
++ settings) < 0)
+ {
+ return -1;
+ }
+@@ -466,7 +467,7 @@
+
+ if (write_gains(file->filename, file->track_peak,
+ file->track_gain, album_peak, album_gain,
+- !settings->quiet, 0) < 0)
++ !settings->quiet, 0, settings) < 0)
+ {
+ return -1;
+ }
+@@ -497,6 +498,7 @@
+ fprintf(stderr, _(" -h, --help Print this help text\n"));
+ fprintf(stderr, _(" -n, --no-progress Don't show progress, just print results\n"));
+ fprintf(stderr, _(" -q, --quiet Don't print any output (except errors)\n"));
++ fprintf(stderr, _(" -p, --preserve-mtime Don't change the timestamps\n"));
+ #ifdef ENABLE_RECURSIVE
+ fprintf(stderr, _(" -r, --recursive Search for files recursivly, each folder as an album\n"));
+ #endif
+@@ -522,6 +524,7 @@
+ {"fast", 0, NULL, 'f'},
+ {"help", 0, NULL, 'h'},
+ {"no-progress", 0, NULL, 'n'},
++ {"preserve-mtime",0,NULL, 'p'},
+ {"quiet", 0, NULL, 'q'},
+ #ifdef ENABLE_RECURSIVE
+ {"recursive", 0, NULL, 'r'},
+@@ -533,9 +536,9 @@
+
+
+ #ifdef ENABLE_RECURSIVE
+-#define ARG_STRING "acCdfg:hnqrst:v"
++#define ARG_STRING "acCdfg:hnpqrst:v"
+ #else
+-#define ARG_STRING "acCdfg:hnqst:v"
++#define ARG_STRING "acCdfg:hnpqst:v"
+ #endif
+
+
+@@ -549,6 +552,7 @@
+ memset(&settings, 0, sizeof(settings));
+ settings.first_file = 1;
+ settings.album_gain = NO_GAIN;
++ settings.trample_mtime = 1;
+ settings.show_progress = 1;
+
+ #ifdef WIN32
+@@ -623,6 +627,10 @@
+ settings.show_progress = 0;
+ break;
+
++ case 'p':
++ settings.trample_mtime = 0;
++ break;
++
+ case 'q':
+ settings.quiet = 1;
+ break;
+--- a/vorbisgain.h
++++ b/vorbisgain.h
+@@ -31,6 +31,7 @@
+ int convert; /**< Convert old format tags to new format */
+ int display_only;
+ int fast; /**< Skip files that already have all needed tags */
++ int trample_mtime;
+ int quiet;
+ #ifdef ENABLE_RECURSIVE
+ int recursive;
+--- a/vorbis.h
++++ b/vorbis.h
+@@ -15,6 +15,6 @@
+ SETTINGS *settings);
+ extern int write_gains(const char *filename, float track_peak,
+ float track_gain, float album_gain, float album_peak, int verbose,
+- int remove_tags);
++ int remove_tags, SETTINGS *settings);
+
+ #endif /* VG_VORBIS_H */
diff --git a/subprojects/shared-modules/vorbisgain/0005-double_fclose.patch b/subprojects/shared-modules/vorbisgain/0005-double_fclose.patch
new file mode 100644
index 00000000..2a183292
--- /dev/null
+++ b/subprojects/shared-modules/vorbisgain/0005-double_fclose.patch
@@ -0,0 +1,21 @@
+Description: Don't call fclose() twice.
+Author: Jonathan Neuschäfer <j.neuschaefer@gmx.net>
+Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=632947
+---
+ vorbis.c | 5 -----
+ 1 file changed, 5 deletions(-)
+
+--- a/vorbis.c
++++ b/vorbis.c
+@@ -813,11 +813,6 @@
+ fclose(infile);
+ }
+
+- if (infile != NULL)
+- {
+- fclose(infile);
+- }
+-
+ if (delete_temp)
+ {
+ if (remove(temp_name) != 0)
diff --git a/subprojects/shared-modules/vorbisgain/0006-manpage_hyphens.patch b/subprojects/shared-modules/vorbisgain/0006-manpage_hyphens.patch
new file mode 100644
index 00000000..cb518e69
--- /dev/null
+++ b/subprojects/shared-modules/vorbisgain/0006-manpage_hyphens.patch
@@ -0,0 +1,56 @@
+Description: Resolved hyphen-used-as-minus-sign lintian complaints.
+Forwarded: no
+--- a/vorbisgain.1
++++ b/vorbisgain.1
+@@ -85,7 +85,7 @@
+ .I Note:
+ Only available if
+ .B vorbisgain
+-was configured with --enable-recursive.
++was configured with \-\-enable\-recursive.
+ .IP "-s, --skip"
+ Silently skip any non-Vorbis files found. Vorbis files that can't be processed
+ for some reason are skipped as well, though not silently. Default is to stop
+@@ -101,7 +101,7 @@
+ .PP
+ Note that the following examples are only possible if
+ .B vorbisgain
+-was configured with --enable-recursive.
++was configured with \-\-enable\-recursive.
+ .PP
+ Calculate the album gain and peak, in addition to the track gain and peak, for
+ all .ogg files in the directory "music" (and all subdirectories). All files in
+@@ -110,7 +110,7 @@
+ shell to not do any filename globbing:
+ .PP
+ .RS
+-vorbisgain -a -f -r "music/*.ogg"
++vorbisgain \-a \-f \-r "music/*.ogg"
+ .RE
+ .PP
+ Calculate the album gain. The files specified before the directory "album"
+@@ -118,13 +118,13 @@
+ album and the remaining files as a third album:
+ .PP
+ .RS
+-vorbisgain -a -r a.ogg b.ogg c.ogg album d.ogg e.ogg f.ogg
++vorbisgain \-a \-r a.ogg b.ogg c.ogg album d.ogg e.ogg f.ogg
+ .RE
+ .PP
+ Remove all replaygain tags from a collection of oggs:
+ .PP
+ .RS
+-vorbisgain -c -r "music/*.ogg"
++vorbisgain \-c \-r "music/*.ogg"
+ .RE
+ .SH TAG FORMAT
+ .B vorbisgain
+@@ -205,7 +205,7 @@
+ The version of vorbisgain packaged for Debian differs in two ways from
+ the upstream version. First, it does not retain the modification time
+ of the input file by default: if tags are changed in a file, the mtime will
+-change; you can specify "-p" to get the normal behaviour.
++change; you can specify "\-p" to get the normal behaviour.
+ Second, it does not try to process wildcards in filenames. This makes
+ it impossible to say "process all foo*.ogg in all subdirectories", but
+ also avoids problems with filenames that actually contain wildcards.
diff --git a/subprojects/shared-modules/vorbisgain/0007-recursively_spelling.patch b/subprojects/shared-modules/vorbisgain/0007-recursively_spelling.patch
new file mode 100644
index 00000000..4a6fbf9c
--- /dev/null
+++ b/subprojects/shared-modules/vorbisgain/0007-recursively_spelling.patch
@@ -0,0 +1,14 @@
+Description: "recursivly" should be spelled "recursively". Thanks Adam.
+From: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=661999
+Forwarded: no
+--- a/vorbisgain.c
++++ b/vorbisgain.c
+@@ -500,7 +500,7 @@
+ fprintf(stderr, _(" -q, --quiet Don't print any output (except errors)\n"));
+ fprintf(stderr, _(" -p, --preserve-mtime Don't change the timestamps\n"));
+ #ifdef ENABLE_RECURSIVE
+- fprintf(stderr, _(" -r, --recursive Search for files recursivly, each folder as an album\n"));
++ fprintf(stderr, _(" -r, --recursive Search for files recursively, each folder as an album\n"));
+ #endif
+ fprintf(stderr, _(" -s, --skip Skip non-Vorbis or faulty files\n"));
+ fprintf(stderr, _(" -v, --version Display version number and exit\n\n"));
diff --git a/subprojects/shared-modules/vorbisgain/0008-manpage_recursion_mistake.patch b/subprojects/shared-modules/vorbisgain/0008-manpage_recursion_mistake.patch
new file mode 100644
index 00000000..81792532
--- /dev/null
+++ b/subprojects/shared-modules/vorbisgain/0008-manpage_recursion_mistake.patch
@@ -0,0 +1,23 @@
+Description: The manpage shows methods that don't work. They have been replaced.
+From: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=447402
+Forwarded: no
+--- a/vorbisgain.1
++++ b/vorbisgain.1
+@@ -110,7 +110,7 @@
+ shell to not do any filename globbing:
+ .PP
+ .RS
+-vorbisgain \-a \-f \-r "music/*.ogg"
++vorbisgain \-a \-f \-r music/
+ .RE
+ .PP
+ Calculate the album gain. The files specified before the directory "album"
+@@ -124,7 +124,7 @@
+ Remove all replaygain tags from a collection of oggs:
+ .PP
+ .RS
+-vorbisgain \-c \-r "music/*.ogg"
++vorbisgain \-c \-r music/
+ .RE
+ .SH TAG FORMAT
+ .B vorbisgain
diff --git a/subprojects/shared-modules/vorbisgain/0009-hardening.patch b/subprojects/shared-modules/vorbisgain/0009-hardening.patch
new file mode 100644
index 00000000..67f50a03
--- /dev/null
+++ b/subprojects/shared-modules/vorbisgain/0009-hardening.patch
@@ -0,0 +1,13 @@
+Description: Allow build with dh compat level 9 (debian build flags)
+Forwarded: no
+--- a/misc.c
++++ b/misc.c
+@@ -56,7 +56,7 @@
+ vfprintf(stderr, message, args);
+ va_end(args);
+
+- fprintf(stderr, strerror(err_num));
++ fputs(strerror(err_num), stderr);
+ fprintf(stderr, "\n");
+ }
+
diff --git a/subprojects/shared-modules/vorbisgain/0010-fclose.patch b/subprojects/shared-modules/vorbisgain/0010-fclose.patch
new file mode 100644
index 00000000..12378987
--- /dev/null
+++ b/subprojects/shared-modules/vorbisgain/0010-fclose.patch
@@ -0,0 +1,13 @@
+Solve "too many open files" by closing those which are not compatible with vorbisgain. Thanks to Marcel Rehberg for the patch.
+--- a/vorbis.c
++++ b/vorbis.c
+@@ -357,7 +357,8 @@
+ {
+ vorbis_error(result, _("Couldn't process '%s': "), filename);
+ }
+-
++ // make sure file is closed, since ov_open failed we are still responsible
++ fclose(file);
+ return -1;
+ }
+
diff --git a/subprojects/shared-modules/vorbisgain/README.md b/subprojects/shared-modules/vorbisgain/README.md
new file mode 100644
index 00000000..42d83947
--- /dev/null
+++ b/subprojects/shared-modules/vorbisgain/README.md
@@ -0,0 +1,23 @@
+Vorbisgain comes in two version;
+- The main source: https://sjeng.org/ftp/vorbis/
+- The Debian version: http://deb.debian.org/debian/pool/main/v/vorbisgain/
+
+The catch is... Debian has 10 patches:
+- 0001-temp_files.patch
+- 0002-errno.patch
+- 0003-manpage.patch
+- 0004-vorbisgain_mtime.patch
+- 0005-double_fclose.patch
+- 0006-manpage_hyphens.patch
+- 0007-recursively_spelling.patch
+- 0008-manpage_recursion_mistake.patch
+- 0009-hardening.patch
+- 0010-fclose.patch
+
+Of particular concern are 0005, 0009 and 0010 which might have implications for memory-leaks and string inputs.
+
+## Other points of concern
+
+https://pkgs.org/download/vorbisgain
+
+Lots of distributions don't include these patches as well, but I prefer to stick with the tried and tested package from Debian.
diff --git a/subprojects/shared-modules/vorbisgain/vorbisgain_0.37-2.json b/subprojects/shared-modules/vorbisgain/vorbisgain_0.37-2.json
new file mode 100644
index 00000000..0a9a40da
--- /dev/null
+++ b/subprojects/shared-modules/vorbisgain/vorbisgain_0.37-2.json
@@ -0,0 +1,29 @@
+{
+ "name": "vorbisgain",
+ "buildsystem": "autotools",
+ "cleanup": [
+ "/man"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "http://deb.debian.org/debian/pool/main/v/vorbisgain/vorbisgain_0.37.orig.tar.gz",
+ "sha256": "dd6db051cad972bcac25d47b4a9e40e217bb548a1f16328eddbb4e66613530ec"
+ },
+ {
+ "type": "patch",
+ "paths": [
+ "0001-temp_files.patch",
+ "0002-errno.patch",
+ "0003-manpage.patch",
+ "0004-vorbisgain_mtime.patch",
+ "0005-double_fclose.patch",
+ "0006-manpage_hyphens.patch",
+ "0007-recursively_spelling.patch",
+ "0008-manpage_recursion_mistake.patch",
+ "0009-hardening.patch",
+ "0010-fclose.patch"
+ ]
+ }
+ ]
+}