[PATCH 1/6] Import upstream version 3.6.1

Julian Wollrath jwollrath at web.de
Sun May 3 11:49:16 UTC 2015


---
 .gitignore                                         |    1 -
 AUTHORS                                            |    3 +-
 COPYING                                            |    2 +-
 Makefile                                           |   14 +-
 acinclude.m4                                       |  124 +-
 audacious.desktop                                  |   87 +-
 audacious.pc.in                                    |    2 +-
 config.h.in                                        |    9 +
 configure                                          | 2282 ++++++++++++++-----
 configure.ac                                       |   27 +-
 contrib/audacious.appdata.xml                      |   32 +
 contrib/macpack/.DS_Store                          |  Bin 6148 -> 0 bytes
 contrib/macpack/Audacious.app/Contents/Info.plist  |    9 +-
 .../Contents/Resources/Audacious.icns              |  Bin 34557 -> 63527 bytes
 contrib/win32/audacious.ico                        |  Bin 15086 -> 0 bytes
 contrib/win32/gtkrc                                |    1 +
 contrib/win32/notes.html                           |   99 +-
 contrib/win32/patches/gdbus-codegen.in.diff        |   13 -
 contrib/win32/patches/gdkwindow.c.diff             |   32 +
 contrib/win32/patches/glocalfileinfo.c.diff        |   48 +
 contrib/win32/patches/grand.c.diff                 |   59 +
 contrib/win32/patches/gtk-input-makefile.in.diff   |   11 +
 contrib/win32/patches/gtksettings.c.diff           |   14 -
 contrib/win32/patches/libmms-makefile.am.diff      |   11 -
 contrib/win32/patches/libmms-seek-fix.diff         |   54 -
 contrib/win32/patches/libmms-strndup.diff          |   44 +
 contrib/win32/settings.ini                         |    4 -
 debian/changelog                                   |    7 +
 extra.mk.in                                        |    4 +
 images/Makefile                                    |   11 +
 images/about-logo.png                              |  Bin 0 -> 20019 bytes
 images/about-logo.svg                              |  224 ++
 images/album.png                                   |  Bin 0 -> 5418 bytes
 images/appearance.png                              |  Bin 0 -> 2721 bytes
 images/audacious.ico                               |  Bin 0 -> 15086 bytes
 images/audacious.png                               |  Bin 0 -> 1788 bytes
 images/audacious.svg                               |  101 +
 images/audio.png                                   |  Bin 0 -> 3224 bytes
 images/connectivity.png                            |  Bin 0 -> 4452 bytes
 images/info.png                                    |  Bin 0 -> 3194 bytes
 images/playlist.png                                |  Bin 0 -> 1995 bytes
 images/plugins.png                                 |  Bin 0 -> 4241 bytes
 m4/buildsys.m4                                     |   10 +-
 man/audacious.1.in                                 |   75 +-
 pixmaps/Makefile                                   |   11 -
 pixmaps/audacious.ico                              |  Bin 15086 -> 0 bytes
 pixmaps/audacious.png                              |  Bin 1788 -> 0 bytes
 pixmaps/audacious.svg                              |  101 -
 po/POTFILES.in                                     |   65 +-
 po/ast.po                                          | 1550 +++++++------
 po/audacious.pot                                   | 1168 ++++++----
 po/be.po                                           | 1545 +++++++------
 po/bg.po                                           | 1603 +++++++------
 po/ca.po                                           | 1546 +++++++------
 po/cmn.po                                          | 1536 +++++++------
 po/cs.po                                           | 1586 +++++++------
 po/da.po                                           | 1574 +++++++------
 po/de.po                                           | 1572 +++++++------
 po/el.po                                           | 1561 +++++++------
 po/en_GB.po                                        | 1530 +++++++------
 po/eo.po                                           | 1570 +++++++------
 po/es.po                                           | 1643 ++++++++------
 po/es_AR.po                                        | 1538 +++++++------
 po/es_MX.po                                        | 1577 +++++++------
 po/et.po                                           | 1536 +++++++------
 po/eu.po                                           | 1540 +++++++------
 po/fa_IR.po                                        | 1567 +++++++------
 po/fi.po                                           | 1578 +++++++------
 po/fr.po                                           | 1622 +++++++------
 po/gl.po                                           | 1586 +++++++------
 po/he.po                                           | 1536 +++++++------
 po/hu.po                                           | 1585 +++++++------
 po/id_ID.po                                        | 1615 +++++++------
 po/it.po                                           | 1573 +++++++------
 po/ja.po                                           | 1583 +++++++------
 po/ko.po                                           | 1553 +++++++------
 po/ky.po                                           | 1525 +++++++------
 po/lt.po                                           | 1558 +++++++------
 po/lv.po                                           | 1572 +++++++------
 po/ml_IN.po                                        | 1534 +++++++------
 po/ms.po                                           | 1665 ++++++++------
 po/nl.po                                           | 1633 +++++++------
 po/pl.po                                           | 1588 +++++++------
 po/pt_BR.po                                        | 1646 ++++++++------
 po/pt_PT.po                                        | 1577 +++++++------
 po/ro.po                                           | 1609 +++++++------
 po/ru.po                                           | 1654 ++++++++------
 po/si.po                                           | 1538 +++++++------
 po/sk.po                                           | 1580 +++++++------
 po/sq.po                                           | 1537 +++++++------
 po/sr.po                                           | 1582 +++++++------
 po/sr at latin.po                                     | 1537 +++++++------
 po/sr_RS.po                                        | 1561 +++++++------
 po/sv.po                                           | 1608 +++++++------
 po/ta.po                                           | 1538 +++++++------
 po/tr.po                                           | 1574 +++++++------
 po/uk.po                                           | 1567 +++++++------
 po/vi.po                                           | 1550 +++++++------
 po/zh_CN.po                                        | 1576 +++++++------
 po/zh_TW.po                                        | 1571 +++++++------
 src/Makefile                                       |   22 +-
 src/audacious/Makefile                             |   98 +-
 src/audacious/adder.c                              |  573 -----
 src/audacious/api-alias-begin.h                    |   46 -
 src/audacious/api-alias-end.h                      |   44 -
 src/audacious/api-declare-begin.h                  |   46 -
 src/audacious/api-declare-end.h                    |   46 -
 src/audacious/api-define-begin.h                   |   46 -
 src/audacious/api-define-end.h                     |   46 -
 src/audacious/api-local-begin.h                    |   44 -
 src/audacious/api-local-end.h                      |   44 -
 src/audacious/api.h                                |   55 -
 src/audacious/art.c                                |  284 ---
 src/audacious/audacious.rc                         |    2 +-
 src/audacious/chardet.c                            |   52 -
 src/audacious/config.c                             |  453 ----
 src/audacious/dbus-server.c                        |  779 -------
 src/audacious/dbus-server.cc                       |  815 +++++++
 src/audacious/debug.h                              |   33 -
 src/audacious/drct-api.h                           |   78 -
 src/audacious/drct.c                               |  195 --
 src/audacious/drct.h                               |   69 -
 src/audacious/effect.c                             |  260 ---
 src/audacious/effect.h                             |   36 -
 src/audacious/equalizer.c                          |  214 --
 src/audacious/equalizer.h                          |   28 -
 src/audacious/equalizer_preset.c                   |  242 --
 src/audacious/fft.c                                |  118 -
 src/audacious/fft.h                                |   25 -
 src/audacious/general.c                            |  160 --
 src/audacious/general.h                            |   33 -
 src/audacious/history.c                            |  116 -
 src/audacious/i18n.h                               |   32 -
 src/audacious/images/about-logo.png                |  Bin 20019 -> 0 bytes
 src/audacious/images/album.png                     |  Bin 5418 -> 0 bytes
 src/audacious/images/appearance.png                |  Bin 2721 -> 0 bytes
 src/audacious/images/audio.png                     |  Bin 3224 -> 0 bytes
 src/audacious/images/connectivity.png              |  Bin 4452 -> 0 bytes
 src/audacious/images/info.png                      |  Bin 3194 -> 0 bytes
 src/audacious/images/playlist.png                  |  Bin 1995 -> 0 bytes
 src/audacious/images/plugins.png                   |  Bin 4241 -> 0 bytes
 src/audacious/input-api.h                          |   60 -
 src/audacious/input.h                              |   69 -
 src/audacious/interface.c                          |  216 --
 src/audacious/interface.h                          |   36 -
 src/audacious/main.c                               |  634 ------
 src/audacious/main.cc                              |  384 ++++
 src/audacious/main.h                               |   38 +-
 src/audacious/misc-api.h                           |  128 --
 src/audacious/misc.h                               |  109 -
 src/audacious/output.c                             |  642 ------
 src/audacious/output.h                             |   47 -
 src/audacious/playback.c                           |  652 ------
 src/audacious/playback.h                           |   30 -
 src/audacious/playlist-api.h                       |  362 ---
 src/audacious/playlist-files.c                     |  194 --
 src/audacious/playlist-new.c                       | 2401 --------------------
 src/audacious/playlist-utils.c                     |  507 -----
 src/audacious/playlist.h                           |  147 --
 src/audacious/plugin-init.c                        |  333 ---
 src/audacious/plugin-preferences.c                 |  132 --
 src/audacious/plugin-registry.c                    |  871 -------
 src/audacious/plugin-view.c                        |  258 ---
 src/audacious/plugin.h                             |  373 ---
 src/audacious/pluginenum.c                         |  210 --
 src/audacious/plugins-api.h                        |   60 -
 src/audacious/plugins.h                            |  107 -
 src/audacious/preferences.c                        |  641 ------
 src/audacious/preferences.h                        |  142 --
 src/audacious/probe-buffer.c                       |  161 --
 src/audacious/probe-buffer.h                       |   27 -
 src/audacious/probe.c                              |  287 ---
 src/audacious/scanner.c                            |  175 --
 src/audacious/scanner.h                            |   48 -
 src/audacious/signals.c                            |   58 -
 src/audacious/signals.cc                           |   59 +
 src/audacious/types.h                              |   67 -
 src/audacious/ui_albumart.c                        |  188 --
 src/audacious/ui_plugin_menu.c                     |  105 -
 src/audacious/ui_preferences.c                     |  814 -------
 src/audacious/ui_preferences.h                     |   38 -
 src/audacious/util.c                               |  474 ----
 src/audacious/util.cc                              |   48 +
 src/audacious/util.h                               |   25 +-
 src/audacious/vis_runner.c                         |  289 ---
 src/audacious/vis_runner.h                         |   30 -
 src/audacious/visualization.c                      |  261 ---
 src/audacious/visualization.h                      |   36 -
 src/libaudcore/Makefile                            |   99 +-
 src/libaudcore/adder.cc                            |  475 ++++
 src/libaudcore/art-search.cc                       |  155 ++
 src/libaudcore/art.cc                              |  271 +++
 src/libaudcore/audio.c                             |  242 --
 src/libaudcore/audio.cc                            |  300 +++
 src/libaudcore/audio.h.in                          |   81 +-
 src/libaudcore/audstrings.c                        |  784 -------
 src/libaudcore/audstrings.cc                       |  974 ++++++++
 src/libaudcore/audstrings.h                        |  127 +-
 src/libaudcore/charset.c                           |  180 --
 src/libaudcore/charset.cc                          |  226 ++
 src/libaudcore/config.cc                           |  397 ++++
 src/libaudcore/core.h                              |   83 -
 src/libaudcore/drct.cc                             |  195 ++
 src/libaudcore/drct.h                              |   89 +
 src/libaudcore/effect.cc                           |  268 +++
 src/libaudcore/equalizer-preset.cc                 |  202 ++
 src/libaudcore/equalizer.cc                        |  212 ++
 src/libaudcore/equalizer.h                         |   51 +
 src/libaudcore/eventqueue.c                        |  122 -
 src/libaudcore/eventqueue.cc                       |  110 +
 src/libaudcore/fft.cc                              |  120 +
 src/libaudcore/history.cc                          |   49 +
 src/libaudcore/hook.c                              |  141 --
 src/libaudcore/hook.cc                             |  141 ++
 src/libaudcore/hook.h                              |   86 +-
 src/libaudcore/i18n.h                              |   32 +
 src/libaudcore/index.c                             |  213 --
 src/libaudcore/index.cc                            |  196 ++
 src/libaudcore/index.h                             |  274 ++-
 src/libaudcore/inifile.c                           |  134 --
 src/libaudcore/inifile.cc                          |  123 +
 src/libaudcore/inifile.h                           |   23 +-
 src/libaudcore/interface.cc                        |  256 +++
 src/libaudcore/interface.h                         |   53 +
 src/libaudcore/internal.h                          |  130 ++
 src/libaudcore/list.cc                             |   77 +
 src/libaudcore/list.h                              |   82 +
 src/libaudcore/logger.cc                           |  125 +
 src/libaudcore/mainloop.cc                         |  218 ++
 src/libaudcore/mainloop.h                          |   50 +
 src/libaudcore/multihash.c                         |  153 --
 src/libaudcore/multihash.cc                        |  173 ++
 src/libaudcore/multihash.h                         |  265 ++-
 src/libaudcore/objects.h                           |  272 +++
 src/libaudcore/output.cc                           |  582 +++++
 src/libaudcore/output.h                            |   44 +
 src/libaudcore/playback.cc                         |  749 ++++++
 src/libaudcore/playlist-files.cc                   |  139 ++
 src/libaudcore/playlist-internal.h                 |   53 +
 src/libaudcore/playlist-utils.cc                   |  442 ++++
 src/libaudcore/playlist.cc                         | 2261 ++++++++++++++++++
 src/libaudcore/playlist.h                          |  381 ++++
 src/libaudcore/plugin-init.cc                      |  351 +++
 src/libaudcore/plugin-load.cc                      |  163 ++
 src/libaudcore/plugin-registry.cc                  |  705 ++++++
 src/libaudcore/plugin.h                            |  473 ++++
 src/libaudcore/plugins-internal.h                  |   54 +
 src/libaudcore/plugins.h                           |   68 +
 src/libaudcore/preferences.cc                      |  123 +
 src/libaudcore/preferences.h                       |  301 +++
 src/libaudcore/probe-buffer.cc                     |  146 ++
 src/libaudcore/probe.cc                            |  215 ++
 src/libaudcore/probe.h                             |   51 +
 src/libaudcore/ringbuf.cc                          |  184 ++
 src/libaudcore/ringbuf.h                           |  180 ++
 src/libaudcore/runtime.cc                          |  358 +++
 src/libaudcore/runtime.h                           |  113 +
 src/libaudcore/scanner.cc                          |   66 +
 src/libaudcore/scanner.h                           |   58 +
 src/libaudcore/stringbuf.cc                        |  223 ++
 src/libaudcore/strpool.c                           |  256 ---
 src/libaudcore/strpool.cc                          |  266 +++
 src/libaudcore/templates.h                         |  279 +++
 src/libaudcore/tests/Makefile                      |   40 +
 src/libaudcore/tests/test-mainloop.cc              |  118 +
 src/libaudcore/tests/test.cc                       |  276 +++
 src/libaudcore/tinylock.c                          |   65 -
 src/libaudcore/tinylock.cc                         |   65 +
 src/libaudcore/tuple-compiler.cc                   |  549 +++++
 src/libaudcore/tuple-compiler.h                    |   61 +
 src/libaudcore/tuple.c                             |  496 ----
 src/libaudcore/tuple.cc                            |  780 +++++++
 src/libaudcore/tuple.h                             |  325 +--
 src/libaudcore/tuple_compiler.c                    |  708 ------
 src/libaudcore/tuple_compiler.h                    |   39 -
 src/libaudcore/tuple_formatter.c                   |   96 -
 src/libaudcore/util.cc                             |  135 ++
 src/libaudcore/vfs.c                               |  483 ----
 src/libaudcore/vfs.cc                              |  340 +++
 src/libaudcore/vfs.h                               |  172 +-
 src/libaudcore/vfs_async.c                         |   73 -
 src/libaudcore/vfs_async.cc                        |   91 +
 src/libaudcore/vfs_async.h                         |    6 +-
 src/libaudcore/vfs_common.c                        |  198 --
 src/libaudcore/vfs_local.c                         |  241 --
 src/libaudcore/vfs_local.cc                        |  263 +++
 src/libaudcore/vfs_local.h                         |    2 +-
 src/libaudcore/vis-runner.cc                       |  228 ++
 src/libaudcore/visualization.cc                    |  179 ++
 src/libaudcore/visualizer.h                        |   49 +
 src/libaudgui/Makefile                             |   54 +-
 src/libaudgui/about.c                              |  123 -
 src/libaudgui/about.cc                             |  125 +
 src/libaudgui/confirm.c                            |  101 -
 src/libaudgui/confirm.cc                           |   97 +
 src/libaudgui/equalizer.c                          |  170 --
 src/libaudgui/equalizer.cc                         |  169 ++
 src/libaudgui/file-opener.cc                       |  155 ++
 src/libaudgui/infopopup.c                          |  313 ---
 src/libaudgui/infopopup.cc                         |  352 +++
 src/libaudgui/infowin.c                            |  485 ----
 src/libaudgui/infowin.cc                           |  519 +++++
 src/libaudgui/init.c                               |  163 --
 src/libaudgui/init.cc                              |  172 ++
 src/libaudgui/init.h                               |   53 -
 src/libaudgui/internal.h                           |   65 +
 src/libaudgui/jump-to-time.c                       |   64 -
 src/libaudgui/jump-to-time.cc                      |   62 +
 src/libaudgui/jump-to-track-cache.cc               |  214 ++
 src/libaudgui/jump-to-track-cache.h                |   46 +
 src/libaudgui/jump-to-track.cc                     |  343 +++
 src/libaudgui/libaudgui-gtk.h                      |   27 +-
 src/libaudgui/libaudgui.h                          |   72 +-
 src/libaudgui/list.c                               |  891 --------
 src/libaudgui/list.cc                              |  894 ++++++++
 src/libaudgui/list.h                               |   20 +-
 src/libaudgui/menu.c                               |  134 --
 src/libaudgui/menu.cc                              |  129 ++
 src/libaudgui/menu.h                               |   39 +-
 src/libaudgui/pixbufs.c                            |  141 --
 src/libaudgui/pixbufs.cc                           |  138 ++
 src/libaudgui/playlists.c                          |  184 --
 src/libaudgui/playlists.cc                         |  183 ++
 src/libaudgui/plugin-menu.cc                       |  118 +
 src/libaudgui/plugin-prefs.cc                      |  191 ++
 src/libaudgui/plugin-view.cc                       |  250 ++
 src/libaudgui/prefs-widget.cc                      |  570 +++++
 src/libaudgui/prefs-window.cc                      |  814 +++++++
 src/libaudgui/queue-manager.c                      |  208 --
 src/libaudgui/queue-manager.cc                     |  213 ++
 src/libaudgui/scaled-image.c                       |  114 -
 src/libaudgui/scaled-image.cc                      |  116 +
 src/libaudgui/status.cc                            |  107 +
 src/libaudgui/ui_fileopener.c                      |  155 --
 src/libaudgui/ui_jumptotrack.c                     |  342 ---
 src/libaudgui/ui_jumptotrack_cache.c               |  358 ---
 src/libaudgui/ui_jumptotrack_cache.h               |   37 -
 src/libaudgui/ui_playlist_manager.c                |  282 ---
 src/libaudgui/urilist.c                            |  123 -
 src/libaudgui/urilist.cc                           |  114 +
 src/libaudgui/url-opener.c                         |   84 -
 src/libaudgui/url-opener.cc                        |   89 +
 src/libaudgui/util.c                               |  209 --
 src/libaudgui/util.cc                              |  175 ++
 src/libaudqt/Makefile                              |   45 +
 src/libaudqt/about.cc                              |  119 +
 src/libaudqt/art.cc                                |   69 +
 src/libaudqt/equalizer.cc                          |  167 ++
 src/libaudqt/fileopener.cc                         |   88 +
 src/libaudqt/iface.h                               |   47 +
 src/libaudqt/info-widget.cc                        |  205 ++
 src/libaudqt/info-widget.h                         |   63 +
 src/libaudqt/infowin.cc                            |  158 ++
 src/libaudqt/libaudqt.h                            |  104 +
 src/libaudqt/log-inspector.cc                      |  283 +++
 src/libaudqt/log-inspector.h                       |   46 +
 src/libaudqt/menu.cc                               |  125 +
 src/libaudqt/menu.h                                |   95 +
 src/libaudqt/playlist-management.cc                |   90 +
 src/libaudqt/plugin-menu.cc                        |   78 +
 src/libaudqt/prefs-builder.cc                      |  142 ++
 src/libaudqt/prefs-plugin.cc                       |  145 ++
 src/libaudqt/prefs-pluginlist-model.cc             |  138 ++
 src/libaudqt/prefs-pluginlist-model.h              |   62 +
 src/libaudqt/prefs-widget.cc                       |  356 +++
 src/libaudqt/prefs-widget.h                        |  195 ++
 src/libaudqt/prefs-window.cc                       |  753 ++++++
 src/libaudqt/queue-manager.cc                      |  198 ++
 src/libaudqt/util.cc                               |   90 +
 src/libaudqt/volumebutton.cc                       |  103 +
 src/libaudqt/volumebutton.h                        |   48 +
 src/libaudtag/Makefile                             |   20 +-
 src/libaudtag/ape/ape.c                            |  505 ----
 src/libaudtag/ape/ape.cc                           |  466 ++++
 src/libaudtag/ape/ape.h                            |   29 -
 src/libaudtag/audtag.c                             |  127 --
 src/libaudtag/audtag.cc                            |   68 +
 src/libaudtag/audtag.h                             |   25 +-
 src/libaudtag/builtin.h                            |   63 +
 src/libaudtag/id3/id3-common.c                     |  296 ---
 src/libaudtag/id3/id3-common.cc                    |  306 +++
 src/libaudtag/id3/id3-common.h                     |   16 +-
 src/libaudtag/id3/id3v1.c                          |  142 --
 src/libaudtag/id3/id3v1.cc                         |  127 ++
 src/libaudtag/id3/id3v1.h                          |   27 -
 src/libaudtag/id3/id3v22.c                         |  343 ---
 src/libaudtag/id3/id3v22.cc                        |  315 +++
 src/libaudtag/id3/id3v22.h                         |   29 -
 src/libaudtag/id3/id3v24.c                         |  807 -------
 src/libaudtag/id3/id3v24.cc                        |  779 +++++++
 src/libaudtag/id3/id3v24.h                         |   29 -
 src/libaudtag/tag_module.c                         |   67 -
 src/libaudtag/tag_module.cc                        |   98 +
 src/libaudtag/tag_module.h                         |   30 +-
 src/libaudtag/util.c                               |  275 ---
 src/libaudtag/util.cc                              |  269 +++
 src/libaudtag/util.h                               |   19 +-
 397 files changed, 80561 insertions(+), 66036 deletions(-)
 delete mode 100644 .gitignore
 create mode 100644 contrib/audacious.appdata.xml
 delete mode 100644 contrib/macpack/.DS_Store
 delete mode 100644 contrib/win32/audacious.ico
 create mode 100644 contrib/win32/gtkrc
 delete mode 100644 contrib/win32/patches/gdbus-codegen.in.diff
 create mode 100644 contrib/win32/patches/gdkwindow.c.diff
 create mode 100644 contrib/win32/patches/glocalfileinfo.c.diff
 create mode 100644 contrib/win32/patches/grand.c.diff
 create mode 100644 contrib/win32/patches/gtk-input-makefile.in.diff
 delete mode 100644 contrib/win32/patches/gtksettings.c.diff
 delete mode 100644 contrib/win32/patches/libmms-makefile.am.diff
 delete mode 100644 contrib/win32/patches/libmms-seek-fix.diff
 create mode 100644 contrib/win32/patches/libmms-strndup.diff
 delete mode 100644 contrib/win32/settings.ini
 create mode 100644 images/Makefile
 create mode 100644 images/about-logo.png
 create mode 100644 images/about-logo.svg
 create mode 100644 images/album.png
 create mode 100644 images/appearance.png
 create mode 100644 images/audacious.ico
 create mode 100644 images/audacious.png
 create mode 100644 images/audacious.svg
 create mode 100644 images/audio.png
 create mode 100644 images/connectivity.png
 create mode 100644 images/info.png
 create mode 100644 images/playlist.png
 create mode 100644 images/plugins.png
 delete mode 100644 pixmaps/Makefile
 delete mode 100644 pixmaps/audacious.ico
 delete mode 100644 pixmaps/audacious.png
 delete mode 100644 pixmaps/audacious.svg
 delete mode 100644 src/audacious/adder.c
 delete mode 100644 src/audacious/api-alias-begin.h
 delete mode 100644 src/audacious/api-alias-end.h
 delete mode 100644 src/audacious/api-declare-begin.h
 delete mode 100644 src/audacious/api-declare-end.h
 delete mode 100644 src/audacious/api-define-begin.h
 delete mode 100644 src/audacious/api-define-end.h
 delete mode 100644 src/audacious/api-local-begin.h
 delete mode 100644 src/audacious/api-local-end.h
 delete mode 100644 src/audacious/api.h
 delete mode 100644 src/audacious/art.c
 delete mode 100644 src/audacious/chardet.c
 delete mode 100644 src/audacious/config.c
 delete mode 100644 src/audacious/dbus-server.c
 create mode 100644 src/audacious/dbus-server.cc
 delete mode 100644 src/audacious/debug.h
 delete mode 100644 src/audacious/drct-api.h
 delete mode 100644 src/audacious/drct.c
 delete mode 100644 src/audacious/drct.h
 delete mode 100644 src/audacious/effect.c
 delete mode 100644 src/audacious/effect.h
 delete mode 100644 src/audacious/equalizer.c
 delete mode 100644 src/audacious/equalizer.h
 delete mode 100644 src/audacious/equalizer_preset.c
 delete mode 100644 src/audacious/fft.c
 delete mode 100644 src/audacious/fft.h
 delete mode 100644 src/audacious/general.c
 delete mode 100644 src/audacious/general.h
 delete mode 100644 src/audacious/history.c
 delete mode 100644 src/audacious/i18n.h
 delete mode 100644 src/audacious/images/about-logo.png
 delete mode 100644 src/audacious/images/album.png
 delete mode 100644 src/audacious/images/appearance.png
 delete mode 100644 src/audacious/images/audio.png
 delete mode 100644 src/audacious/images/connectivity.png
 delete mode 100644 src/audacious/images/info.png
 delete mode 100644 src/audacious/images/playlist.png
 delete mode 100644 src/audacious/images/plugins.png
 delete mode 100644 src/audacious/input-api.h
 delete mode 100644 src/audacious/input.h
 delete mode 100644 src/audacious/interface.c
 delete mode 100644 src/audacious/interface.h
 delete mode 100644 src/audacious/main.c
 create mode 100644 src/audacious/main.cc
 delete mode 100644 src/audacious/misc-api.h
 delete mode 100644 src/audacious/misc.h
 delete mode 100644 src/audacious/output.c
 delete mode 100644 src/audacious/output.h
 delete mode 100644 src/audacious/playback.c
 delete mode 100644 src/audacious/playback.h
 delete mode 100644 src/audacious/playlist-api.h
 delete mode 100644 src/audacious/playlist-files.c
 delete mode 100644 src/audacious/playlist-new.c
 delete mode 100644 src/audacious/playlist-utils.c
 delete mode 100644 src/audacious/playlist.h
 delete mode 100644 src/audacious/plugin-init.c
 delete mode 100644 src/audacious/plugin-preferences.c
 delete mode 100644 src/audacious/plugin-registry.c
 delete mode 100644 src/audacious/plugin-view.c
 delete mode 100644 src/audacious/plugin.h
 delete mode 100644 src/audacious/pluginenum.c
 delete mode 100644 src/audacious/plugins-api.h
 delete mode 100644 src/audacious/plugins.h
 delete mode 100644 src/audacious/preferences.c
 delete mode 100644 src/audacious/preferences.h
 delete mode 100644 src/audacious/probe-buffer.c
 delete mode 100644 src/audacious/probe-buffer.h
 delete mode 100644 src/audacious/probe.c
 delete mode 100644 src/audacious/scanner.c
 delete mode 100644 src/audacious/scanner.h
 delete mode 100644 src/audacious/signals.c
 create mode 100644 src/audacious/signals.cc
 delete mode 100644 src/audacious/types.h
 delete mode 100644 src/audacious/ui_albumart.c
 delete mode 100644 src/audacious/ui_plugin_menu.c
 delete mode 100644 src/audacious/ui_preferences.c
 delete mode 100644 src/audacious/ui_preferences.h
 delete mode 100644 src/audacious/util.c
 create mode 100644 src/audacious/util.cc
 delete mode 100644 src/audacious/vis_runner.c
 delete mode 100644 src/audacious/vis_runner.h
 delete mode 100644 src/audacious/visualization.c
 delete mode 100644 src/audacious/visualization.h
 create mode 100644 src/libaudcore/adder.cc
 create mode 100644 src/libaudcore/art-search.cc
 create mode 100644 src/libaudcore/art.cc
 delete mode 100644 src/libaudcore/audio.c
 create mode 100644 src/libaudcore/audio.cc
 delete mode 100644 src/libaudcore/audstrings.c
 create mode 100644 src/libaudcore/audstrings.cc
 delete mode 100644 src/libaudcore/charset.c
 create mode 100644 src/libaudcore/charset.cc
 create mode 100644 src/libaudcore/config.cc
 delete mode 100644 src/libaudcore/core.h
 create mode 100644 src/libaudcore/drct.cc
 create mode 100644 src/libaudcore/drct.h
 create mode 100644 src/libaudcore/effect.cc
 create mode 100644 src/libaudcore/equalizer-preset.cc
 create mode 100644 src/libaudcore/equalizer.cc
 create mode 100644 src/libaudcore/equalizer.h
 delete mode 100644 src/libaudcore/eventqueue.c
 create mode 100644 src/libaudcore/eventqueue.cc
 create mode 100644 src/libaudcore/fft.cc
 create mode 100644 src/libaudcore/history.cc
 delete mode 100644 src/libaudcore/hook.c
 create mode 100644 src/libaudcore/hook.cc
 create mode 100644 src/libaudcore/i18n.h
 delete mode 100644 src/libaudcore/index.c
 create mode 100644 src/libaudcore/index.cc
 delete mode 100644 src/libaudcore/inifile.c
 create mode 100644 src/libaudcore/inifile.cc
 create mode 100644 src/libaudcore/interface.cc
 create mode 100644 src/libaudcore/interface.h
 create mode 100644 src/libaudcore/internal.h
 create mode 100644 src/libaudcore/list.cc
 create mode 100644 src/libaudcore/list.h
 create mode 100644 src/libaudcore/logger.cc
 create mode 100644 src/libaudcore/mainloop.cc
 create mode 100644 src/libaudcore/mainloop.h
 delete mode 100644 src/libaudcore/multihash.c
 create mode 100644 src/libaudcore/multihash.cc
 create mode 100644 src/libaudcore/objects.h
 create mode 100644 src/libaudcore/output.cc
 create mode 100644 src/libaudcore/output.h
 create mode 100644 src/libaudcore/playback.cc
 create mode 100644 src/libaudcore/playlist-files.cc
 create mode 100644 src/libaudcore/playlist-internal.h
 create mode 100644 src/libaudcore/playlist-utils.cc
 create mode 100644 src/libaudcore/playlist.cc
 create mode 100644 src/libaudcore/playlist.h
 create mode 100644 src/libaudcore/plugin-init.cc
 create mode 100644 src/libaudcore/plugin-load.cc
 create mode 100644 src/libaudcore/plugin-registry.cc
 create mode 100644 src/libaudcore/plugin.h
 create mode 100644 src/libaudcore/plugins-internal.h
 create mode 100644 src/libaudcore/plugins.h
 create mode 100644 src/libaudcore/preferences.cc
 create mode 100644 src/libaudcore/preferences.h
 create mode 100644 src/libaudcore/probe-buffer.cc
 create mode 100644 src/libaudcore/probe.cc
 create mode 100644 src/libaudcore/probe.h
 create mode 100644 src/libaudcore/ringbuf.cc
 create mode 100644 src/libaudcore/ringbuf.h
 create mode 100644 src/libaudcore/runtime.cc
 create mode 100644 src/libaudcore/runtime.h
 create mode 100644 src/libaudcore/scanner.cc
 create mode 100644 src/libaudcore/scanner.h
 create mode 100644 src/libaudcore/stringbuf.cc
 delete mode 100644 src/libaudcore/strpool.c
 create mode 100644 src/libaudcore/strpool.cc
 create mode 100644 src/libaudcore/templates.h
 create mode 100644 src/libaudcore/tests/Makefile
 create mode 100644 src/libaudcore/tests/test-mainloop.cc
 create mode 100644 src/libaudcore/tests/test.cc
 delete mode 100644 src/libaudcore/tinylock.c
 create mode 100644 src/libaudcore/tinylock.cc
 create mode 100644 src/libaudcore/tuple-compiler.cc
 create mode 100644 src/libaudcore/tuple-compiler.h
 delete mode 100644 src/libaudcore/tuple.c
 create mode 100644 src/libaudcore/tuple.cc
 delete mode 100644 src/libaudcore/tuple_compiler.c
 delete mode 100644 src/libaudcore/tuple_compiler.h
 delete mode 100644 src/libaudcore/tuple_formatter.c
 create mode 100644 src/libaudcore/util.cc
 delete mode 100644 src/libaudcore/vfs.c
 create mode 100644 src/libaudcore/vfs.cc
 delete mode 100644 src/libaudcore/vfs_async.c
 create mode 100644 src/libaudcore/vfs_async.cc
 delete mode 100644 src/libaudcore/vfs_common.c
 delete mode 100644 src/libaudcore/vfs_local.c
 create mode 100644 src/libaudcore/vfs_local.cc
 create mode 100644 src/libaudcore/vis-runner.cc
 create mode 100644 src/libaudcore/visualization.cc
 create mode 100644 src/libaudcore/visualizer.h
 delete mode 100644 src/libaudgui/about.c
 create mode 100644 src/libaudgui/about.cc
 delete mode 100644 src/libaudgui/confirm.c
 create mode 100644 src/libaudgui/confirm.cc
 delete mode 100644 src/libaudgui/equalizer.c
 create mode 100644 src/libaudgui/equalizer.cc
 create mode 100644 src/libaudgui/file-opener.cc
 delete mode 100644 src/libaudgui/infopopup.c
 create mode 100644 src/libaudgui/infopopup.cc
 delete mode 100644 src/libaudgui/infowin.c
 create mode 100644 src/libaudgui/infowin.cc
 delete mode 100644 src/libaudgui/init.c
 create mode 100644 src/libaudgui/init.cc
 delete mode 100644 src/libaudgui/init.h
 create mode 100644 src/libaudgui/internal.h
 delete mode 100644 src/libaudgui/jump-to-time.c
 create mode 100644 src/libaudgui/jump-to-time.cc
 create mode 100644 src/libaudgui/jump-to-track-cache.cc
 create mode 100644 src/libaudgui/jump-to-track-cache.h
 create mode 100644 src/libaudgui/jump-to-track.cc
 delete mode 100644 src/libaudgui/list.c
 create mode 100644 src/libaudgui/list.cc
 delete mode 100644 src/libaudgui/menu.c
 create mode 100644 src/libaudgui/menu.cc
 delete mode 100644 src/libaudgui/pixbufs.c
 create mode 100644 src/libaudgui/pixbufs.cc
 delete mode 100644 src/libaudgui/playlists.c
 create mode 100644 src/libaudgui/playlists.cc
 create mode 100644 src/libaudgui/plugin-menu.cc
 create mode 100644 src/libaudgui/plugin-prefs.cc
 create mode 100644 src/libaudgui/plugin-view.cc
 create mode 100644 src/libaudgui/prefs-widget.cc
 create mode 100644 src/libaudgui/prefs-window.cc
 delete mode 100644 src/libaudgui/queue-manager.c
 create mode 100644 src/libaudgui/queue-manager.cc
 delete mode 100644 src/libaudgui/scaled-image.c
 create mode 100644 src/libaudgui/scaled-image.cc
 create mode 100644 src/libaudgui/status.cc
 delete mode 100644 src/libaudgui/ui_fileopener.c
 delete mode 100644 src/libaudgui/ui_jumptotrack.c
 delete mode 100644 src/libaudgui/ui_jumptotrack_cache.c
 delete mode 100644 src/libaudgui/ui_jumptotrack_cache.h
 delete mode 100644 src/libaudgui/ui_playlist_manager.c
 delete mode 100644 src/libaudgui/urilist.c
 create mode 100644 src/libaudgui/urilist.cc
 delete mode 100644 src/libaudgui/url-opener.c
 create mode 100644 src/libaudgui/url-opener.cc
 delete mode 100644 src/libaudgui/util.c
 create mode 100644 src/libaudgui/util.cc
 create mode 100644 src/libaudqt/Makefile
 create mode 100644 src/libaudqt/about.cc
 create mode 100644 src/libaudqt/art.cc
 create mode 100644 src/libaudqt/equalizer.cc
 create mode 100644 src/libaudqt/fileopener.cc
 create mode 100644 src/libaudqt/iface.h
 create mode 100644 src/libaudqt/info-widget.cc
 create mode 100644 src/libaudqt/info-widget.h
 create mode 100644 src/libaudqt/infowin.cc
 create mode 100644 src/libaudqt/libaudqt.h
 create mode 100644 src/libaudqt/log-inspector.cc
 create mode 100644 src/libaudqt/log-inspector.h
 create mode 100644 src/libaudqt/menu.cc
 create mode 100644 src/libaudqt/menu.h
 create mode 100644 src/libaudqt/playlist-management.cc
 create mode 100644 src/libaudqt/plugin-menu.cc
 create mode 100644 src/libaudqt/prefs-builder.cc
 create mode 100644 src/libaudqt/prefs-plugin.cc
 create mode 100644 src/libaudqt/prefs-pluginlist-model.cc
 create mode 100644 src/libaudqt/prefs-pluginlist-model.h
 create mode 100644 src/libaudqt/prefs-widget.cc
 create mode 100644 src/libaudqt/prefs-widget.h
 create mode 100644 src/libaudqt/prefs-window.cc
 create mode 100644 src/libaudqt/queue-manager.cc
 create mode 100644 src/libaudqt/util.cc
 create mode 100644 src/libaudqt/volumebutton.cc
 create mode 100644 src/libaudqt/volumebutton.h
 delete mode 100644 src/libaudtag/ape/ape.c
 create mode 100644 src/libaudtag/ape/ape.cc
 delete mode 100644 src/libaudtag/ape/ape.h
 delete mode 100644 src/libaudtag/audtag.c
 create mode 100644 src/libaudtag/audtag.cc
 create mode 100644 src/libaudtag/builtin.h
 delete mode 100644 src/libaudtag/id3/id3-common.c
 create mode 100644 src/libaudtag/id3/id3-common.cc
 delete mode 100644 src/libaudtag/id3/id3v1.c
 create mode 100644 src/libaudtag/id3/id3v1.cc
 delete mode 100644 src/libaudtag/id3/id3v1.h
 delete mode 100644 src/libaudtag/id3/id3v22.c
 create mode 100644 src/libaudtag/id3/id3v22.cc
 delete mode 100644 src/libaudtag/id3/id3v22.h
 delete mode 100644 src/libaudtag/id3/id3v24.c
 create mode 100644 src/libaudtag/id3/id3v24.cc
 delete mode 100644 src/libaudtag/id3/id3v24.h
 delete mode 100644 src/libaudtag/tag_module.c
 create mode 100644 src/libaudtag/tag_module.cc
 delete mode 100644 src/libaudtag/util.c
 create mode 100644 src/libaudtag/util.cc

diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 845ca0677527..000000000000
--- a/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-.pc
diff --git a/AUTHORS b/AUTHORS
index afe623e9469c..1ab1ae54a803 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -8,7 +8,8 @@ The Audacious project began in 2005 under the leadership of William Pitcock
 (“nenolod”).  Many people have made contributions, both large and small, since
 that time.  At present, the project is led by John Lindgren and Michał Lipski
 (“tallica”), with help from a few others.  Special thanks go to Michał Lipski
-for setting up and maintaining the current website.
+for setting up and maintaining the current website, and to Thomas Lange for
+leading the translation effort.
 
 The Audacious logo was designed by George Averill and updated by John Lindgren.
 It uses the “Circulate” font created by Brian Kent.
diff --git a/COPYING b/COPYING
index df69a2165362..4d18064ac4d0 100644
--- a/COPYING
+++ b/COPYING
@@ -1,6 +1,6 @@
 LICENSE
 
-Copyright © 2001-2014 Audacious developers and others
+Copyright © 2001-2015 Audacious developers and others
 
 (A list of the copyright holders is provided in the AUTHORS file.)
 
diff --git a/Makefile b/Makefile
index aa1c7876b73a..521c2c83859e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,18 @@
-SUBDIRS = src man pixmaps po
+SUBDIRS = src man images po
 
 DISTCLEAN = audacious.pc buildsys.mk config.h config.log config.status extra.mk
 
-DATA = AUTHORS COPYING
+DATA = AUTHORS \
+       COPYING \
+       images/about-logo.png \
+       images/about-logo.svg \
+       images/album.png \
+       images/appearance.png \
+       images/audio.png \
+       images/connectivity.png \
+       images/info.png \
+       images/playlist.png \
+       images/plugins.png
 
 include buildsys.mk
 
diff --git a/acinclude.m4 b/acinclude.m4
index 157258c8586b..cccd41186b06 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -1,5 +1,5 @@
 dnl Add $1 to CFLAGS and CXXFLAGS if supported
-dnl ------------------------------------------
+dnl ==========================================
 
 AC_DEFUN([AUD_CHECK_CFLAGS],[
     AC_MSG_CHECKING([whether the C/C++ compiler supports $1])
@@ -15,25 +15,30 @@ AC_DEFUN([AUD_CHECK_CFLAGS],[
     ])
 ])
 
+dnl Add $1 to CXXFLAGS if supported
+dnl ===============================
+
+AC_DEFUN([AUD_CHECK_CXXFLAGS],[
+    AC_MSG_CHECKING([whether the C++ compiler supports $1])
+    AC_LANG_PUSH([C++])
+    OLDCXXFLAGS="$CXXFLAGS"
+    CXXFLAGS="$CXXFLAGS $1 -Werror"
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[return 0;])],[
+        AC_MSG_RESULT(yes)
+        CXXFLAGS="$OLDCXXFLAGS $1"
+    ],[
+        AC_MSG_RESULT(no)
+        CXXFLAGS="$OLDCXXFLAGS"
+    ])
+    AC_LANG_POP([C++])
+])
+
 
 dnl **
 dnl ** Common checks
 dnl **
 AC_DEFUN([AUD_COMMON_PROGS], [
 
-dnl Check for C and C++ compilers
-dnl =============================
-AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([AC_PROG_CXX])
-AC_REQUIRE([AC_C_BIGENDIAN])
-AC_REQUIRE([AC_SYS_LARGEFILE])
-
-if test "x$GCC" = "xyes"; then
-    CFLAGS="$CFLAGS -std=gnu99 -ffast-math -Wall -pipe"
-    CXXFLAGS="$CXXFLAGS -Wall -pipe"
-    AUD_CHECK_CFLAGS(-Wtype-limits)
-fi
-
 dnl Check platform
 dnl ==============
 
@@ -44,6 +49,7 @@ AC_MSG_CHECKING([operating system type])
 
 HAVE_LINUX=no
 HAVE_MSWINDOWS=no
+HAVE_DARWIN=no
 
 case "$target" in
     *linux*)
@@ -54,6 +60,10 @@ case "$target" in
         AC_MSG_RESULT(Windows)
         HAVE_MSWINDOWS=yes
         ;;
+    *darwin*)
+        AC_MSG_RESULT(Darwin)
+        HAVE_DARWIN=yes
+        ;;
     *)
         AC_MSG_RESULT(other UNIX)
         ;;
@@ -61,6 +71,38 @@ esac
 
 AC_SUBST(HAVE_MSWINDOWS)
 AC_SUBST(HAVE_LINUX)
+AC_SUBST(HAVE_DARWIN)
+
+dnl Check for C and C++ compilers
+dnl =============================
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([AC_C_BIGENDIAN])
+AC_REQUIRE([AC_SYS_LARGEFILE])
+
+if test "x$GCC" = "xyes"; then
+    CFLAGS="$CFLAGS -std=gnu99 -ffast-math -Wall -pipe"
+    if test "x$HAVE_DARWIN" = "xyes"; then
+        CXXFLAGS="$CXXFLAGS -stdlib=libc++ -std=gnu++11 -ffast-math -Wall -pipe"
+        LDFLAGS="$LDFLAGS -lc++ -stdlib=libc++"
+    else
+        CXXFLAGS="$CXXFLAGS -std=gnu++11 -ffast-math -Wall -pipe"
+    fi
+    AUD_CHECK_CFLAGS(-Wtype-limits)
+    AUD_CHECK_CXXFLAGS(-Woverloaded-virtual)
+fi
+
+dnl On Mac, check for Objective-C and -C++ compilers
+dnl ================================================
+
+if test "x$HAVE_DARWIN" = "xyes"; then
+    AC_PROG_OBJC
+    AC_PROG_OBJCPP
+    AC_PROG_OBJCXX
+    AC_PROG_OBJCXXCPP
+
+    OBJCXXFLAGS="$OBJCXXFLAGS -stdlib=libc++ -std=c++11"
+fi
 
 dnl Enable "-Wl,-z,defs" only on Linux
 dnl ==================================
@@ -74,6 +116,26 @@ if test $HAVE_MSWINDOWS = yes ; then
 	CFLAGS="$CFLAGS -march=i686"
 fi
 
+dnl Byte order
+dnl ==========
+AC_C_BIGENDIAN([BIGENDIAN=1], [BIGENDIAN=0],
+ [AC_MSG_ERROR([Unknown machine byte order])],
+ [AC_MSG_ERROR([Universal builds are not supported, sorry])])
+AC_SUBST([BIGENDIAN])
+
+dnl Prevent symbol collisions
+dnl =========================
+if test "x$HAVE_MSWINDOWS" = "xyes" ; then
+    EXPORT="__declspec(dllexport)"
+elif test "x$GCC" = "xyes" ; then
+    CFLAGS="$CFLAGS -fvisibility=hidden"
+    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
+    EXPORT="__attribute__((visibility(\"default\")))"
+else
+    AC_MSG_ERROR([Unknown syntax for EXPORT keyword])
+fi
+AC_DEFINE_UNQUOTED([EXPORT], [$EXPORT], [Define to compiler syntax for public symbols])
+
 dnl Checks for various programs
 dnl ===========================
 AC_PROG_LN_S
@@ -93,7 +155,20 @@ dnl =======================
 
 PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.32)
 PKG_CHECK_MODULES(GMODULE, gmodule-2.0 >= 2.32)
-PKG_CHECK_MODULES(GTK, gtk+-3.0 >= 3.4)
+
+dnl GTK+ support
+dnl =============
+
+AC_ARG_ENABLE(gtk,
+ AS_HELP_STRING(--disable-gtk, [Disable GTK+ support (default=enabled)]),
+ USE_GTK=$enableval, USE_GTK=yes)
+
+if test $USE_GTK = yes ; then
+    PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.24)
+    AC_DEFINE(USE_GTK, 1, [Define if GTK+ support enabled])
+fi
+
+AC_SUBST(USE_GTK)
 
 if test $HAVE_MSWINDOWS = yes ; then
     PKG_CHECK_MODULES(GIO, gio-2.0 >= 2.32)
@@ -110,4 +185,23 @@ AC_SUBST(GMODULE_LIBS)
 AC_SUBST(GTK_CFLAGS)
 AC_SUBST(GTK_LIBS)
 
+dnl Qt support
+dnl ==========
+
+AC_ARG_ENABLE(qt,
+ AS_HELP_STRING(--enable-qt, [Enable Qt support (default=disabled)]),
+ USE_QT=$enableval, USE_QT=no)
+
+if test $USE_QT = yes ; then
+    PKG_CHECK_MODULES([QT], [Qt5Core Qt5Gui Qt5Widgets])
+    AC_DEFINE(USE_QT, 1, [Define if Qt support enabled])
+
+    # needed if Qt was built with -reduce-relocations
+    QT_CFLAGS="$QT_CFLAGS -fPIC"
+fi
+
+AC_SUBST(USE_QT)
+AC_SUBST(QT_CFLAGS)
+AC_SUBST(QT_LIBS)
+
 ])
diff --git a/audacious.desktop b/audacious.desktop
index 4504f9287b6a..6ede6cb336bd 100644
--- a/audacious.desktop
+++ b/audacious.desktop
@@ -3,35 +3,72 @@ Version=1.0
 Type=Application
 Name=Audacious
 GenericName=Music Player
-GenericName[be]=Музычны плэер
-GenericName[da]=Lydafspiller
-GenericName[de]=Musikspieler
-GenericName[es]=Reproductor de música
-GenericName[fr]=Lecteur de Musique
-GenericName[it]=Lettore di Musica
-GenericName[lt]=Muzikos grotuvas
-GenericName[nl]=Muziekspeler
-GenericName[nb]=Lydavspiller
-GenericName[pt]=Leitor de Música
-GenericName[ro]=Lector de Muzică
-GenericName[ru]=Аудиоплеер
-GenericName[se]=Ljudspelare
-GenericName[zh_TW]=音樂播放器
 Comment=Listen to music
-Comment[be]=Слухайце музыку
-Comment[de]=Musik hören
-Comment[fr]=Écouter de la musique
-Comment[hu]=Hallgasson zenét
-Comment[it]=Ascoltare musica
-Comment[lt]=Klausyti muzikos
-Comment[nb]=Lytt til musikk
-Comment[nl]=Muziek luisteren
-Comment[ru]=Слушайте музыку
-Comment[es]=Escucha música
-Comment[zh_TW]=音樂鑑賞
 Icon=audacious
 Categories=AudioVideo;Audio;Player;GTK;
 Exec=audacious %U
 TryExec=audacious
 Terminal=false
 MimeType=application/ogg;application/x-cue;application/x-ogg;application/xspf+xml;audio/midi;audio/mp3;audio/mp4;audio/mpeg;audio/mpegurl;audio/ogg;audio/prs.sid;audio/x-flac;audio/x-it;audio/x-mod;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-ms-asx;audio/x-ms-wma;audio/x-musepack;audio/x-s3m;audio/x-scpls;audio/x-stm;audio/x-vorbis+ogg;audio/x-wav;audio/x-xm;inode/directory;x-content/audio-cdda;
+
+Comment[be]=Слухайце музыку
+Comment[bg]=Слушай музика
+Comment[cs]=Poslouchej hudbu
+Comment[da]=Lyt til musik
+Comment[de]=Musik hören
+Comment[eo]=Aŭskulti muzikon
+Comment[es_MX]=Escuchar la música
+Comment[es]=Escuchar música
+Comment[fi]=Kuuntele musiikkia
+Comment[fr]=Écouter de la musique
+Comment[gl]=Escoitar música
+Comment[hu]=Hallgasson zenét
+Comment[id_ID]=Dengarkan musik
+Comment[it]=Ascolta la musica
+Comment[ja]=音楽を聴きます
+Comment[ko]=음악을 들어요
+Comment[lt]=Klausyti muzikos
+Comment[lv]=Klausīties mūziku
+Comment[ms]=Dengar muzik
+Comment[nl]=Luister naar muziek
+Comment[pl]=Słuchaj muzyki
+Comment[pt_BR]=Ouvir Música
+Comment[pt_PT]=Reprodução de músicas
+Comment[ro]=Ascultă muzică
+Comment[ru]=Слушать музыку
+Comment[sr]=Слушајте музику
+Comment[tr]=Müzik dinleyin
+Comment[uk]=Слухати музику
+Comment[zh_CN]=聆听音乐
+Comment[zh_TW]=音樂鑑賞
+
+GenericName[be]=Музычны плэер
+GenericName[bg]=Музикален плейър
+GenericName[cs]=Hudební přehrávač
+GenericName[da]=Musikafspiller
+GenericName[de]=Musikspieler
+GenericName[eo]=Muzik-ludilo
+GenericName[es_MX]=Reproductor de Música
+GenericName[es]=Reproductor de música
+GenericName[fi]=Musiikkisoitin
+GenericName[fr]=Diffuseur de musique
+GenericName[gl]=Reprodutor de música
+GenericName[hu]=Zene lejátszó
+GenericName[id_ID]=Pemutar musik
+GenericName[it]=Lettore musicale
+GenericName[ja]=音楽プレイヤー
+GenericName[ko]=음악 재생기
+GenericName[lt]=Muzikos grotuvas
+GenericName[lv]=Mūzikas atskaņotājs
+GenericName[ms]=Pemain Muzik
+GenericName[nl]=Muziekspeler
+GenericName[pl]=Odtwarzacz muzyczny
+GenericName[pt_BR]=Player de Música
+GenericName[pt_PT]=Reprodutor áudio
+GenericName[ro]=Player de muzică
+GenericName[ru]=Музыкальный проигрыватель
+GenericName[sr]=Програм за слушање музике
+GenericName[tr]=Müzik Çalar
+GenericName[uk]=Музичний програвач
+GenericName[zh_CN]=音乐播放器
+GenericName[zh_TW]=音樂播放器
diff --git a/audacious.pc.in b/audacious.pc.in
index 27d265c5b241..0422c74baaf1 100644
--- a/audacious.pc.in
+++ b/audacious.pc.in
@@ -12,5 +12,5 @@ plugin_dir=@plugindir@
 Name: Audacious
 Description: Audacious is a versatile and handy multi platform media player
 Version: @PACKAGE_VERSION@
-Libs: -L${lib_dir} -laudcore -laudgui
+Libs: -L${lib_dir} -laudcore
 Cflags: -I${audacious_include_dir}
diff --git a/config.h.in b/config.h.in
index 7bcf59b78473..53fbdb55c466 100644
--- a/config.h.in
+++ b/config.h.in
@@ -6,6 +6,9 @@
 /* Build stamp */
 #undef BUILDSTAMP
 
+/* Copyright */
+#undef COPYRIGHT
+
 /* Define to 1 if translation of program messages to the user's native
    language is requested. */
 #undef ENABLE_NLS
@@ -100,6 +103,12 @@
 /* Define if D-Bus support enabled */
 #undef USE_DBUS
 
+/* Define if GTK+ support enabled */
+#undef USE_GTK
+
+/* Define if Qt support enabled */
+#undef USE_QT
+
 /* Define to allow Valgrind analysis */
 #undef VALGRIND_FRIENDLY
 
diff --git a/configure b/configure
index e6030705ad67..b480012508a8 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for audacious 3.5.1.
+# Generated by GNU Autoconf 2.69 for audacious 3.6.1.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -9,7 +9,7 @@
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 #
-# (C) 2005-2014 Audacious Team
+# Copyright (C) 2001-2015 Audacious developers and others
 ## -------------------- ##
 ## M4sh Initialization. ##
 ## -------------------- ##
@@ -579,8 +579,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='audacious'
 PACKAGE_TARNAME='audacious'
-PACKAGE_VERSION='3.5.1'
-PACKAGE_STRING='audacious 3.5.1'
+PACKAGE_VERSION='3.6.1'
+PACKAGE_STRING='audacious 3.6.1'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -666,7 +666,6 @@ INSTALL_PROGRAM
 SET_MAKE
 LTLIBICONV
 LIBICONV
-BIGENDIAN
 pkgconfigdir
 CLEAN_LIB
 UNINSTALL_LIB
@@ -679,8 +678,12 @@ LIB_SUFFIX
 LIB_PREFIX
 LIB_LDFLAGS
 LIB_CFLAGS
+USE_QT
+QT_LIBS
+QT_CFLAGS
 GIO_LIBS
 GIO_CFLAGS
+USE_GTK
 GTK_LIBS
 GTK_CFLAGS
 GMODULE_LIBS
@@ -697,6 +700,29 @@ CP
 MV
 RM
 LN_S
+BIGENDIAN
+OBJCXXCPP
+ac_ct_OBJCXX
+OBJCXXFLAGS
+OBJCXX
+OBJCPP
+ac_ct_OBJC
+OBJCFLAGS
+OBJC
+EGREP
+GREP
+CPP
+ac_ct_CXX
+CXXFLAGS
+CXX
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+HAVE_DARWIN
 HAVE_LINUX
 HAVE_MSWINDOWS
 target_os
@@ -711,19 +737,6 @@ build_os
 build_vendor
 build_cpu
 build
-EGREP
-GREP
-CPP
-ac_ct_CXX
-CXXFLAGS
-CXX
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
 target_alias
 host_alias
 build_alias
@@ -766,6 +779,8 @@ ac_subst_files=''
 ac_user_opts='
 enable_option_checking
 enable_largefile
+enable_gtk
+enable_qt
 with_pkgconfigdir
 with_gnu_ld
 enable_rpath
@@ -790,6 +805,12 @@ CXX
 CXXFLAGS
 CCC
 CPP
+OBJC
+OBJCFLAGS
+OBJCPP
+OBJCXX
+OBJCXXFLAGS
+OBJCXXCPP
 PKG_CONFIG
 PKG_CONFIG_PATH
 PKG_CONFIG_LIBDIR
@@ -801,6 +822,8 @@ GTK_CFLAGS
 GTK_LIBS
 GIO_CFLAGS
 GIO_LIBS
+QT_CFLAGS
+QT_LIBS
 LIBGUESS_CFLAGS
 LIBGUESS_LIBS'
 
@@ -1343,7 +1366,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures audacious 3.5.1 to adapt to many kinds of systems.
+\`configure' configures audacious 3.6.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1409,7 +1432,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of audacious 3.5.1:";;
+     short | recursive ) echo "Configuration of audacious 3.6.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1418,6 +1441,8 @@ Optional Features:
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --disable-largefile     omit support for large files
+  --disable-gtk           Disable GTK+ support (default=enabled)
+  --enable-qt             Enable Qt support (default=disabled)
   --disable-rpath         do not hardcode runtime library paths
   --disable-nls           do not use Native Language Support
   --enable-text-console   Enable text console for MS-Windows hosts
@@ -1448,6 +1473,12 @@ Some influential environment variables:
   CXX         C++ compiler command
   CXXFLAGS    C++ compiler flags
   CPP         C preprocessor
+  OBJC        Objective C compiler command
+  OBJCFLAGS   Objective C compiler flags
+  OBJCPP      Objective C preprocessor
+  OBJCXX      Objective C++ compiler command
+  OBJCXXFLAGS Objective C++ compiler flags
+  OBJCXXCPP   Objective C++ preprocessor
   PKG_CONFIG  path to pkg-config utility
   PKG_CONFIG_PATH
               directories to add to pkg-config's search path
@@ -1463,6 +1494,8 @@ Some influential environment variables:
   GTK_LIBS    linker flags for GTK, overriding pkg-config
   GIO_CFLAGS  C compiler flags for GIO, overriding pkg-config
   GIO_LIBS    linker flags for GIO, overriding pkg-config
+  QT_CFLAGS   C compiler flags for QT, overriding pkg-config
+  QT_LIBS     linker flags for QT, overriding pkg-config
   LIBGUESS_CFLAGS
               C compiler flags for LIBGUESS, overriding pkg-config
   LIBGUESS_LIBS
@@ -1534,14 +1567,14 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-audacious configure 3.5.1
+audacious configure 3.6.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 
-(C) 2005-2014 Audacious Team
+Copyright (C) 2001-2015 Audacious developers and others
 _ACEOF
   exit
 fi
@@ -1736,6 +1769,156 @@ $as_echo "$ac_res" >&6; }
 
 } # ac_fn_c_check_header_compile
 
+# ac_fn_objc_try_compile LINENO
+# -----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_objc_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_objc_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_objc_try_compile
+
+# ac_fn_objc_try_cpp LINENO
+# -------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_objc_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_objc_preproc_warn_flag$ac_objc_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_objc_try_cpp
+
+# ac_fn_objcxx_try_compile LINENO
+# -------------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_objcxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_objcxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_objcxx_try_compile
+
+# ac_fn_objcxx_try_cpp LINENO
+# ---------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_objcxx_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_objcxx_preproc_warn_flag$ac_objcxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_objcxx_try_cpp
+
 # ac_fn_c_try_link LINENO
 # -----------------------
 # Try to link conftest.$ac_ext, and return whether this succeeded.
@@ -1852,7 +2035,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by audacious $as_me 3.5.1, which was
+It was created by audacious $as_me 3.6.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2214,6 +2397,11 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+cat >>confdefs.h <<_ACEOF
+#define COPYRIGHT "Copyright © 2001-2015 Audacious developers and others"
+_ACEOF
+
+
 ac_aux_dir=
 for ac_dir in build-aux "$srcdir"/build-aux; do
   if test -f "$ac_dir/install-sh"; then
@@ -2247,72 +2435,182 @@ ac_config_headers="$ac_config_headers config.h"
 
 
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; 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_prog_CC+:} false; then :
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-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_prog_CC="${ac_tool_prefix}gcc"
-    $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
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
 
 fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
 
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; 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_prog_ac_ct_CC+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
 else
-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_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+$as_echo_n "checking target system type... " >&6; }
+if ${ac_cv_target+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$target_alias" = x; then
+  ac_cv_target=$ac_cv_host
+else
+  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+$as_echo "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; 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_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+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_prog_CC="${ac_tool_prefix}gcc"
+    $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
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; 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_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+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_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
   fi
 done
   done
@@ -4115,116 +4413,7 @@ rm -rf conftest*
 
 fi
 
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
-$as_echo_n "checking target system type... " >&6; }
-if ${ac_cv_target+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$target_alias" = x; then
-  ac_cv_target=$ac_cv_host
-else
-  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
-$as_echo "$ac_cv_target" >&6; }
-case $ac_cv_target in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
-esac
-target=$ac_cv_target
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_target
-shift
-target_cpu=$1
-target_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-target_os=$*
-IFS=$ac_save_IFS
-case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
-
 
-# The aliases save the names the user supplied, while $host etc.
-# will get canonicalized.
-test -n "$target_alias" &&
-  test "$program_prefix$program_suffix$program_transform_name" = \
-    NONENONEs,x,x, &&
-  program_prefix=${target_alias}-
 
 
 
@@ -4351,81 +4540,1147 @@ fi
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking operating system type" >&5
+$as_echo_n "checking operating system type... " >&6; }
 
-if test "x$GCC" = "xyes"; then
-    CFLAGS="$CFLAGS -std=gnu99 -ffast-math -Wall -pipe"
-    CXXFLAGS="$CXXFLAGS -Wall -pipe"
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C/C++ compiler supports -Wtype-limits" >&5
-$as_echo_n "checking whether the C/C++ compiler supports -Wtype-limits... " >&6; }
-    OLDCFLAGS="$CFLAGS"
-    CFLAGS="$CFLAGS -Wtype-limits -Werror"
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+HAVE_LINUX=no
+HAVE_MSWINDOWS=no
+HAVE_DARWIN=no
 
-int
-main ()
-{
-return 0;
+case "$target" in
+    *linux*)
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: Linux" >&5
+$as_echo "Linux" >&6; }
+        HAVE_LINUX=yes
+        ;;
+    *mingw*)
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: Windows" >&5
+$as_echo "Windows" >&6; }
+        HAVE_MSWINDOWS=yes
+        ;;
+    *darwin*)
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: Darwin" >&5
+$as_echo "Darwin" >&6; }
+        HAVE_DARWIN=yes
+        ;;
+    *)
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: other UNIX" >&5
+$as_echo "other UNIX" >&6; }
+        ;;
+esac
+
+
+
+
+
+
+
+
+
+
+if test "x$GCC" = "xyes"; then
+    CFLAGS="$CFLAGS -std=gnu99 -ffast-math -Wall -pipe"
+    if test "x$HAVE_DARWIN" = "xyes"; then
+        CXXFLAGS="$CXXFLAGS -stdlib=libc++ -std=gnu++11 -ffast-math -Wall -pipe"
+        LDFLAGS="$LDFLAGS -lc++ -stdlib=libc++"
+    else
+        CXXFLAGS="$CXXFLAGS -std=gnu++11 -ffast-math -Wall -pipe"
+    fi
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C/C++ compiler supports -Wtype-limits" >&5
+$as_echo_n "checking whether the C/C++ compiler supports -Wtype-limits... " >&6; }
+    OLDCFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS -Wtype-limits -Werror"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+        CFLAGS="$OLDCFLAGS -Wtype-limits"
+        CXXFLAGS="$CXXFLAGS -Wtype-limits"
+
+else
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+        CFLAGS="$OLDCFLAGS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler supports -Woverloaded-virtual" >&5
+$as_echo_n "checking whether the C++ compiler supports -Woverloaded-virtual... " >&6; }
+    ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+    OLDCXXFLAGS="$CXXFLAGS"
+    CXXFLAGS="$CXXFLAGS -Woverloaded-virtual -Werror"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+        CXXFLAGS="$OLDCXXFLAGS -Woverloaded-virtual"
+
+else
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+        CXXFLAGS="$OLDCXXFLAGS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+fi
+
+
+if test "x$HAVE_DARWIN" = "xyes"; then
+    ac_ext=m
+ac_cpp='$OBJCPP $CPPFLAGS'
+ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$OBJC -o conftest$ac_exeext $OBJCFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_objc_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in gcc objcc objc cc CC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; 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_prog_OBJC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJC"; then
+  ac_cv_prog_OBJC="$OBJC" # Let the user override the test.
+else
+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_prog_OBJC="$ac_tool_prefix$ac_prog"
+    $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
+
+fi
+fi
+OBJC=$ac_cv_prog_OBJC
+if test -n "$OBJC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJC" >&5
+$as_echo "$OBJC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$OBJC" && break
+  done
+fi
+if test -z "$OBJC"; then
+  ac_ct_OBJC=$OBJC
+  for ac_prog in gcc objcc objc cc CC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; 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_prog_ac_ct_OBJC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJC"; then
+  ac_cv_prog_ac_ct_OBJC="$ac_ct_OBJC" # Let the user override the test.
+else
+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_prog_ac_ct_OBJC="$ac_prog"
+    $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
+
+fi
+fi
+ac_ct_OBJC=$ac_cv_prog_ac_ct_OBJC
+if test -n "$ac_ct_OBJC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJC" >&5
+$as_echo "$ac_ct_OBJC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_OBJC" && break
+done
+
+  if test "x$ac_ct_OBJC" = x; then
+    OBJC="gcc"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJC=$ac_ct_OBJC
+  fi
+fi
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for Objective C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Objective C compiler" >&5
+$as_echo_n "checking whether we are using the GNU Objective C compiler... " >&6; }
+if ${ac_cv_objc_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_objc_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_objc_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objc_compiler_gnu" >&5
+$as_echo "$ac_cv_objc_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GOBJC=yes
+else
+  GOBJC=
+fi
+ac_test_OBJCFLAGS=${OBJCFLAGS+set}
+ac_save_OBJCFLAGS=$OBJCFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $OBJC accepts -g" >&5
+$as_echo_n "checking whether $OBJC accepts -g... " >&6; }
+if ${ac_cv_prog_objc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_objc_werror_flag=$ac_objc_werror_flag
+   ac_objc_werror_flag=yes
+   ac_cv_prog_objc_g=no
+   OBJCFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_objc_try_compile "$LINENO"; then :
+  ac_cv_prog_objc_g=yes
+else
+  OBJCFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_objc_try_compile "$LINENO"; then :
+
+else
+  ac_objc_werror_flag=$ac_save_objc_werror_flag
+	 OBJCFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_objc_try_compile "$LINENO"; then :
+  ac_cv_prog_objc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_objc_werror_flag=$ac_save_objc_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_objc_g" >&5
+$as_echo "$ac_cv_prog_objc_g" >&6; }
+if test "$ac_test_OBJCFLAGS" = set; then
+  OBJCFLAGS=$ac_save_OBJCFLAGS
+elif test $ac_cv_prog_objc_g = yes; then
+  if test "$GOBJC" = yes; then
+    OBJCFLAGS="-g -O2"
+  else
+    OBJCFLAGS="-g"
+  fi
+else
+  if test "$GOBJC" = yes; then
+    OBJCFLAGS="-O2"
+  else
+    OBJCFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+    ac_ext=m
+ac_cpp='$OBJCPP $CPPFLAGS'
+ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$OBJC -o conftest$ac_exeext $OBJCFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_objc_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the Objective C preprocessor" >&5
+$as_echo_n "checking how to run the Objective C preprocessor... " >&6; }
+if test -z "$OBJCPP"; then
+  if ${ac_cv_prog_OBJCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because OBJCPP needs to be expanded
+    for OBJCPP in "$OBJC -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_objc_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_objc_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_objc_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_OBJCPP=$OBJCPP
+
+fi
+  OBJCPP=$ac_cv_prog_OBJCPP
+else
+  ac_cv_prog_OBJCPP=$OBJCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJCPP" >&5
+$as_echo "$OBJCPP" >&6; }
+ac_preproc_ok=false
+for ac_objc_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_objc_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_objc_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Objective C preprocessor \"$OBJCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+    ac_ext=mm
+ac_cpp='$OBJCXXCPP $CPPFLAGS'
+ac_compile='$OBJCXX -c $OBJCXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$OBJCXX -o conftest$ac_exeext $OBJCXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_objcxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ objc++ objcxx c++ CXX
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; 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_prog_OBJCXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJCXX"; then
+  ac_cv_prog_OBJCXX="$OBJCXX" # Let the user override the test.
+else
+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_prog_OBJCXX="$ac_tool_prefix$ac_prog"
+    $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
+
+fi
+fi
+OBJCXX=$ac_cv_prog_OBJCXX
+if test -n "$OBJCXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJCXX" >&5
+$as_echo "$OBJCXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$OBJCXX" && break
+  done
+fi
+if test -z "$OBJCXX"; then
+  ac_ct_OBJCXX=$OBJCXX
+  for ac_prog in g++ objc++ objcxx c++ CXX
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; 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_prog_ac_ct_OBJCXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJCXX"; then
+  ac_cv_prog_ac_ct_OBJCXX="$ac_ct_OBJCXX" # Let the user override the test.
+else
+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_prog_ac_ct_OBJCXX="$ac_prog"
+    $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
+
+fi
+fi
+ac_ct_OBJCXX=$ac_cv_prog_ac_ct_OBJCXX
+if test -n "$ac_ct_OBJCXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJCXX" >&5
+$as_echo "$ac_ct_OBJCXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_OBJCXX" && break
+done
+
+  if test "x$ac_ct_OBJCXX" = x; then
+    OBJCXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJCXX=$ac_ct_OBJCXX
+  fi
+fi
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for Objective C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Objective C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU Objective C++ compiler... " >&6; }
+if ${ac_cv_objcxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_objcxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_objcxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objcxx_compiler_gnu" >&5
+$as_echo "$ac_cv_objcxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GOBJCXX=yes
+else
+  GOBJCXX=
+fi
+ac_test_OBJCXXFLAGS=${OBJCXXFLAGS+set}
+ac_save_OBJCXXFLAGS=$OBJCXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $OBJCXX accepts -g" >&5
+$as_echo_n "checking whether $OBJCXX accepts -g... " >&6; }
+if ${ac_cv_prog_objcxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_objcxx_werror_flag=$ac_objcxx_werror_flag
+   ac_objcxx_werror_flag=yes
+   ac_cv_prog_objcxx_g=no
+   OBJCXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_objcxx_try_compile "$LINENO"; then :
+  ac_cv_prog_objcxx_g=yes
+else
+  OBJCXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_objcxx_try_compile "$LINENO"; then :
+
+else
+  ac_objcxx_werror_flag=$ac_save_objcxx_werror_flag
+	 OBJCXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_objcxx_try_compile "$LINENO"; then :
+  ac_cv_prog_objcxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_objcxx_werror_flag=$ac_save_objcx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_objcxx_g" >&5
+$as_echo "$ac_cv_prog_objcxx_g" >&6; }
+if test "$ac_test_OBJCXXFLAGS" = set; then
+  OBJCXXFLAGS=$ac_save_OBJCXXFLAGS
+elif test $ac_cv_prog_objcxx_g = yes; then
+  if test "$GOBJCXX" = yes; then
+    OBJCXXFLAGS="-g -O2"
+  else
+    OBJCXXFLAGS="-g"
+  fi
+else
+  if test "$GOBJCXX" = yes; then
+    OBJCXXFLAGS="-O2"
+  else
+    OBJCXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+    ac_ext=mm
+ac_cpp='$OBJCXXCPP $CPPFLAGS'
+ac_compile='$OBJCXX -c $OBJCXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$OBJCXX -o conftest$ac_exeext $OBJCXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_objcxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the Objective C++ preprocessor" >&5
+$as_echo_n "checking how to run the Objective C++ preprocessor... " >&6; }
+if test -z "$OBJCXXCPP"; then
+  if ${ac_cv_prog_OBJCXXCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because OBJCXXCPP needs to be expanded
+    for OBJCXXCPP in "$OBJCXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_objcxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_objcxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_objcxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_OBJCXXCPP=$OBJCXXCPP
+
+fi
+  OBJCXXCPP=$ac_cv_prog_OBJCXXCPP
+else
+  ac_cv_prog_OBJCXXCPP=$OBJCXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJCXXCPP" >&5
+$as_echo "$OBJCXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_objcxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_objcxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_objcxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Objective C++ preprocessor \"$OBJCXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+    OBJCXXFLAGS="$OBJCXXFLAGS -stdlib=libc++ -std=c++11"
+fi
+
+if test $HAVE_LINUX = yes ; then
+	LDFLAGS="$LDFLAGS -Wl,-z,defs"
+fi
+
+if test $HAVE_MSWINDOWS = yes ; then
+	CFLAGS="$CFLAGS -march=i686"
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if ${ac_cv_c_bigendian+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_bigendian=unknown
+    # See if we're dealing with a universal compiler.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __APPLE_CC__
+	       not a universal capable compiler
+	     #endif
+	     typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+	# Check for potential -arch flags.  It is not universal unless
+	# there are at least two -arch flags with different values.
+	ac_arch=
+	ac_prev=
+	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+	 if test -n "$ac_prev"; then
+	   case $ac_word in
+	     i?86 | x86_64 | ppc | ppc64)
+	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+		 ac_arch=$ac_word
+	       else
+		 ac_cv_c_bigendian=universal
+		 break
+	       fi
+	       ;;
+	   esac
+	   ac_prev=
+	 elif test "x$ac_word" = "x-arch"; then
+	   ac_prev=arch
+	 fi
+       done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if sys/param.h defines the BYTE_ORDER macro.
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+	     #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+		     && LITTLE_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+		#include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to _BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # Compile a test program.
+      if test "$cross_compiling" = yes; then :
+  # Try to guess by grepping values from an object file.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+short int ascii_mm[] =
+		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+		short int ascii_ii[] =
+		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+		int use_ascii (int i) {
+		  return ascii_mm[i] + ascii_ii[i];
+		}
+		short int ebcdic_ii[] =
+		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+		short int ebcdic_mm[] =
+		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+		int use_ebcdic (int i) {
+		  return ebcdic_mm[i] + ebcdic_ii[i];
+		}
+		extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-        CFLAGS="$OLDCFLAGS -Wtype-limits"
-        CXXFLAGS="$CXXFLAGS -Wtype-limits"
-
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+	      ac_cv_c_bigendian=yes
+	    fi
+	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+	      if test "$ac_cv_c_bigendian" = unknown; then
+		ac_cv_c_bigendian=no
+	      else
+		# finding both strings is unlikely to happen, but who knows?
+		ac_cv_c_bigendian=unknown
+	      fi
+	    fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
 
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-        CFLAGS="$OLDCFLAGS"
+	     /* Are we little or big endian?  From Harbison&Steele.  */
+	     union
+	     {
+	       long int l;
+	       char c[sizeof (long int)];
+	     } u;
+	     u.l = 1;
+	     return u.c[sizeof (long int) - 1] == 1;
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_c_bigendian=no
+else
+  ac_cv_c_bigendian=yes
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+   yes)
+     BIGENDIAN=1;; #(
+   no)
+     BIGENDIAN=0 ;; #(
+   universal)
+     as_fn_error $? "Universal builds are not supported, sorry" "$LINENO" 5
+     ;; #(
+   *)
+     as_fn_error $? "Unknown machine byte order" "$LINENO" 5 ;;
+ esac
 
 
 
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking operating system type" >&5
-$as_echo_n "checking operating system type... " >&6; }
-
-HAVE_LINUX=no
-HAVE_MSWINDOWS=no
-
-case "$target" in
-    *linux*)
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: Linux" >&5
-$as_echo "Linux" >&6; }
-        HAVE_LINUX=yes
-        ;;
-    *mingw*)
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: Windows" >&5
-$as_echo "Windows" >&6; }
-        HAVE_MSWINDOWS=yes
-        ;;
-    *)
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: other UNIX" >&5
-$as_echo "other UNIX" >&6; }
-        ;;
-esac
-
-
-
-
-if test $HAVE_LINUX = yes ; then
-	LDFLAGS="$LDFLAGS -Wl,-z,defs"
+if test "x$HAVE_MSWINDOWS" = "xyes" ; then
+    EXPORT="__declspec(dllexport)"
+elif test "x$GCC" = "xyes" ; then
+    CFLAGS="$CFLAGS -fvisibility=hidden"
+    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
+    EXPORT="__attribute__((visibility(\"default\")))"
+else
+    as_fn_error $? "Unknown syntax for EXPORT keyword" "$LINENO" 5
 fi
 
-if test $HAVE_MSWINDOWS = yes ; then
-	CFLAGS="$CFLAGS -march=i686"
-fi
+cat >>confdefs.h <<_ACEOF
+#define EXPORT $EXPORT
+_ACEOF
+
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
 $as_echo_n "checking whether ln -s works... " >&6; }
@@ -4920,6 +6175,17 @@ $as_echo "yes" >&6; }
 
 fi
 
+
+# Check whether --enable-gtk was given.
+if test "${enable_gtk+set}" = set; then :
+  enableval=$enable_gtk; USE_GTK=$enableval
+else
+  USE_GTK=yes
+fi
+
+
+if test $USE_GTK = yes ; then
+
 pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5
 $as_echo_n "checking for GTK... " >&6; }
@@ -4928,12 +6194,12 @@ if test -n "$GTK_CFLAGS"; then
     pkg_cv_GTK_CFLAGS="$GTK_CFLAGS"
  elif test -n "$PKG_CONFIG"; then
     if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.4\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.4") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.24\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.24") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= 3.4" 2>/dev/null`
+  pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.24" 2>/dev/null`
 		      test "x$?" != "x0" && pkg_failed=yes
 else
   pkg_failed=yes
@@ -4945,12 +6211,12 @@ if test -n "$GTK_LIBS"; then
     pkg_cv_GTK_LIBS="$GTK_LIBS"
  elif test -n "$PKG_CONFIG"; then
     if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.4\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.4") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.24\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.24") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= 3.4" 2>/dev/null`
+  pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.24" 2>/dev/null`
 		      test "x$?" != "x0" && pkg_failed=yes
 else
   pkg_failed=yes
@@ -4971,14 +6237,14 @@ else
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-	        GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-3.0 >= 3.4" 2>&1`
+	        GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= 2.24" 2>&1`
         else
-	        GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-3.0 >= 3.4" 2>&1`
+	        GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= 2.24" 2>&1`
         fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$GTK_PKG_ERRORS" >&5
 
-	as_fn_error $? "Package requirements (gtk+-3.0 >= 3.4) were not met:
+	as_fn_error $? "Package requirements (gtk+-2.0 >= 2.24) were not met:
 
 $GTK_PKG_ERRORS
 
@@ -5011,6 +6277,12 @@ $as_echo "yes" >&6; }
 
 fi
 
+$as_echo "#define USE_GTK 1" >>confdefs.h
+
+fi
+
+
+
 if test $HAVE_MSWINDOWS = yes ; then
 
 pkg_failed=no
@@ -5207,6 +6479,119 @@ fi
 
 
 
+# Check whether --enable-qt was given.
+if test "${enable_qt+set}" = set; then :
+  enableval=$enable_qt; USE_QT=$enableval
+else
+  USE_QT=no
+fi
+
+
+if test $USE_QT = yes ; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT" >&5
+$as_echo_n "checking for QT... " >&6; }
+
+if test -n "$QT_CFLAGS"; then
+    pkg_cv_QT_CFLAGS="$QT_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core Qt5Gui Qt5Widgets\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "Qt5Core Qt5Gui Qt5Widgets") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_QT_CFLAGS=`$PKG_CONFIG --cflags "Qt5Core Qt5Gui Qt5Widgets" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$QT_LIBS"; then
+    pkg_cv_QT_LIBS="$QT_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core Qt5Gui Qt5Widgets\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "Qt5Core Qt5Gui Qt5Widgets") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_QT_LIBS=`$PKG_CONFIG --libs "Qt5Core Qt5Gui Qt5Widgets" 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
+	        QT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "Qt5Core Qt5Gui Qt5Widgets" 2>&1`
+        else
+	        QT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "Qt5Core Qt5Gui Qt5Widgets" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$QT_PKG_ERRORS" >&5
+
+	as_fn_error $? "Package requirements (Qt5Core Qt5Gui Qt5Widgets) were not met:
+
+$QT_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 QT_CFLAGS
+and QT_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 QT_CFLAGS
+and QT_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
+	QT_CFLAGS=$pkg_cv_QT_CFLAGS
+	QT_LIBS=$pkg_cv_QT_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+$as_echo "#define USE_QT 1" >>confdefs.h
+
+
+    # needed if Qt was built with -reduce-relocations
+    QT_CFLAGS="$QT_CFLAGS -fPIC"
+fi
+
+
+
+
+
+
 
 
 
@@ -5216,15 +6601,15 @@ $as_echo_n "checking for shared library system... " >&6; }
 		darwin*)
 			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Darwin" >&5
 $as_echo "Darwin" >&6; }
-			LIB_CFLAGS='-fPIC -DPIC'
-			LIB_LDFLAGS='-dynamiclib -current_version ${LIB_MAJOR}.${LIB_MINOR} -compatibility_version ${LIB_MAJOR}'
+			LIB_CFLAGS='-fPIC -DPIC -mmacosx-version-min=10.7'
+			LIB_LDFLAGS='-dynamiclib -current_version ${LIB_MAJOR}.${LIB_MINOR} -compatibility_version ${LIB_MAJOR} -mmacosx-version-min=10.7 -install_name "${libdir}/$$(i=${SHARED_LIB}; echo $${i%${LIB_SUFFIX}}).${LIB_MAJOR}${LIB_SUFFIX}"'
 			LIB_PREFIX='lib'
 			LIB_SUFFIX='.dylib'
 			LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
-			PLUGIN_CFLAGS='-fPIC -DPIC'
-			PLUGIN_LDFLAGS='-bundle -undefined dynamic_lookup'
+			PLUGIN_CFLAGS='-fPIC -DPIC -mmacosx-version-min=10.7'
+			PLUGIN_LDFLAGS='-bundle -undefined dynamic_lookup -mmacosx-version-min=10.7'
 			PLUGIN_SUFFIX='.bundle'
-			INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && install_name_tool -id ${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
+			INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
 			UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib'
 			CLEAN_LIB=''
 			;;
@@ -5284,281 +6669,44 @@ $as_echo "GNU" >&6; }
 			PLUGIN_CFLAGS='-fPIC -DPIC'
 			PLUGIN_LDFLAGS='-shared'
 			PLUGIN_SUFFIX='.so'
-			INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}.0 && ${LN_S} -f $$i.${LIB_MAJOR}.${LIB_MINOR}.0 ${DESTDIR}${libdir}/$$i.${LIB_MAJOR} && ${LN_S} -f $$i.${LIB_MAJOR}.${LIB_MINOR}.0 ${DESTDIR}${libdir}/$$i'
-			UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR} ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}.0'
-			CLEAN_LIB=''
-			;;
-	esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define PLUGIN_SUFFIX "$PLUGIN_SUFFIX"
-_ACEOF
-
-
-
-
-
-# Check whether --with-pkgconfigdir was given.
-if test "${with_pkgconfigdir+set}" = set; then :
-  withval=$with_pkgconfigdir;
-else
-  with_pkgconfigdir='${libdir}/pkgconfig'
-fi
+			INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}.0 && ${LN_S} -f $$i.${LIB_MAJOR}.${LIB_MINOR}.0 ${DESTDIR}${libdir}/$$i.${LIB_MAJOR} && ${LN_S} -f $$i.${LIB_MAJOR}.${LIB_MINOR}.0 ${DESTDIR}${libdir}/$$i'
+			UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR} ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}.0'
+			CLEAN_LIB=''
+			;;
+	esac
 
-pkgconfigdir=$with_pkgconfigdir
 
 
 
 
 
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
-$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
-if ${ac_cv_c_bigendian+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_c_bigendian=unknown
-    # See if we're dealing with a universal compiler.
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __APPLE_CC__
-	       not a universal capable compiler
-	     #endif
-	     typedef int dummy;
 
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
 
-	# Check for potential -arch flags.  It is not universal unless
-	# there are at least two -arch flags with different values.
-	ac_arch=
-	ac_prev=
-	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
-	 if test -n "$ac_prev"; then
-	   case $ac_word in
-	     i?86 | x86_64 | ppc | ppc64)
-	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
-		 ac_arch=$ac_word
-	       else
-		 ac_cv_c_bigendian=universal
-		 break
-	       fi
-	       ;;
-	   esac
-	   ac_prev=
-	 elif test "x$ac_word" = "x-arch"; then
-	   ac_prev=arch
-	 fi
-       done
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if sys/param.h defines the BYTE_ORDER macro.
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-	     #include <sys/param.h>
 
-int
-main ()
-{
-#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
-		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
-		     && LITTLE_ENDIAN)
-	      bogus endian macros
-	     #endif
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-		#include <sys/param.h>
 
-int
-main ()
-{
-#if BYTE_ORDER != BIG_ENDIAN
-		 not big endian
-		#endif
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
-else
-  ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
 
-int
-main ()
-{
-#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
-	      bogus endian macros
-	     #endif
 
-  ;
-  return 0;
-}
+cat >>confdefs.h <<_ACEOF
+#define PLUGIN_SUFFIX "$PLUGIN_SUFFIX"
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to _BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
 
-int
-main ()
-{
-#ifndef _BIG_ENDIAN
-		 not big endian
-		#endif
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
-else
-  ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # Compile a test program.
-      if test "$cross_compiling" = yes; then :
-  # Try to guess by grepping values from an object file.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-short int ascii_mm[] =
-		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
-		short int ascii_ii[] =
-		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
-		int use_ascii (int i) {
-		  return ascii_mm[i] + ascii_ii[i];
-		}
-		short int ebcdic_ii[] =
-		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
-		short int ebcdic_mm[] =
-		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
-		int use_ebcdic (int i) {
-		  return ebcdic_mm[i] + ebcdic_ii[i];
-		}
-		extern int foo;
 
-int
-main ()
-{
-return use_ascii (foo) == use_ebcdic (foo);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
-	      ac_cv_c_bigendian=yes
-	    fi
-	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
-	      if test "$ac_cv_c_bigendian" = unknown; then
-		ac_cv_c_bigendian=no
-	      else
-		# finding both strings is unlikely to happen, but who knows?
-		ac_cv_c_bigendian=unknown
-	      fi
-	    fi
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
 
-	     /* Are we little or big endian?  From Harbison&Steele.  */
-	     union
-	     {
-	       long int l;
-	       char c[sizeof (long int)];
-	     } u;
-	     u.l = 1;
-	     return u.c[sizeof (long int) - 1] == 1;
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_c_bigendian=no
+# Check whether --with-pkgconfigdir was given.
+if test "${with_pkgconfigdir+set}" = set; then :
+  withval=$with_pkgconfigdir;
 else
-  ac_cv_c_bigendian=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-    fi
+  with_pkgconfigdir='${libdir}/pkgconfig'
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
-$as_echo "$ac_cv_c_bigendian" >&6; }
- case $ac_cv_c_bigendian in #(
-   yes)
-     BIGENDIAN=1;; #(
-   no)
-     BIGENDIAN=0 ;; #(
-   universal)
-     as_fn_error $? "Universal builds are not supported, sorry" "$LINENO" 5
-     ;; #(
-   *)
-     as_fn_error $? "Unknown machine byte order" "$LINENO" 5 ;;
- esac
 
+pkgconfigdir=$with_pkgconfigdir
 
 
-if test "x$HAVE_MSWINDOWS" = "xyes" ; then
-    EXPORT="__declspec(dllexport)"
-elif test "x$GCC" = "xyes" ; then
-    CFLAGS="$CFLAGS -fvisibility=hidden"
-    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
-    EXPORT="__attribute__((visibility(\"default\")))"
-else
-    as_fn_error $? "Unknown syntax for EXPORT keyword" "$LINENO" 5
-fi
 
-cat >>confdefs.h <<_ACEOF
-#define EXPORT $EXPORT
-_ACEOF
 
 
 
@@ -6387,36 +7535,42 @@ else
       if test $am_cv_lib_iconv = yes; then
         LIBS="$LIBS $LIBICONV"
       fi
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
-           *)            am_cv_func_iconv_works="guessing yes" ;;
-         esac
-
+      am_cv_func_iconv_works=no
+      for ac_iconv_const in '' 'const'; do
+        if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+             *)            am_cv_func_iconv_works="guessing yes" ;;
+           esac
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 #include <iconv.h>
 #include <string.h>
-int main ()
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+
+int
+main ()
 {
-  int result = 0;
+int result = 0;
   /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
      returns.  */
   {
     iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
     if (cd_utf8_to_88591 != (iconv_t)(-1))
       {
-        static const char input[] = "\342\202\254"; /* EURO SIGN */
+        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
         char buf[10];
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = strlen (input);
         char *outptr = buf;
         size_t outbytesleft = sizeof (buf);
         size_t res = iconv (cd_utf8_to_88591,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res == 0)
           result |= 1;
@@ -6429,14 +7583,14 @@ int main ()
     iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
     if (cd_ascii_to_88591 != (iconv_t)(-1))
       {
-        static const char input[] = "\263";
+        static ICONV_CONST char input[] = "\263";
         char buf[10];
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = strlen (input);
         char *outptr = buf;
         size_t outbytesleft = sizeof (buf);
         size_t res = iconv (cd_ascii_to_88591,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res == 0)
           result |= 2;
@@ -6448,14 +7602,14 @@ int main ()
     iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
     if (cd_88591_to_utf8 != (iconv_t)(-1))
       {
-        static const char input[] = "\304";
+        static ICONV_CONST char input[] = "\304";
         static char buf[2] = { (char)0xDE, (char)0xAD };
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = 1;
         char *outptr = buf;
         size_t outbytesleft = 1;
         size_t res = iconv (cd_88591_to_utf8,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
           result |= 4;
@@ -6468,14 +7622,14 @@ int main ()
     iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
     if (cd_88591_to_utf8 != (iconv_t)(-1))
       {
-        static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
         char buf[50];
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = strlen (input);
         char *outptr = buf;
         size_t outbytesleft = sizeof (buf);
         size_t res = iconv (cd_88591_to_utf8,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if ((int)res > 0)
           result |= 8;
@@ -6495,17 +7649,20 @@ int main ()
       && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
     result |= 16;
   return result;
+
+  ;
+  return 0;
 }
 _ACEOF
 if ac_fn_c_try_run "$LINENO"; then :
   am_cv_func_iconv_works=yes
-else
-  am_cv_func_iconv_works=no
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
   conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
+        test "$am_cv_func_iconv_works" = no || break
+      done
       LIBS="$am_save_LIBS"
 
 fi
@@ -7394,36 +8551,42 @@ else
       if test $am_cv_lib_iconv = yes; then
         LIBS="$LIBS $LIBICONV"
       fi
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
-           *)            am_cv_func_iconv_works="guessing yes" ;;
-         esac
-
+      am_cv_func_iconv_works=no
+      for ac_iconv_const in '' 'const'; do
+        if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+             *)            am_cv_func_iconv_works="guessing yes" ;;
+           esac
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 #include <iconv.h>
 #include <string.h>
-int main ()
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+
+int
+main ()
 {
-  int result = 0;
+int result = 0;
   /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
      returns.  */
   {
     iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
     if (cd_utf8_to_88591 != (iconv_t)(-1))
       {
-        static const char input[] = "\342\202\254"; /* EURO SIGN */
+        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
         char buf[10];
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = strlen (input);
         char *outptr = buf;
         size_t outbytesleft = sizeof (buf);
         size_t res = iconv (cd_utf8_to_88591,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res == 0)
           result |= 1;
@@ -7436,14 +8599,14 @@ int main ()
     iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
     if (cd_ascii_to_88591 != (iconv_t)(-1))
       {
-        static const char input[] = "\263";
+        static ICONV_CONST char input[] = "\263";
         char buf[10];
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = strlen (input);
         char *outptr = buf;
         size_t outbytesleft = sizeof (buf);
         size_t res = iconv (cd_ascii_to_88591,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res == 0)
           result |= 2;
@@ -7455,14 +8618,14 @@ int main ()
     iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
     if (cd_88591_to_utf8 != (iconv_t)(-1))
       {
-        static const char input[] = "\304";
+        static ICONV_CONST char input[] = "\304";
         static char buf[2] = { (char)0xDE, (char)0xAD };
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = 1;
         char *outptr = buf;
         size_t outbytesleft = 1;
         size_t res = iconv (cd_88591_to_utf8,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
           result |= 4;
@@ -7475,14 +8638,14 @@ int main ()
     iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
     if (cd_88591_to_utf8 != (iconv_t)(-1))
       {
-        static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
         char buf[50];
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = strlen (input);
         char *outptr = buf;
         size_t outbytesleft = sizeof (buf);
         size_t res = iconv (cd_88591_to_utf8,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if ((int)res > 0)
           result |= 8;
@@ -7502,17 +8665,20 @@ int main ()
       && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
     result |= 16;
   return result;
+
+  ;
+  return 0;
 }
 _ACEOF
 if ac_fn_c_try_run "$LINENO"; then :
   am_cv_func_iconv_works=yes
-else
-  am_cv_func_iconv_works=no
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
   conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
+        test "$am_cv_func_iconv_works" = no || break
+      done
       LIBS="$am_save_LIBS"
 
 fi
@@ -9042,7 +10208,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by audacious $as_me 3.5.1, which was
+This file was extended by audacious $as_me 3.6.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -9108,7 +10274,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-audacious config.status 3.5.1
+audacious config.status 3.6.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -9981,5 +11147,7 @@ echo "  Install path:                           $prefix"
 echo ""
 echo "  Automatic character code detection:     $USE_CHARDET"
 echo "  D-Bus support:                          $USE_DBUS"
+echo "  GTK+ support:                           $USE_GTK"
+echo "  Qt support:                             $USE_QT"
 echo "  Valgrind analysis support:              $enable_valgrind"
 echo ""
diff --git a/configure.ac b/configure.ac
index 5ca6701307a5..56d60c5f3b87 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5,11 +5,12 @@ dnl ***
 dnl Initialize
 dnl ==========
 AC_PREREQ([2.59])
-AC_INIT([audacious], [3.5.1])
-AC_COPYRIGHT([(C) 2005-2014 Audacious Team])
+AC_INIT([audacious], [3.6.1])
+AC_COPYRIGHT([Copyright (C) 2001-2015 Audacious developers and others])
 
 AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE_NAME", [Name of package])
 AC_DEFINE_UNQUOTED(VERSION, "$PACKAGE_VERSION", [Version number of package])
+AC_DEFINE_UNQUOTED(COPYRIGHT, "Copyright © 2001-2015 Audacious developers and others", [Copyright])
 
 AC_CONFIG_AUX_DIR([build-aux])
 AC_CONFIG_HEADERS([config.h])
@@ -22,26 +23,6 @@ AC_DEFINE_UNQUOTED(PLUGIN_SUFFIX, "$PLUGIN_SUFFIX", [Suffix for plugins])
 
 m4_ifdef([PKG_INSTALLDIR], [PKG_INSTALLDIR], AC_SUBST([pkgconfigdir], ${libdir}/pkgconfig))
 
-dnl Byte order
-dnl ==========
-AC_C_BIGENDIAN([BIGENDIAN=1], [BIGENDIAN=0],
- [AC_MSG_ERROR([Unknown machine byte order])],
- [AC_MSG_ERROR([Universal builds are not supported, sorry])])
-AC_SUBST([BIGENDIAN])
-
-dnl Prevent symbol collisions
-dnl =========================
-if test "x$HAVE_MSWINDOWS" = "xyes" ; then
-    EXPORT="__declspec(dllexport)"
-elif test "x$GCC" = "xyes" ; then
-    CFLAGS="$CFLAGS -fvisibility=hidden"
-    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
-    EXPORT="__attribute__((visibility(\"default\")))"
-else
-    AC_MSG_ERROR([Unknown syntax for EXPORT keyword])
-fi
-AC_DEFINE_UNQUOTED([EXPORT], [$EXPORT], [Define to compiler syntax for public symbols])
-
 dnl Headers and functions
 dnl ===============================
 
@@ -182,5 +163,7 @@ echo "  Install path:                           $prefix"
 echo ""
 echo "  Automatic character code detection:     $USE_CHARDET"
 echo "  D-Bus support:                          $USE_DBUS"
+echo "  GTK+ support:                           $USE_GTK"
+echo "  Qt support:                             $USE_QT"
 echo "  Valgrind analysis support:              $enable_valgrind"
 echo ""
diff --git a/contrib/audacious.appdata.xml b/contrib/audacious.appdata.xml
new file mode 100644
index 000000000000..046b9e300957
--- /dev/null
+++ b/contrib/audacious.appdata.xml
@@ -0,0 +1,32 @@
+<!-- Copyright 2015 Audacious developers -->
+
+<?xml version="1.0" encoding="UTF-8"?>
+<component>
+  <id type="desktop">audacious.desktop</id>
+  <metadata_license>CC0-1.0</metadata_license>
+  <project_license>BSD-2-Clause</project_license>
+  <name>Audacious</name>
+  <summary>Lightweight audio player</summary>
+  <description>
+    <p>
+      Audacious is an open source audio player. Originally a descendant of XMMS,
+      Audacious plays your music how you want it, without stealing away your
+      computer’s resources from other tasks.
+    </p>
+    <p>
+      Drag and drop folders and individual song files, search for artists and
+      albums in your entire music library, or create and edit your own custom
+      playlists. Listen to CD’s or stream music from the Internet. Tweak the
+      sound with the graphical equalizer or experiment with LADSPA
+      effects. Enjoy the modern GTK-themed interface or change things up with
+      Winamp Classic skins. Use the plugins included with Audacious to fetch
+      lyrics for your music, to set an alarm in the morning, and more.
+    </p>
+  </description>
+  <url type="homepage">http://audacious-media-player.org</url>
+  <screenshots>
+    <screenshot type="default">http://audacious-media-player.org/images/gtk-interface.png</screenshot>
+    <screenshot>http://audacious-media-player.org/images/winamp-interface.png</screenshot>
+    <screenshot>http://audacious-media-player.org/images/settings-window.png</screenshot>
+  </screenshots>
+</component>
diff --git a/contrib/macpack/.DS_Store b/contrib/macpack/.DS_Store
deleted file mode 100644
index 796f3b59a13b6d369b2cb677913b53d902d16de2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6148
zcmeHKO-sW-5PhRP6h!FJ<N60g|3O;n!Lv6{wkeiCXbPqF;vxTB-|S4J!4hvGIs?0J
zcK6MGypa6>AhZ4I4wwKKGbxHXCrqnPHk~<nM3me|i3$z&*x}|xN58R3=YEMP=e)uK
z$Mauci|s?*l*_tVlBE(oF<rlBqc<4&a;R>PA~U at zH?OMHcagh8-E7umy$v&~a^3hC
z-3QY3goOg3KqwFjgaShf*hz%(#SkglLV-}=Un-#cLt;`a99zS at bui0M0OIGhlfGV*
zH6}S0j;$eEXkwv63l)E2h=sF0Ij?YR4J{nvj}P&YyT^;<(b<2>bVy+sc_<JH^c6U_
z;zZB?d;T)r8?w)eQYa7#{AC4XG=H4WxI#Z$zpPcy+QjtCq^7)99UA at KC4dFpN3L?C
cwI}t-D;!%x?M3TzI592)S&+y=fge!d0|5>;(f|Me

diff --git a/contrib/macpack/Audacious.app/Contents/Info.plist b/contrib/macpack/Audacious.app/Contents/Info.plist
index ffa9eb5cda3f..7898402be8df 100644
--- a/contrib/macpack/Audacious.app/Contents/Info.plist
+++ b/contrib/macpack/Audacious.app/Contents/Info.plist
@@ -11,15 +11,14 @@
 	<key>CFBundleIconFile</key>
 	<string>Audacious.icns</string>
 	<key>CFBundleIdentifier</key>
-	<string>org.atheme.audacious</string>
+	<string>org.audacious-media-player</string>
 	<key>CFBundleInfoDictionaryVersion</key>
-	<string>1.4.5</string>
+	<string>3.6-devel</string>
 	<key>CFBundleName</key>
 	<string>Audacious</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.4</string>
+	<string>3.6</string>
 	<key>NSHumanReadableCopyright</key>
-	<string>Copyright © 2008 Atheme.org
-All Rights Reserved.</string>
+	<string>Copyright © 2001-2014 Audacious developers and others</string>
 </dict>
 </plist>
diff --git a/contrib/macpack/Audacious.app/Contents/Resources/Audacious.icns b/contrib/macpack/Audacious.app/Contents/Resources/Audacious.icns
index 05b6e9967135c9ad4efbd2b9f8b733416f455575..090afb888e3865700be355c15833f444e5a28b78 100644
GIT binary patch
literal 63527
zcmeEvbwCzb_y0U}cY~CqbVxVST at unEA>Az{DUFmgBHaxF(%lF=f=C!3sUni{8{OS^
z-BtJ9eZQ{z$8X2gx%YF<J)d)9&fJ-~_gQN*dlvvWq_=kA;sgN5>s$a4UblRBxKtZH
z1b`4$1w$bf1VI2QLNydxk&rY1g;v1_0<d~eXmkJohZqNi>IMR+MNsH)K>`wR2?{L&
zv*S=`F%=8|AV8sGV0HpJiwlSg0u)f_IG8Pm&Y=JVcmORFS_)>3pwLJpJVkPKDAX_z
zfd5D|`6v(ysX_?)j{_l}yqcZ{y~+jtb at 6+&q6?qh4Y0$J0PtXro!Q)+j=A(P4fa~n
z>G`MQG#>tAw&kbX$A6m;03hwx?D_c}faUD-{OP5{&$H*}akIb8Prv<b{>}dH^1suc
ziTSNOis@(Peu7UJfVj^Uq5uHC`B$J3?#uds2y^VC_wQ$Zs;{-}$AJ%*bPj|9$OP9i
z8wLg%GIjCd0T_z-xm!?}xp;~g03tIH0fkIR-v%Hi^HEU9yip_ok)MwSQ*z+|1b;LT
ziZq|%Y%C(I8#@yOg^b{Z0l=*wC}0j=L<IR at A~+Nr%(GyE at D>0;d<c&3M+CP3z%UpJ
zpRVobYJn6809K&b5Ck(rp)iAKL?FTkA{ijk5)6f%v|@k_1^`?TY5}2fkY<!Q6s#`@
zjDx at gc$NtSAk-9KL5`onmOxM#2*6;?f&T(BAlm$q0HmLU1OPBFhRPs(4TL|k7=Y(X
zpyNE?`5NdZ$t<Xs0t0d=f{9rYFcBC8Mad%r;FV%BRET5;LF)lwU=2rupfL0Gy<uR@
z at xk^GoCRBERuF8XpIZxTx1U=u27tkKodVl+(iJ=YQ-ilnPd at +~{A2t7+Xw&l0XQE2
zzrPM_KgDLaPq7&cSKxtVkUO-#v$H;!qmTI$^7+3^dGCLXdGB)>KbHXjTEcHa=K1+a
z9P(!x^uLR^A1w_L|3`ss<5$zardFAMR-jq`75qH4O7uwq<MHR<=jk!jj|#tw?w>1w
zu at 0a=`5gIedLQ&L^S97%bIAbKXU+0k*~i=grrwv}=g8HJ&vRd<Q%AnUK1T*OKhJ%c
z-Z=Ua`y4qu{yg_(`tZNmAN;b+=SbgwtKWZXAJpI7%s)4Ne*OmKkNYS6kNfxN;vbKX
zh>zn3;o)yNf6cYSf0P5bi@!pjrxtKOiNU$R%IEMe>1C#$#Q=cQ`V08$xdr<_V$cWQ
z-!;Sgn?G^?M~67$vw`?Ni{d|m|0F(L->0X)yS}YmKh8~XKQ;t-Z~Wswi2yDJo0 at ZC
zdCh~~;o;r~)n)MxO3bLw0a#k?_?~zu?1M;ck|h8J&!i?53OiSH6 at 4Cng^@~`%>?ho
zxA|uP7(~O4d?-wvD(pA_1FQ9*5DHVP05bwWgj!0WkZR6B079Hv0p8~$ar*#>^iVYv
z(kIppK#(Krp^!-AhX914q7e!yC2I$Zj5k9e!<Qd`lcbqeC}di$1%T+zwt<rZ-6jB{
zG2a1BoYWfti0oV^6f!4M2TmDgx}lI6ff~@ta4!@xNL~fbP3!uhkXocl0Pq`x0zMT0
zaAgQAC|L$TFnTkgm_6?NG*}q00Dz27DdS!+aTf~d#V7 at UkYp%gV}L$C11Sc~Z2%TY
zE_o&m3Ivq^5RUmIC}dnI1%Sc4K9B-Za})s(xLOdLxSS5apj;nG1{q-s0YC-BMmaJ8
z2yR3&6i~VkKww)FL2{uS0HQMo3R_?c06-xL3MA$M5Vct_A%72mz|?~YjeGzw1yyPw
zU_$T?6yVJVB}Je_00d$|Ko(S`nM;HMF<@bgDG<30TFU|nrZ92=KpXU8_VPUdkOj+V
zfxx{KD9o at D1XP9}154$BPGHTYLE&qhb&R~rZw<o^)%oHkfOB)u!YoEM07#WWfhrIH
z-2f!Oyl)v4Ac_Y77BKG(=Ig*NZG?>nd+(zcHCdn+^F>hD{t{EHL;!dInwdk-1gDV&
zP}pHlTI3V}NC8W-gOElp6t1_>QveRUeBD4y6~tUJ!J>`~D4=0o5OM^eq`Tlq at kh=B
z8vsNSK%^uc3h5F6D at 6qYMIcb020mNjf%QfQfjSWANQFZ3F~G*327PJ=fg!Mq%8?7f
zwx0!&K at gb%Tc#ba2mn~YGBY6X=ngn+7>WVF`)6PXY)rcn0O$krA4_z6><IW`u$#eN
z`((BLV?Q#)fupn_umX~Z5eoqLV4+%2xdf!C2PLR|!B8L;6cB=fkG>{=f{HkBScE`<
z9uQ{*@i-87{uy`q8P@{wkJZ=s88-&;W>DV;#MMBY^CuiaHU&=KC&fX@$Ke2uGXVFa
z1ndx@>Hu&w at _<}vpaeS$0Gbk at KxHBTOU@%e3wB{XSd9j-r2`Vcp^O05GztX#K|mI?
zAPnZ!!Msd10Ku6D3kHG!(Z}w@%mIK3ut+Zqh%|zdQgB>d1B>v2`3x|xn+rfNr@=%5
z2vo;|?xBOd7Y`Ph=LfG6jH!6ANx<<d4qEFb0DH+0)D;6qHlzkbn#l?P2;LA_tO5e|
zF?eA>hGi1Lo<oTO2U!8ADi12aHiO+2fOs1~Mv at Gu179W#df<c44|t#)(gbt=r;%Sn
z9Ra{F`VWH-3DW@=f&mzaTo>r4*2i&BnGA&;2@?VzgkTV~$|IqO^F`(o%%Zk+AYUac
z=qAftDipCVL;@QFS*xc6tTzi-n~+iP at -GFi<>6r{WC#b0A7b-^V7)}akm3b~7LQ7B
zcoc!brVthkJ3j{?FcdM5gF$JG2 at Fqs(_o;Q<^x04&%p}}V=_}<K%0^VLmS^H801EH
z!Enda2L`?_IxqzO91I_VvD9v^778<K2MY$vpTlM!0E6K(TMmVpu|o#q>ZM}va?GL}
z`7G{&F&IXoA|DFL;hOn8PD4MB;7b4;s(@?ZqgW{1bhe!U^7CKr0ZrXw;H#Ie#-Hv1
ze|+OO2NM6wt>vS}zc-hEZ!X|v{_oA at -<!+7H<y2JF8|(K{(W-!I41<BsQ*5>{QKnc
z?~}`?XZC-eT);O*KlaJR_0y|zvCm$W|L2|Be@(zLXt^fUc2BSFd^%RAx@!|%HR-_*
z*MI*(s2<z*yHB6Lyk6Yzi%}!^J3W9GkDU62>|5u_aIufyPQU*FE1j|REz;lOTj^I|
zzc)Wy+U{>j{y4Xj#`--ykgWgk$9!K(&uYcLlLrv>@h{E)8Dvxy@*P}I`XAXpdN?Zo
ze|11$=+D&j+d2b${}&I?fByyU+eF`zoWy+kUiLqEA^+7+9N%L47XDP`e<BC4O1@?B
zui|-V|APmtU-`WGSBZbopZ at i$(4Y0h?C_Vu-{bt=<j?Z{qz4oEJy<`p@!{5Ai3P}2
zpB4R1$;v-}tH=E2$HD)LFCCbFvJXh7|1UJ(E;~i?ryL-k|F(($n`HLFpKyTq$^VVy
zk4iuJX>q|Hd4c_3XE=XE at ZV%pSbxL~%8>q+q4%p>9e;ckz}5V!`uC)&{%~q``|lzB
z+-k at l^nmH-ihoo3gX%XOVEM+x{`-3Jiu4-}pv-+=qHkFnMEJS`cfM8Nd*hK`<rn|U
zbL{`suQS1~IDoeNznc5&<sSWRoykXc!vDIN|Gk9M7Y)GjyR~NjyX`+y@*U;x9ccSA
z#lD|T`S18;zMttoXX&?3hcJKZUGHli_5G#+w7;hE_hO=-J23J0a(&Hu!)N at mUsL$I
zF at awl_-y6--_81~{p$bl)Bdo?`z!nT`5E;u4n%(r|G4z0g@~XJ2wz<(`}h0t;^(`7
z+TTz0bq2+sI^h1-rGGz~`-vav_219*b%vc!6Cs7K3x5Rq>CH^ik6`*b2e?=b02aP3
z`w{3INKf%2h`z-^1}=R3mh4C1S^$vvBY3{W0S<t^Z^?cH-VMO~kY}!M)#VL at _FJMK
zgHtN~7 at lvj$T at sV@?-EDu|J0ATP#s!-;(?oytwnn at O+D<edb$|AA?W6_%S at +Vp-e!
zmgL9aI|o08=UXiAe&}QWmtLIy!~7 at zaQpB7!{cxJpT7S7rf)4 at j<l~M6Mysj{;#wC
zinjgJ_n#l|#{bvaewm7}`x5(+i1j}`|Dyhpwf&Oo0^}ci`u^z5&OiSA at kcwEzih7W
zjYNSv&c3(JzhV#k7Dn<{^uM$2hmXtU9(`w{f5F_u$M+xq(A&q4Ziav4m--71e`nQC
zA0htf_isSXcdpf+Hka|S`N2Jpf4abTR{VKk)<6CJ83_H(_4<?Mf_`d#0QjfBKLFK#
z(&O){2JT_~<q-R>hX16o&p(3y1K;0<f2sV(v+|$x`8%q~e$Ef{e at DxI%GAT(&;vjG
z`?JJv`GKlG<@I+{0{5f;_MrZ*>n;DApSy&=We0Qr at cIh?@dwU>2EVpd;vZgr0{{{K
zt=GPn-0zFd{{$fXA6B~m71vt6*7_ek_=ne at fxnXR0~P|D{$}CF?|R|~yp8yy^@jlD
z4}X~IuXOUabTj^V9X4#mw+enAy!;QBe}cV%-2HuszHX)K^B*w#UElwl#rzxRBIAE%
z3HU#}{u=zvxUR1^-v1Tt#QJ)Re}N+YEiWZY5WgV$766<6f3546<x~IL$p73Kn9%PW
z3D1K5_`3g`{8L)=`IlAr-;t-hUl9B^0I%VHr~7@$I=uhJ_7yqA;lKQh-tSqyl|OR$
zi*5glGyId^GWl2VF`i%S{pB-^;nrVa`kL;R;s03qpPVJi`<l@|jeW at ba-#hgTS0!{
zPqTfYI4buS$-b&C@!$)?e+u|M`!7Gb#9Q^3!_oKKfBLCSNIVw*RGoiTTJ-q!he*HL
zrhgs$XZIg}^7kLzfBkcdf&0&UcE8>gJ3W8%{`3EI8rc=I;Jn7s)gADMP>*(2M;h{i
z%p||Ht>r(ZzM8N$V+XhBa#4UnG#gb)N_3Pk6fli<-POy{#*vfqW1*kVD&W})%o12z
znLC3&fet3Yzi^0%pCTNlnS-tKPqFUfJcruM+~PX$(^hy00Q-wJ00aI3z&v<>=FHAj
z&eZ_$w>tl0?ql-P at w53~vT%qH$bbGjR|h_BX at x-G;otzsxjukPsj8!6{L6njs;WBY
z<^VPTQ82k-V(!M`ewme%mE$}P_*gZ7lM^hHINnKvqahsWFD52@)s1nbDztP)E%RE{
z;88;*jd(6q)rj;8N74IT7|FIHlNVH&Bz>vJq~p}+faeMSa;Ixd)4{<#hK)+`(4}*Z
z?tp;tPBLur-c8oz7Yzh`$8l{f_R<&@;^*k58a at +G5H^83w`}fj=G;el8+>Wg4-rj#
z1;68NajX&tQ?q!J1aIp|io8CVYsJo$*+>1$UKD}PL}8bSM|AmbTn~Fk0)#N%ET&q!
zF%=c96q)#{Juu_L?$U(=Yun!RNIuU@&wZ*x7>0G<Vn0GwY`^#-N*Dh%%KlLO&X$}s
z5qERR=ITrweUe8_X}UQo%J~9^j2pwcG?6u{5i~^1ac^}a#}6mfdGkNWumvzURP^M9
zk{0x*?@vqJ7E%Zp+bhx~R7=%pY0FE#mHZz6{ZuQnQiSH>Ef$DTPj^ebS4ZEqn_6(0
zdQO@=hEgTlh6CXN0sYGs6oDC{uwt+)Jkt at OZ^tuWDTSEJL(8wca)^@aYFn#pyqlM)
zn(rnAwRmQfvk-kHdNX;4<dL+|AhjT~qHVamsdYbfpJev7XGOxM5v;Dz9`>D;d}_X3
z=Ftpe=?f3qy({#|<F2_&?q6(%qKgmf0?R_VS at hPHCvaNJg6dS1d6BPT$1YP|W;nr{
znkqi4s4y}hj}m1(k03p%ecVgk+`ppQzoOZ_SNzcS!Ny|Y0d^1*neqg3a`(dsjK{n?
z_bFtN1KFt#S8dZo*5XY|81Sl}v+$89d1{2lXL#az?AB1slX0nsM?Q|WzZZ|ns at JPz
z%c^<8Lvt at W>4w?-Q+~af$bzG at qmwYeWXe;2Ft4vj72)zg_+2;Q*K$ruQ6j9$+anZh
zXXzJ5VsHAn>}=N3Eff0UIi<+s4x}$aoLq)NR^o>C4TPR&2C(3%BT43#^}R<gPpwu=
z#u*;I)h at 46H6<*6`Z#$(-^2YVoGc3M#d!Vp2$r%nNja~;IWK?A(=o{d9OZozx^m}T
z)#oVwG6Gim_BYU`icT8db3e!;mM%8!V5tn&nACh_Sf?pVqbAT9?#%{QNr56!xXF(x
zDNTcSXpH at 6Gm%2pY#^T$>E<DxIWLNW)pee8qKNDy3gx1$Hx>P~V>@{{E33t8Myb<b
zG{d<E{g;)6o;h*(l^BW|a>;F1E|Ob5fv+n;e3n8T`c$<!W+S2^ChJbUTH>3KII)Os
zZ7L&8Nmj&kOBj}67MfV{8HHOXSdyxe?jExiH0Ww``Ps2|-6kG7?)9QvckNokA;P*&
zxS~QJ7gp#oCN~<Y0mHs0m+nmxeYnR&{Y-d3l&&bs0kRk*W(j*yS}+#Pl-zFG#kja#
z%p6X(a-}ItvG8hTIe4XxzVLUzK57hzT%Y9&7~05u#6c!qncv2d#@R)EfAoMY4Le!g
z@@)V4Q-h}hxIGWeZZ=+pqwbGnxy7PK8jdnEV~A&kV*bqfbqK-oio(+tE?loQT3r3s
z at V=oIpOB4UY){1}D#?P>d8K|>whe&7rYfn at j2>!7pN8}0+(%TM7Zvk1-f_XR11##i
zuN)U!iQV55S)2Oisq2x7bl5dECQvwq at Db}o^>m`ic24Rf?hSKg6o{#1VqvicpHzuT
zE99bF3~6RI*x(P)t(FXsQCZ($`;chcG}aJucb7qlYS4a~W7#JHW(Nk{)t{DX(crn;
zQv!n0Co>M at 9!lf)>62Zg6YY**Uqte`!zZW=Cc=kcsm|(i+AmD73&LN1afo;r>*W_l
zxygeC6DUi*zV7s_Pzd$x02$j%oPu=sj=%y=f&Z`{A=@V1BsqjzO^lOm+yM9Pxo~xd
zn27KRoA?JJ`0)nq?8_MaD`k_1H$p_wZM!nIpAd5kS0Z5PIdh|Id&bz*j-dgC0>-wZ
z>A at GY`3bbtm_5)c(%!|s?Vg=e=tC&BoULqAPS8ej?*WA9uCn9%+mL#ppE#NN(<az4
zzVakaD>OhdBMUcc_ARIIkGh1D&p}jDJ*kaD`$pnvW0g>*IHKU(BCT^A;}hy at LnfgT
zS4oYlN{3MDmIh?B)68D>ifz3<GOZ5sDL?U+SE!;6Y4vzLM&*Dh=T1+tCf<$8sboa9
z9ea4~r4+ at vz5eSejJ&)n17xIA2b01D7q-!FB|Sv4sti>ba(|XeSyYn`H;B7?shM2V
z20vMBH#j#!#_BN~AS%1BNUUziFvdh;)#WA{?Dsl4rgDgnTb=BVv}5Ex4+|#&EmHp_
zE|oj4@;F70n^gB&!?VRr_Pmd=kR%)4jo97i5T8QwzZB>%k(}k={_t|taZ~B?IPaRV
z6iotMrtw`fBg`-=3acO-J5QD2*2^L3s^K;2`9&NRd*?Ly4B5G9?Hrv`>0}+&na#dv
zFEg$>i|u7-M%?6COl6Lk9cKr|GNml_4T*14v=4Le at Tc4zT8EbH-oxUkPxaEj6DIeh
z1C^An3wjW37$^p86+hX0<9B}D=?2`9qA*j$0gm(8t*RVuf`E>O0Nj?P7d4!N{x8XG
z%I>mhQY|E*={P at -RB=wTpJ34zzzXwc8H9)9GvGOLmU-0fprdXm>8it4jb#@ir;44s
zmPMFhBv#g{p<|-U?XD?`sONFVV6dH4o=Sx5G6J2>h-bx0aaN*tIRh>Mm7el5q_piU
zB%8&R)5rIp`87u1OmR59qgQ$7V68hmbKEP8Ic1XmxO at 2t1%>;ed(_M$f0qL(BFR(B
zt(*lBFPfUAr!SF`iM+bTW9^oh@(2g!U%9?BA?}x<FMUJ18#x^-h=YSv?{95*`V#Zd
ze%E!KD)8o}^^1oO<|SMooe)u2A)cVcM6aobuw)|LiB2GNKknndI at 9jJE#j+rmw+kC
z_W2yqvtxQ&R at s^<3x42|w at 6M>c^X?r`ef6p-?*mR!iS^~bvXeuPr(4%0JNGnp4wye
zYflJ>^R96?<1W22IhkOJlb7x!+BSK~l4ijfe%MM_R``@sbvdKUgoDv3K}{2#^NFd&
z@`KKia*L=iHiD;DOkw&AQeAzc(e=)xkIgJI+^L at iZR4b_KF!lHqu<zLO{bU1R5-je
z at 8{#L)_s3h7kS;<#ZCyhL8QTed7h72byAxg?xuOqg)uCBYP;NgZ3VZ=GpwMs+_nbR
zNV!T=&rV$E`s)tD{Crn@%!S47v^uqi+RIfvyzdNBNj>;328OV#k=Od%N!n0kCW9{d
zX-S&s*`-Y)z&CMJJeSs5PT at uzo>b|ie{-|+=2bmdcZ>~Ne$6SA%V}qBYiqV!P~9dC
zbf4AoZ9DxZu&9(QO%D<#V at rx7kd<vDZ?#ZYWtOvDcyMnJ4BKNz*_rPtGT(IXlySfG
z8j%;Xy+6 at v%{6xOCfc3&xI}%Lg&X-FR>WV5#~bn=#fUFP7mXVuF~L?kWo_W`l3%r5
zwXC^x<bcqFCnH*47!kwtKoa)DJy{q|rI-h80n(g}H#U?f=`Zpp+|o0u?=U7#NjP4d
zvS%?242gOHZ$02n-X8hN*eh?0acu*lKrB>zuVJt1;nn-h@<<U|wcWQOd!(VMOj21R
zJDd=h_~vTZLixIdp6IhN$#TMjM|r`XmJbM5MFeu$C`yPY%WnIbUk$UfEfB@$jCqbB
zN*yyLJ0&CUNr%xVC^-6T$Gl@%Po-2+q<qlorN;5Hj>lp{No44%#GcsuGRs-yz51s0
z*B_c-60CJKl2EhQu!~A>`98j%*>!Fjkra26j~)Xl57IjM;aMf8EP9-skiybSDpjBR
z>!}AxvAdx}oQ-UgVfT=nF_h<)wcpzH2TB-fknv9iUh-xzuPNQ5WO>9OQSG9U$?$A<
zv36RKe*FTB%8^?iGjc_Gc|%V0k-y<MzXD;7J?FXK^%Um)iFO-i`n`b5g=9tt>D@^*
z^N5J(q7lW<-*-IB^V$-rKli1vomyPo63!0X<kag_pIKVp&nZSbXQ^xp=5$_JqJH~<
zc)QHr?$J}u4-_wWW1gy2K||Ip%R8we-BT|~F6toV4#j0Xac4kX{cs8Mn3Ah+6(fHg
zUkbC?T){`H_hI)CX2+|wo80rB at yTO#UTGag*ZVof+w1)f&B7w?-1BoxUlsEJp3aYE
z&SF~LnZ9O+a!yF5&zC2AMMm@<FRj(VtGlK51VgZ?{gjM%bzG$k3_7hiLtj_kpP9dH
z0Sj~5*iI5-U>UzfCAnK>AIYFpC73pCn4?CbR!<vowfvICJg%PWz(82ImehE6o$LVS
z!e#!ssB1lE8LTtdPBJ&E3d3QfBT4TW!v at PZtP(6s^08n}ZrfU^bxI83Xa)LVEa2wc
zf?7sI1x|(yrxb-qkf at IeBw%e8BLxKv_4cpKJoCSx2cA?n<sRLVy^p%)7NC(|9VzuT
zBFJk<xV5J8%?go|3++10KybN4a40;KTWxXtmcWfGjy-4FYXb0SlBkb at Z;0^NJnNDp
zgJbW_6_d&?ccGZiJsvm}a(39jGV$T>ysAuv%dQM>;uPifbQF;+fyJujx>=~{v^6wF
z(1W at KZg<glUKx%vPP?(oDfV*d!|SnSmfNCS^j^p~c{eWLsM!J+g9DRg%iaVbx+9pb
z^D92OF?5Ak=|Xmjspz{|=b at pE7!yXh_qox>NcbuSG0^bqu*-73v)7Yt>Y^esY+}86
zXkW|-A+Wv_rcJ>ookz$_sB+ at o$Cj70dlQH1rR(94cSnwLRBdb4!6uVkjOV3v`uJvp
zVsQ?x%C!WJKn`?4BqrWky1iXVG)H1r&rNpq8pDI-iA^%rSHsoIwdBM0zJ(Q&s(z<f
z1Ri(u!y<Zl&cbxD`W6{4o#0<FOw3=UyJc)}M?(qM=G7~`^5GeK)_j2yj#mXG$%vG;
zP-vYtJqj!*X&=e9asR^0n>VduOLDQ18`HGlliet47;HNUV$r6YZ+p$n-ND)n!sX&9
z5|Kf at IMhH|Jj??j4Z3^tO%J+l2M=)rwIl3S4PK@*8*STh7(Bx52eNGb&XpU@)%{oJ
z8^R%|4}`sWP>=iUcgfAoEND^p at vzdxXWx5r^Qm-uCiWmc#&kl<<kern(2{<SuzkaE
z#IDi;=c3`cu>7%uHxtLLq9c at xO70?ZW-Wr<E54->7kH*|3?Ys?bv2Tngl0oVjL!E1
z`*Wz(lv4clUiLl at wG~f!fGEvMvfK)pq#J2=tgC~fL3kBwY$vK3buUzJ!vOCF6}RRe
zXb{T}(^Ou4y91XkN$>h3B<D&o`RKLnqtI)tnp&je-kZwPaL!@vDB5G%JX4e<k6y2Y
zbI!HP6=ELExj%lw%oisEW%4}EVNk#5_bm818g~&rGrbYv#1p7ZSz0 at 8?19(D?Q_1j
zFZJ)-d6_`r-EDl;%zfiH_Rbv5nAJ5(W%aq*Q4>z-o6mF-RcDo<R1bWiW8_q%=X966
zXKJ;s3nX10h$Bc(@IPWU!Zc;44E1wTc}MXmiY8i+<?@W*4JlP$*feZXn9COfCDlaE
zBBxsH)=3%$k7(d6GdRbrno^V5j1cm=(I3G(CqJUkx-LIm`<f+%c0s6eA>A<D%N4s!
zV#aQBa=c6Td4D4efy62s-BcsSMAIIR(8IK}*A=BlXtfvx3~lNgHxcNMM2 at QL#)z?l
za4bhwrSBiOs~2uj+bWs*2X&-}`bJ)wk-}YbpU8AyJkr+|So1s!=j2Gw?R&deM=?``
zg at C$li5y0MR9rb(lUbSSaz~@N=v+Mc at f2&gfK2$ML8vPmG*IrrQ!<1XxMM4;$%f84
zK25$0uy1wNBdaM^!{n!0pN+BN-YR0j)zKgOFuMMz!qHkb$`$#cnh5r3y=0wOTu;io
zdV(p7IN`*s1QPfqKk3fh at kp&II>-gz{YAzV4gn`yn%T9yi<USqmWSu(Mcz1P;q9RM
z?A6pFF!h{@u!;B;tm$1D#q&S1 at 37=hNnaK<xI^BdG%**_C+=Z5<o05vSoNl#yn}~0
zQkSg at qGc^>`tHn*<r7lL_irxk1Zc}q&~|g#w`$C+o4!S4_GGp^fbl}UM!IK(L8KdT
zV-x>cj(mx2-0rn|_Q6i;_E5 at Y_1kkXY!_%kC@#Mi_F6U`>b21RP?TPh?0tJ!o#%!%
zBeu<Y|8iTf>4&NM{u4x9(~%pU=l-Y?_sYE(MJQR{qONS^yi39wQ(9iRQw|izirzTf
z_MJNqoXh=i-)`A-=|xZE>@k;h<n_>nksuvC<6!N|0n|y!#!KrXE+nnj6zB8zE9*9=
z65fx?6AnNa4Jf?~p3f^j($CY;?#-0kc`N2=EYKAYD$zP-VtkIGCS at tS;<B&$rrJ^4
zp;G!(Hz*?x-eoP>U_eb&Qqa$4tc0uKn)$W<Aae6t9CX%|Ox@<o^oktaKJ^WbRnvC+
z`SRMhNx_fDZDQmpUiNdL`qRu`pKHIXT9_MJcr4}nR4S#mDnqj)uw!tft6PwR at 8Zf;
zb7Hufa$LhH!)cY^{Z`@)rUF&Rl^i+>iV(Fl<=5N7CopsB(6qP)D2BngE0t$msET<H
z#Q at vHpnyOSWs*aXYQSlYqq_4|pb?h|q1&k`tw!-pn9X$|{F9E91Q|qJIZLFWw~k^p
zxF~3+ylm(&v|fycJ1zL){Vxb_;hQwK at pnjNUVoq>s=n5I$nrt$0^yOs%H8VHb@#dg
zNL;$nooec!@bsPo<FdJJO%*L6!>6moH|E0Kd_FK48PvX(9k}h4aV*6p=FW3ZjJuF|
zkMu4oxy6fpR*eSY09ixFb46U|pwtLSzhwLjP9@^t?JgT>QYvCAU&X=nk^p{J98y7S
zZbtbqnd#-NyXU at k++lbk@a$9_L+&*VHvw_9gy<8JRI(fAH-k9f)t7eYqpF#T?=Ck@
zQB9#*LKjf8#Lu}<AlIR#NTGqqVRt^9aw4Wtz;|)-?v{>Q1Y4g(1vG+>J(2yFkf?;Q
zJDE_uA3L>&GxT9D?ijVpPf-Rg$ttf1&+%JGNfDx5g5bW#@ggIJl{BGe>be-_wLkH4
z_Z3f#P*?pDrf6<&RD&BIDMFj18J!S>loCsXqox(EQd_w<1GbTY5S-nP`&qv1;5c-s
z+Cv#-pp)F0by2g$eG4&<Qemx#p|UOE6S<}mzU|e_UvdQ@^BKME4L76m?tY^MPPx#P
zL6J^4yda_x3&-?r9X8Gjmvbb5i-JvQlvf;Kqctm53(w%aI~*5IY2qYjtqQw36%$t~
z${y)^jB9li+BWiKPG0V?ZrH3MA9=>gqm(`&*_|0idjTVIy_2OULgxK~$Gx1Tcp3s{
z;`?LSb at fnRMUwK2sT6}-iPT81wyyN^TMf~9ZFCpiJ{Zrdwk4v!yMgWY%qPYf4sJFM
z&qNO{^8PGAFF#HMetk8JXPoM&4w<K5yF0tlSzfazvtoR^LfyG8))J!&kx5*r?kh9l
zX%_5C*^A4=gmQT-R5pq{5q?Vdb~;gu3>w^M+^CGEo<4HZH$mKDHL&u*zIJ?L8GrYs
zzK>Hq`$IcM-dpW6(@MxNZz}4fAk at Z>k!x7TC8&Z{e7$4E#874M*RvsZGfp2Ooyn!c
z_V#MThIUxWVCRNBTkcBG`3jp}rcSXRq`_a$_38`$U<SwDd2S^mDsuQ7AFDg|p|4OS
zS<zv8e<*cLQ at z|h6-6vOxEa*z0YR~fJ!y}wISrj;`srxl)FKJ^7vG~gn7o-?7PNbB
z(XVzi!bf)hN_ys1e`gkSoe}jw4ZPePJtYD9!NHYoNGi5LLOt%Gy}%qnEUL#LJ|p_I
z%xqR^n*N^7I+4?aY;R`UQRL=MDN_l!J7gwV(Xb-dw&9fPi6Mfhu200A;u*rx5)|9Z
zQzan}dl}tdOEjG%yIGg8^_k$;YY<6yhcEA5QcQE^PNO<3ScI)4yMI>cwLT2tLXlN@
zWmUnTqc5&4 at vcsGK9PZ_C(hn-lgU#n$H}0*ODJn<W2$r^q2#rBg|t`FewZ|Is@$5w
zW26t1Z>|FwLgx6<uMBvZ<3<%<$YC at RHFk}ji8(MeH{HqAyrImO`2r(S8!A3gOzqr+
zDtzw9-}@Fi&m<(g!L_fLL}fc_m_BUvo-C{&xxs7wgUJxPox*UYb7q*blcGIIoiFe_
zWi&N``U3U6m-iRoYFyH=@bE0t!y*jFO>?8 at QWDr&^QZutWf;mV-6iG~#rN(OE)z$p
zitszC<|x+$0yp4d1*`-^IGU$8<dg+Zm!lIDJf(?KZqS-i-7oAvg(Ta1$6tGv)HabK
z6l$-PQFM at kWkMGu>c%Y1X|KgBXR9M;HvHVyTC0u&<DiZ at Rg#QuY?z#sAxrPbB<}(i
z?#X5MNi5@%)y22ZvIWVemuk&;@<xfCNx5#}Elt3wHNUueJTosG<A2Q{5J^>;wIlsn
zJ5frUDlRu^DAZw+HhybP=+w3KFi+f}&}#s;#kxE*m#cZx$wi9W=56(<kS<P@@c{uV
zE>mq{gG(d*=~Amrc(7s6BEnj4xhkdkSzm{-|BEqs9!C!<Wf`bomv(X4%!<l5I;p;B
zs=pNPhlc`umZ4dZyqC*wFH=}tGdCxP7clI)zx70MKV1;k{XUYLwSV9ovjc+?Z{^9}
z(&1P$A<U>b1V?RIJZ(a-`lQ<iwf;=UX!>lc7rm~1CVc9)qSE6={?#R=n3<QyCyRCl
z{nsqI5QkR+?k1Utd!=ckVwi at mD_!3~B+NU92~LYvd!)&qYEpY9cd?0{+)qh_S at zL>
z(y51zP(02<ZIKO{ps at bR`AGc!goE94%dwKoT{%@BT)V4Yn?|-Qos>DxtF=ctAJ<3F
z5VJa)-q5GmQk(X#v?ats4by)c5FAM3eL+gAZujYWJ*#G`PBJ~OK^uHt01+`lJj;h<
z4u&}=qeg;KqByoUf%iBjhGpWh_g at r<c68io!wSDNZE<#AG$LCQ at lFM<ASPU$Hb1h<
z0nLNwh(kK41~%7kQ+7iaSRqJq=ubxPYjMg~+zEZoyuTaJDE6%L!sz=%{IccnVVGbW
z(SUtrs2BbV{pQ1#nxwR79kkbQ){P#0f|vWIhKB&k;Rv at 9!$HfNtkO?i2FPG>Ey?U2
zz8|xzs_A$ZHYK0<{?<dmwS$eq?TPG#d)bXL94Bs~2kQ>oljn9*%%b+UKP<E!tjlb7
z0Iy3mBkKtvRg?4>F1lGs9!m1{&!b~3-JS>ZOGGSdA%z1QkJl}9Fhlsrw^sSFrGx35
z`+OADBvPduuAIW11+WLCqz;VP!yb5X^A`$e8dweUdDs(A-zRdOYDgeLF0ew{v87$j
zHl^?KpRPwm=QPB7QuSc&zN#zsJP~H|=7(GA91}uyR#?fXVb(+jxcX#o37a3*_E3^&
z=5F%Hhj`tAzf~)F#m*=ppS~AAGzBwIl(Y2`Y*+BP=SvwvgpM4sKG!{hIF`^gg7 at 3a
zmrAc5JxT22Vt3ly$5^cQ!F(Msi-9H<mNT?2Lpx};Vs~Q(m8KhiuOAS;Fg^F$#ZyD4
zww*P9b4uwgyHrWo6QyZ?BZ-lDzRjjgI=@hcqr<(rrVrsnERJK^1=g6y4^f0pN-&he
zU$5ZDsHe}DExe~&Zw$k>3SFqwAhvwpn7a*u_#zOr);Cxk;D@)Txf{~BOLh0W7*gn)
zjI6L}d1Uz36sy$znC<q20V?xBz1}#6f&S}NWOd}Gx&1*yYZSLDw9-eZ9AY<{bMQt&
zHT7B%3FOhT<+w5%?_!4(tFRroU)D3S&VH_M?$kO8*XC`dRvcEV7uY9zvGoF+=ss=4
zj95#S6uar=lvmfEckJU-o${0;6GpC)^`O4AmJL8tqQh?)S~8iLIbv&h>83ZKZ)xn-
z=`se>>kaT9zCkb9PegtX(OwG0de at awCDkZcaa#k0 at QhO}^f~H?CC(YK8}B9c*N<ze
zSDxfNsOC1TG(0B1e5#4ORrKa<YfvwY)`NacL9^bgW#XX?k$qaMFBrrbQb;{uj{B<V
z)#lTkc2FfY6vJOX?Je7Wq0GsJ9^XbsyJA;1UN(cKZ{;CqT0=3qhZv5Uo|?|KvM6D5
z#CEsZ=0w9RxUyj6cH>sXU8aMa51QokI{Noj0UWwgbdKXC&0Zv{hn`lrDc<{|<!-#Q
zG~QW_T*(3l?kU##5m_(aki_sm^r%E~y8Z!Sp}WLA9xaY6ZwrmM$Np}!Oq>@#hYd>8
zyV1sbMov at jHze4X25krvx(MuYn6-nBd~UQ^5YDpM!A9a9U?C`TWrSuhlBx+=IK<<e
zm{m!q$R|0;m09MRmLV*x)SG$q7`Qa at CNGCr>+PeUzk%bM4ZSNYm6JsjD8r#^siK--
z<!w%a!gA!u8bMk2p`_3PjuqFIMR}6&;`UuAqtiXb>S(D7vP_u--cUD=$~h+;X}|+c
z<R~+o^j66b4b7>z`=w5aM5cfnD->1)m76XR;j!rcm{;EAV`ZN<<8#!&1QoirBr77D
z>m`?7*G_MpjPR`Phb?IwPLJoaUO8dBFPb-{L%=#1mTtY~coK`*B+fM$md5H*dNUL=
zbKb at yPTo**H-2}E?DeAijMTA-D7q*UyaM at yngLV{oMqYl4)&qFPMF#PqYg~5{dsQ0
za?N{%^wF^b`*2AM2|aRsVHCo!cRon%Z?>=#GoHSKjC)MyS24sbj7KoIiA#Gm-IP6z
zrN2H6CsL0>iJFGki<7>F#<FG*vant7Qgg-o9en8lE%tM+H+^N0)wALWz4lb_z1x#(
zcOfFGyzG|`-$Kb?f~VsY$ci-t_bj82YYyJ at j?wcl5j$6po(tg$gx8(kRJfdw_qu|L
z^|I*k%jZsX?HN;@m at i*FyBb at -f2vhj9`jrTYvG<$oaeFNH7rUj7i at MD|1CEIcIr3e
zk@*~Cgp$N(dc&SLZi{^jJ$^o8ki?Ef2d7t_qV|5tw1HWZ7rN~E_ZGJ?QmgU2CIiiP
z=tu<F{TPs&ADvY^9Al}EW^`2Ukhu3w&e*8^UD1nJ2ZJbyPWecyY)6^)8lTf<k~(-+
zzKL3xtp`z$dE!=WDoWbmug9ny%-vy#DVJ#(EL%5N^`xeEOTL}bZj9oLU^Ho(QLGrr
z)%Ip2LuszzoINJwg@&ilm2g=ty*-My_9suqI(i8JcV4ERV5~5Ucaq1m22Tc_CUI$Q
zhH!AGDW~{A{F!>%Gn|wxTrkDuJauiZq8n$;z^{=YIh-r(w(rg-rC4)D+<&&J8FTQy
zd0Jv;Vd at Imy;8k7eHqHGqpYb0q~fQK$-1vs&di)z at YFRj<M@|Lu)Z4-3^#tzaq>v=
zI!mU`;H7rw56*iU+UJbqILl-!v_5 at q>v&NwG3PO4-CF#H?z4|dtT7uF^*+shMBtB2
zq@!D)Pd>Jc`(E55UJT}#`3lUl9U?2)u~B>0h7!R85{FEiIyUs`Aj_NFj^v{;3wAyA
z3gJFc7L+7LLG1d=`5FQVJfoMMx7>8Qp4<XqY)3k7oUW0$#Qj+Po$cB|u___H6`y;C
z<JjDUBvWbF(@UY6E1?&VXJqye3ry~o at 96rd#2keRmVU6jhPKMb at lI!=w5XE|g1Q@?
zZ2Yboe6Q4BzT1^|#rfn(5Q2^L_QTXS=p%bQPh^*veQ2whQlXCz<Gj3VwvCI4GIy38
zRNvkXT-IxsLXc^IFUFxVPIq=~f6%ugp at JO?)D*Y}bKNZ^#<wp)4wf#mLBHx-+CG at 9
zgYp<EVNwxBiH&Anho?T!GwQ?aq_f-^aE4^jnszOT&ncaQD!IcftJ`1(@AfM_=bGpJ
z-hRWiS1?99D_e at qqErtiVy2XiP1)Biha at zr9<o!S`mM5=8#*vaI8SB2&PDIEF_n9(
zL9~QoNE0-%*MX<1`kIN}UM9)v5xsgdv+$y9a|H!6SEI-r1xmh~w~sT!<uX}+%hLm7
zDl6JL#0oDGwrPg<5d=c5 at Kot@_bzoXDJiApWZ`0WDQq1LSs<bt5;&FUBC;U934 at Yv
zDDKz7^wIO#a>n51k!-iNr*o*_G+{2}DU*!f`GCzz*LmZ9P{44Prf&;M!G-stV at 09|
zI_e%D_8B|WRW$S%+0puXWYsvT6uC6)BlKXJJ8rP*ywJyaS|EJo+#}dV+o8dv!-F#i
zE6uua2_^LHSnsLcRY69XI`bzll5P>t2P*_y5igKr!5%2$`BJPs#9x3#Ow-}j=Lv(N
zcWg-NgLCPSI!XO{I0=?q#;x4vg at uDpSt?R{Jr6jqgjW^^(=R7&t>L0{KD4gtK!8u}
zE;+mBQb at APX=`K`&m{YJ`<0fv>QvAZoT2-3cUIW}>(@J6V#1HvZsn);l3wBLL$tP-
z6Y^QzTAIVVS?ilLA$yK<K{`SD$ry6luH+_+b_!LCoa!^p!<G{m+aeC&Ol1&59`BxH
zuRsP#U`t`rD8}i!^Fr&KjFH%$X<9)h^HNcQmhFQ{Z2gL%%LfBKeN<A9;x4%{H#J3E
z7P<=Uub;-J?O?!0Idr2*(i<6|sXH|icT9D@*j=t;#mHGI?9*h)w+=fZQ_&abvtVw;
z$qffVz#mT`Hi2%|$KkMYb2?_7GEH}|x{;LV95}pXL$QmyUQ$?SQEW7Qq!UU{m$QIH
z&{O^R-q7pC*>@$mq#fG1Z7f^UTJqAgO%DiTI0L#R-(m~gyl|n%al=|x%<G*j`9`hs
z={b83H^Hc%PA+E*0b>PSTLs<Oi<yS$TSz=<#lkhzaR={U&8|7mG=@>SbC_RvsG&QR
zww#Ej|1JZbddJ0#REd$#YGU7Hn5POM;Fk0XUsY!9xc9<4inv=BhaPiyWQ>ih6p+<&
z6a_36DSF^@BjX-ajE at DSmzgz3zSNeMrkE+FUJYTMq%j}ml=dd?kZlZzZFF2t$Q@@4
zy+156e8Jczpq+DgY;^!nSPpveZC`FKN1y_q$bGoFT&ILLT|7m3d>=G+`dhswSRhu6
zJ=3!}B}^}`LpCP8Y3nrZ at i9cP4kZ&-O*-Ivai1&9YnnCqDhqqU(k)pS-`DBy=Y6w(
z9Pi!7htg@^O!bB-iNu>L^0kIIo{`L|5=u)*FR_{_8Jv34!E?%KEqH_BWA&$pNqYB7
zX(~5$vtmv}Obx0Iy{7Bz+DLm|C0ER)yscn$(SRAQvXGSXuS_BJ%%4SbyK=dj6YH7-
z77X?%3e>;F-O%y!M#)t^zCFH)^<A<1by-(a-MASODQ}%C2&G>OM8+#rzgL&DjP6{;
zJ%pHZ*er4Tp-^6%p8hd&6t(l4j1zUnBomy{$LX#mjHFlf-l1i5=Xnh&8Y!y7y2&vh
zZ7_<uiZM*r1hwryAs03yAtxxpiRr8AA#oUSqCllGR#LrK>a06{BP<n*4 at LQ^3oVk%
zIqNl%!pJP_b?cpsZfyl`#~>QyUh9QRWXSYtO at d{8MsGz+SXvfssM4=0x#aPbk6^@A
z(Yh<VcGOJd-_h049;&|HaTOE8TuDu at MA<Rx!r{Eq6$WO~XstSbEdviEQ*PBdeJAjL
z4E>N5x9+u^j~&(|Wyd3ms2j3~Fu|F=BZobgiXKL*<6MfIRpljqk=&zu(!^43EvG(_
z%~3hqkM1~q2?t7Jf#xxXNmksEQ<x6NR3S|RuaW&E!1<g?c4UZjCoG1b_)6T{p5&f%
znNiGQm5c9JZ{2w|ih?d$V07=PSzlWpcR;}NgT;=nm+cET5B1ah8fgz6Kka()fe?eD
zVfd^;X1n^FXL5bmE$_)fw%zT>$)af2CAFS|UDITKcB6HYu%>0$txJJ=;k6uZFBUI0
zCilJWGK0TGcAIG8t%3BFlKG83*z<s)2&SCWQ^HXwxl>3d$|II}jsRogr)X*%nX%gB
zE%Za>)xkB$-fxh_`Io6>daKW^T&P!g+*~cyXfaW?tW7nGI2N`{wC!)}TD|FDrOA1M
ztJJ@&b>zgiwp%W9Z at OcmF$lJ{a5?6EOm%I`xz5BplDQYPZtrLWZ8NRubjq3yV1|9Y
zj^EjK>30&{>~&77+f;&RdCx^qGbpe7qrK$zNOil8qHzdsk0^wPhk=&8mGQufAeX)S
znwixTo{onT`_*laU|}!Xw at Kf;Bg$bO|GEvUih^!YUVVPg)Qyr-L0}b5PJM+%!h%-!
z>GKv^R}ynA0>{gnXFO=bG2X9CghtzLD9<Zj3bm;5fB)=+NTO4Xz#nNsS!T-QJqrck
zHNl)-eOL05gh7ieMfJ)RKb(%WaTIj$A?M6K`th=B7JeLu9(~C2 at G1{0GX~k?8lQ{>
zifnALJ<(_i5k5Ky4Ea?FelM|pqnUz5<6ydTG-C2CeN^kl8%eLd=yY5~O%_hAhg#<Z
z$y=E-xFljL4mX6$ulk(n7gb?PM@(soi#5JXym{Tp(axBnkalgBsI|F?Rg$!RB&VXo
z-~~}a*5I;nJS)_f&Mb58S$}s<L1)fejm>*TT=0qF*9h(zPoy}$k>zw7 at lu~Bi*}_)
z?)CPiT6a=gh-pfmaH(0uIe5l<{eD4j#8nm4ilW0}j=N2*ceA+q?z5K`LU at 700I0Cp
zdtU!mp1B%@aR=o5)`qA`E2A`vvijG~PC8GnV?>taw4W*2y=I-PmJ%Gl0>3=Ny*5Uu
zS%bk5`e?!C*~^y~J4FQy^IIgE_QNYe97h7QF%wHKb6&|(-{p)}l%lq}!{I%MpTp7`
zoP=MYew|x;C)K`qk8ZKot$Jj`%o?X|H2*=I)|L5Vxv6vYuGPyv!vf{f0>+(?XmM`q
z0+;^wZEG4c#oLE%QNd_9LW=Akn6$>KX4r>j4)q=flRVA7twK&?qL776RuE`hI|4CG
z$#kIP at O&+ntQ_Baasz6 at a1xW_$4)1ccSjRpwL8u|px;eRd{7}1p_0{qjhW1YzO6Y6
z2Xmor<!l=FA}QL2Wp1HK1Ub#kY`D|M=36?uk#F}iNp_!3`!MtI``O=x8jmF<UsTZI
zk-2+$sg>v2T?=l7U?GVWzf^_Nf}jzLOX!o2S?PuGn;i&HwpdeNoVa2>kGhLYc%70P
zy at -R&sMxNU_x&p=N|8K-09%_VMFXz=rL&|b?E$%Fjax_=X|x)t!?j36)SdP#yzQz6
zOq5k+o%F%-gwg0b^kZYiB!j59J1GafjyIx8&7<N+j$O|+h~7+T`#e6^#JfnveQO}T
zWLlS$7B_3s6%U=kf7*gQAE|0Su>k&vtv`qDx#yAYgVf1#s*4iBNe-$p!^3akT|IAj
z^<}i{)JUr-Ts&%9gjbhRHkaXeST-VVH1~e(NiUw_L^@|6nSF`M-R@!0&}4}d?YRff
zfH|tjEMtkl4_E5d5A#j0WS7nNA2QND>)9I;@RrXdU97vyJ=UqmDZsQ9LP<_H2&Z+$
zO<woDQHbI6icQ%PzrTs!<LPsYYwsQ`Bun}Y&>7qzxFgV|%@CYo*_I?(eLq{nXS>D=
z3n at a3x$c$sQs?{!;h7v9D?5idvvfk|PQd}(BjG2s7EFUliuNPMmPwSo1L`BvulyK2
zk1=CJFBX}Fab_SgTuAM(=6q)&#!zPEF+_g*Ft$rl%*i$!7#J!SRC3dQE&wCH;aHD>
zHnJO)O@{GS-Pso|W_GM2HQ*lRG7GIbP7oJ&XJSHZqB{cS(Ve2L6#djmrFZ%BZ!xlb
z2sR013AxYwR5M6Z)4UcuoBW(k;|f(zPf_<yZ*#7euqi_Q7#Xe)wV&;<QbRUR$Xs(m
zSWZS)Sznekwlru5T#(z$!>MCuguSWUVX-0uyL>@1%JH#Re;K7N&apYo5??3dh2*uj
zv7y4(j$h5Pjlqj4SOj#kN8gX3TO#)EdFN&VtFH6tA#Djm(2UKXY)SnDg@@_}G%W$+
zP at 6<i(tc9H1NlAYP%<pVOXhVNrF2$nB+u-aEW+JjuNB9&OmM|4-0QTd at v<U(H7I5O
z<d%2Xm9E at 7Hi{dqOnM6~kB}Uj-|P<)`#qO`b*?dm$_#K6HAj+isFu8tE~zewQF2Yw
zExC^{t4kJL5x>?QmM5~<xY)Ro*;tV>nHGTm?)qALogod6g-(UjGh>- at 395SE<CmUN
zwn(=eI&n#XfQyyzhZrvzJR&SNZ@#Z4*ivSTfgW at OCBTc?GqoRR&>6 at 1@4!k3VS7f@
zl29A)?I#%Ab2#Wl+|hdUDuk}bS2Q#GV(cP<<K;Cj6vE~11Xt()#0(#$UFFr>vDj(_
z)2)p0i?jkQ^=S`TV9LYT08|Vv27EXFf{}}Okr_mi3Zn39^ym+5)`!$otC=`M4A18C
z6-zp6NvqBU8HYF&v&To0G_t(i>rRMy?RP3vadFpB1`+upT5y%3n3Ct|PB+!1&M`^Y
zt&K3^n<J)$tX_+hk+j_nP`Mx~JGhNti&<g%;0jKP+=?ZWaic;PlY1f|5d*g}bA2*g
zc3Ov>O6Z5X5hEUVvcc)=!8KH}<rF45#ZKz554Wo{*7!DMAvl_p^gSIg=^8$igOy{{
zTpRiMS)#HBwZYa5^^HS*drC)rTD5Wgdd`*H at DI%ckrh(z+7Fa)ay*4 at ki2SRg9<z*
zn~GIF7`U_S8_#kGK7LrIjfGe|n=?X44IfT9+R?2Ymbxh=P{88Ul*2;B7uscMb0JWO
zeT2B}bqR`q8-m}elxBM^>NA#-s;c*BQzCd!G`)>_bz?5(VfZIr(dQWH;fP^VkVV=T
zkuHR{)=m`?_PC?wb>(FiL=-wsHBepObFYtZO@=e^37{mUn(|j&a9ZK%6=<j8dMFuN
zZr~%=k32=vrnKPz-$51g_;K{={TbU$e1kof$1g6}UI@)SASbY+6<*3>w<23&?0~6A
z*BCL$FSNPLWxC9u9(-;@+YQ0S&J0(vz5(P3t at GIzWMz@1@$9Rp_DD56$<yk6IiL`A
zLjj>Kkburf1`UtObt=CYvuP7Y-m4BjgSaT?mO<cdW|x;+S(HOhOws~-F7HG>)QN<j
z_%%w-BWtJD+f*6&FUnfN8_odDmyt_#KJ|<0`)#*1-rDf)qnCul%vIor6twdl3~*wt
z7A{qqjnnZ;=n}&0y{n7y2UqhST$6?7zsZ06;#t7k+X1o6deyIcA1|FP0Ml?)28)T&
z?KRxmdWk))ti$(4=|#Bxs`16^8EmSCtg#Yo<5Exgu?P93oZW2XW6JA~9-KQSEw{Vm
zc{0B2=&;Mfdilb%4{(9Cx2!+$d-*2D1rd)uo>tJcyb;Yu>uK&&GyXFkajvBY+YN67
zsEAgJ&Y|G;7=8e_&JAuG`HS0QK5laX|9-FSF+ZF8xPRr- at w@zY+#X{g^J#lb*EY7Q
za9^pfNiELP5#8+V-O*mXR{Q4xT;XuGvoht<w(TvC<tR4Qgkr1;?!EEVXrQG at Ixx`-
zhGyB2VwSyf=*BHKi=*R_$KuE~^b)=iC}K;|fHP6}JnMSXDv?1J*P7{L<2U at X!7O_`
z{KUcJ(KoTKwALz$Vx)G#?6HqgMzzk6BqmlccwABNYR*uNLLA|cdbSyb8^n=403#6@
zZ~a7+0d;`DW{c<bt79Dz@@x?~Kj+X$?@1o&fQx-^a(wpKGJ>PqwtBY%xiy}<-=|cs
z3$t$#(khO$DyNZJM~3V3#>52*?uN at vdepkjp@QGwyN0nIZ?|6<wm;c at m!LLm&^<No
zjDam<EqqwN>^Fou{;)=C_^|l}?J>gL&1;zoi>cc|i2%ESrgC$U$#@0Fnj}S6o#Bf)
zIzO21g`h4iJfrB!MF(9S${`Ux-e(wshU==GG(f7>#jAH#?roNO$Iw2tAvfbMllD*>
z$I}~WJ5a?OldF(PWAEsHejYJl)@(8&d9teRn~mg_gUE=8_|O6a|DnkeZXvO<=218U
ze<906+YK>`n;)K^W_Lfp&&W!8l|)IVd8a@|rvrJge?{%5JuU&Z4_;~69IW44 at p{`o
zi7sllwj7TY6lG)^k`Xq?ZyK2&IMcW=+aT7?gweBl$~liM&)L6ZS?6Qx0<(34ALTI7
zy97xxnpItRfUp+puBUphV2<9 at 8}q9LsM50pldwXwqctk-9I0 at 9(gd7O7gWh=^<J)E
zY6QJ?ExiB}9V;e at lGuPF=4l|Y8LXQxty0tTwDW4^Nx0Ikl4ka$yj!pCJY9`p{&|;6
z2fvjDg`|I$Y}1DubuyRv*9j<&impE9q|wFlM7Fs~B4}7WMvp+HcW|Y6tf5eAKls9w
z*vrXt-G`0LyyncZC`ZQ2GggW5U8r<E<utcwxa{F|C4?xK&bm;E)(E+!>u at c~PG{6m
zWk(P^6|>-qF(9WLSSO<~9nFRB)dzWB+^BSMDyfL9xsjSGj$H2PiToTes%2ukd at WM+
ziO`9n_?5j(MoxsKfLznlRKZJyN!l07jZqI9d=WT;y*TL%#-b2}+U#g-c<lRquD^1=
z$#bzQC=<)W*Oa=xImGxvQURZnx+da4Mz(Sr1IqKWQC)YF7~d^k+`+m-+DdJaTJfqC
zYl-NcxEHD%0}=LCW+mk2j*hn-MgAWEPe8E0 at ut)m)WqxA=fxUj{YVh~MWdF+ui$0x
zPTh5M&4D?kNvP61wi`+{aEF_~iS<aY#%X|n&&}R`Z*lp$0E+0=IDpFOoz*cL)lIxX
z=G7cr1t?C?febx{V;R1il6}ld9lTmhd619J84)%%Fd`p$dehU`s?=ZY0y;NuOL8g^
z7--31jIsoA8L;-r;r)=w at KqEcVL|X6LoyWt{)srE6pS~xJ!yz6qy00?D9$MsWuko&
zqUrTB1uy_DQZ*|`wl3f7HepVU+=9wvK$^#>f+;2>RJh~a3<T|A#{{h8Qp4|wS<PfJ
zHkEqi6v75?RoZII#m%Yud0=Kb at fL9QpKY~!ssuZr at if+JPmD!S+XNX@=bNl&Ez4ez
zz*w`mlcSM5QK|4<Rr(OlR`x|6cTLZxCzf+YlWq9}=9Cf6VG`-YylS8$t7hSfixGF)
zRNoTc4yjaWh at yz4@C{(!h~6mOP2GVJ$ulu}y|o+ppxpGebp3dj3wS&`*rtFKWqaP8
z!J^6}hn)mOfF)&o9(Ny-qhM@^&NN?X;dsJXX-D+O;jQubYs5bdXS!AD`eY}*lCNHS
zrB^>+Vrf;$ABsH&8oHYRE at RK`bO7gqai5{r))%UOcQ~ccC1diT0*5(>yT6C`OkZTb
z8jl3m;u?-8VrA1u(nO*0oMj5`e4AEl_%)z57h*|y#%2cRy%Mf|y*%r(W5G9({u6;m
z0;<tr+3*cwv7a+qT6k|N=0ZjCKw%7pN|&uEkiVlYQrAz&3Mt9*jUkz`@a-{DWtq)y
z8G$aD1rinN at R_RBfsg^JY0V;KAz3(bMvv_{u6NhbZ#?qnvzbdx`X-{yn{D;Tge4e^
zq=dW at VYaUCm55&-D>LCY)z2Irad(U)_)fxqf+Iv9U+v`x%8g=f&c=~HAs&{#7Vjj-
zH&CJ54}*VOBSXB-3^Bn5Y0pXW=>WlvNktBI|37pl_KG}P!MCt>B^Iw|^*B8l>?jdY
z(R4(BJ<W0T5%0-J{TTK6g2s*%KKHSDwdr(X0c&Ml7-%&qJQ4}goip)5npZS(#kf>?
zixh&xd<6NnA;V`xu)M8ddUg`Sk~qRxE)RDEJfA}Y_5$5fndA2;Uud{h at vR9`!wyra
z){EuHI*oILB3pYao*L7fqm)0ThdvIR at x{~9&O=zmqnIZr%xdtlM~dsJlgFSE4}$!#
z>Eu0K;m&LW<5KxZ>099Bus}F`BXE$P5bU0nc?oK`CnB?pltsO0HE=9w0DC*vsBCT#
z!4i}QRXp$}^aJp?W0gd6kTwy&uwx6M9bw=z6JvLa0v~SPcxN}V0<ZS$pyDI^pcaj6
zEd+K5ENGbYVfkdZ3h4>!{$Bgh*BKs#O`@kGki`Qs#0EtYvn3i+t)xOWx+cD2wWx4o
zXPMuDvqb%=iYazun)|&X)97MP|0z_?nK&V8z-w;r!70Mdk>zwLT6H?ZqwNx$Nc>Gt
z6-k%|yrH0TUSKEvg%_2Ynpv55hGN4EE10gJJg)GOGLq%L#Iy%rew$X5`vlpw^1sSu
zzE~nsmdO7(l>%*=1_JB;^`+^Z;fU>d_UU*nQk{d1C#WZ=_BwALNvH^!W(VpeOy8&w
znK#D&eo$~?C7_cmkJD3_OO3U^SF2VsJj;)|henHNB34<GNWUk0nePe3uTTDh5s5tS
zJEhv4fX5 at a@!e2d4=>^Di&e)Ow}qs|p}>bKA<9*F&fk|HL7e51=|WJk;t*bugO*UH
zpz|D^#DRjA^{D7Q#6lqN5o09q1=L33xqFMRl1p at 6RLdC&<7VRPM*>Ph5FmrK;>}Ba
zf6kd;o5B;w^8{7~rc)FWs;Imz@!o8e*KS9jT}DkwB<`}nA8xg~4Qfm)dNZn|%%EyC
z)3JA4$7qxOy;H(%6QdjOrPd-5L|9Vj>WoHRnQ?4m%rOJE#g_ft{OImtx?@`Cxnqaj
z^L(#%sPAi67caKXWYrq{4xI?9`A~$boWBmaTTKTFZBkBHQf|Mb_ix2fL5cDm#TONT
zfX~kQpPlm`o$$l%tTg9&%t6X3X$wysjHO`WG~{MiPbOII{6-k>=L1r93AW=88Ja9S
zSeA<X4sKJ9x!+enhsxv3)n-n at 4M*JPv1Ledp0}GE=S;6nrL=Lg%Nj5qTPz9$Yi0=|
z307d6Ecbg?YRhWyD^(f+Hc7ER0x9T0u~@gctU0Qbo5Hri>2(~G$x**f>an0L7#9n^
z#EL8f7o_%Yt`hUi!p9|!5V%K{iPb%l>)>A3Zl@&&VhMp~JuSS+G}ywjOqM>QDM=kj
zwB26yI|XDiRdH}b40^9Gd^5pUcLCeil at Ek-=^WwieVohpIz|$|o*;`4g&4_q<mgca
z;zIC1_pE2t{v>UZ*TDeB5T!#8Y>zBADnF&7o6zYG^*Vzi3qO%04kNlVc%qOJ>WGZ&
z^y?4 at t(i<%;+DkENggjCVLHEgTGf|lUMYDWgz|Wb6V09nk;qT|4(8Z`JO2%V@(gF3
zSJ!I2Q-thbn*$wBbnvlsduFgw2Hl1nO7#7IQ<6ey1HDL*vfqKur$+RUVRA;Z58x$|
zDo`&r`I47qq6#;4hmSw;*Dlh9iz8qBEd*F;n)dx`{d##*J at fV6ZTtbfj>FD~A7yKC
z(Up7RaYLC0u=mw~(2WxVGs%8Qb!tZj?&Aie{{wAxAI*Y$IQoOFu8^ME=3%{%EfMqQ
z7?s~*Vx~PuA4MgK at a59+7vuQYe6e@sOGk}>@-2IOKJM0|TCLsSd<aar534BP0lC4G
zjN5KUgRMYJl7#RasO$4!tMG~LLlw8xgaIMfz~0JxyayREY!A|>7quZ|{jW_;U%x>C
z8sYyk1iwG>0D~;}xiT``nziq=hu(dFPU0sc!W&_Hfmf at 6Ay?kvTZ!izXnF67-)f&&
zpOu9G?+mc#vuZkFg at MNhr1`Kric^zgXUw|ww~H{CR+W7(Z6C>DWp6I+&{9VvFj$NK
zHr1uV;Eks~=(hIH1d%zxs=4dGVTH8r5bK$<O2^^V)P5akL-6Xj=Kz-%`GIOu!1ZfN
z{P)T2yY0=8-ZfLHDSCD2pTh&uea0-5mZ2=m!9-3at1jXffnZlq!Q{e+M+A&*Fxtrb
zlExi*oC+!L8-ujMnBOl)^~~XD7EgSN$>BCdn;0Z0-HCVCn5C;{h#$FC%EGP755>J!
z;6;0DKh)3TtHs?(8L1gLs(8(lsz8TLE`-tZSS}5Wo at smGpR4aGKf+!hX#+}r at t=T;
z%%mCJ%Hix|=EUzei(nx)y&9x5cWJPsQhhjYU_;Q>@SHj0oOd8y!Z)>DJ<3T^9D<2f
zn6FHGyF(jh(KEPi`<apx!6)Vj6s`7vC=N)d;e(IaFRz}{CUw9(khGDln1Yp8CCgzV
z=pcCFG_pn!3?7PN?=abTHnQ&TQqnrLOx*BI_xrlLvN-CKk7u>cXlE at Vd9ylZJ@KYv
zbWmZC5kM)p{?+ at nH-vW^M5jq$sZQ2LVD?m9E2}?F+|-67w{4ap>HF$?bpqz$%Jg?W
zHV5o;leRp-)BE3XjYF8wi0SQG%yDqNxoq=R&m$LwG2#<Q(>n{uO)G&*4oWI&5NYg)
zN6!8kd^ElSh4Tc)CoFZh?MfBM`Bz#9beo{S=oI)liV#Ra9^zf(zm>V}v|3*ehKhfg
zW>e)9Z~dziCrql74KbyibBa*~cX-QsFy9QZo>!HnONlGZa;<W~iI<F!`}R3%S|s({
zQ{#yd5T=x*rR(K8h8bCq8EI%AFCd8dY-O1bGdaytatV~+8=}^}fyh8f3;o;q#!+xF
zhXjKsZ`s>r_+d}u_k-pGAz?KnVuN2JGwW=tzU*<c_-eo5Zd4T2hVY#NPb4a0#nU-c
z&VqT)5|uoORPf`35%=|5bddvl{SFdndlD8WI?vT(&q`NYBg+VIA30A}@R5fgVqZci
z#__xfqC*%-c at EMOPPyMKUC)%cWpdsdxbZsgu+agj+ttqR+S9F%gGH6Nzp8$~7Rv4T
zbG+ohjPmEK4uIQN3rt$M3iKDcE*kh;CIqrQM%FAm6mJzwcdB}hjR^g=S4<&+N;{=w
zX>50-^~3=imp5<oUD%S(qwI{!ka0Gw{f`J(q^o6CPdVvfKQuP`T7&2zH#g;bl5-&N
zhK#awEZDD!F-=o=Dewrhv?X(VaqmEI%DAmm?RGN{dv$O;cE}y-E~mozs2K}&c#g4`
zdv>!!8&SMOavDU~WQv{3qi()tQ1;upCjE}ty7P{sAGi74Eq(ppwKz2UV`|IF^^|yh
zd-L$ZxVfZ=a<ul<cX#q6QA4qF+*&o8R5>q!bvi(R`XD;84q{pMh=W&A1pfX|qly5d
z1JRfQoupEVIrzqNdX`NfG4-=?Jzs}HbI9!xAKc<-MvriL at eB;8<Y+gT67wFqZez+q
z5<sok^<o7a5oDqAC5StMHRD+vbu6jm=^PQ@)B2H5^jO0SUCnTWYy1ZTBbb3W`K2{3
zLB+cDRw6k$<7=_hoMI at T<28ni+}%O!47e|F*=5#}uDCcoLL&;<Av6hVtn&@x?<Yo#
z1$7V>nE-zt=#=kzCF4noL@|Piu!$+joY=nt#KTJ}Ojvmwe25*-L09GOdc5lqAi?!z
zStdShg;OAWatI?0S7HA+*OJBzZBAY%e3HqNrehiYN<V#yn5d122unkBc&t3c9Zr`%
z>qy%|X0 at _w$5s`I5DV?lCfAyq=%%lDf{%079jDjf{YH?u_ZJ9mMMn4LDD+^+m}7%h
zd9_dmB2b6{qxM{D;n?EcZ|V(VM6X(Rf7V#h0DmlEQi-+JF`V|wL(BXX9S_^0#*cxa
zF6qL_mDP+jJ-*C}va0Exy94h*W+Jod)3>lCRzng4*JgallZh0=D5`8;z#!~vAn0~>
ztx at 2QC09oy-B9|f>zu$j9|b{qKPx+Qa9d347$7JU9NCTYLGL4wD at 7w1WlMY|Dw#A?
z6}$GfV$mrY!ET6vlcKj&tRpwl;WZgU`|&;|s+aSqkP>0W^%g&SK#5BTyD0U+hoeC+
zpQaI#&=Hb?2W4^fi*FfHrldkLGAHt10Am#+EMw2pk<7|W=^v3SD-SQF!-0t^{in(o
z at A@?J3N+{KahFf{S;-$z8 at gR1MkL}YazV;)L*-gFu8bKElF7MOZJfjF_}av}^>#RO
z2{9>D9nTZJ^>lItxck?<ysFaf%!ZMl6N&CeJqHTA8b_KD#j~=>k`CMLx)t>8{;t0s
z3NtIopBBQydQ8d6Y)Xp4#Wz}HFCy=2f5Nf;H)l4js3dg2`x8sYX=qoz>kysJj^;9j
zGNXz7L>YH-^X|ka$>rayEg4faV`b*&fhXXWV9ryfszJ#S5sZ)vyOB#eq?0Y1N&ioR
zmVWzq?uy3J#vz-P;Ays%DkW5sycrnm^(<-_pA=9 at A9*b2_&{nF7rLRPc<Tg{1Tc2S
z*cx`>&VQ}1mu(Ix4=L%V{<IEIL+U^`baEe`pJ^(aM1&RFT92;%>+Qy(v0OjN9&i36
z1=RL<sw2C`W<)wd{nRmk4`@~R$+8Jiy#>}PW(Ay?#p3Fl)E3BJTtU}=y|+n}+lM{@
zq<qYUbu%OGE4ch8S|8%g?ZAG`{}{%l*}19^f9bAv23HZ{kg^vzw4_QfP9-T4%IB~M
zZ>>?^y^#iQM7ml>AmO$cGZ_LU$4FJtToV^w9gmSPFZTj)3LRmx{E}=AX614=&k)%#
z2UrD7N~UeRr`il#3;W>dFudS>ZEUK;03)~rMLQti!sZZ_i-H{VIre+x&CEg~CRDK@
zk|RBQxrom=x?J4-fPl}>ey8WZk@@f7 at BI)`)tz(YyjqwwH{CF`Tc%6qp1 at O=B at k!d
z&-G=w`4cvG5w(0xWqFZd`2DGCg3s|iBJ8aiNCUwS&zB&?`j$B)xn>UFejyB_x}{AU
zoZGXKJL%d(v$I*RsTl&G_2hW(+QKR{u)izF%+3Dy6P{j-Q_$S{oneFG`6gI~GGdJ4
z7Bdt%L%4_vsF+u1jg4^6@*#pOohsjs7E#=;ZiI?DRja^M>LzKh;^Cp0<iCVW+`&ax
zDlAM>-th0?c87x_xD1PM`9;Sp$sv2It73(@ccgsJF!CQgSUxl?9|-T`E-CguGu^`x
zqOqOKZ;K+lxh`;Qa*8itGE8t+&G5!%p%t)a09AbvhfU=%SB7cDrfL@{3}5IQ6SL^q
zcA-J-ctl&&iqAll4+$^53dO<+O0d1nf*+y*fDKhiW10I09Tm5 at X^Dn30aT3wm_}Rd
zIkOjl%~fS?7w6^5`-qEPtH`Bd^N2_Pcmxb2?fNE%ZjGeXbBVZ@*;{nwGbWhL%I^lQ
z!gSBOS+HKizAlOT6ym$##aqjqEC;VDux_NS=Qd1S$k<b=u0Sx{kTlI2)E3u(yw6xE
z1{*z~cbHOs`;x2dL4qOu2nTn*`GcX1x`QWUn+rt6nS8+Gj!Pxt{0nX5R&-5<rr6b|
z5kWL34p`8aA~yJK5cVO{`rG<*1iij5%ma*$Tgu`bqIubKC?t|R+3?+8dz1d3Cdo at 4
zGo9t;T%95KBXw)J1;}@+Ym@$#D8d1+cFu+Z<xD!el{@VAa3EhCcJf#B>E85Gn3fR^
z=BG}Vp=-ovxFSGwDp|m*RYMJt3~)GbU--gF{X%g$&`R~1GDIr2PdTQK8ibR_jc4XS
zh}5o(=llnr=e`b9daJghE`H)&EkWX;Bl=gQajD1$WEe`9BUzUuDTyP$L_o<~&}cdf
z<9=1SZe-=oN+p at kf2!6wbO2Q4SGGxY&Jh5X3dl#H`Yg*#{qk(Olnmlf8+nHZzMJ7b
z#X+|I-FhQq&)8gqmDpIz`y08P%cUyt<NQYXoK4<nu2|k2!6PQcMo+ZX1zN+uqORqf
z%>?w9(^4ZxaGQ at RpU7gjx~qHl;nAcN9>(9~1_=k<WqTM%pJ}mac3?#-cwU+Ma0oOB
z9O<hVDL*edHp5ZTPpW1;W;28+wga?jtZB}$G#&{Gu({tErQg(Dj#g=<5?bl at P$lQy
zdDaqO#|7ZA)AVk&i>bhLodxXWzH<6nwvHy4V5#V?a9}gU{-(S-XNBmE+NrD1N}_Q$
zjy7|WnoQwXZ7CKUo7C_=u+zdQ at UIlQaG$Wd<D+Ab3}QRtG7h|xX=*|*U*uj_rj^?S
zpGqV<d_&)!Lb}!w0CP}})%j|$Hah<y2NzcdW|u_V`gb&;4Ici-s&@JIEO8-h46Z5Y
zSJzAcAQu5@@g`w`JwCtmq{+W5Az*uh_Q7r(;=@z=1U|KH888Gi<y at A!UXlDM<1(`7
zNrB%jDiFsWFu9 at j^&myBG-*l|TXiy|{4ktEn at WuVKvafl9o8^N`$pQi=|zSXBU+|e
zqp~N4v;y|XovLJ~XKg50*RTgSN1ef^6bEgQ;=J3ndZ6X%wmjGCA1^b5mNPvn+^?C)
zFp#u+&-y`@ulk-As%wzBzdc|&Gab4;1RB){FkX`hJ&IZhFGs@%dF1)^SJ(dTxJncC
zE;*x~<Ex=XY at 5x80e9&Ojyg}8p(k{OwvW0A=I#o-2U6xXga3h>;4xynPo(<N(0_<#
zX`fuZhyqA1R%l62&*E%mKH3d9t_bM^9;3oo&+*pRH)#(wI51&sM&=p!8t7<8z|7$5
zldIklX5A4c&jy8Yl%W&iX+dLv0;Hh+tGD{_H7+W4O`tLJ-+n;=R{N!NKDc{n`g`45
zG2g;{{M<6pgsQCa-{FR&VWOSEiTZ2Pz85eXwUNG`q5JitrhRj*m)z5_MMjj$;Qicf
zF6=HA#eyv&A_Y7k&6LbC!unMB2Syjq1U&@rcBhdxz52KXOd#X<Yaj5`U*W3%VXAok
z8wdO}^Z07l at YS4u4PO2lXZ$r2_-W|#+=QGzGbra{ibaNd8}<YHwYCkR+JmbY3EzSj
zgv-a5+vV&in2GBx?0b`lM-Z|n*1RoA_$8jvheg7N|0)J-Uxx>q#6ezIhxW+{a(gTU
zfx5g`V>DUQ?rOY3VPz`oC0?p9A|%O7x}HyphQ!d+JAuR>hr$P60r{U5kei9T(BQrm
z!Iok22`$L2?5U}F(mT>-5Cren at 6rq8yjC|;e?IV5Tyz~IWeoouWRd7#W(1Z&yXK^@
zZpsaeo>pp7=i^cS1Q2j5X0DSS>&X4app+#ii>6%l`zB=#*1?Sw5gjtPn?E*T)M_$v
zo%dH>Je;zY3c&&)*1t7?=gU)Y!})BJ1dF3jR@<8Qa;dDxc!dVV;b8*P+i$PO3vN0B
z2s{U}_3O%j;U*rvNGMJ~8|Ef(yYNGsfm&P0O==}7!}>lw!8s(>cwTrhvS8K0nR83O
zFR>K~{pn3A45DyGbFcMi#o!whx)72fpKO_l>$l)B at O^sM^K;|~Y`g>Sx~#w6Qm`wJ
zKg9M#)N$c$a_D&)5WD1Ox=x$wsyf0dmrvkDD*~-hmHs=vy|OI#fC0C4z9-$U|0I2T
z+C6GCRbjc{{E$_7Q at cn2Dchkacpj6wwtf#kgsM6LcJ4GXr5T|p*sfE+NvrNb at v1Q#
zfhj at OLPXA9ZU=(XC2W-0W0ByG(=r$lZ!=ge%B8UrLcPhD=RFPcg;wgaA{8YrI79`R
zfH)k4YDuR2 at UU2KSOW{-+;|7{H~qTFIlWT(6COy}#P=)y*l#mIN`ZANm`<+pZj8E*
zG3#DbBDa;~?ftiU-&+*|PU9DCy~PcWPmNLG^odYd=I+8kps-4se`<!DlT0_=W_xQ!
zRe%}ejA=_}%{rSdgW>jn3awElA9f1i;1HzXq}k|_QNo59a9Y~JT4q_{&IRfzNZq0n
zVFNe2s1g&(k1zq(v3l=H`KP&2OmAb0Sqot})TL2y*6rm9zR}V~JOXRp%v_|g at dM-O
z-o;W+CA9*j-miTw4sQazWT$H56a1jkkL2!uu_cT9Tnf?Bi&yRN$YZ}f8*6Pjen3}4
z1Bs6AUNGlZ;2Wm$m$sorMZX+ILc=?f7>AvX?@w54Px!~?r;;%l)3v0}H9Kculqlmp
zg%NC(HV1}~zIF1YISANkWm%sh$^w^YJ<IHjXj+!RUR<5 at Ap?IP12 at +>dD#wSTE__l
z+$<A%W(tII*-bjT{674oR}#)m%Y@@fB<S(wwWzBQOE59hZorNGplvMBedx^ohs|03
zY78Uu3sd{C;{R2fLukY!^#G=lqQt9;{b|~#hZXkU+WpYeh~O*=)(==wdu6~M%Kk-Q
z;~B2}C9AP%D5?o*Pi=Z)X1&PgX$9JsF88^36q6^0c at NS_r=Ig%f`H~(2w+q6bUO at 5
zT8h<gFLxdm?gSc8N$Wn`%w)TM>tTohxc)9L7BS`jNP)0i6 at fG0m{+QJm<7TRyC}vN
zC3DaEEem9Oh%A%_eYud=rIol<E-t6fgDTHY&&LcS@(p->mug`+A at e~3^j+2)0X7J;
zMX|-Fa@$q)9Q{0gx80 at tP(BIApuC-}=FcZumz%4BiBGctp;#xHJAx_YVsmZKW5_pQ
zQ&}F^-uR*GyTx*XzY>|saR8S0ILG;V0#cIR5oEq&++;oA;U=}c3wJ+{3<Lz{0?#xh
z9A|CpTco@&I7)rfwCw$Xg{8-IxdtLH##}{ac>F*01j0l{@U%B`%k_{0PKQoAC72to
zV`3juz_UDK%s+ku<sH`}Ef at IR%3JKHsRkpcrmeTj5$4l?dMZ-zR_yI&ga<&;0cHv0
z>M+HGSLW9$OV6+d6f;;Kj1cVqa at c4dX&4-QK*A4Xt-HZdp+kBH7#6dn!Dw^6{ek&m
ze!rGS$O`P_jm7}}g4`BPU5e1GHdIz8U`mEJ;GJP<F~nNKBig6%Aauw+KzFhO@!aHM
z7D0%BcO2(5O6C`9oz2AlM28@)Z>uP<!*i7kV^B|*ceY7$33Qq2;_;GG)w(($FFvLs
z^xkbuI0QRkHg5kV-Y%sc_MWGfhYRw<Ju8^d;<i-Jv2E#~j>*JbkYT_D46kB+7X!C!
znFU*?S%aSomaKFm!iu}I>n$TDrlq(0yDF+8YKihEjDNmN?P)o$^oh4 at 9p)m)l<%Re
z7D~f|P|?9fK~JooKYY<@AR9{xvvj3Nv`2!^;Y&vIMy($77;P8o2NB?+hZ~x5v{mkM
z+u|zNsL)4jTBE;HJ)1T;4jst`x5dJvna(GZdU%xk;Gh|iaW`&ys=)Tctd?shCt at f{
z2vLbu=^<XhY1$NRk<Yj}3tW=IOTkTRw=<gCo<Mn8JhLU<fI7F^{_oY2ofPG=ssus`
z at 08lyUknX3V>ngc-P<=D37RD2bw2q^wQRjTZIZ0IwbYS>qiyFT+~|+8dlm!`%>!){
zAdjJ7!jY0U<8o-KV|PLvIchxMOiUJ`s^hg1YgC1G^y#Rj_xV93bv4+!QL;sWR7>l5
zv#r1gy&oft9S`k%>ki1`EAHx{_SKqKP}AU<j7An1QW<(EO|KKT*cd4(;B07_Cnpn8
zoM2NBNwLk@^_P49RAtIhL9g^+_HSn$BgG+w@$$)I5|lNl#Rca9h$c at Qt}p<%;Z`aN
z%RFLbSeUu1B1BBoVysCjs=sTmlz-Q!rS0GNw2Rk!n*;-8)i1-q9$u3KfktAQH=o43
zEfdyvGVWU5>lg2fDPG`oT9iJ+DnNp0QQP2?*yY4*gN4vem|+W!K&Z402t;2qG$;f?
zT)P43#afsEP%7&u&B@!T6z?v-E#@Jp`+Ni-$fw+=$d4gMNT|g#lRX>`o=<Qr?fZbM
zSMr9maPN-4UE_%NF<%ek-nJIY&%Yv)V*WP>dKzCYE^Im;5p82iL9T_9VtAjEotSO?
z+m<}<Ckewkqj4xwU_U>6QatazmwW`_`c at C*Oa3)-nkf at u6NDi47OQZg9z7*0M at A;*
z)Oh}~)*fJ6HejarTfGQFlCx+eX^}nI_YoASEomt`=wjj1%p6=B({ib$M^m644GYEV
z7v9iJ5U)l-oTZTR(p~Lr8RyrP&5V>;TUPD<`95$voAB*ZnESg8d83lbG6 at O2R*RkC
z^F1JStB0+tebL_szM_8+tPMn|#m;r_GPeUdX;V+(D%9{4h6E4)GaMfZyv>Jhq=n;4
znaY1c<5>d#X49E^szDlrqU;w-qvQ+G9<u{0U}dcN2WH{NYlVGUG%Dy%b{;wgZ2xug
z6&K#*-AGs{$8H#8Ivqdi;LVEEpnkFo+#Qw7KvW5R!WRCCO?(+2-(Ix(PLUe19r<`o
ztFdsFFAK`9r7nR=1T+`T$T*mIj%F^nxZOI~o`l~Ur1Q|}1}tD#^cEaOkap#?z4Tj>
zU!|>CCk8pSa*V=>ibo#Qo>m%!#;OP8%#Cl}hjjJ!S09mKhn>~{M?_t-xx~^=OfZw{
zkdf7J1ML)gSiP}l7d94Cp-0wShYMM^D`4PyABnq@$t7d2*aSt9)EIKj`6Cj`YJLdd
z-ATaEV}Y}wc39Ud8U;SubF`r&gyb<K6tHP-aP)Hvx=r)<f0w?|P33*ghV<3G2w3R2
zG0ftGzqE?o5s?LNd23Y{5t&uJtszqCFGp1Bs0I|6A9HlO-))V)b3=*nHPH&j^m822
zpjR#5g at NKuIfXVozAzIgCH_QB>%<2W at qo`M&W(@u?n&d=w-zTrhY*{*_C=^3(d9{^
zP3tF>^^y87mbXQb>`HpGNuQXWVu-HBT$0=+6ac#1{_04fH<M>Y6xG_H6E7(K!{E?>
zyN>P2Vy9tKn(kE($C^QPLyefTSwt<5?()eJEV==!-fp#`a-^fAMT0nHGR<LPW0uq!
zR5O}&^`POAb9XyF7DB`m5Kf=tqY1tEx`|!PE30m-Dt4#A`zL{pqj*i~L at 0nkva`Nz
zUZDe?wPG!y%5QGg9 at Nuoe+m1{27xNRa}K`n-Ss#jn+D}0q3`+t4F4Iv4nYa5_QZSg
z6?kGg$OKcXe(eW&q`!^fVLEb_*6nu~Zu-+=BsP_zq!3VyX2;?7f!-PZL^FfCRW@&G
zIM9ypSCkwLaP9M~2`Q48TKHS!e0Ulaukz11{8GaY7Rb}tX$6Lw=LySdWmBB}3Q{IS
z9b<s2 at pxnmM1Sm)?k~ZOtlGx|B_LK}8(hNy&?0_7!z at 7anWdY~YoJ7OSY6);Ue_A`
zMQF$lHOPbAtb=5jxL5yVor_7s-#=nFIN<Z}Op-vi8w>|{6Ot%h`?7Ah;EWoA^iY;P
zUy`Xynu`)TT#DgWW7MV9%oy6L=CCajp1sJajRRQJ#OOdPTFk@$dua#L)=h-lS1nZ<
zf7Y$x+=C%mz$B$qHr6zGeU5mx!N{-JKD`L69Y51eoh|Um!hL*gSBTJWeo5e6DUk*d
z5`>#sl^Ce&FA6xWvv8}bsL$?W82%*~<AMXCef{K6$D9sSTQ8$k>=r}o{6 at vFYT7?t
z;1&=e+>+rlGYkdSd&05-c^p#MGfM=JH95GetKG%Tfk&Bf&2X=XL-$Rnb`c1zUjGX6
zUn8=%1*H@@x1gqY at 4KJm(ed~G#Fqoi;ji->!F(9K;D})?yrYA(xBrGSIbi+M6jb;c
z4J{~{CTQT$l$ofk3+SyAtynC^A(ueiiYvMj7=x{7`VEx0D%7mcASI7Y&)|q^BH9bw
zNk*$#k9`eFaRoz;N)kB at ld-Tj4?XCQ!m2}s5RNWlm5FQi{|eDAf+5djxS!>~CQ;Lt
z^+9nNZWKSMyS|E{2En}#vM;7I!jnuI`6 at Mt?tDhvpi$HBCcDKH=(0264ed5Q#D4wj
z-){PDoO(3)H at jfiHj*EIwymZuChtG`UjTwi1fR6mF-U(hM_+~y7=#IhF+xaI0L&Qq
z6I<nQrO&ISzDBz#7%Vm9<o!pn!<h*-e{Zbg*{(Y%Ms`<evc)0z;ggP1^}c*G+e`&}
zAO8qmYy at k19T~SjEv(}}kMpmNSTpWo8XGQf8p1_I^oVHcek$?~JA@@swz8UNmRt#!
zi7IJowL#QUuA3sG&(Wgf3Q*0kUda)nxK2W4rHI?KbQT;rjR-?@&&?=}xg{P9{I?JM
zx~dZ`U7XOZE9nyuv=w;WUBX4^bsJ#+e;brrtqB2nlZ3~h#`Z8}ILdZseEqv at Nl5Qy
zqjWe<o1>qXpA1UE1R|fY-$eJsT6N~<ZWaCNWYyo>sh0jP48omyBe_IFiUi=OG~5|1
zU<_PzDF0uf_i!>%8wY&e_t0=IY9<!J{TlWBJpT`Ae%Ajor?G?jacJP^U8w<4F^_r+
z+Hwm~jN4h92e0@>zZ84fRmWLJ*noiL_-G&V(ChHfALpR?ei!ZdXb1DrALpSM{uj6K
zzrTire+>cfJL3r`GCJPBE|0uf?7wdapC4R3-kWbvVG=y!FTynarqIQ*3C-pxkQ7CR
zBRyLcnG3iOe$hhGd!)%2>rD=C_INEa$&UAtug3TJ1c&Pj6>@m2A2Wnz%`OaTtPp;6
z at GM4MA;%(|AXpIZ4`drNrJS%&$r>!9{ZP7FKQ-ti<Hf~qm>q{>$0jT7<X)j~Pbr@`
zYeV*@OvQcm!wBX^FAgTinrq*CHi<pnjK~4ESI0l9q6NS_NzmKQXLki at n`RH+2w=Sq
zV^}w<$7mtZrh5}a0<U2XxBAV|^<e7vzVzt#v`xiJwpzCn)IJXgAC=V8Wq*mY(7T%m
zVKDYrFR=Ip1mK^mZ(oUK{*4x&6Xcn1T8}=R+ai^-Vl`{j;7ihiYWhG2dAJl|C2ioV
zRgOT%2!C9{t1I9htG+#A4eQrX4O}%0_ at imRVRk8WQYi7$%W^P?X<Davp^QoS=#l;T
zLU_0^L;fTH>ZVicD1fKnLN<ORXaR8dhnmMLLsF6N%equpqHs}tAU@@r`#B2_Mn>zC
z1&7dsIiWp!55G+Y$XWVcQ|}#w(rB#AY^-F5OV9suYpT-SZNZu-Acc9Y7r4Tk$Lqy=
zN7jGD&DZhJ$|XP-j>r-e(k$dXIDF at 9Qs~H1PRI?XgF%?QsV_z^Cdw=1eq2=K5|F_t
z72j}D?=4KqKrUVnew-8=uK1;celJy0G$@YWwQT)nTg5yAzU;6thn`uiGu<kEuqgOg
z#dMWqGeGRWFBZZy6E96tLbW9}a2<lU=Wmi0vU?+x<q{TKodmuT=;BQ?7iGiaaT#A!
z{mI%ez-i!Hqa6AIDO2D-VBeW-p(x9sOOxJm$!+*KdK7Je+hn`TvTsDDhiT=`<e6%x
zuECPQc5J?u4YuGJydY)%USL+%Wu%}pZKCMx84upe9GT at ZNEZ?U^%GF-!j;zb at hX5*
z-Ghn)B-uy=&D`Z{-*3ICmg(HuNtW_!B7FJ6D{@ROK^#x|V$PWDkn5h<p>I5*S82kx
zxhaekothNzHohXDA>DBM5=g-scr&Z$AY|<BHQ5 at f1WhU%>m*L`KULY^x3g|iUYD`a
z?bhJ(DwkGrk)NjXwQFaZrwDKw+g|t)CBMqy1>B|^mpMb0{HGTnz#`dCF+x3{a+InM
zH?oFkohf-+IkR-Q*gmVCh1x9vY_xk;At|sSOEAhZzL5mkW{;Px)};o+E`J|*EQt<;
z7J}`-0j at 2dJ}khS?)vbeu-0*C@}^`LlLrgVHi%rr4!=MI#+A1FpSednZSkV$1t1F?
z#d*=AmStARXYQkO5HnnB3*JsY7^!Ey9~?j6gQPvGUA at tR&_0EPlcr2T?ji(0F-2`|
zH_x70YL1F1M7j<-6LuxemoxFqjVrS)SZYyFgJrb??p+QQNGN=K9wYqAk=_qn4*fS6
z;Z3gwV%k?0xCV(Wy|r#Unm=4T2UQwY8Gx(chG8aQ%ny-gYx{mfNBzub!eH&@^p_6Q
z!X+7uYf)UG&38e>d}nW6Pp)N79wQu-8QSwxeGD~OFyuE9B0vIir2hs3>}F)Uv)~_z
zOLYRar^9*kTdsEErD}Bs)CrQ&q}pxNM6Yz?>6QuMucw-Agxl&m<J1t87a4`;2!RJR
z=*MH}z8w=YV%{sBjErH*p2fqcZ>eB5h$?Ex{NWo74}5M(d^hTC(H>BFl1C!RRlWzw
zJl{86qMg974Kcb23)k7bXS#pV{vK8E>V|hfAsUIv`7i#<Z2Yrz=nA|a$uT{qd^X&_
zp~K#_Mey!#fG1oJw`h54NmQ`d1|!?$99Oa5HABO?U*<r4_D7smI4taqwXjC=oSS{x
z4H45oY;i~7zyBLd6MiD(4zS#Gepym%pC}4&4$pOF6{9AGoIu)ufD&tDA%(u>4;|Mo
zWG^~%9NZ7bCG|x|{hHr*bjZbGOqO4kOO=-{q~X*U{^9Szb5CS>f_tfx6w<4PZ^#h0
z5wcWf&qu|V8ctg;slWr4xcoJF%@YucZE#KL!Fr)DNZ~5lc*-vq?4 at OwZM~|}CM3;u
z4w_QLMfi`!G%(dOObjHOBdd0d1w0M#6C`d=EfKGDSglH5d0r&eCG(K?DWV>7x4#wi
zy8~4 at ot=a_SlQV!_levPxVCD3wB!uZklid!!v~aQghX05;zV?2elW790oz9?e;POB
zwzx9M#5&bvH~(I9op%3SB7vBqA_~ei$;#ht|1$oj1?ze!UtUqDLSb=D!+)%A8uTz}
z)oTyKYjHhxWK2a7D*`pb79NMcBMg$55Vjp@@}p+iI(z+0+O#e3Rskl9*aGW>?mc4K
zh6si{0eR=X8uTx-h{f=&x*lFPkIw-U7-{`7zND9J at i{%6JHGap#%er`5PcD8eBWTG
z`nX4~7JCfcFxupvo5BG|w at Ua~X(vd>-p&bG)2ey~;yGOWx$vr0-f&|2WRIFNm&tHv
zR#Q@(i9-)ND~BlidROGt3bs6(fEH#XPLfka1K)h$*C=dbU}ZSvq02qlVW5Kgs6#85
zC`m&-t_I<=96Uo>tOV#he1g at L0J|#Ccc1aQ*H`oPxMK5yxA51&vcdap!csaMZ~tWe
z?#VO6 at X43W2a`C2cPL%kL&!=qE$&<Kl2ptRGv)(y(A&m}%9f69;~7b*RzkWC^9+0p
z&Zx~*c`rBS=l9nl3DGEMR{OkZm7_G(q$jKec%(*mvh8)>G(SEOqgLu`7Z#0RJ(Ie>
zA}(`hRSjC7Vq{d}E-gtXT5D<Z1L4#05GoNj at liop{$`p`tZqa2Z}@}lekO9w+W0e*
zWXccfGdA;xX+UQ_g+RqkCSn__TT*=3raH<@kdikG;xi{Y#zX>a<Ke)=V at VReDP7Kq
zaL1=e9AtyilGKF>T`%@mO9QabKs>u5z3DbWRHX!L#s|!W;ib7^q1xBO-BV^Vh}}N4
ze&GF;o5o34NGPw`q3kOX>|J5seIBD{Fm08HDHkEN>jaXG?<}RTa5!y<zPp_V7THK+
zhM=l~OFlrWn3u^tt0 at CgW{o=WuwJZhTRo$Y3eC;aP_J)93AP4BS`@{9Vl^3VDlaeY
zs$uA)GKPo8)*5xh+dbBkRA_O5&FZ=<>sjzoG~o45S$Lw@$3{Ogzg38;g4Wx{!;|~8
zhDR#Y1EX0RKxw3=KO at ug*eg~15f&Sn$o^G$C0xWKz=fkrR3#ftDtX(?ORh_fcp$1G
zdMyjD?Q4t>kBy5 at n)FnsOS^yoLOI0m^h{n?jW at K}L3Pp;)3hBWD*-`I2V)us=0|#<
z+HO^pqQy=(xXR)Td9j at xAFsy#+L!T=A?T)uyO`#sk+%!M)?sR}G;g?lM^V#e|0zbf
z(6SwUGsiZZ6eUJX`e%`E(^%u;kzGXGt9m<WMl2FmkBGleXhndu-RJ=%oOKh$q%p at A
zGtlrfknqyFEDW0Am+6%XT%jo3lc2kVp(@rd;(}~KQIjWnVnvfH<~7>~H*+IfC0h%J
z5YI%<U*GIVqV8V8dyO8XqtX!IVWdKyWGOAbz^p5~Vb7{V2tgy-zjH(LMDf5&+DhLz
zbM#I-pFNGsdx(RSwNbmI at p-hf`0)-4xv42VQ^r<pE1|ZBv6N;>xhgsr6{Bk=Gjq2U
z8TO;Z0`ESm9XBP0&hxYK^{`z#jWHG+vyU-6xPub6HlW}sH6L_|h9-()#=6?1%U~@F
z=9V{5MW|x~U~s|NCN1lpFf|o!KDWhwFy|N5;&+gB$<~;Eao}1i=?x1}{NTbH6#Wn>
z1huZ?yy@~Lm2FucqxS~ZM&oBiH;HX^#A$im${g#Bh0OIbOd?N*kU|<ykCUCDs!<`i
znf+AOp0qSIz?w#Wx~<x^f%2_D5z7%Yy9Qy35Oh?t)K|VZD{f!k>g;aEZM<N5K5rQ^
zm00Z`96FU%^o+t-cft+pBR;5a)jfwaOLz%Of&Som3u2O_I|8onnF%+dmmRb(*}S9T
z0-U6ub6~i8>b(i5Dx}}<mxb+PEJ<aO>^2hZy at hZ7!OWdSUjlW+#7C8FDc6_AUsc+q
z1_QmwH))1{G?l4Uf-sjsur#m?WIyThnfsjSg1D9S3`;GYc^Q$snM_DYEbWo;GObUs
zEHtO_zM>22qI>G2uc&wS)jziM{kB)_sDIm0{@cg>w?FNvuc&(ZsGI7fZ>Wcj^$`Br
ztNpbV^$=fG3;T4#_Sm=8K=;)^e%rtOw$=4ex70oRY9HHCe$pNv+ClqhpZ3vzv~%{*
z-?sJrwTJDXf7?O++e`hn7ww_HXz%T!zilD=M?m;Xlu4A{c(eUZLgf=6inII#`~h$h
zp6^}7T^X*wS0VM^X1zsHGwsjhz?;K(CF^J&lyz0qPKNT=Cp1G1)_aG|3uU9Xq|PdS
z?Cs3aKia_d9mZ0GECHX9Ra$AT3P<M?)d_LuVS%3cU95D=I+;oxB<2a?uS55tNc?$b
zjAs48idXi~ee5qha#PF9Uz}D1T)c8MsTn@>YPyX(_W`;81Zj7JDSGzz_Y^a`1uvR=
zC%{wkD#LfPmjQJba`n-3MH?X44>!EXd+cIz_P{%UmUGA32KUKoRxG><s7754z5*^T
z(X&r+dIUH}OIr5Y`wW<Ks%u)MAGdCm{#5FeCZzj_lUqCAH)L9v<=BdJsNyD|jyX#c
z4jn~-Ih?qPe8XRHwPv!40<U~XU7UR;sayru0{8}_6E%h-IAwg at 0)zzR<|sYp;VhLW
z%sy>KucgUSepqU?sChsjHg=d1R`}F!3mJm%Tn6X^+s4^cKrmr%yt at Brlb7e<YId=s
z-r&hk+`W86CDp6_?~up`oi!7;Oy>@5NwtcpZJrx`iws(<5;FtYz|asBCxsL3)YXAW
zyXvxo-7s*g#clw~Pt^*^NZ~?RGY!tMBUtZLToszPIXS0s3x(v#ch<xJkb$17q5H++
z19>Qt_GPQdK*4MP#ZFg)_2HE1SYow4LVlS*Q7hD2dyOwd6zsmCjIv!>cZrvuE~B&o
zcA~&@gw|1WX5!m(`LtLG617dy+i*lx`+A~>$dTr*bCG0GO75sq|8e4g=JxjLUIE!m
zU5$CGCEAphlfB5%?c(!w!Lt$;j=qIp4KmkRy%#gQEa10MWS(Cy7g(?n>GxP#(O&ne
z*&=<hT8oR^ELUA7eSQUu<kFo>ZE{?b?jUzVfjB%-@`I1Mv>O%@GuD3kVF((F{udLj
zmis$Bd->3!w|mMCJEh6thLMy;Ipq5w)#Z(-LcD?5NaK4&>oe57K`fs~$io3yQ<ET%
zLUKm#a25_bv2x*YXU2lV5yU=jz%czA0o4$YVFaf5swewSba9Uc0w0)A=QHLdUL1!Q
z)O_BOHIF>Gs+X_ssO1&nIo9KW<fJ(0S_5t2!>SKb^?Nv&S4vuzZe7ERi&LA6s{}Xe
z*ipG^Duw{jLp{<pJEbYpkWs at Qe!sOmIT=6B{roeItYX;GJcsH;dan9l?F7H1cU5{O
z3#rQrwUI>5GtpRC&gWKVrazu+k_xef at S_T8FQkdD(^;>Eizv2(h;+#0A^6gSfk?~1
zSwx*~K!CqEN32-C6elT=QMnl2jV2&0Dyp?OUz_oyQ9MfA`63iW6nE1i#^D<xwsh(e
za^$Z?T_H;1ZF<Yq^`-q6F2zs+&kNh8pAf7)YKTx_=W?eERBvfwN;5k|Z-G=hW&b(k
zh#O&nSX(A*O-)bRuXm?nLtzfiz?)J^joK at MRYx2XrbtSUUZ<~ZVT7m at M^F6j+F*Zo
z#?p&6B3JZtT-61bxlOc#otkv6kQ1pu`My0INaQ4AM$=GUFYVsV!q7%Gm8C0v7B1B$
zPmZCOB*^mplI0o+QfgBs2eY^Dhvo6;kdtpS07UHfX)Bp0!9tv%_a;XNMSWV#Z0A2}
zwL`eJ^B$L?!EPbeo{kFy+4n0ny(~WX54ap8?v0*4*!DXK0O8v_76RVO6_8W$#Bk!d
zuxCmEEb#?}W^#(G{ifo6W`LtAoCYmhOpW8DkMZ&MFE~)SKSHZV6$48y36HBH6w(;L
zETCk-<PRYuHo$H^kxs)2Z``-$7LM!jmoH2<8nRpOn_=EvXH&>umOaTzAlASj89&DA
zdZ?EJQuiWr{`d}jK{MT32iE1eBsJ@<!0m|xUGDpwIAFGxjU*UByATNPkrZG8d9-Z>
zm*FN;N38>YNp^A72vjP&vsi><2;wJPSeDff5=0p(qf5e#f-7)@_mj|5$s?z+S&l;M
z&^|9VfqB3|bjc6LFdQBGl*?ALAfl)AI!1FTiMB!W_&PJ>+wirD_XL_>4y3lb6^Yx2
ztRTFZx-W1Hotz|6Q(OvEta<ThN3 at s#s<P1N>z0)b*o6N$gNCzn&lYBYkeHVseHXSd
z3il<p<{M at U!YZrBJw(+#xg#+j+6kfL9+Ra<9BfDr!*may-hfDMOBsq9<F2=lI+S4&
zcZCm%SRqs2FE~VIvIq21viFu^P7la at 2y{}$(Z95RD4++$Dyzuye)Mc*3ar}{B<tuo
zi}vf|8kioQ&a9x}V9}C7V`MpixRiwv^-Js2Q&V9}K`9FsatL}QoJWjbvAd|74>Qt_
z>N|O>o6k=Lmk!Wql8a#+xjwU6HIWPNVqc$o`&vH8hoSDE^%s}^0JXiVGAgRd=N;oc
zxT}z9{3ojL;|Y8K=%@+9(MNin>T7cc%j`rI<A%7MX*V<)Z7uv_Btqai2tadh3Bmln
zg0Lu6=8E?bGmcAj&@Vt%u1LJx+ZK!DMXJVL%LIidGiav$(fL}}N=dtA>4XY)fp}0a
zc$FgIbK}j_kjz-S4`gd{>Zy&IY=#i0TD{}-k{b8P8Gus)4ycer%bRD_X|w>|sDULD
z>dj6i=lGOg94K2BpEwG+_yFN)aqzam)J6M?N5tH6stO_RLJpC2I)Hudt3{@iOML;1
zoT~sONtFW!(BVI?Clt8y?7x?sCUwsowTWjqnGrL^siIL<ds5>=;U9B8{2qxPZlFw4
zxd2rj?8MT4$FnQK7KdRpaMOWAFF7wKklgXe3eXajUc%htmMl?lmz}-mazZ++Z#{t=
zh~Uh1-Y~)S%~Uw{3075-hEdF1Z?Q<qBcJ_i!b_RcQY at m2i`DH^x_aSm=`y7IlyFQ%
z)b6!7(ZKt{-}fO!;Wmxx%iG{S4?~eBLy6LG`T*G%F2Qtw!k^u3b^irJh{6a-(f(u;
zOvMs@`e}*9$HA4qd+(dx=}rJ7^EnM9PDjB|$fFIs<FBD$oHqjFdmR$U+FB)8oZ(+l
ziE)(0_)Q~8NyYo at lsWi{^;?5Q-FrqMCB(m51{<K<IA=Z=eeoDdE9B~}M8d_isp6&|
zybqpm*iv}3j)OS~?X(xNV|9U7u~HM4x+e72YFIMt*$RxnpEpuZ$K;eaE+$!6$RKE0
zMY2`48#$C#5pgSpTXYq#qGVN at yuEG)!eD7@?Ci_Vl6t%QVzreQSp=i5U9L^C(vo$+
ztyR>Xla&2GA7Eilz at hxoYSxWSvJ^dk#`QDN1arNJ%nC3>xQp7`TVy at 1w^Ptk<j4T<
z52`>r1bqmxesK<{V&G@^Z4EpNRvm`E=Z3n1^CzFe=ui~V<~=}_zp$8c&WWd*p{nF^
z4*wx3Mz9rPsQh`AkK(mn0<}^_fAX-W?fAQ1Ew({4yJXbMi%O!;0L$4Q_d|ztD-e5`
z^-vwDLz^m$WWC}CwSwhDOQ+~*ceZOkW89^`%dGhlO2acLoE6;PU;}LbJy5m28$9Y0
zx9BvgbNB|~d5#OC6B*Dd9MrG4-Lly%ecE7i at HC+mfX8^N(WI^|K*!kd=d%9 at lk)az
zNzGcFJ}k0;dtrloV?}J1DRf)h1XvHNbt^{hp+5@*i~j;Tzt(Bi0Y;FsX_JVXQtzBw
zUeB){<j`Faq?YnW5Da?gV?2cJq}z?vFi#hdm7Pc$V>6e!QtDft4qMWcl$do%#qQa)
z<m$__a6KUbk=d`>5HHyQyydBb=o;d8=R>fY!F<fKAZ?F=U^{kcA7DBwH^Hxy-eL}{
z&!9VEy7G#kodD0Qh;i5E_hRX6g4_Fncy7g+oj|Db2(G5X(Bsk$`wbhvjV8i^Ut82`
z32*HLZ(I<XDgQZV#DskBu&C8wfGB2Fkm5Y6dX4p2mWO3m1djc{GX!xkF<lXwSIQO3
z>8Ui=A-|svq_z}H%!JIbkY)}c$}4wFC8dUZrVpVhhK=qbKOIk+WFzkM`9je!%xgrC
z%&JDKrB6qd#yP}%n9Vj%pFC?jz1 at t6cL#(<VqoG6q3XL-LRbP5m|`Mhqh;@BCO96~
zh9KBsUEb=*vkglCNz&twUG{^~!f|h-uGGwyc1&MeN$R{E1Niy(#P}myraI2KykaKF
zD$4o)MQ_ZV-|pwNw<?4<b=E`=zOC%n$GZ!lU23kBv)6G)R3M;gkvXysao-!5m{Ujm
zdS$bkHkQ``ZXuE0ETX0ZejNCQv}=^LEERNo>sQ at 4NDv&y?e0cttUj at mrFG}5Kw0{<
z?&jic at 9VglKhS;_o4irbb(Ezfdgh at oUT~w~swnWA<6yA!%Y3ka at g2$Y;KXqP%WSW1
zcuC&SVdWhSMiaX;ccYT!z8zGf(((aDx1kSjHZ>I#v<-Eb102{4q+?l>^~9!o`feGA
zM&1XB@^VmExO~&x>>YU)xbYk~eFbT&q`W>J7$1H39tlWFhX9(`FpH`#RT7W at 8xOE>
zXDJy$AKmp;Blh_az*IUcQjEc;%p?Ix31njAKF4XJ5^DmiWjXmTwq&Xri!R>|{%tc+
zN=+-0niB}uw)yfr&=v)La+zDZF#?B)CHO;)A^Xf?m360KXQ6(AnZ_{XlwV~f7mg=L
zm)3ILA_i+Wq05kSdx{a=cfX>wPim5=G&B3)!}<k*A at z`SuABGaz~)OgQp~`<gyA{y
z5Nww=(%w9O+QPN-@)U7pRU%H;y?~+zO~beV?T)K<w!o*R+?U;qx}=u=)M4OPs><i)
z3|aT`649_-Ug#F1AHN{tGeksU@#XS|Th6Q2xoRU2 at VZ2+YohG6p9Y(nfFkR6{ppQG
zQ- at _ivFO&v4|B++H_=N$M7{<uNJozZvsu;t*qekD0q%h%0t+AK6y79Bf!yv7-utr+
zTfHejs|miPzaGLN2|s&t at Gz~;iR&FZ)S033gKDjluK|o}avNu<Ct2vb3^_3B`r3GB
z=gNeCCNrE11}H9Uxo)Q{hWNF24{Xt;;I5G64qg%P+S|RHJFVUN>EyCNpkyvwoVG6g
z7f|q01vv;y<$I%40RX=F49$zM&2E<Z=Jy^cuHJQhvT7Vkiz=+19EJ>An4 at jWN26j_
zcMyvM%fdUm>4z9 at tH+%yn at r}j`$5%Gyv;r}=<AxGH*PEKXti at LcXZUBCEDBRX+wTz
z8i7A~1XdT;5q-b(imNstKEFZ?wi!3;s<35xs7rdmd>3C+w?SXFkE|OQPPZ}}8VoUU
zD79hEU!eSMt*6T5cX{mF-$^2|oIBK#=He?RPB2fKch(-kA7JumvxHdy<d4$p_Ui^K
z9|eM>2Vsx9+Fbk at LH__wX9C$@af`?03lG{O5FQqDVL=H3D#rIJbmFO4ovAF~98(zs
zj`Ytm3!SYE4xEKz$Mc$P1oZkZ_9`nnGLJ8Nofr-6c{0h9D2mb- at qI^?Th#w#hl^g9
zNBNqYT)p8sH(TdMm8(9RkRlSgUV_B at 1PmFWOG^l*yq_9F<1HiVP9XPUqDoCGyj!7o
zcb9Ec9sTB5VoOG0 at J?E(oh)Yr5pv-76}8j-xJ<`3_Dq8>*RS{cQ8)$b#m$kllaCnH
zjs-454Ots%X%IoIpnOvqb9}M%>W!;q=ZUL%J^3J_T}Y}>G9O?AT0--X_p8bJOlejR
zQWH_M5do;i^uy;03{@{w-3)-Ic=5T_v=4ws`4{5-0pFT1 at iBw35{WbQBH at 7-fVbVu
z+Y<~4op4b+q$5p9PBzVNlPU>sKXH)M8wSKzQMkXOzwbS5RJ)R!I|hp|YdFi^6N2LY
zJ9e at UglQK75s7Ww_gfkZ(2*XN0pRA^z#{TuSucb7FB6AOW`tmDad)SKr`mi)Itrr+
z`{zzL-z%gjz9%8u^wvybg*gK)-ckFave326nBzQS){zR8`J+l at bw*(T-LlcDE-Bv1
z=8TjgmGO=n>zYQC_aLf_7U3rn96O8=N!f_Ir-!T+s!K>%Z<Xk_J+4>30|R8C(tvwm
zM3=B0uA~Rlh?}Y^LB9`%6{6j8^H_3q9U-lC0$bo~TH0xgBKS+K%A9VFheBJjgN=H}
zHt!hnRC3<=Xw_1ZeEJWZ_Vmp;5?}vPVbKn-%;qE>nW5Snu?uq#WMpUM_;;4}rhfG7
zqwQ)ObIEkbEh?>e1Qp>)GTMMPJR(K4u5pATqP(>*3c-Y~YgV?vF3wL5C4dlmQ;poF
zL9#sQ9m1nAevvXfW*2>6;BTS#o3vgdjr*#!4=?{m^%U>>O&m%P8(q at fphh*;R3P<y
z)~DH|CG_O+=<1uD^}WD40J3wzU0|$%dXD|pI6}7y*s;uK6Zc{Y&||*G-{P%#{6Oa2
zC?bY#vo^{%AAK=5Vud-tD_4+=7l3E2Zn=6;A*~Z_`zK(*9ZWQa3{N1kMmec<^FLN7
zJ-$ZD!2<H%k1s>2FL2^P$xKXM%En}U7(AUq4X$V at xcCL`BB{OeGAHvA^PeV$QW!Q!
zedhk4kiIWZ#G at fM83jO6!d5}AmZ8a_r62Pft&sea0_Wj(daI!}u$vdiW<~e!K97$b
zk`9>@=>n<FQN<C%@yW<W<01aLmn|UHW^dFF7t%6Pni|#V at _43}sgbN4V)PP7^3y5V
zvMt97>C at Adfp~9X4T(Tux_!FJqewU~TN4>W=huuN&j9H!noSbndxu0Ir%K-!EP(=~
z{u{ip{<pAt-c!6_in-)qW#0 at xF?}XO+S%&Jx=RQ^i>Nv=*}mA+f{pk$IE(pOx{Tdr
zmzznm|9XthQgD7pn&ZuQVGV-x=#^Ex5LkzCVR8qxnN^O>leA5<2}HfPZ6t*syh6d&
zDLY)|QeeI3qZI0SL6n>h-fY43-G1?Sd0y-lt_`U&fct~WRPkA!g&8o6-YPL0&T3JZ
z1gUV}<vO58nD-32 at i_Cm{_2 at IdpPu;UouGHj)e8cuYJs%o8h*HS at ocI_92cA(d&`x
z228Xt9}Ez04`MW-o;WXuz>2Ddd2gUS<)&)QxaOndGoRs+K#$c{Uso#EM=M>&n3^LH
zR}Z%TLjklY{F7m^A4gvgZ6}^VGrp4Hc$WHyxD&>Ny65IvjfDDWj+hO5BuBN^BV;;f
z`HL5v6o(1=OE%1(%_=DywHAZz(zKOhr6E2*_Mqo-;@m*9^WH;ys^Tq`(DFO?Tk%Zq
zL)3}kYI(Ledq&vNup&PgmhKCo1$&OZKQ|zrM)q;7P(`Bla%j|nII at aJI)EKO^-Y3r
z2}o_&(`^Ize9_Ymx4=(l at J|M6gF>t)QG9IFZvdBz44I~&10|n`KsiSKhm-vJ8}!1A
zB($0cU04O+9jof`pH!)$|0#_p310d8gsCsEI%&ZJ&Y`cD<_Dpoq34csA3zZhfpSc0
zLmuJok7l!C8`aO_qoCmthxKAG8h=ZL;ne5_p!{jo_$YN0>NRv>kk~R=4!hOgueLf_
zHXf*&FEnepA>qegbE~!3qr;oh0)`A9wBJV%j4aS*S#A6{`*Xdi%^s<4d_QSV3`Gi`
z0A`xlSF;M68IU$iTCEx*)y9nx1ZONSQiv}<;YX_48ojj*izP%at%1(~a2|f`*v=qJ
zR=%X79Q5p0)1S<0Wz!w!kfGyG!4yML<m%4$V}!l$u?J=o#+G}9X0w~7Ze7rAV<9v6
zdhU?6XGDKBRL+S``}`a?y2488`4lt-rOu>t%0(G8+wj^LjkLUh2F)bdRX2GMfKU4E
z+|&;7BMTSadIHn_nN$Ag+oV@=Gr)zAkJ9^v&sB?`$bEi)k?|aAHeP5fy|>D8zCr3Q
z-vGUcRo+ujX9Y6cyu}NDeu5Fq4|Nqxzk9MO;J!n|Q=1BPZIsA4^rlELUmvt0$gt-9
zEyYADl^2+?Oj=5*g;8=gg55vTfGQuM?otvvEf^UTRyD)S=Ky{$SvpL>|0Zv<d5~}E
z-o?l5>&3;sm+~v}R at FsGPxkn+As`ZQD}#HkjnuJZ)XC*<MU&Hb^bdJ^v|LJ#jaB;&
zpfoKxd5aRWgnDf`T-jeoz_|Q}K!|hz9h`aNCd&jgwBslh!(Luohtn{3+nrl at Zlf&G
z!rHtE@*EsF+!w>dJ8S<KP@)s=J|hE9V0LJMi&RFZ_7auD+eGkxBiIlZUGl)gh)i4s
zT;g%Z##@5I&2x3aw-gA9;vrPcx4n!rgBCStfRg=J4f>w6Y%SP8iqOz1o2ej)a$_53
zRGGr8Pht=+y9$;jJiO(%Irwa>nn@}#0|=>7LZRZixxi4H{;v}!pVfnl)z&YEv|qdw
z-i8(QN|to7<U*z1B+#dx1Fd5UUv+Dnx8Z%-)s3CaX&i)g`s;bFxU=Vbz=4CinMw6s
z1E!ablA&cDWof`jB}p2;+Xmr(l4>C++MfQ|Hmhgug*vrB-X%|>=(|Hm^3Gof2`KcT
z7P0<{L{3MhBTW`TzQh9c)0gGE*Y1BR#0w8c`uuOc9P6m#?K^(iR+$WZVXOz}5(bfF
z^F{PAcen~0G_CX at abLgJ`b~RB+T4SI_u?G6m2lq3kLuBkge1jR{hQbU<J5Z!&_YD&
zC#elfZ2%jKnbnDu-s{)k&+oe6DJlEOjNft2s}0W~CaCE8M*W*(l<JqRXbd^EW?<Qu
z5BW+l$bAz6iNy|XeVo<S0>{lz38dG+s{bMlT*ty4nTZ(HluB1DRszu;-)M#9_^X#5
z{Df2ZEW+r*Wh8D{%I%yI>&8;-#};4bwjAjTd}lDl+6#H&j9!3%^8K}}`R+V?_gn3(
ze{B|j3PXO{9e;%x`)f(_+oR{aUu|#8_SWCFi{G|~{k5$5?d19FynObxkDk?iwU_Xv
ze}x@=wVw~|s()*b`&~b6Q~O(w+TH%v_5H3twyOQE|61|;YEbkEBerWXhO?okE$cDG
zaQV8oL@=F8{Q=zj{>5v+rLPFH9m}i^cxwKes+h{`Q;tNG;dLKxk!Xv<lBX;MFfbso
zqQTnschGTm41cBCu@^~A4M6RY%)|Frb)J?>8GES|<ZkeoUe`QOqYk}@^L%3&HuJdB
z{lesj(N$a*bz0^clr9|35cU!h$+iFo8?Z(_ at zG4mq~rkWd)f(kDI)?<bh1WBZF(MO
zGgr)N;KoqH#Thoja&M3PGaE!*x1%Ar`+nS4jtd{7rJ;U2VFKNHcb{k^ToDU}_#$Q}
zsvMYrl_e1`MLuFj*Y_gslouQ34eT3o)vEl4Wr4Ehyk_z$!d}xJ|3r^C3FUPyq5Opf
zAXrt2WNqH;wz3c88k$ruGFX>6*lwrPDI>K^c9w9c5Kff_tE8-0SSXlF(Mn7l*jo~P
zu*1lQNt)Xns=1$>VG3Ai2P~*4?#5^@a5-?q{JutcO%n at r3zC_M>s&G64cZREp%y%L
zn?oT>Liu;ERhiuIY9xRU$T;!*Z~fK#-4D%sh at uY4gY`QQL))P&t67PsuDEQFR`K!a
znMtYIQI^7$4co+SH|Lq0ycO&Lom(gul|58UCVwh;#Q2pq?>-A?Zc45bOiN0G?$={0
z4TiqD at 9y|#EFmrIMmRhEq)WYc#WaBNyZKH~1uj#H=vUdtnNGn+0YbOrDda!lX=G$6
zjvkc}=(o^3_izxa?htuO?Ybtt0@|CcFZyKLvfM<FQkgg`LF}kWc^6A9r8;~``-Hs@
z3(s8>Pl^C{j+Oq8dj`aNx3MZ!@?qUqb6Uh46DKT0&PyL#LQG!4viE|Tevqxpy#-Pi
zg1uuzxL|KnMSE2Z|A*I}`dE8lVn;*1Kfr2KG;_5$XSS at D4;<Al7g?;%|4WAoy&mLG
zMn7IAGM;^v7*9TAZ=AZTZip^WxIIa7mN~Hj;|@}W`*8J#^7iD`5qZXV2}QqsT>DJE
zRvr0?1E3lZXBJ0vF2!v-{~J`;Covy0*+F8`J}fFVk(_s)>_(WY$r-%gC{KGGuzB=2
z-}YkkI2ab<WROywoFDjlMO~9-cI-kwieo2Jkzl0o1)9`1tE8^ZnW_lZ06`3`2(Tt?
zci1+?l&@rE$1DWFsT&@EvalR-Z+5Oj^USf93z^4bd45MAPkF{H;m3YA8S~TB82nAz
zMGev&z#$6jYA6tG^+{e$IZ2w&8f-DaukV at qy!hAjDtr=kw7GNT=3ifq+^f_qAv*b_
zeN-?l+oAE+*yO_ldy$ub{CB%fUEz!GTsJ?mhf5n5UZ&F*wDz<;fY(Cil;iJD8o|SN
ztRc&y-EzDxU_wHAR}<Gu0@#8%I82v_2ehA!)@9^`f at mq4*Y8T=klCDI>QZpHwj#Gl
zeuAmJ!$mDg<4Og7>$p!e4M+Hj7?RlS+{4`IovnrJk%R?2dj4`qvhug5;KV*60HgOg
z8ohZRMyNf4FP0kY*^OSoW at EB&lT4b{ltPDHyS<9Bst*UeTf3LlWM-oq>1gkTJw5ZJ
zuWs<ithEeYkhwxRzfhZoXv9Hh?Md)l_L8nEf|I)`&1zDDwwz{fCIa}XBWHW>@<Y_w
zrM|hl;)~A;(fcm-8a*BDDU6{cf`6RV?2G#oo2<~{<iCrsfko#90Mf!-hsg;qhMs^R
zy;KUtMaT9{UcB&|1wH&<TadtJq5uWw&s%9+kPR(ABScX3J$drERxEhgvf~s;Cz!g1
z-Ab6lo(&t5(KW~#^~?wu9LFPl0Na53y_K7NGZR$^r~h3m{8~h?Gq{?6<EDfo%e%S9
zhj9wz;wp|G<x|(<(wMUIUlAV6?q;bo3*LJSw+Yno^q~D?TFgC6+fSHTXDT5A8`!Bu
zx;EQwWQ;k_i<wWCM}R?2l=}6yNrA at 0UurEVcO&ZV9V5G;c!*CJnPAU>I^9wqKLsaH
zFBg>Wsl7E^wu~29rV>S+7wa*CM5>M0^2tzAb%|q1cI&~g$28Z6Vjct;Z7f{F<K|jr
zHJ?DYvn+Wb+)L*g0;<Rq%E9%;4G(mb{`DM<IeS~IPZ62m6B`%r2Bx9Jc1(Ms8{X?K
z@=*LRl7wC<7m*!Ed-A at H=$CAD8G`9Hj>Ihczh9J5y3YuTKGFm?yP4p13u%`8nOBe3
zj=FN2!NA$KpaP=cqpMdYP^0abjo94XuobdR<lYFCZo+VdDBd`*?L!u-S^57F&I{GI
zlLyQoM32H|(`=;G6F$!{XQ949NoK*^r9>#58jhlura%8+(uU0VZ&6Y(R<d!E_Esb>
zla$^x$r1OC*ynVlH%tqd#A>D=3SJtXf#vbc7c at 4k#@*QVMo#Ya38h}qBU}ck+qy6E
z$AOi|RfUqdgU4}R)WZf5cW+tVRy6^q;Px8})Cx+?*Xjv>AK_pg!i(6vg7|u1oCGZ1
z6j{%z!sfo32HDe8U~xjHof%0-pucw;^euu^1!pGMOQ_RNJ`KHhW}<QRl)zlJM3p?Z
z!_IR(=mQ03J>9ENP{y5AR>P(1n!3TlQJrtV;FeDUa4d$4e05+Q%dT;TEw7#ehNb;7
zv#*vP=_z#pPymxewhNWdg%Ui5`F&Xfbxl1n9HM+4nQ%0?#r&vhtuD@$pps>PH&^Vz
zFzo$G)E3JN|07!O5qL9d;i~Lj%yByQvlfG4Uo3hS!s}l at qLNiMj(oQM;~L3xo7A;|
z13HxOl at j7m;!Ag)irv*=705gW-ZtWBOE_)#@P`?$EkNlQg}6fIGAVmReYOA~F>|Ms
z6=~c5Q<k9~d;;b7mdzCPB<D=LA6I#8lX!;YYHwGl?Mh&Rp0dQ{A88wyx*ll}lT(vv
z%`;df?Ut0^hO7{gb?81HY_IRAy7{`dac_#ndXLkYxFcm4PG`weLNuz~@)iU-^y8Xn
zb=S~D!oaD*jxEFh)0EGRY``tBdyc2>PPF{dDpPFfVjuW`ErX6QW_6Y5 at pxm5@9+d~
zWGYWiV0v`77&EZZszU9}9eV%}br%0xx)^OLP98)B!p&&tL=Uim9&fa4f+Xo=d|94*
zMeMW)#@L57WN{E3h;*5Uh0c*X#S5c at 4$e{~h&9a$)Z_)st7CSL9HNx#b*(8wcca4o
z?444`08c991%@cW67jlC7UXR3 at F!gNJ=?Mj+i~v^5qNHZEmSS21pqN46b%5mq)+7>
zgQHoxyws{VIE>VzQZ-e&%dSN3X=9;(hsT$d{v~DQj(wnfWUF=$^<2lYpQu0MpqC-f
zXfl;`r!|YEAFPMH-}=1yLn{9%oC?B>vHuUQM4afwBAH8i9KQmQ_OighZ(Q05G4j^T
z3!VG{hC_<vaS}MPSp)^+ at Y=T=soSKXF6ujI9SJ$yF7pz2flTFftjw}s+C0nUhJ3r0
zc<3s}xK>;#=Zm6Q)L{;YOn<SP7*>dd4b}6R^&lGHo+di|=*SX{%vRfj-$3ahTKVwf
zt70brG4|M?mm@&aVZxNTRvM_bYYD}J?tp}v*QS!TIQOTVEA3byu*+5I<m$+9)4SSw
zQ_0>6+P$+~{!`Mt?A(o@?cb`xE3pZIa`;w01oL64vON+O_ciqgQhEe4+Lex(6!F9<
zbQxGDO`Z{eNXc>Mz!#LQA>ZK4e0>dNCQnK_gWXAdvrM7-VW?w-P@(S9sgl$@pC+Dj
zM!>cjguIfYWKAf|LpZfF<knIFB6w2rOy=2v1X~C0Y_P;@K#?iL23t4EsXh%t%e at sy
zzALzcN-vL_kZu!BQ$EvgPjXvNH`0_>qbL*+O~cbv4s=MFZmo`LP>xunME!op_Yza4
z7-q5VSo(qa3H2W48e&DtrKiP?m;6Utcf2Ck%_G#h9o92W1VEia+>Zkb`U!182+d_v
z<-rhYTJA8Mu4-4CEH4=C3n+kq_7Ujakr*w(*h&KKJ|7K`GZbc-o5R$Dt|tZfn$u}t
zB>0K?nLA>NWkq%Vzx_P{aYP at s<NXR~#8_ at Z5ror<cK1*i;ZB1C=rh}>8ej=StHDcd
zuDCs9JfY_=Bz2Y2;Ul5-!a>8Y&d|j<HL7J6g|4ZbIX6)$O*{pP3>{lf;ffiLtHs~7
z<70$?+*6=%j+DCbIh5b at hkc$GXCVu>G3EY#nQt!tI{#w`x`8<>?KQTUankr%YK&eE
zA(;(2Vr&2=2;f~&naE+d)yC8)?Hab|+J;DXB_oz_J%;{iWFzgg-*DU*#?SmOLF#{A
zzi`K+pgR~>TE-1*!B#C8*6kUtN9+Z~OZURoQ%r>UlrR%~-?}?vW!33tNLUx5naV}c
z+ypelzo6}&)C^Fk3AtH+O at gU%PH?r4 at t<cu49qs6 at M|xw?NgEP_Dm`<r$1jFGL)LS
zn{0XnA_zXC8I<(=nJbiEUOrIjMEGH1BbYzo9{#ChY#DoY9#Hn0#P>Z(e;dc%*u=c>
zs`d9fB%Z-FGQd1!=g+4^a7GMN#8Z at QyuQ;a&sStbVVTZ+vL^I%fJvVAn#cFt3JUE^
zNC4L<yfE`j2Xb*$vqT8qS#ZLJc35XZ3*z`s#}jL&>ZW6qLb0VbGP#CwuXvc}2ng-g
zP=|2mh>Ew^k=}~MR47X(V$OY9ekvL5cTxQ(Wt$k%g`Vt+5GNIFs~0<^?K(#;)*Bpg
zc%Z+~SGB_nG^!nmOHS!)z9%<-F)2Ev{bvs)V6f`9{n48oz6p+Ey;xsShqs69!4 at 0L
za_HNQm<(gB#QF#nU<bp6wH2G%@A_{F at u!+daDo~{p6`a6D#_6cPLDCzPX0zVgC_uY
zumtx-Rq3nPHTsh_ENdJ>&mXU(#??;j`z(}D5$23As40oT(x-S*Ya?>Rg*aeSN8&sK
zK(K2wri1^Bo3zG1u+P`FWGB9p;A>DVh7AI;g@(!0Y-1T--d)<n4~@#T4e$V?*WHTl
z71-5s4*Ej=Ix39c<{rAZ{E?68w+ZPzdgrA^Z+s{#`IA3@<`axLFTbm6uF!4c6#Jwx
z$fh><uKnW8G#BIzqXr~?VIa<CAI{VYAUNJgAmCra6D<Mgxb8%=gKQQLmykoy2bH<+
zES`NciUs0xvf80rl~sE3wtBAY_&GC6b+H`mVDW(Cv}`-?7~`2l5dU+Sk(_qy<l8hh
zJ=RN%+^j`Drs!21?+h(1)cesY|4T~4qoI at pl-u`o&_2B4u*W>JLcLNJDAcxCR_hKn
zVfKAbRE6_ASV-NR`|y|`T;;q_k3}SbQ3F;fNSTTo9+)bis|wAkr;d3iT{uY<G>=5m
zQD)n*z-L)#r;7zEwa>j=wAOyQR-eW%`<iBkVB3+^b<71X(feF&a^1ttC*|HMEq+|?
zwVFzO!+vap4M?MgJ#~PK&Mrt*j{JGslc0qDV>29}51g`v_>&Ks56{tCV05R!Dudkr
zg-(BA5^lM3;vz&Td~|T!ZF&}u0|Z!iK<SqU*@5hRr8vL3WCPM)0B`Np6T5tDzgDUV
zW}RHUoxQbA at nQnxV-Vd9H6@C_TxP at xNtd(TpUi2q`!Zz+&C4<>221z{!KfBp-V|{}
z%+cX0Xi_s(a8mpz1MZv;!iQwDFo4tt+qcQI073zAHOvmD!hY^nY5<V9d2AmWjz*io
zny~DO`6;R~LA>~4(;9 at YXGrM>qr~-LefUx|k8Z3LM7r0HCE5rTRWbKI7Gfn4e#ytW
z9Q_@%nDS1ev`q8XZ;eui-Gv9 at m*tc~ZKCSx;>#uEx}+G5JEHGr=VYp+KV>0JZZDz1
z<im;-LZPq^a>|nlcNK11y!eG`YZ~ChT`KsK$z;EAL=zRQNjnlviMX=@abG{SZ0EXG
zI@~fVZ|Bf4!A0F*cv|ux8R9q_R9lSNAl9`Ry!`f$V at _ngA4pkZ;lut?2>@K)C7W at P
zQRX4JIlhnJO!q>&dn!^!{~DcoHI?1=fzWCs=Kio|vCP=Zn)17nxsq!ULoZ$$l4#8-
zwm$J;3qC2(p*Pm?FGxDEqhxm0beN=mK~CX(&rcvK1Duz7ECYb*(_cQftFscwI`vsT
z1-+}&n}6fAFZyXK0juq)eJQSDv)&h`tXJ1?*QlkNChWb>{)^D at xH1{)$;W@(tk=$5
zZVu9vxuCa*^^Zr*=tW+RLnLEMZnX-edS9^JPecwg6{DIxGH&zm^~<@Y*w){^T!Y3U
zv47-sj`SoFPv$0)J>%1CNCS~+Dc_JYdJm_!6{!b3f-XOkMs=&o%dB7b5aV1E0V~d@
zLg%Yz_1j{8Mq2g&DW7pts9=~R%Hn8wTpA_yl$n|NVLgd|SZ%uo-H)qcO6Qv^hVli#
zWpOI?wmr2jsL+e#JUF^31{KQPkBZqGiL~)rz;q`53m|rpcpMqkgbEt;jpkx~eRLO*
z10c1^ouxhE6|qBos(0Wf5;I2fzR0KlbhF+AUPtf~wg$5P<n%5?f~&Z`Dj319F at +zL
zy<7R5Ve(5d_Jv*@L&8zmBp6VcRKIZ#M_@}YvOA?UV&y=Kyw^ChGqw!8LhMeN!e9jD
z^u>@6w^^X5unU$|)vnR4BXSqw8pZ1}Pc2y6yriCF$i*!?UuSxf3ZMUe{<-$Mzg1?s
zfW<YER2bjY1yMs`eq_BEXt!*@DMIy<ed{SykL)jAaEAB#euGGDvQ*Zd4|t;(Y<<k^
tREWVAMM_RBabt<HD4l98G+D+ORC6P<p%=b#|Ji9{ZdL#Q01QI at W@ZDv)dBzj

literal 34557
zcmeI3_g7R|w#Uz{o9a?kK#_xj2ucz}F`y(B1u=`6ZZOcOV8DQ>O+*Qj6tNWyh@#R4
zP!J?ZkW^KGMa6p?)DEkAmh(Tn)o))MXWn{0%v!Vhy&rn!_=C0Xx!--l=bW?8-gSzU
zq{GJ%y7XTuNyj}ALMwm&ga1;F2hT-_sC<A3sk8vmA?2;DR~KGFY|{9rpMLuELsAan
zLdN+6Az^tF<BPHpSMiH(Zwx{;f2qhqGK=;PV~2bRbo#e;i%cYwwf}Y&&7Fe^er>nN
zLfp+yg^000rJrtsUHE$;>*&2~&4=(D#HPOg^y at F5KBQhkbYxX$XJteIBINQ12>0S2
zERKg9Ish{x{eu(yr#Fv{S_dl~b4WQT?o=B6jvgbL^q4>2gRDTD-{}_h=&1VDN#84o
zvO1^zaUye^n)p$B)~W=N&b2>H<O<}(PqofPNNN4>M?rZ1VL}ilK8_2*kG0m9k at Eb{
z at Yt4ha8=ZvyGD5R^F`RR{@Mv)yxTn+F{?D=!i3hp0C8tNg0RKa(m|Pt=#-xX;p5qS
zBw<@8G6Z_Oqv_RysTqiwI|lMLHV;XBG~@8%!$9FyPYPbRw7(a|HQsrM4b?*1 at 1IW3
zL5x-72Vq<rmWO0vqMa%LA<67OP<!>g7k(HE&qMb9!{froCk#T0`f3S63v}bc_^@9d
zVq~2Y!iPr73`BUkgT;KYf;X~!L}z~##*IsJ5$&y-5I*J>AlqOgylam{$anK5H>Zme
zKa3lL3z0GpM*d!RuTu5PkKJ!z<iF$t4##?6H2(1;JimVrjOrbW5b4?Q^EhA}|G9p8
z2~s#0nm$g9|M0{3#79$s(-p)mDCi#1=|;Np=2swE5fl|QTQ1HKo+ms{ct8E$?Wcp2
z=OOhUe;)qn4|F^LOyCa?NJ-ic at u1`nXFh+R3)uAEfI!NAF`i}|e}_ozcXS!C+?);Z
z@$2VsHHcJv{n(T(kjB~_vfD_)qz)Gd5={zIi3tC;Vu5(=cLNbC4W$C1kGYPBSo0Nu
zFvna&M1Y|j$^x%Ky3(E_Nc-<!JG?d~K6fBjAl^u?AapQCAWo4vNJ4Jx&k at jpGDIjw
zvIX=g9}#wK*#a?QS&C31ys9ifXc2twf#;{W0&_GXe&@~&R5n5#psz1MgbiOP5PUF{
z6oDacQ;bk}o<NzNoL#8QL1-5kheBEWC4snNlaJ6cDA*1K$+-eLR|sNw-UrY7pii|D
zC^!TKDNv9ApYyX2IjgPBJqw{cc>D^AMSFiJjuXt at P+S9#OQ6^VK7+DgM2qG at SL)!&
zr39f?=;YqZ2xY)$2Mpm5bg`X*MlL|X(NaV>8KC64Of>Z1Ac}WYWeJ4Ar3|5qIfA?`
znnjTnT0wncdD0MAoWFtyOOc|s at 3KG)Spnb(9#HcU*I=aO0!oBw*u%qw at H=5 at mZ@Np
zhL%(!iOnSwOr0r53Df9ysyA1Vbfvr2Al4%`IXyi&*8R)mfBD3V045MG0_+L?V;8~x
z$uxt*X~w_75s!y}319-4049J5U;_Udfs}MHJ at zSrOXkT0`E!Q!&;KumY>uRI=?sb>
z$-g2gNlWdVr_S{8&kT^x^6~a?aj>ANzaWn06f*+n$E?|~Ib#bKw<b0$$j^pji4Vw{
zAS9g3($2xvV`g~t+JxQ7nW@(M_w3xXa+&{hcL!T*xdllOW at JrUC>N~QbSm>o^@FGN
zFPd9kXSOO|x4dd>cwSp`GxN-@=rBj9(1c{H!g1x-X?LD<>COCQLC%|uswdSK6W6=T
zIATm}k9C|fD|E%dvxU!^2aG&uta-C(r1|;v^G8>Q2D>?1N{A6;MKe?4lJcLo^r<vD
zJ;;hd#+&qGqw0ay#yk7A&5<#L3dslwrBM1NpS(Nt&QvAH%<qO at olRZpXvIh*14vHD
z?5C~Wb)>SkU28B`L1zrQfk(G8zS-(+Z!PIZGKszSqLTX8BRXi{wjdK5c-P%<JJ!dI
zev3GXRN)o2{_dN8W39lM)o-5ejGSvJrFsyj2ns(^^L%hj&p#A6<JfRxUD1kQSF#&1
zHjx`kG)Df3!16|Y!;UCVsuL=*wDH+>ta{W0<s1NMJH0o;!HQ}}QfbhV-OYpV%=|M!
z%Jcf6j;xg-R;@@%NaPW5#|O>)3$grN`SxfBiKH3I<qk8Cl-wKT8=+j^c=f`3M;pm2
z#7Z1|Bkyb8nO{M>W18kovpnb~P*c;w;_8hiVC)Qx4LY4xJ36dU4Gs<r3=XL at qwfqR
zGhZUGCPQ!Xk|2(F2{w$?`qJtlo-Y!djl-%pFY6!I-YLpIcQozL!L-xo3U5?*K|3YT
zyjfdUdBT|?Um!-p+U{xS8Y>Z;4MT66YVUn_t?>B4#Pw at pW7cd-IFeP|JfJa^35>D-
z%@sE(1qRZo{>NGe^p^z>(?IvD%B%V3&m2qJzjb4D*rJ6C7B7q5yeGAw;&x+eKg`T!
z=%2d();u?BNdsb>Ht(wfkg#e-Z|0=<xH{U|+1e;A6*7*?kSb(yg_Y9THDJg7ie9x5
zEP-~*;rQ8f1EQvUbNV5)C^ehZ1xGe3Num_VNYWu{Q+8vg)+{bWs_Q~(2>To{3>#2*
zuiaP(qa5z3PY4Z=5 at oQ~2$|=sRr^oBRE?M~3yk_fd7L#%JV7jBp$Kgl(!$q6jH%~Y
zMG(teLmWXfHg3V!I^IGz7=yY!)kQ&qR$}A0;<eTQTFTT_ch&a>m~+Y*Io~%!-x$+a
zU%HnA^8_(m$f`sA;y5W|`@KT%n}{K4>*YJns6fS=N3L#NZu<mLvY5p4 at YM@tY`v2=
zvkFnH|DxUf at T|L?vegORTW&p8G+Zpmpj$U0r#LCCZR{Pg9BF$y8-^eX5JP+TZ|T&T
zpcVb2v-_rkh26I`4Z0FRW*mEaF==~vNYuIwaT%MLO>1K!>?jhhsu^~{<DQYf_rDH7
zO%6HrZTd2S8!kI_aP6usyY}qO*vIVMxnu1VmMKD1U`@Nq3~<c-O}7FF;t{mVO}o}R
z1Z#rRy{x at kT3mj!vMTcybK_d>;wkpzWkmUwJ?b(Q!u*Z)JzWTnrB=jb?fU>0bD2QG
z-qK}iv&R^%wqtvc7Xt>K7p^rKfQ{MMxlE~$)Izu94ndE2zT&gv(2b60`rr0;Kie2E
zod&(fsiFo^&+}a?VGq?JigcbGQ-57h^1N}dweePY-rmHx6=BYDjsUq!;;|YXfbIKg
z&J0EryD#4O^15KjoAo`<YxB;gE}8FTYekhH3Kr;XQQ4mq8o+{*n!aRPQ at Nlt4G(tJ
z-7n8Rw>M!!kk1q=ISFEiwYzSPfp{P#Dp(3)+JED|*X4rs*!PteLVTw=*eR_PEJH~o
zrHE2StS{4ocId?BNDEOLxb;Bm6 at fG9)s^|F)2yY$4MbTlT2(BHRA+WX$w0&e#iz9c
zW>^4scC8Fia at 0)_g~U#Z)E9QGl#8OdiN`z21gYU!-f?e^l at OKi%Z7z3i{3#+>g>I1
zCpE!4(>qFluU=D~zRUFv)DpU;L~KfvvwxjJtYzNrlcM5XOI at npR4FK&w(Oro at xK)G
z at YAYIa>-ppx$a88FS63)rmUZ=;&UT(e|hE#3rQZLBo>M(voZonFF8vVz!pwE^H48#
zDl2)7*eQDUj>Byw0 at b)R(u2xJ6z4fRxhms6l@;J>Nx-v5dO^Jb^r~|S(IO2xaN9vq
z-w->;g at pGqzmOA+868wbFgO=@o_ at OI#iah*_~oLW@>#vR8T9ol0-QiEw+dOA)1y|Y
z?uK|MMg5Gd8!bktfAGlK#hj?09=Wv<^v{?1Ilz0lZS?l?QM1ul7v^Ov>V1mtcbY&y
zuy5%cak?j0(f`ofL~h9I?C*P9weWNOKBW)ei25&UNn$fS^r@&{KFbm6lhO85!oJ>>
z at O6wWM*$w+^6$GvdGAIqR|={p6wY(&zI49;q65ZlLCE}h-r|1oyY{q4)b^}$u_MLZ
zWnnw31`afE1ur))b_3cFOgQ at b`FOigAoni1-yu3OqpmH=&PwtSd_L(?(%A=PRC`){
z5L8K1EXy!7?01h7h4lv5 at 8CQi2a{wStn<94PS|Z!=b7aBOf{n1kK{hpg9|hdwcQJR
zf+(A`@>=a>fgY^PUnM7DWqc7BUsvVM0KudqgZ8!UPZE_30gLO4;%|<Nmak6ARDoNP
z>fXLOFx{Rdh$2K26b0c+E;vte#;M{Lh5~`+$L=1AcLonjPY>AEZ8R6a*{;*vJDuza
zZblq6$vHS#OIactoVB%mc+Kk}b3Tm4q{&+BCkH#y#wn)L04D%zY^lr*gs^7PN;cKq
zUM7`*6>0Ap)2JTfMJwabshN)8&sm58!t1(+!43MEy1&1<X<?wfH76kuA}y6Jp5DO=
z!`G}^zIeXZR2Lhiozv8?n3RrDy;y~=w<*QVhJHFZhBKuv0i%yWtFC`gxH{C+f+djU
zobbd81$E7>-92rMkH6iQury-TmZYke?GS*$c>AwrM9au}M7yP2c&vkC-OKp4qdH;D
z97kJAx$Dw(N3T`)YIQuX8}2DRdt}r4ulApO0S8>cq-)Gh3uWQZRYt74JU9l&gqL|#
z-SJ)Vg~O at e>^YQITGP}%0v=f~>V{uFx_7ng`t902SVQ^Xw{_ZQ+n0G#U`*RiJKUj$
zZi8nvo3!uLeZ6h3J4duSgNe at +6i{f?>$Tc3o!-PlhgtK8>Q;cgi~v(o?zH>+HtiKy
zcVq9=gTtn3I7+*ki##pam%y2u6Q9<`!zBcqh-QPq$lnp8CDp~<u~sC}2<GmgaW8nj
zMI1_Ba>Q&_jFg-LmVVdPYlKM2tZIK0H`|MDMhwN;ZAmNCyaL?!Pwe(!nO6A0)AIP!
zZ*`^@;PZ5<irwoRAYNm<f>xK^YcqU~*HjNG_Ac;~bs&~z+`m3jJ@&b{{p9WiGMadU
zIQumTC2s~{9>h2i#;NMB+q2$}?nWGAKXpk`deey3Tq{`c at LQ&gy>T86GNKo;lt;v-
zM=%4mKvAn|*|Q`_3ZW{TPLY{a54-wD&7VV6{a{c1?c!B%`VAl%C6#;lM&(pA>3Lp^
zb9r<Bje at TNy{x4SF at zKng>u%>><9gtF}=~uUxi~!gsvM_w_G|I?O;i1kQKplj$zS>
zr!sCmexZVuS0-4RM%As4 at 8z615F0T=&Ps-nB|(s^g|pAR{pU;C`bI&c(D!xRzL*x~
zJxwO135f5Ngr&=jEh%Seo;G*)ib1AYlR2!^sMQd3_V%<td61Wy;O}HZnvgZcS~yOf
z9x!Lgx=qQ4j$O>k&n&hs%+5HSma=tSba3EIHy1fWe?S%zrTfgt*bRI39z33r&K=p8
zv~6{ipSu(JE3zOIPE&#whR3dr+nTYB+p>1`vXFW1Q2TF4Dxqj8XCap>vMgD-T*gUh
zlKkhn)IZ)9;`|HeUpW85`4`T=aQ=n!FPwkj{0rw_IRC==7tX(M{)O+q at ckFQ|AMb#
z@%@*0e~0hC at ckFQ|HAiQ`2Gvuf8qPD$)7Rd`>#L!{a5<r-()Pof0OaA{e%;%F#${f
z6Tk#80ZafBzyvS>OaK$W1TX<i029CjFab;e6Tk#80ZafBzyvS>OaK$W1TX<i029Cj
zFab;e6Tk#80ZafBzyvS>OaK$W1TX<i029CjFab;e6Tk#80ZafBzyvS>OaK$W1TcaB
H7Xtqc7rqZr

diff --git a/contrib/win32/audacious.ico b/contrib/win32/audacious.ico
deleted file mode 100644
index f09461061ac6018cd0b77969b8555e2605a5ed17..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 15086
zcmdU0XKYo;6~4v+Q$n##i$U1bcv+$>KPaLZ5TX|eo0wu+0L4*$gb+X|M2P``WDGVY
z>=F>H2)&E$wP}_TB22FaQY0t85^b{DWK(t%Hk0qWeseQ--psw%&xQ>noi{UQ=9HN`
z?VOqCI7v>j)1iZdILj&glH&|^949NQK7SPW_knxoomjrF<Bad*IN7L!B2d)h5k(CH
zP_Yc~6!6a&JV9Iv=nt at k7AV*OcnJ^|U|Bh!IY14}R{})y=FP>NIdjCRQ>Vn^$B$h&
zapHu?&(C+uSO-u6K&!p54Jpy3OBZqG%o*|G#S0^xK7Cqr?%Y}GRuZFr8}Z8)En0}P
zXU}?c4<9}hPoF;Z@{%X{vo2`<4PZC3U&O+N3%$CVH*Xd#TecJ(J9ZRPr%n|;dh`%8
zXU_D>7c5wy>QGC1wwE%VJ$oivw{Gp0Q&;j}dEdT$J$m*BaR7dozcKyb!2`FvwzgKJ
zr>DE+W5$dT!-o%d)0vr>9{v6M_a*&bLHh~miIZ(ScI=qw*|Vo;)~uPV=eAjv- at A8D
z;z{r7fAr{4kN)=U+v3onLt^{(?QTDifB*jdy>iwi4)7T86Q<|Ro$Hlv-MUqlyKzcN
zirBVon^(^95u at jK{~F+P{rmA-Q~r(}JH*YKH$7T at KaMfba4gF4ybI}uj-PiyBLl~N
z6~H%s*$)K6`27HNNu!3w%paAHoWC3!AI5<FY at ENJW;#w?isMu#J5EtjJ*dpov at B;`
z(vX%DAPX=W!1bvK0++4%fS&<w0sa8sw<0iI1K0;B0JH}*Rrm at R?E!GjljAEaX5IGz
z=!t{_zxxjX?mR>sCeu_-J$?+(*HxebLmEmi157*<!Ep|x21@*2A;;<O0C94-?#-Jw
zPwd^hS6sb%)!PTIT)E=nIRE9kXrQkHj%#{QNJrss06y8Nsi|V+%9Y~LqetF)A=f-T
z=KjFCq|x~x|7!qcm;%3dHNZzVVZsD&4cBD_<+<*UA3xs5E5`d8V$*nV_bXNY;>C-_
z^XJb)+icT=wA}wxp0RW>Vl{jf8Sa~2UG7iZvuwPh;>knqbqfE_knRnTVJ{M%Y>u<L
zckdcyvrQK-UKBTO+%T4#^tyBBj_A~>lgB?MYj;d|8^pdjzHZ$*Bk%qD_lxe`ySse2
zS52EXO_Y|FiamSwh#50xh^}3`iir~^ikh05IQpWZB3(ZB=+=O_0Iw_~Bg5G5J9qB%
z?fWW?p61y`?+1Pd^498p19`5k9)AA(`Ej)5#dCsMFDN~D at L(ekt{ocPPm$-o;o-Tq
z=(=-GCnY6$by%NgAfDHzPoM6?vy5_d9?bJQsj`s%C4hUehp(!tilbG|WnR4w9XhyY
zLQ@&n43qrI%1VzuCi9Po|E0>8=S7{KJk@$k_v+P4 at cgLb2M!!)lyA`WQ_ylQdOXzg
zrm6$y<A4DJym~5)p61+8X=U0XKeYcPJ;y;|VWG&*&KAkZ$yQx>&XzQ4%x|md%KpEj
z;!NXD<ss9Y<GXh4a_78C&-BotLyhtc<BwzCH~%=Mr3^jZy?eK7Z!KTG+}-1rEnDWD
z<5eBlM>;L at ihU#df%DI|{?Jylt@|uf<(Sg63975B<K)w3Q*1oRhwBf|mA<px#*G`}
z=&AqGrAsB9F(&^52M!o%H*DCT)BFQ+<vG>2|8TD`?LXXmxDKyau|h0bv`CB^HA;*e
zInuR@%gV~clP6D%vbp~l&PDG*z6^2u at 8rpo8@2b#?@yg4O`4>)owg~@)oOU1=Z_7l
z;8?mH;$H!Ly1s(**FDJKo^J|$fTS(s(}8Pjd3m|J-phWq#q<-fu4!Ec-`@ke0)oQV
zQOI at 4rvvlq`TNqPORoJ)8=7gZTOsFf%I4WVO5k{`1;pu)AddE;KHh)|3|~g+cEC$O
zqI&R5OJ77QK%(Jo5bg)~)+pqIbYflF$!`IgDwyo=kHDOeu>CDQZZAYpl0ahwIywgj
zg3OPxF4j3tO10x86N=zMkl=&_S&wmbjJ^)M$dkM&<3F&8U73)b?Z8J0SOjPyKLt2h
z18u)NKq;USz&XKlxcrt(6UVZxfLuTt;EN2j+Y14|0DKORx<-vj^K-zr031WFD`Y?r
z`_N}wAs<z5Q$6x30feogsFHAK2FeA1KLJcSGzE^lDTA__GI0Om{?-&aM&WT6vQ#_1
zF>RR+;=jB`-DUf*G&xfmqc~^_06seodCA`w(+20A$(Ai!1byM$zj;RExq)fkH<Xl=
zh`hW!(|Os)OOf#z((?d`gk>PI at pbXEwWds&A`Tur*q}2h+q7 at rKEX4bdS_vghi$?6
zW&;~A4fTC~E1ma<5hH}jrnjBnZ1{?b3fHdF`D=OVG8qshWTKLFjcL`Ym7vXH(<c!;
z#~J-lyaR)58+?ee9w7~&uk at jfM_O8%JGK+iF$xXmh{eAv+r%}{<YSf1`o2wf`gJZ`
zxX`5iZfX-{P?k*(;J+)C)#7f*yLXF-ee|@wj~_q&%5|6R;e8=x>UzZTJWHAOX`Ts;
zG&Z|m%6k>@`t|FLy2NxWMyv+h;5+mi#L)~JHY{?#U%!6cy#qab_;6$zTiZFO2Mrn&
zr%z1Bza#Dlkl{N>#MR~c9%YTZcI}!NJ$kfnEvK)sxVTu*$3Y$GJL29(ooEB|4uor`
zO at HF)7Y*>|@$4%@4H9ws)At_4pJnvhv~Alqj#l#H{=~i6;HMGo+O-pxFJBIn!Mgy-
zON(zH&(ImbJua at EdPi?+$GLOo<lBZgS`$AL&gR#b@{SxiV&hHwfi_USi7$Q7l7}tM
z&CRv(j*PeY)K!@lp9^Ksjw?6mUr<mGs6WSZ`}XZ4>uHif+}gEk1Ld$C%KHgjUKw~)
zn0Tx2FVwz}Y5J*6bP`8jHNQRmN2aka>+wt~dD>$AeTbw*d;#!VCGY7J^e%{U!u03;
zo788?k|iErUDm2qtGs%$z8>>DuG7Wx^h^HPRCeputw6rKvj|#u#*G{2p7~FnJSn)A
znq&~iv7zg$=V?D!=y|3y+9#&BR65^Hn>N|_M#hgFJ2q5*zALln57&|Zo=Vn>qCeXc
zFt=<neR!V7x!3A_qvq-VmwIV2?X!f&kK|9;t5>fM+9z$YT|D2eNnW-%VEoWdG0xxf
z=g)`oRps#w8^6VnAwxu)Hf;iRR{O9|pFW{-xR$6iN}BVxO38cm!q!h!cRkHB5AS{W
z-h?)fiND0re%9&re8Bq2wcogZ1>G0w{DbnQ`(>#+<27s6gz9g&-<N&D{fj;lnfGG8
z!3>*M)SLS-&k^kB-o1MZp0_0g?E9XaFuRC4bnDj5tFP%g2l?(A&a2Bel|g;WGQN4V
z(TCyt_3IbfNA%4E at X0_KgV8q_Wo+{98T1VXuA6*k8P-3%@3ipe-H{ANyPaqEFq at s<
zch;;~HW@}dZ5Z|Kv8 at eU0|We9-;>HCw%U(5IXR(y#5QofnLT^9;C^a)kHI^7zW<5(
zj)86BJvMYRfo?ytDeqe9ibU*puAzKCNRT$9t)ET!5c{2LrXJpO{|VdkBY^39xjv<^
zxnSzYhT<aluYRC+yppH?@R6+z{|ElV2hc6Zf5 at ir+LHIY#_#Y2`fsTd-w;Fz`KUzu
z-q;4>U$g%l*Te4pETYKa+o);PpJnp?BFxWXngiTd8*qQYJJv+PN)Q=+L%{pm#{Zk}
z%*V5$yg!ovXOQ<t^uN)sk(HI at qt$sSdCKPA+L-Vr-`~l0zsdKfvJEYfC<0j5CX_`T
z7q)uzfl~%$y{f=7EAI+E0oe3tD4x7Z0H%8hpkGNy1=lz6{f4PC(t*qalmhrhhHqs)
z(ttRY@!RDBn&kbA5Opc;BPD!sH-<-uFP{Z&@9CWt)p%^gxCrlv7(+0BxUlgbINVsA
z9Q-$mai-(&(x0zCWn9O6O8p-|@V8F)k05GX#PX#2L9fO{H)SXyGlQIJ;thJ$5f8m(
jJ7g@|Dcddk0bSzui`P%pv3{!q8x#uJuS~m8-|zngsu1%D

diff --git a/contrib/win32/gtkrc b/contrib/win32/gtkrc
new file mode 100644
index 000000000000..14456b56d79f
--- /dev/null
+++ b/contrib/win32/gtkrc
@@ -0,0 +1 @@
+gtk-icon-theme-name = "gnome"
diff --git a/contrib/win32/notes.html b/contrib/win32/notes.html
index 69a7b27706c2..1f1e47087f8a 100644
--- a/contrib/win32/notes.html
+++ b/contrib/win32/notes.html
@@ -58,8 +58,8 @@ mingw-get upgrade mingw32-w32api=3.17-2</tt></p></blockquote>
 <h3>Install libpng</h3>
 
 <p>Download and unzip to <tt>C:\libpng</tt>:<br>
-<a href="http://sourceforge.net/projects/libpng/files/libpng16/1.6.8/libpng-1.6.8.tar.xz/download">
-<tt>http://sourceforge.net/projects/libpng/files/libpng16/1.6.8/libpng-1.6.8.tar.xz/download</tt></a></p>
+<a href="http://sourceforge.net/projects/libpng/files/libpng16/1.6.12/libpng-1.6.12.tar.xz/download">
+<tt>http://sourceforge.net/projects/libpng/files/libpng16/1.6.12/libpng-1.6.12.tar.xz/download</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/libpng<br>
@@ -94,11 +94,12 @@ make install</tt></p></blockquote>
 <h3>Install GLib</h3>
 
 <p>Download and unzip to <tt>C:\glib</tt>:<br>
-<a href="http://ftp.gnome.org/pub/GNOME/sources/glib/2.38/glib-2.38.2.tar.xz">
-<tt>http://ftp.gnome.org/pub/GNOME/sources/glib/2.38/glib-2.38.2.tar.xz</tt></a></p>
+<a href="http://ftp.gnome.org/pub/GNOME/sources/glib/2.40/glib-2.40.0.tar.xz">
+<tt>http://ftp.gnome.org/pub/GNOME/sources/glib/2.40/glib-2.40.0.tar.xz</tt></a></p>
 
-<p>Apply the patch <tt>gdbus-codegen.in.diff</tt> to <tt>C:\glib\gio\gdbus-2.0\codegen\gdbus-codegen.in</tt>.<br>
-Apply the patch <tt>ggettext.diff</tt> to <tt>C:\glib\glib\ggettext.c</tt>.</p>
+<p>Apply the patch <tt>ggettext.c.diff</tt> to <tt>C:\glib\glib\ggettext.c</tt>.<br>
+Apply the patch <tt>grand.c.diff</tt> to <tt>C:\glib\glib\grand.c</tt>.<br>
+Apply the patch <tt>glocalfileinfo.c.diff</tt> to <tt>C:\glib\gio\glocalfileinfo.c</tt>.</p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/glib<br>
@@ -123,8 +124,8 @@ make install</tt></p></blockquote>
 <h3>Install pixman</h3>
 
 <p>Download and unzip to <tt>C:\pixman</tt>:<br>
-<a href="http://cairographics.org/releases/pixman-0.32.4.tar.gz">
-<tt>http://cairographics.org/releases/pixman-0.32.4.tar.gz</tt></a></p>
+<a href="http://cairographics.org/releases/pixman-0.32.6.tar.gz">
+<tt>http://cairographics.org/releases/pixman-0.32.6.tar.gz</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/pixman<br>
@@ -159,8 +160,8 @@ make install</tt></p></blockquote>
 <h3>Install gdk-pixbuf</h3>
 
 <p>Download and unzip to <tt>C:\gdk-pixbuf</tt>:<br>
-<a href="http://ftp.gnome.org/pub/GNOME/sources/gdk-pixbuf/2.30/gdk-pixbuf-2.30.3.tar.xz">
-<tt>http://ftp.gnome.org/pub/GNOME/sources/gdk-pixbuf/2.30/gdk-pixbuf-2.30.3.tar.xz</tt></a></p>
+<a href="http://ftp.gnome.org/pub/GNOME/sources/gdk-pixbuf/2.30/gdk-pixbuf-2.30.8.tar.xz">
+<tt>http://ftp.gnome.org/pub/GNOME/sources/gdk-pixbuf/2.30/gdk-pixbuf-2.30.8.tar.xz</tt></a></p>
 
 <p>Apply the patch <tt>gdk-pixbuf-io.c.diff</tt> to <tt>C:\gdk-pixbuf\gdk-pixbuf\gdk-pixbuf-io.c</tt>.</p>
 
@@ -173,8 +174,8 @@ make install</tt></p></blockquote>
 <h3>Install ATK</h3>
 
 <p>Download and unzip to <tt>C:\atk</tt>:<br>
-<a href="http://ftp.gnome.org/pub/gnome/sources/atk/2.10/atk-2.10.0.tar.xz">
-<tt>http://ftp.gnome.org/pub/gnome/sources/atk/2.10/atk-2.10.0.tar.xz</tt></a></p>
+<a href="http://ftp.gnome.org/pub/gnome/sources/atk/2.12/atk-2.12.0.tar.xz">
+<tt>http://ftp.gnome.org/pub/gnome/sources/atk/2.12/atk-2.12.0.tar.xz</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/atk<br>
@@ -185,22 +186,22 @@ make install</tt></p></blockquote>
 <h3>Install GTK+</h3>
 
 <p>Download and unzip to <tt>C:\gtksrc</tt>:<br>
-<a href="http://ftp.gnome.org/pub/GNOME/sources/gtk+/3.8/gtk+-3.8.8.tar.xz">
-<tt>http://ftp.gnome.org/pub/GNOME/sources/gtk+/3.8/gtk+-3.8.8.tar.xz</tt></a></p>
+<a href="http://ftp.gnome.org/pub/GNOME/sources/gtk+/2.24/gtk+-2.24.24.tar.xz">
+<tt>http://ftp.gnome.org/pub/GNOME/sources/gtk+/2.24/gtk+-2.24.24.tar.xz</tt></a></p>
 
-<p>Apply the patch <tt>gtksettings.c.diff</tt> to <tt>C:\gtksrc\gtk\gtksettings.c</tt>.</p>
+<p>Apply the patch <tt>gdkwindow.c.diff</tt> to <tt>C:\gtksrc\gdk\gdkwindow.c</tt>.<br>
+Apply the patch <tt>gtk-input-makefile.in.diff</tt> to <tt>C:\gtksrc\modules\input\Makefile.in</tt>.</p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/gtksrc<br>
-CFLAGS="-DHAVE_ISNAN -DHAVE_ISINF" ./configure --prefix=/C/GTK<br>
+./configure --prefix=/C/GTK<br>
 make<br>
 make install</tt></p></blockquote>
 
 <p><i>It may be necessary to run the MinGW shell with administrative privileges
 for GTK+ to build successfully.</i></p>
 
-<p>Copy <tt>settings.ini</tt> (accompanying this document) to
-<tt>C:\GTK\etc\gtk-3.0\settings.ini</tt>.
+<p>Copy <tt>gtkrc</tt> (accompanying this document) to <tt>C:\GTK\etc\gtk-2.0\gtkrc</tt>.
 
 <h3>Install intltool</h3>
 
@@ -249,8 +250,8 @@ make install</tt></p></blockquote>
 <h3>Install libxml</h3>
 
 <p>Download and unzip to <tt>C:\libxml</tt>:<br>
-<a href="ftp://xmlsoft.org/libxml2/libxml2-2.9.1.tar.gz">
-<tt>ftp://xmlsoft.org/libxml2/libxml2-2.9.1.tar.gz</tt></a></p>
+<a href="ftp://xmlsoft.org/libxml2/libxml2-2.9.2.tar.gz">
+<tt>ftp://xmlsoft.org/libxml2/libxml2-2.9.2.tar.gz</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/libxml<br>
@@ -261,8 +262,8 @@ make install</tt></p></blockquote>
 <h3>Install mpg123</h3>
 
 <p>Download and unzip to <tt>C:\mpg123</tt>:<br>
-<a href="http://mpg123.de/download/mpg123-1.17.0.tar.bz2">
-<tt>http://mpg123.de/download/mpg123-1.17.0.tar.bz2</tt></a></p>
+<a href="http://mpg123.de/download/mpg123-1.21.0.tar.bz2">
+<tt>http://mpg123.de/download/mpg123-1.21.0.tar.bz2</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/mpg123<br>
@@ -373,8 +374,8 @@ make install</tt></p></blockquote>
 <h3>Install libflac</h3>
 
 <p>Download and unzip to <tt>C:\libflac</tt>:<br>
-<a href="http://downloads.xiph.org/releases/flac/flac-1.3.0.tar.xz">
-<tt>http://downloads.xiph.org/releases/flac/flac-1.3.0.tar.xz</tt></a></p>
+<a href="http://downloads.xiph.org/releases/flac/flac-1.3.1.tar.xz">
+<tt>http://downloads.xiph.org/releases/flac/flac-1.3.1.tar.xz</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/libflac<br>
@@ -385,8 +386,8 @@ make install</tt></p></blockquote>
 <h3>Install libogg</h3>
 
 <p>Download and unzip to <tt>C:\libogg</tt>:<br>
-<a href="http://downloads.xiph.org/releases/ogg/libogg-1.3.1.tar.xz">
-<tt>http://downloads.xiph.org/releases/ogg/libogg-1.3.1.tar.xz</tt></a></p>
+<a href="http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.xz">
+<tt>http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.xz</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/libogg<br>
@@ -409,8 +410,8 @@ make install</tt></p></blockquote>
 <h3>Install OpenSSL</h3>
 
 <p>Download and unzip to <tt>C:\openssl</tt>:<br>
-<a href="http://www.openssl.org/source/openssl-1.0.1f.tar.gz">
-<tt>http://www.openssl.org/source/openssl-1.0.1f.tar.gz</tt></a></p>
+<a href="http://www.openssl.org/source/openssl-1.0.1j.tar.gz">
+<tt>http://www.openssl.org/source/openssl-1.0.1j.tar.gz</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/openssl<br>
@@ -421,8 +422,8 @@ make install</tt></p></blockquote>
 <h3>Install libneon</h3>
 
 <p>Download and unzip to <tt>C:\libneon</tt>:<br>
-<a href="http://www.webdav.org/neon/neon-0.30.0.tar.gz">
-<tt>http://www.webdav.org/neon/neon-0.30.0.tar.gz</tt></a></p>
+<a href="http://www.webdav.org/neon/neon-0.30.1.tar.gz">
+<tt>http://www.webdav.org/neon/neon-0.30.1.tar.gz</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/libneon<br>
@@ -460,8 +461,8 @@ make install</tt></p></blockquote>
 <h3>Install FFmpeg</h3>
 
 <p>Download and unzip to <tt>C:\ffmpeg</tt>:<br>
-<a href="http://ffmpeg.org/releases/ffmpeg-2.1.3.tar.bz2">
-<tt>http://ffmpeg.org/releases/ffmpeg-2.1.3.tar.bz2</tt></a></p>
+<a href="http://ffmpeg.org/releases/ffmpeg-2.5.2.tar.bz2">
+<tt>http://ffmpeg.org/releases/ffmpeg-2.5.2.tar.bz2</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/ffmpeg<br>
@@ -489,8 +490,8 @@ make install</tt></p></blockquote>
 <h3>Install libcurl</h3>
 
 <p>Download and unzip to <tt>C:\libcurl</tt>:<br>
-<a href="http://curl.haxx.se/download/curl-7.34.0.tar.bz2">
-<tt>http://curl.haxx.se/download/curl-7.34.0.tar.bz2</tt></a></p>
+<a href="http://curl.haxx.se/download/curl-7.39.0.tar.bz2">
+<tt>http://curl.haxx.se/download/curl-7.39.0.tar.bz2</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/libcurl<br>
@@ -501,24 +502,24 @@ make install</tt></p></blockquote>
 <h3>Install libmms</h3>
 
 <p>Download and unzip to <tt>C:\libmms</tt>:<br>
-<a href="http://sourceforge.net/projects/libmms/files/libmms/0.6.2/libmms-0.6.2.tar.gz/download">
-<tt>http://sourceforge.net/projects/libmms/files/libmms/0.6.2/libmms-0.6.2.tar.gz/download</tt></a></p>
+<a href="http://sourceforge.net/projects/libmms/files/libmms/0.6.4/libmms-0.6.4.tar.gz/download">
+<tt>http://sourceforge.net/projects/libmms/files/libmms/0.6.4/libmms-0.6.4.tar.gz/download</tt></a></p>
 
-<p>Apply the patch <tt>libmms-makefile.am.diff</tt> to <tt>C:\libmms\src\Makefile.am</tt>.<br>
-Apply the patch <tt>libmms-seek-fix.diff</tt> (it changes multiple files).</p>
+<p>Apply the patch <tt>libmms-strndup.diff</tt> (it changes multiple files).</p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/libmms<br>
-./autogen.sh<br>
-LIBS=-liconv ./configure --prefix=/C/libs<br>
+cp /C/MinGW/share/libtool/config/ltmain.sh .<br>
+autoreconf<br>
+./configure --prefix=/C/libs<br>
 make<br>
 make install</tt></p></blockquote>
 
 <h3>Install libmodplug</h3>
 
 <p>Download and unzip to <tt>C:\libmodplug</tt>:<br>
-<a href="http://sourceforge.net/projects/modplug-xmms/files/libmodplug/0.8.8.4/libmodplug-0.8.8.4.tar.gz/download">
-<tt>http://sourceforge.net/projects/modplug-xmms/files/libmodplug/0.8.8.4/libmodplug-0.8.8.4.tar.gz/download</tt></a></p>
+<a href="http://sourceforge.net/projects/modplug-xmms/files/libmodplug/0.8.8.5/libmodplug-0.8.8.5.tar.gz/download">
+<tt>http://sourceforge.net/projects/modplug-xmms/files/libmodplug/0.8.8.5/libmodplug-0.8.8.5.tar.gz/download</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/libmodplug<br>
@@ -529,11 +530,13 @@ make install</tt></p></blockquote>
 <h3>Install libsidplayfp</h3>
 
 <p>Download and unzip to <tt>C:\libsidplayfp</tt>:<br>
-<a href="http://sourceforge.net/projects/sidplay-residfp/files/libsidplayfp/1.2/libsidplayfp-1.2.2.tar.gz/download">
-<tt>http://sourceforge.net/projects/sidplay-residfp/files/libsidplayfp/1.2/libsidplayfp-1.2.2.tar.gz/download</tt></a></p>
+<a href="http://sourceforge.net/projects/sidplay-residfp/files/libsidplayfp/1.6/libsidplayfp-1.6.2.tar.gz/download">
+<tt>http://sourceforge.net/projects/sidplay-residfp/files/libsidplayfp/1.6/libsidplayfp-1.6.2.tar.gz/download</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/libsidplayfp<br>
+touch sidplayfp/psiddrv.o65
+touch sidplayfp/psiddrv.bin
 ./configure --prefix=/C/libs<br>
 make<br>
 make install</tt></p></blockquote>
@@ -556,8 +559,8 @@ make install</tt></p></blockquote>
 <h3>Install Audacious</h3>
 
 <p>Download and unzip to <tt>C:\audacious</tt>:<br>
-<a href="http://distfiles.audacious-media-player.org/audacious-3.4.1.tar.bz2">
-<tt>http://distfiles.audacious-media-player.org/audacious-3.4.1.tar.bz2</tt></a></p>
+<a href="http://distfiles.audacious-media-player.org/audacious-3.6.tar.bz2">
+<tt>http://distfiles.audacious-media-player.org/audacious-3.6.tar.bz2</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/audacious<br>
@@ -568,8 +571,8 @@ make install</tt></p></blockquote>
 <h3>Install Audacious Plugins</h3>
 
 <p>Download and unzip to <tt>C:\audacious-plugins</tt>:<br>
-<a href="http://distfiles.audacious-media-player.org/audacious-plugins-3.4.1.tar.bz2">
-<tt>http://distfiles.audacious-media-player.org/audacious-plugins-3.4.1.tar.bz2</tt></a></p>
+<a href="http://distfiles.audacious-media-player.org/audacious-plugins-3.6.tar.bz2">
+<tt>http://distfiles.audacious-media-player.org/audacious-plugins-3.6.tar.bz2</tt></a></p>
 
 <p>In the MinGW shell:</p>
 <blockquote><p><tt>cd /C/audacious-plugins<br>
diff --git a/contrib/win32/patches/gdbus-codegen.in.diff b/contrib/win32/patches/gdbus-codegen.in.diff
deleted file mode 100644
index 20a239ba52a0..000000000000
--- a/contrib/win32/patches/gdbus-codegen.in.diff
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/gio/gdbus-2.0/codegen/gdbus-codegen.in b/gio/gdbus-2.0/codegen/gdbus-codegen.in
-index 253d151..c92b63b 100644
---- a/gio/gdbus-2.0/codegen/gdbus-codegen.in
-+++ b/gio/gdbus-2.0/codegen/gdbus-codegen.in
-@@ -31,7 +31,7 @@ if srcdir is not None:
-     path = os.path.join(srcdir, 'gio', 'gdbus-2.0')
- elif os.name == 'nt':
-     # Makes gdbus-codegen 'relocatable' at runtime on Windows.
--    path = os.path.join(os.path.dirname(__file__), '..', 'lib', 'gdbus-2.0')
-+    path = os.path.join(os.path.dirname(__file__), '..', 'share', 'glib-2.0')
- else:
-     path = os.path.join('@datadir@', 'glib-2.0')
- 
diff --git a/contrib/win32/patches/gdkwindow.c.diff b/contrib/win32/patches/gdkwindow.c.diff
new file mode 100644
index 000000000000..d1cf5b40e6bf
--- /dev/null
+++ b/contrib/win32/patches/gdkwindow.c.diff
@@ -0,0 +1,32 @@
+diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
+index f5f0339..c52b01b 100644
+--- a/gdk/gdkwindow.c
++++ b/gdk/gdkwindow.c
+@@ -2984,15 +2984,10 @@ gdk_window_begin_paint_region (GdkWindow       *window,
+ 
+   if (implicit_paint)
+     {
+-      int width, height;
+-
+       paint->uses_implicit = TRUE;
+       paint->pixmap = g_object_ref (implicit_paint->pixmap);
+       paint->x_offset = -private->abs_x + implicit_paint->x_offset;
+       paint->y_offset = -private->abs_y + implicit_paint->y_offset;
+-
+-      gdk_drawable_get_size (paint->pixmap, &width, &height);
+-      paint->surface = _gdk_drawable_create_cairo_surface (paint->pixmap, width, height);
+     }
+   else
+     {
+@@ -3002,9 +2997,10 @@ gdk_window_begin_paint_region (GdkWindow       *window,
+       paint->pixmap =
+ 	gdk_pixmap_new (window,
+ 			MAX (clip_box.width, 1), MAX (clip_box.height, 1), -1);
+-      paint->surface = _gdk_drawable_ref_cairo_surface (paint->pixmap);
+     }
+ 
++  paint->surface = _gdk_drawable_ref_cairo_surface (paint->pixmap);
++
+   if (paint->surface)
+     cairo_surface_set_device_offset (paint->surface,
+ 				     -paint->x_offset, -paint->y_offset);
diff --git a/contrib/win32/patches/glocalfileinfo.c.diff b/contrib/win32/patches/glocalfileinfo.c.diff
new file mode 100644
index 000000000000..e7cb4a6a4932
--- /dev/null
+++ b/contrib/win32/patches/glocalfileinfo.c.diff
@@ -0,0 +1,48 @@
+From 868976ebfbe3974c18f21b9402623dd5123a4c07 Mon Sep 17 00:00:00 2001
+From: Matthias Clasen <mclasen at redhat.com>
+Date: Fri, 20 Jun 2014 20:54:47 -0400
+Subject: [PATCH] Return folder as icon for directories
+
+'folder' is the name of the folder icon in the incon naming spec,
+and the Adwaita icon theme doesn't include an inode-directory icon.
+This fixes folders appearing as generic file in the file chooser.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=731996
+---
+ gio/glocalfileinfo.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c
+index 52e3df1..71ba728 100644
+--- a/gio/glocalfileinfo.c
++++ b/gio/glocalfileinfo.c
+@@ -1581,6 +1581,7 @@ _g_local_file_info_get_nostat (GFileInfo              *info,
+ 
+ static const char *
+ get_icon_name (const char *path,
++               const char *content_type,
+                gboolean    use_symbolic,
+                gboolean   *with_fallbacks_out)
+ {
+@@ -1625,6 +1626,10 @@ get_icon_name (const char *path,
+     {
+       name = use_symbolic ? "folder-videos-symbolic" : "folder-videos";
+     }
++  else if (g_strcmp0 (content_type, "inode/directory") == 0)
++    {
++      name = use_symbolic ? "folder-symbolic" : "folder";
++    }
+   else
+     {
+       name = NULL;
+@@ -1645,7 +1650,7 @@ get_icon (const char *path,
+   const char *icon_name;
+   gboolean with_fallbacks;
+ 
+-  icon_name = get_icon_name (path, use_symbolic, &with_fallbacks);
++  icon_name = get_icon_name (path, content_type, use_symbolic, &with_fallbacks);
+   if (icon_name != NULL)
+     {
+       if (with_fallbacks)
+-- 
+2.0.0
\ No newline at end of file
diff --git a/contrib/win32/patches/grand.c.diff b/contrib/win32/patches/grand.c.diff
new file mode 100644
index 000000000000..5a90631c5d08
--- /dev/null
+++ b/contrib/win32/patches/grand.c.diff
@@ -0,0 +1,59 @@
+--- grand.c.0	2014-02-22 10:29:07 -0500
++++ grand.c	2014-08-09 09:52:24 -0400
+@@ -35,7 +35,6 @@
+  */
+ 
+ #include "config.h"
+-#define _CRT_RAND_S
+ 
+ #include <math.h>
+ #include <errno.h>
+@@ -55,7 +54,7 @@
+ #endif
+ 
+ #ifdef G_OS_WIN32
+-#include <stdlib.h>
++#include <process.h>		/* For getpid() */
+ #endif
+ 
+ /**
+@@ -217,9 +216,9 @@
+ g_rand_new (void)
+ {
+   guint32 seed[4];
++  GTimeVal now;
+ #ifdef G_OS_UNIX
+   static gboolean dev_urandom_exists = TRUE;
+-  GTimeVal now;
+ 
+   if (dev_urandom_exists)
+     {
+@@ -251,6 +250,9 @@
+       else
+ 	dev_urandom_exists = FALSE;
+     }
++#else
++  static gboolean dev_urandom_exists = FALSE;
++#endif
+ 
+   if (!dev_urandom_exists)
+     {  
+@@ -258,14 +260,12 @@
+       seed[0] = now.tv_sec;
+       seed[1] = now.tv_usec;
+       seed[2] = getpid ();
++#ifdef G_OS_UNIX
+       seed[3] = getppid ();
+-    }
+-#else /* G_OS_WIN32 */
+-  gint i;
+-
+-  for (i = 0; i < G_N_ELEMENTS (seed); i++)
+-    rand_s (&seed[i]);
++#else
++      seed[3] = 0;
+ #endif
++    }
+ 
+   return g_rand_new_with_seed_array (seed, 4);
+ }
diff --git a/contrib/win32/patches/gtk-input-makefile.in.diff b/contrib/win32/patches/gtk-input-makefile.in.diff
new file mode 100644
index 000000000000..7ad3ce806f52
--- /dev/null
+++ b/contrib/win32/patches/gtk-input-makefile.in.diff
@@ -0,0 +1,11 @@
+--- Makefile.in.0	2014-06-23 12:04:46 -0400
++++ Makefile.in	2014-08-09 12:54:49 -0400
+@@ -1393,7 +1393,7 @@
+ 	  echo $(mkinstalldirs) $(DESTDIR)$(sysconfdir)/gtk-2.0 ; \
+ 	  $(mkinstalldirs) $(DESTDIR)$(sysconfdir)/gtk-2.0 ; \
+ 	  echo "$(DESTDOR)$(bindir)/gtk-query-immodules-2.0 > $(DESTDIR)$(libdir)/gtk-2.0/$(GTK_BINARY_VERSION)/immodules.cache" ; \
+-	  $(DESTDIR)/$(bindir)/gtk-query-immodules-2.0 > $(DESTDIR)$(libdir)/gtk-2.0/$(GTK_BINARY_VERSION)/immodules.cache ; \
++	  $(DESTDIR)$(bindir)/gtk-query-immodules-2.0 > $(DESTDIR)$(libdir)/gtk-2.0/$(GTK_BINARY_VERSION)/immodules.cache ; \
+ 	else \
+ 	  echo "***" ; \
+ 	  echo "*** Warning: immodules.cache not built" ; \
diff --git a/contrib/win32/patches/gtksettings.c.diff b/contrib/win32/patches/gtksettings.c.diff
deleted file mode 100644
index 4eb47d072167..000000000000
--- a/contrib/win32/patches/gtksettings.c.diff
+++ /dev/null
@@ -1,14 +0,0 @@
---- gtksettings.c.0	2013-08-30 07:08:29 -0400
-+++ gtksettings.c	2013-09-15 12:55:35 -0400
-@@ -2577,9 +2577,9 @@
-   GtkSettingsPrivate *priv = settings->priv;
-   gint hinting;
-   gchar *hint_style_str;
--  cairo_hint_style_t hint_style = CAIRO_HINT_STYLE_NONE;
-+  cairo_hint_style_t hint_style = CAIRO_HINT_STYLE_DEFAULT;
-   gint antialias;
--  cairo_antialias_t antialias_mode = CAIRO_ANTIALIAS_GRAY;
-+  cairo_antialias_t antialias_mode = CAIRO_ANTIALIAS_DEFAULT;
-   gchar *rgba_str;
-   cairo_subpixel_order_t subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
-   cairo_font_options_t *options;
diff --git a/contrib/win32/patches/libmms-makefile.am.diff b/contrib/win32/patches/libmms-makefile.am.diff
deleted file mode 100644
index 50c5c9733118..000000000000
--- a/contrib/win32/patches/libmms-makefile.am.diff
+++ /dev/null
@@ -1,11 +0,0 @@
---- Makefile.am.0	2012-07-01 21:24:36 -0400
-+++ Makefile.am	2012-07-01 21:24:56 -0400
-@@ -22,7 +22,7 @@
- # noinst_HEADERS = 
- 
- libmms_la_LDFLAGS = -version-info 0:2:0 -no-undefined -export-dynamic
--libmms_la_LIBADD = $(GLIB_LIBS)
-+libmms_la_LIBADD = $(MMS_LIBS) $(GLIB_LIBS)
- 
- libmmsincdir = $(includedir)/libmms
- 
diff --git a/contrib/win32/patches/libmms-seek-fix.diff b/contrib/win32/patches/libmms-seek-fix.diff
deleted file mode 100644
index 06b7a6ff2ada..000000000000
--- a/contrib/win32/patches/libmms-seek-fix.diff
+++ /dev/null
@@ -1,54 +0,0 @@
-diff -ur libmms-0.6.2-base/src/mms-common-funcs.h libmms-0.6.2/src/mms-common-funcs.h
---- libmms-0.6.2-base/src/mms-common-funcs.h	2011-01-17 05:39:09.000000000 -0500
-+++ libmms-0.6.2/src/mms-common-funcs.h	2013-06-04 01:26:19.639856484 -0400
-@@ -159,6 +159,7 @@
-         }
-         this->file_len       = LE_64(this->asf_header + i + 40);
-         this->file_time      = LE_64(this->asf_header + i + 48);
-+        this->asf_num_packets = LE_64(this->asf_header + i + 56);
-         this->time_len       = LE_64(this->asf_header + i + 64);
-         //this->time_len       = LE_64(this->asf_header + i + 72);
-         this->preroll        = LE_64(this->asf_header + i + 80);
-diff -ur libmms-0.6.2-base/src/mmsh.c libmms-0.6.2/src/mmsh.c
---- libmms-0.6.2-base/src/mmsh.c	2011-01-17 05:51:12.000000000 -0500
-+++ libmms-0.6.2/src/mmsh.c	2013-06-04 01:27:51.632691449 -0400
-@@ -334,6 +334,7 @@
-   }
-   this->chunk_type       = LE_16 (&chunk_header[0]);
-   this->chunk_length     = LE_16 (&chunk_header[2]);
-+  this->chunk_seq_number = -1;
- 
-   switch (this->chunk_type) {
-     case CHUNK_TYPE_DATA:
-@@ -603,6 +604,7 @@
-   this->s               = -1;
-   this->bandwidth       = bandwidth;
-   this->http_request_number = 1;
-+  this->chunk_seq_number = -1;
- 
-   if (this->proxy_url) {
-     proxy_uri = gnet_uri_new(this->proxy_url);
-@@ -691,10 +693,13 @@
-          *     0: stop
-          *     1: a new stream follows
-          */
--        if (this->chunk_seq_number == 0)
-+        if (this->chunk_seq_number == 0) {
-+          this->chunk_seq_number = -1;
-           return EOS;
-+        }
- 
-         this->http_request_number = 1;
-+        this->chunk_seq_number = -1;
-         if (!mmsh_connect_int (io, this, 0, 0))
-           return MMSH_ERROR;
- 
-@@ -916,7 +921,7 @@
-     }
-     
-     lprintf("seek to %d, packet: %d\n", (int)dest, (int)dest_packet_seq);
--    if (!mmsh_connect_int(io, this, (dest_packet_seq+1) * this->asf_packet_len, 0)) {
-+    if (!mmsh_connect_int(io, this, this->asf_header_len + dest_packet_seq * this->asf_packet_len, 0)) {
-       /* Oops no more connection let our caller know things are fscked up */
-       return this->current_pos = -1;
-     }
diff --git a/contrib/win32/patches/libmms-strndup.diff b/contrib/win32/patches/libmms-strndup.diff
new file mode 100644
index 000000000000..3c875eed4b71
--- /dev/null
+++ b/contrib/win32/patches/libmms-strndup.diff
@@ -0,0 +1,44 @@
+diff -ur libmms-0.6.4-orig/configure.in libmms-0.6.4/configure.in
+--- libmms-0.6.4-orig/configure.in	2014-04-08 23:15:23 -0400
++++ libmms-0.6.4/configure.in	2015-01-02 13:03:49 -0500
+@@ -14,6 +14,7 @@
+ 
+ dnl Checks for header files.
+ AC_CHECK_HEADERS([sys/socket.h netinet/in.h netdb.h windows.h winsock2.h])
++AC_CHECK_FUNCS([strndup])
+ 
+ case $host in
+     *beos*)
+diff -ur libmms-0.6.4-orig/src/uri.c libmms-0.6.4/src/uri.c
+--- libmms-0.6.4-orig/src/uri.c	2014-04-02 10:22:58 -0400
++++ libmms-0.6.4/src/uri.c	2015-01-02 13:07:13 -0500
+@@ -125,6 +125,29 @@
+ #define ISSPACE(C) (((C) >= 9 && (C) <= 13) || (C) == ' ')
+ 
+ 
++/* Implement the strndup function.
++   Copyright (C) 2005 Free Software Foundation, Inc.
++   Written by Kaveh R. Ghazi <ghazi at caip.rutgers.edu>. */
++#ifndef HAVE_STRNDUP
++char *
++strndup (const char *s, size_t n)
++{
++  char *result;
++  size_t len = strlen (s);
++
++  if (n < len)
++    len = n;
++
++  result = (char *) malloc (len + 1);
++  if (!result)
++    return 0;
++
++  result[len] = '\0';
++  return (char *) memcpy (result, s, len);
++}
++#endif
++
++
+ static int split_user_passwd(const char* in, char** user, char** passwd)
+ {
+   char *pass, *tmp = g_strdup(in);
diff --git a/contrib/win32/settings.ini b/contrib/win32/settings.ini
deleted file mode 100644
index 17e1139cf67c..000000000000
--- a/contrib/win32/settings.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[Settings]
-gtk-auto-mnemonics = 1
-gtk-font-name = Segoe UI 9
-gtk-icon-theme-name=gnome
diff --git a/debian/changelog b/debian/changelog
index eed71fd45d68..566aff3f3011 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+audacious (3.6.1-0.1) UNRELEASED; urgency=medium
+
+  * Non-maintainer upload.
+  * New upstream version.
+
+ -- Julian Wollrath <jwollrath at web.de>  Sun, 03 May 2015 12:10:44 +0200
+
 audacious (3.5-2) unstable; urgency=medium
 
   [ Sebastian Ramacher ]
diff --git a/extra.mk.in b/extra.mk.in
index 669a4c3e2dd8..cc5be8cec7be 100644
--- a/extra.mk.in
+++ b/extra.mk.in
@@ -1,6 +1,8 @@
 HAVE_MSWINDOWS ?= @HAVE_MSWINDOWS@
 USE_CHARDET ?= @USE_CHARDET@
 USE_DBUS ?= @USE_DBUS@
+USE_GTK ?= @USE_GTK@
+USE_QT ?= @USE_QT@
 
 GIO_CFLAGS ?= @GIO_CFLAGS@
 GIO_LIBS ?= @GIO_LIBS@
@@ -12,3 +14,5 @@ GTK_CFLAGS ?= @GTK_CFLAGS@
 GTK_LIBS ?= @GTK_LIBS@
 LIBGUESS_CFLAGS ?= @LIBGUESS_CFLAGS@
 LIBGUESS_LIBS ?= @LIBGUESS_LIBS@
+QT_CFLAGS ?= @QT_CFLAGS@
+QT_LIBS ?= @QT_LIBS@
diff --git a/images/Makefile b/images/Makefile
new file mode 100644
index 000000000000..a4882ef284b7
--- /dev/null
+++ b/images/Makefile
@@ -0,0 +1,11 @@
+include ../buildsys.mk
+
+install-extra:
+	${MKDIR_P} ${DESTDIR}${datarootdir}/icons/hicolor/48x48/apps
+	${MKDIR_P} ${DESTDIR}${datarootdir}/icons/hicolor/scalable/apps
+	${INSTALL} -m 644 audacious.png "${DESTDIR}${datarootdir}/icons/hicolor/48x48/apps/audacious.png"
+	${INSTALL} -m 644 audacious.svg "${DESTDIR}${datarootdir}/icons/hicolor/scalable/apps/audacious.svg"
+
+uninstall-extra:
+	if test -f "${DESTDIR}${datarootdir}/icons/hicolor/48x48/apps/audacious.png" ; then ${RM} "${DESTDIR}${datarootdir}/icons/hicolor/48x48/apps/audacious.png" ; fi
+	if test -f "${DESTDIR}${datarootdir}/icons/hicolor/scalable/apps/audacious.svg" ; then ${RM} "${DESTDIR}${datarootdir}/icons/hicolor/scalable/apps/audacious.svg" ; fi
diff --git a/images/about-logo.png b/images/about-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..32fb69faa57b204783f0c9455c0a5bb0ccd2ab0a
GIT binary patch
literal 20019
zcmafbWmHvL*zTs0Qt1u}=?+0kx&@?LLb^MoySt^~sFWZ`hzLqIC at I|_D5WS8_ub!j
z at 9(Q)92sZecCESQe4kvzX=*6q<51!t5D0u_B{^*b0;L|lHp9k*|7K1V+=4$)Jhc^N
z5OrhJdk6$QLRs#Sj^DzesjpwA?(bmRsb^EN0oZqpSY at QqKi!kZh at 3EqEh($xo<<GF
z{U}dNN=$;yT0<WmN+>O_qsfMux~#f*$4D?rkWePz1yjc0<@LaajE5pCBB$!A2EJpb
zLF3X at OKmG{I}-4_2zRcR+ovJH^uUtr{r~^VN<;Z)#i;LdUlAGo)0s#9&4?URql at cd
zIoe)n)q~0Z{iszNvV!oe3Fe*aaWt|I`)!I3bN}D>I(ZZux}|&Op!p7pBCH;%%GQZ(
zul%AenGYL5{@u}@NlA>5fQfW>i!JFN4+BN{as=8~V;f|`UT2#KZEC4=la2^dr_Mk6
zpYN79X-rTq=?%}sZ6hA}xOX!@92ZJP<!_Izq>HARRvrI0L<q~y+eAmt6^jpfbH4|M
zxwWN-<52GFBU})RgIfyMRo2}4Cq}j>!K5Ag*u1)EFVQs_P7IXIK8I6KWz91-+?XlO
z1dktBV)48;SUMV*P&yYSn$RXJIYD2=?@I7Lqet|G=X at Qgjz@Xzfv{QB)!@FMBthX9
zB1)Q1T8k(ZkV&yDnbwXHt!k9>`OpZ9b*);)l|NpVMw;}d1LY6m$cCE^^%*VGl;xi6
zE75vNLG2jM&@5Eer*)Pm1}bJx<d=>6<(~S;e&M(1B|8#V(ygir{~m$bh+KI2qS>4H
zvY}kN;k3{c4isiOL at nZvKn~sC0x}d~91{(-iY;vW>F6e<h^bh1!HH-R^p`3q#3-zY
z)Z43)p)#n}B%8mQ^^!jwh*^@O|515@^`pqRdgyE6-)3}^%J3SRfrHgw(o>W-j%H+3
z&Z6aMv}Y{zBnbLc6O>I?!F7*_V6$PA3!77IaW{w7{fS)M@<{`dxJDIhzpXU)Eq;2v
zA^E3OsJWt4H8(k4JqDF*#-<J`JzRP=4leG=m8&>JkKQd4So<6`3R&ds`(N=mm)PL)
zv&!#AVXE*Vq<KT{ARcYrbgDH~GARrxcaaa!OPsF_jJQi!aoP!1-P1DTK+Ru9f3Qbx
zG9k^TmpYKN{RwZ0j^Qe`z5C+P at rbi2dG~k>8k&xi4cn+|BgVsQy}W$wLRl$u7nW9>
zupEZeS`w7`n`x!Xk3}!sf<jp`&I#3zJMt42{8B at Q<H)IeQ3+7c-xy_Z<Z4C<E?Bb3
zV4+2uu^b26Q*4wopAY2ad3H8VMwt9SO*3ypp`1(&R$8)HN-y&FBvHU7In?aZ##y}m
zZe3@$NU4_JhKH?JRA$4=T6&1sZR?dft#x&)B2H8D$lUcouWX1B=I}8}o({wK at I3nX
zaPBO#g7XoruV<ieRXFQy6WT}uJj^>dC0tl0%Y|AVcMSdnY~bVI$h`MCymRLcqEh>o
zzP|p~>FGz6+NF(+g!A+Bt)4ps>>M2P=WmBbvv(hQ_6=mUWvZd;N!#_PL at Rv7@!RRJ
z{W0)7hgr;$YkV;~>aG!*R-)!4!DvW8S;J7KUj9@#jfkL29&gJ~Cg~nI``D`;YFb*8
zr4fWaZAYZ^JJh7C`X-!g41<81DC!(6`$H*Kycsk!>trr$6aF#BDoiDmD+$Ge^3<J5
zp@;>G?h)-f0xj(E=XOmB#Q9j<k5Nr(QJNU_jZsZ9St=&88AWW{8@#{I;74HM%iLUF
zO}_VaZEbH?xtJ6c6>ar9zQ=9a9{J=yjlrSeVSoA!l$a&gzGbWH&g_i9il>q>-gXA{
zCMX+JH8!K0c_R8xBU8gjI2Mi-tfF4gQF5q9y;E-Ox at 3QXV`AAWno0VM%{KqPUlyU$
z{c>(X#QwVO2-SWi6g}(#wc1eUx at K2y8z&CT?_mQ}Lq_CH2JN8%=Cq0H0dBOp|9dkp
zExXj5 at 5LIHv#ShzzWW^)yD#>%iv))rPdX6QjA8R9t=)*Tkd}_Qxw%@t;4Q2EWch!;
z54k#D2?+^32)=yK`R~U=lXkB-^T at Lnt#a*0cmvM`iQTMG2AERXdUkcwXNSonYAnt^
z%Xa-~m+^~e=A&u&D&Si83A=Paa~P3B)RW+Ys>C#=pU+Mn{rT3mZeC-rXp|l6*dT^m
z3QB{=i4p!^6WiS#`*{Zg9E-lLX at jxq{I>BeyP9AwYude!suZcUTidhwT1l at Q%^g|n
zM0rOdg(zx_(D3x$M&#DyJyPupBfV|#^`9ltC9Q%uPi@>+1-1=;T{ngJ!@>WW8*TB?
zXf<de|DigFvL|atUE{fV)2Gx9uAf_P$0grJSfikz<O(}e76o6}vl8PJEbjL7$OZkL
zw|(&ZqG`glmeJERs!yfI1VMqA8noi}uggw+5uSZtHc;!zZ3nOL6CMrUw16#&nhGwr
zDh^}MJ=tudN{u9rJjT*88q!w3`x9xCPd%&E_JrdI3H_JQQf2D`(dpR-Tr)C6OAu6Y
zb<+GkI40WNBnr~m`&3JxwAA`C9)}92ggT`myiHxZ{=WOQkb{b2N#k8O+2okqhL_ED
z5cy6NMQtXrtJf!3ledWMeb_sa(*bQNoV1Rl+<tmFXU$$N;-mJVJiEll{GVmUjnu;C
z_d6&B4{-<B8w-QpVG+4E-|w0(LgYyK7h!NyAo9w~8O?%@<vT9+tKB?39Z7q|0)KO6
z^Oz?e95_kheBs5cPb5#HMm4iXG!A}v#c-<17^jyQ{73p at z*H|@{S@(d2i_;$G=6Sh
z#;@VSQ=ejSc71tELygq8Gs45jCd25l$qqH8S2@(Tcx#6;Q^*ah^p&^MP-O`yTNE?X
zSGJ|M!!YLQ%Vw7+>SMET>UeqIiH$uiJ#P<<BV?OcjtRzaqS<-*MkD@}RuY at zih;|r
zCe?#?<;nMn5C)$tglw0O!ccf56Ky`&(UrXsuU$j?Twqt})-3Z?0VCg~uu`8vYk~h{
z!AQZKLB=!x2}$qiX)|ity>Dcxlqy&!ZJj-=%~%s@;?e1C<#%%!A1cy3^y$eLa=b%J
zyL?dS<?St`S8tZI^xjvNNu(RqKsc_0)o(hz?e}IOm7Wx_n#TCub*dV!Un8d!cb at RI
zuXXWZ%W$=FawV2vMkH6q%00-krsgD{aQLFhvQEgpaJQ^QjcaX|GWPZGz=NLxr;6PP
zVobHU-am)sqqak<8B(XQ$+xu2Y|mrIY|<1}O!avQPzwUR`51Xz#}>$jM^AmS)ZhE@
zqM&@=H5{_Y%MfW24IRu!X`N%@zipJsZ*hLl-;L<NPC8A!RQTmoHs7F4d+U!hj$(1e
zR}ld$KR;2jc~+OvudZo+9z4geey=$&Xp5D;sCOULtkn94IL1A0wOn451Tvm?6!NUP
z1T<oim8v;quV2TDuoHK^Y$;Oxp?J%GEYC1evM{)n*OSvGqFJ=)@AE!^amJAHzf at d`
zv$vX88!LFjQ}7Zf`V&yulB~sVVQU`YShHF;l+i3*_`174`nmjJvdz;rGAgS3+czqe
zO2S{ierdka85kc|G%})eS?-9ds9 at qNdAZX!CYI2P=e*nXhI<)L{iSuE{jF9N3_hGj
z4C_N%!X37Z;SV!>@+ at AC@iB48>G08nNyL1-^6sB?Y6s&hivPO$Q89=0{AH_S%ag)}
z<4WHLksC4QqSfi~F8+P=nviNi`a8}QX0s%<{9v%}-SSqC<n5*kn34aq`AUYiw^RmK
zUJw3T91M!OMQkgGQaAtBc4J!Kyf=crTroxA+dF4I#~IGd%*=sSRAN2b!hxT!m`*oF
z<OF}9Vo-Pp;JwJzvO2AovDq@)WWT2%uj=(JV>gwq$JotKo4i{=pk~LoPgJ-`nlY5m
zpiKTDEW_uR+x at NX8x!^BQV$+JRBg{;W at diiy-yr`d8}yC8I<?J77K+^wOh_`TCHOD
zQw>SORZPG+pSU>nZK+FMF|XZFVdsUe(NTPyC{$R{mvwat_V#T2{QRl;`SBe3b at U=4
zIV(d9I#>H6T4Ng27>YXv3fJRL=CsQxpUg^rqiRZwb7Bn@<^AjGTDQv_Iw|WaxU^wU
z5Mg7#tm(*++Q97A5SSLORB>m>KW2GRMgXg+LYs;bB|@5`!eD_tWf5IScKDAQ=FsA6
z)}r&er<twceA>*3_r7NQ#70bD;xivV+WeO#j?rvANGSgA;H}@p=GcpexnkbzKUO~S
z5Qj|;#7w>WmFWA5IIc&1$-+6=)~tt^Ve{_u($&h);9hFgF9zD=TCSl#*mriF^G_|=
zR7GG%@$m3;oK30v{b<`+-P^ODyi!wE?ygcVxI;#URjcP{$89L4JjP4mbUhko{vEka
zMFIP4;>SHiN56gv**op+?LF{2q7S~<yTAA$Fz4e=5C&&6nrNit$i4ITktjU+$)ALU
zUh~-;p0 at q96m;2~P5pan at p6`aw<XN6SL^%OGhTz4A*$ET7#93gC}j8zhGOM3ag+<G
zgH=QaLz at oNdE*mQ#l^*R0lyF8-n`+BjE?^F`7 at e}i_3(a;LDdUrQO~6-~qYqjL|T$
zu#{C*DU2u`KXn(?N;LtRA<W7!wAFK&EFHZr*usv3+J;)%8M>7?TgjlX7()?pJ0o<K
z;-$z+5Yd<a9`{GEv$3)H9ru!H>FKcu-u6~2dd!hZ?|bLVZ6I1_`_s6G-&z!5&#rB4
zVfgy`4p{T+=;@W!)ZiH!8Y(@0tY~R at Penx~GF0s)c9`Cz)=*vK;(f024JRh<negHC
zPqAWsbJM(kF^nFp<E_1&JL~j3*&NJ$=*!*l;X`e}V<IA=hM>P5i|yX3i7K0_|K?eh
zcs#O)w_ at YtKP6HKOu%tZ=&zb~a6g#iLt-oE7Te~7tc*alBzH-}5Fxd(ywUr4l+(G5
zzyB@<p`clKZw7Wu&gsU~&TM|ippNqDR`dCk*}<UN at D07oTJM@O58>9pyp;Ll#HNhv
zelqG*QZ=v^a;ac(+Q0)oul=veC(;g%j>q3zKQeH06MVcp!DVM>?>Vuo2`js6K#<}4
z%BE{L<=Ba{HlFYaUgtnX{OP+z3d-TE;}dIy^|-`2H7SqTA}4)?UiI4Mru9tV#>NJp
z^Mc^ZX$OYY)vUsC+r6`L-D*AZhd!JNiR59ivDgp9#8iasl$Dhq_#BWU_tWO)W^9-N
zjbh$}i8VeNrBmILTN_-hBV38Azand6ZC>%te8xoNwX}%n)tSU~M__$ZqZ6dWpQ$%b
z;WB<lZYdSH at O*E(%5|mFpu?|0S6Wr+_u;n~A;%fbe)*Sk72$C~tlvwYX=6Ec4v!|j
zRM=mz^*oJ2$Ht+c{E~-KZ^8ZR)0Z~{de(0$w($iJi_9TBZ%IN2Yw%16CV2K-WTg}I
z`kF}xz6kRDPLcRcUiG**IfgEHZaqv_Uw>n#IHZrvJSeQDhLdkRLDwWdl=J?$D1Q^f
z<6DN>B+N~3gbF>r@)PG59=|d5TMgJPjd|lZ%RShJ>&Yx4LI#tjr~czL4jmnxoPvVo
zOpPInzQB*U2DECuTEcu>pGj;V?%k<M+-D=XVRso7lrTAErG0)M7&^^2VjLeIN4MS>
z?fz^)J*$5FB8dVIHm~^Q(dXU8Hi3m^M=Ut*z|r6_=;-RM{aAXB6b- at u4n;P%x8wJ2
ztu$iUwVx}UFC8v4f1ar|zDr1W&tFob at IhE)B)Zp+MT*Cgf0;~7Oqj-ZjyL-GLau|p
z&di)(YJR<LZEdxfER)X_v`-&>QMbNs$!XMtZ97(oLdMV-IP-GD;IrlnLHtiHqrCTD
z^S%2$-#0^ILQq4UL{gCXse%p97fq|hMSOXAdH2hIx5a!8Vv&=0Y031z2=*)--=E9!
z4i4;ugoFnFjoo=zdT)cBJ~;$4^x<avu-u#JnXxcKq7FMzajtLp%w5xYq54$2IbIKs
zMLyV$7a25K-=YoJWhn5AmbyGbgL{gZn$o_0_U2MxX;zw%HlNyiqr=fySN_%{*RP3{
z)mmHnEEQ(tPJt_!^IH44@{#W6hjZFm%CB)58AM1X18bgp<_}LuOruDgO_)yI>+8x2
zo$H5RqzXxtHW at 3vdsECEH`o7^R8=>ACPaI3&Yjpd2uxTbR=2mKU%q5bq!J<c5O|)A
z_s-tlzP%71&DxSH3jI+hXq`VN!#tC(bvcw*47IhxMLoAyTULV6RA)mjkNf>L(-fJ;
zH>Rugk*KMouTS;d+0Kqt^6KnKMlOk?W*n7>OHW at C6@#?<6l-jfiw$O(v2pG5W@(KY
zoFsW`rxg|9UsFuv*m!t7xqMc4NJyewmf9b&WC)MIHl>ybAPzkL(fi_|Z^b4)F1AHw
z`P1=j8X3kD#Ir2^0LM_W7fcI9eKDF5G>FKIYMM3c4+D;8cpqU&NI4Bc*`8EMbLV{1
zaZiYkKl<_h=lZO92#L0d5Ygewyx9J`7nSqjx>_0<8oSfgWcL^uCtp3e-{ky_G&nfe
z&DS?3A_5I`tCo>b{CnS at _ar1}U>CP~?GeT&BqV8Zb;Q*ES9tTMUy2vzN5R;)pC50M
zcX#dbb6xKNPX9aqnRBrAh1KO?t|2|q#LG*Nl-tDaRDH&wnX)+KS`?mQ<i$lma05>B
zZ6a~)KHy8R&b<QT;%G3$6AJ5OV+hvXj!ViaC`2=*Vuhxr-U<3Ot&fe3oqA~+a`SJ+
z{qM;ZO9-&8?#}1`ChANd4i<Y~oY{{QNl;NHDVzzJzW3<`xLp1DGbKB<zViZyF8EKW
zW)oM_e0GvULCvE!ljIoM0Bkf&Jn0;6(}{P^#^~tiNRlx&Hum!MYZ-rk(Z;uL)6&wy
z9B1p+K1JaU3=b0-{|jR3^Fgs>d_<OJhl}LXfC0P#XLb)BJTMT{hjY~pPdY6(*N)Xy
z35Bx&q0f%ez{!H8P;QujGD5k^Y`ZJ-7*+czqCK^m5k-IwTc<B7I@)rn-Fp{Kz+3ho
zu&okEIP~85lUdz*hQ&9rKmYcAS$X+g5)zxn(%1F%{aeF14X!Ja)RIBD$yj$>@V`_v
z)&WBNS&N|?8Iw}ZLZYT(GBw`?<&y+?<Rbt2KARv}ugQ9}9QgC;NG{*#YdUz0xl$pL
zC#R?QOSem3Vj*E+*>3|sq57}EtJ>OL<cL%+5N;5=$I8vk{b#$tb)r(0Y_Paq`_)8?
ztNG-Pm8GRxCssp4Lu_2!-5_otYTsI1V{&rHjI at 0Y7oy+>$P=9W6-`~Q<P{aI7F*rZ
z8BO#E0ZEZp{=hBNMzF_#{GEHarYbukwe9_TtFb~+B+=o-<T4|meh><0sl22lw57ls
zy=%8<loQo#aN=j-6O^m68d5Z#cbv;fNA=FPbmx-9-!X*vV(C-N)*6dAEi~PNjmuTm
zO2%!{MdjMj?NUS%A0T(z;ow^fk6GZM5KL_&8}aiWOP}94e|uv)P75}Ta=<u at -{Z}U
z#|uGq0p~xQzuLjY5P9y53GI36vXcM^b}JN%9iN<hvMqidZT2CcIW`y&(4sGq0 at y{)
z*~K<%VypLe(&eC2^#vbQ&1^2?XL{FmfDR7=e>-J-3=9ZZKU(|zEUe*<5H%rTxNGO%
zs@@q1p6|2u{jfh1CuakGH^LV4J8Ygk>LGfpRJE3<_3ok1K^Kt7UTHN#+%M&dw}W8N
z*e$g;k8W32RG=r2a;^W%IZ?+tnMl34h%m9Y8;Bz*cOTD}pUkOzGoonfMMwC}b36x;
zgFD<0PlN;>l^)MGA^C+S`-p)7C2DcMJKo;j;t%4yol`L|F)iUN8N9JTk&%_H6{dyr
zheyGWUapYz3C0c{C2I-8f5&4Fe;U{vlV{*l36nn`ohX%^{O>VchUDzv;4O#d{6mG?
zh at +#Uu4I~r6EH$azubmja`N(PJ#j=q_RooK;o^RV***Ez_HjY-AWY?rzNF7t9QwP#
zq7r*w{!5t`<8zwhHTe)g0#E15zklHvxOfUS(G`!2B?HECVVDWKE<0s?!K-1u`gh*n
z>^M6Y&Mp0?!o|<u|0$eJgLh6808Vzz&Hrh#-l3p~`>!Yf=lti2qKXQR6lUqO)c`9P
zfS>*=4n~4^!B~z=X&21el1V$ev<yxCK+0PuOJa84B at zPZjZn>;zHX`5bz2D1PEKN8
z)Fyak8Y?MbcV3>T7Cdewz6DkvT;uUD&&P?N<dLqZQrQ^G;cPBpHulo>jg1I^-_J`+
zG%!-i+Q=T|*R>@+%vdDNN at G;a7vfo4TbpZk%;A<=-`tEGm;5)fEln?<slrSfa_QdF
z+bhJTQ##dPrFgK=j2jjfHp<TuB at +g~gtVwe^LERyJw26RSd;TvMiO)t78W80uUfI>
zk`v?M+8Ro;QBt*jJt|^*w7~XlIMrMHJhkXBG%U-N&gYn?^>^=rcue5owdg_=h$jB{
z at x$+A at cvy=(rDP}TJL0^jc}_MiBr%89fkEyw^WT7T3a)9badD?jroi{MMDw3&w_42
zDz7nv;0fqKd7suoLgqe*GEn&9#qr?%;wFQ1JtfTBw48B2@<H_g at _l)>v1cBz$L#d&
zo%$Q4N2Qt;n*(X1{K+6M<4GNkyi!Hi_x9q}KF55&zL_z0Ej9lbd^<5XGBVNv2u}Fl
zh^{VaC)n-t6zC!%B2J5~cb&hzn@$Mg8l?&J^Rw6)d-1?)_YRzo82{64L#LPKerp)O
zo+4vnHY#(>K1Hy0c6P#q>)buH>Pzf~O?ii!dXaO3Lf{!*=ihBAWgm|}M{B at 9l;865
z%AEVaS+&fSek at kfe~Nym&<$gDY|I4FNZh(OSh7&gF#hWfrH5%L6J<GbAwPm&)tJn_
z*$DIiF6avo_n>!R=S#b}@wWRMI{cQrU#pjpCt$mN`S&z at e7r#9w!pIyyR<0p(`|Kl
zRxf-iC)ipH_!mupP<Mj`Q8MiSy8;C<FfbtP<Wy4;-vtjO&$(wDZVo=i64vd{pN$l*
z3!1#VJb3yF^70rU0M at p*F{PxWybc$p%kIUGOWjc4T%UiWvd6{3>gnq<YNFGsp1#M$
zh2PfJhLp?TKBT9oYnqzkhlGTj{aB*<9F0#zb50j>8D?ALkJ;SZJonC-3KNgqg2WW2
z+N|!7ku2baL?WdS4xG4_KX3Q<_r07V)mYvdHKglRBXK&SK*V+b>MGB+$ezz_U~H^!
z<>uNqcs$GO>&;=yip(pWcdUQL0gdl#6e7-WAH1GO-564kUF+jQDBHc18&R}6jy4SZ
z$ce(!elu8r(6vQKV266shxU=$58S(V at 95X8c|iqwe+pecY?HL2qU4hk53nRAo*Sw6
zOitc?{_l71pW_WAF!HC`*w{P;lu^eas?vDjFu_q>T^#|J8ensqBQ7ouJkb2)cB3{A
zX253K<DKQs=Tu+=e}<#_H>rVT7|>?aOb&Pn(xw0<ZJ~Yd28Pui;7h56g^B6uggQDp
z*xTVRz4oRskQ*xU7Li&V0sJGM;j3LqUO-i})9q1#@8_h%#H%o6KAo?Gq>PNHMbyKT
z?S)a12#*qnav#R&Jz-%|#T44+xh~}Qj*6`GxPH9Cw6(Pz$rHc=2Gop09vu~x_iK57
z-=R<{gchzpHYEi_Y?;}kC$OA+b`$hxhu_E~0)IEzJ?urYecLhWr5nX0$|%rKv15*=
zrZi1Pwd&Q+1q1|+;mA+nNWFL<D!TUX=SLCyltu9S?$Xhv{Q2W&^4<rZmX`MD^i<Zv
z!-MFeQ8kC#Z?7^3hC5byu`$rTIHLPgL2TcGTB-4`2!0}3 at mE<;8l424I;!qFiBS1X
zet6vUDOJH#Vp5ZqPQ^}^S(d^QX5;Q;dCVq{|IO9;{M!<>^pX<#j^jQm(6AlKKaE>l
zXx_Ojz5aKzks_50szpxIpNNp~&9hNT<mE`qVoWWzc_MF8dBuBk;BJlC2TBqWlHG-7
zj-rrje~F949HRRgyQDLN8TYwf&#-fG^~RHMxUF`fRC6_gKr`4xp%wM$sTdkW^2gei
zWx~;0l!TSqaUZV^U2{b}tCVS&kaNTE?K1{m-aA+X)VzPsvokX-reEvAOiAsQ(3F|_
z7!m?Ar(y7}2xSr`Fq;;?dUIvvTP%- at 7JG(^#r^rOf7OQwy%#AiC`hO^Zn1=rr0lN(
z1J-Ytg*}C$o+ArQ_0tY~E{hK;{`(I`9_?J4=YRCPl~q;uSXeO0c+4Ud${)oL(C|LL
z at EZKRy+2*;cfRDCmXi~6bmVpkpDpj@)x at f_+~H5e({U7DWF_Ibt%h8~^qBxBCr$!d
z at d07BY$kvLB=8}9pYnQ%fHPJk1;H^p+a)6*dVWQ)iW%26rF^E_D`(CUCt8a7EhvZU
zt6f6$=s>rf6J_<c2j?(X3VM89L7swrB4B*X!OrdmHbzB7#p-cCT~5c}Hh5fret&Z<
z)vLZsOdJWE at K#Zb_wl+s?08w%QZm at V18I!l71SjA5M{uYLb7i-j4x|z<ux=2*4Nil
zv$Bu~iIXhC$%&VhmBq@=-WdC-!($8Q*;rxR&E<}io{%t1$TzG{7m*zPoJ~@a)^mG=
z54ZJYKQ-)A^N=eN7*-K*+A7YQ?Z03GvVH<xkg)tAu;A<k$c+Aj`M2(e3qs1Gat!rt
zWo2b?o)EK7RH;)9ete_`c1I#;<VT+=C at AKg{?a1;z^xtcSJ$rt?Ney6d!ub`o&rt?
zNb%c8=jV#Eb*7{7XD*AaVPIBZPpu9P4*FgH-N6b;wD^BrfVAxFs`n|qy}d|7g!cKF
zR(aGz_;lpaNi8nE4LA&nZEbTfLrF=g>&?^8=-pGmcmQ(SYw?;+;~IYXtbM{zD-gy9
z87%Mb-!|x}1=q0ApHdDerx2*&vpa#JUuW_NR`BC_8dv#$Nilofb<MnQ-9DQfmC*>9
zC`XdWbR|ek>(>hgZw+O!kl1q?zZ<dhZzNV$SC_Z9f3^8R1c*DRm`^ZVqJd}O{646D
z^{V^pt0(i(9|O#IM|H{5F>px**_1IUJ;)JqxTLiHn|CX!s at 5C&X$2f5k^VS9YhL9*
zpY{INSEQ5otGx8*+r1q#79&NqO-vHONVohHc`N;+l%OCn7%jQV8%uAVqFGv6GHnqg
zO;*4mbwbt2M%6bo%<HZi1A!wDC)6O<d9lyIY2ImaVy4KqvkBx7tirCYFf{c5*Y7j6
zYd?STTy*N2KiAE)^!4!IcW_(|xp{uA`51x!x3;509O-U`|NIW)rH-TDvHrueCY#wL
zDiL0g-H#sHye^aoBz;n)#@F6?b#)arN6mHiSmVEb3Eh$g$JoK;!nWyXCmz{=WkLze
zg5OtPvOIi#F4Mq;Md(#$1sQsxZGh_ndm}{Y`Ul8ZJX&$`2&~(rLDzE)R!%!nEFRaF
z{t?CIFcpEhCv-{)3+we)p60xLD_{ofBV#+=%=gD)_f(~-dR29Wij7UB;RgQ>|F59?
zvL`TkH{Sp3%(z at i5kJAErlDc}7z}vv=kj#CmVc(bU99}VW-P0)(219llbhQm`(J))
zDpCU(A1?n`Y$Jk|5wOR*zP`>C_ix<&<FeA}%sa*R`!CQS0rD3+J3F|Yw-KaVM(CB=
zuN<dYe5R+T*IxK8KTU~lRC--qotBwteb#cd#S>C0`hX&zHckF^pv~jWJ7P^=o~`z}
zWLiDs!WF8)KxCY1Ab7z!db>~?JLtRe{Qlo&1_lO at 1!23V(V<ufZu3qjw+MH*Gc9?(
zO|HCeJzig`)b*Y`>*igK#^C7aIQoREx3uvNbX7s(DG28D-vi1dj~_oS at Hyf|H+x44
z#0b!J!in8Lt at F=1E?661**QZSnv3)DUVZz*!UV&XJ!@#ymfR!pz4!O%HqRZ(q^8G(
z54wfFG#dmxf6n~#{pEM_8+OuNO@!4rl_#%AEWgO3N8^WOXdXi7W-#!D at -}|X)KVcO
zB$zH;Koh_lp55@>%Tohv%hF-?1v at UI59t<6&QhTv_DzBG8Xo-(4MmvR-jXeTs$nLl
z2C?@1vmVS!nA@?*$<Zd<iY6x1+$OE`d(UyAKE1XQW`d&(G at cAOB!-4mymlu_2gAn(
z2fN$7zcVFC2?>z^>%zvtX<Q(8bZ|i0E|f1a0CbQM%e3QOx%MkJ7yv<6zh=eaXTkRX
z at fX$7(lWg>Keq!|H-EWID-~>#s_{0u#;6%5<nORKr^^9n at 85@>+lj1|_j86P;UGqk
zRQ1gu_h!;^0`L}N=O3`I?h+A|TTvwr!ccAiM3tO-+VF|w!j_?ts*af>@6~E=a2(p%
zV>cVDa<qCdRM0Un at +$wRR8Flvn-0FZVBq9bBlKJP5J(mk6{Q!qUBQU}%k83Icz8I8
zrL-2`47f--;R>9JK1I6c6&vqhg_6LqFizibIOL<!RmdAD5h16gO$I|o1#<;%%dlBh
z!NjCcYw2L36wT7g3Zt4d at YjA6xKgVii2)^g;Y!zbc5E|5g at 5M}5D*A|Y%zcSD{FEV
zE^V#&=JG!?BL;9 at hjVyD2J|*}b{N6)Mvj)r=EpQBsxxT?1qG9VPgyUB(xI at xz{-m4
z?(U8p at ZP^LVV3q{(FKLlN(3l%-heTHjf*QA5Fm!ZD0!h>c6`wAETv-;&#x^t>`la^
zZo%2X{Fm1%=DNC3Fo+qMnK49M7AGDC4&*Z3zi(`lQ9+D2J3lA8S{i9U9mPb~&L0L8
zCU=~vnLK?%O-;@F^iw1jVMmW$9xfU8>cy|`;4yxF_2fUbsoPJ+nFO}Os4^g9qe?W8
z5Enl>`|?;7lftvtz&*0QzFz&OGYtAb@|U~$3!TpcGpx)4&UVA#>2#b7abU9jZEbx3
z$z^w$yNbO%*_}J|V*21tD&VqmnkrHz^|4Byq-SQLL%~5#QSrO5{6kUEz2AO$Vntw7
zXcc_k=`1V>ajTv;73M6(-@?ns!B=>e7 at UEl2kV3s6WZE@!8cdFZ%>6GFVeGr$YgT^
zY%^u|r!Xc{QBe_?fGw{Zl+ at LQ{&XPy{2BuWC48mB{7J%9U4Se|XEp#u;e+~s2FZyu
zP-P at 0;#DWF7+Bf3y1Kq)^)`+z700bib`sTK)95?f`y&716HHmF^`1B+CEESxy3}rS
z>}v7Noua+oa^>@jL6!j)bSx}mL5*5H+%^*z?H_J1W7@|qJld#1!6Jvz{Ko27 at CFsm
z+nhEm|9lLygPdcuv{R)8I1_L0uY&6G16w%%fKx>O$MOfqEDY8tBW?DqvK5<`Xy}#c
z*8F+8Nl|<k?Be1kf~ct~&B7vnHqV}|o8Md@&-1bLUd&g!Z7|b<=|d9~^!mC+v#o at 5
zx)r-UzrNJM?6+{D)3&i;h7rN#;LmJx_`bb8|HE&9n>A!aXEMCy0XNxiy`Soh4XhTa
z&w)rz)-cA&T@(&IpckkfnwT0;J&_(sqW^s`9|45jz`L86l+<YJbdEM6`kq3=PkvI2
z`Ec5F{$~w8GZ(^u&d9jQws392I{TfDiqy87j~ZP(>NN=DSCw#bjL%fjGESb(jo9DX
zvbjTyP+E}9DK2)^nvBkTS>!^&XM1QoZ2$c4R?a9U4?C1zawP(V!JuMkKOadwbwLPN
z-$O~Wr*}qiQ>Mt&SW|05;yx01o;PT+k58!%NxpjM`y;l~T&2R|@JgVs43VV3cwttl
z&1T>IrJ}R8{_9trkrxkV_o-@)n;mSX-6<Vuw$|1ro&K#?n2gqD9N5%6k$d`-0S5;M
zFBmgKJTZ0R%4yq7`{e^!Xgj?6(7gRN<mOsWIqjtmJEuwO9jx25f_wi)ol}>oSD6j*
zDCA2y7#Y!!#;tlEzuT&GHLF5 at GEGvjen3F`Y9P?nM1 at CycB3x2tTrrOgVy}YF)r<`
zt#gZAGhe?VV-JP%q2`L<iD3f|DGrYBA2B;vBP^>`afF;lvdM?<H)y4`>04NoOiJik
zI+|BcQ&#?jfn6i~AF?K}kQZ0{{CD2q_pdXS+|Dma{(M}0l^eY)z~B#Do%!krID#pY
zH_&C}X)nM at n3q98L5b1lF#E&DRsT9eXbH+&_|?;zO5z#t#N0Oe at Dm8;ostV@;R!G~
zcY+aG;zD#fS|GxlHEgUZm3VY5CK~jI7pZfU$23)kL3ld{xVE8x9K3+j#`EfAZt6oU
z49TP4zlG;m{{R7g_VX?m7ni(`&%5O!DNkk)G{}q!1QeHxYBtCTQ0OWyc=Y^ImJgoJ
z;5RVs$YW{UMpG2a$;?#J%YOZuT{)AoHuC8W&layT+doF8m>Q3^M;E*>{UBynZ<nL0
z-bbY*yaMOpneWscLN<~JP(x%AjA}T$!dQN$?Oube+7HFnug+IyCw)Lb%SPkb>s=v2
zQP40g;6Y(B#)VvcH=pb9f7 at GN%SB at K5oGr_;SVj^2yp>{Cr!?aKuwvlVvNf-R}3Bx
zLnQ~oFQL*T037Dpa at bpMZ~KrmW+CH(<$&*8lLFlpLzCr-%yd5NC#LDVpR=1vv;Dui
zkv(M1cy;$x<%^&nDk=o8A-&YAluXpZLK?kbfaNE80;x|AE;n$M_2gl*JpqM=39`aF
z<NTSet!liJ^CRDU*)aAjl@~Ewx>7ICT}Ry&<mAXJjh{Su(qPdY{;c4k=T37;N!KPZ
z;=^v0sjPmn<nu(-Ki60P<X1jE|L3Eu1;YJ>Q|E8kJ#WCiVfiVb)8{(eyaI8`!SV+x
z)ojj3EiOwVKACEJu7g^woEFEqr9vVXjgi6?Xj<i^0&ntBc;jC-f at 3gPl>Bw}1?Yaj
zR(bH?R8&=uCl%?G<HhseH-7(oTS^W_Hd1pyQfT^+kxd3as<{H9)YzmXp^J9#`ZoZ4
z{D4|OLKqI5M_IBV at 8lO3*Vfk7T$4Q!L<yxj><v!y{DYIPg!*|h26=6Uh|5oNfN%oe
ze|mAY2SH!TvL{3Y&=M1bVIAYX(MKW9QP<f?3zpThUqPAL6B!v9R-`Yy{~SFnzfz~6
zrUuW~*QCuu{!9pPg`D3SJDPyz_4zq41r at Pn+oRQPy_CA%P4GeFo;_oMFb)GT*Wy~d
z%XTPpKDl7!<>uD)Qmfo+V{l-g3wHG}>?hT0JV-<bH_B|OJtp;Nx^d#kym?QFZB)Aw
zQ1!V&DFq9o4U?)451Rp|Q<bl}A+*tCC06)r2<i)5wR}N~W+P|aC^vWaG at ZkDzCX<l
zmfp{9j*IBHIC4K<{r)}S(<d1a&Hg7$8pV?MU{+ at cUy_oN=6h3yDwL-!ew`g2R-O9p
zb1?Tbwb7CLh(^?d3F!crdmV%M%nOc-UqHY<`_Hcq%|*%ZxXfnDA17)r!3smN at XRB_
zn$63}$S8l%OAi>wOr2 at MqX<k2E?S7$avmL_hBB*WuR_Wq2dNlXsP5oiENvTE^#y{|
z(rf#u?KugD=W~NqzuNU>d^}Ed;wj)!7g)%vTU$}U48%_c7?F+$5RcU#Ka#;8D?m5X
zK4)Hj at 0;@5<tx9Rmf{<ksAx1+U6U>=&xKU=R;?pTtS7_e_D`Rd)_I0C40m^Tvv0kS
zNzcl%Y5F>oIXq`5HZ$<ZAR)c<;g5M?S?vy~Cl7U%MEScX+^My>`93 at 2D=R7S#;s=?
z at n3>=R-u(OG^B`+kJr at E`Pw6j%%$L9%YSqPCqxN+%{tTfHD<3h!Unz`Qb0H^<Lt~8
z{CA72yq-?TAyaFj@;`+X$XbyB1MF7jUk8PP_Jj*9uC7_l<BI)UZP&eZ;FMW{72N87
z$}(0gl>*r!ErcGRIEi?JFZ~kfq-g6qPU1I at y$<H?LWGxkwq(N57C^wkKIxXMPlEDR
zjGXn)Tc5Fna08l0V-A=d4v{k5a7dMl&S15^sWE74Yu8|!fp6NOo`NWyPK>StCVvTr
zNP7Pz at H1nsyH0HP$6RRc4Bd`3Me5tp?Iq%?lG^Bs{WBPEHT-=O6Pn#W!7J^D`~pRg
z8pY%4!aL(f1o3~9Q2DJGPfSXhK6JbQ^F+(o*zxEWbTP?ATnd#j&EmbFTZ^<j78X*H
zli&G=B~@C92Vb^M_pKisB=#nd$#UnYdh8=z9;}Cy;rLm04-y*_FW)Z^?oTX+<L3vJ
zuU7J-o54v-mkJt4Wk`?59l7gB`2$)w;=jH=5q at IE=9!wC8#^~=FnC|%J>>s`>CD3O
z(yTedqw(>urNabl$CO-9wt;u2hrNvowiBcbf-nH+c-G}S68c&LbXYRt6vn|7`a<EE
zq!0lYg<JI1IaW_N^RXv1d-l$LAYC{TEubz)_e)_#1T=V)>&mjjxgb3~0vRJz5Or1-
zEgl>mCgqq1&p&fCSJ|p;IGwKX&;1D`joEbv;xW#{J>^5G+62wC*y>Ca9^sQlQRe|v
zavI`sE8$xh;9r7M$&<Hi)a;N|q25q60M4TKbJ8SJZH|vn>~J9}Ih?9YsQZ{#`W<K&
z(n>%gYoIk)oc)b9!!_+Ocy at OA4i3!v&{9D1EeM=5?hPR0dzh)s?QeM at bW&ak+5gIh
z^z#FMAEb#tgIVA-_XZ{7{^M+GrKnIxaN)3T-*!Ej&*3re1K07FnYoTmB$y|$MME53
zAAZdkhhL$*fFJ~NjJ=_eB-5So;{KDZ;Q~1YaL<G&UjRp3FHez_0pp6Z^FOFkKxmpK
z4wKbawMwD9yxduaE+8;a)kqPZDCW*d+fI>Vqk2De9yB)U{;SA*nNWREvr|^5jbKLa
zcs*gj_*8FfnEE>E&|YcW_80;0Jz$02M^E+x0s2TsC$oYFdaklMI>b1*xM}I>mJ<U~
z5XbmIGwJy2lgE<+*7;7URFXjtw#SQk;#}H8ZX`8ch(&?#SYGe#;ql4*`h=`d+<$7d
zO8$vWcQ}SZH(Wj?u!=~dS_QCVz?o;FtC$0GP5ffF98`|L9BUJ3uRq^buA at QMS<Jn8
z3Q;!I{`c=`#l`h4wQGNOibdv$YQZdD?@jPtDF#O!Ol#G6oGlO0BER)pt!-^<Qa687
zc1dwnWYzQdF^E{yqyb=4b8==Y>|mC28*~P>ReW$WswG7hKA_9x21gANN;!|aanSFD
z5fZ~^)hAu5SppaZLJw at b7^H|P8i3?y9kK}010H>-ZA9Uc;q043a}Y*;5`ecVWjVMv
zz_5`+6vz-HNO<JD2tez!#ll~(YrDa?;c1m9efN$O!bDeXu7L#YS3Lk#^cjOlI`=l7
zEIcCO81$y<!X=*IX3q*lCQz3u13*qMjDwlK2KTHdVRMnCZ<f}S;{aau0Qdx8cwrRZ
z#>0yQO~q~2VK?&tCi&5nD$i2 at 0EP2rt@)23Qea}x%aLWHwBDwtl4c2|Mno|YKKVRy
zWwtFNAW_hZA4(Vc8_|xkd#eODR1;B)9lJ+BW!zvHHMn^5_jCt|Dabe#NEtFQln4;)
zOQGW-{{^%GnJUcIo5xgFb3o-oeV-Csg9zxQ20_IxedUR!W~j|@_8O#!m?&-FPzE53
z^!1TUa)0bxi<KA|Q!`CkO5I!v0IpU4`&eJk1DMA$pQ<eijZT1p|M_0K4EUe-#Kb5e
zFS&~zl%*0Sb^Qkod<A5PZD at 9Kzc?ryBAmUeL&%T#*y7Yqb&!z^h-7c)7RaGOA$nL(
zQ>49X;s at 8-58FWV$&-j8i9pMVl1J%ey8wo7EPHX5Zh(-cJeIopYDXu_rmdwFmYGQm
zze>u=P$AlYa at E^iK58(QK$Z&z5M)E{+u?u8>#?a+pk)er2zD!)kQwII&GpY4WQ{|)
zxF9<_8eqXhTZqZqNdXKFeKUV~53|=*Rhac3ep60OO(8)TY*jse0WCwrIOsa80^!DF
zn}w>JM1P`-V at cP}?k?;6t&X6-{Lp#9h8PxUPTadEbJpDAy3z- at 4mNQLWVMvujU+f2
zz?I_R<S2<<N2vq{OF}0=At7-typtc{kI+V0M0G=x<_|R?j5{XT7slcVppFlhGbu%g
zq3u4Bu0ab$Abv2RW}u};MMkbB at O1KW>}Z>sCIOZHb8%r*Yo0Ta6bx(-MetyfAHz<F
z5<i(vDj7!4_XRTlfPgZ{*U82Gc#(v%d!=^LE)~24U{G*wpv@^e<@*6VJ$1 at 7NpQyv
z+B_-^n=<vP<#lyQHa*&O at fsMAaz(G!h<W!A+?LS_`Ojm at K=7c4=A at UY4U2;eUDU-7
z!4Fyo>YAz3V9Pb>(EJCi_Fk2SW*Nta{QQJq_BUKy7K(Y}0MBpJT#@W{hmNq-ul;Gv
z$KBgoun*f8cR>pMy7v%@31AMCgR!(bTVFi6VS46Qdl3+H)Q$DPeLeDrt82$G=Jmzw
z$NU595YWnESTobpBp(8PeJXhr!RxiF*_|{BLj;5wD+h-xY&T{)iL*W`*WKR<7ytfQ
zL5P2Jc9z-W12*`*`}eWnS%E*2?n3+d^JhK~pHMX&w*FT$X~*ljEPnBAUcyut5wFzq
z3oEn$;es}RNPYaW2RtQ%g^3pklB7=Bd(xyTq3X(If)t4P3gry7-*pADFVE#4DkJ-P
zU{7Wqq`ghg$-#oN0Tm6yDBtZZaG!f%oM99P9yIj7 at jJFG2&xy_gzW`6Paf;^EYR#4
z)A#QT!=zu=7{0}X_GiMXC#+3B*v<u8O62h9a&yVwm5pfTpnmv#jdTQ|PPS7Ns4+FK
z6OA_mDdd~La~H6*3d9K at Sx2@?^qj+<C8NFZIW&4FMj$QQfb40EdaNVK9r*k}DhhOZ
z%{u(<{_HqSUS5Iue}{<3D*KB=l4xRFTsNFUzxFrza;E2qMU+&zP>!gHXy!L>EIy~t
zXYmo270MalAnMR3G7%=&U3+7f;E<AvdG9mr39fHvB3oPmR7}v!m_SzR+ISe^HTU;E
zSAo&Rmd$O-ZnT#Tu`l at k(A$x8Lm*QV$PN}Q-d9~-20_nGb?Bksf7B0s at XUk%R_>l6
z+lWCy;upUU9l!AJmzCY)G;E9<wK=+4pVM<T3R9B(4a;i*6 at 6q|Cp0=~MH^4Z<`%Mo
z-qX`V&&{3uo5=c6f-8y+&z-2juMR>`B8-DG{pa65k$*5>1P$IkOR`}0g557jnPiAT
zp;D<m+xl%m+t at e(_`Kl!O%5n- at W1e=A53uCej{AH03!K!%Figu45K7BRG$Uqjhf(Q
z=Mc7Ao;;ZmrGLX at jsOZr2m;Dr>DV;_p)+;^&)fLvS)Q<G{n;%~Nh}IlFgXD!WCc+{
zcs$hS6{__mjmkKYPWD%Z=P(ET{vEa$_fQd~gGUJaLeJx72r1$qoV(pK=L+sLAf5_)
z()rmL(i317LKW79Zc_xLu8}TD7VpXIVzE@~0|d4IC2y9s*>=A at mywY{7U7y)mMD?#
zpSQO>gvn3=1Sn5|kpc(fWXW}o&#ukgj=al*m>df+K#YR{RKiu8qO($4PcIt8_ZpC&
zvih{)E#zHHK>Uf-7q$R%7Fivh+<|BeDbS3(w42zZ+rgyHcCq1@&_!?cm`MG8 at xo-!
zZXhJfkkZ=_$4qeF($ky)Ax4P!F4M({9ZL2XNt8B#OF0~49{@g2as;hb0*V;4xV#uW
zmDb*bR&+1m4!XPgu32<Uj1>@H(n;Bwl2(YEhe&PhFcQs)jFh=^HXt79UhR%B_8J2z
zdpsU;ogpQq=IA5=0{S*`Th_`XEI~^EYEuVkbTU`#yTQW_mU7lT4PFf2zvMkgC9rrM
zI{F69D2z{YqU at ifeRXTVi7B`B)fe{%9 at 6nz<qA)sQzE=_83?%~>@Fp-rS92TGC1^2
zhRI9BqA;z at N>g*uF)`QSN*;kd;VhgDZBOJV15QO0->PHB+A|<4>+=1!N9A2!4h1Vm
z)`a#U<BZHKzU3mKHj{x~4o=8+Y`}Mrfi2B^pS_j~*%OV%r^4&3f{GZJ#300#5~kcf
zUSDuL)LRafmcDBZ0Q>-gVpKFV<{UiZC(zJ;11~MSV_;h`Q`@yer-<XX0mzRkE;dhi
z;p+`FtK;hTH>arVY=H%%yS&+3o13e!Y)UFB;n2wf?xSAjrNd5w>>)!A2i1mbQrS0Y
z1mBoS3dy5_WQK{MIi`uS)`wz*R$`6a6p2Vcy}#7|M6OROG}>d=Bl;fdZKE?jW at dSx
zvt2C!tOYrJTwL6S;Hv<q<&M0M#bp|?DwUr=aU+XyO?Cvr3=AkB1trIg?4tTi0AL{b
zDDUW?20&|JKSiEIX#Z03@$ogiLj07Q6xT-yea|%2jz*slYRHDdoj`eF#BpL-&SNWh
zaD0L_kv$Q;#zcrKFRT24DtBL2g$le(vJ|Onzqf3%>gxE=IZK34NjcdP3DLm#o3QbH
zFaNm1=#6IQaTWib$2XkYmi6|$6<`$Uxzu_Lyx at CPQ_}-s&++NF)T!08SIqdf6V!6M
zT*&tic|Kk?s(*7o_5gB*yush28;>HS#vYAbVm at -vDAimojiHrEp_M>p*8p^%0lkoA
z)K{+_f#(brjZ`S3!X8?M3GFm4Sz1VVNYam{&&PL<zj1l at T9xioXshSlR5XF$yjb-+
zL)FKJYeR8s>@51C{z<rhT|zvXWj=Rmibb=WzlU-xG{Om^@hB|aMRE%ZsZAq{TqNaR
zNM2vd%gI^nO;vJvY%hddpVD>w`|&=rZW?D7P0D2{|NP`c226{-WE#gaaxz(Mh)ZCF
zp27}1$g?-%UbhV6C<xVKk85olSTR)WD|<O?w90Jd=gf at qhF*q38}S`MpUc`{cAb#?
zv?um1RPdrJwB1!Vp)S)8!&&V;EgFlC67mX;*L#KO7&%s+pVPeGNjwio+Im1ew?dyY
z%op^>4f&D{HUYuA3xnaIp`$O4rPiR>Ullm(SN>SSJAe?Sl7Kpobt$T}#VaiU&em~C
z$mQp4K~F8MyTVR$UE3so?IL`#;6;hqw8VKsiyt=6>V#^QdSu^w>fe3*F4eEuck+#I
zRjRmR_i)UE<ZDFGtz7?f at 7+&tm<aA6SkC_4`lzJ at KRjR>`EvoLN677li!BMgNz(g0
zP69AcYAggRNKgm;#3^jEx%Q_<vkD5RklP0=(GoaX=^Ua0 at ZJ*GZQw?%!Gr88Q+!<@
zqY<ld^Xb#4H}I;!v&z*JnukcrIC+)Rfu=RyK;rR3%a_j7#Do`E2(p<8-JeYKPtc}N
zQd8>z`@tQM@%J6|<-0cJA;Rk_jEHP?>S}($-~3JFtu>I4Y>KAIKRPw1!S?e;oglzx
z{v~)bE%#JHLW0kGUk8s$cx2zq2UI;WoHzA#6jT at f{zA6zlH~)&A(W@(6G-PXpI}ms
zRT#bZ;WF3lLk(47>My0wNyyboAKuzs`6yKsbfSFreRjO84cgtvYl2f4|JHUKhfS1<
zO*7zCA-M#Jf06*7HSK0u^mN+vZAC>zwZaE?Gg#Cc+sRDe*n(4N2~P^@be6<4LUUQ0
zWhB&Na{rl58rXct4qHsV%S(jH`FlcNNFau}$6%2Wld&LF|8AasYJ=b12}_ibn31<s
z<ve4k1h-p%{&$}GA*GVqjwG!?mv41TmU=-`kk}m~t>F)ES_u&rWq{}A?rtnno<Ma0
zYL?&|f=&1ckj}xuK@)T$Af2_f^{#L=6{1$`8O@|;<x8UV5yb1FYh+dV`tomVVxkl2
zv)EUW#6w&&w|L1kc(n@|bB2*^N^pgsM!s8iv#?+Up~mLc)*eAINeNr8NA1?;^-ikz
zERDw!38F5*5s at R*jhndh7(b0iYlZ;5L+nm(rCE-4qA>DB0BA-)*Ws}N at efpd#Tewf
z4&VoGvC;czosejI2-c=fv4ul04Kg43c5Aib(=(+oh`PTpDo1v>>>p;|>3zj)Rh3qM
z|Ez^W at Gt(^zs04c;|bZ at rLYBezrG@ZqAxznOYqqtK}`V3Wb!eX26Wbr$RUna<k#IN
zMsbwwDt%r4L`z3jiTMednRPnsd_D&TQ0X;1xCQY6viI|6 at 4w<X%zn!*V~y=XN;@3F
zCi#3afpeTRr4f^WWHC;X&G)AitL>`SrqX9+(I~ni{48{YC|XDGCelb2+8r at ThTHGs
zQR?{lNmWRuI=!3r93(O{ju=a(^Gz6f@|=6+!pAJXHjv!Y$M5;qpnbn5Y9!`;C|V`e
za4Lf=GFqz^{#fY&TOSThlra73_~+Lo6fK%siCpoXe?%)B^A&Cknf8a6#0<L-ISct+
zHn>OWd_;SXh=nsXV-J<NIU_mgd90ekzym-EPN+o#!&lXwzAZs}4{+wc$Hjfnk3?Z4
z#tzA?B8}##@Ursq^!yA%>j<0_!;bm{my5->wzmT#-`%M<(MYtV9dy at xY^*_Q%EABh
zfEw3-rfjH2haLG^8ocWR=7On4RYyl*eY-%_CcLIALu+L>JmC5y{aD+9E%tK7wCCl1
zAB3D?kgXFVUqk7rWRQ}gyLIbUtJ at lCok`oLfZV>&mei5I5`w><eMvtK6j-HK7(Etc
zc^6(@RIYCruiLwsHRnIVJo}u#h+k08Bg~y8%bHsvZ#d#|^u?FEiYQ0xxB~10x?`aR
zqLe9Z7Q-d;Ug12Y_z at I{4STt$D0&the8c{wVI2N#ZGM-0#)_J>dTE`PEx*Ct;<N0*
zhJ at MpKpM)gVD)2wS at zUkqtp_+Jy~VK;8L0fUH?a?iVcD@?=xW^=~n8lRDt2j);m;g
z#|X0G8*N?$DQXFRn at rqEz8sb2P#ugnXh?*^aD at 6ZydC!X^=nO_kAOt*wxa$lho+2R
zi6wDcq88?TmxlKgD!gB!tDy!aTW|J(DQEi2*go=A3-FQVu@!1w*CgH=e at h|R7LUTS
zzlP~?%R?V`m-C4Szf2JY7wZ7C)qg{#kCw~nF&QHtJaCRp{v#vR_7fW|FiTuQ;w~j+
z{OYQOpPyeBpe=tM9=z5B9gKm|Q7Et_PuNe%WMXsutKGc!g8Jm)3B{4N+Zpxa(FToF
z0W52N4W8)<p6B%z_ncKGNlF@|%kLy*MX`@*zVRZ&;A2*FZ|C30AoOo23L#N6pY`xJ
z;N3&VDOr}|i6FOS4jm~VE3d}6+m%Bxq17;uHFm$Cn8SKISuBLs+Ns<6O7n`yCeE6l
z0$xc-0?WD_C<Y53A5 at N!wkhcIK3a3Dmt~o#^0a6KPF||zj>g10N1jT*jwClyml*?;
zaeW+|FihSdc!Y1{Q4$r<P~^0X^MzMc191n{S?`G`$R>7>$yzn9i`#2aYH;T;LLT1F
z@$b(c<T60UD8`tdkr4rubg}b!!3r0T&a^@jt9tA<p_wRJlCHQ at cqhrm5+<MLf%Cl=
z%mUpUR{cX$#+4>b>BHo~`DBynqQ6)+Ts|Ynh3JEbtrEhqlh9W`sCIFr?5dJji7!&r
zf5<`z?ew8wsK(8Ba)!p2Z>vzGypJs1wcG3}QW++tf750xd>@8xJ}%m8Z4a|%weI+Q
zG|o;$cncOcUebI#LY{udt|40AK`SovQ#wD3!{~i|hP=-XC-bz{oTZyMmgIQlj^->G
z&^;uuTj`X5fd at SkEI5czh5f%jngjAdSv@^cC`Qi>Nw7J7Ox>mTHaaaapWN#nVQV&?
z;T~JtIg%8~>9rI8QPH;`TDOhh;fwke5Ne0E- at EB4s3)3ZO~8ah-NPC&C|F3bVe^6J
zwV<GAv2rL!2CKj?Y8$nt at 2b)Xl+g&rp^>rX2m@=hwdY3Os7-`I7d5sD_8R#)udMBi
z?qmAdn=xfhLf5QPAvIh3p7_!K36BME`qGGz0vGixDb1{446_h5$5M1|46Q at KtA+tB
z7P#1}oT29`(RhBI8u~4v#7e(ex{~TH>%>SgX#7?OzWR-?-W38+C1VpP)#}UqyA>0K
zNhvCkQdmNxE#BDDV>uic=7KUstr?c6CD%R$t}L?dDdR%zl_Tdo*{V2)pTh#ik)lpi
zwSYd_L~OP5jx`EGCB79*r4scjn~OG}JS`gy<Z%TAH1aB9lF;Q0)#+&kBPvF@)rmxh
z_lVMFLBF!Bf=S#uaS3%++59EaSz?}<m{(TIB=Rc+s4aRGF?0fZ5FHo;%<dgxH at yZh
z5wN**h$WN=3%rz~W6OT!Twbb(qvUAR<;DOQ)gK2mo_j>+uu|Z$k})PVOvJ<QIn#>#
zW*Hi{R0!<}lu4kHg!UI|A#L-sMub{sX<2qpnzzKF5=bm8VGD(d$$e%waXT=&sbcO0
zy&i<M&*qe9rwR>|qc39Cd!7x7bA;xwoN=ORIeoMlaM=>PAfVtH&e&BlVQ679(+0dz
zDrBl+XwIvI^Li=B8l&N)7*VnDvOqw=olVZ?kn29<HPXcgj at D6e5s;WNvvih{p^>O(
zrdL<Ocx5$AzJo2BX7dS!jAurTFdr#^i9T2-r;^c)d@}F;X3`;+QX)L?)^K?p8F&9G
z1gJR$mvd4GL|)a5 at nqXQu{2$sK*R$`>yQEHZ^ExPA>XMr at +jrI>qU%Y1#_=G82yw|
zR04^GCG1+Rfc~lP_2fR(Fqeue?068?elEB6YZ-^ciCKqqF7vEhoFg`eYK|hbIdIvM
zHWVu2c+hAA)+n*bZnoNxb|~;Ok%n_HAt}l$3kw1)waHc&mNGz4ho+kq9T=l&tkR69
zvxGb|81Tx3ax?64-xUTtGgesrpr;eCCv;OP#2h-rQc6S&c(o#WE=0|-xhB448oz<N
zmH}5by3%k?A*^I1%qgF?rcGdrN)#p*mB7Tp5*0JQ?0uAR_R0MLU;DMp+LtwRagK^}
zrkWMBniIU(?~!x4FbZPS+iEV_popOjSe}-x(xS$O8c`o6A!>;cWeq7`^;pVyO@#~%
zP{@tBngIg-$O##jb2OyPLUfjpX9fdaStUoW(7#nNQG*mEXSZ7L;7j*VnX^~P5?ZO;
z2=Hn}^jwUZbKn3?&KQn*0ideqXgXLKv|3VRoWms-0eUG#C8iXX7|RbjF!t%cW$ib2
zagNX&YFkQyn)CZuWp(0=lv at kX2DNBfCB-WNyLpjDi{=<n-jLRE^h7ZOuEkuwt&*cU
z4Dre`6O@^!vy>7eFBRjF at e~&eSf+SpV&E$!g0z)>nCo52L;#J?GYQe`V#N>t?SN%$
zp3E&OF}JWpD}g2YZ(92;QJkY~X~jVcf>=w^24Y4@#(83<&~S!~sE{G85~1CArLAS6
z!+ME|BSo2o=qxEYFENU%4#FMdwPxst)CjV<^}|vl4H$0^^=AbuQ-I8rq7uNe!V>(6
z*1je4XpK4iQ-jxoMjL3G$%qPhUu>mb1*5dpT#iL!0%)14%u+lvsa}~ib26qxkS(Df
z)?R!6YhYy#*qgEy!V*W|&$#xb&ZD*F at J|a~4<c>Q97dGqz11Au#!^*0C|E;*q|#Z&
z_IWiY#U*>d^}{X?o~_c_NcaAm*S at LqsQoi3#Qy?qU~3~PWJv3bP;RzVBvU=Jmh{RV
zbp5c)pBp^?Y-|62%A5ILq77_mM1>5gwJA4S>x9;>A9nd4wwZs%wQmQnKN)RcD<jGq
zPVIk7xNg at EyV%9P_U+(hpHsWS+QlyRwQm=@*u^e(v5Q^oVi&vE#V&TSi(Twu7rWTS
vE_ShtUF>2PyV%7pcCm|H>|z(YJlOL8eRS-82%9z$00000NkvXXu0mjfndO|k

literal 0
HcmV?d00001

diff --git a/images/about-logo.svg b/images/about-logo.svg
new file mode 100644
index 000000000000..24e6c0350c8c
--- /dev/null
+++ b/images/about-logo.svg
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="431"
+   height="94"
+   id="svg2989"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="about-logo.svg">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1124"
+     id="namedview49"
+     showgrid="false"
+     inkscape:zoom="2.8809269"
+     inkscape:cx="192.78384"
+     inkscape:cy="94.431006"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer3" />
+  <defs
+     id="defs2991">
+    <linearGradient
+       id="linearGradient5221">
+      <stop
+         id="stop5223"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop5225"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="42.111431"
+       y1="48.365711"
+       x2="282.20581"
+       y2="48.365711"
+       id="linearGradient5229"
+       xlink:href="#linearGradient5221"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       color-interpolation-filters="sRGB"
+       id="filter6500">
+      <feGaussianBlur
+         id="feGaussianBlur6502"
+         stdDeviation="1.3643904" />
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       id="filter6500-3">
+      <feGaussianBlur
+         id="feGaussianBlur6502-78"
+         stdDeviation="1.3643904" />
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       id="filter6500-37">
+      <feGaussianBlur
+         id="feGaussianBlur6502-4"
+         stdDeviation="1.3643904" />
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       id="filter6500-9">
+      <feGaussianBlur
+         id="feGaussianBlur6502-6"
+         stdDeviation="1.3643904" />
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       id="filter6500-9-9">
+      <feGaussianBlur
+         id="feGaussianBlur6502-6-8"
+         stdDeviation="1.3643904" />
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       id="filter6500-33">
+      <feGaussianBlur
+         id="feGaussianBlur6502-9"
+         stdDeviation="1.3643904" />
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       id="filter6500-3-8">
+      <feGaussianBlur
+         id="feGaussianBlur6502-78-6"
+         stdDeviation="1.3643904" />
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       id="filter6500-3-6">
+      <feGaussianBlur
+         id="feGaussianBlur6502-78-64"
+         stdDeviation="1.3643904" />
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       id="filter6500-3-9">
+      <feGaussianBlur
+         id="feGaussianBlur6502-78-0"
+         stdDeviation="1.3643904" />
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       id="filter6500-8">
+      <feGaussianBlur
+         id="feGaussianBlur6502-8"
+         stdDeviation="1.3643904" />
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter3832-9">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="2.8349653"
+         id="feGaussianBlur3834-0" />
+    </filter>
+  </defs>
+  <metadata
+     id="metadata2994">
+    <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></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Background"
+     style="display:inline">
+    <g
+       transform="translate(-0.08398773,-958.26173)"
+       id="layer1"
+       style="display:inline">
+      <path
+         style="font-size:64px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter3832-9);font-family:'Circulate (BRK)';-inkscape-font-specification:'Circulate (BRK)'"
+         d="m 135.4375,968.8125 c -11.80719,-0.0545 -22.39252,7.21116 -29.125,16.5625 -10.977223,-6.19182 -24.714668,-4.59205 -35.4375,1.5 -16.401569,-18.36157 -52.390945,-7.34318 -54.625,17.5 -3.893356,22.1565 21.917818,44.8223 42.875,33.9375 5.49208,-3.0162 12.863962,-4.0797 17.6875,0.6563 12.253004,5.6344 27.85778,2.6018 37.125,-7.2813 13.32757,10.8555 33.46556,9.4445 47.0625,-0.2187 12.37928,12.1409 34.46831,12.2526 46.53125,-0.4376 11.45883,7.8807 28.07961,6.2457 37.9375,-3.4687 10.33894,7.3694 24.3333,5.8621 35.28125,0.6875 10.84075,11.1626 29.05763,11.8477 42.1875,4.5 11.95253,12.1739 33.40803,11.7132 45.4375,-0.125 18.32717,14.5983 50.05907,-3.1061 46.6875,-26.375 -1.22521,-19.0425 -25.5438,-34.11895 -42.34375,-23.4375 -4.31196,4.04748 -11.56744,4.7665 -16.03125,0.59375 -9.63775,-3.77965 -20.19307,-1.46433 -29.65625,1.90625 -11.12397,-12.09767 -31.02704,-12.29454 -44.09375,-3.40625 -11.82075,-10.52209 -31.50599,-9.09763 -42.46875,1.9375 -10.61404,-6.64174 -24.57576,-4.67652 -35,1.53125 -11.0288,-9.44559 -28.00934,-9.99648 -40.1875,-2.53125 C 158.07176,974.04692 146.9542,968.014 135.4375,968.8125 z"
+         id="path3964"
+         inkscape:connector-curvature="0" />
+      <rect
+         style="fill:none;stroke:none"
+         id="rect5304"
+         width="28.810171"
+         height="39.223488"
+         x="66.298103"
+         y="12.081921"
+         transform="translate(0,958.36218)" />
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Logo"
+     style="display:inline">
+    <g
+       id="text5538"
+       style="font-size:64px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#cccccc;fill-opacity:1;stroke:none;display:inline;font-family:'Circulate (BRK)';-inkscape-font-specification:'Circulate (BRK)'"
+       transform="translate(-0.310309,-958.35829)">
+      <path
+         d="m 24.534808,1009.1343 c 2e-6,3.2853 0.618668,6.3573 1.856,9.216 1.237332,2.8587 2.922664,5.3546 5.056,7.488 2.133326,2.1333 4.629324,3.8186 7.488,5.056 2.858651,1.2373 5.930648,1.856 9.216,1.856 3.242642,0 6.293305,-0.6187 9.152,-1.856 2.9013,-1.2374 5.41863,-2.9227 7.552,-5.056 2.133293,-2.1334 3.818624,-4.6293 5.056,-7.488 1.237289,-2.8587 1.855955,-5.9307 1.856,-9.216 -4.5e-5,-3.2427 -0.618711,-6.2933 -1.856,-9.15201 -1.237376,-2.90131 -2.922707,-5.41864 -5.056,-7.552 -2.13337,-2.13331 -4.6507,-3.81864 -7.552,-5.056 -2.858695,-1.2373 -5.909358,-1.85597 -9.152,-1.856 -3.285352,3e-5 -6.357349,0.6187 -9.216,1.856 -2.858676,1.23736 -5.354674,2.92269 -7.488,5.056 -2.133336,2.13336 -3.818668,4.65069 -5.056,7.552 -1.237332,2.85871 -1.855998,5.90931 -1.856,9.15201 m 24.192,-5.632 c -2.2e-5,-0.384 -0.170689,-0.6827 -0.512,-0.896 -0.341355,-0.2133 -0.704021,-0.32 -1.088,-0.32 l -4.416,0 c -0.256016,0.085 -0.533349,0.1493 -0.832,0.192 -0.298682,0.043 -0.576015,0.064 -0.832,0.064 -0.682681,0 -1.301347,-0.2347 -1.856,-0.704 -0.512012,-0.512 -0.768012,-1.1093 -0.768,-1.792 -1.2e-5,-0.29866 0.04265,-0.57599 0.128,-0.83201 0.127988,-0.25598 0.255988,-0.49065 0.384,-0.704 l 1.344,-1.344 c 0.341319,-0.29865 0.703985,-0.46931 1.088,-0.512 0.426651,-0.0853 0.831984,-0.14931 1.216,-0.192 0.17065,-0.0427 0.533317,-0.064 1.088,-0.064 0.597316,-0.0426 1.002648,-0.064 1.216,-0.064 0.554648,-0.29865 1.173314,-0.44798 1.856,-0.448 0.725312,-0.0426 1.386645,-0.064 1.984,-0.064 1.151977,2e-5 2.346642,0.17069 3.584,0.512 1.279973,0.38402 2.346638,0.83202 3.2,1.344 0.89597,0.46935 1.621303,1.04535 2.176,1.728 0.554635,0.68271 0.981301,1.51471 1.28,2.49601 0.298634,0.9387 0.5333,2.0693 0.704,3.392 0.0853,0.4693 0.1493,0.9387 0.192,1.408 0.0853,0.4693 0.127966,0.9387 0.128,1.408 -3.4e-5,0.3413 -0.06403,0.6613 -0.192,0.96 -0.128033,0.256 -0.2347,0.5333 -0.32,0.832 -3.3e-5,0.043 -3.3e-5,0.1493 0,0.32 -3.3e-5,0.1707 -0.02137,0.3627 -0.064,0.576 -3.3e-5,0.1707 -3.3e-5,0.3413 0,0.512 -3.3e-5,0.128 -3.3e-5,0.2133 0,0.256 -0.08537,0.4693 -0.170699,0.9387 -0.256,1.408 -0.0427,0.4693 -0.06403,0.9387 -0.064,1.408 l 0,0.192 c 0.04263,0.1707 0.127967,0.4907 0.256,0.96 0.127967,0.4693 0.2133,0.7893 0.256,0.96 l 0,0.384 c -3.3e-5,0.512 -0.128033,1.0027 -0.384,1.472 -0.256032,0.4693 -0.597365,0.896 -1.024,1.28 -0.426698,0.384 -0.896031,0.6827 -1.408,0.896 -0.469363,0.2133 -0.960029,0.32 -1.472,0.32 -0.682695,0 -1.344027,-0.1493 -1.984,-0.448 -0.640026,-0.3413 -1.258692,-0.64 -1.856,-0.896 -0.08536,-0.043 -0.256025,-0.064 -0.512,-0.064 -0.213358,0 -0.362691,0 -0.448,0 -0.81069,0 -1.600022,0.1493 -2.368,0.448 -0.725354,0.256 -1.450687,0.5333 -2.176,0.832 -0.08535,0.043 -0.298686,0.1493 -0.64,0.32 -0.298685,0.1707 -0.490685,0.2773 -0.576,0.32 -0.170685,0.085 -0.298685,0.1067 -0.384,0.064 -0.08535,0 -0.234684,0 -0.448,0 l -0.512,0 c -0.21335,-0.043 -0.640016,-0.1707 -1.28,-0.384 -0.597348,-0.2133 -1.002681,-0.3627 -1.216,-0.448 -0.04268,0 -0.128014,-0.021 -0.256,-0.064 -0.08535,-0.043 -0.128014,-0.085 -0.128,-0.128 -0.68268,-0.4693 -1.408013,-1.0027 -2.176,-1.6 -0.725344,-0.64 -1.216011,-1.3867 -1.472,-2.24 -0.08534,-0.2987 -0.213344,-0.704 -0.384,-1.216 -0.170677,-0.5547 -0.25601,-0.832 -0.256,-0.832 l 0,-3.2 c -1e-5,-0.043 0.04266,-0.1707 0.128,-0.384 0.12799,-0.2133 0.234657,-0.3627 0.32,-0.448 0.469323,-0.8533 1.066655,-1.6427 1.792,-2.368 0.767987,-0.768 1.578653,-1.408 2.432,-1.92 0.597318,-0.3413 1.215984,-0.512 1.856,-0.512 0.639983,-0.043 1.258649,-0.1707 1.856,-0.384 0.08532,-0.043 0.255982,-0.1067 0.512,-0.192 0.298648,-0.128 0.490648,-0.2133 0.576,-0.256 0.170647,-0.085 0.426647,-0.128 0.768,-0.128 0.341313,-0.043 0.682646,-0.085 1.024,-0.128 0.341312,-0.085 0.618645,-0.192 0.832,-0.32 0.255978,-0.1707 0.383978,-0.4267 0.384,-0.768 m -2.816,8.832 c -1.9e-5,0.6827 0.213314,1.1733 0.64,1.472 0.426646,0.256 0.938646,0.384 1.536,0.384 l 0.704,0 c 0.127978,0 0.191977,-0.043 0.192,-0.128 0.08531,-0.085 0.234644,-0.2347 0.448,-0.448 0.255977,-0.2133 0.426643,-0.3627 0.512,-0.448 0.08531,-0.128 0.127976,-0.2987 0.128,-0.512 -2.4e-5,-0.2133 -2.4e-5,-0.384 0,-0.512 l 0,-0.64 c -0.04269,-0.128 -0.149357,-0.2773 -0.32,-0.448 -0.128023,-0.2133 -0.277356,-0.32 -0.448,-0.32 l -2.368,0 c -0.341353,0 -0.597353,0.2133 -0.768,0.64 -0.170686,0.384 -0.256019,0.704 -0.256,0.96"
+         id="path6729"
+         inkscape:connector-curvature="0"
+         style="stroke:none" />
+      <path
+         d="m 68.147808,1011.6303 c 2e-6,3.072 0.597335,5.9733 1.792,8.704 1.152,2.7307 2.730665,5.0986 4.736,7.104 2.005327,2.0053 4.373325,3.584 7.104,4.736 2.730653,1.1946 5.631983,1.792 8.704,1.792 3.114644,0 6.015974,-0.5974 8.704,-1.792 2.730632,-1.152 5.098632,-2.7307 7.104002,-4.736 2.04796,-2.0054 3.64796,-4.3733 4.8,-7.104 1.19462,-2.7307 1.79196,-5.632 1.792,-8.704 -4e-5,-3.1147 -0.59738,-6.016 -1.792,-8.704 -1.15204,-2.7307 -2.75204,-5.09866 -4.8,-7.10401 -2.00537,-2.04798 -4.37337,-3.64798 -7.104002,-4.8 -2.730693,-1.19464 -5.632023,-1.79197 -8.704,-1.792 -3.072017,3e-5 -5.973347,0.59736 -8.704,1.792 -2.730675,1.15202 -5.098673,2.75202 -7.104,4.8 -2.005335,2.00535 -3.584,4.37331 -4.736,7.10401 -1.194665,2.7307 -1.791998,5.632 -1.792,8.704 m 10.176,-1.536 c -0.213341,-0.64 -0.320007,-1.28 -0.32,-1.92 -7e-6,-0.2133 0.02133,-0.4053 0.064,-0.576 0.04266,-0.2133 0.06399,-0.4267 0.064,-0.64 l 0,-0.384 c -0.08534,-0.64 -0.192007,-1.3227 -0.32,-2.048 -0.08534,-0.768 -0.128007,-1.472 -0.128,-2.112 -7e-6,-0.64 0.106659,-1.2587 0.32,-1.856 0.213326,-0.63999 0.511992,-1.19466 0.896,-1.66401 0.383991,-0.51198 0.853324,-0.91731 1.408,-1.216 0.554656,-0.34131 1.173322,-0.51198 1.856,-0.512 0.725321,2e-5 1.407987,0.12802 2.048,0.384 0.639986,0.25602 1.087985,0.74669 1.344,1.472 0.127985,0.29868 0.213318,0.59735 0.256,0.896 0.08532,0.29871 0.170651,0.61871 0.256,0.96001 0.170651,0.384 0.341318,0.768 0.512,1.152 0.170651,0.3413 0.255984,0.7253 0.256,1.152 -1.6e-5,0.5973 -0.06402,1.1733 -0.192,1.728 -0.08535,0.5547 -0.128016,1.1307 -0.128,1.728 -1.6e-5,0.4267 0.02132,0.8533 0.064,1.28 0.08532,0.4267 0.170651,0.8533 0.256,1.28 0.08532,0.7253 0.17065,1.4933 0.256,2.304 0.127983,0.8107 0.55465,1.4507 1.28,1.92 0.127982,0.085 0.319982,0.192 0.576,0.32 0.255981,0.128 0.405315,0.192 0.448,0.192 l 1.536,0 c 0.04265,0 0.12798,-0.021 0.256,-0.064 0.170646,-0.085 0.298646,-0.1707 0.384,-0.256 0.213312,-0.128 0.426645,-0.2773 0.64,-0.448 0.255978,-0.1707 0.469311,-0.3627 0.64,-0.576 -2.2e-5,0 0.02131,-0.064 0.064,-0.192 0.04264,-0.128 0.08531,-0.2347 0.128,-0.32 0.04264,-0.085 0.08531,-0.2347 0.128,-0.448 0.04264,-0.2133 0.06398,-0.3413 0.064,-0.384 -2.3e-5,-0.043 -2.3e-5,-0.1707 0,-0.384 -2.3e-5,-0.256 -2.3e-5,-0.512 0,-0.768 0.04264,-0.2987 0.06398,-0.5547 0.064,-0.768 0.04264,-0.2133 0.06398,-0.3627 0.064,-0.448 -2.3e-5,-0.085 0.04264,-0.32 0.128,-0.704 0.08531,-0.4267 0.14931,-0.6827 0.192,-0.768 0.08531,-0.384 0.127977,-0.768 0.128,-1.152 -2.3e-5,-0.4267 0.04264,-0.832 0.128,-1.216 0.08531,-0.3413 0.170643,-0.6827 0.256,-1.024 0.127976,-0.3413 0.191976,-0.6827 0.192,-1.024 -2.4e-5,-0.2987 -0.04269,-0.5547 -0.128,-0.768 -0.08536,-0.256 -0.128024,-0.5547 -0.128,-0.896 -2.4e-5,-0.4267 0.08531,-0.8747 0.256,-1.34401 0.170643,-0.51198 0.405309,-0.95998 0.704,-1.344 0.298642,-0.42665 0.639975,-0.76798 1.024,-1.024 0.426641,-0.25598 0.895974,-0.38398 1.408,-0.384 0.511973,2e-5 1.045305,0.10669 1.6,0.32 0.554638,0.21335 1.066642,0.51202 1.536002,0.896 0.51197,0.38402 0.9173,0.83202 1.216,1.344 0.3413,0.46931 0.51197,0.98131 0.512,1.53601 l 0,3.904 -0.32,1.152 0,3.328 c 0.0853,0.384 0.19197,0.8107 0.32,1.28 0.12797,0.4693 0.19197,0.896 0.192,1.28 -3e-5,0.1707 -0.0214,0.32 -0.064,0.448 -0.0427,0.128 -0.064,0.2773 -0.064,0.448 -3e-5,0.128 -3e-5,0.2347 0,0.32 0.0426,0.085 0.0853,0.2133 0.128,0.384 l 0,3.072 c -0.0854,0.3413 -0.1707,0.6827 -0.256,1.024 -0.0427,0.2987 -0.12803,0.6187 -0.256,0.96 -0.2987,0.768 -0.78937,1.408 -1.472,1.92 -0.640031,0.4693 -1.386697,0.704 -2.240002,0.704 l -0.256,0 -2.176,-0.64 -4.352,0 c -0.76802,0.3413 -1.557353,0.64 -2.368,0.896 -0.810684,0.256 -1.642684,0.4693 -2.496,0.64 l -0.256,0 c -0.597349,0 -1.194681,-0.1493 -1.792,-0.448 -0.55468,-0.256 -1.088013,-0.512 -1.6,-0.768 -0.469345,-0.256 -0.960011,-0.64 -1.472,-1.152 -0.51201,-0.512 -1.002677,-1.088 -1.472,-1.728 -0.426676,-0.64 -0.810675,-1.28 -1.152,-1.92 -0.341341,-0.64 -0.533341,-1.216 -0.576,-1.728 l 0,-1.6 c -8e-6,-0.128 -8e-6,-0.32 0,-0.576 -8e-6,-0.2987 -0.02134,-0.5973 -0.064,-0.896 -8e-6,-0.3413 -8e-6,-0.64 0,-0.896 -8e-6,-0.2987 -8e-6,-0.512 0,-0.64"
+         id="path6731"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 109.65681,1004.0143 c 0,3.7547 0.704,7.296 2.112,10.624 1.408,3.328 3.32799,6.2293 5.76,8.704 2.47466,2.5173 5.35465,4.5013 8.64,5.952 3.32798,1.4506 6.89064,2.176 10.688,2.176 3.75464,0 7.29597,-0.704 10.624,-2.112 3.37063,-1.408 6.29329,-3.3494 8.768,-5.824 2.51728,-2.432 4.50128,-5.2907 5.952,-8.576 1.45061,-3.328 2.17595,-6.8907 2.176,-10.688 -5e-5,-3.7547 -0.70405,-7.29599 -2.112,-10.62401 -1.40805,-3.37064 -3.34938,-6.2933 -5.824,-8.768 -2.47471,-2.5173 -5.37604,-4.5013 -8.704,-5.952 -3.28537,-1.45063 -6.8267,-2.17596 -10.624,-2.176 -3.75469,4e-5 -7.29602,0.70404 -10.624,2.112 -3.32801,1.40804 -6.25068,3.34937 -8.768,5.824 -2.47467,2.4747 -4.43734,5.37603 -5.888,8.704 -1.45067,3.28535 -2.176,6.82671 -2.176,10.62401 m 12.864,6.08 0,-0.384 c -1e-5,-0.128 -1e-5,-0.3413 0,-0.64 -1e-5,-0.3413 -1e-5,-0.704 0,-1.088 0.0427,-0.384 0.064,-0.7253 0.064,-1.024 0.0426,-0.3413 0.064,-0.576 0.064,-0.704 -1e-5,-0.043 -1e-5,-0.128 0,-0.256 0.0427,-0.128 0.064,-0.2133 0.064,-0.256 0.0853,-0.8533 0.21332,-1.6853 0.384,-2.496 0.21332,-0.8107 0.53332,-1.6 0.96,-2.368 0.42665,-0.7253 0.93865,-1.30133 1.536,-1.72801 0.63998,-0.46932 1.30132,-0.93865 1.984,-1.408 0.68265,-0.46931 1.34398,-0.81065 1.984,-1.024 0.68265,-0.21331 1.40798,-0.42665 2.176,-0.64 0.0853,2e-5 0.25598,-0.0427 0.512,-0.128 0.29864,-0.0853 0.49064,-0.14931 0.576,-0.192 l 0.448,0 c 0.34131,2e-5 0.66131,0.0213 0.96,0.064 0.34131,0.0427 0.68264,0.064 1.024,0.064 0.42664,2e-5 0.85331,-0.0213 1.28,-0.064 0.46931,-0.0853 0.85331,-0.29865 1.152,-0.64 0.0853,-0.12798 0.21331,-0.31998 0.384,-0.576 0.17064,-0.25598 0.25597,-0.38398 0.256,-0.384 l 0,-2.688 c -3e-5,-0.0426 0.064,-0.21331 0.192,-0.512 0.12797,-0.29864 0.23464,-0.55464 0.32,-0.768 0.29864,-0.72531 0.68264,-1.25864 1.152,-1.6 0.51197,-0.38397 1.13064,-0.76797 1.856,-1.152 0.29863,-0.2133 0.7253,-0.31997 1.28,-0.32 0.51197,3e-5 1.0453,0.1067 1.6,0.32 0.55463,0.21336 1.06663,0.51203 1.536,0.896 0.4693,0.38403 0.8533,0.83203 1.152,1.344 0.29863,0.46936 0.44796,0.98136 0.448,1.536 -4e-5,0.68269 -0.0427,1.45069 -0.128,2.304 -0.0427,0.81069 -0.1707,1.53602 -0.384,2.176 l 0,3.456 0,0.384 c 0.0426,0.17068 0.064,0.53331 0.064,1.08801 -4e-5,0.5547 -4e-5,0.9173 0,1.088 -4e-5,0.085 -0.0214,0.192 -0.064,0.32 -4e-5,0.085 -4e-5,0.1493 0,0.192 l 0,4.8 c 0.0853,0.1707 0.10663,0.3413 0.064,0.512 -4e-5,0.128 -4e-5,0.2773 0,0.448 -4e-5,0.2133 -4e-5,0.4053 0,0.576 0.0426,0.128 0.0213,0.2773 -0.064,0.448 l 0,3.328 c -4e-5,0.043 -4e-5,0.1067 0,0.192 0.0426,0.085 0.064,0.1493 0.064,0.192 -4e-5,0.085 -4e-5,0.2347 0,0.448 -4e-5,0.2133 -4e-5,0.448 0,0.704 0.0426,0.2133 0.064,0.4267 0.064,0.64 0.0426,0.2133 0.064,0.3413 0.064,0.384 -4e-5,0.085 0.0426,0.2987 0.128,0.64 0.0853,0.3413 0.1493,0.5547 0.192,0.64 l 0,0.256 c -4e-5,0.7253 -0.2987,1.408 -0.896,2.048 -0.5547,0.5973 -1.0667,1.1307 -1.536,1.6 -0.34137,0.2987 -0.8107,0.448 -1.408,0.448 -1.02403,0 -2.0267,-0.192 -3.008,-0.576 -0.9387,-0.384 -1.92003,-0.576 -2.944,-0.576 -0.76803,0 -1.42936,0.1707 -1.984,0.512 -0.55469,0.3413 -1.19469,0.6827 -1.92,1.024 -0.38402,0.2133 -0.78936,0.32 -1.216,0.32 -0.42669,0 -0.85336,0 -1.28,0 -0.89602,0 -1.70669,-0.1707 -2.432,-0.512 -0.68269,-0.3413 -1.40802,-0.7467 -2.176,-1.216 -0.76802,-0.512 -1.42935,-1.1307 -1.984,-1.856 -0.55468,-0.7253 -1.02401,-1.4933 -1.408,-2.304 -0.38401,-0.8533 -0.68268,-1.728 -0.896,-2.624 -0.17068,-0.9387 -0.25601,-1.8347 -0.256,-2.688 m 8.512,-2.368 c -2e-5,0.2133 -2e-5,0.5333 0,0.96 -2e-5,0.4267 0.0426,0.7893 0.128,1.088 0.21331,0.7253 0.53331,1.472 0.96,2.24 0.46931,0.7253 1.04531,1.2587 1.728,1.6 0.21331,0.128 0.49064,0.2773 0.832,0.448 0.38397,0.1707 0.57597,0.256 0.576,0.256 l 0.768,0 c 0.0426,0 0.23464,-0.085 0.576,-0.256 0.38397,-0.1707 0.66131,-0.32 0.832,-0.448 0.29864,-0.1707 0.55464,-0.4267 0.768,-0.768 0.2133,-0.384 0.31997,-0.7467 0.32,-1.088 l 0,-2.496 c -0.21336,-0.4693 -0.2987,-0.9387 -0.256,-1.408 0.0426,-0.512 0.0213,-1.0027 -0.064,-1.472 -0.0427,-0.1707 -0.0854,-0.5333 -0.128,-1.088 -0.0427,-0.5547 -0.064,-0.9173 -0.064,-1.088 l -0.128,-0.256 -1.152,-1.088 -0.512,-0.256 -1.664,0 -0.832,0.448 -2.176,2.176 c -0.12802,0.128 -0.23469,0.2987 -0.32,0.512 -0.0853,0.2133 -0.14935,0.4267 -0.192,0.64 l 0,1.344"
+         id="path6733"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 160.78481,1009.1343 c 0,3.2853 0.61867,6.3573 1.856,9.216 1.23733,2.8587 2.92266,5.3546 5.056,7.488 2.13332,2.1333 4.62932,3.8186 7.488,5.056 2.85865,1.2373 5.93065,1.856 9.216,1.856 3.24264,0 6.2933,-0.6187 9.152,-1.856 2.9013,-1.2374 5.41863,-2.9227 7.552,-5.056 2.13329,-2.1334 3.81862,-4.6293 5.056,-7.488 1.23729,-2.8587 1.85595,-5.9307 1.856,-9.216 -5e-5,-3.2427 -0.61871,-6.2933 -1.856,-9.15201 -1.23738,-2.90131 -2.92271,-5.41864 -5.056,-7.552 -2.13337,-2.13331 -4.6507,-3.81864 -7.552,-5.056 -2.8587,-1.2373 -5.90936,-1.85597 -9.152,-1.856 -3.28535,3e-5 -6.35735,0.6187 -9.216,1.856 -2.85868,1.23736 -5.35468,2.92269 -7.488,5.056 -2.13334,2.13336 -3.81867,4.65069 -5.056,7.552 -1.23733,2.85871 -1.856,5.90931 -1.856,9.15201 m 24.192,-5.632 c -2e-5,-0.384 -0.17069,-0.6827 -0.512,-0.896 -0.34136,-0.2133 -0.70402,-0.32 -1.088,-0.32 l -4.416,0 c -0.25602,0.085 -0.53335,0.1493 -0.832,0.192 -0.29868,0.043 -0.57602,0.064 -0.832,0.064 -0.68268,0 -1.30135,-0.2347 -1.856,-0.704 -0.51201,-0.512 -0.76801,-1.1093 -0.768,-1.792 -1e-5,-0.29866 0.0427,-0.57599 0.128,-0.83201 0.12799,-0.25598 0.25599,-0.49065 0.384,-0.704 l 1.344,-1.344 c 0.34132,-0.29865 0.70398,-0.46931 1.088,-0.512 0.42665,-0.0853 0.83198,-0.14931 1.216,-0.192 0.17065,-0.0427 0.53331,-0.064 1.088,-0.064 0.59731,-0.0426 1.00265,-0.064 1.216,-0.064 0.55465,-0.29865 1.17331,-0.44798 1.856,-0.448 0.72531,-0.0426 1.38664,-0.064 1.984,-0.064 1.15197,2e-5 2.34664,0.17069 3.584,0.512 1.27997,0.38402 2.34664,0.83202 3.2,1.344 0.89597,0.46935 1.6213,1.04535 2.176,1.728 0.55463,0.68271 0.9813,1.51471 1.28,2.49601 0.29863,0.9387 0.5333,2.0693 0.704,3.392 0.0853,0.4693 0.1493,0.9387 0.192,1.408 0.0853,0.4693 0.12796,0.9387 0.128,1.408 -4e-5,0.3413 -0.064,0.6613 -0.192,0.96 -0.12804,0.256 -0.2347,0.5333 -0.32,0.832 -3e-5,0.043 -3e-5,0.1493 0,0.32 -3e-5,0.1707 -0.0214,0.3627 -0.064,0.576 -3e-5,0.1707 -3e-5,0.3413 0,0.512 -3e-5,0.128 -3e-5,0.2133 0,0.256 -0.0854,0.4693 -0.1707,0.9387 -0.256,1.408 -0.0427,0.4693 -0.064,0.9387 -0.064,1.408 l 0,0.192 c 0.0426,0.1707 0.12797,0.4907 0.256,0.96 0.12797,0.4693 0.2133,0.7893 0.256,0.96 l 0,0.384 c -4e-5,0.512 -0.12803,1.0027 -0.384,1.472 -0.25603,0.4693 -0.59737,0.896 -1.024,1.28 -0.4267,0.384 -0.89603,0.6827 -1.408,0.896 -0.46937,0.2133 -0.96003,0.32 -1.472,0.32 -0.6827,0 -1.34403,-0.1493 -1.984,-0.448 -0.64003,-0.3413 -1.25869,-0.64 -1.856,-0.896 -0.0854,-0.043 -0.25603,-0.064 -0.512,-0.064 -0.21336,0 -0.36269,0 -0.448,0 -0.81069,0 -1.60002,0.1493 -2.368,0.448 -0.72536,0.256 -1.45069,0.5333 -2.176,0.832 -0.0853,0.043 -0.29869,0.1493 -0.64,0.32 -0.29869,0.1707 -0.49069,0.2773 -0.576,0.32 -0.17069,0.085 -0.29869,0.1067 -0.384,0.064 -0.0854,0 -0.23469,0 -0.448,0 l -0.512,0 c -0.21335,-0.043 -0.64002,-0.1707 -1.28,-0.384 -0.59735,-0.2133 -1.00268,-0.3627 -1.216,-0.448 -0.0427,0 -0.12802,-0.021 -0.256,-0.064 -0.0854,-0.043 -0.12802,-0.085 -0.128,-0.128 -0.68268,-0.4693 -1.40801,-1.0027 -2.176,-1.6 -0.72535,-0.64 -1.21601,-1.3867 -1.472,-2.24 -0.0854,-0.2987 -0.21335,-0.704 -0.384,-1.216 -0.17068,-0.5547 -0.25601,-0.832 -0.256,-0.832 l 0,-3.2 c -1e-5,-0.043 0.0426,-0.1707 0.128,-0.384 0.12799,-0.2133 0.23465,-0.3627 0.32,-0.448 0.46932,-0.8533 1.06665,-1.6427 1.792,-2.368 0.76799,-0.768 1.57865,-1.408 2.432,-1.92 0.59732,-0.3413 1.21598,-0.512 1.856,-0.512 0.63998,-0.043 1.25865,-0.1707 1.856,-0.384 0.0853,-0.043 0.25598,-0.1067 0.512,-0.192 0.29865,-0.128 0.49065,-0.2133 0.576,-0.256 0.17065,-0.085 0.42665,-0.128 0.768,-0.128 0.34131,-0.043 0.68264,-0.085 1.024,-0.128 0.34131,-0.085 0.61864,-0.192 0.832,-0.32 0.25598,-0.1707 0.38398,-0.4267 0.384,-0.768 m -2.816,8.832 c -2e-5,0.6827 0.21331,1.1733 0.64,1.472 0.42664,0.256 0.93864,0.384 1.536,0.384 l 0.704,0 c 0.12798,0 0.19198,-0.043 0.192,-0.128 0.0853,-0.085 0.23464,-0.2347 0.448,-0.448 0.25597,-0.2133 0.42664,-0.3627 0.512,-0.448 0.0853,-0.128 0.12797,-0.2987 0.128,-0.512 -3e-5,-0.2133 -3e-5,-0.384 0,-0.512 l 0,-0.64 c -0.0427,-0.128 -0.14936,-0.2773 -0.32,-0.448 -0.12803,-0.2133 -0.27736,-0.32 -0.448,-0.32 l -2.368,0 c -0.34136,0 -0.59736,0.2133 -0.768,0.64 -0.17069,0.384 -0.25602,0.704 -0.256,0.96"
+         id="path6735"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 204.58981,1007.7263 c 0,2.816 0.53333,5.4613 1.6,7.936 1.024,2.4747 2.432,4.6293 4.224,6.464 1.83466,1.8773 3.96799,3.3493 6.4,4.416 2.47465,1.0666 5.11998,1.6 7.936,1.6 2.81598,0 5.46131,-0.5334 7.936,-1.6 2.47464,-1.024 4.6293,-2.4534 6.464,-4.288 1.8773,-1.792 3.3493,-3.904 4.416,-6.336 1.10929,-2.4747 1.66396,-5.12 1.664,-7.936 -4e-5,-2.816 -0.53337,-5.4613 -1.6,-7.936 -1.02404,-2.47466 -2.45337,-4.62932 -4.288,-6.46401 -1.79203,-1.87731 -3.92536,-3.34931 -6.4,-4.416 -2.47469,-1.1093 -5.12002,-1.66397 -7.936,-1.664 -2.81602,3e-5 -5.46135,0.53336 -7.936,1.6 -2.47468,1.02403 -4.65067,2.45336 -6.528,4.288 -1.83467,1.79202 -3.28534,3.92535 -4.352,6.4 -1.06667,2.47471 -1.6,5.12001 -1.6,7.93601 m 22.4,12.288 -3.264,0 c -0.0854,0 -0.32002,-0.064 -0.704,-0.192 -0.34135,-0.128 -0.59735,-0.2347 -0.768,-0.32 -0.72535,-0.2987 -1.40802,-0.6613 -2.048,-1.088 -0.64001,-0.4267 -1.17335,-0.9813 -1.6,-1.664 -0.0853,-0.128 -0.21335,-0.32 -0.384,-0.576 -0.12801,-0.2987 -0.29868,-0.5973 -0.512,-0.896 -0.17068,-0.3413 -0.34135,-0.64 -0.512,-0.896 -0.12801,-0.2987 -0.21335,-0.4907 -0.256,-0.576 -0.29868,-0.5547 -0.53334,-1.0667 -0.704,-1.536 -0.12801,-0.512 -0.29868,-1.0667 -0.512,-1.664 -0.0427,-0.768 -0.10668,-1.4933 -0.192,-2.176 -0.0427,-0.7253 -0.064,-1.4507 -0.064,-2.176 -1e-5,-1.4933 0.42666,-2.88 1.28,-4.16 0.85332,-1.3227 1.87732,-2.41066 3.072,-3.26401 0.12798,-0.0853 0.44798,-0.27732 0.96,-0.576 0.55465,-0.34131 0.93865,-0.59731 1.152,-0.768 l 0.192,-0.064 c 0.72532,-0.25598 1.42931,-0.53331 2.112,-0.832 0.72531,-0.34131 1.45065,-0.55465 2.176,-0.64 0.0426,2e-5 0.17064,2e-5 0.384,0 0.21331,2e-5 0.42664,2e-5 0.64,0 0.21331,-0.0426 0.42664,-0.064 0.64,-0.064 0.21331,-0.0426 0.34131,-0.064 0.384,-0.064 0.0853,2e-5 0.29864,-0.0426 0.64,-0.128 0.34131,-0.0853 0.55464,-0.12798 0.64,-0.128 -2e-5,-0.0426 0.10664,-0.064 0.32,-0.064 0.21331,2e-5 0.36264,2e-5 0.448,0 1.36531,2e-5 2.68797,0.34135 3.968,1.024 1.32264,0.68269 2.2613,1.66402 2.816,2.944 0.0853,0.12802 0.17063,0.34135 0.256,0.64001 0.0853,0.256 0.1493,0.384 0.192,0.384 l 0,0.32 c -3e-5,0.2987 -0.12803,0.6187 -0.384,0.96 -0.21337,0.3413 -0.4907,0.6613 -0.832,0.96 -0.34136,0.2987 -0.70403,0.5547 -1.088,0.768 -0.34136,0.1707 -0.66136,0.256 -0.96,0.256 -0.34136,0 -0.6827,-0.064 -1.024,-0.192 -0.29869,-0.1707 -0.59736,-0.32 -0.896,-0.448 -0.25603,-0.1707 -0.53336,-0.32 -0.832,-0.448 -0.29869,-0.1707 -0.61869,-0.256 -0.96,-0.256 l -3.52,0 c -0.0427,0 -0.14936,0.021 -0.32,0.064 -0.12802,0.043 -0.23469,0.085 -0.32,0.128 -0.55469,0.2133 -1.02402,0.5547 -1.408,1.024 -0.34135,0.4693 -0.61869,1.0027 -0.832,1.6 -0.21335,0.5547 -0.36269,1.152 -0.448,1.792 -0.0854,0.5973 -0.12802,1.152 -0.128,1.664 l 0,0.768 c 0.34131,0.8107 0.78931,1.5573 1.344,2.24 0.55465,0.6827 1.15198,1.3227 1.792,1.92 l 0.192,0.064 c 0.21331,0.085 0.51198,0.2133 0.896,0.384 0.38398,0.1707 0.57598,0.256 0.576,0.256 l 3.392,0 c 0.46931,-0.2133 0.93864,-0.4053 1.408,-0.576 0.4693,-0.1707 0.95997,-0.256 1.472,-0.256 0.4693,0 0.95997,0.2987 1.472,0.896 0.55463,0.5547 0.83197,1.0667 0.832,1.536 l 0,0.064 c -0.2987,1.4933 -1.04536,2.6453 -2.24,3.456 -1.1947,0.8107 -2.53869,1.216 -4.032,1.216 -0.59736,0 -1.25869,-0.043 -1.984,-0.128 -0.68269,-0.085 -1.32269,-0.256 -1.92,-0.512"
+         id="path6737"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 242.03481,1003.6303 c 0,2.9013 0.53333,5.6533 1.6,8.256 1.10933,2.56 2.60266,4.8 4.48,6.72 1.91999,1.92 4.15999,3.4347 6.72,4.544 2.55998,1.1093 5.31198,1.664 8.256,1.664 2.90131,0 5.63197,-0.5547 8.192,-1.664 2.60263,-1.0667 4.86397,-2.5387 6.784,-4.416 1.91996,-1.92 3.43463,-4.16 4.544,-6.72 1.15196,-2.56 1.72796,-5.312 1.728,-8.256 -4e-5,-2.9013 -0.55471,-5.63199 -1.664,-8.19201 -1.06671,-2.60264 -2.56004,-4.86397 -4.48,-6.784 -1.92003,-1.91997 -4.16003,-3.43464 -6.72,-4.544 -2.56003,-1.15197 -5.31202,-1.72797 -8.256,-1.728 -2.90135,3e-5 -5.65335,0.5547 -8.256,1.664 -2.56001,1.0667 -4.80001,2.56003 -6.72,4.48 -1.92,1.92003 -3.43467,4.16002 -4.544,6.72 -1.10933,2.56002 -1.664,5.31201 -1.664,8.25601 m 16.704,11.84 c -2e-5,-0.3413 -2e-5,-0.5973 0,-0.768 0.0426,-0.1707 0.14932,-0.4267 0.32,-0.768 l 0,-7.296 c -0.0427,-0.2133 -0.0854,-0.384 -0.128,-0.512 -2e-5,-0.1707 -2e-5,-0.3627 0,-0.576 -2e-5,-0.3413 0.0426,-0.5973 0.128,-0.768 l 0,-4.352 c -2e-5,-0.4267 0.12798,-0.89599 0.384,-1.40801 0.25598,-0.51198 0.57598,-0.98131 0.96,-1.408 0.42665,-0.46931 0.87465,-0.85331 1.344,-1.152 0.46931,-0.29865 0.93865,-0.44798 1.408,-0.448 0.34131,2e-5 0.63998,0.0854 0.896,0.256 0.29864,0.12802 0.57598,0.29869 0.832,0.512 0.59731,0.42669 1.04531,0.83202 1.344,1.216 0.29864,0.34135 0.46931,0.87468 0.512,1.6 0.0426,0.51201 0.0853,1.08801 0.128,1.72801 0.0853,0.5973 0.12797,1.1733 0.128,1.728 -3e-5,0.3413 -0.0214,0.64 -0.064,0.896 -0.0427,0.256 -0.064,0.5547 -0.064,0.896 -2e-5,0.2133 -0.0214,0.448 -0.064,0.704 -2e-5,0.256 0.0426,0.4907 0.128,0.704 l 0,2.688 c -0.0427,0.1707 -0.064,0.384 -0.064,0.64 -2e-5,0.3413 0.0213,0.6827 0.064,1.024 0.0853,0.3413 0.17064,0.6827 0.256,1.024 0.0426,0.4267 0.0853,0.8533 0.128,1.28 0.0426,0.384 0.10664,0.7893 0.192,1.216 -3e-5,0.085 0.0426,0.32 0.128,0.704 0.0853,0.3413 0.12797,0.5547 0.128,0.64 -3e-5,0 -3e-5,0.085 0,0.256 0.0426,0.128 0.064,0.2347 0.064,0.32 -3e-5,1.0667 -0.44803,2.0267 -1.344,2.88 -0.89602,0.8107 -1.87736,1.216 -2.944,1.216 l -0.32,0 c -0.59735,-0.128 -1.08802,-0.2773 -1.472,-0.448 -0.38402,-0.1707 -0.72535,-0.384 -1.024,-0.64 -0.29869,-0.256 -0.57602,-0.5547 -0.832,-0.896 -0.25602,-0.384 -0.53335,-0.832 -0.832,-1.344 -0.21335,-0.384 -0.32002,-0.832 -0.32,-1.344 m 0.448,-24.83201 c -2e-5,-0.34131 0.12798,-0.68264 0.384,-1.024 0.25598,-0.38397 0.55465,-0.70397 0.896,-0.96 0.38398,-0.29864 0.76798,-0.5333 1.152,-0.704 0.42665,-0.2133 0.81065,-0.31997 1.152,-0.32 0.38398,3e-5 0.78931,0.0854 1.216,0.256 0.46931,0.12803 0.89598,0.34136 1.28,0.64 0.42664,0.25603 0.76798,0.57603 1.024,0.96 0.29864,0.38403 0.44798,0.78936 0.448,1.216 -2e-5,0.17069 -0.0854,0.40536 -0.256,0.704 -0.12802,0.29869 -0.29869,0.61869 -0.512,0.96 -0.17069,0.29869 -0.36269,0.59736 -0.576,0.896 -0.21336,0.25602 -0.38402,0.42669 -0.512,0.512 -0.64002,0.42669 -1.30135,0.64002 -1.984,0.64 -0.59735,2e-5 -1.06669,-0.21331 -1.408,-0.64 -0.34135,-0.42664 -0.70402,-0.81064 -1.088,-1.152 -0.34135,-0.34131 -0.64002,-0.63998 -0.896,-0.896 -0.21335,-0.25597 -0.32002,-0.61864 -0.32,-1.088"
+         id="path6739"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 280.90681,1006.5103 c 0,3.2 0.59733,6.2293 1.792,9.088 1.19466,2.816 2.83733,5.2693 4.928,7.36 2.09066,2.1333 4.54399,3.7973 7.36,4.992 2.81598,1.2373 5.82398,1.856 9.024,1.856 3.19997,0 6.20797,-0.5974 9.024,-1.792 2.81597,-1.1947 5.2693,-2.8374 7.36,-4.928 2.13329,-2.0907 3.81862,-4.544 5.056,-7.36 1.23729,-2.816 1.85595,-5.824 1.856,-9.024 -5e-5,-3.2 -0.61871,-6.208 -1.856,-9.02401 -1.19471,-2.81598 -2.83737,-5.26931 -4.928,-7.36 -2.04804,-2.1333 -4.48004,-3.81864 -7.296,-5.056 -2.81603,-1.2373 -5.82403,-1.85597 -9.024,-1.856 -3.20002,3e-5 -6.22935,0.6187 -9.088,1.856 -2.81601,1.1947 -5.29068,2.83736 -7.424,4.928 -2.09067,2.04802 -3.75467,4.48002 -4.992,7.296 -1.19467,2.81601 -1.792,5.82401 -1.792,9.02401 m 9.664,1.216 c -10e-6,-0.384 0.0427,-0.768 0.128,-1.152 0.0853,-0.384 0.17066,-0.768 0.256,-1.152 0.68266,-2.2187 1.55732,-4.0107 2.624,-5.376 1.10932,-1.40799 2.83732,-2.45332 5.184,-3.13601 0.51198,-0.12798 1.02398,-0.23465 1.536,-0.32 0.55465,-0.0853 1.06665,-0.21331 1.536,-0.384 l 3.136,0 c -2e-5,2e-5 0.14931,0.0427 0.448,0.128 0.34131,0.0853 0.72531,0.19202 1.152,0.32 0.42664,0.0854 0.85331,0.19202 1.28,0.32 0.46931,0.0853 0.85331,0.17069 1.152,0.256 0.4693,0.12802 0.89597,0.32002 1.28,0.576 0.38397,0.21335 0.74664,0.44802 1.088,0.704 1.15197,0.76802 2.15463,1.70671 3.008,2.81601 0.8533,1.1093 1.45063,2.3467 1.792,3.712 0.12796,0.4693 0.19196,0.96 0.192,1.472 -4e-5,0.4693 0.0426,0.9387 0.128,1.408 -4e-5,0.043 0.0213,0.192 0.064,0.448 0.0853,0.2133 0.12796,0.3413 0.128,0.384 l 0,0.256 0,0.384 c -4e-5,0.2133 -4e-5,0.4693 0,0.768 -4e-5,0.256 -0.0214,0.5333 -0.064,0.832 -4e-5,0.2987 -0.0214,0.5547 -0.064,0.768 -4e-5,0.2133 -4e-5,0.32 0,0.32 -0.12804,0.768 -0.46937,1.6213 -1.024,2.56 -0.51203,0.9387 -1.15203,1.856 -1.92,2.752 -0.72537,0.896 -1.5147,1.7067 -2.368,2.432 -0.8107,0.6827 -1.5787,1.1733 -2.304,1.472 -0.21336,0.085 -0.51203,0.1707 -0.896,0.256 -0.38403,0.128 -0.68269,0.2133 -0.896,0.256 -0.21336,0.043 -0.49069,0.064 -0.832,0.064 -0.29869,0 -0.57602,0.043 -0.832,0.128 l -3.648,0 c -0.38402,-0.1707 -0.78935,-0.2133 -1.216,-0.128 -0.42669,0.085 -0.85335,0.043 -1.28,-0.128 -1.57868,-0.7253 -3.07202,-1.6 -4.48,-2.624 -1.36535,-1.024 -2.34668,-2.368 -2.944,-4.032 -0.12801,-0.3413 -0.21334,-0.6613 -0.256,-0.96 -0.0427,-0.2987 -0.10668,-0.5973 -0.192,-0.896 -1e-5,-0.043 -0.0213,-0.1493 -0.064,-0.32 -0.0427,-0.2133 -0.10668,-0.4267 -0.192,-0.64 -0.0427,-0.2133 -0.10668,-0.4053 -0.192,-0.576 -0.0427,-0.1707 -0.064,-0.2773 -0.064,-0.32 -1e-5,-0.085 -0.0213,-0.192 -0.064,-0.32 -10e-6,-0.128 -10e-6,-0.2133 0,-0.256 -0.0853,-0.384 -0.17068,-0.8747 -0.256,-1.472 -0.0427,-0.64 -0.064,-1.1733 -0.064,-1.6 m 8.832,0.832 0,2.688 c -2e-5,0.043 0.064,0.256 0.192,0.64 0.12798,0.3413 0.23465,0.6187 0.32,0.832 0.0853,0.256 0.25598,0.5333 0.512,0.832 0.25598,0.2987 0.53331,0.576 0.832,0.832 0.34131,0.256 0.68265,0.4693 1.024,0.64 0.38398,0.1707 0.72531,0.256 1.024,0.256 0.81064,0 1.51464,-0.2987 2.112,-0.896 0.59731,-0.64 1.08797,-1.3867 1.472,-2.24 0.38397,-0.8533 0.66131,-1.7493 0.832,-2.688 0.17064,-0.9387 0.25597,-1.7067 0.256,-2.304 -3e-5,-0.3413 -0.0214,-0.6827 -0.064,-1.024 -0.0427,-0.384 -0.17069,-0.7253 -0.384,-1.024 -0.0854,-0.085 -0.29869,-0.2987 -0.64,-0.64 -0.34136,-0.384 -0.57603,-0.6187 -0.704,-0.704 -0.0427,-0.043 -0.12803,-0.1067 -0.256,-0.192 -0.12802,-0.085 -0.23469,-0.128 -0.32,-0.128 l -3.648,0 c -0.0427,0 -0.14935,0.043 -0.32,0.128 -0.12802,0.085 -0.23469,0.1493 -0.32,0.192 -0.46935,0.3413 -0.83202,0.6613 -1.088,0.96 -0.25602,0.2987 -0.46935,0.704 -0.64,1.216 -0.12802,0.384 -0.23469,0.6827 -0.32,0.896 -0.0854,0.1707 -0.12802,0.4053 -0.128,0.704 -2e-5,0.2987 0.0853,0.64 0.256,1.024"
+         id="path6741"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 323.27281,1011.6303 c 0,3.072 0.59733,5.9733 1.792,8.704 1.152,2.7307 2.73066,5.0986 4.736,7.104 2.00533,2.0053 4.37332,3.584 7.104,4.736 2.73065,1.1946 5.63198,1.792 8.704,1.792 3.11464,0 6.01597,-0.5974 8.704,-1.792 2.73063,-1.152 5.09863,-2.7307 7.104,-4.736 2.04796,-2.0054 3.64796,-4.3733 4.8,-7.104 1.19462,-2.7307 1.79196,-5.632 1.792,-8.704 -4e-5,-3.1147 -0.59738,-6.016 -1.792,-8.704 -1.15204,-2.7307 -2.75204,-5.09866 -4.8,-7.10401 -2.00537,-2.04798 -4.37337,-3.64798 -7.104,-4.8 -2.73069,-1.19464 -5.63202,-1.79197 -8.704,-1.792 -3.07202,3e-5 -5.97335,0.59736 -8.704,1.792 -2.73068,1.15202 -5.09867,2.75202 -7.104,4.8 -2.00534,2.00535 -3.584,4.37331 -4.736,7.10401 -1.19467,2.7307 -1.792,5.632 -1.792,8.704 m 10.176,-1.536 c -0.21334,-0.64 -0.32001,-1.28 -0.32,-1.92 -10e-6,-0.2133 0.0213,-0.4053 0.064,-0.576 0.0427,-0.2133 0.064,-0.4267 0.064,-0.64 l 0,-0.384 c -0.0853,-0.64 -0.19201,-1.3227 -0.32,-2.048 -0.0853,-0.768 -0.12801,-1.472 -0.128,-2.112 -10e-6,-0.64 0.10666,-1.2587 0.32,-1.856 0.21332,-0.63999 0.51199,-1.19466 0.896,-1.66401 0.38399,-0.51198 0.85332,-0.91731 1.408,-1.216 0.55465,-0.34131 1.17332,-0.51198 1.856,-0.512 0.72532,2e-5 1.40799,0.12802 2.048,0.384 0.63998,0.25602 1.08798,0.74669 1.344,1.472 0.12798,0.29868 0.21332,0.59735 0.256,0.896 0.0853,0.29871 0.17065,0.61871 0.256,0.96001 0.17065,0.384 0.34132,0.768 0.512,1.152 0.17065,0.3413 0.25598,0.7253 0.256,1.152 -2e-5,0.5973 -0.064,1.1733 -0.192,1.728 -0.0853,0.5547 -0.12802,1.1307 -0.128,1.728 -2e-5,0.4267 0.0213,0.8533 0.064,1.28 0.0853,0.4267 0.17065,0.8533 0.256,1.28 0.0853,0.7253 0.17065,1.4933 0.256,2.304 0.12798,0.8107 0.55465,1.4507 1.28,1.92 0.12798,0.085 0.31998,0.192 0.576,0.32 0.25598,0.128 0.40531,0.192 0.448,0.192 l 1.536,0 c 0.0426,0 0.12798,-0.021 0.256,-0.064 0.17064,-0.085 0.29864,-0.1707 0.384,-0.256 0.21331,-0.128 0.42664,-0.2773 0.64,-0.448 0.25598,-0.1707 0.46931,-0.3627 0.64,-0.576 -2e-5,0 0.0213,-0.064 0.064,-0.192 0.0426,-0.128 0.0853,-0.2347 0.128,-0.32 0.0426,-0.085 0.0853,-0.2347 0.128,-0.448 0.0426,-0.2133 0.064,-0.3413 0.064,-0.384 -2e-5,-0.043 -2e-5,-0.1707 0,-0.384 -2e-5,-0.256 -2e-5,-0.512 0,-0.768 0.0426,-0.2987 0.064,-0.5547 0.064,-0.768 0.0426,-0.2133 0.064,-0.3627 0.064,-0.448 -2e-5,-0.085 0.0426,-0.32 0.128,-0.704 0.0853,-0.4267 0.14931,-0.6827 0.192,-0.768 0.0853,-0.384 0.12797,-0.768 0.128,-1.152 -3e-5,-0.4267 0.0426,-0.832 0.128,-1.216 0.0853,-0.3413 0.17064,-0.6827 0.256,-1.024 0.12797,-0.3413 0.19197,-0.6827 0.192,-1.024 -3e-5,-0.2987 -0.0427,-0.5547 -0.128,-0.768 -0.0854,-0.256 -0.12803,-0.5547 -0.128,-0.896 -3e-5,-0.4267 0.0853,-0.8747 0.256,-1.34401 0.17064,-0.51198 0.40531,-0.95998 0.704,-1.344 0.29864,-0.42665 0.63997,-0.76798 1.024,-1.024 0.42664,-0.25598 0.89597,-0.38398 1.408,-0.384 0.51197,2e-5 1.0453,0.10669 1.6,0.32 0.55464,0.21335 1.06664,0.51202 1.536,0.896 0.51197,0.38402 0.9173,0.83202 1.216,1.344 0.3413,0.46931 0.51197,0.98131 0.512,1.53601 l 0,3.904 -0.32,1.152 0,3.328 c 0.0853,0.384 0.19197,0.8107 0.32,1.28 0.12797,0.4693 0.19197,0.896 0.192,1.28 -3e-5,0.1707 -0.0214,0.32 -0.064,0.448 -0.0427,0.128 -0.064,0.2773 -0.064,0.448 -3e-5,0.128 -3e-5,0.2347 0,0.32 0.0426,0.085 0.0853,0.2133 0.128,0.384 l 0,3.072 c -0.0854,0.3413 -0.1707,0.6827 -0.256,1.024 -0.0427,0.2987 -0.12803,0.6187 -0.256,0.96 -0.2987,0.768 -0.78937,1.408 -1.472,1.92 -0.64003,0.4693 -1.3867,0.704 -2.24,0.704 l -0.256,0 -2.176,-0.64 -4.352,0 c -0.76802,0.3413 -1.55735,0.64 -2.368,0.896 -0.81069,0.256 -1.64269,0.4693 -2.496,0.64 l -0.256,0 c -0.59735,0 -1.19468,-0.1493 -1.792,-0.448 -0.55468,-0.256 -1.08801,-0.512 -1.6,-0.768 -0.46935,-0.256 -0.96001,-0.64 -1.472,-1.152 -0.51201,-0.512 -1.00268,-1.088 -1.472,-1.728 -0.42668,-0.64 -0.81068,-1.28 -1.152,-1.92 -0.34134,-0.64 -0.53334,-1.216 -0.576,-1.728 l 0,-1.6 c -10e-6,-0.128 -10e-6,-0.32 0,-0.576 -10e-6,-0.2987 -0.0213,-0.5973 -0.064,-0.896 -10e-6,-0.3413 -10e-6,-0.64 0,-0.896 -10e-6,-0.2987 -10e-6,-0.512 0,-0.64"
+         id="path6743"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 364.78181,1008.6223 c 0,2.9013 0.55467,5.6533 1.664,8.256 1.06666,2.56 2.53866,4.8 4.416,6.72 1.91999,1.92 4.15999,3.4346 6.72,4.544 2.55998,1.1093 5.31198,1.664 8.256,1.664 2.90131,0 5.63197,-0.5547 8.192,-1.664 2.60263,-1.0667 4.86397,-2.56 6.784,-4.48 1.91996,-1.8773 3.43463,-4.096 4.544,-6.656 1.15196,-2.56 1.72796,-5.312 1.728,-8.256 -4e-5,-2.9013 -0.55471,-5.632 -1.664,-8.192 -1.06671,-2.60266 -2.56004,-4.86399 -4.48,-6.78401 -1.92003,-1.91997 -4.16003,-3.43464 -6.72,-4.544 -2.56003,-1.15197 -5.31202,-1.72797 -8.256,-1.728 -2.90135,3e-5 -5.65335,0.5547 -8.256,1.664 -2.56001,1.06669 -4.80001,2.56003 -6.72,4.48 -1.92,1.92002 -3.43467,4.16002 -4.544,6.72001 -1.10933,2.56 -1.664,5.312 -1.664,8.256 m 9.664,8.32 c -10e-6,-0.5973 0.19199,-1.1093 0.576,-1.536 0.42666,-0.4267 0.89599,-0.7467 1.408,-0.96 l 0.64,0 c 0.59732,0 1.17332,0.064 1.728,0.192 0.59732,0.128 1.19465,0.2987 1.792,0.512 l 3.2,0 c 0.17065,0 0.29865,-0.085 0.384,-0.256 0.0853,-0.1707 0.12798,-0.32 0.128,-0.448 -2e-5,-0.384 -0.17069,-0.6187 -0.512,-0.704 -0.21335,-0.085 -0.51202,-0.192 -0.896,-0.32 -0.38402,-0.128 -0.59735,-0.2133 -0.64,-0.256 -0.29868,-0.043 -0.59735,-0.043 -0.896,0 -0.25602,0 -0.51202,-0.064 -0.768,-0.192 -0.17068,-0.085 -0.49068,-0.2347 -0.96,-0.448 -0.46935,-0.2133 -0.78935,-0.3627 -0.96,-0.448 -0.42668,-0.256 -0.89601,-0.64 -1.408,-1.152 -0.51201,-0.5547 -1.00268,-1.152 -1.472,-1.792 -0.42668,-0.6827 -0.78934,-1.3653 -1.088,-2.048 -0.29868,-0.6827 -0.44801,-1.28 -0.448,-1.792 -10e-6,-0.5547 0.0427,-1.088 0.128,-1.6 0.12799,-0.5547 0.27732,-1.088 0.448,-1.6 0.34132,-0.9813 0.76799,-1.7707 1.28,-2.36801 0.51199,-0.63998 1.08799,-1.15198 1.728,-1.536 0.63999,-0.38398 1.36532,-0.68265 2.176,-0.896 0.81065,-0.25598 1.68532,-0.46931 2.624,-0.64 0.0853,2e-5 0.29865,-0.0426 0.64,-0.128 0.34131,-0.0853 0.55465,-0.12798 0.64,-0.128 -2e-5,-0.0426 0.0853,-0.064 0.256,-0.064 0.21331,2e-5 0.40531,0.0427 0.576,0.128 0.21331,0.0853 0.42665,0.12802 0.64,0.128 0.21331,2e-5 0.36265,2e-5 0.448,0 0.12798,-0.0426 0.29865,-0.10665 0.512,-0.192 l 4.096,0 c 0.25597,0.0854 0.51197,0.12802 0.768,0.128 0.29864,2e-5 0.59731,0.0427 0.896,0.128 0.29864,0.12802 0.63997,0.34135 1.024,0.64 0.42664,0.25602 0.81064,0.57602 1.152,0.96 0.38397,0.38402 0.70397,0.78935 0.96,1.216 0.25597,0.42668 0.38397,0.83201 0.384,1.21601 -3e-5,0.3413 -0.14936,0.7467 -0.448,1.216 -0.25603,0.4267 -0.57603,0.832 -0.96,1.216 -0.38403,0.384 -0.8107,0.704 -1.28,0.96 -0.42669,0.256 -0.83203,0.384 -1.216,0.384 -0.29869,0 -0.59736,0 -0.896,0 -0.25603,-0.043 -0.53336,-0.1067 -0.832,-0.192 -0.42669,-0.1707 -0.87469,-0.3627 -1.344,-0.576 -0.46936,-0.256 -0.93869,-0.384 -1.408,-0.384 -0.59736,0 -0.89602,0.256 -0.896,0.768 -2e-5,0.512 0.27731,0.8107 0.832,0.896 0.81064,0 1.66398,0.064 2.56,0.192 0.93864,0.085 1.72797,0.448 2.368,1.088 -3e-5,0 0.064,0.085 0.192,0.256 0.12797,0.128 0.19197,0.2133 0.192,0.256 0.29864,0.3413 0.59731,0.6187 0.896,0.832 0.29864,0.2133 0.61864,0.448 0.96,0.704 0.29864,0.2133 0.51197,0.4907 0.64,0.832 0.0426,0.128 0.10664,0.32 0.192,0.576 0.0853,0.256 0.17064,0.5333 0.256,0.832 0.12797,0.2987 0.23464,0.576 0.32,0.832 0.0853,0.256 0.1493,0.448 0.192,0.576 l 0,0.832 c -3e-5,1.3227 -0.38403,2.496 -1.152,3.52 -0.72536,0.9813 -1.49336,1.9413 -2.304,2.88 -3e-5,0.043 -0.0214,0.085 -0.064,0.128 -3e-5,0 -3e-5,0 0,0 -0.55469,0.4693 -1.08803,0.832 -1.6,1.088 -0.46936,0.256 -0.93869,0.4693 -1.408,0.64 -0.46936,0.1707 -0.98136,0.32 -1.536,0.448 -0.51202,0.128 -1.08802,0.2987 -1.728,0.512 l -2.496,0 c -0.46935,-0.1707 -0.98135,-0.2987 -1.536,-0.384 -0.51202,-0.043 -1.02402,-0.1067 -1.536,-0.192 -0.0854,-0.043 -0.38402,-0.128 -0.896,-0.256 -0.51201,-0.1707 -0.81068,-0.2773 -0.896,-0.32 -0.0854,0 -0.27735,0 -0.576,0 -0.29868,-0.043 -0.49068,-0.064 -0.576,-0.064 -0.38401,-0.043 -0.76801,-0.192 -1.152,-0.448 -0.38401,-0.2987 -0.72534,-0.64 -1.024,-1.024 -0.29868,-0.384 -0.55468,-0.768 -0.768,-1.152 -0.17068,-0.4267 -0.25601,-0.832 -0.256,-1.216"
+         id="path6745"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>
diff --git a/images/album.png b/images/album.png
new file mode 100644
index 0000000000000000000000000000000000000000..a47bc7d7335d00e077a7bc0ad315f0fb235cb30a
GIT binary patch
literal 5418
zcmV+_71ipAP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00001b5ch_0Itp)
z=>Px}<Vi$9RCwC$n|qL4)qUqb=bZcK$Gp0yhtUHGG%^SwVM$0B at ERLoJBrzmbzH`a
z?T~WTcFa13YqPbrRlDUXw}mk##&(QTwdJkatSei=vE#%c#x{{LU;%QFECmT99 at Yai
z8qNFF-80>N?>*<Yf848KB)|z?2}3QX>eQX-$L;g`{@&kTH at vytTyL&7*PH9j_5bZs
zueSr;d`tg%kyRHcZ7)!$mA+ at zinzX3=zsWczILK{wm;8%Erq-BMvUoOwoE1Q1t at i)
zF?zM}SckAmM3yJ9^!Z`VEh+cfa=GmHluBNASD8m1-5IrJX8VBSuWJB4_OYIx$n#dC
z)c}eCQTk%flZ!wtbqUKr{J at uHxxb=%%jK|KE(hIRCAzyx6pJMa`EIn*wBuRYagBB~
zOSx+`dv^aKL66yUp_H=*z|DW$|9F(R&AzAS%avZ+TkiErJ*7fVPmk{EEYZ=?Lr1X(
ztv$aLP0@~Ki83J@(FjwGS>j|4C#TEVSy+Y>QK3`rbq#=ZT=vONeA09jdOM8{GcC>%
zMK#*-7?ZWboSd8?ie_IT<f)~VAs<%A1wDjeiCj>^=nxT6*6G(b0015Nex7^bJG7!1
zKwj~6f!|3O^rV6YCGtTT&+9>Ko_cMD$?3^tv_9$HcE#!-u`L8gV&4D&07OXx5JJC;
zAm}FayUB%R@?kHb-;L1)YK>{8XT}*nInx at OI1!DF?)7J8$HltVVJouFS=p!1cWvHu
zIZA<8r}72!#sFaDlC5+WSD;nM?Cc~nvr`-&nslRM$J%4#<6eDkswK3a!O6ZjaX*(>
zo(huW$hW>VGqd<UANh~{cb>}Bf+#&VXWtM26moq$@YDO|4n6&h(S{*~9Ec*fTPY5Z
zcn9zKU&AlFx=Kaitf;v24dMcz7#o`<5!U|opN~BM|9&?ON{H;aaRGhy#aD=kLTh{0
z?&m}ihV~5s07 at eQ*0tSPLKG)fHIm#L$O4 at EwF{SOwW_Pt>cER<Q;49q^nBpzYPDK<
z{l@^MaJW}hxNP6P{R+?XJ`e=KP3`vl%3`tL^qA+J0 at R793olr`V`5 at Tf9Z}dCSjP{
zU#r*u(irpipZ)A-hhA3zC_qI1#lq$8yYCKbwc5u$&$~UJ&v&d at v&LJttU{?&LMyHJ
z-Ff!{ponn&`>ywmF+}aiOixe0ZFqR(iv0%;{MpyO`qgJ=Yqd{TtJR&an=F9HD;6#y
zqHeqGwvRU&jjs<34CL3YU8_o^676=KBuSW at m`ZC%k%cVa#8I!+QA*?cK9x!zE6!i3
z-gd>?ypfTSb&u`Z_25^&@|EZ7_4)^^)#?+!c^42=;u`K{{Cnk{ciwq_UtiyvtFF3A
z7mG#e^*W=YgD9o4l&8_koPJ9I=LD^UIEvBQ04<C$^e<V$2S4~hb7F9C^#c$7bkALP
z-SroZM&s6MwHp1#f*@igKEnk*|M|~v4T9j=jT<+vz3#f}bR5SF4Gqz3&SI^_S;2{5
zlXRbEQChIpVV%o>&>-NfBWg#)QOvUC%endYZ}!%_<t?A+C={Ol!WX`<{5O*ZQCLBB
zCNH|c9e3RE(OfR~lk2X#F1K{)QU(VHnVp?QsTk)R&Ppnrb%+B&EwoaCLW at S6ATEPA
zOSPxAb3zg)09^a7YxTRXdFMbF1P5=s?Y7mwAqx-{$0-1}-+uc|zVCl)+qP{c2m*$N
zhKS=BrDH@=p`1u2V73=ofC8LKg>=?|fH+B;&BYs)T0|VPX3ZL||Lx!I4ujyItJUht
z*VqEma~qSl+qZAO+V}mx+_r6-Cn8KvPNKEOcoxY7I;Htk`;uz)C7{ZJwv9FmKp|<y
zkqki6s*yNJSg~RS+ur-0&SIhP_?N%@<>G5t34%DQ`ueW#@jP$Gwbx$j8)K-|Y8YcM
z#+)i|af`I+oM5fsT=v*P)<}hPiNhrhqdgF{U^xpGk)>ayQl2-769xuWv*E4lml&hJ
z_nM|baj4$PivP2I-DMqpeSM6KjG(nfM9?~+*=jL7c7*ZC=a{JvlGqkDX at i1XSfZHg
z#U;^cZeX2&QJ at VDg+gIOrO&Dq3?mAWv~*BPVXfuLE3f4EiNW_)tJUABR;%~D28EEq
zAu8~Lts6FMc+u>Qp&d=~_!Hmd*`qt at t5g^mxR6yBuOyc%;`?D%Kne4WS<YMWc8p1n
zCraTg_`Zj;sV}68R)|goS59!GkDH9`7fIdhns>az{KF4^cu%!jT~e)9=YMSgZoH*;
zxv}Otja;lewL+m{2P0y60m<Act=!brSHIoV>vh`gHr85Bj_v114}FEpH*MtBZU2pq
zVlVT}Q5wx*=35gq+s8<36Rixzo*sJ7TShCIBn<k&2@{jkR4TpX!#v_Cv{qncAtR_%
z?OA#hL^+~3!il9+DlxF?!s64<Jojnfu2%)XO}8w$&{Ou4O6foJf}rdCW&O5NsT7OF
zoN>+)$HL^qbaP~ML{k4#2tuh;Vrps%Yb~?&F at E&mpYov_Kg^2dm(pyFQ=2<ZlFVn!
z at HEZ#1g-YeX`kKGxten47L+n1u|-5vZ_E>f0r^}Gj6$V}0bi%FKxv5DZNyoWQD_a;
zS~hHat3G_>NcEfF{N~p`^{G$A{~`b%y|vt>t^ZZvBbzs0Vb))|DX5fJ5=FDjN0Y>H
zW8t;_x=Zu<pci92oLH1VtyWvm{=TQa!&O&aL2tR2!QqDpf-Z~>h?6;5(F{>sBZ}*%
z6Rd at 0tmxm$kMI9J=lA~`Qo}ZgXrjnsU6Vo~pB2jr>x3wdh~qX|D?Cr9F at Y3-uC6YY
zE$z=8IeL5>aNn;4;O0;CuM(?vu3x{lZ|gh%UFdrObFERvr}t+Aiy4~jN!rnAG#<X!
z!KDL#fE7!<UMG&zLT7yHFq^O3%Fx(jw4y0IQv?KSTSQ6YG~sh$ne$2;=q#+_ClB7o
z<b>mzjUUDj^H@<h2L>P!=I2`!iv=9Q{QNvlEXGT#L~9+Wv}!a)W36S)B^R6ViRu6R
zD*^bUKf-Ss9(?CDS1sGJ={<V3ehjTW3b}ra4$w^x=OUuG_7dRw%Nsd4e3b6aKAO!Y
z)>=d&%3Z5DaNtSaz4f=4n0b=M{7GUvkGKTS<j98=iuomU7FS?Y2haWT0K0bmPnP#@
z;_{1bqTLiK<s!b9BXJ2XD}E$#jE;{J1_8!^@ibx`X`<C&B~21qp`Ea7*)pQ2^^Wg;
z_q*mpANr7eSpepwe_L<4t8)2<cj==;KO*Os2!rl4RoOPJXqskwl2$Z*n%0(9uEfSg
zesJGk^Y+XCc)|QdA}+q*ee5~(zxnoezRi}+o2XQ-ppY-3lp%^+v|CL^hEDQN#~$H@
z!NYWSTqNh0Z;S%Ee=;(8WJKewd;a({TUHIM^VeK-F|kc(&d)Pjn?{_Yr_ at cM5Fkq7
zDV1tor-hM9=_!<gAPDFwb*n>%4s8JTy(|ENbQcPFoLJ`OM``K_e6NU78fzn>q=B_9
z!l0YZ!V0=OR}ttw_CB#E-t&vc^@cUSZ at LOAXti31L}^v$G at CE^1k<(WIk^7-Gxfc+
zqB<fD&xH7XC&h3nOZu+n(v|OZ)6<P_|LymF_$N<1 at k9eifVf(%u6$we$%mtMvT9)U
z03+j*Xf0^1sL#z2<^r&80R&}T28IUZuvQQ}ddo}n$neDaR|G)ik{_HnG5Ti*p4?O1
zaM{hO*&3ytnY&hoAm}0tdJv~MdGZ)PKlsnBLkFL7lasCQo!|3&zqfMf#!ly4nuAZ3
zs|u7;lsX3}b-e|Jq1lXSw%Xtnf+iQje5=9a%*f6=?zsKdOz?$cRjbwG)oS(f6T^p2
zbe2lRT&}>}d;`x at wAwLIV(~F}3akR91m#jjS!snP?I?RnC2fpZ|B5l-uf8!=`@qMS
zZrQo>q5tvoU5{^FwQ3;l>MjIIYbD~S)uxlN(J4DMHI+*ed1`t(-f>`8{YS&YN%NLl
zf}1)zI!KZP;|b1rhy$CXThNHppi`D7 at HI+l6oy>RXJTr?9z6Kef90jEj%0ko%=Ycu
zw at -`@eraG}jjGSpNL;G%c9ftz15VIRkyub#Ksl5Js}$B*^7%Z4LUG_%W`Vy;hZi?o
zv#oO8%<O?{l~SujBorq)NvJn!$+1IEHV=&)kJ{Ni3}Cd at UT0?~Q52CRnj~=~3B+3P
z42Y<-(bWb|E0lJ4zQ*@8LEtknrR}}<-g_9ZXY7ULoO`$(O(bD%t*^4DtZ3S?#UvIy
zy<q;a70?>xELcq(8;tSLT2=lvg^+#ZA1B6uzg;BcnOBpUssXg;c~U48 at O;508k-1C
z9B~_>$RSQ;fmx;QfkSDHHX7d#P|6b^&hBZm>r1ArzNeMeb0~>X;y?^e5}XT35{K40
zEsz{&o5l$xvcMgP$iKQ9wAq28Y`3%B%64<nwVBW7lQ0bF?ChkYqe!7xq);f**;Sys
zr$ARvkzyfFkjrCqo;VJeZ}`ki`_yJTXt#3St+(E~BKxfP<%BoJY+bUXXrO@?wouBV
zlua#+1P4UckvPHGv<OP9BS}20b+n at h5t(>3y?|tzNET^bFS_ciVbi%>Zq67J=JO#*
zl4LGmu{L!Dn+QQ5SeJ$YS9e&eu~tAU%DqdB(v7bJzx8ql`QjJ9*xT3J^SR~A&r{9T
zJVv)b1SdH>EhtISBFGtH>p*L?K$18xf&laLP3Gq2j{Lga;9{RtivZAo%IEV(t!tKx
z#r{<I*pehE*^$_^)3Y``kY_?#ksw*XDilICZG0<_Jv#C3FW-6BU(7WdpRQJ`t;K|D
zrP90W^37}W#bQ9McAPK}+EIk3e6)7y(XtLXaR%drG%P3*>u>_Iv$M`Qckpbq!*XVj
za?U+4*O=SV^_DK;*b>JUy9kKbI-*E0+M<-Bqa#Md5Qe!lC?dS;nyvc4fqfqv9yxN;
zm%j9;4 at A-YkxHd>Z6WVpcG+dCO>eoI$;oj7Ut^ud;qW~{DZ7Xn0(2S#mC{J$;d?0o
zGd?lywATC22_KLo$^C~9AN?<zHf{2h))<opB4ZTdEY^WBf=eJ51T0-rq~2(zU7T2)
zO>6lpwro}-BTMu3`q&NVc`AJ!<njf=KruRc9Gg{kMnm915Gq9GQM!OjS!py1!NX>h
znTMj;Y|*IKt#j_la{@q5PtQLM4xW&9tBn_gparKjq6MV|qe1(Iz}F;+kT^w{6QWid
zm2tsNEaMZCw4)YXon at 5iz$Fp0Q`5w at fi@b?^AH7E3&oBQn<Q8?qHL;hB?uOrqMdjI
zewqP>M at 9$&v+J|}z3R>hC-|Aqe5URDxgQ)odMs^6w80pS)*3$u$mR2RzK>SvW9j#W
z0>UszE7mL}&Nt_X+b!yi8D^(vn3`x1CoxGBVdEC<XdY)HJYS>aRKb%V(n7E(vEVF8
zqS9G|btr9k{@BrEzR~#VIVDAFwc6Jnd+g_lWQ3(Lh9K}UMxzuNJ*H7grTJPb{2(Bo
z%VRu^a|zbQD3f(@o<=Lc1z=NRM2X-T1<vA#voPdPE=lVGmA1m^kimh{OwY_PJ3ZcB
zx^(G3o>Ks-)#{_Ic64;`_;Iw>Xmv_hg;ps;gH|aBn(Q%+=X)v3qZGMZ4lnRgTBYyx
z)21euFVWpuqL9xcl9skENi~dQGc-xSS>iaIDLQA-+Hm-}=bVzbx|j_*XLEsiz45Uf
zJARTl=Q5g5rDkt*T9sw2t*11~WK$reL8mjp?w%fc%M~hp70SJ3Dt&!)b#_xIcHsFr
zl**x12+pMG&5;E=QlZ5m&VmS@?=dqo!}P?7*(6E+{3V6exd7myhaNid?svauv+tWr
zmMvSJ4SF-eGUNKysqvSj<F9nCZfUn$=|D_7G=erM%c!&<sMOyjEj^t0IHz$=qwqj^
zpbc^C0XmC8K2Pl1leqTmzpqxSPrp`^A?o$|e|Y4P$7aUI#}=w4r4=S~1(h|0MyKwf
zP{dJ!HYtU!wLu$$N`pbh`sy at s=~Phd8MFyd%EOV;Wl>u#Op83v<GE*_5tY>L{oLn1
z_rsSvr#VORn};8MSk_!}$*z+pPkv<Gx^*V-gUn4&4Kgwc{ZtW!q8+smaT!{Ikg~iB
zLt?TNmoo1-Ns}iFq^L<*X{8B*94Cf`85=q>{Nwxn;dciI2Vc at zo(ljp5CVB1zkB!Y
z=?hn_Iy^EueElVttku3BEc%5)I>kXL6p%Pa9K{(XDVHZI10xd?4Web?eJJ(fG+8O)
zM4^-+4D*bRO>pAavyGqb`0 at K5ee}_Kb~f+Sy!BiFU^3xP+k5x!J#pT7{e#29C$C#`
z(ZxE<<x(rqYSCa<5yvr!lk9(42$Yb{`_j1&>0A(%R(!lDd=mR8?cw`5P7aMQc=WlM
zpYFK-#+^HNj<C=noVMJ#0Km^s_Oicyz~8 at r{|kje;i<`~$@lh_E2doOJ at acb#7UfW
zc3C<*bz+qbJ+(sAi(kcq%#E}rPCPt6#5u*`UmljRq2t5f`SxFZbno81qZ!8T6}FsB
z0M6_VPutHt^UTP^#Kev;7hE-X{CL*|D=$<*7-RxEoO2605=nz(Y7H*?<{2+4QXHZ*
zXpKl7-wzob9p~wT2kqF<@gIKU8+ZT7(9qEAqBj1O_F1)nQ%I{bh>QhZZ)9Yo{<EL`
z?EA%z;>6I&6I&X!hAEfJDhyA#1qi3|c at _s21xq0-sEmj4Jd(s`bZmly2cEQ}LxU$C
zdSJ(Yy62vI{w9i|<{|<oTC^9FI|AqKM^gp}vhAO-J;3Yj?Jd6l{qO(XHES;UR6gHX
zT65`oQ>paPQ!0bfM2RD at 7I6vICZH^cr8z&x<n$!NCnx3PiRT?jbZFn+U)+7~z4z`u
zMWHXcp1Ip+vP|dtS7T~XY*-v0PU97CxZ#HNmtMO5-}d$O{my(V>dzMnuB)qz@;qgo
zD3nOMIVX+Uj7D4nJUe{i`1kkh*>nHy-Mh!m;1JK;(c-B8atC~^mtI7zd5hwN0aUSA
zG~2dqTiM&&yK=FMI_H{4jvV>r!w)|^`7(jcE&{>wtA4KXIso9+TF~NHa at N=X1+4NT
UP7q7Xf&c&j07*qoM6N<$f at _h^X8-^I

literal 0
HcmV?d00001

diff --git a/images/appearance.png b/images/appearance.png
new file mode 100644
index 0000000000000000000000000000000000000000..f73239a5dd1a60cf435abf193020776e80b9af1b
GIT binary patch
literal 2721
zcmV;S3SRYzP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000VTNkl<ZXx{Bv
zS!`U at 8UD_>=PomM7RSywF^NqUvSA>Q&4d7nsge?)tg>hV>cT^o2S9x&Bq^dsY*|#K
zQa~i?163tb)rf}%C`v^^G!R8JA%x(96Pw_Ur?w~KWjxDW&eDg>Oec=*5M{xYIMT0s
z=gd9#e&4^Ig<u at Fb=T_)m`3gv9Dmw*z-t}p89H9UuWvB!GIj04mDklh!F2kM<`rNg
zJ;%l)_zg?VA5x0fA6Q at ovtkHRN#lzc)c=JA)-N+}qZDthT at VPGjNt9h2Qy01hg(`8
z#yx at cHw2by3N3flTfqv8;DdJ0&wKdd)sLM&j5cQ65ZKtDFQkxrZ=Guf>n2cq-p$e0
z<NE~aL11L}88<Poewn_=A<++(Opn-;t2`V_Ww8GnFDnUoZ0E=B at v+8|?+SG7>g_Wv
z1CJ7=?iNzinpD9u2y&i+%PCBn_grG{mR$b!o4;=UbX*abe*4x3HI2SHZF+5>YSKhH
zbIJsCp3Ea;5hMpa_*@{99>QS%py=!F at d+VYJKlQysc{nnnyx)_{j!DjjSX{YI1<8w
z={5kMDx{y%Dggo^8&x%vwYn?kT1v?+<0^;=RM0eZ7~0t#Kw}I_!5B9L9&SKH7x at Y0
zeX@{axIFjwT~Y$;79!|V;{!^R1^|7zQ?==x!+lUnp}i*yCC`n;B}=0}TLFu>*54<G
z$-F6nEa~k at qNn{Zm~#>~&4DV8pb}6}P(+6Z18Eh3$0h-U_I;-W)-8liU2{)mkX&>B
zwE=5!{!P5xk;6}$R^a9vn-Gaaz!-z3X;4Z*DTRDKkFKsR?0DfNk=Cjo7&S&NMa(Xm
zX8bW?(p75~1Ok)*9eoPnIX7X$hK&e^!_ajdnx=tL3Q8$7O at nEgh{a-9vUmac;-fd_
z&7M8`wbs^Famfj6xZZprXwtR!UuOkvgW~u}i4WCH*z(j?Se69<P)dPw4$e7*5T$zn
zh(@C%7K>FMJ$f{D`0(L(E~yJ`yuo-v*T}m2t~Tw;07Y9;;6QpRmfdqNf<YUu>q65s
z5JJ$~+Y8V0&LBZ4#jIJg7-MW*Q&ZC;EiEnLl4PL`ORa}AN;chDZ`o6$8ro9=?J0qz
zti-H2^Wb?ND5W5T6pGi#HNo>dxUP$6H0m3MQFBSs=(=TABZYc#<!sZQ6QgKP33L<)
z5N5(O%|iZH;6lRZ5@|<ZAjdI~<H&obr&7*2s;jFxfXgqs3$4E)u#`%<XZb9{UQ(;$
zt0XUJ-{lI>1EP=H+Q<76m_Ka-CWKBE+1&^F(49)daU8gg1J84yD-MfEtXwo5!DzKE
zrK|(+(M2K9+}s at W5{DZ5Ti<`Zp%!-IOapC6fsT|!drBbfDufJVGg=^@75c=1tc$!S
zV7j6-|2eHXONF%Kqt|ip&$eDnjZ~PF(%Oq=0mHyl>xzcADrPRkOz%B(B#)Fde=@63
z9in{DkzFt%9;I|5mkN1LKxcf+7yy8woC|C61i~1bbx~qKDMfV4dfKu~XThRn_%w1m
z4u)<;M at k?*C@?8P)Sx2=IUy at 0U=u>YrG(=P<lIvNHR_ at Z>8u0Ov_L7Hbx|y^W5;uk
zn1SH!ci(xhRZ~-gy4pIt^EQy4l)`0V9|m%2KybBm*8!*Vp*bo at 34ss_c~63pQx;HT
zyg!|FU|A-VQgs*H0?+^E`Rj<LJv;yEYi-N2Kq*CEUmq%~YB2e#n~)*lEa&9Tod?`w
z0HBB#)HDJv6&#Nv>k4FDF_r<4$+<8M9YSH!1+~DoZQH_BslUvgJvX>`@e*V*8SLM`
zAMtn`jA at E!46&s at e)q|zU)=Y<sWY`If(#8aqo}L0U@!to6y{Eh!gT}ieGi-qq_cVS
z4>{;g4WTWbLf-LV1j0sBQ&Xs=r6qGg2v8lb#j2{SRxEEMLI at l`ejJHJ0;Xx;>l5uc
z`10pwXi6#VH8nM9+!<o^Q$x5Srb8(ODJ3}PaG4IzQ{bFH2!ZOb20qaOuMMH`su(6z
zO~jY`E8I+fZ!Lg-oi~B)zuCIcG>nzEt-d2*7zRH3>@y at 12?)tm=ht6nxls3Q-u%Sg
z(=(M}8;0Qnr&d at +0%|P(DNfpmLd~R!s`Es9-FXw(zWv#2p|InQ+wQU}Dk^Z~$PsjP
zbzv|)!21VM1H$)i*}Un=&(8p%Y2jcn$jb>7N#yf+B$G*ao(EmmVcYg;V}0L8RaF%u
zgw&l^3~bxBEljA|bIUC&gLQRvXl-ppXJ;ppCwuZkLxca8f;Mj2^kibBu~N!VFc=hN
z=@(K;bar;4tE=lYOHfJ?i^X6VMrk at xSy^dPN-sYz0#sMK=FPq`HvgLW<k+!eXzyr8
zyz85+=ewU|GwzR?o0~JEjpdw&ZQDN0UlNG~lF1}=T_0Xs(AU?8Xfz64*TFeQG#Vw0
zu{q~VVAZNs3r*9UHnr}udL?mBW8)9Zcs!1;zWNd;PPAva;CoFyxTd*zlRM`6m9bDT
z7%XXeXlMxi{r#{ktK?3_|BCmyTn?d72%K|-!(k9YW_)V`4Gj&GDk>`e9E-(nuB at y?
zZ*MPpyFcNSyzI`HKGQtjaV#sP{N3Zf+`NSla at I%`LWFJGCIxpwGMR*Fny1A=Igw(Y
z<2ay{!nSQlDW`m^LRMd2U#aW*`<kZRynOj`tX{nuH8nMmQnJ78eNSus@~DtX{$kT(
zTQ+|i at P!t#ZJR2kFf=p-#uzNif at zvC45M__bsf5{gE0oi7$~LieIKT2f)G+wzN5%S
z0dEjO-jGtxi$<g9=;#3F9H~?azVE|zUAFJTk2b&i?%v%1LWP+?QDoUwmi2=W5)K3c
z8UVPi3(K+~gn*Q?Bti%%rOxOt{ud61`I<Frs(0_+-BTn$3s<cusZ{EPXf)bbQ&WQ}
zQ>Nh1p+h)w<Oq~fa9tO!>mnYHp9D}<HjNnxyaXT$B7NVlv~64CoR=2zLWq(`DM2ZP
zloEuH66j$I8$Xpw)dA=!ZtjN52r$dCHiSZ<U)R>wV#bUaNF)*<gp{^CeBVbtpLg5Z
z+EzM_lO3k{;h<H~+-ujaeN at x5jY5d?-bi4K`Icopw`<p~W>zRFtROc#j`OQXB!X-<
zi-QLb!Zgj2wu-w4>2!LJ<2V)ovj9>6;AK~gP{h`6- at aWd7O0Veb*$gzec5bQ- at 0|{
zCIHW{G7Z)P*a?88QYqweIaroes*IFUD5a$1IB#`#cke2I9qu|sw<P7-2S9`ntU&&(
zV8;Sqyca?k01O7eD`;{ZfKLk_BbiKw_`VNa*B!>#f25QhuIui1T{khpxk8adF|(0^
zOOoPmP1ATh9 at iOTV}dQF*x}C%pH@&xJphye$O3QxJXrWxF_@|Ay3}=DS_X=aaxhY!
zh1jt75CEFvIKO}8l~;bElseZKI3q<9LIkDsB>;k)<@kw|fgdiT5l}@1l#yU%qLnMD
z?ES;7S)L5a<Etn>0RLhiF%?}&9|l?*K{3OXF;Z45C!@ZrGcqzv^K=wz$`KO8_wD<3
bq1%4}<Nc)}8e<j*00000NkvXXu0mjfezg0a

literal 0
HcmV?d00001

diff --git a/images/audacious.ico b/images/audacious.ico
new file mode 100644
index 0000000000000000000000000000000000000000..f09461061ac6018cd0b77969b8555e2605a5ed17
GIT binary patch
literal 15086
zcmdU0XKYo;6~4v+Q$n##i$U1bcv+$>KPaLZ5TX|eo0wu+0L4*$gb+X|M2P``WDGVY
z>=F>H2)&E$wP}_TB22FaQY0t85^b{DWK(t%Hk0qWeseQ--psw%&xQ>noi{UQ=9HN`
z?VOqCI7v>j)1iZdILj&glH&|^949NQK7SPW_knxoomjrF<Bad*IN7L!B2d)h5k(CH
zP_Yc~6!6a&JV9Iv=nt at k7AV*OcnJ^|U|Bh!IY14}R{})y=FP>NIdjCRQ>Vn^$B$h&
zapHu?&(C+uSO-u6K&!p54Jpy3OBZqG%o*|G#S0^xK7Cqr?%Y}GRuZFr8}Z8)En0}P
zXU}?c4<9}hPoF;Z@{%X{vo2`<4PZC3U&O+N3%$CVH*Xd#TecJ(J9ZRPr%n|;dh`%8
zXU_D>7c5wy>QGC1wwE%VJ$oivw{Gp0Q&;j}dEdT$J$m*BaR7dozcKyb!2`FvwzgKJ
zr>DE+W5$dT!-o%d)0vr>9{v6M_a*&bLHh~miIZ(ScI=qw*|Vo;)~uPV=eAjv- at A8D
z;z{r7fAr{4kN)=U+v3onLt^{(?QTDifB*jdy>iwi4)7T86Q<|Ro$Hlv-MUqlyKzcN
zirBVon^(^95u at jK{~F+P{rmA-Q~r(}JH*YKH$7T at KaMfba4gF4ybI}uj-PiyBLl~N
z6~H%s*$)K6`27HNNu!3w%paAHoWC3!AI5<FY at ENJW;#w?isMu#J5EtjJ*dpov at B;`
z(vX%DAPX=W!1bvK0++4%fS&<w0sa8sw<0iI1K0;B0JH}*Rrm at R?E!GjljAEaX5IGz
z=!t{_zxxjX?mR>sCeu_-J$?+(*HxebLmEmi157*<!Ep|x21@*2A;;<O0C94-?#-Jw
zPwd^hS6sb%)!PTIT)E=nIRE9kXrQkHj%#{QNJrss06y8Nsi|V+%9Y~LqetF)A=f-T
z=KjFCq|x~x|7!qcm;%3dHNZzVVZsD&4cBD_<+<*UA3xs5E5`d8V$*nV_bXNY;>C-_
z^XJb)+icT=wA}wxp0RW>Vl{jf8Sa~2UG7iZvuwPh;>knqbqfE_knRnTVJ{M%Y>u<L
zckdcyvrQK-UKBTO+%T4#^tyBBj_A~>lgB?MYj;d|8^pdjzHZ$*Bk%qD_lxe`ySse2
zS52EXO_Y|FiamSwh#50xh^}3`iir~^ikh05IQpWZB3(ZB=+=O_0Iw_~Bg5G5J9qB%
z?fWW?p61y`?+1Pd^498p19`5k9)AA(`Ej)5#dCsMFDN~D at L(ekt{ocPPm$-o;o-Tq
z=(=-GCnY6$by%NgAfDHzPoM6?vy5_d9?bJQsj`s%C4hUehp(!tilbG|WnR4w9XhyY
zLQ@&n43qrI%1VzuCi9Po|E0>8=S7{KJk@$k_v+P4 at cgLb2M!!)lyA`WQ_ylQdOXzg
zrm6$y<A4DJym~5)p61+8X=U0XKeYcPJ;y;|VWG&*&KAkZ$yQx>&XzQ4%x|md%KpEj
z;!NXD<ss9Y<GXh4a_78C&-BotLyhtc<BwzCH~%=Mr3^jZy?eK7Z!KTG+}-1rEnDWD
z<5eBlM>;L at ihU#df%DI|{?Jylt@|uf<(Sg63975B<K)w3Q*1oRhwBf|mA<px#*G`}
z=&AqGrAsB9F(&^52M!o%H*DCT)BFQ+<vG>2|8TD`?LXXmxDKyau|h0bv`CB^HA;*e
zInuR@%gV~clP6D%vbp~l&PDG*z6^2u at 8rpo8@2b#?@yg4O`4>)owg~@)oOU1=Z_7l
z;8?mH;$H!Ly1s(**FDJKo^J|$fTS(s(}8Pjd3m|J-phWq#q<-fu4!Ec-`@ke0)oQV
zQOI at 4rvvlq`TNqPORoJ)8=7gZTOsFf%I4WVO5k{`1;pu)AddE;KHh)|3|~g+cEC$O
zqI&R5OJ77QK%(Jo5bg)~)+pqIbYflF$!`IgDwyo=kHDOeu>CDQZZAYpl0ahwIywgj
zg3OPxF4j3tO10x86N=zMkl=&_S&wmbjJ^)M$dkM&<3F&8U73)b?Z8J0SOjPyKLt2h
z18u)NKq;USz&XKlxcrt(6UVZxfLuTt;EN2j+Y14|0DKORx<-vj^K-zr031WFD`Y?r
z`_N}wAs<z5Q$6x30feogsFHAK2FeA1KLJcSGzE^lDTA__GI0Om{?-&aM&WT6vQ#_1
zF>RR+;=jB`-DUf*G&xfmqc~^_06seodCA`w(+20A$(Ai!1byM$zj;RExq)fkH<Xl=
zh`hW!(|Os)OOf#z((?d`gk>PI at pbXEwWds&A`Tur*q}2h+q7 at rKEX4bdS_vghi$?6
zW&;~A4fTC~E1ma<5hH}jrnjBnZ1{?b3fHdF`D=OVG8qshWTKLFjcL`Ym7vXH(<c!;
z#~J-lyaR)58+?ee9w7~&uk at jfM_O8%JGK+iF$xXmh{eAv+r%}{<YSf1`o2wf`gJZ`
zxX`5iZfX-{P?k*(;J+)C)#7f*yLXF-ee|@wj~_q&%5|6R;e8=x>UzZTJWHAOX`Ts;
zG&Z|m%6k>@`t|FLy2NxWMyv+h;5+mi#L)~JHY{?#U%!6cy#qab_;6$zTiZFO2Mrn&
zr%z1Bza#Dlkl{N>#MR~c9%YTZcI}!NJ$kfnEvK)sxVTu*$3Y$GJL29(ooEB|4uor`
zO at HF)7Y*>|@$4%@4H9ws)At_4pJnvhv~Alqj#l#H{=~i6;HMGo+O-pxFJBIn!Mgy-
zON(zH&(ImbJua at EdPi?+$GLOo<lBZgS`$AL&gR#b@{SxiV&hHwfi_USi7$Q7l7}tM
z&CRv(j*PeY)K!@lp9^Ksjw?6mUr<mGs6WSZ`}XZ4>uHif+}gEk1Ld$C%KHgjUKw~)
zn0Tx2FVwz}Y5J*6bP`8jHNQRmN2aka>+wt~dD>$AeTbw*d;#!VCGY7J^e%{U!u03;
zo788?k|iErUDm2qtGs%$z8>>DuG7Wx^h^HPRCeputw6rKvj|#u#*G{2p7~FnJSn)A
znq&~iv7zg$=V?D!=y|3y+9#&BR65^Hn>N|_M#hgFJ2q5*zALln57&|Zo=Vn>qCeXc
zFt=<neR!V7x!3A_qvq-VmwIV2?X!f&kK|9;t5>fM+9z$YT|D2eNnW-%VEoWdG0xxf
z=g)`oRps#w8^6VnAwxu)Hf;iRR{O9|pFW{-xR$6iN}BVxO38cm!q!h!cRkHB5AS{W
z-h?)fiND0re%9&re8Bq2wcogZ1>G0w{DbnQ`(>#+<27s6gz9g&-<N&D{fj;lnfGG8
z!3>*M)SLS-&k^kB-o1MZp0_0g?E9XaFuRC4bnDj5tFP%g2l?(A&a2Bel|g;WGQN4V
z(TCyt_3IbfNA%4E at X0_KgV8q_Wo+{98T1VXuA6*k8P-3%@3ipe-H{ANyPaqEFq at s<
zch;;~HW@}dZ5Z|Kv8 at eU0|We9-;>HCw%U(5IXR(y#5QofnLT^9;C^a)kHI^7zW<5(
zj)86BJvMYRfo?ytDeqe9ibU*puAzKCNRT$9t)ET!5c{2LrXJpO{|VdkBY^39xjv<^
zxnSzYhT<aluYRC+yppH?@R6+z{|ElV2hc6Zf5 at ir+LHIY#_#Y2`fsTd-w;Fz`KUzu
z-q;4>U$g%l*Te4pETYKa+o);PpJnp?BFxWXngiTd8*qQYJJv+PN)Q=+L%{pm#{Zk}
z%*V5$yg!ovXOQ<t^uN)sk(HI at qt$sSdCKPA+L-Vr-`~l0zsdKfvJEYfC<0j5CX_`T
z7q)uzfl~%$y{f=7EAI+E0oe3tD4x7Z0H%8hpkGNy1=lz6{f4PC(t*qalmhrhhHqs)
z(ttRY@!RDBn&kbA5Opc;BPD!sH-<-uFP{Z&@9CWt)p%^gxCrlv7(+0BxUlgbINVsA
z9Q-$mai-(&(x0zCWn9O6O8p-|@V8F)k05GX#PX#2L9fO{H)SXyGlQIJ;thJ$5f8m(
jJ7g@|Dcddk0bSzui`P%pv3{!q8x#uJuS~m8-|zngsu1%D

literal 0
HcmV?d00001

diff --git a/images/audacious.png b/images/audacious.png
new file mode 100644
index 0000000000000000000000000000000000000000..5de1b7f5da8c0124c6e95a485315aad53b363c01
GIT binary patch
literal 1788
zcmV<Y1_SwtP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00001b5ch_0Itp)
z=>Px*wn;=mRA}DSnrlpxR~W~CEjWWRl&VM(!K$oFsMXRroS at lg#A!n2<|QUBMEszc
zkz~YOl0h`_f}eDAV_RaPMs39lL^JwD7N at aBY$#Q<%a~}%<RVUF4vL_&un)dvTHi~t
zg>6rAzV!c`^ZuW6doHIcA|qPhZQw0H4@?Ip0I>q at 1MUM};1|FNoCDhV7i9vl38)1I
zUb58+V`xT_crx%6&=Usn;N}Cq1f~op at mGM)BTPKFbpxLPqasaS54eYscyMzAX^|qo
zT$q`G5pI71?<<j0Dc~D`Z-FSKfu>EH#=?aQ$;ik+r_-U;Y8g9rEC4+{J+!s8;q`iP
zxm-9L4w{>rLzz53uo2kzG6sAEd?z=0R8$m8mo8<^nl+eArjVC(U|;~3%Z1fyrMkMB
z{{DWYE*pXGhho4oph9luv$L})DJemx(}lG^Z{EDgjvYIwsi{#~i4TAuLNP!OxSnxB
z&q+*73?(HctXQ!kqPN8H<Hy;#b0?1;J(5!C2HpT}$Qdw7a4xgOMwmEpBK!93BRxHR
zSng?$$HRsV8|dihkW#q<WCDK$eozM~Y?dOg(P*&QY{Nz#z+f<7wOY|=BptH}_*iNM
zl7U}=F=E^1 at ZrN4jm8mi_4W1j<mczp*ViWo`vf1+PS7FU1}qTkv1Q8^EEda<Nc8sh
z(%#-qS63G*m5R}$M~B=uF)@+&_;}8rKQ9##L;+`>U4e<fZ(_4QfBt+99z3XcE!ypN
zYHDie?ChkYqXUn}!@$76piV+U0`un0W7)E0WMyTAWJrE~K2E1o4C(<=f%^di3W2YK
zwbW`gcDtP!GiJz=FD@>ova&Md88(?rY~Q|}w6rwED>g4LPs&de0%d_ioG+%4o0}_3
z9^k at -3qv9gaOKJsR<B--$K#RJn>lkPixw at Cf<Fx0LW#otD!PP9B6DxciqGexxVZSa
zZ8k&>ZvqKwAV&;MO-&^uBSVph#bROk^5w+E#W8j2RMOMa2iue>^5K0$Lj(2o^|Cr<
zvzg at NWT_}3CmNV16)LDyDn$dLqM|4*Ev2-yR1_~PETp=+TC%^}?PkuLInvRlO2vW&
z3n(uy7lSj^z-wYiD6=mm4<A0{%$YNkm6cIjTPv%3?b<cP at yuqkWS$ZY%#=DnLv=n?
zRaG=JG~n at g=<V$dsb6DbqoR%sm$Yc9ggPlHDdf<2|Ni~#*|P_~-#_HlYHe**E_rCR
zQc!#}Fjgw+3`MqW+s4tOM~5}E2qZ=#@~S$Vfh#I1!X}@YnHg4pwcwUTV;MPl{P;1u
zcI}eHb8~a4tgNJ>qCz%Xli42s#0@<?k~xAJ=oCZl+_|IZz<fTRB))j at VhjcYvu4eb
zyG24eYcgE^hz1&g7vcr4*Na}Sf9a(?apD9iDJk^z^>OOdDcQ(VNp9V`B?a9G81QZ|
zQdd{Uk|j$d2OTqJ3~_OBbai!!;!dZNl`B^&l6&yrfufGv?Upn^4O|jKE?&H-=z()`
za>Bl0TrQWQj>F-Qf-b88(X64VsfnvsugVU*ZrwUYjS8;{IBC)(#mM#c?c1U*2>3}Y
zq-LW2-fFeV*BkYE_U_$FY;3ITN@=xP;^X6Az{ZasPeDO}>^E#Sn-t^(?ggT?O~5x|
zAGh1>OrJho_9HDVEo|Mol}nc{4JIEZlZjQUR$;MN7&mSle!ripswz&NJV{$y8%Cp%
z&6_uql9D2Oc=Ph|q&)m4;M;%!6M)-dDP>kx76%R-2x&Xqy?Ym@(}`BAW$xU$VV{q+
zYu8E at yarRsKvLfeOcD#No12 at NJb7|R<&@aiSoC_mVjd8R96NT5BS(%%!DYbd;IhgT
zph2u67ZVf1p+kq5J$v?lx~$SI)F59-LZ3W&!r8NDu~;mkhcS}U)YL>lK>^*}-BK!F
z06)r=7M(%`Y{W~8*RNk^{rdHEc6Lgs)baEoaj>))Tz&56>FeQIV6<4Kb^7#aG#U*C
zgCU~i%gf6tDk_qTueyL-;JL!7So!=u at H4PVq;`tm at 8{gPbGY4Zj7DSFTdJ|Kk)om^
zY&M%*LgWWl12tlqy_Ec~A2<TCUNA!Oi77QTmF(<n%w{t>osOiWr01TPT3cK3dcD-u
z)!}eBXlZE)#a6{9rcmTPo<6w!8;^W>kvd~({EwempS at x~Wq6-lyMa%D=;8D=iNJ2b
zBS!MC2D^o^M@%$AM0i>7A44VGFC<f8{n<kmA!8DNcZ6W at bwDQshtK}q<{r=_#9K8&
eBK3Q?AO0KkpBN at ZJrQC60000<MNUMnLSTX*pHCkE

literal 0
HcmV?d00001

diff --git a/images/audacious.svg b/images/audacious.svg
new file mode 100644
index 000000000000..2f77cf2362fd
--- /dev/null
+++ b/images/audacious.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="96"
+   height="96"
+   id="svg1306"
+   sodipodi:version="0.32"
+   inkscape:version="0.47pre4 r22446"
+   sodipodi:docname="Audacious-icon-2.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.1">
+  <defs
+     id="defs1308">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 32 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="64 : 32 : 1"
+       inkscape:persp3d-origin="32 : 21.333333 : 1"
+       id="perspective2880" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4"
+     inkscape:cx="42"
+     inkscape:cy="47.647849"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     inkscape:window-width="1024"
+     inkscape:window-height="713"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata1311">
+    <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></dc:title>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>nhjm449</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:description>Font: Circulate BRK</dc:description>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="bg"
+     transform="translate(2.5e-7,31.999998)">
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       id="path3654"
+       sodipodi:cx="32.375"
+       sodipodi:cy="32.75"
+       sodipodi:rx="26.125"
+       sodipodi:ry="28.5"
+       d="m 58.5,32.75 c 0,15.740115 -11.696561,28.5 -26.125,28.5 C 17.946561,61.25 6.25,48.490115 6.25,32.75 6.25,17.009885 17.946561,4.25 32.375,4.25 46.803439,4.25 58.5,17.009885 58.5,32.75 z"
+       transform="matrix(1.8373206,0,0,1.6842105,-11.483254,-39.157893)" />
+  </g>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(2.5e-7,31.999998)">
+    <path
+       style="font-size:56px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#d9d9d9;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Circulate BRK"
+       d="m 12,16.000002 c 3e-6,5.008143 0.94309,9.691064 2.829268,14.04878 1.886178,4.357723 4.455281,8.162598 7.707317,11.414635 3.252021,3.252021 7.056896,5.821125 11.414635,7.707317 4.3577,1.886162 9.040621,2.829251 14.04878,2.829268 4.943051,-1.7e-5 9.593453,-0.943106 13.95122,-2.829268 4.422712,-1.886192 8.260108,-4.455296 11.512195,-7.707317 3.25197,-3.252037 5.821073,-7.056912 7.707317,-11.414635 C 83.056843,25.691066 83.99993,21.008145 84,16.000002 83.99993,11.056936 83.056843,6.406533 81.170732,2.048782 79.284488,-2.373946 76.715385,-6.21134 73.463415,-9.463413 70.211328,-12.715399 66.373932,-15.284501 61.95122,-17.17073 57.593453,-19.056855 52.943051,-19.999944 48,-19.999998 c -5.008159,5.4e-5 -9.69108,0.943143 -14.04878,2.829268 -4.357739,1.886229 -8.162614,4.455331 -11.414635,7.707317 C 19.284549,-6.21134 16.715446,-2.373946 14.829268,2.048782 12.94309,6.406533 12.000003,11.056936 12,16.000002"
+       id="path2167" />
+    <path
+       style="font-size:56px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Circulate BRK"
+       d="M 48.878049,7.414636 C 48.878014,6.829296 48.617852,6.374012 48.097561,6.048782 47.577204,5.723607 47.024359,5.561005 46.439024,5.560978 l -6.731707,0 c -0.390268,0.130104 -0.813031,0.22767 -1.268293,0.292683 -0.455308,0.06507 -0.878071,0.09759 -1.268292,0.09756 C 36.130059,5.951248 35.186972,5.593525 34.341463,4.87805 33.560956,4.097592 33.170713,3.187024 33.170732,2.146342 33.170713,1.69109 33.235752,1.268327 33.365854,0.87805 33.560956,0.487839 33.756078,0.130116 33.95122,-0.195121 L 36,-2.2439 c 0.520303,-0.455248 1.073148,-0.715412 1.658537,-0.780488 0.650383,-0.130035 1.268268,-0.227605 1.853658,-0.292683 0.260138,-0.065 0.812983,-0.09753 1.658537,-0.09756 0.910542,-0.065 1.528427,-0.09753 1.853658,-0.09756 0.8455,-0.455248 1.788587,-0.682889 2.829269,-0.682927 1.105658,-0.065 2.113787,-0.09753 3.02439,-0.09756 1.756061,3.8e-5 3.577198,0.2602 5.463414,0.780488 1.951178,0.585402 3.577194,1.268329 4.878049,2.04878 1.365809,0.715481 2.471498,1.59353 3.317073,2.634147 0.845479,1.040681 1.495885,2.308974 1.95122,3.804878 0.455235,1.430921 0.812958,3.154496 1.073171,5.170731 0.130034,0.715471 0.22759,1.430917 0.292683,2.146342 0.130034,0.715469 0.195071,1.430915 0.195121,2.146341 -5e-5,0.520344 -0.09761,1.008148 -0.292682,1.463415 -0.195173,0.390261 -0.357774,0.813024 -0.487805,1.268293 -5.1e-5,0.06505 -5.1e-5,0.227658 0,0.487805 -5.1e-5,0.260177 -0.03258,0.55286 -0.09756,0.878048 -5.1e-5,0.260178 -5.1e-5,0.52034 0,0.780488 -5.1e-5,0.195136 -5.1e-5,0.325218 0,0.390244 -0.130122,0.71546 -0.260213,1.430908 -0.390244,2.146342 -0.06509,0.715458 -0.09761,1.430904 -0.09756,2.146341 l 0,0.292683 c 0.06498,0.260172 0.195071,0.747976 0.390244,1.463415 0.195071,0.715454 0.325153,1.203259 0.390244,1.463414 l 0,0.585366 c -5.1e-5,0.780493 -0.195173,1.52846 -0.585366,2.243902 -0.390293,0.71545 -0.910619,1.365856 -1.560976,1.95122 -0.650455,0.585368 -1.365901,1.040652 -2.146341,1.365854 -0.715493,0.325203 -1.46346,0.487805 -2.243903,0.487805 -1.040693,0 -2.048822,-0.227643 -3.02439,-0.682927 -0.97565,-0.520324 -1.918739,-0.975608 -2.829268,-1.365854 -0.130122,-0.06504 -0.390282,-0.09756 -0.780488,-0.09756 -0.32524,2e-6 -0.552882,2e-6 -0.682927,0 -1.235808,2e-6 -2.439059,0.227645 -3.609756,0.682927 -1.105723,0.390246 -2.211413,0.813009 -3.317073,1.268293 -0.130105,0.06503 -0.455314,0.227642 -0.97561,0.487804 -0.455314,0.260162 -0.747995,0.422764 -0.878049,0.487805 -0.26019,0.130087 -0.455312,0.162596 -0.585366,0.09756 -0.130104,-1e-6 -0.35775,-1e-6 -0.682926,0 l -0.780488,0 c -0.325228,-0.06504 -0.975634,-0.260163 -1.95122,-0.585366 -0.910592,-0.325203 -1.528477,-0.552844 -1.853658,-0.682926 -0.06507,0 -0.195145,-0.03253 -0.390244,-0.09756 -0.130105,-0.06504 -0.195143,-0.130087 -0.195122,-0.195122 -1.040671,-0.715446 -2.146361,-1.528453 -3.317073,-2.439025 -1.105708,-0.975606 -1.853674,-2.113815 -2.243903,-3.414634 -0.130104,-0.455277 -0.325219,-1.073164 -0.585366,-1.853658 -0.260177,-0.84552 -0.390259,-1.268283 -0.390243,-1.268293 l 0,-4.878049 c -1.6e-5,-0.06504 0.06502,-0.260148 0.195121,-0.585366 0.195107,-0.325188 0.357708,-0.552829 0.487805,-0.682927 0.715431,-1.300796 1.625999,-2.504047 2.731708,-3.609756 1.170712,-1.17071 2.406482,-2.14632 3.707317,-2.926829 0.910545,-0.520303 1.853634,-0.780465 2.829268,-0.780488 0.975584,-0.06502 1.918673,-0.260139 2.829268,-0.585366 0.130053,-0.06502 0.390216,-0.162578 0.780488,-0.292682 0.455256,-0.195098 0.747939,-0.32518 0.878049,-0.390244 0.260132,-0.130053 0.650376,-0.195098 1.170732,-0.195122 0.520294,-0.06502 1.040618,-0.130053 1.560975,-0.195122 0.520293,-0.130053 0.943056,-0.292659 1.268293,-0.487805 0.390211,-0.260138 0.585331,-0.65038 0.585366,-1.170732"
+       id="path2165" />
+    <path
+       style="font-size:56px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#d9d9d9;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Circulate BRK"
+       d="m 44.585366,20.878051 c -3e-5,1.040662 0.325172,1.788629 0.97561,2.243902 0.650374,0.390255 1.430862,0.585377 2.341463,0.585366 l 1.073171,0 c 0.195087,1.1e-5 0.292648,-0.06504 0.292683,-0.195122 0.130052,-0.13007 0.357688,-0.357712 0.682927,-0.682927 0.390209,-0.325191 0.650371,-0.552834 0.780487,-0.682927 0.130053,-0.195109 0.195086,-0.455271 0.195122,-0.780487 -3.6e-5,-0.32519 -3.6e-5,-0.585354 0,-0.780488 l 0,-0.97561 c -0.06508,-0.195108 -0.227677,-0.422749 -0.487805,-0.682927 -0.195156,-0.325188 -0.422799,-0.487789 -0.682926,-0.487805 l -3.609757,0 c -0.520355,1.6e-5 -0.910599,0.325218 -1.170731,0.97561 -0.260192,0.58538 -0.390274,1.073185 -0.390244,1.463415"
+       id="text1314" />
+  </g>
+</svg>
diff --git a/images/audio.png b/images/audio.png
new file mode 100644
index 0000000000000000000000000000000000000000..a41d51a0fd82c1ae76a8325e4d34fb31d00b0ea5
GIT binary patch
literal 3224
zcmWkx2{@G7AO0{|2ZM>R6IVl%aK%^(lWpeOZwpd(Q6_7JglvNhQq(0&TngdRHCdxv
z)Zb2H8^dHUNtR3)+5V^JIp24l=RD8(&hK}A at 9%xzFV(@$N?1 at v5P~3KytTO#n6-XA
z{Jh|OiF=0xCay3iD;!iaAh!fTa3{RE*?Iq&6_?9_vX`O`2A)Za7^rqtVZO at zUjGXH
z)-(h8&aQzXMU1y>LOLr6VVZ-M{wQ)Pw!8oKXyn&(g&QNZbNXl}%$UEB&&fCUT=>k=
z1CRYCdm_!tvHVt@%|r3EbD^tYKOOo#tRLpm1K)`DLneOMlH}R#!`WDau(-9%wamj=
zz8&J(Z=2)pqC8k%moasmb)5F%@x<WtIt}kv1oi4EO55AUM&})q<66J}t^yYp-p|tB
z;(;zfHsUzD|GczS#RaUhVfbtaN-HUz3 at kaX@!Y8*PWv{*(2TQ3dADb)E^TctkLS!9
z-hbjA6Zwp_V{$}m5GBj~Pd{q+4(<aUGD+)UrvCMpw2hseS40HrdxTsfVuB(}qj<VV
zLUBwi0%xk8M5MjEST#YTbuKQdtxh*3 at QEsXLU|v)N9`U_o{#LF at Wp)yfPA|ro}|~c
zw?(oSHzdR&7IH4d5Y+d3c6K5UM#}!kQWYRu^5o~|Lvcb<njRh=P-SI_GsY_ at NVLgK
zB!_UMJfN8uG9FA|MRKCgnwL7l;qc=2cEyiA;xX-t{eBWBPMqLyn3>vIT5+tRScQky
zu<`&eZ*Ly`pqa$-fY^J?ZgP7xhFeHTh^31E*-r~<x3w=iD_k^4>hHJp&r9~v5$HzU
zzJ2>23MILqKpvIMg*(`FOw6L(Sex7*?i at 58RLLQHUV2f~Ju!h&#dCYZt1k*woEM}J
znG6QhT*IW_nYCzgJNP&^H#gWeIM*V^z^;ncx;5cQBvM^{JvTx9e+xQ+wC?V1-m$T<
zVsx5Nu2U2y;*<a at PdmA-?aa5870-YG0Vb1a{bKYVj8K`A0EOrs8>{%|pMN?#J9qFY
zMz3qcF$EAf1)XjWnjSXeT$$5-PZVd17UWnv&c)#WVz*9*w$oscb8eE2+OH}w_IB9o
zJJJ5SGS;f%2-v&Sjdx<#wyp2~SyffVh*TK%M}kv|Vh;>_TzGpziXS&$V at +wVonigN
z+l=aBPM-9<b4Lo~c--!pY3XnWSyo>LnpuWLsdCr0ZA~dAb$)JdzP%!Yw0Ji%B0e at g
zo*B{n<V@=0)`uSH4RjivexwX3rRip>g)&DY1yASq&+`1Uw6Cxk6Tu|wbC(AkY)m!W
zsIyj$Us&*cRZ~NW<b;qB8wGFe`OVs{l4jSej1_vC!dSt(TPwZb5)Om6SFbcwCAwCR
z6}h!VZO(uBf~LHA^PPIh{mh0{+w*NgRsQ2<{94F-Zoi)+M)IMx>iWnZr+%{?-D4LT
zbc9SRwsYnlyrf=tc6SeY)ET1iEk}xOD*r at rru{}9uS at Q5pq{pgi74)aecM72yHERE
z#rf-+3Yn$U>&j1h_cQ+<J;|N9alk}4UO1Xpu8e|vMMv+=SJl3aI<OYcFOR$)8k&tt
zzHeE|)muN+8av%EZrJe6cIf5;^=?FaFN((-o>tOPk9k_28g57q)H4!b*vWDcmV&Wz
z$pLvcuWiN~XTW+w_+i}ZyZftsou~v~msPj<KFgWIWs8ox<&SX)*aU^_fQHd1qzv;o
z?XfIh>Bml-=(pbQ?yjYlr1<L!7P9Dyw|JZFf(#48{Zvk+-kjl!1Isju8NXQ-mAfZ|
zd=s`xZ at Vi6z>I?9kQPtNBh6(B7zJEpR^+8O884*0&)iL_S at uW=>75<fP1jCOPcI(!
zk8?`9yS at 63va+dyZ*6Sk5T83tU?d-aSW(i_29$shIo7~lhK<c=_`+zfTyR=RBa`r^
zzAr at X=k6}u|Fn#7U{KKb#?D at CORgi0GTU-%SrYdgp{AzR!Hyo(Tt3a$_{b#LvqRVR
z(qZN?AC%=KhFp&s0%l`xUwXCn9MU3sYx0_wEj#EfXHKZ}1Q$O0VD*vx*~!6$(3CDO
z?A@)v%Uxgej{V?XJAM3qTcVs(rbemMsjKD<u1QM#{(AY1;5>fi`LEQf=yAtm1$KvB
z91dqWEG!HpfPisjtD0T7 at TECMl@FU?l>P4vbs}UN<&6!QOI(iZF*6=yHn9p50`i7*
zg+WwE3%Aw?v3ks))PpXezibv+M3|(cWTA|_{QjFaGf at v-6J;wan~(bW_`m=Kb$Qj@
z(3LX?=iZ86we$z1maW>5^C=jcJ~`>4n{WHFQZR$r!8UfS2Jt;DEVR^olAqqgT>i_(
zFNd8j#(w?!b*scz0GES<80Xw0F1ccvJs}JKI||6S`3BdTr%Ub$MJob*-X~8Duz^Mn
z4vh>=WgBN!RH#2Qx+Ai?y9<Jbw6NHe;bBJ at H<z58T!$9CZ(!g(Wo0(#L}?--_G}Sf
z8IpSa=xj7w7~W}Gah|&j2?B?*2xY+=^LXR~i|O`Qz^|iMatws~@;mIpBMN`DCg^D;
zL~t)rSEdW_A*iNCj-X&t{4&yZG^^jwOx>dGs#V4L_v`CgTie at QO49~}J=VrXy`HwV
za-m7ALQ6{v`bjS!eZVe|Llspi?HIo at KdJL+etv=yKR|X8j;p~{m~7cebeQ?=MVJV0
zLP`(QTI~_o(p&>t(##S0vNElq;WSXWzefX7N>T`A at vhap1ogtmMd`r6K<vl8S}Vy-
z!1pGL*wuukrGQ^D13u!B4$2)!B>v*IbZxLbolN!&4o1lJG*SPH+-3YY!q+$&8Cggw
z4;Z>dCub08fV?KArf_PH%*vd&2HB0#J384PRk`m&{K_EGJFC<0#@%CuuZ+|6kp-P8
zy88Ot38qTx*Ng`b at 1xUN(P<Ive*Ndmh9V*&4rruXn*=V)Moo-tDfXZX at t|wEdu-VO
zc?2jNsKP?1w2_e!xEcQjS0DjE*-o{tbLaJ|)lXtJc8oE-@#O&&BCTkWvOi;`crRQ&
zj*2&h5aBk6#9(*#*$)8MChhD2Bd6+%VWf&cy$87GLyPzqorcV$K~@4f4dgzm3s86A
zf+vbM{ECUV06sf-u}>N<D(X!n3Ijcmm6hde^q#6^v3FuC&uh?{YsMj6u75?UiMD-r
z`?cUT=QXIKOS)kl2KX~NI`IH$K({`B?j(I+u^lcn+>l=J8(_!3Q*x?6svSQrmTLY>
zPpMQYWyTAY?1n}XNCT20WRtx<P6kzaMJq$w??l?%S1IW0reP&j16_s<TZH at h`4tDq
zq;(ww1FS#0ItLFgK?Azt?8m4+!UIzS1TOk)W_9&RRPwMMIaH3%cC-WaS{@_c&7&1D
zC~G+Ky*mR^q7bF(Cj&X(CSL;*AV%rId3K^_HZjVuRP*<?HwhKvj~p%>1=ax=3~=j2
z$AG&R-m at 845rDnC@`WgmK-m{Aq{)oaGGzCAoX?~e<>loFIInVV=pd{CBSf}jrnohK
ze95Bu;fBV?NkDO3t1tGm*zHRl^Ia2qeJ)q}T4N6nPWigb#2oH#E2kX;)i|8;1FBf(
z4Bv at X0G0*#CX*Wtt~$_bA-$Hcr>{j-aBVvsD3#`#TG!mu`5%4WOGrr6#K_an4tzUA
zhm9T0R`mp?rnk2@%Xdd=dzIcIV!HWsu?fhDmc33GDT)apEFAOdF^74GjUO8up#(=H
zu!YJBnJwf#-Tvdp7>{YDN^xMgX_D+s_K}w_UnW#v+}%C5p4KDB7`Qb!zRU$VkqoxE
z?ayp}q6TC4BnV3kptObewp`LPGgZV><)r5 at y`f>nVW|Nwx%qwI3!qOv-P#|e)9FPY
z>-W|X{=H$hUoCxLIm*g$i3Zp16tEc#hK;VwJv<^Yj6&pl|5-~s6$Zp%czm3%kfqEY
zFDq|5T8tJ14hf7(YUQIL1KZJ?Qi4f`S-wp}pMA>`tYtY&%F}3)>Yl=S3{=AUR{HoS
z^E+qB0Udr7k!VI(g37|Pv=>zpQxqaK((96aT|{k1F{tD^7tJT_hOlbIua}pHnx>Rh
zw*JnK{+lnto%Ed~KSF~UEmKysN4*W9Qa*tdMC11>chn6;xrTYBX;YCweA|!xN6Ol<
zzQe{a7Gmg(`6nx`LrvPNcoJ+)+0=+XLWM!hzQ`xgDIw7FZI)`Ozk=d!64}Yh&{@fO
rDAh`}oo#0q{PZsDU*8Y;!8zsK-#y*>?++jFs{!FH?96L$9`XMNscRGk

literal 0
HcmV?d00001

diff --git a/images/connectivity.png b/images/connectivity.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d80e79d014ab86497060884d98d67e11ac50ee2
GIT binary patch
literal 4452
zcmV-q5u5IbP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00001b5ch_0Itp)
z=>Px`9!W$&RA}DqnQ4rjS9!;O at BY4bpSd%h8IQ-~Wnw3BY>byIj<XO5G)Y;jN|h*l
zDH0Sl{QwnGRYf8csn9R2SSo0XDA0mX>#8kH8k&GpoW$|ON$hyb*t2=|<=#7YzwdU=
z>4$sm*dfFYOIuYO>Cw6G)zSO@|L6HX&w0){@ay*L_6s%bm;J&A9(dSUTN7I}P1~wz
zbSb4Ll#;%#Qx-x_#jzNF at x{Mx{+}YSfBz@@EzA0_ldwN1qIgd_n-V?idr75InqiwN
z3?dq}28E?n8kM at KbmOcD!hefn`R&osuT1@~5xDcthi^A6`*Vh=-*w9!yY)@mhV7lZ
zMyS>U=9kx~)?3t at 0r{>py*)WBQzwoE%X7<2o|_2IA3rUEFgz`z_>rSWzw*OhIRT}V
z1{m*o&!-1Mp?xWpO1%5N_rKH4^mgf*Y2$~Ar=B~7lmgGTFiaf{h=pY5&09!j(gb0I
z4p^p!WoXQdO{<fKpKI1Cjh7-n_}J*^SI_^_2`Hr!Kpseb;S1k;Xl!iu^9SF3hqZOb
zHsiu<iCjKM!gJA3j9r-J!qgm|ZDN@^Xc~rYuy at aPntn{R5mIRegpnYM1dgSVbPT3W
zkI7ele6%G*{726o`O?>}mw<5{;Cp}}V8hqH{@AC&Nc_Ql?|+Az>Fw5E9-AkY at bvTN
z02tZWLtjst;_4dRS&w`!$;faYJGKpxbZrbxL(@P?h+;_;hUig?ZdYg5%^S6Q?!VQ}
zB;EV-xm$Mk_TKZ))6-AOU&sSWsT?p241W9XpZb(;824<td8 at fvZlD=9`Fs}3ayWW&
zl61mh at 6Juk&8;vyzsyZr*E2NGjiy1h5imWwO1`(7W)PE4Sqyc%q&$<;6Duqfn at rCa
z$Y#^zGY(O?EY7}s{^YIu^9LS$@WJ5cBGA$MR$%j?LqB;~Gpz?kc5F4nSklv-!L)6r
z<_fIUeKu_zz%ort9dsmf^DAuI)Q4wl7#cKuK{JfWCM;5p!A!BiKRo_2hhG?HXhT0j
z!Q|9DLI_;jWZT9(nWz<27nUFY=HGtm18-SE9q_}z at RLuzc>h|t`MW#!-DC~+rrA2!
zMcT7a3dSZESz4{Iuw3S*E&aHbj%Vxicc)3aI%!A8F?EuzLDn;=G-HmOoMW*ZQf)~L
z)5dje%9RGSS_7pZj3kwskC{puE3?bPeO)`(W at nGR@RmHFl-dV)r%p}hpZMYEcklj<
z171FtU}Qu0<uPF_38NTY(};w?G)yeZMAJYA4E^eNMnbVtZZWe|;gyM1=8AR3rk0Ut
zEG!fdQX!>8D20 at YOu}YeF2UmSFSbMw?mKqu%V*yRtN8}tM}RHBGvE9E;m_TA*B-}n
zExOX~RpVMg#0%#ZkeEm`a at i#7*LC3-;Fyqgub!PSme`iXP=A(@!5m>2apFP`&zziL
zb)|%i1ZbeC_V{w$$8#()J8pC<r_X!`*axU<dO#`lVPN9XN55rfbLl7VdEkJ(y4Jw4
zO?GeVC!2H#Bf+VO6&4D0T9IVmt{bS-TXbiWBy8yRAeMAu0)kjls6|v;G2=4 at o<4St
zawA}UKFvLQhS at dJ&od`4^2E^#yfn6mlnNmgpx8Rt&FYy~n^cOw{p_<}ef*jp05$_>
z7njPP at 85oddE~@JbWNitm!K6yq&%A_64d>Oq4n!XrjkfaCzVR#n2>X!+-gsiMq3tP
zEb(K-;%bEp7nf)Sg5GsKOfQu=b?7C+AmomngM8vc`>{-ezxt<9o;y8 at 6pGcg2ANG8
z6XjPbUjTlJfc^#qk|$0~c<0W|-0AD4J~3aSSZT7l)?levXJ)BFEf9=s9weX7VOSPI
zLE3?w2TL_*#SjSyVnr)zn;%KWFRn7XxW at MF8`(J2&)av6kk4mGWmBA;uk*=2e~hpE
z<1s$|p?&<#AHR>m-VEiMkL9{(o_E7-w>^CGHM7uXKl|C;Kl;&2 at 2Fz!ZeW_rr8-JM
zEEGW)(+nbR**;7*mmyXlBy_uwuwkwOg0 at m6?ZqmLC4MMqh62N~srwPtR>=HP2|oxJ
z=<g++PLfO}aXp8{Vx8~)#|fH##OFSKA5A}Ee6EP)*qW%UwdQ6=pS+fYj%*wr_;ha}
zb}ts{tW|xYSkek2(g~OQ4&FjCohB3 at 74#&)HejaQmW{4J>Y!pt9802D;)jw}AedVz
zbL53F!dM_XS!e5(4M-GzC~zDH+p$4Oo*W(L<*@}m^O1w(GagSqcg|>F{1)(;Yf0#Z
zglF|`Sl>;#?qiw;>w3Ex-Z+TRO!D2`)clybFUYyznlM*=Ej>sDek5rGf<_>y`!RJt
zW@=%LfB*4I#6qGJD5X%q`SDrC&d)M6Img*E<1EZCU(PKnYYiU##!u+&N^sBq5zvjH
z+irU}^QHvuzWWb*{^ehvllSi3gzeZobpNfq^WaYQ at 7~J04&H)N5+NihOOmz~lO;(k
z6-p_Dl!TEW2;+`yVw!=V;fFka_&8xG+Q2*D+eBU?qX5$~$@k{l{{yjR at U0)7VSR6g
zjW?{1be$XDlt2{8Ew7wk3|nE$d+)l5eAdG;H9Qk~a|tY?9k3g_3|?IdX$28}5Ow;P
zAdCqjK^VnEksyi%<I_vjYkmiOCrB<6>G-ZgBnU!G%fz%ylv32IRhE`Z96K}1javpZ
zO_N*Rlz^`5S<mz24~~rS?)}4fdd&3HES{y~T9B|bM%Fn at 7enGWCW>PGAjS`4{4m0g
zq7I1;kyucvwUA0(VQs0ky`X-|E2~SZq%xUH0}w*6uu`Vc3JlXU^4ADr>Dji)z`#0w
zaO6B6y7xxHRucn3(l+VOIaFJ1(4bJVt$EN;9e_eggiyqy?SZM8rK^EnWn7larH3$z
zNf`#ZX`)0#CY3-+!Ss9qP16!@N<avjni5)XK8=!TmdZZ&?cGGN8n8a^VVfG`b0uug
zLlc+4N+Qt)BUPuS5t6uLy*)V=mP<&fUeo-~AR{}mP^(libZ}e`(@<!D5>kYrtiCA$
zUDqp`6c`%lmQE`MiOvlha+k+=CY+yIU~#p^@a7Fjbo@}Fppzb7BNhwE at K7J;C+4X)
ze58^{*_M!$Z$L)2z0hj5KuS~`;iN2jvniHl1EFcMa*Z@<j at QaHSJ$-8%RqZw#gxw_
zkU|i}G2>GU6xSN<80f at 85VeEZkJ`@)jeUEzW0(fnY?}VQZhCrhn5J<#9xlg4$BXS~
zmw1jzSIWjQb!z3h6vDXhrXDzY^e;;9ecvOkW}{`<u1gpTYORQT+POR?2nA8xp53{{
z6^f^4xc&B>=$ei~UFC&KGO{e2+xG7OO(TliS;}#2=I53%o%TG&LUvNH1SK&IgG|C=
z^FWruYKf>7x}F!0U2{XTY3p5g4-EC)kjSM#)96V%Sf)X-++=pSLONmN+9v0wRw-1P
ztd#1EPcLE^I<D&xi}nf}#o{%K1VX9H&$<RGjxaPyI$@Ja*d$#W&o*%^16_ke!eal8
z11v0;@XHlyh0547N51-(*Cf!J-{pBp?_K>{hAcmf*|j;(#A20~U!7xqwZ^H5Wzq?o
zgS$5}wXnvkGX?x0Vt%p6+~O*ZZDH9KaV!b1AQ47_SV$aG$FmK(a!H5+(g}y8XOnO(
zJln*!bP}G$9XmEqsnjSG*9Z#bFs!xyZf<V$N7t%_Fim;r+>2+weDi_57`BCN>5R=)
zSXikML=nCpb7pFVq+|2Y!ENl=vW{;(c7kHHMWxbYez8O%nLvoEWfTiZ!ZvU$1J5>a
zOdZjc#4-#t4TO{gK}4fvvOeG5;GaBwfrPCwzgmf<)V_0Fd*Ydy<No>$x4jL^x^ef;
zEqcR`I6GUW=|{{hmMB(z3Y8`oW{W)W`~@u2;A8LGOVYDgSgo^R;{c#_X1*<@SO_d#
z!?kr1j!DunNx3Fz&uaHchoo!a*d{~kvfQ|-hhwiyVrr7OR%dOgeERw4zx?^@J{KAs
z*mJtHRQSC+?%iuGmRgL>R|u8P!g7g)LWNSLNf=9{g6V}ahhLgzus6d;9@<TBSBjN#
zle!<Z!FNcwmVxIOBpj2JXOQ-6JQH#$mrT+j>6i at kq}aBxhtX3rh{z}Dn3Seg8(|QB
zVruH>_;nMQn|q<Keqi75_HBc2YiN%C>TH=-5Mw72RI5#VKe(zOi(<+7*&@fzE-*OI
z!<{#+qrW>rD~Ku80zl!~2A*w_a!gX5P1>{Q&$%4fImE7!ezpvDlS_M?8ebp^eQZOc
zS*(h%(K>nP(4&9)=%bH at Z{=i8w=L`B=Ao^>FKpLp#L#F(C<Si9qgY&ftsuLis?27y
zlzqvI<ExbGK12BwZ{M0HpK<Xl1IyI0ES;oll1*3~xMc%L&u+(_p<`Pnb4w+Zh*42Q
zX}%cWd{fV#OiY|vK6L0%^?LTims(<S@|iG>e&^2?M_+ox-hPX185+$XLJEnL>WY&A
zg>D)Q4i4ZZJp3?5D#g at dmGSuspcv{+vAI9PV0V&S%EGk_atRyHxf+6P8FZyx!d8=F
zxfyL3OdrbU^~&`0bPDi**7bP61`<G`USC}7Temqke&WK&z_zVcC?r87s8#F8%bOFh
zZHr7-u9IzETj(yO&sG at IXazJ{0j*X5N|1C+hWfH-S1k2XDQ4$aDJ&M_I1I-6`;Euf
z*4C<%larNW$Bxy3=*r`jpGCj{T)<meTC%35PMo%k-tOk|+Lpd8!=^;1RH_okal4KO
zykrvHvWZ0}XoVo|WFHyFXfh^Yf at 6SZYHaGuuzTA8<ywnW!bQ{C6EU+;U}kbb_|4X0
zKF?#-YNb*tmDbLmKVLj^=1dca>1 at 5PC85jHQZAQex%|Cv><}M_<x}AYNA9}a?#ntX
zm14q3kVqx4U579XJ2gya!y?-y0aCR0#ioFy&cR(bFw~djzm8u(Ly^mP^kfq>n?B2P
z1?l^Z`D`ZsajjNs*6a0Fp-}LTA3yHDmE(0Cu&yu at uvS-Iy`ZBl4y1ebhA~=KPeylL
z8^?1{A_ftIh(JWBPEXwaZE1qvJg|+AKDdYT(@Q-0+!_2Jz|=qqL2-Fatu7X&l#NrC
z*?OVTsF$kMYOz=>7A{`AxN`XL;S%6??3xmi9ni)VrUQDpJiEH%<_%MWxqSb{(-Y}*
z%GTDc%W96Pp=3lHMaVe1OeF1^Jb1?lpZVxJD3q#v?fZwBTP)yOI<Bb`)S9ZiRFd^t
zwP>03r=@62G#ZUkwOTEd%jM<y`T3<Mo_J!uTCFxZ0UTcM{eTIifh3UX^hqF@&1N%S
z{Nfky1!w3#pE`fj%5rm~m(P;!>ovVxlJ2fFLw#MmZQFWwZ5!n1i3y%K@(RVZ8jc2z
zrm%#RhD3R;R!XJ((R5m$vn;Cx)Po=>HyVvXp-@;J9UYxJe*Ab5sCP`gl`AIWb>I`7
z-pl23=|>)U<n{vx4(!QhbL-3HR?c;k`CKmTRI5!UrWVDibJOa%(R0LMEJY-g3}Rix
z!U#ocIqAk at o>xEB-R+bznT$-OQlViOzEY|l1VOn}Dixl6_SwbB$;k at P=z#yZFZnKk
z_pa#OOSW_8&hEj%!R+$#vYMZtS3%%*Wiow(x^7=S(w0(0wc7GRtv0hPgb0DKtE)>5
z4-ad(Tu!7?sn9e{-}n96%*@Q%*|TTM9mzC+;Fobrsl5Ssr(<@<tk=bkcEvYTC$>b#
zqK<_f3p(a^fVVooe<k<CW`~G#1 at KFDRnT|7p{_^{mk7iiyOM<8AtC-JZ|b!UV7o)i
qd>!~JJ#eKL;tuHetpNUi*Zvz}LgKBy4!!&U0000<MNUMnLSTYHi at 4_i

literal 0
HcmV?d00001

diff --git a/images/info.png b/images/info.png
new file mode 100644
index 0000000000000000000000000000000000000000..91e2c17d6ecc55ab5f7a1fbee1b205344821cb5c
GIT binary patch
literal 3194
zcmV-=42AQFP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00001b5ch_0Itp)
z=>Px>G)Y83RA}DqnQM$))pf`JYwh#6kD0mS at ywlJ>=`^j#|C3w114^8hyo3Q096_x
zM5+i8f~!hZnlxXk^ou{VQdL??L|b8sA%N5t8kL8{qe+?+L%<MRFgE64d&YxjJma}@
z=f2N9=j_MohZ#$jl{VNjj{BioS~^GfO6UB4YyH={Tl)h4zs~KVm3q+j?c2S{sp=Pm
z)$cKTH^RB1INJpP#HtSFIf(l)w0(AXxa+m;+qawl69C(`ZSx&EzUAQkMXs|~4Ub-#
zKW}KA%I0&(g#nlWV^gH<7}Hae_LBqew3-Vg!?52U8tmG+T##h}+_UXFR{{PD-Nki<
zjn~}Nv8ua(QX at vG9wF8Ssn#GCguX&PqcGgtiIHL_%9T2P@$;8kvr~r`#Od3A_>T|1
z_ZtVe_rC9a1MEF~+15L=#layuQfgwZ(nMdkht&lS-FXk$fQ1!_vyetR#cZW5GnI%&
ziUqZKv>%@yosn05^kmz)<i4Gc{Ov#e#sKd5gYVrH1RalDeZ$=y356J+tzl#!!1|#)
z@)-sbIgkj19Fd4~0s-KhAa#QM6ANy-9Pt-6uJH>QMNdDmqt$BF?tOg615cl>7IoU<
z at B8lctipe}=F9hXR1**7Muh7wE#QK|EJB}z8IFi8LmV+#fE*E70vr)J21&7yk>mAt
zdhl4)<}yBCf8FOZd-uF^^A(%Me*W&eyQj_?z_xAMe4&olH*LMMC*@Am<2Jr{`6_hg
z7zA-dWSL- at VF9uL9MNKc*b2cB;D||bzUSuZv7W6&uD2_%F2DS;%>KRa-E_^^#=qOM
zXOH`=n)q}8Gz#DCT{~LHtvV00l at _*cDj at I|%|Qf1Bo-h8kYOUDh_qr#nUN|Itq3VI
zQX)$Gx-+gL>&Ky|+PgoQZ4`@rcEjaY_F5_Y@#$#d)5$(S- at jnf7ju)xo49l&i_ixk
z;s|6wutcPpNi&gV#$pgOgESMTibxaD;%5Zi(-CUVqu66gUORBCb?Ys+1YrEx_U+rf
z6$dbqyRoPLd{~u*wi;`C1Bf^Q!3xCEQr1CYKw?gaX6BTcQd$(9dW2Llr$m%yeJ>3>
z75hHN^R=jzTCx|6Zd8-gl^a$ZfH?E@;`x_#RT?q+x*0?c0GUPWkYOSXh+!h_oe-`l
zB|^$fDKjOkC{@gfVk|*P<og`^ieum7WMZz`9@~6vmc8(<6$cQe&4twiREuI{LqGsW
zBvu4=$wG#gEJ6$o63v8ku?Hyim=ndE5K#(3%EU=(T{BP|2i_vYRJqx>==?P#!k_!B
zx<0elU~Mr7L!`C^AOHwP0LvhA!t2Cjm{>E!uwsM7 at 2!Xk$ccajiU>l~YNsiIB42R`
z00MA3u~9yk1;iFt9Dqsk#0-!@oU&#IOAJd4bD{zSXeQA_tQkwzVzMIQWU<&HR)_#B
zG}`mN&jbKMLRN^K6BZFs%pEHZ-~dBxe88a6lGFjt0}Klc5e#E-WGd#A2}UW_ScI?)
z<p2=}z*B;SYP%vtai}<0qymW&hJzv^h=^W!3qe(3ldQ)u0O{#+E4^T#6T~nAF~qEi
zNQ1E010q^^N;8Q8u_Nc46`<Zo%28sPfucYQFPcjUizwxUd?JAW)fER2!l8Dnc3wUc
zSb>=7`6wFb&Z*A4Z<$#G&_t9fAXThVMU*m=CK1aJn*vd}k<7MJV|-8fMC<?q5vD+d
zoj7k*7<NWcY?*j^<)@HMpPD~59`zNnP7xVm=!3^<mE#MoYLeP$<8b$e!Jh0;=(8e7
z3MHvH+e$2E>yiGbTuTpFXKSmu{iTtv<lBKl5-3i5#i?Rw&r|7eUuV~$Ba?~M`neSc
z2#B6Nc4)s06nyf1woGK5AT8CC>fxFCbQJ4_&{yGbvGeL;S8!=4w#TFiblmWu>*w`k
zlj}!TdG`&k?YlC}bj*56#Y(9}d7LQ4sYhhi^>q!t{fpN~ES_8O&D@?nZ$_72aZT1I
zzV?C(FSLzz+VmC2fzR#0=R|qj><s<j-SN_oe1)VlANF<S!wrRexT!Ojx!CtqK8o7o
zVVH3m-p`teSrCX42L*u|>F-{jM2+5mf8~|e9((k!e{dF>7{~?bpMSLf-P;G(t{oZf
zTbnI6S`}tk#bjp6?V}@o9c#nDvokgGMm3Ts at Tu)9PKimgD9Lv86mz-Yj+vR(2Z~kT
zlk*J2 at 9)m_4tD1^{?+~eV6>BOpOwuV06g^2LkV>I%dh_Q#aftFx`$SGb}^AtAnTk<
zs*#@P$%h4Bv1Uc7uQ>G;wKIy_LCEb~My*P$+e=C!Uy&xIbWc}yU|nzFcOKrc!&c`@
zcRlgQ{fEyQ002Dt=nszDc4Nyc&pnfbw%Om;mCJ+4GLx+~lPQMFvl8PIYvoZAcz*0<
zxE*+Y<V at NXr{)8tIAuk;D-&dgx;uXN;T=2d#Q2eK?A-a_i>IsSv;h_&9-3+;dh3h-
z_Dr at f@2_D+j)+}7(&bvM;)_l~&x29KDF>2fnA=f(Av-rW$HrjVV=;<hx;rvsukPBF
zOpK5J(GPe2&2wj><%|FT;E6}>Kiq7#o==lzCoN6`aRgghs8(vFQm-&uR<OP(&B{xT
z9R8#@KR0)jeMv}^^@yzk4SxL5$Khj-KJe6;>NsNn0MORFSFP5N551g_2tx$K^W)<m
z_cI_$loJK(Dbf4(?OVfsaD+uU#o_=6gZgWY+OfsG+?g$JIRI?kn;-6bU)^-uSJ#Xm
zo2kW(Mo!Y2KRtC|(=T5y_vW%9#zgIfa=m at zNU3LFu<Ll7R=Nv4=bN7H!GYAIVP&E6
z?s7CN3*fQG9(?n at Km60u=eL%Ilvya&E1wMb?6TQVP?{@mx_HAdf}j(nxjNR3tU at k3
zf8*4rM`u5sJn-R-H{3J&)1UlDWQ>0LoB;rU*6BC@`Kc#=_WO5#J?IEGsB&c*tBZs9
zbYdKy-vQ4Dtnn~9I)b&sgKEg~nr!BxHRBTpTf1I={m}55!t>|!Z1j#hHU`8)`}zm3
z8vWYWzKVf?B5IA}NRt`}8lGnn1R?U7PUJg^$Yuxd%RRg0nP*;zMXU9XKmNecb6SBo
zc9#wgE{tA%<t(0k_FvK4JAlobufovUb;#xO2s|IgXhd-f9~_v#Pk#I)n$207KmOM4
z7oLCb=yKn`Yye~QT)nQX;->o6H!sCpsSEGF|2AHFv4SW{VT?l<ddTNJ^sXjcxGqLJ
zYGe9neErzin7?Pw9(_&$UViz|)UCI!f8*ex=GM*E_Ts85#;|GA9Ecp8b8uFp)oP(u
zT|lK=#;21Fy#M|bMCgs>ieC|c+izdLzOS!q>(yg@=<6Fpci|EwItycGVU0!{TM!Yn
zc9 at x2K)ultCx%2&UWq?Ac=;CMI86;&trYX+chHJHfi`mh1gSQtR-2ePHjjmJ6 at 9%0
z6#ELa{<lWJEMFNL8}rXOz)LTEI9aL0ukYVqfwKaw4chHCqIL|i7M-0r44k(b{rx at g
ze1$Z%n3^s at 1Rt-2g_aF)^UW7s*xQ at CZu8~=6pL4*yKo7*I){<VW)WsWD8(QmSm#hG
z)sY&9k at NeJ$%dEQcH8=qbJ+s~z>8yKoO94RMQQ#W_`VOJ1rPxuK&#b8sZ>S17NOYR
z4c~J(TrR^|=SrnG10cJ2Y6AzrobJ9zok7LC#iKcd0D>b&7FzxNon~sf_1hwv1$BtC
zsMne(mCLABDp)8lV0wBQA09Z2cmC at DKKy7rjiUH3ckP;Z6 at b6=Om))r#1E`|mMor5
zwY*>PG6lf9_~PP*!NHC at v)PWXD1`yfQ&>8r0>CiFL2J9eR;#^o_;C5f+1chCfD}No
zlzF=p=A`S1Sat=}DF7!&2p~T{-%2MYD*O8TN7JF9%f{}$`#av2Ew^BF^jdUuti|kX
zJDHrU?0oy}k9IYisXZwHyp(DAUlJ;3t%*-vd-v}B&w9Pyc<ZgVOdQ8Zk_3~Jlg1cR
zKX~xqft7yWidpDHPXGu82M3E=wru&6FbqE at B8Z}B_wL=h|Ni*#<MT_F&`b7NwuR^n
znppi0!6#kml=~Ala7*G&zIP{yKQ-J+R^V5T(It_m2A%ZmQzwd?1aNAc_86tJWJ&rp
g4Jn^>O#Zs{-^VjQ%B@{Mn*aa+07*qoM6N<$f=@6yQ~&?~

literal 0
HcmV?d00001

diff --git a/images/playlist.png b/images/playlist.png
new file mode 100644
index 0000000000000000000000000000000000000000..2574ef03c3a7032b7665312124985f9456e62b87
GIT binary patch
literal 1995
zcmV;+2Q>JJP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00001b5ch_0Itp)
z=>Px+g-Jv~RA}DqnO%%kR~5(qYoD+CG571-J9A-RpaX$~kBSs1t&|pO6XKJJkwhUV
zjitdD5+8i=#o(jS=!=bsNt4DVMvF#m8Z at MpT7*UrEHEHa=)hR!`_BEC`*FVZUOvnn
zy#se(X1H_X!>nZI=H{HN{r|1C&RKi!11#B+E!mPS*<%>}zX>{YG~4A#T1`T(CeSKF
z*ETS#PRBC7dg3Ra*6zPwZ>PBZ`=M!_-Q5)Ut3mXHrirzhj!j_nGV_YS=T5^4sbzLr
z+O};ZQz<<Ww{hmLA9zlo*a=`@Q2`DgP9{BFUkgENKv=^h*6TX218BJl&<(I*8eFrp
z8A{u>W!tuyh^LT<rx1;%5D6zBNWk at raQzZouLwK778lO{J%AXM&E{+wz at cwt|K<g1
zo1u%Uok`2Ioz_#yR3w>9ig+xAj*cWcqDcs$8;&;t*DJ!Si!6J?m?#(F2NfuusWTSo
zhGHg5ky=y$sqo~HSB_{Mk#tNGRy~SEcwPyvKZ;!G76x+#cwX at Vk<%tfL)gk7WF}!*
zDTK at vG+}|6Nh-0p007Vt&f at 0XU&HYV0C?8>Od|%%Oil?kQwW<jbUg`{VN8|^$mMgv
z$Yf4Ey<@EzNCymsK(+w at 0KA|KfMFSNm}UZ&kwD0 at 5w_B>j07|hL8+WazA%Qd!Gbe7
z{;4-Qa?vOh$5<-omSn!9Bwr$kA8p(E6o>$pioy}CJpikg?L{ow13?yw#T*L72 at KrJ
zsgcoscXVt_pR7zc4EF{UU-AR>A^Y5C2Epw&-Y66r{T%pa_6O5%dIpoIRAgHKBB4&a
z``$a1>;Jr=2 at UrMe8uzBc_LgvpkMpt>qB?v*Qp3fGWoGKl at LG}9W5eYZ1~krhwnVT
zHvtgClg&#=v|c`enF&J3mibdmuq at dY0FVGPAeF0Hwb)TCsT_pbm;t3`Z9EI{$PDUn
zZ>ctAfS{meZ9EGJh+?MhZpb!e0AS`>8_z-l0%kgX9Bs+~rY4-N at hs#mq*%?`))%LQ
z7!;_oYMD#s_5lzGV99=~N(cm|c4hzs$)H%!ni66Vh-ZJJEm8)Ue7{xC0HDC_%)r#V
zniiI=bJtD)0$53^RHCX?()l58p+#BDu>y^4x~6cV`5gz3+3~>DpV0)K(=@S_h+_nb
zP1QUPD~Um+l+i$;+6F)%C@}2-)cZ}2Oce3=;nUZbciF+Zb?d{OnJzsPio!6gdIMxs
z%SB99$DnC?{XuRK!2YA at 6`Isu6yWuwQxAcB1q`#qU2we||JOP7>BbBIUp}1qoFe+|
zvpaXic5eT?(Gg9fS{p&RHiW7(j+)z#K-M5gLo}I0x~m(GmxE<yr&{|$0lso{*%La+
zBShk5-8ADXyR$Nr$wZ^kkfxM`?=y1a`P%TvFcZ=A4vGOpr+w_&XLpCg#@h!Eyd3LU
zu at N<A45i8df}mPInaHE&j>B;$X3U+8t%V)i4#lcAZ-9fx?6{D|j{zLmwrz*DdE-_y
zW3Phe6;bta at cr_C?=?1U42R7$G);$MIo&xU)7Mw7(7(I;x!uvUoyNb1PQx_g(1Zy;
zsKD_G at ca@ye{$vlL8Kc!*}XXVrxT6>|6*PMhhE9{vZN0-Z{E<k_xUechHj$bj9 at H(
zxqjeOK+Vm;^=52iVdx#$xaMo{m9H8zpqtpfVr7rGH+mM1HvwIX0$@n#zzfPV#D^>!
zU8yaIMS5}Sz27^x`|tGmA at h5426**V7&Q%let!2e-P^amB#M*$5JE>Jl!Ycth?)+i
zJa~TT0cTnJvltxu1WE=2jTxwx)juv@{;2n*7r$VR7p|gQ9fU8dU=={uLI_(KM8nGv
zi}paH4&1zTIXH9XHP7*CZ|c?Xw@<uw$C)!gg|qw8c0BXcmKVe)_f8^Yq+po|1k!<&
zE*vk9nwx{;<!3}~d1fc1AH^Tue$)9^U-gG|00O|L-zoguu&%Bd9vS=0&K*x%namD~
zgrgwR;Q0<*r-tFdL3Qr->FS+<kA+nH$MF&O_^IFJKL!vy>>1S`TzhaL5(z`GM5Q`{
zniz+nM?oYYr3Wu4LrMphnLsSkgG8(srs%}Qk1qJ<FPwF6^p%cZJX^lmP(rFu2-I7z
zkA7#{uIi?{cLw)FqGGEMl%6_`qpD;z<kk2}vEZLP_io|CN(F9RxTp^~=i~K*$Lu%-
z#_c^X>`8BV@>!}mBXH~GB1nU2#$lOBuo4&??8l8;H=OI&`cy9G{O0^$s&9=CyVZJN
zw7P#;A3?+L at B2TOYdq)g17G^a^3@%d{F$Lg_V)I!@#BezNkR~_LaCGwMn@*(#Kc4>
z2)Hkw_fK6pH+gbsD5%v%YYmY at ePUG~jUe(N5Y5KCKX7Qf_hq`emSGPO^)j=?ibW7$
zvRn%KuV1ZQA0F`BhG;hm7mYj2CJ^$z%sdK=7y5-}T9`h|@3iPf at zi9I*bG9=0&+hT
zKWe!>mnFG2%V;LPaWn&X6v(u2g*l3wk3A~t&BV_ag6F&8d7RCXm_zi at AgUQa%QpW@
dwqy&i{{V2l*F&%q9l`(r002ovPDHLkV1mXK!g&Ay

literal 0
HcmV?d00001

diff --git a/images/plugins.png b/images/plugins.png
new file mode 100644
index 0000000000000000000000000000000000000000..da9f9e141bcdfad759dced27bbd8175818dcd45d
GIT binary patch
literal 4241
zcmV;C5N_{@P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00001b5ch_0Itp)
z=>Px_OG!jQRA}DiT4#_H*PZ{p_j-C}dcw};$OeL75lMg$L9n|Zk|g6(maRIF1h!;f
zNoSSrd?(%6#|QgLb at H9gW&6sO6;MC{S*klFk}ydI2 at os-?ZPf>VrOS(cXICOe*Nyl
zgdI>KeYmRY+E?B6UiW*ye-5(*SNU4K`Vn)2$JZGIlc^9c0(b=A2gI4ZJ2t&{wa+70
zd&9Py9{8@}biQ6(U1tShfZz~@u6cUT2%>2<yLP?oznbSsSDOHXkU4b|CzxFowMeEk
z5CW9B?50Q{5RQaKrvljjf0_Wo=t761h`L8Y2!#^>0JCg@)8#Tng8t^KO#r>>1PDxb
z6gi=#IT)po7)3g*!{IEl5<+KO?ei{50<9}H{G$L}NYZ$4&z@&}U-#akH4i#S8ZN7%
zK-W1WN&!NksyduSMT8JC>)YsWS+U^}3j7lUzkB!27x!L~1X^1+N-ZllyfEpS at jqYE
zws5tO`RTUh>y~}p`=*p=u@||Ly2e2X1!EKvrO<Q^XOR;yjOJy_HdKBk at yj2qX<fBp
ze@#u*Q;U|iR+z2U4_jBPU-xYUuy5i<(=`)bxnaSayKleq7VCuZ^>qBC3D(o6&fZzu
zFr&QGHTTaR&u7Ns)en?6HO=|wrb%-)F(&=>glnf;%oc?O!wE1#z$gWQKx176V(~bS
z#UhV4Oq_jJ<M>(8>t|2w=;-JWOO|c8N0#Z1x!2EYnm&7utP2U(PH#4OJ?@oN)y?j{
zo at 4Eo>_%HxZg^(KjOK^#xa(G{FBpfx4HUa<fMH<ETOTI7PMz)}0v}lv^ZF$%i=?WW
zYB`+Xh$qt+9tj~BNrDmrWd2ZD=0tIk0*7LO+wDQeiS~Fj5DXh2CtR+g#f#fo6@!}4
zKj;VN23$@Bb(MB(fB%DIBpAMZ&#q0|F2x22fcxezy1|;(I5;;z2oMY>U{_?^zxH<P
zr-x5YQB#Qt^XJc!qX`Wi-9zZ=@j~Mq1c1aS2na})MgCwM!B7ISNkVz41FLSn#pWFu
zwME0Bs%x&9M2AKq at CAH8R%-D?8kETx*U%_+#!lV?VB00BP-D}qgZ=#j-&?e3u1V(t
z!T<;%(76FMtz+VZT2fzM!(xdv_I=uoezzYG0HYZIIrX80<mV`%00iO*6~15$4u=C3
z73HLF(2r<b1*HUxP%uhRUsHlu$S*$q<P(p{NZ)++?C07g5zyCjY at o8HxfUSPr%jzG
zB~ob+LO=+C5CX}RhGa^EVF(P5hLKFBGr+STC?y#~E+B{&5JU+<GMPpwl7L}|Ja9%S
z%8TuA+GT8e|NUgz&{yo<@zTI$c_9l`9^13~fOlwUM7W#^C?WZgBZd-!`Lo7jX7e~m
zjAp=Qy$@sbOLG#VkSNQnXGeaXF*xm3)Kt2#bKBOq%C(LAx4(Gwvfb#`t-n#Zp at 09i
zSO1ihB?_}FWx&%hLJT3`9u6WJOXUMs4zP(804xB at a`X8+17j3s*@UKXr8s)zm>LX*
zkMEsd|L<2EiTCYz at jxgX^$fbbuq)=QYK(C|5Q?Lt+XL at tWDF3ckeLLh-3o_dJ|8eU
zp9m8xln#N!7<_?IP9WaH#*M}mXQNA&-+yyML;YJndGtZW7m8;*Qub3qfHS=#=ouIV
zKp-)SNlg`~uPsGci5-b#3XCzxCJDo%5%iz)V`w-C5CQ^Z)es=L9SK2Mi5(_p;Egxm
zh^7qDcyRmkfh$TSBqsfO&6<^ps&NQIWVoL>4FtfXrb?)39h$~*<GhLRdj0tDgYEGX
zCpu*zjI<DttyVLiH*YRlTjpD?nNWelNBfZ0cy=EYxLblqB#BAmD==kpv)tLy`S$>x
zxNH?_TlwJ3vhvcJiQ~s1kx<8sm{Je`-MwB64h3PBCA2M^jIG;tCx839=RC)bo&2$p
z(kgauf8M at l$MbSBrB2_w_rO!X{KYfz{=Rd at vc=6%Eb at 7Vol~dEawkkC3D?h=WoC?S
zz{ZXAa#IO3O_=?+t5&tO)YMebl&WR)o at Vsl?Fpj)oF7S5!{T|9 at cNc_Q%8=p?@NWl
z3;(ij^Jjg1?Ww#=K6@<CclPMs`U%%<`QnStzbY>;cg&bJo(_3J8Q)K7#>G;C`nnR7
zmpNgQWt{3d!^=7bO^r>n(@hNvLVbOQ(_d=?bLRZeWGgl%G8j`0My{2pbiE<;wkQ7K
zQJZ43K~=SUS^yCEgE5@!9K at _?^$7S!#cP}Y)FBhgoUL1bqka=pZoFx2y;-)L`1zAR
zah at 9rV|XNzNjXFYO<he1>g$S;NTku*?-uRt$761{+Xw{1Hc4V$0PUKVK0qYt<vm-U
z8<YTG>FS3*GD)<hp<$fXSU*nG)K*$5%FAhKnG1^50)H?LN;8KHxC0=BptwkZ)nZ0N
zT`4xb_)0P@^tHRTeKU9f`1qrj2U=FF-?($v{$H+Mxy&jIpsuDEXM0CcR%%0ar3-`r
zid9BURV67~y3AoVOMnmvg~GKXK7VaTXXlEp?z2?@9+dz<aDCBJ|MoM9P$qGmL*oXx
zZa`HHB$BbLkrDKr^WmI30Dxf79Y9676Fy%Eu~;ndZ2{*zv8UN9hYq*@>-X-y6%M-v
zHbusaYwPk7R#hG61_Ovhk^mu~1dtem*({-9Ts;(vZ0hOl9R~pPuDkAHl8KpRSw<)n
zM>M7)mDHf=9J+46=Z~Sg#|vQyIBb@@u~AB3SIqGFgCL9^xs)nu&z@&}2G^tUcoNY_
z3Y;7H_!0~zaJtKbcudWll?{LpKw8z2h-<Lf6cErF0Fc6Ai^X6<Cx9s$OX1WRFDL=7
zn_iE2T*aB55fA{H#-XM(NQ`BDHy}w2DOCpyBrl_QPH}Fay4nS^Yytp`j6^Ur6gtmY
z<j%^uZP`QtDg%HE0HmU#RB9w7Nj`rR=`@GUB127UaC<`F+{hFp1W3eH5JIwLV#ast
z8b^`K2|~%lOTpgSx=}LtV0led2}0o{3_~CsPGERA0>)@Q$XTs2WSK#hCCDZTvMfOe
z13f(h5P${%(pzu6#oJb_kH50{ZKJxn%3fAlM$1cz;c!?og?R<Vs6YCp07eKwG at 8V<
zlgC4FKC`v;e%GEon?e`Gd{b}Bl*yC1#UcZt1UNS^<PJe%8JAB9f!WMZUg1E0|2d3|
z`i0x$NesF at x-Z~UC}nX<P4DI-v1W*wU0vNbbakJ(&Lqq81vjP&A&RPNs?zt~dAkyc
zWVn<M`y_LSt{G6%9IY)2#qK=^eg@$2Z$-axBW0g at p1y6(DkYW5#FkNS6a>iD3>hXV
zRx{3??ZvBG-WdeMYZ~XDQ-RZ(6{r95?z7SJQi+d0dZ7nE4}jOl#C*SNWO#JPu-ALN
z!(N1VJeAK^NL~s+f1eMxu4*$MI at 11d>x%pL at 7b~GzrTt3%MQ8!W9sCIlczQ}k#Hyp
zgByrOQ(09Vldj!nMrZe#q^9dn?c4dn?=CqK_w}`>8k=TG5 at T)6&67;=xSB6k#tIaI
zw8~+%$XIgYT+ at -GC%#)dZo0K(>fBE}U7wv-LA9>lP&aAH+&6BRJ?oCY`O$q!GM*`h
zBH<(w@$`9nnoJUkiWI#0&U<Oj)hGJSw)-wC8(q3|Z7sD}yMOxFBi7N;jFIP(uAFzs
zNu;T%3{IyR?|!f=`RBa{3_|FB&b1B#CQA~VM=6<p_Z_#$Yi?~}v51OfGLsc}+#y7x
zsk~|u07WhZ!=oek<I9`-cYg5u#w$vvm*4z at 9ZOr=md=?qgAIEldC)myD<r6-Si!jZ
zQWyqDZ@(MiP!x<Yl$E*A*ieg9QbQ=1fZ1Y#(_sM!Fwhr(nzaQ2fHH#0DkpyZ?50Rh
zfB&QVcD(q~6{XWUPd~PM-`+!WXHQq`iaC=Lf#i*iV9c;1;S at Sf4na|5xEv*@D6N1H
zfTrr`KIMh3aS%c>>qXYg0Rma?liAB=Gb0p?U|?WS_7}xozv7B)_x6{*5ZvhP?&?8t
zv2uPXNDJ!SY)vaM3Qgq*_~Y;ng)urDK{%9z;38jzF~;&0opeE6%ryh0B}Hgz7{@Ck
z&L3Ve0n1jcf2gFav}wk)DTqbX49E-WTIqtkek{*tV{=)MrKL8Mm)rAYsVqwcMSUh^
zNW?TewC?*hSvEhl<fi+lUv at pP<faYHCP{kxM-Q%5gh7#3^?b`D*Y_#(9=SG3;k~fe
z!ze{%RT0b<Q@%N%r#ZMbmJ2aTAq)Y#V#T<+YSZVPr<Pl0j{n1GM+d(o0v0T|%c|Iw
z1NYpvrmU`}mc$~dd^N at hfyH8iBr!mspx2WDEam$@WBs7qx|-6Eh^1jsGT&25A)6%-
z0YHp(J9N!JV?#CZj*eQR=VFeY?$35!k_y?2i=Uo0b#m3rX;VowoIFqWT`mQsWp<R8
zJ5X9;gT*Wrs1y5AdqpZxH-igs-GG+j(9;}=coIjBe-4XXf?}8Reo+X4SR{peZ~Km7
zlISCgmpw4`qP<XS>yPc4o_c6`%MwXTbI?rg07;^76)W%s19;~5uP3;{ao?S{E0ZTS
zg6kY=N=I7d5JH?6BXZA_QJBpPvc&{LaBSOkfd9|-of_BlWAASNXy&8q*D00dWr&4U
zaBjdPOX%u3Yv`N at ghlmSv<mh09ZuIzm^ILOx_iaq1#?ZZ$pl%J;3`(I|C7V|3$MKq
zA0F<1!XNN{*wNiP<CDYf%xse7%8F7_Qs#tWH9;5|7nvi%<}kzNFk{H;#m>F^wLfm&
zqII6?I at r;1 at CWTjwr{f7N;;2x-q~ieTBXTT8mS~P_(DGX_JvpCk+8q*z(;QmW_G-|
zKt=&bOIJMb(~^>sCm(xwy;TU{`B&da3=X-Eb)Go*_~2kiAS*#OWqQkk>gvWj8Iy0c
zSS|GNhc;MBoGv62W7$MeiGnTfzOR1#>ETc~;(y0I(Dk8v;N&>~IsgtpuWg)B*4#Y*
zza}=-Pg&8r#PZy0Z$?K)Jl{Ed;GM(S_w);i_(lQ%m=?C(x30+P{FPxCMkpBkmrp<5
z@^*IZE60K*_x#=3d+uFx<Mne%JUUh)msHsC<S(9%e|BW|W4&jOevt$HrD3rcH!is2
zVMVdu>mBaD at Azliju)(J7aNI<+&Hj%^DDFFu0EcK_+wpNhkV&@L;(YGg94zDsQ=W!
z;NVKOV4fw<4MxB at M<5ik3=N(>msMS(;M=h)mEs at o-u#~cew76*vctI4R6@@k(0*j=
z2>_;o_sQ3dcqGu<?{*uEjX5~RD181P7^QwyjVH3)=LJ%@P#Rw~&o3tz(h8-K-Q>b&
zy+DODpZ{E^cf>D)W=Rqm0zBRk=v?ar5dT{BIbT%@pN%W|nKj2LmIHZ#-m`)=8Vila
z2_=bGH12ejC=ddmlwi=~(Gv0KApnsA27H|aa^qXO)0gr~eeOWD0B{aGEx1!gNcS^;
zc(K`LvkFRyP*qKMyd$!vsRsdsFOcAc>SSC3rpx|U1O62{NpmAGGJIPs8qFtRh7fT9
nBYO1E`(I=MiUL*q|9$;0dgL8G_52VO00000NkvXXu0mjf64e0c

literal 0
HcmV?d00001

diff --git a/m4/buildsys.m4 b/m4/buildsys.m4
index 6afd8c6a0fdb..6a9af41c3b6a 100644
--- a/m4/buildsys.m4
+++ b/m4/buildsys.m4
@@ -108,15 +108,15 @@ AC_DEFUN([BUILDSYS_SHARED_LIB], [
 	case "$host_os" in
 		darwin*)
 			AC_MSG_RESULT(Darwin)
-			LIB_CFLAGS='-fPIC -DPIC'
-			LIB_LDFLAGS='-dynamiclib -current_version ${LIB_MAJOR}.${LIB_MINOR} -compatibility_version ${LIB_MAJOR}'
+			LIB_CFLAGS='-fPIC -DPIC -mmacosx-version-min=10.7'
+			LIB_LDFLAGS='-dynamiclib -current_version ${LIB_MAJOR}.${LIB_MINOR} -compatibility_version ${LIB_MAJOR} -mmacosx-version-min=10.7 -install_name "${libdir}/$$(i=${SHARED_LIB}; echo $${i%${LIB_SUFFIX}}).${LIB_MAJOR}${LIB_SUFFIX}"'
 			LIB_PREFIX='lib'
 			LIB_SUFFIX='.dylib'
 			LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
-			PLUGIN_CFLAGS='-fPIC -DPIC'
-			PLUGIN_LDFLAGS='-bundle -undefined dynamic_lookup'
+			PLUGIN_CFLAGS='-fPIC -DPIC -mmacosx-version-min=10.7'
+			PLUGIN_LDFLAGS='-bundle -undefined dynamic_lookup -mmacosx-version-min=10.7'
 			PLUGIN_SUFFIX='.bundle'
-			INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && install_name_tool -id ${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
+			INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
 			UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib'
 			CLEAN_LIB=''
 			;;
diff --git a/man/audacious.1.in b/man/audacious.1.in
index 2c698894a5c9..359b2308f295 100644
--- a/man/audacious.1.in
+++ b/man/audacious.1.in
@@ -1,4 +1,4 @@
-.TH AUDACIOUS "1" "February 2014" "Version @PACKAGE_VERSION@" "Audacious"
+.TH AUDACIOUS "1" "November 2014" "Version @PACKAGE_VERSION@" "Audacious"
 
 .SH NAME
 audacious \- an advanced audio player.
@@ -84,79 +84,63 @@ Print version information and exit.
 
 .TP
 .I -V, --verbose
-Print debugging output while running.
+Print debugging output while running (may be used twice).
 
 .SH KEYBINDINGS
 .ta 24
-z	Previous song
+Control + Return	Play
 .br
-x	Play
+Space, Control + ,	Pause
 .br
-c, Space	Pause
+Control + .			Stop
 .br
-v	Stop
+Alt + Up			Previous song
 .br
-b	Next song
+Alt + Down			Next song
 .br
-Right arrow	Seek forward 5 seconds
+Right arrow			Seek forward (by default 5 seconds)
 .br
-Left arrow	Seek backward 5 seconds
+Left arrow			Seek backward (by default 5 seconds)
 .br
-Control + z	Go to beginning of playlist
+Escape				Scroll to current song
 .br
-Escape	Scroll to current song
-.br
-Control + a	Select all songs in playlist
+Control + a			Select all songs in playlist
 .br
 Shift + Control + a	Cancel selection
 .br
-+ (plus)	Increase volume 5 percent
-.br
-- (minus)	Decrease volume 5 percent
-.br
-s	Toggle shuffle
-.br
-r	Toggle repeat
-.br
-Control + n	Toggle advancing in playlist
+Control + + (plus)	Increase volume 5 percent
 .br
-Control + m	Toggle stopping after current song
+Control + - (minus)	Decrease volume 5 percent
 .br
-Control + e	Show elapsed time
+Control + s			Toggle shuffle
 .br
-Control + r	Show time remaining
+Control + r			Toggle repeat
 .br
-Alt + e	Show/hide playlist
+Control + n			Toggle advancing in playlist
 .br
-Alt + g	Show/hide equalizer
+Control + m			Toggle stopping after current song
 .br
-Control + o	Toggle windows always on top
+Control + e			Display Equalizer
 .br
-Control + s	Toggle windows on all workspaces
+Control + y			Display Search Tool
 .br
-Control + w	Toggle rolling up main window
+Control + i			Display Song Information dialog
 .br
-Control + Alt + w	Toggle rolling up equalizer
+Control + k			Display Jump to Time dialog
 .br
-Shift + Control + w	Toggle rolling up playlist
+Control + j			Display Jump to Song dialog
 .br
-i	Display Song Information dialog
+Control + p			Display Playlist Manager dialog
 .br
-Control + j	Display Jump to Time dialog
+Control + u			Display Queue Manager dialog
 .br
-j	Display Jump to Song dialog
+Control + o			Display Open Files dialog
 .br
-Control + f	Display Search dialog
+Shift + Control + o	Display Add Files dialog
 .br
-l	Display Open dialog
+Control + l			Display Open URL dialog
 .br
-f	Display Add dialog
-.br
-Control + l	Display Open Internet Address dialog
-.br
-Control + h	Display Add Internet Address dialog
-.br
-Control + p	Display Preferences dialog
+Shift + Control + l	Display Add URL dialog
 
 .SH FILES
 .TP
@@ -168,9 +152,6 @@ Default playlist usually loaded on startup.
 .TP
 ~/.local/share/audacious/Skins, @datarootdir@/audacious/Skins
 Default location(s) where Audacious should look for skin files.
-.TP
-~/.local/share/audacious/Plugins
-Location of user-installed plugins.
 .SH ENVIRONMENT
 .TP 12
 .B SKINSDIR
diff --git a/pixmaps/Makefile b/pixmaps/Makefile
deleted file mode 100644
index a4882ef284b7..000000000000
--- a/pixmaps/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-include ../buildsys.mk
-
-install-extra:
-	${MKDIR_P} ${DESTDIR}${datarootdir}/icons/hicolor/48x48/apps
-	${MKDIR_P} ${DESTDIR}${datarootdir}/icons/hicolor/scalable/apps
-	${INSTALL} -m 644 audacious.png "${DESTDIR}${datarootdir}/icons/hicolor/48x48/apps/audacious.png"
-	${INSTALL} -m 644 audacious.svg "${DESTDIR}${datarootdir}/icons/hicolor/scalable/apps/audacious.svg"
-
-uninstall-extra:
-	if test -f "${DESTDIR}${datarootdir}/icons/hicolor/48x48/apps/audacious.png" ; then ${RM} "${DESTDIR}${datarootdir}/icons/hicolor/48x48/apps/audacious.png" ; fi
-	if test -f "${DESTDIR}${datarootdir}/icons/hicolor/scalable/apps/audacious.svg" ; then ${RM} "${DESTDIR}${datarootdir}/icons/hicolor/scalable/apps/audacious.svg" ; fi
diff --git a/pixmaps/audacious.ico b/pixmaps/audacious.ico
deleted file mode 100644
index f09461061ac6018cd0b77969b8555e2605a5ed17..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 15086
zcmdU0XKYo;6~4v+Q$n##i$U1bcv+$>KPaLZ5TX|eo0wu+0L4*$gb+X|M2P``WDGVY
z>=F>H2)&E$wP}_TB22FaQY0t85^b{DWK(t%Hk0qWeseQ--psw%&xQ>noi{UQ=9HN`
z?VOqCI7v>j)1iZdILj&glH&|^949NQK7SPW_knxoomjrF<Bad*IN7L!B2d)h5k(CH
zP_Yc~6!6a&JV9Iv=nt at k7AV*OcnJ^|U|Bh!IY14}R{})y=FP>NIdjCRQ>Vn^$B$h&
zapHu?&(C+uSO-u6K&!p54Jpy3OBZqG%o*|G#S0^xK7Cqr?%Y}GRuZFr8}Z8)En0}P
zXU}?c4<9}hPoF;Z@{%X{vo2`<4PZC3U&O+N3%$CVH*Xd#TecJ(J9ZRPr%n|;dh`%8
zXU_D>7c5wy>QGC1wwE%VJ$oivw{Gp0Q&;j}dEdT$J$m*BaR7dozcKyb!2`FvwzgKJ
zr>DE+W5$dT!-o%d)0vr>9{v6M_a*&bLHh~miIZ(ScI=qw*|Vo;)~uPV=eAjv- at A8D
z;z{r7fAr{4kN)=U+v3onLt^{(?QTDifB*jdy>iwi4)7T86Q<|Ro$Hlv-MUqlyKzcN
zirBVon^(^95u at jK{~F+P{rmA-Q~r(}JH*YKH$7T at KaMfba4gF4ybI}uj-PiyBLl~N
z6~H%s*$)K6`27HNNu!3w%paAHoWC3!AI5<FY at ENJW;#w?isMu#J5EtjJ*dpov at B;`
z(vX%DAPX=W!1bvK0++4%fS&<w0sa8sw<0iI1K0;B0JH}*Rrm at R?E!GjljAEaX5IGz
z=!t{_zxxjX?mR>sCeu_-J$?+(*HxebLmEmi157*<!Ep|x21@*2A;;<O0C94-?#-Jw
zPwd^hS6sb%)!PTIT)E=nIRE9kXrQkHj%#{QNJrss06y8Nsi|V+%9Y~LqetF)A=f-T
z=KjFCq|x~x|7!qcm;%3dHNZzVVZsD&4cBD_<+<*UA3xs5E5`d8V$*nV_bXNY;>C-_
z^XJb)+icT=wA}wxp0RW>Vl{jf8Sa~2UG7iZvuwPh;>knqbqfE_knRnTVJ{M%Y>u<L
zckdcyvrQK-UKBTO+%T4#^tyBBj_A~>lgB?MYj;d|8^pdjzHZ$*Bk%qD_lxe`ySse2
zS52EXO_Y|FiamSwh#50xh^}3`iir~^ikh05IQpWZB3(ZB=+=O_0Iw_~Bg5G5J9qB%
z?fWW?p61y`?+1Pd^498p19`5k9)AA(`Ej)5#dCsMFDN~D at L(ekt{ocPPm$-o;o-Tq
z=(=-GCnY6$by%NgAfDHzPoM6?vy5_d9?bJQsj`s%C4hUehp(!tilbG|WnR4w9XhyY
zLQ@&n43qrI%1VzuCi9Po|E0>8=S7{KJk@$k_v+P4 at cgLb2M!!)lyA`WQ_ylQdOXzg
zrm6$y<A4DJym~5)p61+8X=U0XKeYcPJ;y;|VWG&*&KAkZ$yQx>&XzQ4%x|md%KpEj
z;!NXD<ss9Y<GXh4a_78C&-BotLyhtc<BwzCH~%=Mr3^jZy?eK7Z!KTG+}-1rEnDWD
z<5eBlM>;L at ihU#df%DI|{?Jylt@|uf<(Sg63975B<K)w3Q*1oRhwBf|mA<px#*G`}
z=&AqGrAsB9F(&^52M!o%H*DCT)BFQ+<vG>2|8TD`?LXXmxDKyau|h0bv`CB^HA;*e
zInuR@%gV~clP6D%vbp~l&PDG*z6^2u at 8rpo8@2b#?@yg4O`4>)owg~@)oOU1=Z_7l
z;8?mH;$H!Ly1s(**FDJKo^J|$fTS(s(}8Pjd3m|J-phWq#q<-fu4!Ec-`@ke0)oQV
zQOI at 4rvvlq`TNqPORoJ)8=7gZTOsFf%I4WVO5k{`1;pu)AddE;KHh)|3|~g+cEC$O
zqI&R5OJ77QK%(Jo5bg)~)+pqIbYflF$!`IgDwyo=kHDOeu>CDQZZAYpl0ahwIywgj
zg3OPxF4j3tO10x86N=zMkl=&_S&wmbjJ^)M$dkM&<3F&8U73)b?Z8J0SOjPyKLt2h
z18u)NKq;USz&XKlxcrt(6UVZxfLuTt;EN2j+Y14|0DKORx<-vj^K-zr031WFD`Y?r
z`_N}wAs<z5Q$6x30feogsFHAK2FeA1KLJcSGzE^lDTA__GI0Om{?-&aM&WT6vQ#_1
zF>RR+;=jB`-DUf*G&xfmqc~^_06seodCA`w(+20A$(Ai!1byM$zj;RExq)fkH<Xl=
zh`hW!(|Os)OOf#z((?d`gk>PI at pbXEwWds&A`Tur*q}2h+q7 at rKEX4bdS_vghi$?6
zW&;~A4fTC~E1ma<5hH}jrnjBnZ1{?b3fHdF`D=OVG8qshWTKLFjcL`Ym7vXH(<c!;
z#~J-lyaR)58+?ee9w7~&uk at jfM_O8%JGK+iF$xXmh{eAv+r%}{<YSf1`o2wf`gJZ`
zxX`5iZfX-{P?k*(;J+)C)#7f*yLXF-ee|@wj~_q&%5|6R;e8=x>UzZTJWHAOX`Ts;
zG&Z|m%6k>@`t|FLy2NxWMyv+h;5+mi#L)~JHY{?#U%!6cy#qab_;6$zTiZFO2Mrn&
zr%z1Bza#Dlkl{N>#MR~c9%YTZcI}!NJ$kfnEvK)sxVTu*$3Y$GJL29(ooEB|4uor`
zO at HF)7Y*>|@$4%@4H9ws)At_4pJnvhv~Alqj#l#H{=~i6;HMGo+O-pxFJBIn!Mgy-
zON(zH&(ImbJua at EdPi?+$GLOo<lBZgS`$AL&gR#b@{SxiV&hHwfi_USi7$Q7l7}tM
z&CRv(j*PeY)K!@lp9^Ksjw?6mUr<mGs6WSZ`}XZ4>uHif+}gEk1Ld$C%KHgjUKw~)
zn0Tx2FVwz}Y5J*6bP`8jHNQRmN2aka>+wt~dD>$AeTbw*d;#!VCGY7J^e%{U!u03;
zo788?k|iErUDm2qtGs%$z8>>DuG7Wx^h^HPRCeputw6rKvj|#u#*G{2p7~FnJSn)A
znq&~iv7zg$=V?D!=y|3y+9#&BR65^Hn>N|_M#hgFJ2q5*zALln57&|Zo=Vn>qCeXc
zFt=<neR!V7x!3A_qvq-VmwIV2?X!f&kK|9;t5>fM+9z$YT|D2eNnW-%VEoWdG0xxf
z=g)`oRps#w8^6VnAwxu)Hf;iRR{O9|pFW{-xR$6iN}BVxO38cm!q!h!cRkHB5AS{W
z-h?)fiND0re%9&re8Bq2wcogZ1>G0w{DbnQ`(>#+<27s6gz9g&-<N&D{fj;lnfGG8
z!3>*M)SLS-&k^kB-o1MZp0_0g?E9XaFuRC4bnDj5tFP%g2l?(A&a2Bel|g;WGQN4V
z(TCyt_3IbfNA%4E at X0_KgV8q_Wo+{98T1VXuA6*k8P-3%@3ipe-H{ANyPaqEFq at s<
zch;;~HW@}dZ5Z|Kv8 at eU0|We9-;>HCw%U(5IXR(y#5QofnLT^9;C^a)kHI^7zW<5(
zj)86BJvMYRfo?ytDeqe9ibU*puAzKCNRT$9t)ET!5c{2LrXJpO{|VdkBY^39xjv<^
zxnSzYhT<aluYRC+yppH?@R6+z{|ElV2hc6Zf5 at ir+LHIY#_#Y2`fsTd-w;Fz`KUzu
z-q;4>U$g%l*Te4pETYKa+o);PpJnp?BFxWXngiTd8*qQYJJv+PN)Q=+L%{pm#{Zk}
z%*V5$yg!ovXOQ<t^uN)sk(HI at qt$sSdCKPA+L-Vr-`~l0zsdKfvJEYfC<0j5CX_`T
z7q)uzfl~%$y{f=7EAI+E0oe3tD4x7Z0H%8hpkGNy1=lz6{f4PC(t*qalmhrhhHqs)
z(ttRY@!RDBn&kbA5Opc;BPD!sH-<-uFP{Z&@9CWt)p%^gxCrlv7(+0BxUlgbINVsA
z9Q-$mai-(&(x0zCWn9O6O8p-|@V8F)k05GX#PX#2L9fO{H)SXyGlQIJ;thJ$5f8m(
jJ7g@|Dcddk0bSzui`P%pv3{!q8x#uJuS~m8-|zngsu1%D

diff --git a/pixmaps/audacious.png b/pixmaps/audacious.png
deleted file mode 100644
index 5de1b7f5da8c0124c6e95a485315aad53b363c01..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1788
zcmV<Y1_SwtP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00001b5ch_0Itp)
z=>Px*wn;=mRA}DSnrlpxR~W~CEjWWRl&VM(!K$oFsMXRroS at lg#A!n2<|QUBMEszc
zkz~YOl0h`_f}eDAV_RaPMs39lL^JwD7N at aBY$#Q<%a~}%<RVUF4vL_&un)dvTHi~t
zg>6rAzV!c`^ZuW6doHIcA|qPhZQw0H4@?Ip0I>q at 1MUM};1|FNoCDhV7i9vl38)1I
zUb58+V`xT_crx%6&=Usn;N}Cq1f~op at mGM)BTPKFbpxLPqasaS54eYscyMzAX^|qo
zT$q`G5pI71?<<j0Dc~D`Z-FSKfu>EH#=?aQ$;ik+r_-U;Y8g9rEC4+{J+!s8;q`iP
zxm-9L4w{>rLzz53uo2kzG6sAEd?z=0R8$m8mo8<^nl+eArjVC(U|;~3%Z1fyrMkMB
z{{DWYE*pXGhho4oph9luv$L})DJemx(}lG^Z{EDgjvYIwsi{#~i4TAuLNP!OxSnxB
z&q+*73?(HctXQ!kqPN8H<Hy;#b0?1;J(5!C2HpT}$Qdw7a4xgOMwmEpBK!93BRxHR
zSng?$$HRsV8|dihkW#q<WCDK$eozM~Y?dOg(P*&QY{Nz#z+f<7wOY|=BptH}_*iNM
zl7U}=F=E^1 at ZrN4jm8mi_4W1j<mczp*ViWo`vf1+PS7FU1}qTkv1Q8^EEda<Nc8sh
z(%#-qS63G*m5R}$M~B=uF)@+&_;}8rKQ9##L;+`>U4e<fZ(_4QfBt+99z3XcE!ypN
zYHDie?ChkYqXUn}!@$76piV+U0`un0W7)E0WMyTAWJrE~K2E1o4C(<=f%^di3W2YK
zwbW`gcDtP!GiJz=FD@>ova&Md88(?rY~Q|}w6rwED>g4LPs&de0%d_ioG+%4o0}_3
z9^k at -3qv9gaOKJsR<B--$K#RJn>lkPixw at Cf<Fx0LW#otD!PP9B6DxciqGexxVZSa
zZ8k&>ZvqKwAV&;MO-&^uBSVph#bROk^5w+E#W8j2RMOMa2iue>^5K0$Lj(2o^|Cr<
zvzg at NWT_}3CmNV16)LDyDn$dLqM|4*Ev2-yR1_~PETp=+TC%^}?PkuLInvRlO2vW&
z3n(uy7lSj^z-wYiD6=mm4<A0{%$YNkm6cIjTPv%3?b<cP at yuqkWS$ZY%#=DnLv=n?
zRaG=JG~n at g=<V$dsb6DbqoR%sm$Yc9ggPlHDdf<2|Ni~#*|P_~-#_HlYHe**E_rCR
zQc!#}Fjgw+3`MqW+s4tOM~5}E2qZ=#@~S$Vfh#I1!X}@YnHg4pwcwUTV;MPl{P;1u
zcI}eHb8~a4tgNJ>qCz%Xli42s#0@<?k~xAJ=oCZl+_|IZz<fTRB))j at VhjcYvu4eb
zyG24eYcgE^hz1&g7vcr4*Na}Sf9a(?apD9iDJk^z^>OOdDcQ(VNp9V`B?a9G81QZ|
zQdd{Uk|j$d2OTqJ3~_OBbai!!;!dZNl`B^&l6&yrfufGv?Upn^4O|jKE?&H-=z()`
za>Bl0TrQWQj>F-Qf-b88(X64VsfnvsugVU*ZrwUYjS8;{IBC)(#mM#c?c1U*2>3}Y
zq-LW2-fFeV*BkYE_U_$FY;3ITN@=xP;^X6Az{ZasPeDO}>^E#Sn-t^(?ggT?O~5x|
zAGh1>OrJho_9HDVEo|Mol}nc{4JIEZlZjQUR$;MN7&mSle!ripswz&NJV{$y8%Cp%
z&6_uql9D2Oc=Ph|q&)m4;M;%!6M)-dDP>kx76%R-2x&Xqy?Ym@(}`BAW$xU$VV{q+
zYu8E at yarRsKvLfeOcD#No12 at NJb7|R<&@aiSoC_mVjd8R96NT5BS(%%!DYbd;IhgT
zph2u67ZVf1p+kq5J$v?lx~$SI)F59-LZ3W&!r8NDu~;mkhcS}U)YL>lK>^*}-BK!F
z06)r=7M(%`Y{W~8*RNk^{rdHEc6Lgs)baEoaj>))Tz&56>FeQIV6<4Kb^7#aG#U*C
zgCU~i%gf6tDk_qTueyL-;JL!7So!=u at H4PVq;`tm at 8{gPbGY4Zj7DSFTdJ|Kk)om^
zY&M%*LgWWl12tlqy_Ec~A2<TCUNA!Oi77QTmF(<n%w{t>osOiWr01TPT3cK3dcD-u
z)!}eBXlZE)#a6{9rcmTPo<6w!8;^W>kvd~({EwempS at x~Wq6-lyMa%D=;8D=iNJ2b
zBS!MC2D^o^M@%$AM0i>7A44VGFC<f8{n<kmA!8DNcZ6W at bwDQshtK}q<{r=_#9K8&
eBK3Q?AO0KkpBN at ZJrQC60000<MNUMnLSTX*pHCkE

diff --git a/pixmaps/audacious.svg b/pixmaps/audacious.svg
deleted file mode 100644
index 2f77cf2362fd..000000000000
--- a/pixmaps/audacious.svg
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="96"
-   height="96"
-   id="svg1306"
-   sodipodi:version="0.32"
-   inkscape:version="0.47pre4 r22446"
-   sodipodi:docname="Audacious-icon-2.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.1">
-  <defs
-     id="defs1308">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 32 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="64 : 32 : 1"
-       inkscape:persp3d-origin="32 : 21.333333 : 1"
-       id="perspective2880" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="4"
-     inkscape:cx="42"
-     inkscape:cy="47.647849"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:document-units="px"
-     inkscape:grid-bbox="true"
-     inkscape:window-width="1024"
-     inkscape:window-height="713"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1" />
-  <metadata
-     id="metadata1311">
-    <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></dc:title>
-        <dc:creator>
-          <cc:Agent>
-            <dc:title>nhjm449</dc:title>
-          </cc:Agent>
-        </dc:creator>
-        <dc:description>Font: Circulate BRK</dc:description>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="bg"
-     transform="translate(2.5e-7,31.999998)">
-    <path
-       sodipodi:type="arc"
-       style="fill:#000000;fill-opacity:1;stroke:none"
-       id="path3654"
-       sodipodi:cx="32.375"
-       sodipodi:cy="32.75"
-       sodipodi:rx="26.125"
-       sodipodi:ry="28.5"
-       d="m 58.5,32.75 c 0,15.740115 -11.696561,28.5 -26.125,28.5 C 17.946561,61.25 6.25,48.490115 6.25,32.75 6.25,17.009885 17.946561,4.25 32.375,4.25 46.803439,4.25 58.5,17.009885 58.5,32.75 z"
-       transform="matrix(1.8373206,0,0,1.6842105,-11.483254,-39.157893)" />
-  </g>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     transform="translate(2.5e-7,31.999998)">
-    <path
-       style="font-size:56px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#d9d9d9;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Circulate BRK"
-       d="m 12,16.000002 c 3e-6,5.008143 0.94309,9.691064 2.829268,14.04878 1.886178,4.357723 4.455281,8.162598 7.707317,11.414635 3.252021,3.252021 7.056896,5.821125 11.414635,7.707317 4.3577,1.886162 9.040621,2.829251 14.04878,2.829268 4.943051,-1.7e-5 9.593453,-0.943106 13.95122,-2.829268 4.422712,-1.886192 8.260108,-4.455296 11.512195,-7.707317 3.25197,-3.252037 5.821073,-7.056912 7.707317,-11.414635 C 83.056843,25.691066 83.99993,21.008145 84,16.000002 83.99993,11.056936 83.056843,6.406533 81.170732,2.048782 79.284488,-2.373946 76.715385,-6.21134 73.463415,-9.463413 70.211328,-12.715399 66.373932,-15.284501 61.95122,-17.17073 57.593453,-19.056855 52.943051,-19.999944 48,-19.999998 c -5.008159,5.4e-5 -9.69108,0.943143 -14.04878,2.829268 -4.357739,1.886229 -8.162614,4.455331 -11.414635,7.707317 C 19.284549,-6.21134 16.715446,-2.373946 14.829268,2.048782 12.94309,6.406533 12.000003,11.056936 12,16.000002"
-       id="path2167" />
-    <path
-       style="font-size:56px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Circulate BRK"
-       d="M 48.878049,7.414636 C 48.878014,6.829296 48.617852,6.374012 48.097561,6.048782 47.577204,5.723607 47.024359,5.561005 46.439024,5.560978 l -6.731707,0 c -0.390268,0.130104 -0.813031,0.22767 -1.268293,0.292683 -0.455308,0.06507 -0.878071,0.09759 -1.268292,0.09756 C 36.130059,5.951248 35.186972,5.593525 34.341463,4.87805 33.560956,4.097592 33.170713,3.187024 33.170732,2.146342 33.170713,1.69109 33.235752,1.268327 33.365854,0.87805 33.560956,0.487839 33.756078,0.130116 33.95122,-0.195121 L 36,-2.2439 c 0.520303,-0.455248 1.073148,-0.715412 1.658537,-0.780488 0.650383,-0.130035 1.268268,-0.227605 1.853658,-0.292683 0.260138,-0.065 0.812983,-0.09753 1.658537,-0.09756 0.910542,-0.065 1.528427,-0.09753 1.853658,-0.09756 0.8455,-0.455248 1.788587,-0.682889 2.829269,-0.682927 1.105658,-0.065 2.113787,-0.09753 3.02439,-0.09756 1.756061,3.8e-5 3.577198,0.2602 5.463414,0.780488 1.951178,0.585402 3.577194,1.268329 4.878049,2.04878 1.365809,0.715481 2.471498,1.59353 3.317073,2.634147 0.845479,1.040681 1.495885,2.308974 1.95122,3.804878 0.455235,1.430921 0.812958,3.154496 1.073171,5.170731 0.130034,0.715471 0.22759,1.430917 0.292683,2.146342 0.130034,0.715469 0.195071,1.430915 0.195121,2.146341 -5e-5,0.520344 -0.09761,1.008148 -0.292682,1.463415 -0.195173,0.390261 -0.357774,0.813024 -0.487805,1.268293 -5.1e-5,0.06505 -5.1e-5,0.227658 0,0.487805 -5.1e-5,0.260177 -0.03258,0.55286 -0.09756,0.878048 -5.1e-5,0.260178 -5.1e-5,0.52034 0,0.780488 -5.1e-5,0.195136 -5.1e-5,0.325218 0,0.390244 -0.130122,0.71546 -0.260213,1.430908 -0.390244,2.146342 -0.06509,0.715458 -0.09761,1.430904 -0.09756,2.146341 l 0,0.292683 c 0.06498,0.260172 0.195071,0.747976 0.390244,1.463415 0.195071,0.715454 0.325153,1.203259 0.390244,1.463414 l 0,0.585366 c -5.1e-5,0.780493 -0.195173,1.52846 -0.585366,2.243902 -0.390293,0.71545 -0.910619,1.365856 -1.560976,1.95122 -0.650455,0.585368 -1.365901,1.040652 -2.146341,1.365854 -0.715493,0.325203 -1.46346,0.487805 -2.243903,0.487805 -1.040693,0 -2.048822,-0.227643 -3.02439,-0.682927 -0.97565,-0.520324 -1.918739,-0.975608 -2.829268,-1.365854 -0.130122,-0.06504 -0.390282,-0.09756 -0.780488,-0.09756 -0.32524,2e-6 -0.552882,2e-6 -0.682927,0 -1.235808,2e-6 -2.439059,0.227645 -3.609756,0.682927 -1.105723,0.390246 -2.211413,0.813009 -3.317073,1.268293 -0.130105,0.06503 -0.455314,0.227642 -0.97561,0.487804 -0.455314,0.260162 -0.747995,0.422764 -0.878049,0.487805 -0.26019,0.130087 -0.455312,0.162596 -0.585366,0.09756 -0.130104,-1e-6 -0.35775,-1e-6 -0.682926,0 l -0.780488,0 c -0.325228,-0.06504 -0.975634,-0.260163 -1.95122,-0.585366 -0.910592,-0.325203 -1.528477,-0.552844 -1.853658,-0.682926 -0.06507,0 -0.195145,-0.03253 -0.390244,-0.09756 -0.130105,-0.06504 -0.195143,-0.130087 -0.195122,-0.195122 -1.040671,-0.715446 -2.146361,-1.528453 -3.317073,-2.439025 -1.105708,-0.975606 -1.853674,-2.113815 -2.243903,-3.414634 -0.130104,-0.455277 -0.325219,-1.073164 -0.585366,-1.853658 -0.260177,-0.84552 -0.390259,-1.268283 -0.390243,-1.268293 l 0,-4.878049 c -1.6e-5,-0.06504 0.06502,-0.260148 0.195121,-0.585366 0.195107,-0.325188 0.357708,-0.552829 0.487805,-0.682927 0.715431,-1.300796 1.625999,-2.504047 2.731708,-3.609756 1.170712,-1.17071 2.406482,-2.14632 3.707317,-2.926829 0.910545,-0.520303 1.853634,-0.780465 2.829268,-0.780488 0.975584,-0.06502 1.918673,-0.260139 2.829268,-0.585366 0.130053,-0.06502 0.390216,-0.162578 0.780488,-0.292682 0.455256,-0.195098 0.747939,-0.32518 0.878049,-0.390244 0.260132,-0.130053 0.650376,-0.195098 1.170732,-0.195122 0.520294,-0.06502 1.040618,-0.130053 1.560975,-0.195122 0.520293,-0.130053 0.943056,-0.292659 1.268293,-0.487805 0.390211,-0.260138 0.585331,-0.65038 0.585366,-1.170732"
-       id="path2165" />
-    <path
-       style="font-size:56px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#d9d9d9;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Circulate BRK"
-       d="m 44.585366,20.878051 c -3e-5,1.040662 0.325172,1.788629 0.97561,2.243902 0.650374,0.390255 1.430862,0.585377 2.341463,0.585366 l 1.073171,0 c 0.195087,1.1e-5 0.292648,-0.06504 0.292683,-0.195122 0.130052,-0.13007 0.357688,-0.357712 0.682927,-0.682927 0.390209,-0.325191 0.650371,-0.552834 0.780487,-0.682927 0.130053,-0.195109 0.195086,-0.455271 0.195122,-0.780487 -3.6e-5,-0.32519 -3.6e-5,-0.585354 0,-0.780488 l 0,-0.97561 c -0.06508,-0.195108 -0.227677,-0.422749 -0.487805,-0.682927 -0.195156,-0.325188 -0.422799,-0.487789 -0.682926,-0.487805 l -3.609757,0 c -0.520355,1.6e-5 -0.910599,0.325218 -1.170731,0.97561 -0.260192,0.58538 -0.390274,1.073185 -0.390244,1.463415"
-       id="text1314" />
-  </g>
-</svg>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index f4b72245b16d..9cae71412991 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,27 +1,40 @@
 # Please don't update this file manually - use ./update-potfiles.sh instead!
-src/audacious/adder.c
-src/audacious/interface.c
-src/audacious/main.c
-src/audacious/playback.c
-src/audacious/playlist-files.c
-src/audacious/playlist-new.c
-src/audacious/plugin-preferences.c
-src/audacious/plugin-view.c
-src/audacious/ui_plugin_menu.c
-src/audacious/ui_preferences.c
-src/audacious/util.c
-src/libaudcore/audstrings.c
-src/libaudcore/tuple.c
-src/libaudgui/about.c
-src/libaudgui/confirm.c
-src/libaudgui/equalizer.c
-src/libaudgui/infopopup.c
-src/libaudgui/infowin.c
-src/libaudgui/jump-to-time.c
-src/libaudgui/playlists.c
-src/libaudgui/queue-manager.c
-src/libaudgui/ui_fileopener.c
-src/libaudgui/ui_jumptotrack.c
-src/libaudgui/ui_playlist_manager.c
-src/libaudgui/url-opener.c
-src/libaudgui/util.c
+src/audacious/main.cc
+src/libaudcore/adder.cc
+src/libaudcore/audstrings.cc
+src/libaudcore/playback.cc
+src/libaudcore/playlist.cc
+src/libaudcore/playlist-files.cc
+src/libaudcore/probe.cc
+src/libaudcore/tuple.cc
+src/libaudcore/vfs.cc
+src/libaudcore/vfs_local.cc
+src/libaudgui/about.cc
+src/libaudgui/confirm.cc
+src/libaudgui/equalizer.cc
+src/libaudgui/file-opener.cc
+src/libaudgui/infopopup.cc
+src/libaudgui/infowin.cc
+src/libaudgui/jump-to-time.cc
+src/libaudgui/jump-to-track.cc
+src/libaudgui/playlists.cc
+src/libaudgui/plugin-menu.cc
+src/libaudgui/plugin-prefs.cc
+src/libaudgui/plugin-view.cc
+src/libaudgui/prefs-window.cc
+src/libaudgui/queue-manager.cc
+src/libaudgui/status.cc
+src/libaudgui/url-opener.cc
+src/libaudgui/util.cc
+src/libaudqt/about.cc
+src/libaudqt/equalizer.cc
+src/libaudqt/fileopener.cc
+src/libaudqt/info-widget.cc
+src/libaudqt/infowin.cc
+src/libaudqt/log-inspector.cc
+src/libaudqt/playlist-management.cc
+src/libaudqt/plugin-menu.cc
+src/libaudqt/prefs-plugin.cc
+src/libaudqt/prefs-window.cc
+src/libaudqt/queue-manager.cc
+src/libaudqt/util.cc
diff --git a/po/ast.po b/po/ast.po
index 031812444349..89125b6812e3 100644
--- a/po/ast.po
+++ b/po/ast.po
@@ -8,9 +8,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Asturian (http://www.transifex.com/projects/p/audacious/"
 "language/ast/)\n"
 "Language: ast\n"
@@ -19,131 +19,135 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Guetando ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Alcontróse %d ficheru"
-msgstr[1] "Alcontráronse %d ficheros"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Llista de reproducción nueva"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Amosar versión"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Posar si se ta reproduciendo, o reproducir"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Amestar ficheros a la llista de reproducción"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Amosar la ventana principal"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Colar al parar la reproducción"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Ver mensaxes de depuración"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Nun s'alcontró decodificador pa %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Alcontróse %d ficheru"
+msgstr[1] "Alcontráronse %d ficheros"
 
-#: src/audacious/playback.c:387
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Llista de reproducción nueva"
+
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "%s could not be opened."
+msgid "Audio CD, track %s"
+msgstr "CD de soníu, pista %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
 msgstr ""
 
-#: src/audacious/playlist-files.c:95
-#, c-format
-msgid "Cannot load %s: unsupported file extension."
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "En reproducción"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -151,887 +155,1051 @@ msgstr ""
 "La llista de reproducción nun pue ordenase porque ta executandose la gueta "
 "de metadatos (o ta desactivada)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
+
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Estéreo"
+
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d canal"
+msgstr[1] "%d canales"
+
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
 msgstr ""
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Audio"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Rede"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Llista de reproducción"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Créditos:"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Info de canción"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Llicencia"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Complementos"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Tocante a Audacious"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Xeneral"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efeutu"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualización"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Entrada"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Tresporte"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artista"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Álbum"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Renomar la llista de reproducción"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Títulu"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Númberu de pista"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "A_ctivar"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Xéneru"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nome de ficheru"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Camín hasta'l ficheru"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Data"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Añu"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Comentariu"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codec (formatu)"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Calidá"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "dengún"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "árabe"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Bálticu"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ecualizador"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "chinu"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamplificación"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "griegu"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Abrir ficheros"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "hebréu"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "xaponés"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "coreanu"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Amestar ficheros..."
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polacu:"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "rusu"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "taiwanés"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "turcu"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Títulu"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Coma flotante"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artista"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr ""
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Álbum"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr ""
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Xéneru"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Complementu de salida:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Añu"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Preferencies de salida</b>"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Pista"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Fondura de bit:"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Llonxitú"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Tamañu del búfer:"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Usar control de volume por software (nun se recomienda)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Jazz ácedu"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Ganancia de reproducción</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Rock ácidu"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Activar Replay Gain"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Mou álbum"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Evitar saltos (recomendao)"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Axustar niveles</b>"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplificar tolos ficheros:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Música de cámara"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "Clásica"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplificar ficheros ensin etiqueta:"
+#: src/libaudgui/infowin.cc:91
+msgid "Country"
+msgstr "Country"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Sirvidor proxy:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Puertu del proxy:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Nome d'usuariu del proxy:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Contraseña del proxy:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Configuración del Proxy</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Activar l'usu del proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Usar autenticación col proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Deteutor de codificáu automáticu de carauteres pa: "
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Códigu de carauteres de fallback:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Comportamientu</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Continuar la reproducción al aniciase"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Avanzar al desaniciar la canción actual"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Llimpiar la llista de reproducción al abrir ficheros"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Abrir ficheros nuna llista temporal"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Nun cargar los metadatos de les canciones fasta que se reproduzan"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibilidá</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Portada d'álbum</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Guetar imaxes que casen con estes pallabres (separaes por comes):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Saltar les imaxes que casen con estes pallabres (separaes por comes):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Guetar imaxes que casen col títutlu de la canción"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Gueta recursiva"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Profundidá de la gueta:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Información emerxente</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TÍTULU"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTISTA - TÍTULU"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTISTA - ÁLBUM - TÍTULU"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTISTA - ÁLBUM - PISTA. TÍTULU"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTISTA [ ÁLBUM ] - PISTA. TÍTULU"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ÁLBUM - TÍTULU"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Categoría"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Personalizada"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Visualización de les canciones</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Amosar númberos de canción"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Ver los ceros del principiu (02:00 en llugar de 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Formatu del títulu:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Cadena personalizada:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Nun pudo crease'l direutoriu (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "CD de soníu, pista %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Estéreo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d canal"
-msgstr[1] "%d canales"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Créditos:"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Llicencia"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Tocante a Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Renomar la llista de reproducción"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "A_ctivar"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ecualizador"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamplificación"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Pista"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Llonxitú"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Jazz ácedu"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Rock ácidu"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Música de cámara"
-
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "Clásica"
-
-#: src/libaudgui/infowin.c:84
-msgid "Country"
-msgstr "Country"
-
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Discu"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Escucha fácil"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folclore"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Ruiu"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Rock Punk"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
-msgid "Track Number"
-msgstr ""
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Info de canción"
 
-#: src/libaudgui/infowin.c:367
-msgid "_Save"
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
-#, c-format
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Comentariu"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
+msgid "Track Number"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
+msgid "_Save"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
+#, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Nun hai info disponible pa %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Saltar nel tiempu"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Escriba'l tiempu (minutos:segundos):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "¿Sobrescribir %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Cola"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "_Quitar de la Cola"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Saltar a canción"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Peñera:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "P_eñera:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "¿Sobrescribir %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Esportar llista de reproducción"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importar llista de reproducción"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Alministrador de la cola"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Abrir ficheros"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Amestar ficheros..."
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audio"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Rede"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Llista de reproducción"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Complementos"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Xeneral"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efeutu"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualización"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Entrada"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Tresporte"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Cola"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "_Quitar de la Cola"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Saltar a canción"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Data"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Peñera:"
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codec (formatu)"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "P_eñera:"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Calidá"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "dengún"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "árabe"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Bálticu"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "chinu"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "griegu"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "hebréu"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "xaponés"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "coreanu"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polacu:"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "rusu"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "taiwanés"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "turcu"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Coma flotante"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Complementu de salida:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Preferencies de salida</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Fondura de bit:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Tamañu del búfer:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Usar control de volume por software (nun se recomienda)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Ganancia de reproducción</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Activar Replay Gain"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Mou álbum"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Evitar saltos (recomendao)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Axustar niveles</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplificar tolos ficheros:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplificar ficheros ensin etiqueta:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Sirvidor proxy:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Puertu del proxy:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Nome d'usuariu del proxy:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Contraseña del proxy:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Configuración del Proxy</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Activar l'usu del proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Usar autenticación col proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Deteutor de codificáu automáticu de carauteres pa: "
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Códigu de carauteres de fallback:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Comportamientu</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Avanzar al desaniciar la canción actual"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Llimpiar la llista de reproducción al abrir ficheros"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Abrir ficheros nuna llista temporal"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibilidá</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Alministrador de la llista de reproducción"
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Visualización de les canciones</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Amosar númberos de canción"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Ver los ceros del principiu (02:00 en llugar de 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Entraess"
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Nun cargar los metadatos de les canciones fasta que se reproduzan"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Portada d'álbum</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Guetar imaxes que casen con estes pallabres (separaes por comes):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Saltar les imaxes que casen con estes pallabres (separaes por comes):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Guetar imaxes que casen col títutlu de la canción"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Gueta recursiva"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Profundidá de la gueta:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Información emerxente</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Zarrar diálogu al activar llista de reproducción"
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TÍTULU"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTISTA - TÍTULU"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTISTA - ÁLBUM - TÍTULU"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTISTA - ÁLBUM - PISTA. TÍTULU"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTISTA [ ÁLBUM ] - PISTA. TÍTULU"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ÁLBUM - TÍTULU"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Categoría"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Personalizada"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Formatu del títulu:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Cadena personalizada:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr ""
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Alministrador de la cola"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr ""
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Abrir URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Amestar URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Escriba la URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Otros mensaxes tan anubríos.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Nun hai info disponible pa %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nome de ficheru"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/audacious.pot b/po/audacious.pot
index a3d616bfbc5c..3de8c353f5d3 100644
--- a/po/audacious.pot
+++ b/po/audacious.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 16:13+0200\n"
+"POT-Creation-Date: 2015-04-03 11:51+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -18,1015 +18,1183 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr ""
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr ""
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr ""
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr ""
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr ""
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr ""
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr ""
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
 msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr ""
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
 msgstr ""
 
-#: src/audacious/playback.c:387
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "%s could not be opened."
+msgid "Audio CD, track %s"
 msgstr ""
 
-#: src/audacious/playlist-files.c:95
-#, c-format
-msgid "Cannot load %s: unsupported file extension."
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr ""
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr ""
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
 msgstr ""
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
 msgstr ""
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] ""
+msgstr[1] ""
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
+#: src/libaudgui/infowin.cc:91
+msgid "Country"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
+#: src/libaudgui/infowin.cc:92
+msgid "Death Metal"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
+#: src/libaudgui/infowin.cc:93
+msgid "Disco"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
+#: src/libaudgui/infowin.cc:94
+msgid "Easy Listening"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
+#: src/libaudgui/infowin.cc:95
+msgid "Folk"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
+#: src/libaudgui/infowin.cc:96
+msgid "Funk"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
+#: src/libaudgui/infowin.cc:97
+msgid "Gangsta Rap"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
+#: src/libaudgui/infowin.cc:98
+msgid "Gospel"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
+#: src/libaudgui/infowin.cc:99
+msgid "Grunge"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
+#: src/libaudgui/infowin.cc:100
+msgid "Hard Rock"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
+#: src/libaudgui/infowin.cc:101
+msgid "Heavy Metal"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
+#: src/libaudgui/infowin.cc:102
+msgid "Hip-hop"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
+#: src/libaudgui/infowin.cc:103
+msgid "House"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
+#: src/libaudgui/infowin.cc:104
+msgid "Jazz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
+#: src/libaudgui/infowin.cc:105
+msgid "Jungle"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
+#: src/libaudgui/infowin.cc:106
+msgid "Metal"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
+#: src/libaudgui/infowin.cc:107
+msgid "New Age"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
+#: src/libaudgui/infowin.cc:108
+msgid "New Wave"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
+#: src/libaudgui/infowin.cc:109
+msgid "Noise"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
+#: src/libaudgui/infowin.cc:110
+msgid "Pop"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
+#: src/libaudgui/infowin.cc:111
+msgid "Punk Rock"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
+#: src/libaudgui/infowin.cc:112
+msgid "Rap"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
+#: src/libaudgui/infowin.cc:113
+msgid "Reggae"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
+#: src/libaudgui/infowin.cc:114
+msgid "Rock"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
+#: src/libaudgui/infowin.cc:115
+msgid "Rock and Roll"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
+#: src/libaudgui/infowin.cc:116
+msgid "Rhythm and Blues"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
+#: src/libaudgui/infowin.cc:117
+msgid "Ska"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
+#: src/libaudgui/infowin.cc:118
+msgid "Soul"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
+#: src/libaudgui/infowin.cc:119
+msgid "Swing"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+#: src/libaudgui/infowin.cc:120
+msgid "Techno"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
+#: src/libaudgui/infowin.cc:121
+msgid "Trip-hop"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
+#: src/libaudgui/infowin.cc:227
+msgid "Save successful"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
+#: src/libaudgui/infowin.cc:231
+msgid "Save error"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
+msgid "Track Number"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
+msgid "_Save"
 msgstr ""
 
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
 msgstr ""
 
-#: src/libaudcore/audstrings.c:385
+#: src/libaudgui/infowin.cc:455
 #, c-format
-msgid "Audio CD, track %s"
+msgid "%d kb/s"
 msgstr ""
 
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
+#: src/libaudgui/infowin.cc:460
+msgid "N/A"
 msgstr ""
 
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
+msgid "_Jump"
 msgstr ""
 
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
+#: src/libaudgui/jump-to-time.cc:51
+msgid "Jump to Time"
 msgstr ""
 
-#: src/libaudgui/about.c:37
-msgid "License"
+#: src/libaudgui/jump-to-time.cc:51
+msgid "Enter time (minutes:seconds):"
 msgstr ""
 
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
 msgstr ""
 
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
 msgstr ""
 
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
 msgstr ""
 
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
 msgstr ""
 
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
 msgstr ""
 
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
 msgstr ""
 
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
+#: src/libaudgui/playlists.cc:89
+msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
+#: src/libaudgui/playlists.cc:93
+msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
 msgstr ""
 
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
+#: src/libaudgui/playlists.cc:123
+msgid "Export Playlist"
 msgstr ""
 
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
+#: src/libaudgui/playlists.cc:124
+msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
+#: src/libaudgui/playlists.cc:130
+msgid "Import Playlist"
 msgstr ""
 
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
+#: src/libaudgui/playlists.cc:131
+msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
 msgstr ""
 
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
 msgstr ""
 
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
 msgstr ""
 
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
 msgstr ""
 
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
 msgstr ""
 
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
 msgstr ""
 
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
 msgstr ""
 
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
 msgstr ""
 
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
 msgstr ""
 
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
 msgstr ""
 
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
 msgstr ""
 
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
 msgstr ""
 
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
 msgstr ""
 
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
 msgstr ""
 
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
 msgstr ""
 
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
 msgstr ""
 
-#: src/libaudgui/infowin.c:84
-msgid "Country"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
 msgstr ""
 
-#: src/libaudgui/infowin.c:85
-msgid "Death Metal"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
 msgstr ""
 
-#: src/libaudgui/infowin.c:86
-msgid "Disco"
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
 msgstr ""
 
-#: src/libaudgui/infowin.c:87
-msgid "Easy Listening"
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
 msgstr ""
 
-#: src/libaudgui/infowin.c:88
-msgid "Folk"
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
 msgstr ""
 
-#: src/libaudgui/infowin.c:89
-msgid "Funk"
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
 msgstr ""
 
-#: src/libaudgui/infowin.c:90
-msgid "Gangsta Rap"
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
 msgstr ""
 
-#: src/libaudgui/infowin.c:91
-msgid "Gospel"
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
 msgstr ""
 
-#: src/libaudgui/infowin.c:92
-msgid "Grunge"
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
 msgstr ""
 
-#: src/libaudgui/infowin.c:93
-msgid "Hard Rock"
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
 msgstr ""
 
-#: src/libaudgui/infowin.c:94
-msgid "Heavy Metal"
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
 msgstr ""
 
-#: src/libaudgui/infowin.c:95
-msgid "Hip-hop"
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
 msgstr ""
 
-#: src/libaudgui/infowin.c:96
-msgid "House"
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
 msgstr ""
 
-#: src/libaudgui/infowin.c:97
-msgid "Jazz"
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
 msgstr ""
 
-#: src/libaudgui/infowin.c:98
-msgid "Jungle"
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
 msgstr ""
 
-#: src/libaudgui/infowin.c:99
-msgid "Metal"
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
 msgstr ""
 
-#: src/libaudgui/infowin.c:100
-msgid "New Age"
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
 msgstr ""
 
-#: src/libaudgui/infowin.c:101
-msgid "New Wave"
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
 msgstr ""
 
-#: src/libaudgui/infowin.c:102
-msgid "Noise"
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
 msgstr ""
 
-#: src/libaudgui/infowin.c:103
-msgid "Pop"
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
 msgstr ""
 
-#: src/libaudgui/infowin.c:104
-msgid "Punk Rock"
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
 msgstr ""
 
-#: src/libaudgui/infowin.c:105
-msgid "Rap"
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
 msgstr ""
 
-#: src/libaudgui/infowin.c:106
-msgid "Reggae"
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
 msgstr ""
 
-#: src/libaudgui/infowin.c:107
-msgid "Rock"
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
 msgstr ""
 
-#: src/libaudgui/infowin.c:108
-msgid "Rock and Roll"
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
 msgstr ""
 
-#: src/libaudgui/infowin.c:109
-msgid "Rhythm and Blues"
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
 msgstr ""
 
-#: src/libaudgui/infowin.c:110
-msgid "Ska"
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
 msgstr ""
 
-#: src/libaudgui/infowin.c:111
-msgid "Soul"
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
 msgstr ""
 
-#: src/libaudgui/infowin.c:112
-msgid "Swing"
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
 msgstr ""
 
-#: src/libaudgui/infowin.c:113
-msgid "Techno"
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
 msgstr ""
 
-#: src/libaudgui/infowin.c:114
-msgid "Trip-hop"
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
 msgstr ""
 
-#: src/libaudgui/infowin.c:220
-msgid "Save successful"
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
-msgid "Save error"
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
-msgid "Track Number"
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
-msgid "_Save"
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
-#, c-format
-msgid "%d kb/s"
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
 msgstr ""
 
-#: src/libaudgui/infowin.c:423
-msgid "N/A"
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
-msgid "_Jump"
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
-msgid "Jump to Time"
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
-msgid "Enter time (minutes:seconds):"
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
 msgstr ""
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
 msgstr ""
 
-#: src/libaudgui/playlists.c:88
-msgid "_Overwrite"
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
-msgid "Confirm Overwrite"
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
-msgid "Export Playlist"
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
 msgstr ""
 
-#: src/libaudgui/playlists.c:122
-msgid "_Export"
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
-msgid "Import Playlist"
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
 msgstr ""
 
-#: src/libaudgui/playlists.c:129
-msgid "_Import"
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
 msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr ""
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr ""
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr ""
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr ""
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr ""
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr ""
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/be.po b/po/be.po
index 4e88a66222d4..124142896473 100644
--- a/po/be.po
+++ b/po/be.po
@@ -3,6 +3,7 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
+# Aleh Mazok <mazokoleg at gmail.com>, 2014
 # debconf <prach.by at gmail.com>, 2014
 # dreadnote87 <dreadnote87 at gmail.com>, 2012
 # dreadnote87 <dreadnote87 at gmail.com>, 2012
@@ -12,9 +13,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-05-27 19:57+0000\n"
-"Last-Translator: Mikalai Udodau <crom-a at tut.by>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Belarusian (http://www.transifex.com/projects/p/audacious/"
 "language/be/)\n"
 "Language: be\n"
@@ -24,133 +25,137 @@ msgstr ""
 "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Шукаецца ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d файл знойдзены"
-msgstr[1] "%d файлы знойдзеныя"
-msgstr[2] "%d файлаў знойдзена"
-msgstr[3] "%d файлаў знойдзена"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Новы плэйліст"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Памылка"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Паказаць даведку па каманднаму радку"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Паказаць версію"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Пачаць гранне"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Прыпыніць гранне"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Прыпыніць калі грае, інакш граць"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Спыніць гранне"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Дадаць файлы да плэйлісту"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Дадаць файлы да часовага плэйлісту"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Паказаць галоўнае вакно"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Запусціць без графічнага інтэрфейсу"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Выйсці па сканчэнні грання"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Выводзіць паведамленні адладкі"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Не знайшлося дэкодэру для %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d файл знойдзены"
+msgstr[1] "%d файлы знойдзеныя"
+msgstr[2] "%d файлаў знойдзена"
+msgstr[3] "%d файлаў знойдзена"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s нельга адкрыць."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Новы плэйліст"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Немагчыма прачытаць %s: тып файла не падтрымліваецца."
+msgid "Audio CD, track %s"
+msgstr "Audio CD, трэк %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Немагчыма запісаць %s: тып файла не падтрымліваецца."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Цяпер грае"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -158,889 +163,1053 @@ msgstr ""
 "Плэйліст немагчыма ўпарадкаваць, бо ўсё яшчэ ідзе чытанне метазвестак (ці "
 "яно было адключана)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Скасаваць"
-
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Закрыць"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Настáўленні"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr ""
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Пра праграму"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Мона"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Плагіны ..."
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Стэрэа"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Выгляд"
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d канал"
+msgstr[1] "%d каналы"
+msgstr[2] "%d каналаў"
+msgstr[3] "%d каналаў"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Аўдыё"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Сеціва"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Плэйліст"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Звесткі пра песню"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Плагіны"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Агульныя"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Эфекты"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Аўтары"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Візуалізацыя"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Ліцэнзія"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Увод"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Пра Audacious"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Транспарт"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Выканаўца"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Выдаліць"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Альбом"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Скасаваць"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Загаловак"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Сцерці плэйліст"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Нумар трэка"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Жанр"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "П_ерайменаваць"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Назва файла"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Пераназваць плэйліст"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Шлях да файла"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Дата"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Уключыць"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Год"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Гц"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Каментар"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Гц"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Кодэк"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Гц"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Якасць"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Гц"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Нічога"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Гц"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Арабская"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "2 кГц"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Балцкая"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 кГц"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Кітайская (спрошчаная)"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 кГц"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Грэцкая"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 кГц"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Іўрыт"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 кГц"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Японская"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Эквалайзер"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Карэйская"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Перадузмацненне"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Польская"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Адкрыць файлы"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Расейская"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Адкрыць"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Тайваньская"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Турэцкая"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Дадаць файлы"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "З плыўной коскай"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "Дадаць"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Настáўленні інтэрфейсу</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Плагін інтэрфейсу:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Закрыць"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Плагін вываду:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Загаловак"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Настáўленні вываду</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Выканаўца"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Бітавая глыбіня:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Альбом"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Памер буферу:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Жанр"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "мс"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Год"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Мяккая адсечка"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Трэк"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Ужываць праграмны рэгулятар гучнасці (не рэкамендуецца)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Даўжыня"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Раўнаваны гук</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Фармат:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Раўнаваць гучнасць трэкаў"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Якасць:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Рэжым альбома"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Бітрэйт:"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Прадухіляць адсечку (рэкамендавана)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Эйсід джаз"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Падгонка ўзроўню</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Эйсід рок"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Узмацняць усе файлы:"
-
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "дБ"
-
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Узмацняць файлы без тэгаў:"
-
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Імя проксі-хосту:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Порт проксі:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Карыстальнік проксі:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Пароль проксі:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Канфігурацыя проксі</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Ужываць проксі"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Ужываць аўтэнтыфікацыю на проксі"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Аўтавызначэнне знаказбору для:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Прымаць нераспазнаны знаказбор як:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Паводзіны</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Працягваць гранне пры запуску"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Перайсці да наступнай па выдаленні песні"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Спустошыць плэйліст па адкрыцці файла"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Адкрываць файлы ў часовым плэйлісце"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Не чытаць метазвесткі, пакуль песня не прайгравалася"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Сумяшчальнасць</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Чытаць \\ (адваротны скос) як межнік каталогу"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Афармленне альбома</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Шукаць выявы, у якіх ёсць словы (пералік праз коску):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "За выключэннем выяў, у якіх ёсць словы (пералік праз коску):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Шукаць выявы, адпаведныя назве файла з песняй"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Рэкурсіўны пошук"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Глыбіня пошуку:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Выплыўныя звесткі</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Паказваць выплыўныя паведамленні"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Затрымка паведамлення (дзясятыя секунды):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Паказваць часавую шкалу для дзейнай песні"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "НАЗВА"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ВЫКАНАЎЦА - НАЗВА"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ВЫКАНАЎЦА - АЛЬБОМ - НАЗВА"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ВЫКАНАЎЦА - АЛЬБОМ - НУМАР. НАЗВА"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ВЫКАНАЎЦА [ АЛЬБОМ ] - НУМАР. НАЗВА"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "АЛЬБОМ - НАЗВА"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Катэгорыя"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Адмысловыя"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Паказ песні</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Паказваць нумары песень"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Паказваць пачатковыя нулі (02:00 замест 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Фармат загалоўка:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Адмысловы радок:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Немагчыма стварыць каталог (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Audio CD, трэк %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Мона"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Стэрэа"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d канал"
-msgstr[1] "%d каналы"
-msgstr[2] "%d каналаў"
-msgstr[3] "%d каналаў"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Аўтары"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Ліцэнзія"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Пра Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Выдаліць"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Сцерці плэйліст"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "П_ерайменаваць"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Пераназваць плэйліст"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Уключыць"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Гц"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "2 кГц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 кГц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 кГц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 кГц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 кГц"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Эквалайзер"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Перадузмацненне"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Трэк"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Даўжыня"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Фармат:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Якасць:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Бітрэйт:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Эйсід джаз"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Эйсід рок"
-
-#: src/libaudgui/infowin.c:78
+#: src/libaudgui/infowin.cc:85
 msgid "Ambient"
 msgstr "Эмбіент"
 
-#: src/libaudgui/infowin.c:79
+#: src/libaudgui/infowin.cc:86
 msgid "Bebop"
 msgstr "Біпоп"
 
-#: src/libaudgui/infowin.c:80
+#: src/libaudgui/infowin.cc:87
 msgid "Bluegrass"
 msgstr "Блюграс"
 
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "Блюз"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Камерная музыка"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Класічная музыка"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Кантры"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Дэз-метал"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Дыска"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Лёгкая Музыка"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Фолк"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Фанк"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Ганста рэп"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Евангелічныя спевы"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Гранж"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Хард-рок"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Хэві-метал"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Хіп-хоп"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "Хаўз"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Джаз"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Джангл"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Метал"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "Нью Эйдж"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "Новая хваля"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Нойз"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Поп"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Панк-рок"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Рэп"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Рэгі"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Рок"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Рок'н'ролл"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Рытм'н'блюз"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ска"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Соўл"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Свінг"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Тэхна"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Трып-хоп"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Звесткі пра песню"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Каментар"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Нумар трэка"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d Кб/с"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "Н/Д"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Няма звестак па %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Перайсці да часу"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Увядзіце час (мінут:секунд):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Перазапісаць %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "У чаргу"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "З чаргі"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Перайсці да песні"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Фільтр: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "Фільт_р:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "Пера_запісаць"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Пацвердзіце перазапіс"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Перазапісаць %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Экспартаваць плэйліст"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Імпартаваць плэйліст"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Кіраўнік чаргі"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Плагіны ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Адкрыць файлы"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Адкрыць"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Настáўленні"
+
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Пра праграму"
+
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Выгляд"
+
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Аўдыё"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Сеціва"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Плэйліст"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Плагіны"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Агульныя"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Эфекты"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Візуалізацыя"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Увод"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Транспарт"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Дадаць файлы"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Дата"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Кодэк"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Якасць"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Нічога"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Арабская"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Балцкая"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Кітайская (спрошчаная)"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Грэцкая"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Іўрыт"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Японская"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Карэйская"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Польская"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Расейская"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Тайваньская"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Турэцкая"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "З плыўной коскай"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Настáўленні інтэрфейсу</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Плагін інтэрфейсу:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Плагін вываду:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Настáўленні вываду</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Бітавая глыбіня:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Памер буферу:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "мс"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Мяккая адсечка"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Ужываць праграмны рэгулятар гучнасці (не рэкамендуецца)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Раўнаваны гук</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Раўнаваць гучнасць трэкаў"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Рэжым альбома"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Прадухіляць адсечку (рэкамендавана)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Падгонка ўзроўню</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Узмацняць усе файлы:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "дБ"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Узмацняць файлы без тэгаў:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Імя проксі-хосту:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Порт проксі:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Карыстальнік проксі:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Пароль проксі:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "У чаргу"
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "З чаргі"
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Канфігурацыя проксі</b>"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Перайсці да песні"
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Ужываць проксі"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Фільтр: "
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Ужываць аўтэнтыфікацыю на проксі"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "Фільт_р:"
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Аўтавызначэнне знаказбору для:"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Прымаць нераспазнаны знаказбор як:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Паводзіны</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Перайсці да наступнай па выдаленні песні"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Спустошыць плэйліст па адкрыцці файла"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Адкрываць файлы ў часовым плэйлісце"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Сумяшчальнасць</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Чытаць \\ (адваротны скос) як межнік каталогу"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Паказ песні</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Паказваць нумары песень"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Паказваць пачатковыя нулі (02:00 замест 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Кіраўнік плэйлістоў"
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Не чытаць метазвесткі, пакуль песня не прайгравалася"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Афармленне альбома</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Шукаць выявы, у якіх ёсць словы (пералік праз коску):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "За выключэннем выяў, у якіх ёсць словы (пералік праз коску):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Шукаць выявы, адпаведныя назве файла з песняй"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Рэкурсіўны пошук"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Глыбіня пошуку:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Выплыўныя звесткі</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Паказваць выплыўныя паведамленні"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Затрымка паведамлення (дзясятыя секунды):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Паказваць часавую шкалу для дзейнай песні"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "НАЗВА"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ВЫКАНАЎЦА - НАЗВА"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ВЫКАНАЎЦА - АЛЬБОМ - НАЗВА"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ВЫКАНАЎЦА - АЛЬБОМ - НУМАР. НАЗВА"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ВЫКАНАЎЦА [ АЛЬБОМ ] - НУМАР. НАЗВА"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "АЛЬБОМ - НАЗВА"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Катэгорыя"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Адмысловыя"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Запісы"
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Фармат загалоўка:"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Новы"
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Адмысловы радок:"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Пера_назваць"
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Граць"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Кіраўнік чаргі"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Закрыць дыялог па актывацыі плэйлі_сту"
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "З чаргi"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Памылка"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Адкрыць URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Дадаць URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Увядзіце URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Далейшыя паведамленні былі прыхаваныя.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Няма звестак па %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Назва файла"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/bg.po b/po/bg.po
index 5f3b6f5180e7..3b57f55e30e6 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -4,20 +4,23 @@
 #
 # Translators:
 # Elusiv_man <breaker9loc at gmail.com>, 2014
+# Elusiv_man <breaker9loc at gmail.com>, 2014
+# Ivailo Monev <xakepa10 at gmail.com>, 2014
 # Kiril Kirilov (Cybercop) <acybecop_montana at abv.bg>, 2012
-# Kiril Kirilov <cybercop_montana at abv.bg>, 2014
+# Kiril Kirilov <cybercop_montana at abv.bg>, 2014-2015
 # Pandi3a <pandi3a at gmail.com>, 2012
 # Pandi3a <pandi3a at gmail.com>, 2012
 # Георги Пацев <>, 2012
-# Радослав <reckku at gmail.com>, 2013-2014
-# Радослав <reckku at gmail.com>, 2013
+# Радослав Иванов <reckku at gmail.com>, 2013-2015
+# Радослав Иванов <reckku at gmail.com>, 2013
+# Радослав Иванов <reckku at gmail.com>, 2015
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-06 13:28+0000\n"
-"Last-Translator: Kiril Kirilov <cybercop_montana at abv.bg>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-02-19 22:30+0000\n"
+"Last-Translator: Радослав Иванов <reckku at gmail.com>\n"
 "Language-Team: Bulgarian (http://www.transifex.com/projects/p/audacious/"
 "language/bg/)\n"
 "Language: bg\n"
@@ -26,131 +29,139 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Търсене..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Намереният файл е %d"
-msgstr[1] "Намерените файлове са: %d"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Нов списък за изпълнение"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Грешка"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Покажи помощ за работа в команден ред"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Показване на версията"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
-msgstr "Стартиране"
+msgstr "Възпроизвеждане"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Пауза"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Временно спиране, ако се изпълнява, в противен случай ― изпълнение"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Спиране"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Прескочи до предишната песен"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Прескочи до следващата песен"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Добавяне на файлове в списъка за изпълнение"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Добавяне на файлове към временен списък"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Показване на основния прозорец"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Покажи прозореца Прескочи до песен"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Пускане без графичен интерфейс"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Изход при спиране на възпроизвеждането"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Извеждане на информацията за отстраняване на грешки"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Печат на съобщения за грешка (може да се използва повторно)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Стартирай в Qt-режим"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
-msgstr "Непозната опция: %s \n"
+msgstr "Неизвестна опция: %s \n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Неизвестна опция: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
-msgstr "Употреба: audacious [ОПЦИЯ] ... [ФАЙЛ] ...\n"
+msgstr ""
+"Употреба: audacious [ОПЦИЯ] ... [ФАЙЛ] ...\n"
+"\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
-msgstr "Аудио плеър - Audacious"
+msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Не е намерен декодер за %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Намереният файл е %d"
+msgstr[1] "намерени са %d файла"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "Неуспешно отваряне на %s."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Нов списък за изпълнение"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "%s не може да бъде зареден: неподдържано разширение."
+msgid "Audio CD, track %s"
+msgstr "Аудио CD, запис %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(грешка в знаците на кодировката)"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Грешка при зареждане на разширение"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "%s не може да бъде запаметен: неподдържано разширение."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Грешка при отваряне на %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Неизвестна грешка при възпроизвеждане"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Невалиден звуков формат"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
-msgstr "Изпълнява се"
+msgstr "Възпроизвежда се"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -158,889 +169,1053 @@ msgstr ""
 "Списъкът не може да бъде сортиран, защото сканирането на метаданните или е "
 "все още в прогрес, или е било изключено."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Относно"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "%s не може да бъде зареден: неподдържано разширение."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Настройки"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "%s не може да бъде запазен: неподдържано разширение."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Задай"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Грешка при прескачане"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Отказ"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Форматът на фаила на е разпознат"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Затваряне"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Грешка при четене на мета-данни"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Настройки"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Моно"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Относно"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Стерео"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Приставки..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d канал"
+msgstr[1] "%d канала"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Външен вид"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Запис %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Аудио"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Аудио Диск"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Интернет мрежа"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(неизвестно заглавие)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Списък за изпълнение"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Невалиден Интернет адрес"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Информация за песента"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Неизвестна схема на Интернет адрес"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Разширения"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Невалидно име на файл"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Общи"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Заслуги"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Ефекти"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Лиценз"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Визуализация"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Относно Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Вход"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Желаете ли окончателно да премахнете „%s“?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Пренасяне"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Премахване"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Изпълнител"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Отказ"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Албум"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Премахни Списъка за изпълнение"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Заглавие"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Не питай повече"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Номер на запис"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Преименуване"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Жанр"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Преименуване на списъка за изпълнение"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Име на файл"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Как искате да именувате този списък за изпълнение?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Път до файл"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Активиране"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Дата"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Хц"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Година"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Хц"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Коментар"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Хц"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Кодировка"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Хц"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Качество"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Хц"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Без"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 кХц"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Арабски"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 кХц"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Балтийски"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 кХц"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Китайски"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 кХц"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Гръцки"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 кХц"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Иврит"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Тонкоректор"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Японски"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Предусилвател"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Корейски"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Отваряне на файлове"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Полски"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Отвори"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Руски"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Затва_ряне на прозореца при отваряне"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Тайвански"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Добавяне на файлове"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Турски"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Добави"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Плаваща запетая"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Затваря_не на прозореца при добавяне"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Настройки на интерфейса</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Затваряне"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Приставка за интерфейса:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Заглавие"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Приставка за изходящия поток:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Изпълнител"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Настройки на изходящия поток</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Албум"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Дълбочина в битове:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Жанр"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Размер на буфера:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Година"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "мс"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Запис"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Намаляване на пращене"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Продължителност"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr ""
-"Използване на програмно регулиране на силата на звука (не е препоръчително)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Формат:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Повторно усилване</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Качество:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Включване на повторно усилване"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Честота за бит:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "В режим „Албум“"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Ейсид Джаз"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Предотвратяване на пращене (препоръчително)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Ейсид Рок"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Настройване на нивата на звука</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ембиънт"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Усилване на звука за всички файлове:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Бебоп"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "дБ"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Блуграс"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Усилване на звука на немаркираните файлове:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Блус"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Прокси:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Чембър Мюзик"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Порт на прокси:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Потребителско име:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Парола:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Настройка на прокси</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Включване на прокси"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Използване на идентифициране с прокси"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Автоматично определяне на кодировка за:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Алтернативна кодировка:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Поведение</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Продължи изпълнението при стартиране"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Продължаване напред, ако текущата песен е премахната"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Изчистване на списъка, когато се отвори нов файл"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Отваряне на файлове във временен списък"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Да не се зареждат метаданни за песните, докато се изпълняват"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Съвместимост</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Знакът „\\“ да се тълкува като раделител на папките в пътя до файла"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Обложка на албум</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Търсене на изображения, съдържащи тези думи (разделени със запетая):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"Изключване на изображения, съдържащи тези думи (разделени със запетая):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Търсене на изображения, съдържащи името на файла"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Прогресивно търсене"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Обхват на търсенето:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Изскачаща информация</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Показване на подсказки"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Забавяне на подсказките (десети от секундата):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Покажи времетраене за текущата песен"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "ЗАГЛАВИЕ"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ИЗПЪЛНИТЕЛ - ЗАГЛАВИЕ"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ИЗПЪЛНИТЕЛ - АЛБУМ - ЗАГЛАВИЕ"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ИЗПЪЛНИТЕЛ - АЛБУМ - ЗАПИС. ЗАГЛАВИЕ"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ИЗПЪЛНИТЕЛ [ АЛБУМ ] - ЗАПИС. ЗАГЛАВИЕ"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "АЛБУМ - ЗАГЛАВИЕ"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Категория"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Потребителски"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Показване на песен</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Показване на номера на песента"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Показване на нула в началото (02:00 вместо 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Формат на заглавие:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Потребителски низ:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Audacious настройки"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Не може да се създаде директория (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Аудио CD, запис %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Моно"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Стерео"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d канал"
-msgstr[1] "%d канала"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Автори"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Лиценз"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Относно Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Желаете ли окончателно да премахнете „%s“?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Премахване"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Премахни Плейлист"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Не питай повече"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Преименуване"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Преименуване на списъка за изпълнение"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Как искате да наречете този плейлист?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Активиране"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Хц"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Хц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Хц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Хц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Хц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 кХц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 кХц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 кХц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 кХц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 кХц"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Тонкоректор"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Предусилвател"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Запис"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Продължителност"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Формат:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Качество:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Честота за бит:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Ейсид Джаз"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Ейсид Рок"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ембиънт"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Бебоп"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Блуграс"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Блус"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Чембър Мюзик"
-
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Класика"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Кънтри"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Дет Метъл"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Диско"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Изи Листънинг"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Фолк"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Фънк"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Гангстерски Рап"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Госпел"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Грънч"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Хард Рок"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Хеви Метъл"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Хип-хоп"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "Хаус"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Джаз"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Джангъл"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Метъл"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "Ню Ейдж"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "Ню Уейв"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Нойс"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Поп"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Пънк Рок"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Рап"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Реге"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Рок"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Рокенрол"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Ритъм и блус"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ска"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Соул"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Суинг"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Техно"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Трип-хоп"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Съхраняването успешно"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Грешка при съхраняването"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Информация за песента"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr " Изпълнител на Албум"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Коментар"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Номер на записа"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Изчистване на полетата при преминаване към следващата песен"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Запази"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Следващ"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
-msgstr "%d кбит/с"
+msgstr "%d кб/с"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "Няма данни"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Липсва информация за %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Прескочи"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
-msgstr "Прескачане до файл"
+msgstr "Прескачане до времева позиция"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Въвеждане на време (минути:секунди):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Да се презапише ли %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "На _опашка"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "П_ремахване от опашката"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Прескачане до песен"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Филтър: "
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Филтър:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Зат_варяне при прескачане"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "Пре_записване"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Потвърждаване на презаписване"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Да се презапише ли %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Изнасяне на списък за изпълнение"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Изнасяне"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Внасяне на списък за изпълнение"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Внасяне"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Мениджър на опашката"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Приставки..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Без изчакване"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Относно %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Отваряне на файлове"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Настройки"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Отвори"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Задай"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Затва_ряне на прозореца при отваряне"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Настройки"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Добавяне на файлове"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Относно"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Добави"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Външен вид"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Затваря_не на прозореца при добавяне"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Аудио"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "На _опашка"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Интернет мрежа"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "П_ремахване от опашката"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Списък за изпълнение"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Прескачане до песен"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Разширения"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Филтър: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Общи"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Филтър:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Ефекти"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Зат_варяне при прескачане"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Визуализация"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Вход"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Пренасяне"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Номер на запис"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Име на файла"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Път до файла"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Дата"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Кодировка"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Качество"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Без"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Арабски"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Балтийски"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Китайски"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Гръцки"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Иврит"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Японски"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Корейски"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Полски"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Руски"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Тайвански"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Турски"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Плаваща запетая"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Настройки на интерфейса</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Приставка за интерфейса:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Приставка за изходящия поток:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Настройки на изходящия поток</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Дълбочина в битове:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Размер на буфера:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "мс"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Намаляване на пращене"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr ""
+"Използване на програмно регулиране на силата на звука (не е препоръчително)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Повторно усилване</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Включване на повторно усилване"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "В режим „Албум“"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Предотвратяване на пращене (препоръчително)"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Мениджър на списъка за изпълнение"
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Настройване на нивата на звука</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Усилване на звука за всички файлове:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "дБ"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Усилване на звука на немаркираните файлове:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Прокси:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Порт на прокси:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Потребителско име:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Парола:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Мрежови настройки</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "КиБ"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Настройка на прокси</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Включване на прокси"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Използване на идентифициране с прокси"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Записи"
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Автоматично определяне на кодировка за:"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Нова"
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Алтернативна кодировка:"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Преименуван_е"
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Поведение</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Продължи изпълнението при стартиране"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Изпълнение"
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Пауза, вместо незабавно изпълнение"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Затваряне на прозореца при отваряне на списъка за изпълнение"
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Продължаване напред, ако текущата песен е премахната"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Изчистване на списъка, когато се отвори нов файл"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Отваряне на файлове във временен списък"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Съвместимост</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Знакът „\\“ да се тълкува като раделител на папките в пътя до файла"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Показване на песен</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Показване на номера на песента"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Показване на водеща нула (02:00 вместо 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Допълнителни</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Да не се зареждат метаданни за песните, докато се изпълняват"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Проверка съдържанието на файловете с непознато разширение"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Обложка на албум</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Търсене на изображения, съдържащи тези думи (разделени със запетая):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr ""
+"Изключване на изображения, съдържащи тези думи (разделени със запетая):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Търсене на изображения, съдържащи името на файла"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Прогресивно търсене"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Обхват на търсенето:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Изскачаща информация</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Показване на подсказки"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Забавяне на подсказките (десети от секундата):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Покажи времетраене за текущата песен"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "ЗАГЛАВИЕ"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ИЗПЪЛНИТЕЛ - ЗАГЛАВИЕ"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ИЗПЪЛНИТЕЛ - АЛБУМ - ЗАГЛАВИЕ"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ИЗПЪЛНИТЕЛ - АЛБУМ - ЗАПИС. ЗАГЛАВИЕ"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ИЗПЪЛНИТЕЛ [ АЛБУМ ] - ЗАПИС. ЗАГЛАВИЕ"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "АЛБУМ - ЗАГЛАВИЕ"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Категория"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Потребителски"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Формат на заглавие:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Потребителски низ:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Audacious настройки"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Мениджър на опашката"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Без изчакване"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Работи ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Грешка"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Отваряне на интернет адрес"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Добавяне на интернет адрес"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Въвеждане на интернет адрес:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Допълнителните съобщения са били скрити.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Отваряне на папка"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Добавяне на папка"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Отваряне"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Добави"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Мета-данни"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Композитор"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Изпълнител"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Година на запис"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Дата на запис"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Технически"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIME тип"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Честота за бит"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Липсва информация за %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Ниво"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Име на файл"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Линия"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Функция"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Съобщение"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Проверка на логовете"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Ниво на лог:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Отстраняване на грешки"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Информация"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Предупреждение"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Разширения ..."
diff --git a/po/ca.po b/po/ca.po
index 015a24013b28..96b276e607b2 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -4,9 +4,11 @@
 #
 # Translators:
 # Catalanoic <catalanoic at gmail.com>, 2014
+# Catalanoic <catalanoic at gmail.com>, 2014
 # Ernest Adrogué <eadrogue at gmx.net>, 2007-2008
-# Francesc Gordillo i Cortínez <frangor at frangor.info>, 2013
-# Francesc Gordillo i Cortínez <frangor at frangor.info>, 2013
+# Francesc Gordillo i Cortínez <inactive+frangor at transifex.com>, 2013
+# Francesc Gordillo i Cortínez <inactive+frangor at transifex.com>, 2013
+# Francesc Gordillo i Cortínez <inactive+frangor at transifex.com>, 2013
 # Jordi Amenós <>, 2011
 # Juanma Hernández <juanmah at gmail.com>, 2012
 # Juanma Hernández <juanmah at gmail.com>, 2012
@@ -14,9 +16,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-29 17:51+0000\n"
-"Last-Translator: Catalanoic <catalanoic at gmail.com>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Catalan (http://www.transifex.com/projects/p/audacious/"
 "language/ca/)\n"
 "Language: ca\n"
@@ -25,134 +27,138 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Cercant "
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] ""
-"Traduccions plurals\n"
-"\n"
-"un:%d arxiu trobat"
-msgstr[1] "%d arxius trobats"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nova llista de reproducció"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Mostra l'ajuda de la línia de comandes"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Mostra la versió"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Inicia reproducció"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Pausa reproducció"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Fa una pausa, o bé reprèn la reproducció"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Atura reproducció"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Salta a la cançó anterior"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Salta a la següent cançó"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Afegir arxius a la llista de reproducció"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Afegeix fitxers a una llista de reproducció temporal"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Mostra la finestra principal"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Sortir al aturar la llista de reproducció"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Imprimir missatges de depuració "
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "No es troba còdec per %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] ""
+"Traduccions plurals\n"
+"\n"
+"un:%d arxiu trobat"
+msgstr[1] "%d arxius trobats"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s no s'ha pogut obrir."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nova llista de reproducció"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid "Audio CD, track %s"
+msgstr "CD d'audio, pista %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Nova reproducció"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -160,894 +166,1058 @@ msgstr ""
 "La llista de reproducció no es pot ordenar perquè la detecció de metadades "
 "encara està en marxa (o s'ha desactivat )"
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Configura"
-
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Cancel·la"
-
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Tanca"
-
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Opcions"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr ""
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Quant"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr ""
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Aparença"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Àudio"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Estèreo"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Xarxa"
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] ""
+"Traduccions plurals\n"
+"\n"
+"un:%d canal"
+msgstr[1] "altres:%d canals"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Llistes"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Información de la cançó"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Connectors"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "General"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efectes"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualització"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Entrada"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Crèdits"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transport"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Llicència"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artista"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Quant a l'Audacious"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Àlbum"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Títol"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Número de pista"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Cancel·la"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Gènere"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nom del fitxer"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
+
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Ubicació"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Reanomena la llista de reproducció"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Data"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Any"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Connecta"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Comentari"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Códec"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Qualitat"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Cap"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Àrab"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Bàltic"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Xinès"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Grec"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebreu"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japonès"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Coreà"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Equalitzador"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polonès"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamplificador"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Rus"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Obre els fitxers"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanès"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turc"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Coma flotant"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Afegeix els fitxers"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Connector de sortida"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Tanca"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Opcions sortida</b>"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Títol"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Profunditat de bits:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artista"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Mida del buffer:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Àlbum"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Gènere"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Aturar salts"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Any"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Utilitzar control de volum per software (no recomanat)"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Pista"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>reproduir arxius sense fluctuacions de volum</b>"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Durada"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Activa el Replay Gain"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Manera Àlbum"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Evitar saturació (recomanat)"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Ajustar nivells</b>"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Jazz àcid"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplificar tots els arxius:"
-
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
-
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplificar arxius sense etiquetar:"
-
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Nom del servidor intermediari:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Port del servidor intermediari:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Nom d'usuari:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Contrasenya:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Configuració de servidors intermediaris</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Activa l'ús de servidor intermediari"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Autenticació al servidor intermediari"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Detecció automàtica del joc de caràcters per a:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Jocs de caràcters de reserva:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Comportament</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Reprèn la reproducció en engegar"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Avançar quan la cançó que s'està reproduint s'elimina"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "A l'obrir arxius esborrar la llista que s'està reproduint "
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Obrir arxius en llista temporal de reproducció"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "No desar metadates mentre la cançó s'està reproduint"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibilitat</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpretar \\ (barra invertida) com a delimitador de directori"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Caràtula d'àlbum</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-"Cerca imatges que corresponguin amb aquestes paraules (separades per comes):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"Exclou imatges que corresponguin amb aquestes paraules (separades per comes):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Cerca imatges que corresponguin amb el nom de l'arxiu de la cançó"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Cerca recursivament"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Profunditat de la cerca"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Informació emergent</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Mostra informació emergent"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Retard del menú emergent (desenes de segon):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Mostra escala de temps per a la cançó actual"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TÍTOL"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTISTA - TÍTOL"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTISTA - ÀLBUM - TÍTOL"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTISTA - ÀLBUM - PISTA. TÍTOL"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTISTA [ ÀLBUM ] - PISTA. TÍTOL"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ÀLBUM - TÍTOL"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Categoria"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Personalitzat"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Visualització de les cançons</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Mostrar el numero de les cançons"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Mostrar zeros a l'esquerra (02:00 en comptes de 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Format del títol:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Cadena personalitzada:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Opcions de l'Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "No s'ha pogut crear el directori (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "CD d'audio, pista %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Estèreo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] ""
-"Traduccions plurals\n"
-"\n"
-"un:%d canal"
-msgstr[1] "altres:%d canals"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Crèdits"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Llicència"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Quant a l'Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Reanomena la llista de reproducció"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Connecta"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Equalitzador"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamplificador"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Pista"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Durada"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Jazz àcid"
-
-#: src/libaudgui/infowin.c:77
+#: src/libaudgui/infowin.cc:84
 msgid "Acid Rock"
 msgstr "Acid Rock"
 
-#: src/libaudgui/infowin.c:78
+#: src/libaudgui/infowin.cc:85
 msgid "Ambient"
 msgstr "Ambiental"
 
-#: src/libaudgui/infowin.c:79
+#: src/libaudgui/infowin.cc:86
 msgid "Bebop"
 msgstr "Bebop"
 
-#: src/libaudgui/infowin.c:80
+#: src/libaudgui/infowin.cc:87
 msgid "Bluegrass"
 msgstr "Bluegrass"
 
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "Blues"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Música de cambra"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Clàssica"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Rap gangsta"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Rock dur"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Soroll"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Tecno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Información de la cançó"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Comentari"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr ""
-"No hi ha informació disponible per %s.⏎\n"
-"\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
-msgid "_Jump"
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
+msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Salta al temps"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Introdueix temps (minuts: segons):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Reescriure %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Posa a la cua"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Treu de la _cua"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Salta a la cançó"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtre: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtre:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Reescriure %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Exportar llista de reproducció"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importar llista de reproducció"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Gestor de cues"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Obre els fitxers"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Configura"
+
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Opcions"
+
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Quant"
+
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Aparença"
+
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Àudio"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Xarxa"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Llistes"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Connectors"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "General"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efectes"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualització"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Entrada"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transport"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Afegeix els fitxers"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Data"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Códec"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Qualitat"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Cap"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Àrab"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Bàltic"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Xinès"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Grec"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebreu"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japonès"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Coreà"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polonès"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Rus"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanès"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turc"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Coma flotant"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Posa a la cua"
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Connector de sortida"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Treu de la _cua"
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Opcions sortida</b>"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Salta a la cançó"
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Profunditat de bits:"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtre: "
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Mida del buffer:"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtre:"
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Aturar salts"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Utilitzar control de volum per software (no recomanat)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>reproduir arxius sense fluctuacions de volum</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Activa el Replay Gain"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Manera Àlbum"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Evitar saturació (recomanat)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Ajustar nivells</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplificar tots els arxius:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplificar arxius sense etiquetar:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Nom del servidor intermediari:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Port del servidor intermediari:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Nom d'usuari:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Contrasenya:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Gestor de llistes"
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Configuració de servidors intermediaris</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Activa l'ús de servidor intermediari"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Autenticació al servidor intermediari"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Elements"
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Detecció automàtica del joc de caràcters per a:"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Jocs de caràcters de reserva:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Comportament</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Avançar quan la cançó que s'està reproduint s'elimina"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "A l'obrir arxius esborrar la llista que s'està reproduint "
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Obrir arxius en llista temporal de reproducció"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibilitat</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpretar \\ (barra invertida) com a delimitador de directori"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Visualització de les cançons</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Mostrar el numero de les cançons"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Mostrar zeros a l'esquerra (02:00 en comptes de 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "No desar metadates mentre la cançó s'està reproduint"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Caràtula d'àlbum</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr ""
+"Cerca imatges que corresponguin amb aquestes paraules (separades per comes):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr ""
+"Exclou imatges que corresponguin amb aquestes paraules (separades per comes):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Cerca imatges que corresponguin amb el nom de l'arxiu de la cançó"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Cerca recursivament"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Profunditat de la cerca"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Informació emergent</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Mostra informació emergent"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Retard del menú emergent (desenes de segon):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Mostra escala de temps per a la cançó actual"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TÍTOL"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTISTA - TÍTOL"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTISTA - ÀLBUM - TÍTOL"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTISTA - ÀLBUM - PISTA. TÍTOL"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTISTA [ ÀLBUM ] - PISTA. TÍTOL"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ÀLBUM - TÍTOL"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Categoria"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Personalitzat"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Format del títol:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Cadena personalitzada:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Opcions de l'Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Gestor de cues"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Tancar diàlegs al activar llista de reproducció"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Obrir URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Afegir URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Introdueix URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Els missatges següents han estat amagats.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr ""
+"No hi ha informació disponible per %s.⏎\n"
+"\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nom del fitxer"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/cmn.po b/po/cmn.po
index 1e2c66530d4b..c5783c1891d3 100644
--- a/po/cmn.po
+++ b/po/cmn.po
@@ -4,15 +4,17 @@
 #
 # Translators:
 # Ruei-Yuan Lu <RueiYuan.Lu at gmail.com>, 2011
-# Wai Hon Law <whhone at gmail.com>, 2013
-# Wei-Lun Chao <bluebat at member.fsf.org>, 2013
+# whhone <whhone at gmail.com>, 2013
+# 趙惟倫 <bluebat at member.fsf.org>, 2013
+# whhone <whhone at gmail.com>, 2013
+# 趙惟倫 <bluebat at member.fsf.org>, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Chinese (Mandarin) (http://www.transifex.com/projects/p/"
 "audacious/language/cmn/)\n"
 "Language: cmn\n"
@@ -21,1015 +23,1183 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "搜尋中…"
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "找到 %d 個檔案"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "新播放列表"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "顯示版本資訊"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "若播放中則暫停,否則繼續播放"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "加入檔案至播放列表"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "顯示主視窗"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "播放停止後離開"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "顯示除錯訊息"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "找不到適用於 %s 的解碼器。"
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "找到 %d 個檔案"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "無法開啟 %s。"
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "新播放列表"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid "Audio CD, track %s"
+msgstr "音樂 CD,音軌 %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr ""
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "正在播放"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr "因為正在進行詮釋資料的掃描,無法對播放列表進行排序。(或者已經被關閉)"
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "單聲道"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "立體聲"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d 聲道"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "音訊"
-
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "網路"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "播放列表"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "歌曲資訊"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "外掛"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "一般"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "特效"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "開發團隊"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "視覺特效"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "授權條款"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "輸入"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "關於 Audacious"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "傳輸"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "演出者"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "專輯"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "標題"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "音軌編號"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "類型"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "檔案名稱"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "重新命名播放列表"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "檔案路徑"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "日期"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "啟用(_E)"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "年分"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "備註"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "編解碼器"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "品質"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "無"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "阿拉伯語"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "波羅的海"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "漢語"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "希臘語"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "希伯來語"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "日本語"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "等化器"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "韓語"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "前置放大"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "波蘭語"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "開啟檔案"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "俄語"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "傳統字漢語"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "土耳其語"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "加入檔案"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "浮點數"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "輸出外掛:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "標題"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>輸出設定</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "演出者"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "取樣格式:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "專輯"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "緩衝區大小:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "類型"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "毫秒"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "年分"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "軟性削峰"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "音軌"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "使用軟體音量控制 (不建議開啟)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "長度"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>播放增益</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "啟用播放增益"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "專輯模式"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "防止訊號裁剪 (建議開啟)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "迷幻爵士"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>調整音量</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "迷幻搖滾"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "放大所有檔案的音量:"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "氛圍音樂"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "分貝"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "放大無標籤檔案的音量:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "藍草"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "代理伺服器名稱:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "藍調"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "代理伺服器通訊埠:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "室內樂"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "代理伺服器使用者名稱:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "代理伺服器密碼:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>代理伺服器設定</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "啟用代理伺服器"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "需要認證"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "自動偵測字元編碼:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "備用字元編碼:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>行為</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "啟動後繼續之前的播放"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "目前的歌曲被刪除時移至下一首"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "開啟檔案後清除播放列表"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "在暫存播放列表中開啟檔案"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "在歌曲播放以前不要載入詮釋資料"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>相容性</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "將 \\ (反斜線) 視為資料夾分隔符號"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>專輯封面</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "搜尋符合這些單字的圖片 (以逗號分隔):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "排除符合這些單字的圖片 (以逗號分隔):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "搜尋符合歌曲檔名的圖片"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "遞迴搜尋"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "搜尋深度:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>彈出式資訊視窗</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "顯示彈出式資訊視窗"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "彈出視窗的延遲時間 (十分之一秒):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "顯示目前歌曲的時間軸"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "標題"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "演出者 - 標題"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "演出者 - 專輯 - 標題"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "演出者 - 專輯 - 音軌. 標題"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "演出者 [ 專輯 ] - 音軌. 標題"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "專輯 - 標題"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "目錄"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "自訂"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>顯示歌曲</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "顯示歌曲編號"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "顯示開頭的數字零 (例:02:00 而不是 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "標題格式:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "自訂字串:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "無法建立資料夾 (%s):%s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "音樂 CD,音軌 %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "單聲道"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "立體聲"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d 聲道"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "開發團隊"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "授權條款"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "關於 Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "重新命名播放列表"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "啟用(_E)"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "等化器"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "前置放大"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "音軌"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "長度"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "迷幻爵士"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "迷幻搖滾"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "氛圍音樂"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "藍草"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "藍調"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "室內樂"
-
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "古典"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "鄉村"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "死亡金屬"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "迪斯可"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "輕音樂"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "民謠"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "放客"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "黑幫說唱"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "福音音樂"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "垃圾搖滾"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "硬式搖滾"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "重金屬"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "嘻哈"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "爵士"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "叢林"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "金屬"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "新世紀"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "新浪潮"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "噪音"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "流行"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "龐克搖滾"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "說唱"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "雷鬼"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "搖滾 (Rock)"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "搖滾 (Rock&Roll)"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "R&B"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "靈魂"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "搖擺樂"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "數位"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "迷幻舞曲"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "歌曲資訊"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "備註"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "無關於 %s 的資訊。\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "跳至時間"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "請輸入時間 (分:秒):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "覆寫 %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "排入佇列(_Q)"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "移出佇列(_Q)"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "跳至歌曲"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "過濾器:"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "過濾器(_F):"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "覆寫 %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "匯出播放列表"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "匯入播放列表"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "佇列管理"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "開啟檔案"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "加入檔案"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "音訊"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "網路"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "播放列表"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "外掛"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "一般"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "特效"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "視覺特效"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "輸入"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "傳輸"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "排入佇列(_Q)"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "移出佇列(_Q)"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "跳至歌曲"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "日期"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "過濾器:"
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "編解碼器"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "過濾器(_F):"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "品質"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "無"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "阿拉伯語"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "波羅的海"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "漢語"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "希臘語"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "希伯來語"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "日本語"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "韓語"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "波蘭語"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "俄語"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "傳統字漢語"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "土耳其語"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "浮點數"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "播放列表管理"
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "輸出外掛:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>輸出設定</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "取樣格式:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "緩衝區大小:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "毫秒"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "軟性削峰"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "數量"
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "使用軟體音量控制 (不建議開啟)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>播放增益</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "啟用播放增益"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "專輯模式"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "防止訊號裁剪 (建議開啟)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>調整音量</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "放大所有檔案的音量:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "分貝"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "放大無標籤檔案的音量:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "代理伺服器名稱:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "代理伺服器通訊埠:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "代理伺服器使用者名稱:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "代理伺服器密碼:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>代理伺服器設定</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "啟用代理伺服器"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "需要認證"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "自動偵測字元編碼:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "備用字元編碼:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>行為</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "目前的歌曲被刪除時移至下一首"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "開啟檔案後清除播放列表"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "在暫存播放列表中開啟檔案"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>相容性</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "將 \\ (反斜線) 視為資料夾分隔符號"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>顯示歌曲</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "顯示歌曲編號"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "顯示開頭的數字零 (例:02:00 而不是 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "在歌曲播放以前不要載入詮釋資料"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>專輯封面</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "搜尋符合這些單字的圖片 (以逗號分隔):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "排除符合這些單字的圖片 (以逗號分隔):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "搜尋符合歌曲檔名的圖片"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "遞迴搜尋"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "搜尋深度:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>彈出式資訊視窗</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "顯示彈出式資訊視窗"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "彈出視窗的延遲時間 (十分之一秒):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "顯示目前歌曲的時間軸"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "標題"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "演出者 - 標題"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "演出者 - 專輯 - 標題"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "演出者 - 專輯 - 音軌. 標題"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "演出者 [ 專輯 ] - 音軌. 標題"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "專輯 - 標題"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "目錄"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "自訂"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "標題格式:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "自訂字串:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "佇列管理"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "啟用播放列表後關閉對話視窗(_C)"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "開啟網址"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "加入網址"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "請輸入網址:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(詳細訊息已被隱藏。)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "無關於 %s 的資訊。\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "檔案名稱"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/cs.po b/po/cs.po
index 001f37309928..c5d3e753a890 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -4,20 +4,26 @@
 #
 # Translators:
 # Jiří Vírava <appukonrad at gmail.com>, 2012
+# fri, 2012
 # fri, 2012-2013
+# hpsoft <liborsustr.ml at seznam.cz>, 2014
 # Jan Nárovec <finn at sendmail.cz>, 2004
+# nd76er <nd76er at gmail.com>, 2014
+# Jiří Vírava <appukonrad at gmail.com>, 2012
 # Jiří Vírava <appukonrad at gmail.com>, 2012
 # hpsoft <liborsustr.ml at seznam.cz>, 2014
-# fri, 2013
+# nd76er <nd76er at gmail.com>, 2014-2015
+# fri, 2013-2014
 # fri, 2012
 # Petr Písař <petr.pisar at atlas.cz>, 2007-2012
+# Petr Šimáček <petr.simacek at gmail.com>, 2014
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-06-11 17:04+0000\n"
-"Last-Translator: hpsoft <liborsustr.ml at seznam.cz>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-01-02 16:00+0000\n"
+"Last-Translator: nd76er <nd76er at gmail.com>\n"
 "Language-Team: Czech (http://www.transifex.com/projects/p/audacious/language/"
 "cs/)\n"
 "Language: cs\n"
@@ -26,1021 +32,1191 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Hledá se…"
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Nalezen %d soubor"
-msgstr[1] "Nalezeny %d soubory"
-msgstr[2] "Nalezeno %d souborů"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nový seznam skladeb"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Chyba"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Zobrazit pomoc příkazového řádku"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Zobrazit verzi"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Zahájit přehrávání"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Pozastavit přehrávání"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pozastaví při přehrávání; jinak spustí"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Zastavit přehrávání"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Přeskočit k předchozí skladbě"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Přeskočit k následující skladbě"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Přidá soubory do do seznamu skladeb"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Přidat soubor do dočasného playlistu"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Zobrazit hlavní okno"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Ukázat okno s přeskakováním skladeb"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Spustit bez grafického rozhraní"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Ukončit po zastavení přehrávání"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Vypsat ladicí hlášky"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Zobrazit zprávy o ladění (může být použito dvakrát)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Spustit v režimu Qt"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
-msgstr ""
+msgstr "Neznámá volba: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
-msgstr ""
+msgstr "Neznámá volba: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
-msgstr ""
+msgstr "Použití: audacious [OPTION] ... [FILE] ...\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Pro %s nenalezen žádný dekodér."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Nalezen %d soubor"
+msgstr[1] "Nalezeny %d soubory"
+msgstr[2] "Nalezeno %d souborů"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s se nepodařilo otevřít."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nový seznam skladeb"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Nelze načíst %s: nepodporovaný typ souboru"
+msgid "Audio CD, track %s"
+msgstr "Zvukové CD, stopa %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(chyba kódování)"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Chyba při nahrávání přídavného modulu"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Nelze uložit %s: nepodporovaný typ souboru"
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Chyba při otevírání %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Neznámá chyba při přehrávání"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Neplatný zvukový formát"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Nyní hraje"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr ""
-"Seznam skladeb nelze seřadit, protože hledání metadat stále probíhá (nebo je "
-"vypnuto)."
-
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "O %s"
+"Seznam skladeb nelze seřadit, protože hledání popisných dat stále probíhá "
+"(nebo je vypnuto)."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Nastavení"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Nemohu nahrát %s: nepodporovaná přípona souboru."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Nastavit"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Nemohu uložit %s: nepodporovaná přípona souboru."
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Zrušit"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Chyba při hledání"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Zavřít"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Formát souboru nerozpoznán"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Nastavení"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Chyba při čtení popisných dat"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_O Programu"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Doplňky ..."
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Vzhled"
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanál"
+msgstr[1] "%d kanály"
+msgstr[2] "%d kanálů"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Zvuk"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Stopa %d"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Síť"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Zvukové CD"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Seznam skladeb"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(neznámý název)"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Informace o skladbě"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Neplatná adresa URI"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Moduly"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Neznámé schéma URI"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Obecné"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Neplatné jméno souboru"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efekt"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Zásluhy"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Znázornění"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licence"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Vstup"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "O Audacious"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Přenos"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Opravdu chcete trvale odstranit \"%s\"?"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Umělec"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Smazat"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Zrušit"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Název"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Smazat playlist"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Číslo stopy"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Neptat se znovu"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Žánr"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Přejmenovat"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Jméno souboru"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Přejmenovat seznam skladeb"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Cesta k souboru"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Chcete načíst tento playlist?"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Datum"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Zapnout"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Rok"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Komentář"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Kodek"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kvalita"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Žádné"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabština"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltské jazyky"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Čínština"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Řečtina"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebrejština"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japonština"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ekvalizér"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Korejština"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Předzesílení"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polština"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Otevřít soubory"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Ruština"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Otevřít"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Tchajwanština"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Zavřít _dialog při otevření"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turečtina"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Přidat soubory"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Plovoucí desetiná čárka"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Přidat"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Nastavení Rozhraní</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Zavřít _dialog při přidání"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Rozhraní modulů"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Zavřít"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Výstupní modul:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Název"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Nastavení výstupu</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Umělec"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bitová hloubka:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Velikost vyrovnávací paměti:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Žánr"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Rok"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Měké oříznutí"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Stopa"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Hlasitost ovládat softwarově (nedoporučuje se)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Délka"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Zesílení při přehrávání</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formát:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Zapnout zesílení při přehrávání"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Kvalita:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Režim alba"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Datový tok Bitrate: "
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Předcházet ořezu (doporučuje se)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid jazz"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Míra úpravy</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid rock"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Zesílit všechny soubory:"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebob"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Zesílit soubory bez popisků:"
-
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Jméno počítače:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Port:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Jméno:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Heslo:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Nastavení proxy</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Používat proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Autentizovat se na proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Automatické rozpoznávání kódovaní znaků:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Záložní kódování znaků:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Chování</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Pokračovat v přehrávání po spuštění"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Přejít dál, když současná skladba je smazána"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Při otvírání souborů vyprázdnit seznam skladeb"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Otevřít soubory do dočasného seznamu skladeb"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Nenačítat metadata skladeb před přehráním"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Kompatibilita</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpret \\ (zpětné lomítko) jako oddělovač složky"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Album</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Vyhledat obrázky odpovídající těmto slovům (oddělené čárkou):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Vyloučit obrázky vyhovují těmto slovům (oddělené čárkou):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Hledat obrázky odpovídající názevu hudebního souboru"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Hledat rekurzivně"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Hloubka prohledání:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Vyskakovací okno s podrobnostmi</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Zobrazit popup informace"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Popup zpoždění (desetiny sekundy):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Zobrazit časové měřítko pro aktuální skladby"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "NÁZEV"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "UMĚLEC – NÁZEV"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "UMĚLEC – ALBUM – NÁZEV"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "UMĚLEC – ALBUM – STOPA. NÁZEV"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "UMĚLEC [ ALBUM ] – STOPA. NÁZEV"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM – NÁZEV"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategorie"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Vlastní"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Zobrazení skladby</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Zobrazovat čísla skladeb"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Zobrazovat úvodní nuly (02:00 místo 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Formát názvu:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Vlastní řetězec:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Nastavení Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Nepodařilo se vytvořit adresář (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Zvukové CD, stopa %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanál"
-msgstr[1] "%d kanály"
-msgstr[2] "%d kanálů"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Zásluhy"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licence"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "O Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Opravdu chcete trvale odstranit \"%s\"?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Smazat"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Smazat playlist"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Neptat se znovu"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Přejmenovat"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Přejmenovat seznam skladeb"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Chcete načíst tento playlist?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Zapnout"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ekvalizér"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Předzesílení"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Stopa"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Délka"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Formát:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Kvalita:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Datový tok Bitrate: "
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebob"
-
-#: src/libaudgui/infowin.c:80
+#: src/libaudgui/infowin.cc:87
 msgid "Bluegrass"
 msgstr "Bluegrass"
 
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "Blues"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Komorní hudba"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klasika"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disko"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Příjemné poslouchání"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "Nová vlna"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
-msgstr "Šum"
+msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "R&B"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Ukládání proběhlo úspěšně"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Chyba při ukládání"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Informace o skladbě"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Album Umělec"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Komentář"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Číslo stopy"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Smaza_t pole při posunu na další skladbu"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Ulozit"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Další"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "Nedostupné"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Pro %s nejsou dostupné žádné údaje.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Přeskočit"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Přejít na čas"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Zadejte čas (minuty: sekundy):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Přepsat %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Fronta"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Ode_brat z fronty"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Přejít na skladbu"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtr: "
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtr:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Zavřít při skoku"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_Přepsat"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Potvrdit přepsání"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Přepsat %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Exportovat seznam skladeb"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Exportovat"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importovat seznam skladeb"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Importovat"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Správce fronty"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Doplňky ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr ""
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "O %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Otevřít soubory"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Nastavení"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Otevrit"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Nastavit"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Zavřít _dialog při otevření"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Nastavení"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Přidat soubory"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_O Programu"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Přidat"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Vzhled"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Zavřít _dialog při přidání"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Zvuk"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Fronta"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Síť"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Ode_brat z fronty"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Seznam skladeb"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Přejít na skladbu"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Moduly"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtr: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Obecné"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtr:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efekt"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Zavřít při skoku"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Znázornění"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Vstup"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Přenos"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Číslo stopy"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Jméno souboru"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Cesta k souboru"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Datum"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Kodek"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kvalita"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Žádné"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabština"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltské jazyky"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Čínština"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Řečtina"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebrejština"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japonština"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Korejština"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polština"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Ruština"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Tchajwanština"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turečtina"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Plovoucí desetiná čárka"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Nastavení Rozhraní</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Rozhraní modulů"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Výstupní modul:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Nastavení výstupu</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bitová hloubka:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Velikost vyrovnávací paměti:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Měké oříznutí"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Hlasitost ovládat softwarově (nedoporučuje se)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Zesílení při přehrávání</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Zapnout zesílení při přehrávání"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Režim alba"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Předcházet ořezu (doporučuje se)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Míra úpravy</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Zesílit všechny soubory:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Zesílit soubory bez popisků:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Jméno počítače:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Port:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Jméno:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Heslo:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Síťová nastavení</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Nastavení proxy</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Používat proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Autentizovat se na proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Automatické rozpoznávání kódovaní znaků:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Záložní kódování znaků:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Chování</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Pokračovat v přehrávání po spuštění"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Pozastavit namísto okamžitého pokračování v přehrávání"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Přejít dál, když současná skladba je smazána"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Při otvírání souborů vyprázdnit seznam skladeb"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Otevřít soubory do dočasného seznamu skladeb"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Kompatibilita</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpret \\ (zpětné lomítko) jako oddělovač složky"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Zobrazení skladby</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Zobrazovat čísla skladeb"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Zobrazovat úvodní nuly (02:00 místo 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Pokročilé</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Nenačítat popisná data skladeb před přehráním"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Prozkoumat obsah souborů, u kterých není rozeznána přípona souboru"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Album</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Vyhledat obrázky odpovídající těmto slovům (oddělené čárkou):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Vyloučit obrázky vyhovují těmto slovům (oddělené čárkou):"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Správce seznamů skladeb"
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Hledat obrázky odpovídající názevu hudebního souboru"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Hledat rekurzivně"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Hloubka prohledání:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Vyskakovací okno s podrobnostmi</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Zobrazit popup informace"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Popup zpoždění (desetiny sekundy):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Zobrazit časové měřítko pro aktuální skladby"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "NÁZEV"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "UMĚLEC – NÁZEV"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "UMĚLEC – ALBUM – NÁZEV"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "UMĚLEC – ALBUM – STOPA. NÁZEV"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "UMĚLEC [ ALBUM ] – STOPA. NÁZEV"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM – NÁZEV"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategorie"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Vlastní"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Formát názvu:"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Položky"
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Vlastní řetězec:"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Nový"
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Nastavení Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Správce fronty"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Přej_menovat"
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Vyřadit z fronty"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Hrát"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Pracuje..."
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Při aktiva_ci seznamu skladeb zavřít dialog"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Chyba"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Otevřít URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Přidat URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Zadejte URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Další zprávy jsou skryty.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Otevřít složku"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Přidat složku"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Otevřít"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Přidat"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Popisná data"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Skladatel"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Účinkující"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Rok nahrání"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Datum nahrání"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Technický"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Typ MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Datový tok"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Pro %s nejsou dostupné žádné údaje.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Úroveň"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Jméno souboru"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Linka"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Funkce"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Zpráva"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Inspektor logů"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Úroveň záznamu:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Ladění"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Informace"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Varování"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Přídavné moduly..."
diff --git a/po/da.po b/po/da.po
index 772369b9f865..6524f8d20253 100644
--- a/po/da.po
+++ b/po/da.po
@@ -8,9 +8,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-05 21:44+0000\n"
-"Last-Translator: Joe Hansen <joedalton2 at yahoo.dk>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Danish (http://www.transifex.com/projects/p/audacious/"
 "language/da/)\n"
 "Language: da\n"
@@ -19,131 +19,137 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Søger ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d fil fundet"
-msgstr[1] "%d filer fundet"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Ny afspilningsliste"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Fejl"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Vis hjælp for kommandolinjen"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Vis version"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Start afspilning"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Sæt afspilning på pause"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Sæt på pause hvis der afspilles, ellers afspilles der"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Stop afspilning"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Gå til forrige sang"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Gå til næste sang"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Tilføj filer til afspilningslisten"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Tilføj filer til en midlertidig afspilningsliste"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Vis hovedvinduet"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Vis hop til sang-vinduet"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Start uden en grafisk grænseflade"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Afslut når afspilning stopper"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Udskriv fejlsøgningsbeskeder"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Udskriv fejlsøgningsbeskeder (kan bruges to gange)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Kør i Qt-tilstand"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Ukendt indstilling: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Ukendt indstilling: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr "Brug: audacious [TILVALG] ... [FIL] ...\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Ingen afkoder fundet for %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d fil fundet"
+msgstr[1] "%d filer fundet"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s kunne ikke åbnes."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Ny afspilningsliste"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Kan ikke indlæse %s: filendelsen er ikke understøttet."
+msgid "Audio CD, track %s"
+msgstr "Lyd-cd, nummer %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(tegnkodningsfejl)"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Der opstod en fejl ved indlæsning af udvidelsesmodul"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Kan ikke gemme %s: filendelsen er ikke understøttet."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Fejl under åbning af %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Ukendt afspilningsfejl"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Ugyldigt lydformat"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Spiller nu"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -151,887 +157,1051 @@ msgstr ""
 "Afspilningslisten kan ikke sorteres da skanning af metadataene stadig er i "
 "gang (eller er blevet deaktiveret)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Om"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Kan ikke indlæse %s: navnet på filendelsen er ikke understøttet."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Indstillinger"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Kan ikke gemme %s: navnet på filendelsen er ikke understøttet."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Angiv"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Søgefejl"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Afbryd"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Filformatet blev ikke genkendt"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Luk"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Der opstod en fejl under læsning af metadata"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Indstillinger"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Om"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Udvidelsesmoduler ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanal"
+msgstr[1] "%d kanaler"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Fremtoning"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Spor %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Lyd"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Lyd-cd"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Netværk"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(ukendt titel)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Afspilningsliste"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Ugyldig URI"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Sanginformation"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Ukendt URI-skema"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Udvidelsesmoduler"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Ugyldigt filnavn"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Generelt"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Rulletekster"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Effekt"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licens"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualisering"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Om Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Lydindgang"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Ønsker du permanent at fjerne »%s«?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transport:"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Fjern"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Kunstner"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Afbryd"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Fjern afspilningsliste"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Titel"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Spørg ikke igen"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Rækkefølge for nummeret"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Omdøb"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Genre"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Omdøb afspilningsliste"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Filnavn"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Hvad ønsker du at kalde denne afspilningsliste?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Filsti"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Aktiver"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Dato"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "År"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Kommentar"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kvalitet"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Ingen"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabisk"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltisk"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Kinesisk"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Græsk"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebraisk"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Equalizer"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japansk"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamp"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Koreansk"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Åbn filer"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polsk"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Åbn"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Russisk"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Luk _dialog ved åbn"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanesisk"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Tilføj filer"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Tyrkisk"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Tilføj"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Decimaltal"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Luk _dialog ved tilføj"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Indstillinger for grænseflade</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Luk"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Udvidelsesmodul for grænseflade:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Titel"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Udvidelsesmodul for lydudgang:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Kunstner"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Indstillinger for lydudgang</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bit-dybde"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Genre"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Butterstørrelse:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "År"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Nummer"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Blød beskæring"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Længde"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Brug programmets styring af lydstyrken (anbefales ikke)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Format:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Afspilningsforstærkning</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Kvalitet:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Aktiver forstærkning af afspilning"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bithastighed:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Albumtilstand"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Forhindr kliklyde (anbefales)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Juster niveauer</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Forstærk alle filer:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Forstærk umærkede filer:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Proxyværtsnavn:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Kammermusik"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Proxyport:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Proxybrugernavn:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Proxyadgangskode:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Proxykonfiguration</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Aktiver brug af proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Brug godkendelse med proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Automatisk tegnkodningsdetektor for"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Reservetegnkodninger:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Opførsel</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Fortsæt afspilning ved opstart"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Gå videre når den nuværende sang slettes"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Ryd afspilningslisten når der åbnes filer"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Åbn filer i midlertidig afspilningsliste"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Indlæs ikke metadata for sange før de afspilles"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Kompatibilitet</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Fortolk \\ (baglæns skråstreg) som en mappeafgrænser"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Omslag</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Søg efter billeder der matcher disse ord (kommaadskilt):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Ekskulder billeder der matcher disse ord (kommaadskilt):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Søg efter billeder der matcher filnavn for sangen"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Søg rekursivt"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Søgedybde:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Pop op-information</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Vis pop op-information"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Pop op-forsinkelse (tiendedele af et sekund):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Vis tidsskala for nuværende sang"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TITEL"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "KUNSTNER - TITEL"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "KUNSTNER - ALBUM - TITEL"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "KUNSTNER - ALBUM - NUMMER. TITEL"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "KUNSTNER [ ALBUM ] - NUMMER. TITEL"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - TITEL"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategori"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Tilpasset"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Sangvisning</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Vis sangenes numre"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Vis foranstillede nuller (02:00 i stedet for 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Titelformat:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Tilpasset streng:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Indstillinger for Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Kunne ikke oprette mappe (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Lyd-cd, nummer %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanal"
-msgstr[1] "%d kanaler"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Rulletekster"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licens"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Om Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Ønsker du permanent at fjerne »%s«?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Fjern"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Fjern afspilningsliste"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Spørg ikke igen"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Omdøb"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Omdøb afspilningsliste"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Hvad ønsker du at kalde denne afspilningsliste?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Aktiver"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Equalizer"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamp"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Nummer"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Længde"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Format:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Kvalitet:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Bithastighed:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Kammermusik"
-
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klassisk"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Dødsmetal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disko"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Blød pop"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsterrap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hård rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavymetal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Larm"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock og rul"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rytme og blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Tekno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Gemt med succes"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Fejl under gemning"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Sanginformation"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Kunstner"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Kommentar"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Rækkefølge"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "_Ryd felter når der gås til næste sang"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Gem"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Næste"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "-"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Ingen information tilgængelig for %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Hop"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Hop til tid"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Indtast tid (minutter:sekunder):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Overskriv %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Sæt i kø"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "_Fjern fra kø"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Hop til sang"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filter:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filter:"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "_Luk ved hop"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_Overskriv"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Bekræft overskriv"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Overskriv %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Eksporter afspilningsliste"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Eksporter"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importer afspilningsliste"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Importer"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Håndtering af køer"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Udvidelsesmoduler ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Fjern fra kø"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Om %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Åbn filer"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s-indstillinger"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Åbn"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Angiv"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Luk _dialog ved åbn"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Indstillinger"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Tilføj filer"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Om"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Tilføj"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Fremtoning"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Luk _dialog ved tilføj"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Lyd"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Sæt i kø"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Netværk"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "_Fjern fra kø"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Afspilningsliste"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Hop til sang"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Udvidelsesmoduler"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filter:"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Generelt"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filter:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Effekt"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "_Luk ved hop"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualisering"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Håndtering af afspilningslister"
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Lydindgang"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Poster"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transport:"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Ny"
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Rækkefølge"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "_Omdøb"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Filnavn"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Filsti"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Dato"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codec"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kvalitet"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Ingen"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabisk"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltisk"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Kinesisk"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Græsk"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebraisk"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japansk"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Koreansk"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polsk"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Russisk"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanesisk"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Tyrkisk"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Decimaltal"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Indstillinger for grænseflade</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Udvidelsesmodul for grænseflade:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Udvidelsesmodul for lydudgang:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Indstillinger for lydudgang</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bit-dybde"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Butterstørrelse:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Blød beskæring"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Brug programmets styring af lydstyrken (anbefales ikke)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Afspilningsforstærkning</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Aktiver forstærkning af afspilning"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Albumtilstand"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Forhindr kliklyde (anbefales)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Juster niveauer</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Afspil"
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Forstærk alle filer:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Forstærk umærkede filer:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Proxyværtsnavn:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Proxyport:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Proxybrugernavn:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Proxyadgangskode:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Netværksindstillinger</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Proxykonfiguration</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Aktiver brug af proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Brug godkendelse med proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Automatisk tegnkodningsdetektor for"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Reservetegnkodninger:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Opførsel</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Genoptag afspilning ved opstart"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Pause i stedet for at genoptage øjeblikkeligt"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Gå videre når den nuværende sang slettes"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Ryd afspilningslisten når der åbnes filer"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Åbn filer i midlertidig afspilningsliste"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Kompatibilitet</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Fortolk \\ (baglæns skråstreg) som en mappeafgrænser"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Sangvisning</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Vis sangenes numre"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Vis foranstillede nuller (02:00 i stedet for 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Avanceret</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Indlæs ikke metadata for sange før de afspilles"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Undersøg indholdet af filer uden et genkendt navn på filendelserne"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Omslag</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Søg efter billeder der matcher disse ord (kommaadskilt):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Ekskulder billeder der matcher disse ord (kommaadskilt):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Søg efter billeder der matcher filnavn for sangen"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Søg rekursivt"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Søgedybde:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Pop op-information</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Vis pop op-information"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Pop op-forsinkelse (tiendedele af et sekund):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Vis tidsskala for nuværende sang"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TITEL"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "KUNSTNER - TITEL"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "KUNSTNER - ALBUM - TITEL"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "KUNSTNER - ALBUM - NUMMER. TITEL"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "KUNSTNER [ ALBUM ] - NUMMER. TITEL"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - TITEL"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategori"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Tilpasset"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Titelformat:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Tilpasset streng:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Indstillinger for Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Håndtering af køer"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Luk dialog ved aktivering af afspilningsliste"
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Fjern fra kø"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Arbejder ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Fejl"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Åbn adresse"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Tilføj adresse"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Indtast adresse:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Yderligere beskeder er blevet skjult)."
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadata"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Komponist"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Artist"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Optagelsesår"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Optagelsesdato"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Teknisk"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIME-type"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bithastighed"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Ingen information tilgængelig for %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Niveau"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Filnavn"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Linje"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Funktion"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Besked"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Loginspektør"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Logniveau:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Fejlsøg"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Info"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Advarsel"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Udvidelsesmoduler ..."
diff --git a/po/de.po b/po/de.po
index 59d259481b65..267f52da749b 100644
--- a/po/de.po
+++ b/po/de.po
@@ -4,17 +4,19 @@
 #
 # Translators:
 # Chris <ppt23 at lkj.hopto.org>, 2012
+# Chris <ppt23 at lkj.hopto.org>, 2012
 # mschwendt <mschwendt at fedoraproject.org>, 2012
 # mschwendt <mschwendt at fedoraproject.org>, 2012
 # Chris <ppt23 at lkj.hopto.org>, 2012
 # Thomas Lange <thomas-lange2 at gmx.de>, 2011
 # Thomas Lange <thomas-lange2 at gmx.de>, 2011
+# Thomas Lange <thomas-lange2 at gmx.de>, 2011,2014
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-14 19:43+0000\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:39+0000\n"
 "Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: German (http://www.transifex.com/projects/p/audacious/"
 "language/de/)\n"
@@ -24,96 +26,81 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Suche ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d Datei gefunden"
-msgstr[1] "%d Dateien gefunden"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Neue Wiedergabeliste"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Fehler"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Hilfe anzeigen"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Version anzeigen"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Wiedergabe starten"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Wiedergabe pausieren"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Wiedergabe pausieren falls aktiv, sonst starten"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Wiedergabe stoppen"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Zu nächstem Titel springen"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Zu vorherigen Titel springen"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Dateien zur Wiedergabeliste hinzufügen"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Dateien zu temporärer Wiedergabeliste hinzufügen"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Hauptfenster anzeigen"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "»Zu Titel springen«-Fenster anzeigen"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Ohne grafische Benutzeroberfläche starten"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Nach dem Ende der Wiedergabe beenden"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
 msgstr "Debugmeldungen anzeigen"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Im Qt Modus ausführen"
+
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Unbekannte Option: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Unbekannte Option: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -122,35 +109,56 @@ msgstr ""
 "Aufruf: audacious [OPTION] ... [DATEI] ...\n"
 " \n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Kein Dekodierer gefunden für »%s«."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d Datei gefunden"
+msgstr[1] "%d Dateien gefunden"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "»%s« konnte nicht geöffnet werden."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Neue Wiedergabeliste"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Laden von »%s« nicht möglich: nicht unterstützte Dateiendung."
+msgid "Audio CD, track %s"
+msgstr "Audio-CD, Titel »%s«"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(Fehler bei Zeichencodierung)"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Fehler beim Laden des Plugins"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Speichern von »%s« nicht möglich: nicht unterstützte Dateiendung."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Fehler beim Öffnen von %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Unbekannter Wiedergabefehler"
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Ungültiges Audioformat"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Momentane Wiedergabe"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -158,889 +166,1053 @@ msgstr ""
 "Die Wiedergabeliste kann nicht sortiert werden, weil das Scannen der "
 "Metadaten noch aktiv ist (oder deaktiviert wurde)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Info zu"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Laden von »%s« nicht möglich: nicht unterstützte Dateiendung."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Einstellungen"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Speichern von »%s« nicht möglich: nicht unterstützte Dateiendung."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Setzen"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Suchfehler"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Abbrechen"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Dateiformat nicht erkannt"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "S_chließen"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Fehler beim Lesen der Metadaten"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Einstellungen"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Info"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Plugins ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d Kanal"
+msgstr[1] "%d Kanäle"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Aussehen"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Titel %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Audio"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Audio-CD"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Netzwerk"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(unbekannter Titel)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Wiedergabeliste"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Ungültige URI"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Titelinfo"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Unbekanntes URI Schema"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Plugins"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Ungültiger Dateiname"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Allgemein"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Mitwirkende"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Effekte"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Lizenz"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualisierung"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Info zu Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Eingabe"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Wollen Sie wirklich »%s« dauerhaft löschen?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transport"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Löschen"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Künstler"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Abbrechen"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Wiedergabeliste löschen"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Titel"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Nicht mehr fragen"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Titelnummer"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Umbenennen"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Genre"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Wiedergabeliste umbenennen"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Dateiname"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Wie soll diese Wiedergabeliste heißen?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Dateipfad"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Aktiv"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Datum"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Jahr"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Kommentar"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Qualität"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Keine"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabisch"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltisch"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Chinesisch"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Griechisch"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebräisch"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Equalizer"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japanisch"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Vorverstärkung"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Koreanisch"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Dateien öffnen"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polnisch"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "Ö_ffnen"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Russisch"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "_Dialog beim Öffnen schließen"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanisch"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Dateien hinzufügen"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Türkisch"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Hinzufügen"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Gleitkomma"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "_Dialog beim Hinzufügen schließen"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Interface Einstellungen</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "S_chließen"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Interface-Plugin:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Titel"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Ausgabe-Plugin:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Künstler"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Ausgabeeinstellungen</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bittiefe:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Genre"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Puffergröße:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Jahr"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Nummer"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Softwareseitige Amplitudenbegrenzung"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Dauer"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Softwareseitige Lautstärkeregelung benutzen (nicht empfohlen)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Format:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Wiedergabeverstärkung</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Qualität:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Wiedergabeverstärkung aktivieren"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bitrate:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Albummodus"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Übersteuern verhindern (empfohlen)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Psychedelic Rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Pegel anpassen</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Alle Dateien verstärken:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Unmarkierte Dateien verstärken:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Proxy-Host:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Proxy-Port:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Benutzername für Proxy:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Passwort für Proxy:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Proxy Konfiguration</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Proxy aktivieren"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Benutze Authentisierung mit Proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Automatische Zeichensatzerkennung für:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Alternative Zeichensätze:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Verhalten</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Wiedergabe beim Starten fortführen"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Fortschreiten, falls aktueller Titel gelöscht wird"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Wiedergabeliste beim Öffnen neuer Dateien leeren"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Dateien in temporärer Wiedergabeliste öffnen"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Metadaten erst laden, wenn Titel gespielt wird"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Kompatibilität</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpretiere \\ (Backslash) als Pfadtrennzeichen"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Album-Cover</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-"Nach Bildern suchen, die diese Wörter enthalten (durch Kommas getrennt):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"Bilder ausschließen, die diese Wörter enthalten (durch Kommas getrennt):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Nach Bildern suchen, die mit dem Dateinamen des Titels übereinstimmen"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Rekursiv suchen"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Suchtiefe:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Popup-Informationen</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Popup-Informationen anzeigen"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "PopUp-Verzögerung (Zehntel einer Sekunde):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Fortschrittsbalken für aktuellen Titel anzeigen"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TITEL"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "KÜNSTLER - TITEL"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "KÜNSTLER - ALBUM - TITEL"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "KÜNSTLER - ALBUM - TITELNUMMER. TITEL"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "KÜNSTLER [ ALBUM ] - TITELNUMMER. TITEL"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - TITEL"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategorie"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Benutzerdefiniert"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Titelanzeige</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Zeige Titelnummern"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Führende Nullen anzeigen (02:00 anstatt 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Titelformat:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Eigene Zeichenkette:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Audacious Einstellungen"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Konnte Verzeichnis (»%s«) nicht erstellen: %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Audio-CD, Titel »%s«"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d Kanal"
-msgstr[1] "%d Kanäle"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Credits"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Lizenz"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Info zu Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Wollen Sie wirklich »%s« dauerhaft löschen?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Löschen"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Wiedergabeliste löschen"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Nicht mehr fragen"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Umbenennen"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Wiedergabeliste umbenennen"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Wie soll diese Wiedergabeliste heißen?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Aktiv"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Equalizer"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Vorverstärkung"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Nummer"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Dauer"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Format:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Qualität:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Bitrate:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Psychedelic Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Kammermusik"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klassisch"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-Hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock ’n’ Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm & Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-Hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Speichern erfolgreich"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Speichern fehlgeschlagen"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Titelinfo"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Album-Künstler"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Kommentar"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Titelnummer"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "_Felder bei Wechsel zu nächstem Lied leeren"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Speichern"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Nächster"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/V"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Keine Information verfügbar für »%s«.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Springen"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Zu Zeitangabe springen"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Zeitangabe (Minuten:Sekunden):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "»%s« überschreiben?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "In _Warteschlange"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Aus _Warteschlange"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Zu Titel springen"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filter: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filter:"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "_Nach Springen schließen"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "Über_schreiben"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Überschreiben bestätigen"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "»%s« überschreiben?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Wiedergabeliste exportieren"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Exportieren"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Wiedergabeliste importieren"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Importieren"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Warteschlangen-Manager"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Plugins ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "Aus _Warteschlange"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Info zu %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Dateien öffnen"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Einstellungen"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "Ö_ffnen"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Setzen"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "_Dialog beim Öffnen schließen"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Einstellungen"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Dateien hinzufügen"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Info"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Hinzufügen"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Aussehen"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "_Dialog beim Hinzufügen schließen"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audio"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "In _Warteschlange"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Netzwerk"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Aus _Warteschlange"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Wiedergabeliste"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Zu Titel springen"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Plugins"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filter: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Allgemein"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filter:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Effekte"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "_Nach Springen schließen"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualisierung"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Wiedergabelisten-Manager"
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Eingabe"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Einträge"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transport"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Neu"
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Titelnummer"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "_Umbenennen"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Dateiname"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Wiedergabe"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Dateipfad"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Dialog beim Öffnen einer Liste _schließen"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Datum"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codec"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Qualität"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Keine"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltisch"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Chinesisch"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Griechisch"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebräisch"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japanisch"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Koreanisch"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polnisch"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Russisch"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanisch"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Türkisch"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Gleitkomma"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Interface Einstellungen</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Interface-Plugin:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Ausgabe-Plugin:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Ausgabeeinstellungen</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bittiefe:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Puffergröße:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Softwareseitige Amplitudenbegrenzung"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Softwareseitige Lautstärkeregelung benutzen (nicht empfohlen)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Wiedergabeverstärkung</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Wiedergabeverstärkung aktivieren"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Albummodus"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Übersteuern verhindern (empfohlen)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Pegel anpassen</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Alle Dateien verstärken:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Unmarkierte Dateien verstärken:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Proxy-Host:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Proxy-Port:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Benutzername für Proxy:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Passwort für Proxy:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Netzwerkeinstellungen</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Proxy Konfiguration</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Proxy aktivieren"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Benutze Authentisierung mit Proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Automatische Zeichensatzerkennung für:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Alternative Zeichensätze:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Verhalten</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Wiedergabe beim Starten fortsetzen"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Pausieren anstatt Wiedergabe fortsetzen"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Fortschreiten, falls aktueller Titel gelöscht wird"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Wiedergabeliste beim Öffnen neuer Dateien leeren"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Dateien in temporärer Wiedergabeliste öffnen"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Kompatibilität</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpretiere \\ (Backslash) als Pfadtrennzeichen"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Titelanzeige</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Zeige Titelnummern"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Führende Nullen anzeigen (02:00 anstatt 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Erweitert</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Metadaten erst laden, wenn Titel gespielt wird"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Inhalt von Dateien ohne erkannte Dateiendung untersuchen"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Album-Cover</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr ""
+"Nach Bildern suchen, die diese Wörter enthalten (durch Kommas getrennt):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr ""
+"Bilder ausschließen, die diese Wörter enthalten (durch Kommas getrennt):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Nach Bildern suchen, die mit dem Dateinamen des Titels übereinstimmen"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Rekursiv suchen"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Suchtiefe:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Popup-Informationen</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Popup-Informationen anzeigen"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Popup-Verzögerung (Zehntel einer Sekunde):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Fortschrittsbalken für aktuellen Titel anzeigen"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TITEL"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "KÜNSTLER - TITEL"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "KÜNSTLER - ALBUM - TITEL"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "KÜNSTLER - ALBUM - TITELNUMMER. TITEL"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "KÜNSTLER [ ALBUM ] - TITELNUMMER. TITEL"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - TITEL"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategorie"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Benutzerdefiniert"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Titelformat:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Eigene Zeichenkette:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Audacious Einstellungen"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Warteschlangen-Manager"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "Aus _Warteschlange"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "In Bearbeitung ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Fehler"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "URL öffnen"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "URL hinzufügen"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "URL eingeben:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Weitere Meldungen wurden nicht angezeigt.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Ordner öffnen"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Ordner hinzufügen"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Öffnen"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadaten"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Komponist"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Interpret"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Aufnahmejahr"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Aufnahmedatum"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Technisch"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIME-Typ"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Keine Information verfügbar für »%s«.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Level"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Dateiname"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Zeile"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Funktion"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Meldung"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Protokoll-Inspektor"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Logging-Level:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Debug"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Information"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Warnung"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Plugins ..."
diff --git a/po/el.po b/po/el.po
index cfa91d7194ef..e0847b9f0dac 100644
--- a/po/el.po
+++ b/po/el.po
@@ -3,6 +3,7 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
+# gis mapps <gismapps at gmail.com>, 2014
 # Marinos Zak <marinoszak at gmail.com>, 2012
 # Marinos Zak <marinoszak at gmail.com>, 2012
 # Marinos Zak <marinoszak at gmail.com>, 2012
@@ -13,9 +14,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-05-05 11:44+0000\n"
-"Last-Translator: Γιάννης Ανθυμίδης <yannanth at gmail.com>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Greek (http://www.transifex.com/projects/p/audacious/language/"
 "el/)\n"
 "Language: el\n"
@@ -24,131 +25,135 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Αναζήτηση ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "βρέθηκε %d αρχείο"
-msgstr[1] "βρέθηκαν %d αρχεία"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Νέα Λίστα Αναπαραγωγής"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Σφάλμα"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Προβολή βοήθειας  για τη γραμμή εντολών"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Εμφάνιση έκδοσης"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Έναρξη αναπαραγωγής"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Παύση αναπαραγωγής"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Παύση αν παίζει, αλλιώς αναπαραγωγή"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Διακοπή αναπαραγωγής"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Μετάβαση στο προηγούμενο κομμάτι"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Μετάβαση στο επόμενο κομμάτι"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Προσθήκη αρχείων στη λίστα τραγουδιών"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
-msgstr ""
+msgstr "Προσθήκη αρχείων σε μια προσωρινή λίστα αναπαραγωγής"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Εμφάνιση του κυρίους παραθύρου"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Έξοδος στη διακοπή αναπαραγωγής"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Προβολή μηνυμάτων εντοπισμού σφαλμάτων"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Άγνωστη επιλογή: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Άγνωστη επιλογή: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Δεν βρέθηκε αποκωδικοποιητής για %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "βρέθηκε %d αρχείο"
+msgstr[1] "βρέθηκαν %d αρχεία"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "Δεν ήταν δυνατό το άνοιγμα του %s."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Νέα Λίστα Αναπαραγωγής"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid "Audio CD, track %s"
+msgstr "Μουσικό CD, κομμάτι %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Σφάλμα κατά τη φόρτωση του plugin"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Αναπαράγεται τώρα"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -156,891 +161,1055 @@ msgstr ""
 "Η λίστα αναπαραγωγής δεν μπορεί να ταξινομηθεί επειδή η σάρωση για "
 "μεταδεδομένα είναι ακόμα σε εξέλιξη (ή έχει απενεργοποιηθεί)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Περί"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Ρυθμίσεις"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "Ά_κυρο"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Η μορφή αρχείου δεν αναγνωρίζεται"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Κλείσιμο"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Ρυθμίσεις"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Μονοφωνικό"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Περί"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Στερεοφωνικό"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "Π_ρόσθετα ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d κανάλι"
+msgstr[1] "%d κανάλια"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Εμφάνιση"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Ήχος"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Δίκτυο"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Λίστα αναπαραγωγής"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Πληροφορίες Κομματιού"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Πρόσθετα"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Γενικά"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Μνεία"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Εφέ"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Άδεια"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Οπτικοποίηση"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Σχετικά με το Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Γραμμή Εισόδου"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Θέλετε να αφαιρέσετε τη λίστα «%s» για πάντα;"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Μεταφορά"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "Α_φαίρεση"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Καλλιτέχνης"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "Ά_κυρο"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Άλμπουμ"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Αφαίρεση Λίστας"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Τίτλος"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Αριθμός Κομματιού"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Μετονομασία"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Γένος"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Μετονομασία λίστας αναπαραγωγής"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Όνομα Αρχείου"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Τοποθεσία Αρχείου"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Ενεργοποίηση"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Ημερομηνία"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Έτος"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Σχόλιο"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Πολυμέσο"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Ποιότητα"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Κανένα"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Αραβικά"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Βαλτικά"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Κινέζικα"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Ελληνικά"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Εβραϊκά"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ισοσταθμιστής"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Ιαπωνικά"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Προενίσχυση"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Κορεάτικα"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Άνοιγμα Αρχείων"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Πολωνικά"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Άνοιγμα"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Ρώσικα"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Ταϊβανέζικα"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Προσθήκη Αρχείων"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Τούρκικα"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Προσθήκη"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Κινητή υποδιαστολή"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Ρυθμίσεις Διεπαφής</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Κλείσιμο"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Πρόσθετο διεπαφής:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Τίτλος"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Πρόσθετο γραμμής εξόδου:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Καλλιτέχνης"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Ρυθμίσεις Εξόδου</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Άλμπουμ"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Βάθος μπιτ:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Γένος"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Μέγεθος προσωρινής μνήμης:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Έτος"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Κομμάτι"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr ""
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Μήκος"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Χρήση λογισμικό ελέγχου έντασης (δεν συνιστάται)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Μορφή:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr ""
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Ποιότητα:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr ""
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Ρυθμός διαμεταγωγής (bitrate)"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Λειτουργία άλμπουμ"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Αποτροπή αποκοπής (συνιστάται)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Ρύθμιση Επιπέδων</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Ενίσχυση όλων των αρχείων:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Ενίσχυση αρχείων χωρίς ετικέτες:"
-
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Διεύθυνση διαμεσολαβητή:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Θύρα διαμεσολαβητή:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Όνομα χρήστη διαμεσολαβητή:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Κωδικός πρόσβασης διαμεσολαβητή:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Ρύθμιση Διαμεσολαβητή</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Χρήση διαμεσολαβητή"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Χρήση πιστοποίησης με το διαμεσολαβητή"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Αυτόματη αναγνώριση κωδικοσελίδας για:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Εναλλακτικές κωδικοποιήσεις χαρακτήρων:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Συμπεριφορά</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Συνέχεια αναπαραγωγής στην εκκίνηση"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Προχώρησε όταν το τρέχων αρχείο διαγραφεί"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Καθάρισμα της λίστας αναπαραγωγής όταν ανοίγουν αρχεία"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Άνοιγμα αρχείων σε μια προσωρινή λίστα αναπαραγωγής"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Μην φορτώνεις μεταδεδομένα για τα τραγούδια προτού παίξουν"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Συμβατότητα</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Ερμηνεία \\ (αντιπλάγια) ως διαχωριστή φακέλων"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b> Άλμπουμ Τέχνης</ b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-"Αναζήτηση για εικόνες που ταιριάζουν με αυτά τα λόγια (διαχωρισμένα με "
-"κόμμα):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"Εξαίρεση των εικόνων που ταιριάζουν με αυτά τα λόγια (διαχωρισμένα με κόμμα):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr ""
-"Αναζήτηση για εικόνες που ταιριάζουν με το όνομα του αρχείου τραγουδιού"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Αναδρομική αναζήτηση"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Βάθος αναζήτησης:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Αναδυόμενες πληροφορίες</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Εμφάνιση πληροφοριών σε αναδυόμενο παράθυρο"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Αναδυόμενη καθυστέρηση (δέκατα του δευτερολέπτου):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Εμφάνιση χρονοδιαγράμματος για το τρέχον τραγούδι"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "ΤΙΤΛΟΣ"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ΚΑΛΛΙΤΕΧΝΗΣ - ΤΙΤΛΟΣ"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ΚΑΛΛΙΤΕΧΝΗΣ - ΑΛΜΠΟΥΜ - ΤΙΤΛΟΣ"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ΚΑΛΛΙΤΕΧΝΗΣ - ΑΛΜΠΟΥΜ - ΤΙΤΛΟΣ. ΤΡΑΓΟΥΔΙΟΥ"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ΚΑΛΛΙΤΕΧΝΗΣ [ ΑΛΜΠΟΥΜ ] - ΤΙΤΛΟΣ. ΤΡΑΓΟΥΔΙΟΥ"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ΑΛΜΠΟΥΜ - ΤΙΤΛΟΣ"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Κατηγορία"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Προσαρμοσμένο"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Προβολή τραγουδιού</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Εμφάνιση αριθμών τραγουδιών"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Εμφάνιση πρωτεύων μηδενικών (02:00 αντί 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Μορφή τίτλου:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Προσαρμοσμένο αλφαριθμητικό:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Ρυθμίσεις Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Δεν ήταν δυνατή η δημιουργία του καταλόγου (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Μουσικό CD, κομμάτι %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Μονοφωνικό"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Στερεοφωνικό"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d κανάλι"
-msgstr[1] "%d κανάλια"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Μνεία"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Άδεια"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Σχετικά με το Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Θέλετε να αφαιρέσετε τη λίστα «%s» για πάντα;"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "Α_φαίρεση"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Αφαίρεση Λίστας"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Μετονομασία"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Μετονομασία λίστας αναπαραγωγής"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Ενεργοποίηση"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ισοσταθμιστής"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Προενίσχυση"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Κομμάτι"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Μήκος"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Μορφή:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Ποιότητα:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "Μπλουζ"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Chamber Music"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Κλασική Μουσική"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Κάντρι"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Ντίσκο"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Φολκ"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Φανκ"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Χιπ χοπ"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Τζαζ"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Μέταλ"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Ποπ"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Ραπ"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Ρέγκε"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Ροκ"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Σουίνγκ"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Τέκνο"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
-msgstr ""
+msgstr "Επιτυχής Αποθήκευση"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
+msgstr "Σφάλμα κατά την Αποθήκευση"
+
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Πληροφορίες Κομματιού"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Σχόλιο"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
+msgstr "Αριθμός Κομματιού"
+
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
-msgstr ""
+msgstr "_Αποθήκευση"
+
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Επόμενο"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kΒ/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Δεν υπάρχουν πληροφορίες για το %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Μετάβαση σε Χρόνο"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Πληκτρολογήστε το χρόνο (λεπτά: δευτερόλεπτα):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Να γίνει αντικατάσταση του %s;"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Στην Ουρά"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Αφ_αίρεση από Ουρά"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Μετάβαση στο Τραγούδι"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Φίλτρο: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Φιλτράρισμα:"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_Αντικατάσταση"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Να γίνει αντικατάσταση του %s;"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Εξαγωγή Λίστας Τραγουδιών"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "Ε_ξαγωγή"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Εισαγωγή Λίστας Τραγουδιών"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Είσαγωγη"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Διαχειριστής Ουράς Αναμονής"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "Π_ρόσθετα ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Σχετικά με το %s"
+
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Ρυθμίσεις"
+
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Άνοιγμα Αρχείων"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Ρυθμίσεις"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Περί"
+
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Εμφάνιση"
+
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Ήχος"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Δίκτυο"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Λίστα αναπαραγωγής"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Πρόσθετα"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Γενικά"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Εφέ"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Οπτικοποίηση"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Γραμμή Εισόδου"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Μεταφορά"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Αριθμός κομματιού"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Όνομα αρχείου"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Διαδρομή αρχείου"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Ημερομηνία"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Πολυμέσο"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Ποιότητα"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Κανένα"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Αραβικά"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Βαλτικά"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Κινέζικα"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Ελληνικά"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Εβραϊκά"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Ιαπωνικά"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Κορεάτικα"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Πολωνικά"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Ρώσικα"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Ταϊβανέζικα"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Τούρκικα"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Κινητή υποδιαστολή"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Ρυθμίσεις Διεπαφής</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Πρόσθετο διεπαφής:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Πρόσθετο γραμμής εξόδου:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Ρυθμίσεις Εξόδου</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Βάθος μπιτ:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Μέγεθος προσωρινής μνήμης:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Χρήση λογισμικό ελέγχου έντασης (δεν συνιστάται)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Προσθήκη Αρχείων"
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Λειτουργία άλμπουμ"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Αποτροπή αποκοπής (συνιστάται)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Ρύθμιση Επιπέδων</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Ενίσχυση όλων των αρχείων:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Ενίσχυση αρχείων χωρίς ετικέτες:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Διεύθυνση διαμεσολαβητή:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Θύρα διαμεσολαβητή:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Όνομα χρήστη διαμεσολαβητή:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Κωδικός πρόσβασης διαμεσολαβητή:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Ρυθμίσεις Δικτύου</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Ρύθμιση Διαμεσολαβητή</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Χρήση διαμεσολαβητή"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Χρήση πιστοποίησης με το διαμεσολαβητή"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Αυτόματη αναγνώριση κωδικοσελίδας για:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Εναλλακτικές κωδικοποιήσεις χαρακτήρων:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Συμπεριφορά</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Στην Ουρά"
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Αφ_αίρεση από Ουρά"
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Προχώρησε όταν το τρέχων αρχείο διαγραφεί"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Μετάβαση στο Τραγούδι"
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Καθάρισμα της λίστας αναπαραγωγής όταν ανοίγουν αρχεία"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Φίλτρο: "
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Άνοιγμα αρχείων σε μια προσωρινή λίστα αναπαραγωγής"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Φιλτράρισμα:"
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Συμβατότητα</b>"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Ερμηνεία \\ (αντιπλάγια) ως διαχωριστή φακέλων"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Προβολή τραγουδιού</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Εμφάνιση αριθμών τραγουδιών"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Εμφάνιση πρωτεύων μηδενικών (02:00 αντί 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Προχωρημένη</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Μην φορτώνεις μεταδεδομένα για τα τραγούδια προτού παίξουν"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b> Άλμπουμ Τέχνης</ b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr ""
+"Αναζήτηση για εικόνες που ταιριάζουν με αυτά τα λόγια (διαχωρισμένα με "
+"κόμμα):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
 msgstr ""
+"Εξαίρεση των εικόνων που ταιριάζουν με αυτά τα λόγια (διαχωρισμένα με κόμμα):"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Διαχείριση Λίστας Τραγουδιών"
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr ""
+"Αναζήτηση για εικόνες που ταιριάζουν με το όνομα του αρχείου τραγουδιού"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Καταχωρήσεις"
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Αναδρομική αναζήτηση"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Νέα"
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Βάθος αναζήτησης:"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "_Μετονομασία"
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Αναδυόμενες πληροφορίες</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Εμφάνιση πληροφοριών σε αναδυόμενο παράθυρο"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Αναδυόμενη καθυστέρηση (δέκατα του δευτερολέπτου):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Εμφάνιση χρονοδιαγράμματος για το τρέχον τραγούδι"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "ΤΙΤΛΟΣ"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ΚΑΛΛΙΤΕΧΝΗΣ - ΤΙΤΛΟΣ"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ΚΑΛΛΙΤΕΧΝΗΣ - ΑΛΜΠΟΥΜ - ΤΙΤΛΟΣ"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ΚΑΛΛΙΤΕΧΝΗΣ - ΑΛΜΠΟΥΜ - ΤΙΤΛΟΣ. ΤΡΑΓΟΥΔΙΟΥ"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ΚΑΛΛΙΤΕΧΝΗΣ [ ΑΛΜΠΟΥΜ ] - ΤΙΤΛΟΣ. ΤΡΑΓΟΥΔΙΟΥ"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ΑΛΜΠΟΥΜ - ΤΙΤΛΟΣ"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Κατηγορία"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Προσαρμοσμένο"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Μορφή τίτλου:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Προσαρμοσμένο αλφαριθμητικό:"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Αναπαραγωγή"
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Ρυθμίσεις Audacious"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Κλείσιμο διαλόγου στην ενεργοποίηση της λίστας"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Διαχειριστής Ουράς Αναμονής"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr ""
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Σφάλμα"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Άνοιγμα διεύθυνσης URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Προσθήκη διεύθυνσης URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Εισαγωγή URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Περαιτέρω μηνύματα έχουν αποκρυφτεί)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Δεν υπάρχουν πληροφορίες για το %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Επίπεδο"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Όνομα Αρχείου"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Πληροφορίες"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/en_GB.po b/po/en_GB.po
index e902e2aeaed5..3896b08a7f20 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -8,9 +8,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/"
 "audacious/language/en_GB/)\n"
 "Language: en_GB\n"
@@ -19,131 +19,135 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Searching ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d file found"
-msgstr[1] "%d files found"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "New Playlist"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Show version"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pause if playing, play otherwise"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Add files to the playlist"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Display the main window"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Quit on playback stop"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Print debugging messages"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "No decoder found for %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d file found"
+msgstr[1] "%d files found"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s could not be opened."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "New Playlist"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid "Audio CD, track %s"
+msgstr "Audio CD, track %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Now Playing"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -151,887 +155,1051 @@ msgstr ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d channel"
+msgstr[1] "%d channels"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Audio"
-
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Network"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Playlist"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Song Info"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Plug-ins"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "General"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Effect"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Credits"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualisation"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licence"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Input"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "About Audacious"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transport"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artist"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Title"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Tracknumber"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Genre"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Filename"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Rename Playlist"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Filepath"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Date"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Enable"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Year"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Comment"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Quality"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "None"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabic"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltic"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Chinese"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Greek"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebrew"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japanese"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Equaliser"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Korean"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamp"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polish"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Open Files"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Russian"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanese"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turkish"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Add Files"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Floating point"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Output plug-in:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Title"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Output Settings</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artist"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bit depth:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Buffer size:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Genre"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Year"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Soft clipping"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Track"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Use software volume control (not recommended)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Length"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Replay Gain</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Enable Replay Gain"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Album mode"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Prevent clipping (recommended)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Adjust Levels</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplify all files:"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplify untagged files:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Proxy hostname:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Proxy port:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Proxy username:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Proxy password:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Proxy Configuration</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Enable proxy usage"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Use authentication with proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Auto character encoding detector for:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Fallback character encodings:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Behaviour</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Continue playback on start-up"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Advance when the current song is deleted"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Clear the playlist when opening files"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Open files in a temporary playlist"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Do not load metadata for songs until played"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibility</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpret \\ (backward slash) as a folder delimiter"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Album Art</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Search for images matching these words (comma-separated):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Exclude images matching these words (comma-separated):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Search for images matching song file name"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Search recursively"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Search depth:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Popup Information</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Show pop-up information"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Pop-up delay (tenths of a second):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Show time scale for current song"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TITLE"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTIST - TITLE"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTIST - ALBUM - TITLE"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTIST - ALBUM - TRACK. TITLE"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTIST [ ALBUM ] - TRACK. TITLE"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - TITLE"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Category"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Custom"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Song Display</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Show song numbers"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Show leading zeroes (02:00 instead of 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Title format:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Custom string:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Could not create directory (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Audio CD, track %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d channel"
-msgstr[1] "%d channels"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Credits"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licence"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "About Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Rename Playlist"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Enable"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Equaliser"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamp"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Track"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Length"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Chamber Music"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Classical"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Song Info"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Comment"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "No info available for %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Jump to Time"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Enter time (minutes:seconds):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Overwrite %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Queue"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Un_queue"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Jump to Song"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filter: "
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filter:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Overwrite %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Export Playlist"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Import Playlist"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Queue Manager"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Open Files"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Add Files"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audio"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Network"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Playlist"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Plug-ins"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "General"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Effect"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualisation"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Input"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transport"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Queue"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Un_queue"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Jump to Song"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Date"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filter: "
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codec"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filter:"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Quality"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "None"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabic"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltic"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Chinese"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Greek"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebrew"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japanese"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Korean"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polish"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Russian"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanese"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turkish"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Floating point"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Playlist Manager"
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Output plug-in:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Output Settings</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bit depth:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Buffer size:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Soft clipping"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Entries"
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Use software volume control (not recommended)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Replay Gain</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Enable Replay Gain"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Album mode"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Prevent clipping (recommended)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Adjust Levels</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplify all files:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplify untagged files:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Proxy hostname:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Proxy port:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Proxy username:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Proxy password:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Proxy Configuration</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Enable proxy usage"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Use authentication with proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Auto character encoding detector for:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Fallback character encodings:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Behaviour</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Advance when the current song is deleted"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Clear the playlist when opening files"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Open files in a temporary playlist"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibility</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpret \\ (backward slash) as a folder delimiter"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Song Display</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Show song numbers"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Show leading zeroes (02:00 instead of 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Do not load metadata for songs until played"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Album Art</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Search for images matching these words (comma-separated):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Exclude images matching these words (comma-separated):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Search for images matching song file name"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Search recursively"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Search depth:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Popup Information</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Show pop-up information"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Pop-up delay (tenths of a second):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Show time scale for current song"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TITLE"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTIST - TITLE"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTIST - ALBUM - TITLE"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTIST - ALBUM - TRACK. TITLE"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTIST [ ALBUM ] - TRACK. TITLE"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - TITLE"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Category"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Custom"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Title format:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Custom string:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Queue Manager"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Close dialogue on activating playlist"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Open URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Add URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Enter URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Further messages have been hidden.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "No info available for %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Filename"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/eo.po b/po/eo.po
index 22c18084764f..bf777d8e7d7b 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -10,9 +10,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 13:35+0000\n"
-"Last-Translator: Felipe Castro <fefcas at gmail.com>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Esperanto (http://www.transifex.com/projects/p/audacious/"
 "language/eo/)\n"
 "Language: eo\n"
@@ -21,96 +21,81 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Serĉado ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d dosiero trovita"
-msgstr[1] "%d dosieroj trovitaj"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nova Ludlisto"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Eraro"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Montri komand-linian helpon"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Montrigi version"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Komenci ludadon"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Paŭzi ludadon"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Paŭzi se oni ludas, ludi alie"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Halti ludadon"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Salti al antaŭa muziko"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Salti al sekva muziko"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Aldoni dosierojn al la ludlisto"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Aldoni dosierojn al provizora ludlisto"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Montrigi la ĉefan fenestron"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Montri la fenestron salt-al-muziko"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Komenci sen grafik-interfaco"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Eliri post fini la ludadon"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Printi rafinigajn mesaĝojn"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Printi rafinigajn mesaĝojn (povas esti aplikata duoble)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Ruli laŭ reĝimo de Qt"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Nekonata modifilo: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Nekonata modifilo: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -119,35 +104,56 @@ msgstr ""
 "Uzmaniero: audacious [MODIFILO] ... [DOSIERO] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Neniu dekodilo trovita por %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d dosiero trovita"
+msgstr[1] "%d dosieroj trovitaj"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s ne povis esti malfermata."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nova Ludlisto"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Ne eblas ŝargi je %s: nesubtenata dosier-sufikso."
+msgid "Audio CD, track %s"
+msgstr "Muzika KD, trako %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Eraro dum ŝargo de kromaĵo"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Ne eblas konservi %s: nesubtenata dosier-sufikso."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Eraro dum malfermo de %s:\n"
+"%s"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Nekonata eraro por ludado"
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr ""
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Nune Ludanta"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -155,887 +161,1051 @@ msgstr ""
 "La ludlisto ne povas esti ordigata ĉar skanado de metadatumaro ankoraŭ "
 "plenumiĝas (aŭ ĝi estis malebligata)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Pri"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Agordoj"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Difini"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Serĉ-eraro"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Rezigni"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Dosier-formo ne estis rekonata"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Fermi"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Eraro dum lego de meta-datumaro"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Agordoj"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Unukanale"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Pri"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Dukanale"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Kromaĵoj ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanalo"
+msgstr[1] "%d kanaloj"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Aspekto"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Trako %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Sono"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Sona KD"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Reto"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(nekonata titolo)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Ludlisto"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Malvalida URI"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Muzik-informo"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Nekonata skemo de URI"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Kromaĵoj"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Ĝenerale"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Agnoskoj"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efekto"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Permeso"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Rigardo"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Pri Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Enigo"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Ĉu vi volas definitive forigi \"%s\"?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transporto"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Forigi"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artisto"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Rezigni"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Albumo"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Forigi ludliston"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Titolo"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Ne demandi refoje"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Bendnumero"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Renomigi"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Ĝenro"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Renomigi Ludliston"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Dosiernomo"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Kiel vi deziras nomigi tiun ĉi ludliston?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Dosiervojo"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Ebligi"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Dato"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Jaro"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Komento"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Kodeko"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kvalito"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Neniu"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Araba"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Balta"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Ĉina"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Greka"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebrea"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Egaligilo"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japana"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Antaŭamplifilo"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Korea"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Malfermi Dosierojn"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Pola"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Malfermi"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Rusa"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Fermi _dialogon post malfermi"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Tajvana"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Aldoni Dosierojn"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turka"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Aldoni"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Glitkoma"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Fermi _dialogon post aldoni"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Interfac-agordoj</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Fermi"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Interfac-kromaĵo:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Titolo"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Eliga kromaĵo:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artisto"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Eliraj Agordoj</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Albumo"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bit-profundo:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Ĝenro"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Bufro-grando:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Jaro"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Trako"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Milda saturo"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Longo"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Uzi virtualan laŭtec-regilon (ne rekomendinde)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formo:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Alĝustigi Amplifon</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Kvalito:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Ebligi Alĝustigon de Amplifo"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bit-rapido:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Albuma reĝimo"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acida Ĵazo"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Eviti saturadon (rekomendinde)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acida Roko"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Agordi Nivelojn</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Etosa"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplifi ĉiujn dosierojn:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bibopo"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplifi ne-etikeditajn dosierojn"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Bluso"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Prokura servil-nomo:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Prokura pordo:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Prokura uzant-nomo:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Prokura pasvorto:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Prokura Agordado</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Ebligi uzadon de prokurilo"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Uzi aŭtentikadon per prokurilo"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Aŭtomata detektilo de signo-kodaro por:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Alternativaj signo-kodaro:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Konduto</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Daŭrigi ludadon ĉe komenciĝo"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Antaŭiri kiam la aktuala muziko estas forviŝata"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Malplenigi la ludliston dum malfermo de dosieroj"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Malfermi dosierojn en provizora ludlisto"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Ne ŝargi je metadatumaro por muzikoj ĝis kiam ludate"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Kongrueco</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpreti \\ (retroklinon) kiel apartigilo de dosierujoj"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Album-bildo</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Serĉi bildojn kongruajn al tiuj ĉi vortoj (kom-apartigitaj):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Forĵeti bildojn kongruajn al tiuj ĉi vortoj (kom-apartigitaj):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Serĉi bildojn kongruajn al la dosier-nomo de la muziko"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Serĉi rikure"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Serĉ-profundo:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Ŝprucaĵa Informo</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Montri ŝpruc-informon"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Ŝpruca prokrasto (dekonoj da sekundoj):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Montri tempo-skalon por la aktuala muziko"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TITOLO"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTISTO - TITOLO"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTISTO - ALBUMO - TITOLO"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTIST - ALBUMO - TRAKO. TITOLO"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTIST [ALBUMO] - TRAKO. TITOLO"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUMO - TITOLO"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategorio"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Personigite"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Muzik-Montrilo</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Montri muzik-numerojn"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Montri antaŭ-nuloj  (02:00 anstatau 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Titol-formo:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Personigita formo:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Agordaro de Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Ne eblis krei dosierujon (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Muzika KD, trako %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Unukanale"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Dukanale"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanalo"
-msgstr[1] "%d kanaloj"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Agnoskoj"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Permeso"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Pri Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Ĉu vi volas definitive forigi \"%s\"?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Forigi"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Forigi ludliston"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Ne demandi refoje"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Renomigi"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Renomigi Ludliston"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Kiel vi deziras nomigi tiun ĉi ludliston?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Ebligi"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Egaligilo"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Antaŭamplifilo"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Trako"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Longo"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Formo:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Kvalito:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Bit-rapido:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acida Ĵazo"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acida Roko"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Etosa"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bibopo"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Bluso"
-
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Ĉambra Muziko"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klasika"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Kontreo"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Mortmetalo"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Diskoo"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Facil-aŭskultebla"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folko"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funko"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Repo"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospelo"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunĝo"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Peza Roko"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Peza Metalo"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hopo"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "Haŭzo"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Ĵazo"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metalo"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "Novepoka"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "Nova Ondo"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Brua Muziko"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop-muziko"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punko"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Repo"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Regeo"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Roko"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rokenrolo"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Ritmenbluso"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Skao"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Svingo"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Tekno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hopo"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "La konservo sukcesis"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Eraro dum konservo"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Muzik-informo"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Albumo Artisto"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Komento"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Trak-numero"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Konservi"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Sekva"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/A"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Neniu informo disponeblas por %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Salti"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Salti al la Tempo"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Enigu tempon (minutoj:sekundoj):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Ĉu anstataŭigi %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "En_Vicigi"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "El_vicigi"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Salti al Muziko"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtrilo:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtrilo:"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "F_ermi post salti"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_Anstataŭigi"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Konfirmi anstataŭigon"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Ĉu anstataŭigi %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Eksporti Ludliston"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Eksporti"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importi Ludliston"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Importi"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Administrilo de Atendovico"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Kromaĵoj ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Devicigi"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Pri %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Malfermi Dosierojn"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Agordoj"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Malfermi"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Difini"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Fermi _dialogon post malfermi"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Agordoj"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Aldoni Dosierojn"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Pri"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Aldoni"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Aspekto"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Fermi _dialogon post aldoni"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Sono"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "En_Vicigi"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Reto"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "El_vicigi"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Ludlisto"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Salti al Muziko"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Kromaĵoj"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtrilo:"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Ĝenerale"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtrilo:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efekto"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "F_ermi post salti"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Rigardo"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Enigo"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transporto"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Dato"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Kodeko"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kvalito"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Neniu"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Araba"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Balta"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Ĉina"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Greka"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebrea"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japana"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Korea"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Pola"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Rusa"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Tajvana"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turka"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Glitkoma"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Interfac-agordoj</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Interfac-kromaĵo:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Eliga kromaĵo:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Eliraj Agordoj</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bit-profundo:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Bufro-grando:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Milda saturo"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Uzi virtualan laŭtec-regilon (ne rekomendinde)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Alĝustigi Amplifon</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Ebligi Alĝustigon de Amplifo"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Albuma reĝimo"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Eviti saturadon (rekomendinde)"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Administrilo de Ludlisto"
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Agordi Nivelojn</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplifi ĉiujn dosierojn:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplifi ne-etikeditajn dosierojn"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Prokura servil-nomo:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Prokura pordo:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Prokura uzant-nomo:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Prokura pasvorto:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Ret-agordoj</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "kB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Prokura Agordado</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Ebligi uzadon de prokurilo"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Uzi aŭtentikadon per prokurilo"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Aŭtomata detektilo de signo-kodaro por:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Alternativaj signo-kodaro:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Konduto</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Rekomenci ludi post ekigo"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Paŭzi anstataŭ rekomenci tuj"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Antaŭiri kiam la aktuala muziko estas forviŝata"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Malplenigi la ludliston dum malfermo de dosieroj"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Malfermi dosierojn en provizora ludlisto"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Kongrueco</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpreti \\ (retroklinon) kiel apartigilo de dosierujoj"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Muzik-Montrilo</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Montri muzik-numerojn"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Montri antaŭ-nuloj  (02:00 anstatau 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Altnivele</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Ne ŝargi je metadatumaro por muzikoj ĝis kiam ludate"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Album-bildo</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Serĉi bildojn kongruajn al tiuj ĉi vortoj (kom-apartigitaj):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Forĵeti bildojn kongruajn al tiuj ĉi vortoj (kom-apartigitaj):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Serĉi bildojn kongruajn al la dosier-nomo de la muziko"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Serĉi rikure"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Serĉ-profundo:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Ŝprucaĵa Informo</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Montri ŝpruc-informon"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Ŝpruca prokrasto (dekonoj da sekundoj):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Montri tempo-skalon por la aktuala muziko"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TITOLO"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTISTO - TITOLO"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTISTO - ALBUMO - TITOLO"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTIST - ALBUMO - TRAKO. TITOLO"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTIST [ALBUMO] - TRAKO. TITOLO"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUMO - TITOLO"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategorio"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Personigite"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Titol-formo:"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Datum-enigoj"
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Personigita formo:"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Nova"
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Agordaro de Audacious"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Ren_omigi"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Administrilo de Atendovico"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Ludi"
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Devicigi"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Laboras ..."
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Fermi dialogon post aktivi ludliston"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Eraro"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Malfermi URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Aldoni URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Enigu URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Kromaj mesaĝoj estis kaŝataj.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Meta-datumaro"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Verkisto"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Ludisto"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Jaro registrita"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Dato registrita"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Teknikisto"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Tipo MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bitrapido"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Neniu informo disponeblas por %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Nivelo"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Dosiernomo"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Linio"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Funkcio"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Mesaĝo"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Protokol-rigardo"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Registra nivelo:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Sen-cimigi"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Informaro"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Avertado"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Kromaĵoj ..."
diff --git a/po/es.po b/po/es.po
index bb0317edc90d..dd7cb85c00e9 100644
--- a/po/es.po
+++ b/po/es.po
@@ -3,8 +3,10 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# Adolfo Jayme Barrientos <fitoschido at ubuntu.com>, 2013
-# Adolfo Jayme Barrientos <fitoschido at ubuntu.com>, 2013
+# Adolfo Jayme Barrientos <fito at libreoffice.org>, 2013-2014
+# Adolfo Jayme Barrientos, 2013
+# Adolfo Jayme Barrientos, 2015
+# Adolfo Jayme Barrientos, 2013
 # Adrián Ramirez Escalante <buried.prophet at gmail.com>, 2012
 # Cosme Domínguez Díaz <cosme.ddiaz at gmail.com>, 2010
 # enjolras <yo at miguelrevilla.com>, 2012
@@ -16,6 +18,7 @@
 # Juan Manuel Hernández, 2012
 # Lucía Balsa <lucia.balsa.prados at gmail.com>, 2012
 # Marco Antonio Frias Butrón <inactive+smaug at transifex.com>, 2012
+# Marco Antonio Frias Butrón <inactive+smaug at transifex.com>, 2012
 # Marcos <djoser.horus at gmail.com>, 2013
 # xukosky <xukosky at yahoo.es>, 2011
 # xukosky <xukosky at yahoo.es>, 2011
@@ -25,9 +28,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-02-13 05:48+0000\n"
+"Last-Translator: Adolfo Jayme Barrientos\n"
 "Language-Team: Spanish (http://www.transifex.com/projects/p/audacious/"
 "language/es/)\n"
 "Language: es\n"
@@ -36,131 +39,139 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Buscando…"
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Se encontró %d archivo"
-msgstr[1] "Se encontraron %d archivos"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Lista de reproducción nueva"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
-msgstr ""
+msgstr "Mostrar ayuda de consola"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Mostrar la versión"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
-msgstr ""
+msgstr "Iniciar la reproducción"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
-msgstr ""
+msgstr "Pausar la reproducción"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pausar si se reproduce, o reproducir en caso contrario"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
-msgstr ""
+msgstr "Detener la reproducción"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
-msgstr ""
+msgstr "Ir a la canción anterior"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
-msgstr ""
+msgstr "Ir a la canción siguiente"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Añadir archivos a la lista de reproducción"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
-msgstr ""
+msgstr "Añadir archivos a lista de reproducción temporal"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Mostrar la ventana principal"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
-msgstr ""
+msgstr "Mostrar la ventana «Ir a la canción»"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
-msgstr ""
+msgstr "Iniciar sin interfaz gráfica"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Salir al terminar la reproducción"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Imprimir mensajes de depuración"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Mostrar mensajes de depuración (puede usarse dos veces)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Ejecutar en modo Qt"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
-msgstr ""
+msgstr "Opción desconocida: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
-msgstr ""
+msgstr "Opción desconocida: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
+"Uso: audacious [OPCIÓN] ... [ARCHIVO] ...\n"
+"\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "No se encontró decodificador para %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Se encontró %d archivo"
+msgstr[1] "Se encontraron %d archivos"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s no se pudo abrir."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Lista de reproducción nueva"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr ""
+msgid "Audio CD, track %s"
+msgstr "CD de audio, pista %s"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(error de codificación de caracteres)"
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Error al cargar el complemento"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
 msgstr ""
+"Error al abrir %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Error de reproducción desconocido"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Formato de audio no válido"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
-msgstr "Ahora en reproducción"
+msgstr "Reproduciendo"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -168,890 +179,1054 @@ msgstr ""
 "La lista de reproducción no se puede ordenar porque la búsqueda de metadatos "
 "está en progreso (o ha sido deshabilitada)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr ""
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "No se puede cargar %s: extensión de archivo no admitida."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr ""
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "No se puede guardar %s: extensión de archivo no admitida."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr ""
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Error de búsqueda"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr ""
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "No se reconoce el formato del archivo"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr ""
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Error al leer los metadatos"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Monoaural"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Estéreo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d canal"
+msgstr[1] "%d canales"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr ""
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Pista %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Sonido"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "CD de audio"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Red"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(título desconocido)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Lista de reproducción"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "URI no válido"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Información de la canción"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Esquema de URI desconocido"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Complementos"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Nombre de archivo no válido"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "General"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Créditos"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efecto"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licencia"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualización"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Acerca de Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Entrada"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "¿Quiere eliminar permanentemente «%s»?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transporte"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Eliminar"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artista"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Cancelar"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Álbum"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Eliminar lista de reproducción"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Título"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_No preguntar de nuevo"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "N.º de pista"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Renombrar"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Género"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Renombrar la lista de reproducción"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nombre de archivo"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "¿Qué nombre quiere darle a esta lista?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Ruta del archivo"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Activar"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Fecha"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Año"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Comentario"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Códec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Calidad"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Ninguno"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Árabe"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Báltico"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Chino"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Griego"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebreo"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ecualizador"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japonés"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamplificación"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Coreano"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Abrir archivos"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polaco"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Abrir"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Ruso"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Cerrar _diálogo al abrir"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanés"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Añadir archivos"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turco"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Añadir"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Coma flotante"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Cerrar _diálogo al añadir"
+
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Cerrar"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr ""
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Título"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr ""
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artista"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Complemento de salida:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Álbum"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Ajustes de salida</b>"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Género"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Profundidad de bit:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Año"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Tamaño del búfer:"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Pista"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Duración"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Detener saltos"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formato:"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Usar el control de volumen por software (no recomendado)"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Calidad:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Normalizar volumen</b>"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Tasa de bits:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Activar la normalización de volumen"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Jazz ácido"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Modo de álbum"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Rock ácido"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Evitar cortes (recomendado)"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambiental"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Ajustar niveles</b>"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplificar todos los archivos:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplificar archivos sin etiqueta:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Música de cámara"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Servidor proxy:"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "Clásica"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Puerto del proxy:"
+#: src/libaudgui/infowin.cc:91
+msgid "Country"
+msgstr "Country"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Nombre de usuario del proxy:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Contraseña del proxy:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Configuración del proxy</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Activar uso del proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Usar autenticación con el proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Detector de codificación de caracteres automático para: "
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Codificación de caracteres alternativa:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Comportamiento</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Continuar la reproducción al iniciar"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Avanzar cuando se borra la canción actual"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Limpiar la lista de reproducción al abrir archivos"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Abrir archivos en una lista de reproducción temporal"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "No cargar la información de metadatos hasta reproducir"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibilidad</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpretar \\ (barra invertida) como separador de carpetas"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Carátula de álbum</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-"Buscar imágenes que correspondan con estas palabras (separadas por comas):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"Excluir imágenes que correspondan con estas palabras (separadas por comas):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr ""
-"Buscar imágenes que correspondan con el nombre de archivo de la canción"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Buscar recursivamente"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Profundidad de la búsqueda:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Información emergente</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Mostrar información emergente"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Retraso del menú emergente (décimas de segundo):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Mostrar escala de tiempo para la canción actual"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TÍTULO"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTISTA - TÍTULO"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTISTA - ÁLBUM - TÍTULO"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTISTA - ÁLBUM - PISTA. TÍTULO"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTISTA [ ÁLBUM ] - PISTA. TÍTULO"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ÁLBUM - TÍTULO"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Categoría"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Personalizada"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Visualización de las canciones</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Mostrar números de las canciones"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Mostrar ceros a la izquierda (02:00 en lugar de 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Formato del título:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Cadena personalizada:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "No se pudo crear el directorio (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "CD de música, pista %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Estéreo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d canal"
-msgstr[1] "%d canales"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Créditos:"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licencia"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Acerca de Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Renombrar la lista de reproducción"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Activar"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ecualizador"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamplificación"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Pista"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Duración"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Jazz ácido"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Rock ácido"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambiental"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Música de cámara"
-
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "Clásica"
-
-#: src/libaudgui/infowin.c:84
-msgid "Country"
-msgstr "Country"
-
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
-msgstr "Escucha fácil"
+msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folclore"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
-msgstr "Ruido"
+msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Rock punk"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
-msgstr "Tecno"
+msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
-msgstr ""
+msgstr "Guardado correctamente"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
-msgstr ""
+msgstr "Error al guardar"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Información de la canción"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Artista del álbum"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Comentario"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
-msgstr ""
+msgstr "N.º de pista"
+
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "_Vaciar campos al pasar a la siguiente canción"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
-msgstr ""
+msgstr "_Guardar"
+
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Siguiente"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
-msgstr ""
+msgstr "N/D"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "No hay información disponible para %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
-msgstr ""
+msgstr "_Ir"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
-msgstr "Saltar al tiempo"
+msgstr "Ir al momento"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Introducir tiempo (minutos: segundos):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "¿Sobrescribir %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Agregar a la cola"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "_Quitar de la cola"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Ir a la canción"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtro: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtro:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "C_errar al cambiar"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
-msgstr ""
+msgstr "_Sobrescribir"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
-msgstr ""
+msgstr "Confirmar sobrescritura"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "¿Sobrescribir %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Exportar lista de reproducción"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
-msgstr ""
+msgstr "E_xportar"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importar lista de reproducción"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
-msgstr ""
+msgstr "_Importar"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Gestor de cola"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "Com_plementos…"
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr ""
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Acerca de %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Abrir archivos"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "Configuración de %s"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr ""
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Establecer"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr ""
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Preferencias"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Añadir archivos"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Acerca de"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Apariencia"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audio"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "A_ñadir a la cola"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Red"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "_Quitar de la cola"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Lista de reproducción"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Saltar a una canción"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Complementos"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtro: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "General"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtro:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efecto"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualización"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Gestor de la lista de reproducción"
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Entrada"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transporte"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Entradas"
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Número de pista"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Nombre de archivo"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Ruta de archivo"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Fecha"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Códec"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Calidad"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Ninguno"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Árabe"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Báltico"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Chino"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Griego"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebreo"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japonés"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Coreano"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polaco"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Ruso"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanés"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turco"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Coma flotante"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Configuración de interfaz</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Complemento de interfaz:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Complemento de salida:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Ajustes de salida</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Profundidad de bits:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Tamaño del búfer:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Saturación suave (mejora audio sobreamplificado)"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Usar el control de volumen por software (no recomendado)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Normalizar volumen</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Activar la normalización de volumen"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Modo de álbum"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Evitar distorsión (recomendado)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Ajustar niveles</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplificar todos los archivos:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplificar archivos sin etiqueta:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Servidor proxy:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Puerto del proxy:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Nombre de usuario del proxy:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Contraseña del proxy:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Configuración de red</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Configuración del proxy</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Activar uso del proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Usar autenticación con el proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Detección automática de codificación de caracteres para: "
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Codificación de caracteres alternativa:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Comportamiento</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Continuar la reproducción al iniciar"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Pausar en lugar de reanudar inmediatamente"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Avanzar cuando se borra la canción actual"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Limpiar la lista de reproducción al abrir archivos"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Abrir archivos en una lista de reproducción temporal"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibilidad</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpretar \\ (barra invertida) como separador de carpetas"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Visualización de las canciones</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Mostrar orden de las canciones"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Mostrar ceros a la izquierda (02:00 en lugar de 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Avanzadas</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "No cargar la información de metadatos hasta reproducir"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Explorar el contenido de archivos con extensión no reconocida"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Carátula del álbum</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
 msgstr ""
+"Buscar imágenes que correspondan con estas palabras (separadas por comas):"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
 msgstr ""
+"Excluir imágenes que correspondan con estas palabras (separadas por comas):"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
 msgstr ""
+"Buscar imágenes que correspondan con el nombre de archivo de la canción"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Buscar recursivamente"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Profundidad de la búsqueda:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Información emergente</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Mostrar información emergente"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Retraso de la información emergente (décimas de segundo):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Mostrar barra de tiempo para la canción actual"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTISTA - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTISTA - ÁLBUM - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTISTA - ÁLBUM - PISTA. TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTISTA [ ÁLBUM ] - PISTA. TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ÁLBUM - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Categoría"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Personalizado"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Formato del título:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Cadena personalizada:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Configuración de Audacious"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Cerrar diálogo al activar la lista de reproducción"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Gestor de cola"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Quitar de la cola"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Trabajando…"
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Error"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Abrir URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Añadir URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Introducir URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Se han ocultado el resto de mensajes.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Abrir una carpeta"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Añadir una carpeta"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Abrir"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Añadir"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadatos"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Compositor"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Intérprete"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Año de grabación"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Fecha de grabación"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Datos técnicos"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Tipo MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Tasa de bits"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "No hay información disponible para %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Nivel"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nombre de archivo"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Línea"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Función"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Mensaje"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Inspector de registros"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Nivel de registro:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Depuración"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Información"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Aviso"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Complementos…"
diff --git a/po/es_AR.po b/po/es_AR.po
index d5c5e9edf782..ad87904ffc5a 100644
--- a/po/es_AR.po
+++ b/po/es_AR.po
@@ -16,9 +16,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/"
 "audacious/language/es_AR/)\n"
 "Language: es_AR\n"
@@ -27,131 +27,135 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Buscando ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d archivo encontrado"
-msgstr[1] "%d archivos encontrados"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nueva lista de reproducción"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Mostrar versión"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pausar si se está reproduciendo, o reproducir"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Añadir archivos a la lista de reproducción"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Mostrar la ventana principal"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Salir al detener la reproducción."
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Imprimir mensajes de depuración"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "No se encontró decodificador para %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d archivo encontrado"
+msgstr[1] "%d archivos encontrados"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s no puede ser abierto."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nueva lista de reproducción"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid "Audio CD, track %s"
+msgstr "CD de audio, pista %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Reproducción actual"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -159,891 +163,1055 @@ msgstr ""
 "La lista de reproducción no se puede ordenar porque la búsqueda de metadatos "
 "está en progreso (o ha sido deshabilitada)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Estéreo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d canal"
+msgstr[1] "%d canales"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Audio"
-
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Red"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Lista de reproducción"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Información de la canción"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Complementos"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "General"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efecto"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Créditos:"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualización"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licencia"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Entrada"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Acerca de Audacious"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transporte"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artista"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Álbum"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Título"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Número de pista"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Género"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nombre de archivo"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Renombrar la lista de reproducción"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Ruta hasta el archivo"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Fecha"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Activar"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Año"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Comentario"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codec (formato)"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Calidad"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Ninguno"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arábico"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Báltico"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Chino"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Griego"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebreo"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japonés"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ecualizador"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Coreano"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamplificación"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polaco"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Abrir archivos"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Ruso"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanés"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turco"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Añadir archivos..."
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Coma flotante"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Complemento de salida:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Título"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Ajustes de salida</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artista"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Profundidad de bit:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Álbum"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Tamaño del búfer:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Género"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Año"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Detener saltos"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Pista"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Usar control de volumen por software (no recomendado)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Duración"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Normalizar volumen</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Activar la normalización de volumen"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Modo de álbum"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Evitar cortes (recomendado)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Jazz ácido"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Ajustar niveles</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Rock ácido"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplificar todos los archivos:"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambiental"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplificar archivos sin etiqueta:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Servidor proxy:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Puerto del proxy:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Nombre de usuario del proxy:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Contraseña del proxy:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Configuración del Proxy</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Activar uso del proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Usar autenticación con el proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Detector de codificación de caracteres automático para: "
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Codificación de caracteres alternativa:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Comportamiento</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Continuar la reproducción al iniciar"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Avanzar cuando se borra la canción actual"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Limpiar la lista de reproducción al abrir archivos"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Abrir archivos en una lista de reproducción temporal"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "No cargar la información de metadatos hasta reproducir"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibilidad</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Intérprete \\ (barra invertida) como un delimitador de carpeta"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Arte de tapa</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-"Buscar imágenes correspondientes a estas palabras clave (separadas por "
-"comas):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"Excluir imágenes correspondientes a estas palabras clave (separadas por "
-"comas):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Buscar imágeness coincidiendo con nombres de canciones "
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Buscar recursivamente"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Búsqueda profunda"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Información emergente</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Mostrar información emergente"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Retardo en mensajes emergentes (décimas de segundo):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Mostrar línea de tiempo para la canción actual"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TÍTULO"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTISTA - TÍTULO"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTISTA - ÁLBUM - TÍTULO"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTISTA - ÁLBUM - PISTA. TÍTULO"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTISTA [ ÁLBUM ] - PISTA. TÍTULO"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ÁLBUM - TÍTULO"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Categoría"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Personalizada"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Visualización de las canciones</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Mostrar números de las canciones"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Mostrar ceros a la izquierda (02:00 en lugar de 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Formato del título:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Cadena personalizada:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "No se pudo crear el directorio (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "CD de audio, pista %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Estéreo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d canal"
-msgstr[1] "%d canales"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Créditos:"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licencia"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Acerca de Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Renombrar la lista de reproducción"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Activar"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ecualizador"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamplificación"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Pista"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Duración"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Jazz ácido"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Rock ácido"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambiental"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Música de cámara"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Clásica"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folclore"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Rock Punk"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Información de la canción"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Comentario"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "No hay información disponible para %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Ir a tiempo"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Ingresar tiempo (minutos:segundos):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "¿Sobrescribir %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Cola"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "_Remover de la cola"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Ir a una canción"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtro: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtro:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "¿Sobrescribir %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Exportar lista de reproducción"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importar lista de reproducción"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Gestor de cola de reproducción"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Abrir archivos"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Añadir archivos..."
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audio"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Red"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Lista de reproducción"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Complementos"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "General"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efecto"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualización"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Entrada"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transporte"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Cola"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "_Remover de la cola"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Ir a una canción"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Fecha"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtro: "
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codec (formato)"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtro:"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Calidad"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Ninguno"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arábico"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Báltico"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Chino"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Griego"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebreo"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japonés"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Coreano"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polaco"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Ruso"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanés"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turco"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Coma flotante"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Administrador de la lista de reproducción"
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Complemento de salida:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Ajustes de salida</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Profundidad de bit:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Tamaño del búfer:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Detener saltos"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Usar control de volumen por software (no recomendado)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Normalizar volumen</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Activar la normalización de volumen"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Modo de álbum"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Evitar cortes (recomendado)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Ajustar niveles</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Entradas"
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplificar todos los archivos:"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplificar archivos sin etiqueta:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Servidor proxy:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Puerto del proxy:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Nombre de usuario del proxy:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Contraseña del proxy:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Configuración del Proxy</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Activar uso del proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Usar autenticación con el proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Detector de codificación de caracteres automático para: "
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Codificación de caracteres alternativa:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Comportamiento</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Avanzar cuando se borra la canción actual"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Limpiar la lista de reproducción al abrir archivos"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Abrir archivos en una lista de reproducción temporal"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibilidad</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Intérprete \\ (barra invertida) como un delimitador de carpeta"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Visualización de las canciones</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Mostrar números de las canciones"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Mostrar ceros a la izquierda (02:00 en lugar de 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "No cargar la información de metadatos hasta reproducir"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Arte de tapa</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr ""
+"Buscar imágenes correspondientes a estas palabras clave (separadas por "
+"comas):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr ""
+"Excluir imágenes correspondientes a estas palabras clave (separadas por "
+"comas):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Buscar imágeness coincidiendo con nombres de canciones "
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Buscar recursivamente"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Búsqueda profunda"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Información emergente</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Mostrar información emergente"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Retardo en mensajes emergentes (décimas de segundo):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Mostrar línea de tiempo para la canción actual"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTISTA - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTISTA - ÁLBUM - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTISTA - ÁLBUM - PISTA. TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTISTA [ ÁLBUM ] - PISTA. TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ÁLBUM - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Categoría"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Personalizada"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Formato del título:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Cadena personalizada:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Gestor de cola de reproducción"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Cerrar diálogo al activar la lista de reproducción"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Abrir URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Añadir URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Ingresar URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Se han ocultado el resto de mensajes.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "No hay información disponible para %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nombre de archivo"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/es_MX.po b/po/es_MX.po
index 9251b2a10f3a..137a66f25ecc 100644
--- a/po/es_MX.po
+++ b/po/es_MX.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# Jorge A. García Sosa <jagsmd at gmail.com>, 2012-2014
+# Jorge A. García Sosa <kamesennin555 at icloud.com>, 2012-2014
+# Jorge A. García Sosa <kamesennin555 at icloud.com>, 2014
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-06 22:26+0000\n"
-"Last-Translator: Jorge A. García Sosa <jagsmd at gmail.com>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-23 20:31+0000\n"
+"Last-Translator: Jorge A. García Sosa <kamesennin555 at icloud.com>\n"
 "Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/"
 "audacious/language/es_MX/)\n"
 "Language: es_MX\n"
@@ -19,96 +20,81 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Buscando..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d archivo encontrado"
-msgstr[1] "%d archivos encontrados"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nueva Lista de reproducción"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Error"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Mostrar ayuda de línea de comando"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Mostrar versión"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Iniciar reproducción"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Pausa reproducción"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pausar si está reproduciendo; de lo contrario, reproducir"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Detener reproducción"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Saltar a la pista previa"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Saltar a la siguiente pista"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Agregar archivos a la lista de reproducción"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Agregar archivos a la lista de reproducción temporal"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Mostrar la ventana principal"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Mostrar la ventana saltar-a-la-pista"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Iniciar sin una interfaz gráfica"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Quitar al detener reproducción"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Imprimir mensajes debugging"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Imprimir mensajes de depuración (puede ser usado dos veces)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Ejecutar en modo Qt"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Opción desconocida: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Opción desconocida: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -117,35 +103,56 @@ msgstr ""
 "Uso: audacious [OPCIÓN] ... [ARCHIVO] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "No se encontró un descodificador para %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d archivo encontrado"
+msgstr[1] "%d archivos encontrados"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s no pudo ser abierto."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nueva Lista de reproducción"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "No se puede cargar %s: extensión de archivo no soportada."
+msgid "Audio CD, track %s"
+msgstr "CD de Audio, pista %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(error de codificación de caracteres)"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Error al cargar plugin"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "No se puede guardar %s: extensión de archivo no soportada."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Error al abrir %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Error de reproducción desconocido"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Formato de audio invalido"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Reproduciendo"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -153,887 +160,1051 @@ msgstr ""
 "La lista de reproducción no puede ser ordenada porque la exploración de "
 "metadatos está en progreso (o ha sido deshabilitada)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Acerca"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "No se pudo cargar %s: extensión de archivo no soportada."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Configuraciones"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "No se pudo guardar %s: extensión de archivo no soportada."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Ajuste"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Error de búsqueda"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Cancelar"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Formato de archivo no reconocido"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Cerrar"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Error al leer metadatos"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Ajustes"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Monoaural"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Acerca"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Estéreo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Plugins ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d canal"
+msgstr[1] "%d canales"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Apariencia"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Pista %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Audio"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "CD de Audio"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Red"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(título desconocido)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Lista de Reproducción"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "URI inválido"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Información de Pista"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Esquema URI desconocido"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Plugins"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Nombre de archivo invalido"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "General"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Créditos"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efecto"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licencia"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualización"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Acerca de Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Entrada"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "¿Quieres remover permanentemente \"%s\"?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transporte"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Remover"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artista"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Cancelar"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Álbum"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Remover Lista de Reproducción"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Título"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_No preguntar otra vez"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Número de pista"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Renombrar"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Género"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Renombrar la Lista de Reproducción"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nombre de archivo"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "¿Te gustaría llamar esta lista de reproducción?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Ruta de archivo"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Habilitar"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Fecha"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Año"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Comentario"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Calidad"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Ninguno"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Árabe"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Báltico"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Chino"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Griego"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebreo"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ecualizador"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japonés"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamplificador"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Coreano"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Abrir Archivos"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polaco"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Abrir"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Ruso"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Cerrar _dialogo al abrir"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanés"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Agregar Archivos"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turco"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Agregar"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Punto flotante"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Cerrar _dialogo al agregar"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Ajustes de Interfaz</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Cerrar"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Plugin de interfaz:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Título"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Plugin de Salida:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artista"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Ajustes de Salida</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Álbum"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Profundidad de bit:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Género"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Tamaño del Buffer:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Año"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Pista"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Clipping suave"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Duración"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Usar control de volumen por software (no recomendado)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formato:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Replay Gain</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Calidad:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Habilitar Replay Gain"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Tasa de bits:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Modo de Álbum"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Evitar distorsiones clip (recomendado)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Ajustar Niveles</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplificar todos los archivos:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplificar archivos sin etiquetas:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "blues"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Nombre del host proxy:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Música de Cámara"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Puerto proxy:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "nombre de usuario proxy:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "contraseña proxy:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Configuración del Proxy</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Habilitar uso del proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Usar autenticación con el proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Detector automático de codificación de caracteres para:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Codificación de caracteres alternativa:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Comportamiento</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Continuar reproducción al iniciar"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Avanzar cuando la pista actual sea borrada"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Limpiar la lista de reproducción al abrir archivos"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Abrir archivos en una lista de reproducción temporal"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "No cargar metadatos de pistas hasta su reproducción"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibilidad</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpretar \\ (diagonal invertida) como un delimitador de carpetas"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Portada de Álbum</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Buscar imágenes con éstas palabras (separadas por comas):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Excluir imágenes con éstas palabras (separadas por comas):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Buscar imágenes con el nombre del archivo"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Buscar recursívamente"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Profundidad de búsqueda:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Información Emergente</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Mostrar información emergente"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Retraso de emergente  (décimas de segundo):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Mostrar escala de tiempo para la pista actual"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TÍTULO"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTISTA - TÍTULO"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTISTA - ÁLBUM - TÍTULO"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTISTA - ÁLBUM - PISTA. TÍTULO"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTISTA [ÁLBUM] - PISTA. TÍTULO"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ÁLBUM - TÍTULO"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Categoría"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Personalizar"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Visualización de Pista</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Mostrar números de pista"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Mostrar ceros a la izquierda (02:00 en vez de 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Formato de Título"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Cadena personalizada:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Ajustes de Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "No se pudo crear el directorio (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "CD de Audio, pista %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Monoaural"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Estéreo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d canal"
-msgstr[1] "%d canales"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Créditos"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licencia"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Acerca de Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "¿Quieres remover permanentemente \"%s\"?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Remover"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Remover Lista de Reproducción"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_No preguntar otra vez"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Renombrar"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Renombrar la Lista de Reproducción"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "¿Te gustaría llamar esta lista de reproducción?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Habilitar"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ecualizador"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamplificador"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Pista"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Duración"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Formato:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Calidad:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Tasa de bits:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Música de Cámara"
-
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Clásica"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Guardar exitósamente"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Error al guardar"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Información de Pista"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Artista del Álbum"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Comentario"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Número de Pista"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Limpia_r campos al mover a la sig. pista"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Guardar"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "Siguie_nte"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/D"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "No hay información disponible para  %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Saltar"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Saltar al Tiempo"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Ingresa el tiempo (minutos:segundos):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "¿Sobreescribir %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "A la _Cola"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Quitar de la _cola"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Saltar a la Pista"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtro: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtro:"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Ce_rrar al saltar"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "S_obreescribir"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Confirmar Sobreescritura"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "¿Sobreescribir %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Exportar Lista de Reproducción"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Exportar"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importar Lista de Reproducción"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Importar"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Administrador de colas"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Plugins ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Quitar de la fila"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Acerca %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Abrir Archivos"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Ajustes"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Abrir"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Ajuste"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Cerrar _dialogo al abrir"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Ajustes"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Agregar Archivos"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Acerca"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Agregar"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Apariencia"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Cerrar _dialogo al agregar"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audio"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "A la _Cola"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Red"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Quitar de la _cola"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Lista de Reproducción"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Saltar a la Pista"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Plugins"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtro: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "General"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtro:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efecto"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Ce_rrar al saltar"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualización"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Entrada"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transporte"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Número de pista"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Nombre de archivo"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Administrador de Listas de Reproducción"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Ruta de archivo"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Fecha"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codec"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Calidad"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Ninguno"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Árabe"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Báltico"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Chino"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Entradas"
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Griego"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebreo"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japonés"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Coreano"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Nuevo"
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polaco"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Ren_ombrar"
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Ruso"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Reproducir"
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanés"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Cerrar dialogo al activar Lista de Reproducción"
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turco"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Punto flotante"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Ajustes de Interfaz</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Plugin de interfaz:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Plugin de Salida:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Ajustes de Salida</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Profundidad de bit:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Tamaño del Buffer:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Clipping suave"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Usar control de volumen por software (no recomendado)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Replay Gain</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Habilitar Replay Gain"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Modo de Álbum"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Evitar distorsiones clip (recomendado)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Ajustar Niveles</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplificar todos los archivos:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplificar archivos sin etiquetas:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Nombre del host proxy:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Puerto proxy:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "nombre de usuario proxy:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "contraseña proxy:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Ajustes de Red</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Configuración del Proxy</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Habilitar uso del proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Usar autenticación con el proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Detector automático de codificación de caracteres para:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Codificación de caracteres alternativa:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Comportamiento</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Reanudar reproducción al iniciar"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Pausa en vez de reanudar inmediatamente"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Avanzar cuando la pista actual sea borrada"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Limpiar la lista de reproducción al abrir archivos"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Abrir archivos en una lista de reproducción temporal"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibilidad</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpretar \\ (diagonal invertida) como un delimitador de carpetas"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Visualización de Pista</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Mostrar números de pista"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Mostrar ceros a la izquierda (02:00 en vez de 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Avanzado</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "No cargar metadatos de pistas hasta su reproducción"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Probar contenido de archivos con extensión no reconocida"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Portada de Álbum</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Buscar imágenes con éstas palabras (separadas por comas):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Excluir imágenes con éstas palabras (separadas por comas):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Buscar imágenes con el nombre del archivo"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Buscar recursívamente"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Profundidad de búsqueda:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Información Emergente</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Mostrar información emergente"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Retraso de emergente  (décimas de segundo):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Mostrar escala de tiempo para la pista actual"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTISTA - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTISTA - ÁLBUM - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTISTA - ÁLBUM - PISTA. TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTISTA [ÁLBUM] - PISTA. TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ÁLBUM - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Categoría"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Personalizar"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Formato de Título"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Cadena personalizada:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Ajustes de Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Administrador de colas"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Quitar de la fila"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Trabajando ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Error"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Abrir URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Agregar URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Ingresa URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Más mensajes han sido ocultados.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Abrir Carpeta"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Agregar carpeta"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Abrir"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Agregar"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadatos"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Compositor"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Intérprete"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Año de Grabación"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Fecha de Grabación"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Técnico"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Tipo MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Tasa de bit"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "No hay información disponible para  %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Nivel"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nombre de archivo"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Línea"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Función"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Mensaje"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Inspector de Registro"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Nivel de Registro:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Depurar"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Info"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Advertencia"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Plugins ..."
diff --git a/po/et.po b/po/et.po
index 27773d0ef3f7..7200f66b9ce6 100644
--- a/po/et.po
+++ b/po/et.po
@@ -11,9 +11,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Estonian (http://www.transifex.com/projects/p/audacious/"
 "language/et/)\n"
 "Language: et\n"
@@ -22,131 +22,135 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Otsimine..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "leiti %d fail"
-msgstr[1] "leiti %d faili"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Uus esitusnimekiri"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Versiooni näitamine"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Esitamise korral pausimine, pausi korral esitamine"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Failide lisamine esitusnimekirja"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Peaakna kuvamine"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Programmi sulgemine esituse lõppedes"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Silumisteadete väljastamine"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Failile %s ei leitud dekoodrit."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "leiti %d fail"
+msgstr[1] "leiti %d faili"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "Faili %s pole võimalik avada."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Uus esitusnimekiri"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid "Audio CD, track %s"
+msgstr "Audio-CD, lugu %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Praegu esitamisel"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -154,889 +158,1053 @@ msgstr ""
 "Esitusnimekirja sortimine pole võimalik, kuna metaandmete laadimine on "
 "pooleli (või keelatud)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanal"
+msgstr[1] "%d kanalit"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Audio"
-
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Võrk"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Esitusnimekiri"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Loo andmed"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Pluginad"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Üldine"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efekt"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Autorid"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualiseerimine"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Litsents"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Sisend"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Audacious'est lähemalt"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transport"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Esitaja"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Pealkiri"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Loo number"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Žanr"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Failinimi"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Esitusnimekirja nime muutmine"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Faili rada"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Kuupäev"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Lubatud"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Aasta"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Kommentaar"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Koodek"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kvaliteet"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Puudub"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Araabia"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Balti"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Hiina"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Kreeka"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Heebrea"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Jaapani"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ekvalaiser"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Korea"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Eelmoonutus"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Poola"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Failide avamine"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Vene"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taivani"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Türgi"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Failide lisamine"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Väljundplugin:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Pealkiri"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Väljundi sätted</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Esitaja"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bitisügavus:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Puhvri suurus:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Žanr"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Aasta"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Pehme kärpimine"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Rada"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Tarkvaraline valjuse juhtimine (pole soovitatav)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Pikkus"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Helitugevuse korrektsioon</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Helitugevuse korrektsioon on lubatud"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Albumi kaupa"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Hoidutakse kärpimisest (soovitatav)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Valjuse kohendamine</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Kõikide failide võimendamine:"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Sildistamata failide võimendamine:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Proksi hostinimi:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Bluus"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Proksi port:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Kammermuusika"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Proksi kasutajanimi:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Proksi parool:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Proksi sätted</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Proksi kasutamine on lubatud"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Proksi kasutatab autentimist"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Automaatne kooditabeli tuvastaja:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Kooditabelite tagavara:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Käitumine</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Käivitamisel jätkatakse esitamist"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Esitatava loo kustutamisel hakatakse järgmist lugu esitama"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Failide avamisel tühjendatakse esitusnimekiri"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Failid avatakse ajutises esitusnimekirjas"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Loo metaandmeid enne esitamist ei laadita"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Ühilduvus</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Märki \\ (kurakaldkriips) käsitletakse kataloogide eraldajana"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Albumite kujundused</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Otsitakse nende sõnadega kattuvaid pilte (komaga eraldatud nimekiri):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"Nende nende sõnadega kattuvad pildid välistatakse (komaga eraldatud "
-"nimekiri):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Otsitakse loo failinimega kattuvaid pilte"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Otsing toimub sügavuti"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Otsingu sügavus:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Loo andmete hüpikaken</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Loo andmeid näidatakse hüpikaknas"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Lahtihüppamise viivitus (sekundikümnendikes):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Esitamisel oleva loo kohta näidatakse ajaskaalat"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "PEALKIRI"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ESITAJA - PEALKIRI"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ESITAJA - ALBUM - PEALKIRI"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ESITAJA - ALBUM - RADA. PEALKIRI"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ESITAJA [ALBUM] - RADA. PEALKIRI"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - PEALKIRI"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategooria"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Kohandatud"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Loo kuvamine</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Näidatakse lugude numbreid"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Alguses näidatakse nulle (2:00 asemel näidatakse 02:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Pealkirja vorming:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Kohandatud string:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Kataloogi pole võimalik luua (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Audio-CD, lugu %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanal"
-msgstr[1] "%d kanalit"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Autorid"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Litsents"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Audacious'est lähemalt"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Esitusnimekirja nime muutmine"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Lubatud"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ekvalaiser"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Eelmoonutus"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Rada"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Pikkus"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Bluus"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Kammermuusika"
-
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klassikaline"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Kantri"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disko"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Ajaviitemuusika"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Raske rokk"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Džäss"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Müra"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punkrokk"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Räpp"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Rege"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rokk"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock & Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rütmibluus"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Sving"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Tehno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Loo andmed"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Kommentaar"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Faili %s kohta puuduvad andmed.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Ajahetkele hüppamine"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Sisesta aeg (minutid:sekundid):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Kas kirjutada fail %s üle?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "Pane _järjekorda"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Eemalda _järjekorrast"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Loo vahetamine"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filter: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filter:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Kas kirjutada fail %s üle?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Esitusnimekirja eksportimine"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Esitusnimekirja importimine"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Esitusjärjekorra haldamine"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Failide avamine"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Failide lisamine"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audio"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Võrk"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Esitusnimekiri"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Pluginad"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Üldine"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efekt"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualiseerimine"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Sisend"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transport"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "Pane _järjekorda"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Eemalda _järjekorrast"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Loo vahetamine"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Kuupäev"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filter: "
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Koodek"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filter:"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kvaliteet"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Puudub"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Araabia"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Balti"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Hiina"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Kreeka"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Heebrea"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Jaapani"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Korea"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Poola"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Vene"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taivani"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Türgi"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Esitusnimekirjade haldur"
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Väljundplugin:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Väljundi sätted</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bitisügavus:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Puhvri suurus:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Pehme kärpimine"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Tarkvaraline valjuse juhtimine (pole soovitatav)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Helitugevuse korrektsioon</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Helitugevuse korrektsioon on lubatud"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Kirjeid"
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Albumi kaupa"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Hoidutakse kärpimisest (soovitatav)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Valjuse kohendamine</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Kõikide failide võimendamine:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Sildistamata failide võimendamine:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Proksi hostinimi:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Proksi port:"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Proksi kasutajanimi:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Proksi parool:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Proksi sätted</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Proksi kasutamine on lubatud"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Proksi kasutatab autentimist"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Automaatne kooditabeli tuvastaja:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Kooditabelite tagavara:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Käitumine</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Esitatava loo kustutamisel hakatakse järgmist lugu esitama"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Failide avamisel tühjendatakse esitusnimekiri"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Failid avatakse ajutises esitusnimekirjas"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Ühilduvus</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Märki \\ (kurakaldkriips) käsitletakse kataloogide eraldajana"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Loo kuvamine</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Näidatakse lugude numbreid"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Alguses näidatakse nulle (2:00 asemel näidatakse 02:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Loo metaandmeid enne esitamist ei laadita"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Albumite kujundused</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Otsitakse nende sõnadega kattuvaid pilte (komaga eraldatud nimekiri):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
 msgstr ""
+"Nende nende sõnadega kattuvad pildid välistatakse (komaga eraldatud "
+"nimekiri):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Otsitakse loo failinimega kattuvaid pilte"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Otsing toimub sügavuti"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Otsingu sügavus:"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Esitusnimekirja _aktiveerimisel dialoog suletakse"
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Loo andmete hüpikaken</b>"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Loo andmeid näidatakse hüpikaknas"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Lahtihüppamise viivitus (sekundikümnendikes):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Esitamisel oleva loo kohta näidatakse ajaskaalat"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "PEALKIRI"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ESITAJA - PEALKIRI"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ESITAJA - ALBUM - PEALKIRI"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ESITAJA - ALBUM - RADA. PEALKIRI"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ESITAJA [ALBUM] - RADA. PEALKIRI"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - PEALKIRI"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategooria"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Kohandatud"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Pealkirja vorming:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Kohandatud string:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr ""
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Esitusjärjekorra haldamine"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr ""
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "URL-i avamine"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "URL-i lisamine"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Sisesta URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Ülejäänud sõnumid peidetakse.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Faili %s kohta puuduvad andmed.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Failinimi"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/eu.po b/po/eu.po
index de8182e6ef25..2672d0958ca0 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -3,20 +3,20 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# asier <asier.fernandez.iribar at gmail.com>, 2013
-# asier <asier.fernandez.iribar at gmail.com>, 2013
-# obibon <ibonatan at gmail.com>, 2012
+# asier fernandez iribar <asier.fernandez.iribar at gmail.com>, 2013
+# asier fernandez iribar <asier.fernandez.iribar at gmail.com>, 2013
+# obibon <obibon at gmx.com>, 2012
 # Iñaki Larrañaga Murgoitio <dooteo at euskalgnu.org>, 2008-2009
-# obibon <ibonatan at gmail.com>, 2012
+# obibon <obibon at gmx.com>, 2012
 # Osoitz <oelkoro at gmail.com>, 2012
 # Osoitz <oelkoro at gmail.com>, 2012
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Basque (http://www.transifex.com/projects/p/audacious/"
 "language/eu/)\n"
 "Language: eu\n"
@@ -25,131 +25,135 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Bilatzen"
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d fitxategia ez da aurkitu"
-msgstr[1] "%d fitxategiak ez dira aurkitu"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Erreprodukzio-zerrenda berria"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Erakutsi bertsioa"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Erreproduzitzen ari bada pausarazi, bestela erreproduzitu"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Gehitu fitxategiak erreprodukzio-zerrendara"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Bistaratu nagusia leihoa"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Irten erreprodukzioa amaitzean"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Idatzi desarauzte mezuak"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Ez dago %s-rako dekodifikatzailerik."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d fitxategia ez da aurkitu"
+msgstr[1] "%d fitxategiak ez dira aurkitu"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s ezin izan da ireki"
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Erreprodukzio-zerrenda berria"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid "Audio CD, track %s"
+msgstr "Audio CDa, %s pista"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Orain erreproduzitzen"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -157,888 +161,1052 @@ msgstr ""
 "Erreprodukzio-zerrenda hau ezin da ordenatu metadatuen azterketa oraindik "
 "bukatu ez duelako (edo desgaitu delako)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Estereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanala"
+msgstr[1] "%d kanalak"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Audioa"
-
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Sarea"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Erreprodukzio-zerrenda"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Kantu informazioa"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Pluginak"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Orokorra"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efektuak"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Kredituak"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Bistaratzea"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Lizentzia"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Sarrera"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Audacious-i buruz"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transportea"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artista"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Diskoa"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Titulua"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Pista-zenbakia"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Generoa"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Fitxategi-izena"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Erreprodukzio-zerrenda berrizendatu"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Fitxategiaren bide-izena"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Data"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "Gaitu"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Urtea"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Iruzkina"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Kodeka"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kalitatea"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Bat ere ez"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabiarra"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltikoa"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Txinatarra"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Grekoa"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebrearra"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japoniarra"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Erakutsi ekualizadorea"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Korearra"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Aurreanplifikazioa"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Poloniera"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Ireki fitxategiak"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Errusiarra"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanera"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turkiarra"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Gehitu fitxategiak"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Koma mugikorra"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Irteera plugin-a:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Titulua"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Irteera ezarpenak</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artista"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bit sakonera:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Diskoa"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Bufferraren tamaina:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Generoa"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Urtea"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Muxarrakin xuabea"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Pista"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Softwarearen bolumen kontrola erabili (ez gomendagarria)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Iraupena"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Replay Gain</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Gaitu irabazpena"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Disko modua"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Ekidin muxarrakina (gomendatua)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Jazz azidoa"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Mailak doitu</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Anplifikatu fitxategi guztiak:"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Giroko musika"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Anplifikatu etiketa gabeko fitxategiak:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Proxy-aren ostalari-izena:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues-a"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Proxy-aren ataka:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Proxy-aren erabiltzaile-izena:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Proxy-aren pasahitza:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Proxy-aren konfigurazioa</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Gaitu proxy-a erabiltzea"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Erabili autentifikazioa proxy-arekin"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Karaktere-kodeketaren detekzio automatikoa:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Karaktere-kodeketa:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Portaera</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Jarraitu erreprodukzioa abiaraztean"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Aurreratu uneko abestia ezabatzen denean"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Garbitu erreprodukzio-zerrenda fitxategiak irekitzerakoan"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Gehitu fitxategi berriak aldi baterako erreprodukzio-zerrendari"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Ez kargatu kantuen metadatuak jo arte"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Bateragarritasuna</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr ""
-"\\ (aderantzizkatutako diagonala) karpeta mugatzaile bezala interpretatu"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Disko Azala</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Bilatu hitz hauekin bat datozen irudiak (koma bidez banatu):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Ezikusi hitz hauekin bat datozen irudiak (koma bidez banatu):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Bilatu kantuaren fitxategi izenarekin bat datozen irudiak"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Bilatu errekurtsiboki"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Bilaketa sakonera:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Laster-leihoa</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Bistaratu popup informazioa"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Popup atzeratzea (segundu hamarrenak)"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Bistaratu oraingo kantuaren denbora eskala"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TITULUA"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTISTA - TITULUA"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTISTA - DISKOA - TITULUA"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTISTA - DISKOA - PISTA. TITULUA"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTISTA - [DISKOA] - PISTA. TITULUA"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUMA - TITULUA"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategoria"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Pertsonalizatua"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Kanten ikuspegia</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Abesti zenbakiak erakutsi"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Erakutzi zeroak aurretik (02:00 eta ez 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Tituluaren formatua:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Kate pertsonalizatua:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Ezin izan da %s direktorioa sortu: %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Audio CDa, %s pista"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Estereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanala"
-msgstr[1] "%d kanalak"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Kredituak"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Lizentzia"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Audacious-i buruz"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Erreprodukzio-zerrenda berrizendatu"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "Gaitu"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Erakutsi ekualizadorea"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Aurreanplifikazioa"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Pista"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Iraupena"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Jazz azidoa"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Giroko musika"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues-a"
-
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Ganbera-musika"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klasikoa"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disko"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Entzuteko erraza"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folka"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk-a"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel-a"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge-a"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Rock gogorra"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal-a"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-Hop-a"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazza"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle-a"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metala"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Zarata"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop-a"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock-a"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap-a"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rocka"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock & Roll-a"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul-a"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing-a"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Teknoa"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-Hop-a"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Kantu informazioa"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Iruzkina"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Ez dago %s(r)en informazio eskurragarririk.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Saltatu denborara"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Sartu denbora (minutuak:segunduak):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "%s gainidatzi?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Ilara"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "_Kendu ilara"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Abesti honetara saltatu"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Iragazkia: "
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Iragazkia:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "%s gainidatzi?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Erreprodukzio-zerrenda esportatu"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Erreprodukzio-zerrenda inportatu"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Ilara kudeatzailea"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Ireki fitxategiak"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Gehitu fitxategiak"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audioa"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Sarea"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Erreprodukzio-zerrenda"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Pluginak"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Orokorra"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efektuak"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Bistaratzea"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Sarrera"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transportea"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Ilara"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "_Kendu ilara"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Abesti honetara saltatu"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Data"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Iragazkia: "
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Kodeka"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Iragazkia:"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kalitatea"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Bat ere ez"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabiarra"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltikoa"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Txinatarra"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Grekoa"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebrearra"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japoniarra"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Korearra"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Poloniera"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Errusiarra"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanera"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turkiarra"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Koma mugikorra"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Erreprodukzio-zerrendaren kudeatzailea"
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Sarrerak"
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Irteera plugin-a:"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Irteera ezarpenak</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bit sakonera:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Bufferraren tamaina:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Muxarrakin xuabea"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Softwarearen bolumen kontrola erabili (ez gomendagarria)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Replay Gain</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Gaitu irabazpena"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Disko modua"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Ekidin muxarrakina (gomendatua)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Mailak doitu</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Anplifikatu fitxategi guztiak:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Anplifikatu etiketa gabeko fitxategiak:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Proxy-aren ostalari-izena:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Proxy-aren ataka:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Proxy-aren erabiltzaile-izena:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Proxy-aren pasahitza:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Proxy-aren konfigurazioa</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Gaitu proxy-a erabiltzea"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Erabili autentifikazioa proxy-arekin"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Karaktere-kodeketaren detekzio automatikoa:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Karaktere-kodeketa:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Portaera</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Aurreratu uneko abestia ezabatzen denean"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Garbitu erreprodukzio-zerrenda fitxategiak irekitzerakoan"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Gehitu fitxategi berriak aldi baterako erreprodukzio-zerrendari"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Bateragarritasuna</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
 msgstr ""
+"\\ (aderantzizkatutako diagonala) karpeta mugatzaile bezala interpretatu"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Itxi leihoa erreprodukzio-zerrenda aktibatzean"
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Kanten ikuspegia</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Abesti zenbakiak erakutsi"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Erakutzi zeroak aurretik (02:00 eta ez 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Ez kargatu kantuen metadatuak jo arte"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Disko Azala</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Bilatu hitz hauekin bat datozen irudiak (koma bidez banatu):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Ezikusi hitz hauekin bat datozen irudiak (koma bidez banatu):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Bilatu kantuaren fitxategi izenarekin bat datozen irudiak"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Bilatu errekurtsiboki"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Bilaketa sakonera:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Laster-leihoa</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Bistaratu popup informazioa"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Popup atzeratzea (segundu hamarrenak)"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Bistaratu oraingo kantuaren denbora eskala"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TITULUA"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTISTA - TITULUA"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTISTA - DISKOA - TITULUA"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTISTA - DISKOA - PISTA. TITULUA"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTISTA - [DISKOA] - PISTA. TITULUA"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUMA - TITULUA"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategoria"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Pertsonalizatua"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Tituluaren formatua:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Kate pertsonalizatua:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr ""
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Ilara kudeatzailea"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr ""
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Ireki URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Gehitu URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Sartu URLa:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Mezuak ezkutatu dira.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Ez dago %s(r)en informazio eskurragarririk.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Fitxategi-izena"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/fa_IR.po b/po/fa_IR.po
index 1f494343f030..a99a51039d6f 100644
--- a/po/fa_IR.po
+++ b/po/fa_IR.po
@@ -6,17 +6,18 @@
 # John Lindgren <john.lindgren at aol.com>, 2012
 # mbg1991 <mbg1991 at gmail.com>, 2012
 # mbg1991 <mbg1991 at gmail.com>, 2012
-# misledlove <misled.love at yahoo.com>, 2013
-# misledlove <misled.love at yahoo.com>, 2013
+# Mohammad Rafigh <misled.love at yahoo.com>, 2013
+# Mohammad Rafigh <misled.love at yahoo.com>, 2013
 # Saeed Derakhshan <saeed.love at gmail.com>, 2012
 # vandu <vandusoft at gmail.com>, 2014
+# vandu <vandusoft at gmail.com>, 2014
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/audacious/"
 "language/fa_IR/)\n"
 "Language: fa_IR\n"
@@ -25,95 +26,81 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "در حال جستجو..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "‎%d فایل پیدا شد"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "لیست پخش جدید"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "خطا"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "نمایش راهنمای خط فرمان"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "نمایش نسخه"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "شروع پخش"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "متوقف کردن پخش"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "اگر فایل در حال پخش است آنرا متوقف، در غیر این‌صورت آنرا پخش کن"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "پایان دادن به پخش"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "رفتن به آهنگ قبلی"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "رفتن به آهنگ بعدی"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "اضافه کردن فایل به لیست پخش"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "اضافه کردن فایل‌ها به لیست پخش موقتی"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "نمایش پنجره اصلی"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "پنجره پرش به آهنگ را نشان بده"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "شروع برنامه بدون رابط گرافیکی"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "خروج در هنگام توقف پخش"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "چاپ پیام‌های اشکال‌زدایی"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "تنظیمات نامعلوم: ‎%s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "تنظیمات نامعلوم: ‎-%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -122,35 +109,53 @@ msgstr ""
 "نحوه استفاده: ‎audacious [OPTION] ... [FILE]‎\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "برای ‎%s دیکدری پیدا نشد."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "‎%d فایل پیدا شد"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "‎%s نمی تواند باز شود."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "لیست پخش جدید"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "نمی‌توان ‎%s را بارگذاری کرد: پسوند فایل ناشناخته است."
+msgid "Audio CD, track %s"
+msgstr "سی‌دی صوتی،‌ آهنگ ‎%s"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr ""
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "نمی‌توان ‎%s را ذخیره کرد: پسوند فایل ناشناخته است."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr ""
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "در حال پخش"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -158,890 +163,1054 @@ msgstr ""
 "لیست پخش نمی‌تواند مرتب شود چون جستجوی متاداده‌ها همچنان در حال انجام است (یا "
 "غیر فعال شده است)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_اعمال کردن"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_انصراف"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_بستن"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_تنظیمات"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "تک‌کاناله"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_درباره"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "دوکاناله"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_افزونه‌ها ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "‎%d کانال"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "شکل ظاهری برنامه"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "صدا"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "شبکه"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "لیست پخش"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "اطلاعات آهنگ"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "افزونه‌ها"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "عمومی"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "تولیدکنندگان"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "افکت"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "لایسنس"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "جلوه‌های تصویری"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "درباره Audaciuos"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "ورودی"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "آیا می‌خواهید \"‎%s\" را برای همیشه حذف کنید؟"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "انتقال"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_حذف"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "هنرمند"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_انصراف"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "آلبوم"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "حذف لیست پخش"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "عنوان"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_دوباره نپرس"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "شماره آهنگ"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "سبک"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "تغییر نام لیست پخش"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "نام فایل"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "چه نامی را برای لیست پخش جاری انتخاب می‌کنید؟"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "آدرس فایل"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "ـفعال کردن"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "تاریخ انتشار"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 هرتز"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "سال انتشار"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63‌ هرتز"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "توضیحات"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 هرتز"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "کدک"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 هرتز"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "کیفیت"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 هرتز"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "هیچکدام"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 کیلوهرتز"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "عربی"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 کیلوهرتز"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "بالتیک"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 کیلوهرتز"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "چینی"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 کیلوهرتز"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "یونانی"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 کیلوهرتز"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "عبری"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "اکولایزر"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "ژاپنی"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "پیش‌تقویت‌کننده"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "کره‌ای"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "باز کردن فایل‌ها"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "لهستانی"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_باز کردن"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "روسی"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "بستن _پنجره پیغام بعد از باز کردن"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "تایوانی"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "اضافه کردن فایل‌ها"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "ترکی"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_اضافه کردن"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "ممیز شناور"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "بستن _پنجره پیغام بعد از اضافه کردن"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>تنظیمات رابط</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_بستن"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "افزونه رابط:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "عنوان"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "افزونه خروجی:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "هنرمند"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>تنظیمات خروجی</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "آلبوم"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "عمق بیت:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "سبک"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "اندازه بافر:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "سال انتشار"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "میلی ثانیه"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "آهنگ"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "کلیپ دادن نرم صدا"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "مدت زمان"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "استفاده از کنترل صدای نرم‌افزاری (توصیه نمیشود)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "فرمت:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>تقویت صدا</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "کیفیت:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "فعال کردن تقویت صدا"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "نرخ بیت:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "به ازای آلبوم"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "اسید جاز"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "جلوگیری از کلیپ کردن صدا (پیشنهاد می شود)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "اسید راک"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>تنظیم اندازه</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "امبینت"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "تقویت صدای تمام فایل‌ها:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "بیباپ"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "دسیبل"
-
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "تقویت صدای فایل‌های  برچسب نخورده:"
-
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "نام هاست پراکسی:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "شماره پورت پراکسی:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "نام کاربری پراکسی:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "کلمه عبور پراکسی:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>تنظیمات پراکسی</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "فعال کردن استفاده از پراکسی"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "استفاده از تایید اعتبار با پروکسی"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "تشخیص خودکار انکدینگ کاراکترها برای:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "انکدینگ کاراکترها در صورت وجود اشکال:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>وضعیت</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "ادامه اجرای فایل‌ها هنگام شروع برنامه"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "هنگامی که فایل در حال پخش پاک شد فایل بعدی را پخش کن"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "پاک کردن لیست پخش هنگام باز کردن فایل جدید"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "باز کردن فایل‌ها در لیست پخش موقتی"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "تا زمانی که آهنگ‌ها پخش نشده‌اند متاداده آنها را بارگذاری نکن"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>سازگاری</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "\\ (backward slash) را به عنوان جداکننده پوشه‌ها تفسیر کن"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>تصویر آلبوم</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-"جستجو برای تصاویری که با این کلمات مطابقت داشته باشند (کلمات را با کاما از "
-"هم جدا کنید):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"درنظر نگرفتن تصاویری که با این کلمات مطابقت داشته باشند (کلمات را با کاما از "
-"هم جدا کنید):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "جستجو برای تصاویری که با نام آهنگ مطابقت داشته باشند"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "جستجوی بازگشتی"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "عمق جستجو:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>اطلاعات پنجره بازشو</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "نمایش پنجره بازشوی اطلاعات"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "تاخیر پنجره بازشو (براساس دهم ثانیه):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "نمایش مقیاس زمان برای آهنگ جاری"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "عنوان"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "هنرمند - عنوان"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "هنرمند - آلبوم - عنوان"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "هنرمند - آلبوم - شماره آهنگ. عنوان"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "هنرمند [ آلبوم ] - شماره آهنگ. عنوان"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "آلبوم - عنوان"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "دسته‌بندی"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "شخصی"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>نمایش آهنگ</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "نمایش شماره آهنگ‌ها"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "صفرهای پیشین را نمایش بده (02:00 به جای 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "فرمت عنوان:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "رشته شخصی:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "تنظیمات Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "پوشه (‎%s) را نمی‌توان ایجاد کرد: ‎%s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "سی‌دی صوتی،‌ آهنگ ‎%s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "تک‌کاناله"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "دوکاناله"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "‎%d کانال"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "تولیدکنندگان"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "لایسنس"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "درباره Audaciuos"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "آیا می‌خواهید \"‎%s\" را برای همیشه حذف کنید؟"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_حذف"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "حذف لیست پخش"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_دوباره نپرس"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "تغییر نام لیست پخش"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "چه نامی را برای لیست پخش جاری انتخاب می‌کنید؟"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "ـفعال کردن"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 هرتز"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63‌ هرتز"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 هرتز"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 هرتز"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 هرتز"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 کیلوهرتز"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 کیلوهرتز"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 کیلوهرتز"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 کیلوهرتز"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 کیلوهرتز"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "اکولایزر"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "پیش‌تقویت‌کننده"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "آهنگ"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "مدت زمان"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "فرمت:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "کیفیت:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "نرخ بیت:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "اسید جاز"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "اسید راک"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "امبینت"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "بیباپ"
-
-#: src/libaudgui/infowin.c:80
+#: src/libaudgui/infowin.cc:87
 msgid "Bluegrass"
 msgstr "بلوگرس"
 
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "بلوز"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "موسیقی خواب"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "کلاسیک"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "کانتری"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "دت متال"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "دیسکو"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "موسیقی آرام"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "فولک"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "فانک"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "رپ گانگستری"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "گاسپل"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "گرانج"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "هارد راک"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "هوی متال"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "هیپ-هاپ"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "هاوس"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "جاز"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "جنگل"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "متال"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "عصر جدید"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "موج جدید"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "نویز"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "پاپ"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "پانک راک"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "رپ"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "رگه"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "راک"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "راک اند رول"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "ریتم اند بلوز"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "اسکا"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "سول"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "سوینگ"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "تکنو"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "تریپ-هاپ"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "ذخیره با موفقیت"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "خطا در ذخیره‌سازی"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "اطلاعات آهنگ"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "توضیحات"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "شماره آهنگ"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_ذخیره"
 
-#: src/libaudgui/infowin.c:418
-#, c-format
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
+#, c-format
 msgid "%d kb/s"
 msgstr "‎%d کیلوبیت/ثانیه"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "نامعلوم"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "اطلاعاتی برای ‎%s در دسترس نیست.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_پرش"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "پرش به زمان"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "زمان را وارد کنید (دقیقه:ثانیه):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "باز نویسی بر روی ‎%s انجام شود؟"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_صف"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "خارج کردن از_صف"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "پرش به آهنگ"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "فیلتر:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "ـفیلتر:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "ب_ستن هنگام پرش"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "تایید بازنویسی"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "باز نویسی بر روی ‎%s انجام شود؟"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "خروجی گرفتن از لیست پخش"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "وارد کردن لیست پخش"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "مدیر صف"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_افزونه‌ها ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_خارج کردن از صف"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "باز کردن فایل‌ها"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_باز کردن"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_اعمال کردن"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "بستن _پنجره پیغام بعد از باز کردن"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_تنظیمات"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "اضافه کردن فایل‌ها"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_درباره"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_اضافه کردن"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "شکل ظاهری برنامه"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "بستن _پنجره پیغام بعد از اضافه کردن"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "صدا"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_صف"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "شبکه"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "خارج کردن از_صف"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "لیست پخش"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "پرش به آهنگ"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "افزونه‌ها"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "فیلتر:"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "عمومی"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "ـفیلتر:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "افکت"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "ب_ستن هنگام پرش"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "جلوه‌های تصویری"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "ورودی"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "انتقال"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "تاریخ انتشار"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "کدک"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "کیفیت"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "هیچکدام"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "عربی"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "بالتیک"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "چینی"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "یونانی"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "عبری"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "ژاپنی"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "کره‌ای"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "لهستانی"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "روسی"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "تایوانی"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "ترکی"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "ممیز شناور"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>تنظیمات رابط</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "افزونه رابط:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "افزونه خروجی:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>تنظیمات خروجی</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "عمق بیت:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "اندازه بافر:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "میلی ثانیه"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "کلیپ دادن نرم صدا"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "استفاده از کنترل صدای نرم‌افزاری (توصیه نمیشود)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>تقویت صدا</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "فعال کردن تقویت صدا"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "به ازای آلبوم"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "جلوگیری از کلیپ کردن صدا (پیشنهاد می شود)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>تنظیم اندازه</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "تقویت صدای تمام فایل‌ها:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "دسیبل"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "مدیریت لیست پخش"
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "تقویت صدای فایل‌های  برچسب نخورده:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "نام هاست پراکسی:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "شماره پورت پراکسی:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "نام کاربری پراکسی:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "کلمه عبور پراکسی:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>تنظیمات پراکسی</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "فعال کردن استفاده از پراکسی"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "استفاده از تایید اعتبار با پروکسی"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "تشخیص خودکار انکدینگ کاراکترها برای:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "انکدینگ کاراکترها در صورت وجود اشکال:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>وضعیت</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "هنگامی که فایل در حال پخش پاک شد فایل بعدی را پخش کن"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "پاک کردن لیست پخش هنگام باز کردن فایل جدید"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "باز کردن فایل‌ها در لیست پخش موقتی"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "داده‌ها"
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>سازگاری</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_جدید"
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "\\ (backward slash) را به عنوان جداکننده پوشه‌ها تفسیر کن"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "تغییر_نام"
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>نمایش آهنگ</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_پخش"
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "نمایش شماره آهنگ‌ها"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "صفرهای پیشین را نمایش بده (02:00 به جای 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_پنجره پیغام را در هنگام فعال شدن لیست پخش ببند"
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "تا زمانی که آهنگ‌ها پخش نشده‌اند متاداده آنها را بارگذاری نکن"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>تصویر آلبوم</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr ""
+"جستجو برای تصاویری که با این کلمات مطابقت داشته باشند (کلمات را با کاما از "
+"هم جدا کنید):"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr ""
+"درنظر نگرفتن تصاویری که با این کلمات مطابقت داشته باشند (کلمات را با کاما از "
+"هم جدا کنید):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "جستجو برای تصاویری که با نام آهنگ مطابقت داشته باشند"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "جستجوی بازگشتی"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "عمق جستجو:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>اطلاعات پنجره بازشو</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "نمایش پنجره بازشوی اطلاعات"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "تاخیر پنجره بازشو (براساس دهم ثانیه):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "نمایش مقیاس زمان برای آهنگ جاری"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "عنوان"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "هنرمند - عنوان"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "هنرمند - آلبوم - عنوان"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "هنرمند - آلبوم - شماره آهنگ. عنوان"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "هنرمند [ آلبوم ] - شماره آهنگ. عنوان"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "آلبوم - عنوان"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "دسته‌بندی"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "شخصی"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "فرمت عنوان:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "رشته شخصی:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "تنظیمات Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "مدیر صف"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_خارج کردن از صف"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "خطا"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "بازکردن آدرس اینترنتی"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "اضافه کردن آدرس اینترنتی"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "آدرس اینترنتی را وارد کنید:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(پیام‌های بیشتر مخفی شده‌اند.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "اطلاعاتی برای ‎%s در دسترس نیست.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "نام فایل"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/fi.po b/po/fi.po
index 76f0523aac89..de6090eea77f 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -5,7 +5,7 @@
 # Translators:
 # Elias Julkunen <elias.julkunen at gmail.com>, 2011
 # J. S. Tuomisto <jstuomisto at gmail.com>, 2013
-# Jiri Grönroos <jiri.gronroos at iki.fi>, 2014
+# Jiri Grönroos <jiri.gronroos at iki.fi>, 2014-2015
 # J. S. Tuomisto <jstuomisto at gmail.com>, 2013
 # J. S. Tuomisto <jstuomisto at gmail.com>, 2013
 # Matti Hämäläinen, 2008
@@ -15,8 +15,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-24 18:14+0000\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-02-12 18:07+0000\n"
 "Last-Translator: Jiri Grönroos <jiri.gronroos at iki.fi>\n"
 "Language-Team: Finnish (http://www.transifex.com/projects/p/audacious/"
 "language/fi/)\n"
@@ -26,96 +26,81 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Etsitään..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d tiedosto löytyi"
-msgstr[1] "%d tiedostoa löytyi"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Uusi soittolista"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Virhe"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Näytä komentorivin ohje"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Näytä versio"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Aloita toisto"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Keskeytä toisto"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Keskeytä jos kappale soi, muutoin jatka soittamista"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Pysäytä toisto"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Siirry edelliseen kappaleeseen"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Siirry seuraavaan kappaleeseen"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Lisää tiedostoja soittolistaan"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Lisää tiedostoja väliaikaiselle soittolistalle"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Näytä pääikkuna"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Näytä \"siirry kappaleeseen\"-ikkuna"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Käynnistä ilman graafista käyttöliittymää"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Sulje kun toisto pysäytetään"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Näytä virheenjäljitysviestit"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Suorita Qt-tilassa"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Tuntematon valinta: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Tuntematon valinta: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -124,35 +109,56 @@ msgstr ""
 "Käyttö: audacious [VALINTA] ... [TIEDOSTO] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Dekooderia ei löytynyt tiedostomuodolle %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d tiedosto löytyi"
+msgstr[1] "%d tiedostoa löytyi"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "Ei voida avata %s."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Uusi soittolista"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Kohteen %s lataaminen epäonnistui: tiedostopääte ei ole tuettu."
+msgid "Audio CD, track %s"
+msgstr "Ääni-CD, kappale %s"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(merkistökoodausvirhe)"
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Virhe liitännäistä ladattaessa"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Kohteen %s tallentaminen epäonnistui: tiedostopääte ei ole tuettu."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Virhe avattaessa %s:\n"
+"%s"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Tuntematon toistovirhe"
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Virheellinen äänimuoto"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Soi nyt"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -160,887 +166,1051 @@ msgstr ""
 "Soittolistaa ei voida lajitella, koska metatietojen päivitys on vielä kesken "
 "(tai se on poistettu käytöstä)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Tietoja"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Kohdetta %s ei voi ladata: tiedostopääte ei ole tuettu."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Asetukset"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Kohdetta %s ei voi tallentaa: tiedostopääte ei ole tuettu."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Aseta"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Siirtymisvirhe"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Peru"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Tiedostomuotoa ei tunnistettu"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Sulje"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Virhe metatietoja luettaessa"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Asetukset"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Tietoja"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Liitännäiset..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanava"
+msgstr[1] "%d kanavaa"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Ulkoasu"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Kappale %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Ääni"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Ääni-CD"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Verkko"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(tuntematon nimi)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Soittolista"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Kappaleen tiedot"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Liitännäiset"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Virheellinen tiedostonimi"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Yleiset"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Tekijät"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Tehosteet"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Lisenssi"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualisoinnit"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Tietoja Audaciouksesta"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Äänilähteet"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Haluastko poistaa kohteen “%s” pysyvästi?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Siirtokanavat"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Poista"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Esittäjä"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Peru"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Albumi"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Poista soittolista"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Nimi"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Älä kysy uudelleen"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Kappalenumero"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Nimeä uudelleen"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Tyylilaji"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Nimeä soittolista uudelleen"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Tiedostonimi"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Minkä nimen haluat antaa tälle soittolistalle?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Tiedostopolku"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Käytä"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Päiväys"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Vuosi"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Kommentti"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Koodekki"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Laatu"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Ei mikään"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabia"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Balttia"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Kiina"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Kreikka"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Heprea"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Taajuuskorjain"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japani"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Esivahvistus"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Korea"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Avaa tiedostoja"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Puola"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Avaa"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Venäjä"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "S_ulje ikkuna avatessa"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwan"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Lisää tiedostoja"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turkki"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Lisää"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Liukuluku"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Sul_je ikkuna lisättäessä"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Käyttöliittymän asetukset</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Sulje"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Käyttöliittymän liitännäinen:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Nimi"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Ulostulon lisäosa:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Esittäjä"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Ulostulon asetukset</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Albumi"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bittisyvyys:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Tyylilaji"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Puskurin koko:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Vuosi"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Kappale"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Pehmeä leikkaantuminen"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Kesto"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Käytä ohjelmallista äänensäätöä (ei suositeltu)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Muoto:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Replay Gain</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Laatu:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Käytä Replay Gainia"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bittinopeus:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Albumitila"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Estä leikkaantuminen (suositeltu)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Säädä tasoja</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Vahvista kaikki tiedostot:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Vahvista luokittelemattomat tiedostot:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Välityspalvelimen osoite:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Välityspalvelimen portti:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Välityspalvelimen käyttäjätunnus:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Välityspalvelimen salasana:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Välityspalvelimen asetukset</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Käytä välityspalvelinta"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Käytä tunnistautumista välityspalvelimen kanssa"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Automaattinen merkistökoodauksen tunnistus:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Toissijaiset merkistökoodaukset:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Käytös</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Jatka soittoa käynnistettäessä"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Jatka, kun nykyinen kappale on poistettu"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Tyhjennä soittolista avattaessa tiedostoja"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Avaa tiedostot väliaikaisessa soittolistassa"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Älä lataa metatietoja kun kappaletta soitetaan"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Yhteensopivuus</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Tulkitse \\ (kenoviiva) kansioerottimeksi"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Levynkansi</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Etsi kuvia joissa esiintyy sanat (erota pilkulla):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Hylkää kuvat joissa esiintyy sanat (erota pilkulla):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Etsi kuvia jotka täsmäävät kappaleen tiedostonimeen"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Etsi rekursiivisesti"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Etsintäsyvyys:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Ponnahdusikkuna</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Näytä ponnahdusikkuna"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Ponnahdusikkunan viive (kymmenesosasekunti):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Näytä soivan kappaleen aikapalkki"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "NIMI"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTISTI - NIMI"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTISTI - ALBUMI - NIMI"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTISTI - ALBUMI - KAPPALENUMERO. NIMI"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTISTI [ ALBUMI ] - KAPPALENUMERO. NIMI"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUMI - NIMI"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Luokka"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Mukautettu..."
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Kappaleen näyttö</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Näytä kappalenumerot"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Näytä edeltävät nollat (2:00:n sijasta 02:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Nimikkeen muoto:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Muu merkkijono:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Audaciouksen asetukset"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Hakemiston (%s) luominen epäonnistui: %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Ääni-CD, kappale %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanava"
-msgstr[1] "%d kanavaa"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Tekijät"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Lisenssi"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Tietoja Audaciouksesta"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Haluastko poistaa kohteen “%s” pysyvästi?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Poista"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Poista soittolista"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Älä kysy uudelleen"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Nimeä uudelleen"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Nimeä soittolista uudelleen"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Minkä nimen haluat antaa tälle soittolistalle?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Käytä"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Taajuuskorjain"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Esivahvistus"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Kappale"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Kesto"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Muoto:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Laatu:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Bittinopeus:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Kamarimusiikki"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klassinen"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Kantri"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disko"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Kevyt kuunneltava"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta-rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metalli"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock 'n' roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "R'n'B"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Tekno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Tallennus onnistui"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Virhe tallennettaessa"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Kappaleen tiedot"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Albumi / esittäjä"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Kommentti"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Kappaleen numero"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "T_yhjennä kentät seuraavaan kappaleeseen siirryttäessä"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Tallenna"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Seuraava"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "-"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Tietoja ei ole saatavilla aiheesta %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "Sii_rry"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Hyppää aikaan"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Syötä aika (minuutit:sekunnit):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Ylikirjoita %s?"
-
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Lisää jonoon"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "_Poista jonosta"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Hyppää kappaleeseen"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Suodatin: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Suodatin:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "S_ulje siirryttäessä"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_Korvaa"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Vahvista korvaaminen"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Ylikirjoita %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Vie soittolista"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Vie"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Tuo soittolista"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Tuo"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Jonomanageri"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Liitännäiset..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Poista jonosta"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Tietoja - %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Avaa tiedostoja"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s - asetukset"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Avaa"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Aseta"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "S_ulje ikkuna avatessa"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Asetukset"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Lisää tiedostoja"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Tietoja"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Lisää"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Ulkoasu"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Sul_je ikkuna lisättäessä"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Ääni"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Lisää jonoon"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Verkko"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "_Poista jonosta"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Soittolista"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Hyppää kappaleeseen"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Liitännäiset"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Suodatin: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Yleiset"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Suodatin:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Tehosteet"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "S_ulje siirryttäessä"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualisoinnit"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Äänilähteet"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Soittolistojen hallinta"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Siirtokanavat"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Nimikkeitä"
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Kappalenumero"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Uusi"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Tiedostonimi"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "N_imeä uudelleen"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Tiedoston polku"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Toista"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Päiväys"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Sulje ikkuna, kun soittolista on aktivoidaan"
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Koodekki"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Laatu"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Ei mikään"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabia"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Balttia"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Kiina"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Kreikka"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Heprea"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japani"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Korea"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Puola"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Venäjä"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwan"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turkki"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Liukuluku"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Käyttöliittymän asetukset</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Käyttöliittymän liitännäinen:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Ulostulon lisäosa:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Ulostulon asetukset</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bittisyvyys:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Puskurin koko:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Pehmeä leikkaantuminen"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Käytä ohjelmallista äänensäätöä (ei suositeltu)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Replay Gain</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Käytä Replay Gainia"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Albumitila"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Estä leikkaantuminen (suositeltu)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Säädä tasoja</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Vahvista kaikki tiedostot:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Vahvista luokittelemattomat tiedostot:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Välityspalvelimen osoite:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Välityspalvelimen portti:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Välityspalvelimen käyttäjätunnus:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Välityspalvelimen salasana:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Verkkoasetukset</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Välityspalvelimen asetukset</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Käytä välityspalvelinta"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Käytä tunnistautumista välityspalvelimen kanssa"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Automaattinen merkistökoodauksen tunnistus:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Toissijaiset merkistökoodaukset:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Käytös</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Palauta toisto käynnistäessä"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Keskeytä välittömän palauttamisen sijaan"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Jatka, kun nykyinen kappale on poistettu"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Tyhjennä soittolista avattaessa tiedostoja"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Avaa tiedostot väliaikaisessa soittolistassa"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Yhteensopivuus</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Tulkitse \\ (kenoviiva) kansioerottimeksi"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Kappaleen näyttö</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Näytä kappalenumerot"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Näytä edeltävät nollat (2:00:n sijasta 02:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Lisäasetukset</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Älä lataa metatietoja kun kappaletta soitetaan"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Tutki tuntemattomien tiedostopäätteiden omaavien tiedostojen sisältö"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Albumikansi</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Etsi kuvia joissa esiintyy sanat (erota pilkulla):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Hylkää kuvat joissa esiintyy sanat (erota pilkulla):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Etsi kuvia jotka täsmäävät kappaleen tiedostonimeen"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Etsi rekursiivisesti"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Etsintäsyvyys:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Ponnahdusikkuna</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Näytä ponnahdusikkuna"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Ponnahdusikkunan viive (kymmenesosasekunti):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Näytä soivan kappaleen aikapalkki"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "NIMI"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTISTI - NIMI"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTISTI - ALBUMI - NIMI"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTISTI - ALBUMI - KAPPALENUMERO. NIMI"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTISTI [ ALBUMI ] - KAPPALENUMERO. NIMI"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUMI - NIMI"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Luokka"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Mukautettu..."
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Nimikkeen muoto:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Muu merkkijono:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Audaciouksen asetukset"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Jonomanageri"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Poista jonosta"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Työskennellään..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Virhe"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
-msgstr "Avaa URL-osoite"
+msgstr "Avaa verkko-osoite"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
-msgstr "Lisää URL-osoite"
+msgstr "Lisää verkko-osoite"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
-msgstr "Linkki:"
+msgstr "Anna verkko-osoite:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Seuraavat viestit ovat piilotettu.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Avaa kansio"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Lisää kansio"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Avaa"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Lisää"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metatiedot"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Säveltäjä"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Esittäjä"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Nauhoitusvuosi"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Nauhoituspäivä"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIME-tyyppi"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bittinopeus"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Tietoja ei ole saatavilla aiheesta %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Tiedostonimi"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Viesti"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Lokitaso:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Varoitus"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Liitännäiset..."
diff --git a/po/fr.po b/po/fr.po
index 7e2087da87b5..de9ae48501ff 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,14 +7,14 @@
 # Oxayotl <jagw40k at free.fr>, 2013-2014
 # Oxayotl <jagw40k at free.fr>, 2011-2012
 # Oxayotl <jagw40k at free.fr>, 2011
-# Oxayotl <jagw40k at free.fr>, 2013
-# yahoe.001, 2013-2014
+# Oxayotl <jagw40k at free.fr>, 2011,2013
+# yahoe.001, 2013-2015
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-23 16:58+0000\n"
+"POT-Creation-Date: 2015-04-03 11:51+0200\n"
+"PO-Revision-Date: 2015-03-15 20:31+0000\n"
 "Last-Translator: yahoe.001\n"
 "Language-Team: French (http://www.transifex.com/projects/p/audacious/"
 "language/fr/)\n"
@@ -24,96 +24,81 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Recherche..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d fichier trouvé"
-msgstr[1] "%d fichiers trouvés"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nouvelle liste de lecture"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Erreur"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Afficher l'aide de la ligne de commande"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Afficher la version"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Commencer la lecture"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Mettre en pause"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Mettre en pause, sinon lire"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Arrêter la lecture"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
-msgstr "Passer au morceau précédent "
+msgstr "Passer au morceau précédent"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Passer au morceau suivant"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Ajouter des fichiers à la liste de lecture"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Ajouter des fichiers à une liste de lecture temporaire"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Afficher la fenêtre principale"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Afficher la fenêtre « Sauter au morceau »"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Démarrer sans interface graphique"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
-msgstr "Quitter à la fin de la lecture"
+msgstr "Quitter à l'arrêt de la lecture"
+
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Imprimer les messages de débogage (peut être utilisé deux fois)"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Afficher les messages de débogage"
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Exécuter en mode Qt"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Option inconnue : %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Option inconnue : -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -122,925 +107,1112 @@ msgstr ""
 "Utilisation : audacious [OPTION] ... [FICHIER]...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Aucun décodeur trouvé pour %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d fichier trouvé"
+msgstr[1] "%d fichiers trouvés"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s n'a pas pu être ouvert."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nouvelle liste de lecture"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Impossible de charger %s : extension de fichier non prise en charge."
+msgid "Audio CD, track %s"
+msgstr "CD audio, piste %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(erreur d'encodage de caractère)"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Erreur lors du chargement du greffon"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
 msgstr ""
-"Impossible d'enregistrer %s : extension de fichier non prise en charge."
+"Erreur d'ouverture %s :\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Erreur de lecture inconnue"
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Format audio invalide"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Lecture en cours"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr ""
 "La liste de lecture ne peut pas être triée car le balayage des métadonnées "
-"est en cours (ou a été désactivé)."
+"est encore en cours (ou a été désactivé)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "À propos de"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr ""
+"Impossible de charger %s : extension de nom de fichier non prise en charge."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Paramètres"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr ""
+"Impossible d'enregistrer %s : extension de nom de fichier non prise en "
+"charge."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Définir"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Erreur de positionnement"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Annuler"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Format de fichier non reconnu"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Fermer"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Erreur de lecture des métadonnées"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Paramètres"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "À p_ropos de"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stéréo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Greffons..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d canal"
+msgstr[1] "%d canaux"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Apparence"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Piste %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Audio"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "CD Audio"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Réseau"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(titre inconnu)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Liste de lecture"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "URI invalide"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Infos sur le morceau"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Modèle d'URI inconnu"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Greffons"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Nom de fichier invalide"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Général"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Crédits"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Effets audio"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licence"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualisation"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "À propos d'Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Entrée"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Voulez-vous enlever « %s » de façon permanente ?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Accès aux fichiers"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "Enleve_r"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artiste"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Annuler"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Enlever la liste de lecture"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Titre"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "Ne plus _demander"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Numéro de la piste"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Renommer"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Genre"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Renommer la liste de lecture"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nom du fichier"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Comment voulez-vous appeler cette liste de lecture ?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Chemin du fichier"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "Activ_er"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Date"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Année"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Commentaire"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Qualité"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Aucune langue"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabe"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Balte"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Chinois"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Grec"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hébreu"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Égaliseur"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japonais"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Préampli"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Coréen"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Ouvrir des fichiers"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polonais"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Ouvrir"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Russe"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Fermer la _fenêtre de dialogue à l'ouverture"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taïwanais"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Ajouter des fichiers"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turc"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Ajouter"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Virgule flottante"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Fermer la fenêtre de _dialogue lors de l'ajout"
+
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Fermer"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Paramètres de l'interface</b>"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Titre"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Greffon d'interface :"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artiste"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Module de sortie"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Paramètres de sortie</b>"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Genre"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Profondeur du flux :"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Année"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Taille du tampon :"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Piste"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Durée"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Écrêtage logiciel"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Format :"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Utiliser un contrôle logiciel du volume (non recommandé)"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Qualité :"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Replay Gain</b>"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Débit binaire :"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Activer « ReplayGain »"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid jazz"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Mode album"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid rock"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Éviter l'écrêtage (recommandé)"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambiant"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Ajustement des niveaux</b>"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplifier tous les fichiers :"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplifier les fichiers sans balise :"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Musique de chambre"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Nom d'hôte du mandataire :"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "Classique"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Port du mandataire :"
+#: src/libaudgui/infowin.cc:91
+msgid "Country"
+msgstr "Country"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Nom d'utilisateur pour le mandataire :"
+#: src/libaudgui/infowin.cc:92
+msgid "Death Metal"
+msgstr "Death métal"
 
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Mot de passe pour le mandataire :"
+#: src/libaudgui/infowin.cc:93
+msgid "Disco"
+msgstr "Disco"
 
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Configuration du serveur mandataire</b>"
+#: src/libaudgui/infowin.cc:94
+msgid "Easy Listening"
+msgstr "Easy listening"
 
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Activer l'utilisation du mandataire"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Le mandataire demande une authentification"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Détection automatique de l'encodage pour :"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Encodages des caractères de reprise :"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Comportement</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Reprendre la lecture au démarrage"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Passer à la piste suivante si la piste courante est supprimée"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Vider la liste de lecture lors de l'ouverture de nouveaux fichiers"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Ouvrir les nouveaux fichiers dans une liste de lecture provisoire"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Ne charger les métadonnées qu'à la lecture"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibilité</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpréter le \\ (barre oblique inverse) comme délimiteur de dossier"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Illustration de l'album</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-"Rechercher des images correspondant à ces mots (séparés par des virgules) :"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Exclure les images contenant ces mots (séparés par des virgules) : "
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Rechercher des images correspondant au nom au morceau"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Recherche récursive"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Profondeur de la recherche"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Fenêtre d'information contextuelle</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Affiche la fenêtre d'information contextuelle"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Délai d'apparition de la fenêtre contextuelle (en 1/10 de seconde) :"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Affiche l'échelle de temps pour le morceau actuel"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TITRE"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTISTE - TITRE"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTISTE - ALBUM - TITRE"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTISTE - ALBUM - PISTE. TITRE"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTISTE [ ALBUM ] - PISTE. TITRE"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - TITRE"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Catégorie"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Personnalisé"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Affichage du morceau</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Afficher le numéro du morceau"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Afficher un zéro au début (02:00 au lieu de 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Format du titre :"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Format personnalisé :"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Paramêtres d'Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Impossible de créer le répertoire suivant (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "CD audio, piste %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stéréo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d canal"
-msgstr[1] "%d canaux"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Crédits"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licence"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "À propos d'Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Voulez-vous enlever « %s » de façon permanente ?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "En_lever"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Enlever la liste de lecture"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Ne plus demander"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Renommer"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Renommer la liste de lecture"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Comment voulez-vous appeler cette liste de lecture ?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Activer"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Égaliseur"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Préampli"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Piste"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Durée"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Format :"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Qualité :"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Débit binaire :"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Musique de chambre"
-
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "Classique"
-
-#: src/libaudgui/infowin.c:84
-msgid "Country"
-msgstr "Country"
-
-#: src/libaudgui/infowin.c:85
-msgid "Death Metal"
-msgstr "Death métal"
-
-#: src/libaudgui/infowin.c:86
-msgid "Disco"
-msgstr "Disco"
-
-#: src/libaudgui/infowin.c:87
-msgid "Easy Listening"
-msgstr "Easy listening"
-
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
-msgstr "Hard Rock"
+msgstr "Hard rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy métal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-Hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Métal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "Nouvel âge"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Bruit"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
-msgstr "Punk Rock"
+msgstr "Punk rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-Hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Enregistrement réussi"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Erreur d'enregistrement"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Infos sur le morceau"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Artiste de l'album"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Commentaire"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Numéro de piste"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Efface_r les champs en passant au morceau suivant"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Enregistrer"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "Suiva_nt"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/D"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Aucune information disponible pour %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "Sa_ut"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
-msgstr "Sauter vers la position"
+msgstr "Sauter à la positon (temps)"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
-msgstr "Saisir un temps (minutes:secondes) :"
+msgstr "Saisir une position (minutes:secondes) :"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Écraser %s ?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Mettre dans la file"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "_Retirer de la file"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Sauter au morceau"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtre :"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtre :"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Fermer _lors du saut"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "É_craser"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Confirmer l'écrasement"
 
-#: src/libaudgui/playlists.c:121
-msgid "Export Playlist"
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Écraser %s ?"
+
+#: src/libaudgui/playlists.cc:123
+msgid "Export Playlist"
 msgstr "Exporter la liste de lecture"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Exporter"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importer la piste de lecture"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Importer"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Gestionnaire de la file d'attente"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Greffons..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "Enlever de la _file d'attente"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "À propos de %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Ouvrir des fichiers"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "Paramètres de %s"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Ouvrir"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Définir"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Fermer la _fenêtre de dialogue à l'ouverture"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Paramètres"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Ajouter des fichiers"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "À p_ropos"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Ajouter"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Apparence"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Fermer la fenê_tre de dialogue lors de l'ajout"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audio"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Mettre dans la file"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Réseau"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "_Retirer de la file"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Liste de lecture"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Sauter au morceau"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Greffons"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtre :"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Général"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtre :"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Effets"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Fe_rmer lors du saut"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualisation"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Gestionnaire de listes de lecture"
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Entrée"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Entrées"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transport"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Nouvelle"
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Numéro de piste"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Nom de fichier"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Chemin du fichier"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Date"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codec"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Reno_mmer"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Qualité"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Lire"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Aucune"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Fermer la fenêtre après l'activation de la liste de lecture"
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabe"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Balte"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Chinois"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Grec"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hébreu"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japonais"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Coréen"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polonais"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Russe"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taïwanais"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turc"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Virgule flottante"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Paramètres de l'interface</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Greffon d'interface :"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Greffon de sortie :"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Paramètres de sortie</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Profondeur du flux :"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Taille du tampon :"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Écrêtage logiciel"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Utiliser le contrôle logiciel du volume (non recommandé)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Correction ReplayGain</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Activer « ReplayGain »"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Mode album"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Éviter l'écrêtage (recommandé)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Ajuster les niveaux</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplifier tous les fichiers :"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplifier les fichiers sans balise :"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Nom d'hôte du mandataire :"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Port du mandataire :"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Nom d'utilisateur du mandataire :"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Mot de passe du mandataire :"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Paramètres réseau</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Configuration du mandataire</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Activer l'utilisation du mandataire"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Utiliser l'authentification avec le mandataire"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Détecteur automatique d'encodage des caractères pour :"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Encodages de repli de reprise :"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Comportement</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Reprendre la lecture au démarrage"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Mettre en pause au lieu de reprendre immédiatement"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Avancer si la piste courante est supprimée"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Vider la liste de lecture à l'ouverture de fichiers"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Ouvrir les fichiers dans une liste de lecture provisoire"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibilité</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpréter la \\ (barre oblique inverse) comme délimiteur de dossier"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Affichage du morceau</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Afficher les numéros des morceaux"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Afficher un zéro au début (02:00 au lieu de 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Avancé</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Ne charger les métadonnées des morceaux qu'à la lecture"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Sonder le contenu des fichiers sans extension de fichier reconnue"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Illustration de l'album</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr ""
+"Rechercher des images correspondant à ces mots (séparés par des virgules) :"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Exclure les images contenant ces mots (séparés par des virgules) : "
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Rechercher des images correspondant au nom du morceau"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Recherche récursive"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Profondeur de la recherche :"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Fenêtre d'information contextuelle</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Afficher les fenêtres d'information contextuelle"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Délai de la fenêtre contextuelle (en dixièmes de seconde) :"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Afficher l'échelle de temps pour le morceau actuel"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TITRE"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTISTE - TITRE"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTISTE - ALBUM - TITRE"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTISTE - ALBUM - PISTE. TITRE"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTISTE [ ALBUM ] - PISTE. TITRE"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - TITRE"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Catégorie"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Personnalisé"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Format du titre :"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Chaîne personnalisée :"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Paramètres d'Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Gestionnaire de la file d'attente"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "Ôter de la _file d'attente"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Je travaille..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Erreur"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
-msgstr "Ouvrir l'URL"
+msgstr "Ouvrir une URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
-msgstr "Ajouter l'URL"
+msgstr "Ajouter une URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Saisir l'URL :"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Les messages à venir ont été cachés.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Ouvrir un dossier"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Ajouter un dossier"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Ouvrir"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Ajouter"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Métadonnées"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Compositeur"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Interprète"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Année d'enregistrement"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Date d'enregistrement"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Infos techniques"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Type MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Débit binaire"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Aucune info proposée pour %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Niveau"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nom de fichier"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Ligne"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Fonction"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Message"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Inspecteur de journaux"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Niveau de journalisation :"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Débogage"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Infos"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Avertissement"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Greffons..."
diff --git a/po/gl.po b/po/gl.po
index 74e975d89c5a..5e49586715b2 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -3,17 +3,17 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# antiparvos <marcoslansgarza at gmail.com>, 2014
+# antiparvos <marcoslansgarza at gmail.com>, 2013-2014
 # antiparvos <marcoslansgarza at gmail.com>, 2013
 # Miguel Anxo Bouzada <mbouzada at gmail.com>, 2013
 # Miguel Anxo Bouzada <mbouzada at gmail.com>, 2012
-# Miguel Anxo Bouzada <mbouzada at gmail.com>, 2012,2014
+# Miguel Anxo Bouzada <mbouzada at gmail.com>, 2012-2015
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-12 06:56+0000\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-01-06 09:31+0000\n"
 "Last-Translator: Miguel Anxo Bouzada <mbouzada at gmail.com>\n"
 "Language-Team: Galician (http://www.transifex.com/projects/p/audacious/"
 "language/gl/)\n"
@@ -23,96 +23,81 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Buscando..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d ficheiro atopado"
-msgstr[1] "%d ficheiros atopados"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nova lista de reprodución"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Erro"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Amosar a axuda da liña de ordes"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Amosa a versión"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Iniciar a reprodución"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Deter a reprodución"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pausa cando reproduce, reproducir noutro caso"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Parar a reprodución"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Ir á canción anterior"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Ir á seguinte canción"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Engadir ficheiros á lista de reprodución"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Engadir os ficheiros a unha lista temporal de reprodución"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Amosar a xanela principal."
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Amosar a xanela de salto á canción"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Iniciar sen interface gráfica"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Saír ao parar a reprodución"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Mostrar mensaxes de depuración"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Mostrar mensaxes de depuración (pode usarse dúas veces)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Executar en modo QT"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Opción descoñecida: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Opción descoñecida: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -121,35 +106,56 @@ msgstr ""
 "Uso: audacious [OPCIÓN] ... [FICHEIRO] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Non se atopou un descodificador para %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d ficheiro atopado"
+msgstr[1] "%d ficheiros atopados"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "Non foi posíbel abrir %s"
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nova lista de reprodución"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Non é posíbel cargar %s: extensión de ficheiro non admitida."
+msgid "Audio CD, track %s"
+msgstr "CD de son. pista %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(erro na codificación de caracteres)"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Produciuse un erro cargando o engadido"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Non é posíbel gardar %s: extensión de ficheiro non admitida."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Erro abrindo %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Erro de reprodución descoñecido"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Formato de son incorrecto"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Estase a reproducir"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -157,891 +163,1057 @@ msgstr ""
 "A lista de reprodución non pode ordenarse xa que a detección de metadatos "
 "aínda está en proceso (ou foi desactivada)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Sobre"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Non é posíbel cargar %s: extensión de nome de ficheiro non admitida."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Axustes"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Non é posíbel gardar %s: extensión de nome de ficheiro non admitida."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Estabelecer"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Erro de busca"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Cancelar"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Non se recoñeceu o formato do ficheiro"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Pechar"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Produciuse un erro lendo os metadatos"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Axustes"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Sobre"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Estéreo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Engadidos ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d canle"
+msgstr[1] "%d canles"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Aparencia"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Pista %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Son"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "CD de son"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Rede"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(título descoñecido)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Lista de reprodución"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "O URI é incorrecto"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Información da canción"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "O esquema do URI é descoñecido"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Engadidos"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Nome de ficheiro incorrecto"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Xeral"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Créditos"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efecto"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licenza"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualización"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Sobre Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Entrada"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Confirma que quere retirar permanentemente «%s»?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transporte"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Retirar"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Interprete"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Cancelar"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Álbum"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Retirar a lista de reprodución"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Título"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "Non preguntar _de novo"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Número de pista"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Renomear"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Xénero"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Renomear a lista de reprodución"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nome de ficheiro"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Como desexa chamarlle a esta lista?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Ruta ao ficheiro"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Activar"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Data"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Ano"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Comentario"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Códec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Calidade"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Ningún"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Árabe"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Báltico"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Chinés"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Grego"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebreo"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ecualizador"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Xaponés"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamplificador"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Coreano"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Abrir ficheiros"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polaco"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Abrir"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Ruso"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Pechar o _diálogo ao abrir"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanés"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Engadir ficheiros"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turco"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Engadir"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Coma flotante"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Pechar o _diálogo ao engadir"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Axustes da interface</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Pechar"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Engadido da interface:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Título"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Engadido de saída:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Interprete"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Configuración da saída</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Álbum"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Profundidade de bit:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Xénero"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Tamaño do búfer:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Ano"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Pista"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Recorte suave de picos"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Duración"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Utilizar o software de control de volume (non recomendado)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formato:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Normalización do volume</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Calidade:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Activar a normalización do volume"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Taxa de bits:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Modo do álbum"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Evitar a saturación (recomendado)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Axustes dos niveis</b> "
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambiental"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplificar todos os ficheiros:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplificar os ficheiros sen etiqueta:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Nome do servidor proxy:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Música de cámara"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Porto do proxy:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Nome de usuario no proxy:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Contrasinal no proxy:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Configuración do proxy</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Activar o uso de proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Usar autenticación co proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Detector de codificación de caracteres automático para: "
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Codificación de caracteres alternativa:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Comportamento</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Continuar coa reprodución ao iniciar"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Avanzar cando se elimina a canción actual"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Limpar a lista de reprodución a abrir ficheiros"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Abrir os ficheiros nunha lista temporal de reprodución"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Non cargar a información de metadatos ata reproducir"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibilidade</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr ""
-"Interpretar o caracter «\\» (barra invertida) como indicador dun nivel na "
-"árbore de ficheiros"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Portada</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-"Buscar imaxes que correspondan con estas palabras (separadas por comas):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"Excluir imaxes que correspondan con estas palabras (separadas por comas):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Buscar imaxes que correspondan co nome de ficheiro da canción"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Buscar recursivamente"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Profundidade da busca"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Mensaxe emerxente de información</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Amosar a mensaxe emerxente de información"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Atraso da mensaxe emerxente (décimas de segundo):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Amosar a escala de tempo da canción actual"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TÍTULO"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTISTA - TÍTULO"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTISTA - ÁLBUM - TÍTULO"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTISTA - ÁLBUM - PISTA. TÍTULO"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTISTA [ ÁLBUM ] - PISTA. TÍTULO"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ÁLBUM - TÍTULO"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Categoría:"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Personalizada"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Visor de cancións</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Amosar os números das cancións"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Amosar ceros á esquerda (02:00 no canto de 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Formato do título:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Cadea personalizada"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Axustes do Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Non foi posíbel crear o directorio (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "CD de son. pista %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Estéreo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d canle"
-msgstr[1] "%d canles"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Créditos"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licenza"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Sobre Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Confirma que quere retirar permanentemente «%s»?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Retirar"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Retirar a lista de reprodución"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "Non preguntar _de novo"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Renomear"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Renomear a lista de reprodución"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Como desexa chamarlle a esta lista?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Activar"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ecualizador"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamplificador"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Pista"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Duración"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Formato:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Calidade:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Taxa de bits:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambiental"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Música de cámara"
-
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Clásica"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Escoita doada"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folc"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Rock duro"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-Hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Ruído"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock & Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm & Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-Hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Gardouse correctamente"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Produciuse un erro ao gardar"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Información da canción"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Álbum Artista"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Comentario"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Número de pista"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Limpa_r os campos ao ir á seguinte canción"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Gardar"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "Se_guinte"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/D"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Non hai información dispoñíbel para %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Ir a"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Saltar no tempo"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Introducir o tempo (minutos:segundos):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Sobrescribir %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Cola"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Retirar da _cola"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Saltar á canción"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtro: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtro:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "_Pechar ao saltar"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_Sobrescribir"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Confirmar sobrescritura"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Sobrescribir %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Exportar lista de reprodución"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Exportar"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importar lista de reprodución"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Importar"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Xestor da cola"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Engadidos ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Retirar da cola"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Sobre%s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Abrir ficheiros"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "Axustes de %s"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Abrir"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Estabelecer"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Pechar o _diálogo ao abrir"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Axustes"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Engadir ficheiros"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Sobre"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Engadir"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Aparencia"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Pechar o _diálogo ao engadir"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Son"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Cola"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Rede"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Retirar da _cola"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Lista de reprodución"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Saltar á canción"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Engadidos"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtro: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Xeral"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtro:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efecto"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "_Pechar ao saltar"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualización"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Entrada"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transporte"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Número de pista"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Nome de ficheiro"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Ruta ao ficheiro"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Data"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Códec"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Calidade"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Ningún"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Árabe"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Báltico"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Chinés"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Grego"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebreo"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Xaponés"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Coreano"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polaco"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Ruso"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanés"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turco"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Coma flotante"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Axustes da interface</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Engadido da interface:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Engadido de saída:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Configuración da saída</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Profundidade de bit:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Tamaño do búfer:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Recorte suave de picos"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Utilizar o software de control de volume (non recomendado)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Normalización do volume</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Activar a normalización do volume"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Modo do álbum"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Evitar a saturación (recomendado)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Axustes dos niveis</b> "
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplificar todos os ficheiros:"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Xestor da lista de reprodución:"
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Entradas"
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplificar os ficheiros sen etiqueta:"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Novo"
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Nome do servidor proxy:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Porto do proxy:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Nome de usuario no proxy:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Contrasinal no proxy:"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Re_nomear"
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Axustes de rede</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "Re_producir"
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Pechar o diálogo ao activar la lista de reprodución"
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Configuración do proxy</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Activar o uso de proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Usar autenticación co proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Detector de codificación de caracteres automático para: "
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Codificación de caracteres alternativa:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Comportamento</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Continuar a reprodución ao iniciar"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Deter no canto de continuar inmediatamente"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Avanzar cando se elimina a canción actual"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Limpar a lista de reprodución cando se abran novos ficheiros"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Abrir os ficheiros nunha lista temporal de reprodución"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibilidade</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr ""
+"Interpretar o caracter «\\» (barra invertida) como indicador dun nivel na "
+"árbore de ficheiros"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Visor de cancións</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Amosar os números das cancións"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Amosar ceros á esquerda (02:00 no canto de 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Avanzado</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Non cargar a información de metadatos ata reproducir"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+"Investigar o contido dos ficheiros sen unha extensión recoñecíbel no nome do "
+"ficheiro."
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Portada</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr ""
+"Buscar imaxes que correspondan con estas palabras (separadas por comas):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr ""
+"Excluir imaxes que correspondan con estas palabras (separadas por comas):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Buscar imaxes que correspondan co nome de ficheiro da canción"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Buscar recursivamente"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Profundidade da busca"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Mensaxe emerxente de información</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Amosar a mensaxe emerxente de información"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Atraso da mensaxe emerxente (décimas de segundo):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Amosar a escala de tempo da canción actual"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTISTA - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTISTA - ÁLBUM - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTISTA - ÁLBUM - PISTA. TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTISTA [ ÁLBUM ] - PISTA. TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ÁLBUM - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Categoría:"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Personalizada"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Formato do título:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Cadea personalizada"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Axustes do Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Xestor da cola"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Retirar da cola"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Traballando..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Erro"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Abrir un URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Engadir un URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Introduza o URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(O resto de mensaxes foron agochados.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Abrir cartafol"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Engadir un cartafol"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Abrir"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Engadir"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadatos"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Compositor"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Intérprete"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Ano da gravación"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Data da gravación"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Técnico"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Tipo de MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Taxa de bits"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Non hai información dispoñíbel para %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Nivel"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nome de ficheiro"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Liña"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Función"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Mensaxe"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Inspector do rexistro"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Nivel do rexistro:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Depurar"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Información"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Aviso"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Engadidos ..."
diff --git a/po/he.po b/po/he.po
index e601affddeff..4423099cfe91 100644
--- a/po/he.po
+++ b/po/he.po
@@ -10,9 +10,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-11 17:07+0000\n"
-"Last-Translator: GenghisKhan <genghiskhan at gmx.ca>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Hebrew (http://www.transifex.com/projects/p/audacious/"
 "language/he/)\n"
 "Language: he\n"
@@ -21,1015 +21,1183 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "כעת מחפש ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "נמצא קובץ %d"
-msgstr[1] "נמצאו %d קבצים"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "רשימת נגינה חדשה"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "שגיאה"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "הצג גירסה"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr ""
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "הוסף קבצים אל רשימת הנגינה"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "הצג את החלון הראשי"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr ""
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
 msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr ""
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "נמצא קובץ %d"
+msgstr[1] "נמצאו %d קבצים"
 
-#: src/audacious/playback.c:387
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "רשימת נגינה חדשה"
+
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "%s could not be opened."
+msgid "Audio CD, track %s"
 msgstr ""
 
-#: src/audacious/playlist-files.c:95
-#, c-format
-msgid "Cannot load %s: unsupported file extension."
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr ""
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "אודות"
-
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "הגדרות"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_קבע"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_ביטול"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_סגור"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_הגדרות"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr ""
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_אודות"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "חד־ערוצי"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_תוספות ..."
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "דו־ערוצי"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "מראה"
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "ערוץ %d"
+msgstr[1] "%d ערוצים"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "שמע"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "רשת עבודה"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "רשימת נגינה"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "מידע שיר"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "תוספים"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "כללי"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "אפקט"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "תודות"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "ויזואליזציה"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "רשיון"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "קלט"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "אודות Audacious"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "אמן"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_הסר"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "אלבום"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_ביטול"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "כותרת"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "הסר רשימת נגינה"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "מספר רצועה"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_אל תשאל שוב"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "סגנון"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_שנה שם"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "שם קובץ"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "שנה שם רשימת נגינה"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "נתיב קובץ"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "תאריך"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_אפשר"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "שנה"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "הערה"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "קודק"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "איכות"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "ללא"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "ערבית"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "בלטית"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "סינית"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "יוונית"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "עברית"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "יפנית"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "משווה"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "קוריאנית"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "מגבר קדם"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "פולנית"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "פתח קבצים"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "רוסית"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_פתח"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "טאיואנית"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "טורקית"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "הוסף קבצים"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "נקודה צפה"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_הוסף"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>הגדרות ממשק</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "תוספת ממשק:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_סגור"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "תוספת פלט:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "כותרת"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>הגדרות פלט</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "אמן"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr ""
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "אלבום"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "גודל אגירה:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "סגנון"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "אלפית־השנייה"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "שנה"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr ""
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "רצועה"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr ""
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "אורך"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr ""
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "פורמט:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr ""
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "איכות:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "מצב אלבום"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "שיעור סביות:"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>התאם רמות</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "דציבל"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "ביבופ"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "מארח Proxy:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "פורט Proxy:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "שם משתמש Proxy:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "סיסמת Proxy:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>תצורת מתווך</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "אפשר ניצול Proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>התנהגות</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "המשך ניגון בעת הפעלה"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "פתח קבצים ברשימת נגינה זמנית"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "אל תטעין metadata עבור שירים עד שינוגנו"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "עומק חיפוש:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>מידע תיבה קופצת</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "הצג מידע תיבה מוקפצת"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "קטגוריה"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "מותאם"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "הצג מספרי שירים"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "הצג אפסים מובילים (02:00 במקום 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "פורמט כותרת:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "מחרוזת מותאמת:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "הגדרות Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "לא ניתן ליצור מדור ‏(%s): ‫%s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr ""
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "חד־ערוצי"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "דו־ערוצי"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "ערוץ %d"
-msgstr[1] "%d ערוצים"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "תודות"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "רשיון"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "אודות Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_הסר"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "הסר רשימת נגינה"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_אל תשאל שוב"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_שנה שם"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "שנה שם רשימת נגינה"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_אפשר"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "משווה"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "מגבר קדם"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "רצועה"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "אורך"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "פורמט:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "איכות:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "שיעור סביות:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr ""
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr ""
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr ""
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "ביבופ"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr ""
-
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "בלוז"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "מוזיקה קאמרית"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "קלאסי"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "קאנטרי"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "דת׳ מטאל"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "דיסקו"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr ""
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr ""
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "פאנק"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "גנגסטר ראפ"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "גוספל"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "גראנג׳"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "רוק כבד"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "הבי מטאל"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "היפ-הופ"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "האוס"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "ג׳ז"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "ג׳ונגל"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "מטאל"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "ניו אייג׳"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "גל חדש"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "רעש"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "פופ"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "פענק רוק"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "ראפ"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "רגיי"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "רוק"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "רוק אנד רול"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr ""
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "סקה"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "נשמה"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "סווינג"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "טכנו"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr ""
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "שמור שגיאה"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "מידע שיר"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "הערה"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "מספר רצועה"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_שמור"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d ק״ב/ש"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "אין מידע זמין עבור %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_קפוץ"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "קפוץ אל זמן"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "הזנת זמן (דקות:שניות):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "לכתוב על %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_תור"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr ""
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "קפיצה אל שיר"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "מסנן: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "מ_סנן:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_שכתב"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "ודא כתיבה על גבי קובץ קיים"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "לכתוב על %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "יצא רשימת נגינה"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "י_צא"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "יבא רשימת נגינה"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "י_בא"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "ניהול תור"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_תוספות ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "פתח קבצים"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_פתח"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_קבע"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_הגדרות"
+
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_אודות"
+
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "מראה"
+
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "שמע"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "רשת עבודה"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "רשימת נגינה"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "תוספים"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "כללי"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "אפקט"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "ויזואליזציה"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "קלט"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "הוסף קבצים"
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_הוסף"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_תור"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "תאריך"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "קודק"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "איכות"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "ללא"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "ערבית"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "בלטית"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "סינית"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "יוונית"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "עברית"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "יפנית"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "קוריאנית"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "פולנית"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "רוסית"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "טאיואנית"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "טורקית"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "נקודה צפה"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>הגדרות ממשק</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "תוספת ממשק:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "תוספת פלט:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>הגדרות פלט</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "קפיצה אל שיר"
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "גודל אגירה:"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "מסנן: "
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "אלפית־השנייה"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "מ_סנן:"
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "מנהל רשימת נגינה"
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "מצב אלבום"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "רשומות"
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_חדש"
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>התאם רמות</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "שנה _שם"
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_נגן"
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "דציבל"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
 msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "מארח Proxy:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "פורט Proxy:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "שם משתמש Proxy:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "סיסמת Proxy:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>תצורת מתווך</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "אפשר ניצול Proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>התנהגות</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "פתח קבצים ברשימת נגינה זמנית"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "הצג מספרי שירים"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "הצג אפסים מובילים (02:00 במקום 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "אל תטעין metadata עבור שירים עד שינוגנו"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "עומק חיפוש:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>מידע תיבה קופצת</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "הצג מידע תיבה מוקפצת"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "קטגוריה"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "מותאם"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "פורמט כותרת:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "מחרוזת מותאמת:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "הגדרות Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "ניהול תור"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr ""
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "שגיאה"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "פתח URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "הוסף URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "הזן URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "אין מידע זמין עבור %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "שם קובץ"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/hu.po b/po/hu.po
index ab4d68ccfbac..525d7f651ae4 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -5,17 +5,18 @@
 # Translators:
 # Ferenc Szabo <szaboferee at gmail.com>, 2013
 # fyghter04 <fyghter at mail.com>, 2014
+# fyghter04 <fyghter at mail.com>, 2014
 # Laszlo Dvornik <dvornik at gnome.hu>, 2006
 # Péter Polonkai <polesz at nedudu.hu>, 2010
-# Péter Polonkai <polesz at nedudu.hu>, 2010-2012
+# Péter Polonkai <polesz at nedudu.hu>, 2010-2012,2014-2015
 # Ferenc Szabo <szaboferee at gmail.com>, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-07-12 09:15+0000\n"
-"Last-Translator: fyghter04 <fyghter at mail.com>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-02-12 16:54+0000\n"
+"Last-Translator: Péter Polonkai <polesz at nedudu.hu>\n"
 "Language-Team: Hungarian (http://www.transifex.com/projects/p/audacious/"
 "language/hu/)\n"
 "Language: hu\n"
@@ -24,96 +25,81 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Keresés ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d fájl található"
-msgstr[1] "%d fájl található"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Új lejátszólista"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Hiba"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
-msgstr ""
+msgstr "Parancssori súgó mutatása"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Verzió mutatása"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Lejátszás indítása"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Lejátszás szüneteltetése"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Lejátszás esetén szüneteltetés, különben lejátszás"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Lejátszás megállítása"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Ugrás az előző számhoz"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Ugrás a következő számhoz"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Fájlok hozzáadása a lejátszó listához"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Fájlok hozzáadása egy ideiglenes lejátszólistához"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Főablak megjelenítése"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
-msgstr ""
+msgstr "Jelenítse meg az \"ugrás a dalra\" ablakot"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Indítás grafikus felület nélkül"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Kilépés a lejátszás megállásakor."
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Hibakereső üzenetek kiírása"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Hibakereső üzenetek megjelenítése (lehetséges hogy használnod kell)"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Futtatás Qt módban"
+
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Ismeretlen paraméter: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Ismeretlen paraméter: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -122,35 +108,56 @@ msgstr ""
 "Használat: audacious [PARAMÉTER] ... [FÁJL] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Dekóder nem található ehhez %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d fájl található"
+msgstr[1] "%d fájl található"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s-t nem lehet megnyitni."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Új lejátszólista"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "%s -t nem lehet betölteni: a fájlkiterjesztés nem támogatott."
+msgid "Audio CD, track %s"
+msgstr "Audio CD, sáv %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(karakterkódolási hiba)"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Hiba a bővítmény betöltésekor"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "%s nem menthető: a formátum nem támogatott."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Hiba a megnyitáskor %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Ismeretlen lejátszási hiba"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Érvénytelen audio formátum"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Most játszott"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -158,889 +165,1053 @@ msgstr ""
 "A lejátszási listát nem lehet rendezni, mert a metaadatok keresése még "
 "folyamatban van (vagy le van tiltva)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Névjegy"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "%s -t nem lehet betölteni: a fájlkiterjesztés nem támogatott."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Beállítások"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "%s -t nem lehet menteni: a fájlkiterjesztés nem támogatott."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr ""
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Keresési hiba"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr ""
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "A fájl formátuma nem ismert"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr ""
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Hiba a metaadat olvasásakor"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Monó"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Sztereó"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d csatorna"
+msgstr[1] "%d csatorna"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Megjelenés"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Sáv %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Hang"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Audio CD"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Hálózat"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(ismeretlen cím)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Lejátszólista"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Érvénytelen URI"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Dal információ"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Ismeretlen URI séma"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Bővítmények"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Érvénytelen fájlnév"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Általános"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Köszönet"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Effekt"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licenc"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Megjelenítés"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Audacious névjegye"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Bemenet"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Biztos, hogy véglegesen törli ezt: \"%s\"?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Átvitel"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Eltávolítás"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Előadó"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Mégsem"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Lejátszólista törlése"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Cím"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Ne kérdezze többször"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Szám sorszáma"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Átnevezés"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Műfaj"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Lejátszólista átnevezése"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Fájlnév"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Mi legyen a lejátszólista neve?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Fájlútvonal"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Engedélyezve"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Dátum"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Év"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Megjegyzés"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Kodek"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Minőség"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Nincs"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arab"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Balti"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Kínai"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Görög"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Héber"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Equalizer"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japán"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamp"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Koreai"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Fájlok megnyitása"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Lengyel"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Megnyitás"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Orosz"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Párbeszé_dablak bezárása megnyitás után"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Tajvani"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Fájlok hozzáadása"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Török"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Hozzáadás"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Lebegőpontos"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Párbeszé_dablak bezárása hozzáadás után"
+
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Bezár"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Felület beállításai</b>"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Cím"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr ""
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Előadó"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Kimeneti bővítmény:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Kimeneti beállítások</b>"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Műfaj"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bit mélység:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Év"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Pufferméret:"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Sáv"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Hossz"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Szoftveres vágás"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formátum:"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Szoftveres hangerő-szabályozás használata (nem ajánlott)"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Minőség:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Replay Gain</b>"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bitráta:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Lejátszási erősítés engedélyezése"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Album mód"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid rock"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Vágás megakadályozása (ajánlott)"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Szintek állítása</b>"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplify all files:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Címkézetlen fájlok kiegészítése:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Chamber Music"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Proxy gépnév:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Proxy port:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Proxy felhasználónév:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Proxy jelszó:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Proxy beállítása</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Proxyhasználat bekapcsolása"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Hitelesítés használata proxyval"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Automatikus karakterkódolás felismerés ennél:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Tartalék karakterkódolások:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Viselkedés</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Lejátszás folytatása induláskor"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Ajánlott amikor a jelenlegi zeneszám törlésre kerül"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Lejátszólista törlése fájlok megnyitásakor"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Fájlok megnyitása az ideiglenes lejátszólistában"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Ne töltse be a metaadatokat amíg játssza a dalt"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Kompatibilitás</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "\\ (visszaper jel) értelmezése mint mappa határoló"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Album borító</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-"Keresés a képek között a szavaknak megfelelően (vesszővel elválasztva):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"Képek kizárása a keresési szavaknak megfelelően (vesszővel elválasztva):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "A dal fájlnevével megegyező képek keresése"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Keresés rekurzívan"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Keresési mélység:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Felbukkanó információ</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Felbukkanó információs ablak mutatása"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Felbukkanó ablak késleltetése (tized másodperc):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Aktuális dal idősávjának mutatása"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "CÍM"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ELŐADÓ - CÍM"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ELŐADÓ - ALBUM - CÍM"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ELŐADÓ - ALBUM - SZÁM. CÍM"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ELŐADÓ [ ALBUM] - SZÁM. CÍM"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - CÍM"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategória"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Egyéni"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Szám megjelenítése</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "A dalok számának mutatása"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Vezető nullák mutatása (2:00 helyett 02:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Címformátum:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Egyéni karakterlánc:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Nem lehet létrehozni a könyvtárat (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Audio CD, sáv %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Monó"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Sztereó"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d csatorna"
-msgstr[1] "%d csatorna"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Köszönet"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licenc"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Audacious névjegye"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Biztos, hogy véglegesen törli ezt: \"%s\"?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Eltávolítás"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Lejátszólista törlése"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Ne kérdezze többször"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Átnevezés"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Lejátszólista átnevezése"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Mi legyen a lejátszólista neve?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Engedélyezve"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Equalizer"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamp"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Sáv"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Hossz"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Formátum:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Minőség:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Bitráta:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Chamber Music"
-
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klasszikus"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Diszkó"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gengszter Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Kemény Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "Új Hullám"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Szving"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Sikeres mentés"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Sikertelen mentés"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Dal információ"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Album előadó"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Megjegyzés"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Sorszám"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Mezők tö_rlése ha a következő dalra megy"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Mentés"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Következő"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/A"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Nincs ehhez információ: %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Ugrás"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Ugrás időpontra"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Idő megadása (perc:másodperc):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Felülírja %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Sorba állítás"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "_Kiszedés a sorból"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Ugrás a számra"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Szűrő: "
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Szűrő: "
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Bezárás _ugrás után"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_Felülírás"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Felülírás megerősítése"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Felülírja %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Lejátszólista exportálása"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Exportálás"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Lejátszólista importálása"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Importálás"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Várakozási sor menedzser"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Bővítmények ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Kiszedés a sorból"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "%s névjegy"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Fájlok megnyitása"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s beállítások"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Megnyitás"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Beállít"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr ""
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Beállítások"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Fájlok hozzáadása"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Névjegy"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Hozzáadás"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Megjelenés"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Hang"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Sorba állítás"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Hálózat"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "_Kiszedés a sorból"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Lejátszólista"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Ugrás a számra"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Bővítmények"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Szűrő: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Általános"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Szűrő: "
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Effekt"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Megjelenítés"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Bemenet"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Átvitel"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Szám sorszáma"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Fájlnév"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Fájl elérési útja"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Dátum"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Kodek"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Minőség"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Nincs"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arab"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Balti"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Kínai"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Görög"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Héber"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japán"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Koreai"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Lengyel"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Orosz"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Tajvani"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Török"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Lebegőpontos"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Felület beállításai</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Felület bővítmény:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Kimeneti bővítmény:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Kimeneti beállítások</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bit mélység:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Pufferméret:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Szoftveres vágás"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Szoftveres hangerő-szabályozás használata (nem ajánlott)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Replay Gain</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Lejátszási erősítés engedélyezése"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Album mód"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Vágás megakadályozása (ajánlott)"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Lejátszólista kezelő"
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Szintek állítása</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplify all files:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Címkézetlen fájlok kiegészítése:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Proxy gépnév:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Proxy port:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Proxy felhasználónév:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Proxy jelszó:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Hálózati beállítások</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Proxy beállítása</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Proxyhasználat bekapcsolása"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Hitelesítés használata proxyval"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Automatikus karakterkódolás felismerés ennél:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Tartalék karakterkódolások:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Viselkedés</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Elemek"
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Lejátszás folytatása indításkor"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Új"
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Szünet helyett azonnali folytatás"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Ajánlott amikor a jelenlegi zeneszám törlésre kerül"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Lejátszólista törlése fájlok megnyitásakor"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Fájlok megnyitása az ideiglenes lejátszólistában"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Kompatibilitás</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "\\ (visszaper jel) értelmezése mint mappa határoló"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Szám megjelenítése</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "A dalok számának mutatása"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Vezető nullák mutatása (2:00 helyett 02:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Haladó</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Ne töltse be a metaadatokat amíg játssza a dalt"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "A fájl ellenőrzése tartalom alapján ha nem ismert a fájl kiterjesztése"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Album borító</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
 msgstr ""
+"Keresés a képek között a szavaknak megfelelően (vesszővel elválasztva):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr ""
+"Képek kizárása a keresési szavaknak megfelelően (vesszővel elválasztva):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "A dal fájlnevével megegyező képek keresése"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Keresés rekurzívan"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Keresési mélység:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Felbukkanó információ</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Felbukkanó információs ablak mutatása"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Felbukkanó ablak késleltetése (tized másodperc):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Aktuális dal idősávjának mutatása"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "CÍM"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ELŐADÓ - CÍM"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ELŐADÓ - ALBUM - CÍM"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ELŐADÓ - ALBUM - SZÁM. CÍM"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ELŐADÓ [ ALBUM] - SZÁM. CÍM"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - CÍM"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategória"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Egyéni"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Címformátum:"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Lejátszás"
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Egyéni karakterlánc:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Audacious beállításai"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Várakozási sor menedzser"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Kiszedés a sorból"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Dolgozom ..."
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Párbeszédablak bezárása a lejátszólista aktíválása után"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Hiba"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "URL megnyitása"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "URL hozzáadása"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "URL megadása:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(További üzenetek el vannak rejtve.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Mappa megnyitása"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Mappa hozzáadása"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Megnyitás"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Hozzáadás"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metaadat"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Zeneszerző"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Előadó"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Rögzítés éve"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Rögzítés dátuma"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Műszaki"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIME típus"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bitráta"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Nincs ehhez információ: %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Szint"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Fájlnév"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Vonal"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Funkció"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Üzenet"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Napló ellenőr"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Naplózási szint:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Hibakeresés"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Információ"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Figyelmeztetés"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Bővítmények ..."
diff --git a/po/id_ID.po b/po/id_ID.po
index 42078e83c329..9a5346908a0c 100644
--- a/po/id_ID.po
+++ b/po/id_ID.po
@@ -7,13 +7,15 @@
 # Rahman Yusri Aftian <aftian at yahoo.com>, 2012
 # Andika Triwidada <andika at gmail.com>, 2012
 # Andika Triwidada <andika at gmail.com>, 2012
-# Ardjuna <Asyura.x at gmail.com>, 2013
+# Ardjuna <Asyura.x at gmail.com>, 2013-2015
 # Arif Syamsudin <buitenzorg812 at gmail.com>, 2012
 #  <bu0ncu3 at yahoo.com>, 2012,2014
 # Arif Syamsudin <buitenzorg812 at gmail.com>, 2012
+# Hasan Al Banna, 2012
 #  <invaleed at gmail.com>, 2012
 # ivanzulfikar <ivan.zulf.ikar at gmail.com>, 2014
 # ivanzulfikar <ivan.zulf.ikar at gmail.com>, 2014
+# Liffindra Angga Zaaldian <findrakecil at gmail.com>, 2015
 # Mohamad Hasan Al Banna, 2012
 # Hasan Al Banna, 2012
 # Rahman Aftian <>, 2012
@@ -23,13 +25,14 @@
 # Hasan Al Banna, 2012
 # Yoza Aprilio <yoza1404 at gmail.com>, 2012
 # Yoza Aprilio <yoza1404 at gmail.com>, 2012
+# Yoza Aprilio <yoza1404 at gmail.com>, 2012
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-06-29 06:02+0000\n"
-"Last-Translator: Rahman Yusri Aftian <aftian at yahoo.com>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-01-21 07:37+0000\n"
+"Last-Translator: Liffindra Angga Zaaldian <findrakecil at gmail.com>\n"
 "Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/"
 "audacious/language/id_ID/)\n"
 "Language: id_ID\n"
@@ -38,1022 +41,1192 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Mencari ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d berkas ditemukan"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Daftar Main Baru"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Galat"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
-msgstr "Tampilkan bantuan perintah-garis"
+msgstr "Tampilkan bantuan untuk baris-perintah"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Tampilkan versi"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
-msgstr "Mulai Pemutaran"
+msgstr "Mulai pemutaran lagu"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
-msgstr "Berhenti sebentar pemutara"
+msgstr "Jeda pemutaran lagu"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
-msgstr "Jeda lagu saat dimainkan, putar lagu jika sedang jeda"
+msgstr "Jeda pemutaran jika sedang memutar, putar jika tidak sedang memutar"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
-msgstr "Stop pemutaran"
+msgstr "Hentikan pemutaran lagu"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
-msgstr "Loncat ke lagu sebelumnya"
+msgstr "Lompat ke lagu sebelumnya"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
-msgstr "Loncat ke lagu berikutnya"
+msgstr "Lompat ke lagu berikutnya"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Tambah berkas ke dalam daftar lagu"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Tambah berkas ke daftar putar sementara"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Tampilkan jendela utama"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
-msgstr "Display cendela loncat-ke-lagu"
+msgstr "Tampilkan jendela \"Loncat ke Lagu\""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
-msgstr "Mulai tanpa tampilan grafis"
+msgstr "Mulai tanpa tampilan antarmuka secara grafis"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
-msgstr "Keluar setelah berhenti memutar"
+msgstr "Keluar ketika berhenti memutar lagu"
+
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Cetak pesan debug (dapat digunakan dua kali)"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Cetak pesan debug"
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Jalankan dalam mode Qt"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
-msgstr "Opsi tidak dikenal: %s\n"
+msgstr "Pilihan tidak dikenal: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
-msgstr "Opsi tidak dikenal: -%c\n"
+msgstr "Pilihan tidak dikenal: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
-"Menggunakan: audacious [OPSI] ... [BERKAS] ...\n"
+"Penggunaan: audacious [PILIHAN] ... [BERKAS] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Tidak ada dekoder untuk %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d berkas ditemukan"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s tidak dapat dibuka."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Daftar putar baru"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Tidak dapat meload %s: ekstensi berkas tidak didukung."
+msgid "Audio CD, track %s"
+msgstr "CD Audio, trek %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(galat pada penyandian karakter)"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Gagal memuat pengaya"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Tidak dapat menyimpan %s: ekstensi berkas tidak didukung."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Gagal membuka %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Galat yang tidak diketahui pada pemutaran lagu"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Format audio tidak sah"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Sedang Diputar"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr ""
-"Daftar lagu tidak dapat diurutkan karena pemindaian metadata dinonaktifkan "
-"atau sedang berjalan."
+"Daftar lagu tidak dapat diurutkan karena pemindaian metadata sedang berjalan "
+"(atau telah dimatikan)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Tentang"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Tidak dapat memuat %s: ekstensi nama berkas tidak didukung."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Pengaturan"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Tidak dapat menyimpan %s: ekstensi nama berkas tidak didukung."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Galat pada pencarian"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Batal"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Format berkas tidak dikenal"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Keluar"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Galat saat membaca metadata"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Settings"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "Tent_ang"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Plugins ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanal"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Penampilan"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Trek %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Suara"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "CD Audio"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Jaringan"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(judul tidak diketahui)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Daftar Lagu"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "URI tidak sah"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Info Lagu"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Skema URI tidak diketahui"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Pengaya"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Nama berkas tidak sah"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Umum"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Kredit"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efek"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Lisensi"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualisasi"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Tentang Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Masukan"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Apakah kamu mau menghapus dengan permanen “%s”?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transpor"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Hapus"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artis"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Batal"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Hapus Daftar Putar"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Judul"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Jangan tanya lagi"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Nomor Track"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "Gant_i Nama"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Aliran"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Ganti Nama Daftar Lagu"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nama Berkas"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Apakah anda suka dan memanggil daftar putar ini?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Lokasi Berkas"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Gunakan"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Tanggal"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Tahun"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Komentar"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Kodek"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kualitas"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Kosong"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arab"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltic"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Cina"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Yunani"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Ibrani"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ekualiser"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Jepang"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamp"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Korea"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Buka Berkas"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polandia"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "B_uka"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Rusia"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Tutup _dialog buka"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwan"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Tambah Berkas"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turki"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Tambah"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Titik mengambang"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Tutup _dialog buka"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Seting Penampilan</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Keluar"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Plugin Penampilan"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Judul"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Pengaya keluaran:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artis"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Setelan Keluaran</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Kedalaman bit:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Aliran"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Ukuran penyangga:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Tahun"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Trek"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Kliping lunak"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Panjang"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Gunakan pengatur volume (tidak direkomendasikan)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Format"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b><i>Putar Lagi</i></b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Kualitas"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Aktifkan <i>Replay Gain</i>"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bitrate:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Moda album"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Cegah pemangkasan (direkomendasikan)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Sesuaikan Level</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Kuatkan semua berkas:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Kuatkan berkas yang tak ditandai:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Nama host proksi:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Chamber Music"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Porta proxy:"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "Klasik"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Nama pengguna proxy:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Sandi proxy:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>KOnfigurasi Proxy</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Gunakan proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Gunakan otentikasi pada proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Deteksi enkoder karakter otomatis untuk:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Enkoder karakter standar:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Perilaku</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Lanjut putar saat memulai aplikasi"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Jika lagu terkini terhapus, lanjut putar lagu lain"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Bersihkan daftar lagu ketika membuka berkas"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Buka berkas pada daftar lagu sementara"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Jangan muat metadata hingga lagu diputar"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Kecocokan</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Tafsirkan \\ (garis miring terbalik) sebagai pembatas folder"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Gambar Sampul</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-"Cari gambar yang sesuai dengan kata tersebut (pisahkan dengan tanda koma):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"Mengecualikan gambar yang sesuai dengan kata tersebut (pisahkan dengan tanda "
-"koma):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Cari gambar yang sesuai dengan nama berkas"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Cari secara rekursif"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Kedalaman pencarian:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Informasi Jendela Popup</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Munculkan halaman informasi popup"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Tunda popup (persepuluh detik):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Tampilkan skala waktu untuk lagu saat ini"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "JUDUL"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTIS - JUDUL"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTIS - ALBUM - JUDUL"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTIS - ALBUM - TREK. JUDUL"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARIS [ALBUM] - TREK. JUDUL"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - JUDUL"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategori"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Pilihan"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Tampilan Lagu</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Tampilkan no. urut daftar lagu"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Tampilkan nol di depan (02:00 bukan 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Format judul:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Rangkaian kata gubahan:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Seting Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Tidak dapat membuat folder (%s): %s⏎\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "CD Audio, trek %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanal"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Kredit"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Lisensi"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Tentang Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Apakah kamu mau menghapus dengan permanen “%s”?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Hapus"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Hapus Daftar Putar"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Jangan tanya lagi"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "Gant_i Nama"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Ganti Nama Daftar Lagu"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Apakah anda suka dan memanggil daftar putar ini?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Gunakan"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ekualiser"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamp"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Trek"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Panjang"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Format"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Kualitas"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Bitrate:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Chamber Music"
-
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "Klasik"
-
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disko"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Mudah Didengarkan"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Bising"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock & Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm & Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Penyimpanan berhasil"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Penyimpanan galat"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Info Lagu"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Album Artis"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Komentar"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Nomor Trek"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "K_osongkan kolom saat mengganti lagu"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Simpan"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "Sela_njutnya"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d Kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/A"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Tidak ada info yang tersedia untuk %s.⏎\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Lompat"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Loncat ke Waktu"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Masukkan waktu (menit:detik):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Menimpa %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "Masuk _Antrian"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Keluar Antria_n"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Loncat ke Lagu"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filter:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filter:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Ke_luar loncat"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_Timpa"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Konformasi Penimpaan"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Menimpa %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Ekspor Daftar Main"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Ekspor"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Impor Daftar Main"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Impor"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Manajer Antrian"
-
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Unqueue"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Plugins ..."
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Buka Berkas"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Tentang %s"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "B_uka"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Pengaturan"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Tutup _dialog buka"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Set"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Tambah Berkas"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Settings"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Tambah"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "Tent_ang"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Tutup _dialog buka"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Penampilan"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "Masuk _Antrian"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Suara"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Keluar Antria_n"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Jaringan"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Loncat ke Lagu"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Daftar Lagu"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filter:"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Pengaya"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filter:"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Umum"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Ke_luar loncat"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efek"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Manajer Daftar Main"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualisasi"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
 msgstr "Masukan"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Baru"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transpor"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Nomor trek"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Nama berkas"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Lokasi berkas"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Tanggal"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Kodek"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kualitas"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Kosong"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arab"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltic"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Cina"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Yunani"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Ibrani"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Jepang"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Korea"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polandia"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Ganti N_ama"
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Rusia"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Putar"
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwan"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Tutup jendela s_etelah mengaktifkan daftar main"
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turki"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Titik mengambang"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Seting Penampilan</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Plugin Penampilan"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Pengaya keluaran:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Setelan Keluaran</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Kedalaman bit:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Ukuran penyangga:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Kliping lunak"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Gunakan pengatur volume (tidak direkomendasikan)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b><i>Putar Lagi</i></b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Aktifkan <i>Replay Gain</i>"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Moda album"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Cegah pemangkasan (direkomendasikan)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Sesuaikan Level</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Kuatkan semua berkas:"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Kuatkan berkas yang tak ditandai:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Nama host proksi:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Porta proxy:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Nama pengguna proxy:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Sandi proxy:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Pengaturan Jaringan</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>KOnfigurasi Proxy</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Gunakan proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Gunakan otentikasi pada proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Deteksi enkoder karakter otomatis untuk:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Enkoder karakter standar:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Perilaku</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Lanjut putar saat aplikasi dimulai"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Jeda pemutaran daripada langsung lanjutkan segera"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Jika lagu terkini terhapus, lanjut putar lagu lain"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Bersihkan daftar lagu ketika membuka berkas"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Buka berkas pada daftar lagu sementara"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Kecocokan</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Tafsirkan \\ (garis miring terbalik) sebagai pembatas folder"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Tampilan Lagu</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Tampilkan no. urut daftar lagu"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Tampilkan nol di depan (02:00 bukan 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Lanjutan</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Jangan muat metadata hingga lagu diputar"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Jajaki juga isi berkas yang tidak dikenal ekstensinya"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Gambar Sampul</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr ""
+"Cari gambar yang sesuai dengan kata tersebut (pisahkan dengan tanda koma):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr ""
+"Mengecualikan gambar yang sesuai dengan kata tersebut (pisahkan dengan tanda "
+"koma):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Cari gambar yang sesuai dengan nama berkas"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Cari secara rekursif"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Kedalaman pencarian:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Informasi Jendela Popup</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Munculkan halaman informasi popup"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Tunda popup (persepuluh detik):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Tampilkan skala waktu untuk lagu saat ini"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "JUDUL"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTIS - JUDUL"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTIS - ALBUM - JUDUL"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTIS - ALBUM - TREK. JUDUL"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARIS [ALBUM] - TREK. JUDUL"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - JUDUL"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategori"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Pilihan"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Format judul:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Rangkaian kata gubahan:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Seting Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Manajer Antrian"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Hapus dari antrian"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Sedang bekerja ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Galat"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Buka URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Tambah URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Masukkan URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "⏎ (Pesan lebih lanjut telah disembunyikan.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Buka Folder"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Tambah Folder"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Buka"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Tambah"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadata"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Komposer"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Penyanyi"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Tahun Rekaman"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Tanggal Rekaman"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Teknis"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Tipe MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Tidak ada info yang tersedia untuk %s.⏎\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Tingkat"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nama Berkas"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Baris"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Fungsi"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Pesan"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Pemantau Log"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Tingkat Log:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Debug"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Keterangan"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Peringatan"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Pengaya ..."
diff --git a/po/it.po b/po/it.po
index 8b8ad33aae49..2edd4bf85a96 100644
--- a/po/it.po
+++ b/po/it.po
@@ -14,13 +14,14 @@
 # Jacopo Lorenzetti <jacopol at cyan.xubiq.com>, 2011, 2012
 # Jacopo Lorenzetti <jacopol at cyan.xubiq.com>, 2011-2012
 # Nicola Manini <nicola.manini at fisica.unimi.it>, 2014
-# Nicola Manini <nicola.manini at fisica.unimi.it>, 2014
+# Nicola Manini <nicola.manini at fisica.unimi.it>, 2014-2015
+# Saverio <saverio.brancaccio at gmail.com>, 2014
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-08 15:45+0000\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-02-12 20:04+0000\n"
 "Last-Translator: Nicola Manini <nicola.manini at fisica.unimi.it>\n"
 "Language-Team: Italian (http://www.transifex.com/projects/p/audacious/"
 "language/it/)\n"
@@ -30,98 +31,83 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Ricerca in corso…"
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Trovato %d file"
-msgstr[1] "Trovati %d file"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nuova playlist"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Errore"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Mostra l'help in linea"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Mostra versione"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Inizia la riproduzione"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Pausa la riproduzione"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Interrompi se in riproduzione, altrimenti riproduci"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Termina la riproduzione"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Salta al brano precedente"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Salta al brano successivo"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Aggiunge file alla playlist"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Aggiungi files a playlist temporanea"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Visualizza la finestra principale"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Mostra la finestra di salto-a-brano"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Parti senza interfaccia grafica"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Esci quando  la riproduzione è stoppata"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Visualizza messaggi di debug"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Stampa i messaggi di debug (può essere usato due volte)"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Avvia in modalità Qt"
+
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 "Opzione sconosciuta: %s\n"
 "\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Opzione sconosciuta: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -130,35 +116,56 @@ msgstr ""
 "Uso: audacious  [OPZIONE] ... [FILE] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Nessun decoder trovato per %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Trovato %d file"
+msgstr[1] "Trovati %d file"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s non può essere aperto."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nuova playlist"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Non riesco a caricare %s: estensione non supportata."
+msgid "Audio CD, track %s"
+msgstr "CD Audio, traccia %s"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(errore codifica carattere)"
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Errore nel caricamento del plugin"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Non riesco a salvare %s: estensione non supportata."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Errore durante l'apertura di %s:\n"
+"%s"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Errore sconosciuto durante la riproduzione"
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Formato audio non valido"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "In riproduzione"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -166,888 +173,1052 @@ msgstr ""
 "La playlist non può essere riordinata poiché la scansione dei metadati è "
 "ancora in corso (o è stata disabilitata)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Informazioni"
-
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Impostazioni"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Impossibile caricare %s: estensione non supportata"
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Setta"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Impossibile salvare %s: estensione non supportata"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Annulla"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Errore di ricerca"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Chiudi"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Formato del file non riconosciuto"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Impostazioni"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Errore durante la lettura dei meta dati"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "Informazioni"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Plugins ..."
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Aspetto"
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d canale"
+msgstr[1] "%d canali"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Audio"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Traccia %d"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Rete"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "CD Audio"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Playlist"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(titolo sconosciuto)"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Info Brano"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "URI non valido"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Plugin"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Schema dell'URI sconosciuto"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Generici"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Nome del file non valido"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Effetto"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Crediti"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualizzazione"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licenza"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Ingresso"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Informazioni su Audacious"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Trasporto"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Vuoi cancellare permanentemente \"%s\"?"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artista"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Cancella"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Annulla"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Titolo"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Cancella la playlist"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Numero traccia"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Non chiedere più"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Genere"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Rinomina"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nome del file"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Rinomina playlist"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Percorso del file"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Che nome dai a quest playlist?"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Data"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Abilita"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Anno"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Commento"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Qualità"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Nessuna"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Araba"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltica"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Cinese"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Greca"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Ebraica"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Giapponese"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Equalizzatore"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Coreana"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamplificazione"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polacca"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Apri file"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Russa"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Apri"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanese"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Chiudi il _dialogo all'apertura"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turca"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Aggiungi file"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Virgola mobile"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "Aggiungi"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Impostazioni dell'interfaccia</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Chiudi il _dialogo dopo l'aggiunta"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Plugins dell'interfaccia"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Chiudi"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Plugin di uscita:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Titolo"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Impostazioni di uscita</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artista"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Profondità di bit:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Dimensione del buffer:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Genere"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Anno"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Clipping leggero"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Traccia"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Utilizza controllo volume software (non raccomandato)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Lunghezza"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "Replay Gain"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formato:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Abilita Replay Gain"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Qualità:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Modalità album"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bitrate:"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Evita il clipping (raccomandato)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Regola i livelli</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplifica tutti i file:"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplifica i file senza tag:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Host del proxy:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Porta del proxy:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Utente proxy:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Password proxy:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Configurazione proxy</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Abilita utilizzo del proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Usa autenticazione con il proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Individuazione automatica della codifica dei caratteri per:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Codifiche di riserva dei caratteri:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Comportamento</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Continua la riproduzione all'avvio"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Avanza quando il brano corrente viene eliminato"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Cancella la playlist quando si aprono i file"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Apri i file in una playlist temporanea"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Non caricare i metadati dei brani finché non vengono riprodotti"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibilità</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpreta\\ (backslash) come un delimitatore di cartella"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "Cover Album"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Ricerca elementi contenenti le parole :"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"Escludi elementi corrispondenti alle seguenti parole (separati da virgola):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Ricerca elementi corrispondenti al nome del brano"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Cerca ricorsivamente"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Ricerca avanzata:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Informazioni popup</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Mostra Finestra informazioni"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Ritardo popup (decimi di secondo):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Mostra scala di tempo per il brano corrente"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TITOLO"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTISTA - TITOLO"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTISTA - ALBUM - TITOLO"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTISTA - ALBUM - TRACCIA. TITOLO"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTISTA [ALBUM] - TRACCIA. TITOLO"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - TITOLO"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Categoria"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Personalizzato"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Visualizzazione del brano</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Mostra numeri dei brani"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Mostra zeri iniziali (02:00 invece di 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Formato titolo:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Stringa personalizzata:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Impostazioni di audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Impossibile creare la directory (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "CD Audio, traccia %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d canale"
-msgstr[1] "%d canali"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Crediti"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licenza"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Informazioni su Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Vuoi cancellare permanentemente \"%s\"?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Cancella"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Cancella la playlist"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Non chiedere più"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Rinomina"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Rinomina playlist"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Che nome dai a quest playlist?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Abilita"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Equalizzatore"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamplificazione"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Traccia"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Lunghezza"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Formato:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Qualità:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Bitrate:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Musica da camera"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Classica"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Salvataggio completato"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Errore di salvataggio"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Info Brano"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Album Artista"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Commento"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Numero di brano"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Ripulire i campi nel passare alla traccia successiva"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Salva"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Successivo"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/D"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Nessuna informazione disponibile per %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "Salta"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Salta alla posizione"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Inserisci tempo (minuti:secondi):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Sovrascrivere %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Coda"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Rimuovi dalla _coda"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Vai al brano"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtro: "
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtra:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Chiudi saltando"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "Sovrascrivi"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Confermi di voler sovrascrivere"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Sovrascrivere %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Esporta playlist"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "Esporta"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importa playlist"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "Importa"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Gestione coda"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Plugins ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "Togli dalla coda"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Informazioni su %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Apri file"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "Impostazioni di %s"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Apri"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Setta"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Chiudi il _dialogo all'apertura"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Impostazioni"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Aggiungi file"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "Informazioni"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "Aggiungi"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Aspetto"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Chiudi il _dialogo dopo l'aggiunta"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audio"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Coda"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Rete"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Rimuovi dalla _coda"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Playlist"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Vai al brano"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Plugin"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtro: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Generici"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtra:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Effetto"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Chiudi saltando"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualizzazione"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Gestione playlist"
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Ingresso"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Elementi"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Trasporto"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Nuovo"
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Numero di traccia"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "_Rinomina"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Nome del file"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Percorso del file"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Data"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codec"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Qualità"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Nessuna"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Araba"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltica"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Cinese"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Greca"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Ebraica"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Giapponese"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Coreana"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polacca"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Russa"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanese"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turca"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Virgola mobile"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Impostazioni dell'interfaccia</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Plugins dell'interfaccia"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Plugin di uscita:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Impostazioni di uscita</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Profondità di bit:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Dimensione del buffer:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Clipping leggero"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Utilizza controllo volume software (non raccomandato)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "Replay Gain"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Abilita Replay Gain"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Modalità album"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Evita il clipping (raccomandato)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Regola i livelli</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplifica tutti i file:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplifica i file senza tag:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Host del proxy:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Porta del proxy:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Utente proxy:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Password proxy:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Impostazioni di rete</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Configurazione proxy</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Abilita utilizzo del proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Usa autenticazione con il proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Individuazione automatica della codifica dei caratteri per:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Codifiche di riserva dei caratteri:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Comportamento</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Riprendi la riproduzione all'avvio"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Metti in pausa invece di riprendere la riproduzione immediatamente"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Avanza quando il brano corrente viene eliminato"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Cancella la playlist quando si aprono i file"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Apri i file in una playlist temporanea"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibilità</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpreta\\ (backslash) come un delimitatore di cartella"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Visualizzazione del brano</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Mostra numeri dei brani"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Mostra zeri iniziali (02:00 invece di 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Avanzate</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Non caricare i metadati dei brani finché non vengono riprodotti"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Sonda il contenuto dei file con estensione non riconsciuta"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "Cover Album"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Ricerca elementi contenenti le parole :"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr ""
+"Escludi elementi corrispondenti alle seguenti parole (separati da virgola):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Ricerca elementi corrispondenti al nome del brano"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Cerca ricorsivamente"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "Riproduci"
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Ricerca avanzata:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Informazioni popup</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Mostra Finestra informazioni"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Ritardo popup (decimi di secondo):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Mostra scala di tempo per il brano corrente"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TITOLO"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTISTA - TITOLO"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTISTA - ALBUM - TITOLO"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTISTA - ALBUM - TRACCIA. TITOLO"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTISTA [ALBUM] - TRACCIA. TITOLO"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - TITOLO"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Categoria"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Chiudi finestra quando attivi la playlist"
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Personalizzato"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Formato titolo:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Stringa personalizzata:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Impostazioni di audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Gestione coda"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "Togli dalla coda"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Elaborazione ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Errore"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Apri URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Aggiungi URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Inserisci URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Ulteriori messaggi sono stati nascosti.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Apri cartella"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Aggiungi cartella"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Apri"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Aggiungi"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Meta dati"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Compositore"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Esecutore"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Anno di registrazione"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Data di registrazione"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Tecnico"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Tipo MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Nessuna informazione disponibile per %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Livello"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nome del file"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Linea"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Funzione"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Messaggio"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Ispettore di log"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Livello di log"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Debug"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Informazioni"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Attenzione"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "I plugin ..."
diff --git a/po/ja.po b/po/ja.po
index 5abc70681f1b..0a133d2f6113 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -3,20 +3,23 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
+# ABE Tsunehiko, 2013
 # natird zoto <dritan86 at gmail.com>, 2012
-# ABE Tsunehiko <hallconnen2+transifex at gmail.com>, 2013
+# ABE Tsunehiko, 2013
 # Nastuko Toda <m2330880989 at shibuya-center.com>, 2012
 # Mika Kobayashi, 2014
+# Mika Kobayashi, 2014-2015
 # Nastuko Toda <m2330880989 at shibuya-center.com>, 2012
 # natird zoto <dritan86 at gmail.com>, 2012
+# natird zoto <dritan86 at gmail.com>, 2012
 # Shuuji Takahashi <shuuji3 at gmail.com>, 2012-2014
-# ABE Tsunehiko <hallconnen2+transifex at gmail.com>, 2013
+# ABE Tsunehiko, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-27 01:26+0000\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-02-20 17:09+0000\n"
 "Last-Translator: Mika Kobayashi\n"
 "Language-Team: Japanese (http://www.transifex.com/projects/p/audacious/"
 "language/ja/)\n"
@@ -26,95 +29,81 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "検索中..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d 個のファイルが見つかりました"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "新規プレイリスト"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "エラー"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "コマンドラインのヘルプを表示"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "バージョンを表示する"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "再生"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "一時停止"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
-msgstr "演奏していたら一時停止し, それ以外は演奏する"
+msgstr "再生していたら一時停止し、再生していなければ再生する"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "停止"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "前の曲にスキップ"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "次の曲にスキップ"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "プレイリストにファイルを追加"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "一時プレイリストにファイルを追加"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "メインウィンドウを表示する"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "ジャンプトゥソングウィンドウを表示する"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "グラフィカルインターフェースなしで開始"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "再生完了時に終了する"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "デバッグメッセージを表示する"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "デバッグ用メッセージを表示 (-VV のように2個続ける用法あり)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Qt モードで実行"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "不明なオプションです: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "不明なオプションです: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -123,35 +112,55 @@ msgstr ""
 "使い方: audacious [オプション] ... [ファイル] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "%s のためのデコーダがありません。"
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d 個のファイルが見つかりました"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s を開けませんでした。"
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "新規プレイリスト"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "%s をロードできません。ファイルの拡張子が対応していません。"
+msgid "Audio CD, track %s"
+msgstr "オーディオ CD、トラック %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(文字のエンコーディングエラー)"
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "プラグインのロードエラー"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "%s を保存できません。未対応の拡張子です。"
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"%s を開く際にエラー:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "不明な再生エラー"
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "無効なオーディオ形式"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "再生中"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -159,887 +168,1051 @@ msgstr ""
 "メタデータのスキャンが進行中、または無効になっているため、プレイリストをソー"
 "トできません。"
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "情報"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "%s を読込めません: 対応していないファイル拡張子です。"
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "設定"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "%s を保存することができません: 対応していないファイル拡張子です。"
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "設定 (_S)"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "シークエラー"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "キャンセル (_C)"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "ファイル形式を認識することができません"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "閉じる(_C)"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "メタデータを読込む際にエラー"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "設定 (_S)"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "モノラル"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "Audacious について (_A)"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "ステレオ"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "プラグイン (_P)"
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d チャンネル"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "外見"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "トラック %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "オーディオ"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "音楽CD"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "ネットワーク"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(不明なタイトル)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "プレイリスト"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "無効なURI"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "曲の情報"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "不明なURIスキーマ"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "プラグイン"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "無効なファイル名"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "一般"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "クレジット"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "エフェクト"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "ライセンス"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "視覚化"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Audacious について"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "インプット"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "\"%s\" を完全に削除しますか?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "トランスポート"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "削除(_R)"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "アーティスト"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "キャンセル (_C)"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "アルバム名"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "プレイリストを削除"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "タイトル"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "再び表示しない (_D)"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "トラック番号"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "名前を変更(_R)"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "ジャンル"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "プレイリストをリネーム"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "ファイル名"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "プレイリストの名前を入力して下さい。"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "パス名"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "有効(_E)"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "日付"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "制作年"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "コメント"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "コーデック"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "音質"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "なし"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "アラビア語"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "バルト諸語"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "簡体中国語"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "ギリシア語"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "ヘブライ語"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "イコライザ"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "日本語"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "プリアンプ"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "朝鮮語"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "ファイルを開く"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "ポーランド語"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "開く (_O)"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "ロシア語"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "開いたらダイアログを閉じる (_D)"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "繁体中国語"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "ファイルの追加"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "トルコ語"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "追加 (_A)"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "浮動小数点"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "追加したらダイアログを閉じる (_D)"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>インターフェイスの設定</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "閉じる(_C)"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "インターフェイスプラグイン: "
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "タイトル"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "出力プラグイン:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "アーティスト"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>出力の設定</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "アルバム名"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "ビット深度:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "ジャンル"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "バッファサイズ:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "制作年"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "トラック"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "ソフトクリッピング"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "長さ"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "ソフトウェアの音量コントロールを使う (非推奨)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "形式:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>リプレイゲイン</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "音質:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "リプレイゲインを有効にする"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "ビットレート:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "アルバムモード"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "アシッドジャズ"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "クリッピングを防ぐ (非推奨)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "アシッド・ロック"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>音量の調整</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "アンビエント"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "すべてのファイルを増幅する:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "ビバップ"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "ブルーグラス"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "タグづけされていないファイルを増幅する"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "ブルース"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "プロキシのホスト名:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "チャンバーミュージック"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "プロキシのポート:"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "クラシカル"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "プロキシのユーザ名:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "プロキシのパスワード:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>プロキシ設定</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "プロキシの使用を有効にする"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "プロキシの認証を行う"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "自動キャラクタエンコーディング検出:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "代替キャラクタエンコーディング:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>動作</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "起動時に前回再生していた曲を再生する"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "現在の曲が削除された時に次の曲を再生する"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "ファイルを開く時にプレイリストをクリアする"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "ファイルを一時プレイリストで開く"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "再生が終わるまで曲のメタデータを読み込まない"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>互換性</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr ""
-"\\ (バックスラッシュ) をフォルダーのデリミタ(区切り文字)として解釈する"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>アルバムアート</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "次の単語にマッチする画像を検索する (コンマで区切る):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "次の単語にマッチする画像を除外する (コンマで区切る):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "曲のファイル名にマッチする画像を検索する"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "再帰的に検索する"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "検索の深さ:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>ポップアップ情報</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "ポップアップ情報を表示する"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "ポップアップの遅れ (10秒単位):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "現在の曲のタイムスケールを表示する"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "タイトル"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "アーティスト - タイトル"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "アーティスト - アルバム - タイトル"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "アーティスト - アルバム - トラック. タイトル"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "アーティスト [ アルバム ] - トラック. タイトル"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "アルバム - タイトル"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "カテゴリ"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "カスタム"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>曲の表示</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "曲番号の表示"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "先頭のゼロを表示する (2:00 -> 02:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "タイトルの書式:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "カスタム文字列:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Audacious の設定"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "ディレクトリ (%s) を作成できませんでした: %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "オーディオ CD、トラック %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "モノラル"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "ステレオ"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d チャンネル"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "クレジット"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "ライセンス"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Audacious について"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "\"%s\" を完全に削除しますか?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "削除(_R)"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "プレイリストを削除"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "再び表示しない (_D)"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "名前を変更(_R)"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "プレイリストをリネーム"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "プレイリストの名前を入力して下さい。"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "有効(_E)"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "イコライザ"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "プリアンプ"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "トラック"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "長さ"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "形式:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "音質:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "ビットレート:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "アシッドジャズ"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "アシッド・ロック"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "アンビエント"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "ビバップ"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "ブルーグラス"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "ブルース"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "チャンバーミュージック"
-
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "クラシカル"
-
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "カントリー"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "デスメタル"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "ディスコ"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "イージーリスニング"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "フォーク"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "ファンキー"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "ギャングスタラップ"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "ゴスペル"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "グランジ"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "ハードロック"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "ヘヴィメタル"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "ヒップホップ"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "ハウス"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "ジャズ"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "ジャングル"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "メタル"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "ニューエイジ"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "ニューウェーブ"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "ノイズ"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "ポップ"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "パンクロック"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "ラップ"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "レゲェ"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "ロック"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "ロックンロール"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "R&B"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "スカ"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "ソウル"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "スウィング"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "テクノ"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "トリップ・ホップ"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "保存が完了しました"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "保存に失敗しました"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "曲の情報"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "アルバムアーティスト"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "コメント"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "トラック番号"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "次の曲に移る際にフィールドをクリアする (_R)"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "保存 (_S)"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "次の曲へ(_N)"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/A"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "%s の情報が取得できません。\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "ジャンプ (_J)"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "指定した時間へジャンプ"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "時間を入力してください (分:秒):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "%s を上書きしてもよろしいですか?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "キューに追加(_Q)"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "キューから外す(_U)"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "指定した曲にジャンプ"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "フィルタ:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "フィルタ(_F):"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "ジャンプしたらダイアログを閉じる (_L)"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "上書き保存(_O)"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "上書きする"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "%s を上書きしてもよろしいですか?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "プレイリストを出力"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "エクスポート(_E)"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "プレイリストを読み込み"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "インポート(_I)"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "キューマネージャ"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "プラグイン (_P)"
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "キューからはずす (_U)"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "%s について"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "ファイルを開く"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s の設定"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "開く (_O)"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "設定 (_S)"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "開いたらダイアログを閉じる (_D)"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "設定 (_S)"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "ファイルの追加"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "情報 (_A)"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "追加 (_A)"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "外見"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "追加したらダイアログを閉じる (_D)"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "オーディオ"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "キューに追加(_Q)"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "ネットワーク"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "キューから外す(_U)"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "プレイリスト"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "指定した曲にジャンプ"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "プラグイン"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "フィルタ:"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "一般"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "フィルタ(_F):"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "エフェクト"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "ジャンプしたらダイアログを閉じる (_L)"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "視覚化"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "インプット"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "トランスポート"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "トラック番号"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "ファイル名"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "ファイルパス"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "日付"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "コーデック"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "プレイリストマネージャ"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "音質"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "なし"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "アラビア語"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "エントリ"
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "バルト諸語"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "新しいプレイリスト(_N)"
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "簡体中国語"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "名前の変更(_A)"
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "ギリシア語"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "再生 (_P)"
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "ヘブライ語"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "プレイリストをアクティブにしたらファイアログを閉じる(_C)"
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "日本語"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "韓国語"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "ポーランド語"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "ロシア語"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "繁体中国語"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "トルコ語"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "浮動小数点"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>インターフェイスの設定</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "インターフェイスプラグイン: "
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "出力プラグイン:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>出力の設定</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "ビット深度:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "バッファサイズ:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "ソフトクリッピング"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "ソフトウェアの音量コントロールを使う (非推奨)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>リプレイゲイン</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "リプレイゲインを有効にする"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "アルバムモード"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "クリッピングを防ぐ (非推奨)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>音量の調整</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "すべてのファイルを増幅する:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "タグづけされていないファイルを増幅する"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "プロキシのホスト名:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "プロキシのポート:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "プロキシのユーザ名:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "プロキシのパスワード:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>ネットワークの設定</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>プロキシの設定</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "プロキシの使用を有効にする"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "プロキシの認証を行う"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "文字コードの自動検出対象言語:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "検出失敗時に試行する文字コード:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>動作</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "起動時に再生を再開する"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "再生せずに一時停止状態で起動"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "現在の曲が削除された時に次の曲を再生する"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "ファイルを開く時にプレイリストをクリアする"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "ファイルを一時プレイリストで開く"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>互換性</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr ""
+"\\ (バックスラッシュ) をフォルダーのデリミタ(区切り文字)として解釈する"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>曲の表示</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "曲番号の表示"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "先頭のゼロを表示する (2:00 -> 02:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>高度な設定</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "再生が終わるまで曲のメタデータを読み込まない"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "ファイル拡張子が未知のときにはファイル内容を精査"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>アルバムアート</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "次の単語にマッチする画像を検索する (コンマで区切る):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "次の単語にマッチする画像を除外する (コンマで区切る):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "曲のファイル名にマッチする画像を検索する"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "再帰的に検索する"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "検索の深さ:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>ポップアップ情報</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "ポップアップ情報を表示する"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "ポップアップの遅れ (10秒単位):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "現在の曲のタイムスケールを表示する"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "タイトル"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "アーティスト - タイトル"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "アーティスト - アルバム - タイトル"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "アーティスト - アルバム - トラック. タイトル"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "アーティスト [ アルバム ] - トラック. タイトル"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "アルバム - タイトル"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "カテゴリ"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "カスタム"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "タイトルの書式:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "カスタム文字列:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Audacious の設定"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "キューマネージャ"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "キューからはずす (_U)"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "処理中 ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "エラー"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "URL を開く"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "URL を追加"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "URL を入力:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(追加のメッセージが隠れているかもしれません。)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "フォルダを開く"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "フォルダを追加"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "開く"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "追加"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "メタデータ"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "作曲者"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "演者"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "制作年"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "制作日"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "技術情報"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIMEタイプ"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "ビットレート"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "%s の情報を取得することができません。\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "レベル:"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "ファイル名"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "ライン"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "機能"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "メッセージ"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "ログ検査"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "ログレベル:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "デバッグ"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "情報"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "警告"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "プラグイン ..."
diff --git a/po/ko.po b/po/ko.po
index 8929e191fe0f..ab57ba048ef4 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -11,6 +11,7 @@
 #       Man-Yong Lee <yong at linuxkorea.co.kr>, 2000
 # natird zoto <dritan86 at gmail.com>, 2012
 # natird zoto <dritan86 at gmail.com>, 2012
+# natird zoto <dritan86 at gmail.com>, 2012
 #       Sang-Jin Hwang <accel at accellinux.org>, 1999
 # Seong-ho Cho <darkcircle.0426 at gmail.com>, 2012
 # Seong-ho Cho <darkcircle.0426 at gmail.com>, 2012-2014
@@ -18,9 +19,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-05-11 15:17+0000\n"
-"Last-Translator: Seong-ho Cho <darkcircle.0426 at gmail.com>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Korean (http://www.transifex.com/projects/p/audacious/"
 "language/ko/)\n"
 "Language: ko\n"
@@ -29,95 +30,81 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "검색 중 ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "파일 %d개를 찾았습니다"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "새 재생 목록"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "오류"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "명령행 도움말 표시"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "버전 보기"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "재생 시작"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "재생 일시 정지"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "재생 중이면 일시 정지, 그 외에는 재생"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "재생 정지"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "이전 곡으로 건너뛰기"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "다음 곡으로 건너뛰기"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "재생 목록에 파일 추가"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "임시 재생 목록에 파일 추가"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "기본 창 표시"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "곡으로 건너뛰기 창 표시"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "그래픽 인터페이스를 제외하고 시작"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "재생을 끝나면 종료"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "디버깅 메시지 출력"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "알 수 없는 옵션: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "알 수 없는 옵션: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -126,35 +113,53 @@ msgstr ""
 "사용법: audacious <옵션> ... <파일> ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "오데이셔스 "
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "%s의 디코더가 없습니다."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "파일 %d개를 찾았습니다"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s을(를) 열 수 없습니다."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "새 재생 목록"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "불러올 수 없는 %s 입니다: 파일 확장자를 지원하지 않습니다."
+msgid "Audio CD, track %s"
+msgstr "음악 CD, %s 트랙"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr ""
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "저장할 수 없는 %s 입니다: 파일 확장자를 지원하지 않습니다."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr ""
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "재생 중"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -162,886 +167,1050 @@ msgstr ""
 "메타데이터 검색중(또는 비활성화 됨)이기 때문에 재생 목록을 정렬할 수 없습니"
 "다."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "정보"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "설정"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "설정(_S)"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "취소(_C)"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "닫기(_C)"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "설정(_S)"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "모노"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "정보(_A)"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "스테레오"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "플러그인(_P)..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "채널 %d개"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "모양새"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "오디오"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "네트워크"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "재생 목록"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "곡 정보"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "플러그인"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "일반"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "애써주신 분"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "효과"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "라이선스"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "시각 효과"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "오데이셔스 정보"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "입력"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "“%s”을(를) 완전히 제거하시겠습니까?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "전송"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "제거(_R)"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "음악가"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "취소(_C)"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "음반"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "재생 목록 제거"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "제목"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "다시 묻지 않음(_D)"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "트랙 번호"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "이름 바꾸기(_R)"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "장르"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "재생 목록 이름 바꾸기"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "파일 이름"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "이 재생 목록을 호출하기 위해 무얼 하시겠습니까?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "파일 경로"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "활성화(_E)"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "날짜"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "연도"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "주석"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "코덱"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "음질"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "없음"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "아라비아어"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "발트 해 언어"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "중국어"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "그리스어"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "히브리어"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "이퀄라이저"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "일본어"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "프리앰프"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "한국어"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "파일 열기"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "폴란드어"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "열기(_O)"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "러시아어"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "열 때 대화상자 닫기(_D)"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "타이완어"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "파일 추가"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "터키어"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "추가(_A)"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "부동 소숫점"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "추가할 때 대화상자 닫기(_D)"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>인터페이스 설정</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "닫기(_C)"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "인터페이스 플러그인:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "제목"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "출력 플러그인:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "음악가"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>출력 설정</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "음반"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "비트 깊이:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "장르"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "버퍼 크기:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "연도"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "트랙"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "부드러운 클리핑"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "길이"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "프로그램 음량 조절기 사용(추천하지 않음)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "형식:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>리플레이 게인</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "품질:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "리플레이 게인 활성화"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "비트 전송율:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "음반 모드"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "애이시드 재즈"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "클리핑 방지(추천)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "애이시드 락"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>레벨 조정</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "앰비언트"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "모든 파일 소리 증폭:"
-
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
-
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "태그가 붙지 않은 파일 증폭:"
-
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "프록시 호스트 이름:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "프록시 포트:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "프록시 사용자 이름:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "프록시 암호:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>프록시 설정</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "프록시 사용"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "프록시에서 인증 사용"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "문자 인코딩 자동 감지기:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "대체할 문자 인코딩:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>동작</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "시작할 때 이어서 재생"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "현재 곡이 삭제되면 다음 곡으로 진행"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "파일을 열 때 재생 목록 지우기"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "임시 재생 목록에서 파일 열기"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "재생할 때 곡 메타데이터를 불러오기"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>호환성</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "\\ (역슬래시)를 폴더 구분자로 해석"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>음반 표지</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "이 단어에 일치하는 그림 검색(콤마로 구분):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "이 단어에 일치하는 그림 제외(콤마로 구분):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "곡 파일 이름에 일치하는 그림 검색"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "재귀 검색"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "검색 깊이:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>팝업 정보</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "풍선 도움말 정보 표시"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "풍선 도움말 지연시간(10초 단위):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "현재 곡의 시간 길이 표시"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "제목"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "음악가 - 제목"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "음악가 - 음반 - 제목"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "음악가 - 음반 - 트랙. 제목"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "음악가 [ 음반 ] - 트랙. 제목"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "음반 - 제목"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "부문"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "사용자 정의"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>노래 표시</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "곡 번호 표시"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "자리수 맞추기 영(0) 표시(2:00대신 02:00으로)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "제목 형식:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "사용자 정의:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "오데이셔스 설정"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "(%s) 디렉터리를 만들 수 없음: %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "음악 CD, %s 트랙"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "모노"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "스테레오"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "채널 %d개"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "애써주신 분"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "라이선스"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "오데이셔스 정보"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "“%s”을(를) 완전히 제거하시겠습니까?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "제거(_R)"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "재생 목록 제거"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "다시 묻지 않음(_D)"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "이름 바꾸기(_R)"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "재생 목록 이름 바꾸기"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "이 재생 목록을 호출하기 위해 무얼 하시겠습니까?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "활성화(_E)"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "이퀄라이저"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "프리앰프"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "트랙"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "길이"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "형식:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "품질:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "비트 전송율:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "애이시드 재즈"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "애이시드 락"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "앰비언트"
-
-#: src/libaudgui/infowin.c:79
+#: src/libaudgui/infowin.cc:86
 msgid "Bebop"
 msgstr "비밥"
 
-#: src/libaudgui/infowin.c:80
+#: src/libaudgui/infowin.cc:87
 msgid "Bluegrass"
 msgstr "블루글래스"
 
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "블루스"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "쳄버 뮤직"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "클래식"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "컨트리"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "데스 메탈"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "디스코"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "이지 리스닝"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "포크"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "펑크"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "갱스터 랩"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "가스펠"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "그런지"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "하드 락"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "헤비메탈"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "힙합"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "하우스"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "재즈"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "정글"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "메달"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "뉴 에이지"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "뉴 웨이브"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "노이즈"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "팝"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "펑크 락"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "랩"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "레게"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "락"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "락 앤 롤"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "리듬 앤 블루스"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "스카"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "소울"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "스윙"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "테크노"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "트리팝"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "성공적으로 저장"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "저장 오류"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "곡 정보"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "주석"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "트랙 번호"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "저장(_S)"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "없음"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "%s에 대한 정보를 볼 수 없습니다.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "건너뛰기(_J)"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "시간 이동"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "시간 입력(분:초):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "%s을(를) 덮어쓰시겠습니까?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "대기열(_Q)"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "대기열 해제(_Q)"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "곡 건너뛰기"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "필터: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "필터(_F):"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "건너뛸 때 닫기(_L)"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "덮어쓰기(_O)"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "덮어쓰기 확인"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "%s을(를) 덮어쓰시겠습니까?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "재생 목록 내보내기"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "내보내기(_E)"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "재생 목록 가져오기"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "가져오기(_I)"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "대기목록 관리자"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "플러그인(_P)..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "큐에서 빼내기(_U)"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "파일 열기"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "열기(_O)"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "설정(_S)"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "열 때 대화상자 닫기(_D)"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "설정(_S)"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "파일 추가"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "정보(_A)"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "추가(_A)"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "모양새"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "추가할 때 대화상자 닫기(_D)"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "오디오"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "대기열(_Q)"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "네트워크"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "대기열 해제(_Q)"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "재생 목록"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "곡 건너뛰기"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "플러그인"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "필터: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "일반"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "필터(_F):"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "효과"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "건너뛸 때 닫기(_L)"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "시각 효과"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "입력"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "전송"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "날짜"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "코덱"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "음질"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "없음"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "아라비아어"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "발트 해 언어"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "중국어"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "그리스어"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "히브리어"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "일본어"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "한국어"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "폴란드어"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "러시아어"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "타이완어"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "터키어"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "부동 소숫점"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>인터페이스 설정</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "인터페이스 플러그인:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "출력 플러그인:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>출력 설정</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "비트 깊이:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "버퍼 크기:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "부드러운 클리핑"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "프로그램 음량 조절기 사용(추천하지 않음)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>리플레이 게인</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "리플레이 게인 활성화"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "음반 모드"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "클리핑 방지(추천)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>레벨 조정</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "모든 파일 소리 증폭:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "태그가 붙지 않은 파일 증폭:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "프록시 호스트 이름:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "프록시 포트:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "프록시 사용자 이름:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "프록시 암호:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>프록시 설정</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "프록시 사용"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "프록시에서 인증 사용"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "문자 인코딩 자동 감지기:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "대체할 문자 인코딩:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>동작</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "재생 목록 관리자"
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "항목"
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "현재 곡이 삭제되면 다음 곡으로 진행"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "새로 만들기(_N)"
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "파일을 열 때 재생 목록 지우기"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "이름 바꾸기(_A)"
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "임시 재생 목록에서 파일 열기"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "재생(_P)"
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>호환성</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "재생 목록 활성화시 대화상자 닫기(_C)"
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "\\ (역슬래시)를 폴더 구분자로 해석"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>노래 표시</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "곡 번호 표시"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "자리수 맞추기 영(0) 표시(2:00대신 02:00으로)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "재생할 때 곡 메타데이터를 불러오기"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>음반 표지</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "이 단어에 일치하는 그림 검색(콤마로 구분):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "이 단어에 일치하는 그림 제외(콤마로 구분):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "곡 파일 이름에 일치하는 그림 검색"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "재귀 검색"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "검색 깊이:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>팝업 정보</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "풍선 도움말 정보 표시"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "풍선 도움말 지연시간(10초 단위):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "현재 곡의 시간 길이 표시"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "제목"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "음악가 - 제목"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "음악가 - 음반 - 제목"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "음악가 - 음반 - 트랙. 제목"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "음악가 [ 음반 ] - 트랙. 제목"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "음반 - 제목"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "부문"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "사용자 정의"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "제목 형식:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "사용자 정의:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "오데이셔스 설정"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "대기목록 관리자"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "큐에서 빼내기(_U)"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "오류"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "URL 열기"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "URL 추가"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "URL 입력:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(이하 메시지는 숨겨져 있습니다.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "%s에 대한 정보를 볼 수 없습니다.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "파일 이름"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/ky.po b/po/ky.po
index d55c8ef0e124..b19d8eb9cbf2 100644
--- a/po/ky.po
+++ b/po/ky.po
@@ -3,6 +3,7 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
+# chingis, 2013
 #   <chingis091 at lavabit.com>, 2012
 # chingis <translatorky at lavabit.com>, 2013
 # chingis, 2013
@@ -12,9 +13,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Kirgyz (http://www.transifex.com/projects/p/audacious/"
 "language/ky/)\n"
 "Language: ky\n"
@@ -23,1013 +24,1181 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Изделүүдө ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d файл табылды"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Жаңы ойнотуу тизмеси"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Версияны көрсөтүү"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr ""
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Ойнотуу тизмесине файлдарды кошуу"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Башкы терезени көрсөтүү"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr ""
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
 msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr ""
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d файл табылды"
+
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Жаңы ойнотуу тизмеси"
 
-#: src/audacious/playback.c:387
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "%s could not be opened."
+msgid "Audio CD, track %s"
+msgstr "Аудио CD, жолчо %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
 msgstr ""
 
-#: src/audacious/playlist-files.c:95
-#, c-format
-msgid "Cannot load %s: unsupported file extension."
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Азыр ойнотулуп жатат"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Моно"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Стерео"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d канал"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Үн"
-
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Тармак"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Ойнотуу тизмеси"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Ыр жөнүндө маалымат"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Плагиндер"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Жалпы"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Эффекттер"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Авторлор"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Визуалдаштыруу"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Лицензия"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Кириш"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Audacious жөнүндө"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Транспорт"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Аткаруучусу"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Альбому"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Аты"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Жолчонун номери"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Жанр"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Файл аты"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Ойнотуу тизмесинин атын өзгөртүү"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Файлга жол"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Дата"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Күйгүзүү"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Жыл"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Гц"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Комментарий"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Гц"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Кодек"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Гц"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Сапат"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Гц"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Жок"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Гц"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Араб"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 кГц"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Балтика"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 кГц"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Кытай"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 кГц"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Грек"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 кГц"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Иврит"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 кГц"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Жапон"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Эквалайзер"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Корей"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Күчөтүү"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Поляк"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Файлдарды ачуу"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Орус"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Тайвань"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Түрк"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Файлдарды кошуу"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Оома чекит"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Чыгыш плагини:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Аты"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Чыгыштын ырастоолору</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Аткаруучусу"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Биттин тереңдиги:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Альбому"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Буфердин өлчөмү:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Жанр"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "мс"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Жыл"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Жумшак кесүү"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Жолчо"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr ""
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Узундук"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Альбом режими"
-
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Деңгээлдерди жөнгө салуу</b>"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Эйсид-джаз"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr ""
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Эйсид-рок"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "дБ"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Эмбиент"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr ""
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Бибоп"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Сервер:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Блюграсс"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Порт:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Блюз"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Колдонуучу аты:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Камералык музыка"
 
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Сырсөз:"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "Классикалык"
 
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Проксини ырастоо</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Проксини колдонуу"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Аракет</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Жүргүзгөндө ойнотууну уланта берүү"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Файлдарды ачканда ойнотуу тизмесин тазалоо"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Батышкычтык</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Альбом тышы</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Рекурсивдик издөө"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Издөө тереңдиги:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Калкып чыгуучу маалымат</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Калкыма маалыматты көрсөтүү"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "АТЫ"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "АТКАРУУЧУСУ - АТЫ"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "АТКАРУУЧУСУ - АЛЬБОМУ - АТЫ"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "АТКАРУУЧУСУ - АЛЬБОМУ - ЖОЛЧОСУ, АТЫ"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "АТКАРУУЧУСУ [ АЛЬБОМУ ] - ЖОЛЧОСУ, АТЫ"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "АЛЬБОМУ - АТЫ"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Категория"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Өз ырастоолор"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Ырды көрсөтүү</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Ыр номерин көрсөтүү"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Аталыштын форматы:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Өз формат:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Каталогду жаратууга мүмкүн эмес (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Аудио CD, жолчо %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Моно"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Стерео"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d канал"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Авторлор"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Лицензия"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Audacious жөнүндө"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Ойнотуу тизмесинин атын өзгөртүү"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Күйгүзүү"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Гц"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 кГц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 кГц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 кГц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 кГц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 кГц"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Эквалайзер"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Күчөтүү"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Жолчо"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Узундук"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Эйсид-джаз"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Эйсид-рок"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Эмбиент"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Бибоп"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Блюграсс"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Блюз"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Камералык музыка"
-
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "Классикалык"
-
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Кантри"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Дэт-метал"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Диско"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Жеңил музыка"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Элдик"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Фанк"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Гангста-рэп"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Госпел"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Гранж"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Хард-рок"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Хеви-метал"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Хип-хоп"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "Хаус"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Джаз"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Джангл"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Метал"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "Нью-эйдж"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "Жаңы толкун"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Нойз"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Поп"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Панк-рок"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Рэп"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Регги"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Рок"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Рок-н-ролл"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Ритм-н-блюз"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ска"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Соул"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Свинг"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Техно"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Трип-хоп"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Ыр жөнүндө маалымат"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Комментарий"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d кбит/с"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "%s үчүн маалымат жок.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Убакытка өтүү"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Убакытты киргизиңиз (мүнөт:секунда):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "%s кайтадан жаздыруу?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "Кезекке _коюу"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Кезектен _алуу"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Ырга өтүү"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Фильтр: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Фильтр:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "%s кайтадан жаздыруу?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Ойнотуу тизмесин экспорттоо"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Ойнотуу тизмесин импорттоо"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Кезек башкаруусу"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Файлдарды ачуу"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Файлдарды кошуу"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Үн"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Тармак"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Ойнотуу тизмеси"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Плагиндер"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Жалпы"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Эффекттер"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Визуалдаштыруу"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Кириш"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Транспорт"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "Кезекке _коюу"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Кезектен _алуу"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Ырга өтүү"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Дата"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Фильтр: "
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Кодек"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Фильтр:"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Сапат"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Жок"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Араб"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Балтика"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Кытай"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Грек"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Иврит"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Жапон"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Корей"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Поляк"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Орус"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Тайвань"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Түрк"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Оома чекит"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Чыгыш плагини:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Чыгыштын ырастоолору</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Биттин тереңдиги:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Буфердин өлчөмү:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "мс"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Жумшак кесүү"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Ойнотуу тизмелерин башкаруу"
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Жазуулар"
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Альбом режими"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Деңгээлдерди жөнгө салуу</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "дБ"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Ойнотуу тизмесин активация кылганда диалогду _жабуу"
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Сервер:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Порт:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Колдонуучу аты:"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Сырсөз:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Проксини ырастоо</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Проксини колдонуу"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Аракет</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Файлдарды ачканда ойнотуу тизмесин тазалоо"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Батышкычтык</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Ырды көрсөтүү</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Ыр номерин көрсөтүү"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Альбом тышы</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Рекурсивдик издөө"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Издөө тереңдиги:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Калкып чыгуучу маалымат</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Калкыма маалыматты көрсөтүү"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "АТЫ"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "АТКАРУУЧУСУ - АТЫ"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "АТКАРУУЧУСУ - АЛЬБОМУ - АТЫ"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "АТКАРУУЧУСУ - АЛЬБОМУ - ЖОЛЧОСУ, АТЫ"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "АТКАРУУЧУСУ [ АЛЬБОМУ ] - ЖОЛЧОСУ, АТЫ"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "АЛЬБОМУ - АТЫ"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Категория"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Өз ырастоолор"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Аталыштын форматы:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Өз формат:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr ""
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Кезек башкаруусу"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr ""
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "URL ачуу"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "URL кошуу"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "URL киргизиңиз:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "%s үчүн маалымат жок.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Файл аты"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/lt.po b/po/lt.po
index 5195ac480082..d3cd4a206769 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -13,9 +13,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-29 17:05+0000\n"
-"Last-Translator: Algimantas Margevičius <gymka at archlinux.lt>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Lithuanian (http://www.transifex.com/projects/p/audacious/"
 "language/lt/)\n"
 "Language: lt\n"
@@ -25,97 +25,81 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
 "%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Ieškoma ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d failas rastas"
-msgstr[1] "%d failai rasti"
-msgstr[2] "%d failų rasti"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Naujas grojaraštis"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Klaida"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Rodyti komandinės eilutės pagalbą"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Rodyti versiją"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Pradėti atkūrimą"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Pristabdyti atkūrimą"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pristabdyti, jei grojama, kitu atveju groti"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Sustabdyti atkūrimą"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Ankstesnė daina"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Kita daina"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Pridėti failus į grojaraštį"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Pridėti failus į laikiną grojaraštį"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Parodyti pagrindinį langą"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Rodyti perėjimo prie dainos langą"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Paleisti be grafinės sąsajos"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Sustabdžius atkūrimą baigti"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Rodyti derinimo pranešimus"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Nežinomas parametras: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Nežinomas parametras: %c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -124,35 +108,55 @@ msgstr ""
 "Naudojimas: [PARAMETRAS]... [FAILAS]...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Failui %s dekoderis nerastas."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d failas rastas"
+msgstr[1] "%d failai rasti"
+msgstr[2] "%d failų rasti"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "Atverti %s nepavyko."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Naujas grojaraštis"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Nepavyko įkelti %s: nepalaikomas failo plėtinys."
+msgid "Audio CD, track %s"
+msgstr "Audio CD, takelis %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Nepavyko išsaugoti %s: nepalaikomas failo plėtinys."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Dabar grojama"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -160,889 +164,1053 @@ msgstr ""
 "Vis dar vyksta(arba išjungta) meta duomenų skaitymas, todėl neįmanoma "
 "surikiuoti grojaraščio."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Apie"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Nustatymai"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Nustatyti"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Atsisakyti"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Užverti"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Nustatymai"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Apie"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Įskiepiai..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanalas"
+msgstr[1] "%d kanalai"
+msgstr[2] "%d kanalų"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Išvaizda"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Garsas"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Tinklas"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Grojaraštis"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Dainos informacija"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Įskiepiai"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Pagrindiniai"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Padėkos"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efektai"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licencija"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Vizualizacija"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Apie Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Įvestis"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Ar tikrai norite visam laikui pašalinti „%s“?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transportas"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Pašalinti"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Atlikėjas"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Atsisakyti"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Albumas"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Pašalinti grojaraštį"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Pavadinimas"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Daugiau nebeklausti"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Takelio numeris"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Pervadinti"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Žanras"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Pervadinti grojaraštį"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Failo vardas"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Kaip pavadinsite šį grojaraštį?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Failo kelias"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Įjungtas"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Data"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Metai"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Komentaras"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Kodekas"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kokybė"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Joks"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabų"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltijos"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Kinų"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Graikų"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebrajų"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ekvalaizeris"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japonų"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamp"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Korėjiečių"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Atverti failus"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Lenkų"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Atverti"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Rusų"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Atvėrus, užverti _dialogą"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taivaniečių"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Pridėti failus"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turkų"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Pridėti"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Slankiojantis taškas"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Pridėjus, užverti _dialogą"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Sąsajos nustatymai</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Užverti"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Sąsajos įskiepis:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Pavadinimas"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Išvesties įskiepis:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Atlikėjas"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Išvesties nustatymai</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Albumas"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Nominalus bitų sekos greitis:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Žanras"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Buferio dydis (kb):"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Metai"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Takelis"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Lengvas apkrapymas"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Trukmė"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Naudoti programinį garso valdymą (nerekomenduojama)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formatas:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Garso lygio sulyginimas</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Kokybė:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Įjungt garso lygio sulyginimą"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bitų dažnis:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Albumo režimas"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Uždrausti apkarpymą (rekomenduojama)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Nustatyti lygius</b>"
-
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Pagarsinti visus failus:"
-
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
-
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Pagarsinti failus be žymių:"
-
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Tarpinis serveris:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Tarpinio serverio prievadas:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Tarpinio serverio naudotojas:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Tarpinio serverio slaptažodis:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Tarpinio serverio nustatymai</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Leisti naudoti tarpinį serverį"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Su tarpiniu serveriu naudoti tapatybės nustatymą"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Automatinis koduotės nustatymas:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Atsarginis kodavimas:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Elgsena</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Paleidžiant tęsti atkūrimą"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Kai pasirinkta daina ištrinama, žengti į priekį"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Kai atveriamas failas, išvalyti grojaraštį"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Atverti failus laikiname grojaraštyje"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Kol negrojama, dainom neįkrauti meta duomenų"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Suderinamumas</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Laikyti \\ (įžambinį kairįjį brūkšnį) aplanko skirtuku"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Albumo apivadalinimas</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-"Ieškoti paveikslėlių kurie atitinka šiuos žodžius (atskirti kableliais):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Išskirti žodžius atitinkančius šiuos žodžius (atskirti kableliais):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Ieškoti paveikslėlių atitinkančių dainos failo vardą"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Ieškoti rekursyviai"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Paieškos gylis:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Iššokančio lango informacija</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Rodyti iššokantį informacijos langą"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Iššokančio lango rodymo trukmė(dešimtimis sekundžių):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Rodyti grojančios dainos laiko juostą"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "PAVADINIMAS"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ATLIKĖJAS - PAVADINIMAS"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ATLIKĖJAS - ALBUMAS - PAVADINIMAS"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ATLIKĖJAS - ALBUMAS - TAKELIS. PAVADINIMAS"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ATLIKĖJAS [ ALBUMAS ] - TAKELIS. PAVADINIMAS"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUMAS - PAVADINIMAS"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategorija"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Pasirinktinė"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Kūrinio pavadinimo vaizdavimas</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Rodyti dainos numerį"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Rodyti nulius priekyje (02:00 vietoj 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Pavadinimo formatas:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Pasirinktinė eilutė:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Audacious nustatymai"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Nepavyko sukurti aplanko (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Audio CD, takelis %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanalas"
-msgstr[1] "%d kanalai"
-msgstr[2] "%d kanalų"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Padėkos"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licencija"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Apie Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Ar tikrai norite visam laikui pašalinti „%s“?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Pašalinti"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Pašalinti grojaraštį"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Daugiau nebeklausti"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Pervadinti"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Pervadinti grojaraštį"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Kaip pavadinsite šį grojaraštį?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Įjungtas"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ekvalaizeris"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamp"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Takelis"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Trukmė"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Formatas:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Kokybė:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Bitų dažnis:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
+#: src/libaudgui/infowin.cc:85
 msgid "Ambient"
 msgstr "Ambient"
 
-#: src/libaudgui/infowin.c:79
+#: src/libaudgui/infowin.cc:86
 msgid "Bebop"
 msgstr "Bebob"
 
-#: src/libaudgui/infowin.c:80
+#: src/libaudgui/infowin.cc:87
 msgid "Bluegrass"
 msgstr "Bluegrass"
 
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "Blues"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Chamber Music"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Classical"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-Hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-Hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Sėkmingai išsaugota"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Įrašymo klaida"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Dainos informacija"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Komentaras"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Dainos numeris"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Įrašyti"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/A"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Nėra informacijos apie %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Šokti "
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Šokti į laiką"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Įveskite laiką (minutės:sekundės):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Perrašyti %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Į eilę"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Iš _eilės"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Peršokti į dainą"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtruoti:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtruoti:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Užverti peršokus"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "P_errašyti"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Patvirtinkite perrašymą"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Perrašyti %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Eksportuoti grojaraštį"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Eksportuoti"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Įkrauti grojaraštį"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Importuoti"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Eilės redaktorius"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Įskiepiai..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Iš eilės"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Atverti failus"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Atverti"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Nustatyti"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Atvėrus, užverti _dialogą"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Nustatymai"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Pridėti failus"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Apie"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Pridėti"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Išvaizda"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Pridėjus, užverti _dialogą"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Garsas"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Į eilę"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Tinklas"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Iš _eilės"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Grojaraštis"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Peršokti į dainą"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Įskiepiai"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtruoti:"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Pagrindiniai"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtruoti:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efektai"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Užverti peršokus"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Vizualizacija"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Įvestis"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Grojaraščio redaktorius"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transportas"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Elementai"
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Naujas"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "_Pervadinti"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Data"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Kodekas"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kokybė"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Joks"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabų"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltijos"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Kinų"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Graikų"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebrajų"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japonų"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Korėjiečių"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Lenkų"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Rusų"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taivaniečių"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turkų"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Slankiojantis taškas"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Sąsajos nustatymai</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Sąsajos įskiepis:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Išvesties įskiepis:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Išvesties nustatymai</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Nominalus bitų sekos greitis:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Buferio dydis (kb):"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Lengvas apkrapymas"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Naudoti programinį garso valdymą (nerekomenduojama)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Garso lygio sulyginimas</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Įjungt garso lygio sulyginimą"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Albumo režimas"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Uždrausti apkarpymą (rekomenduojama)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Nustatyti lygius</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Pagarsinti visus failus:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Atkurti"
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Pagarsinti failus be žymių:"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Įjungiant grojaraštį, užverti dialogą"
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Tarpinis serveris:"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Tarpinio serverio prievadas:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Tarpinio serverio naudotojas:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Tarpinio serverio slaptažodis:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Tarpinio serverio nustatymai</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Leisti naudoti tarpinį serverį"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Su tarpiniu serveriu naudoti tapatybės nustatymą"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Automatinis koduotės nustatymas:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Atsarginis kodavimas:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Elgsena</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Kai pasirinkta daina ištrinama, žengti į priekį"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Kai atveriamas failas, išvalyti grojaraštį"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Atverti failus laikiname grojaraštyje"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Suderinamumas</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Laikyti \\ (įžambinį kairįjį brūkšnį) aplanko skirtuku"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Kūrinio pavadinimo vaizdavimas</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Rodyti dainos numerį"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Rodyti nulius priekyje (02:00 vietoj 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Kol negrojama, dainom neįkrauti meta duomenų"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Albumo apivadalinimas</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr ""
+"Ieškoti paveikslėlių kurie atitinka šiuos žodžius (atskirti kableliais):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Išskirti žodžius atitinkančius šiuos žodžius (atskirti kableliais):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Ieškoti paveikslėlių atitinkančių dainos failo vardą"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Ieškoti rekursyviai"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Paieškos gylis:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Iššokančio lango informacija</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Rodyti iššokantį informacijos langą"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Iššokančio lango rodymo trukmė(dešimtimis sekundžių):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Rodyti grojančios dainos laiko juostą"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "PAVADINIMAS"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ATLIKĖJAS - PAVADINIMAS"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ATLIKĖJAS - ALBUMAS - PAVADINIMAS"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ATLIKĖJAS - ALBUMAS - TAKELIS. PAVADINIMAS"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ATLIKĖJAS [ ALBUMAS ] - TAKELIS. PAVADINIMAS"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUMAS - PAVADINIMAS"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategorija"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Pasirinktinė"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Pavadinimo formatas:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Pasirinktinė eilutė:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Audacious nustatymai"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Eilės redaktorius"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Iš eilės"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Klaida"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Atverti URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Pridėti URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Įveskite URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Sekantys pranešimai paslėpti.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Nėra informacijos apie %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Failo vardas"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/lv.po b/po/lv.po
index 0e9ee0e5fca8..e87866d049f4 100644
--- a/po/lv.po
+++ b/po/lv.po
@@ -3,15 +3,15 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# hairy_latvian <einars8 at gmail.com>, 2014
+# hairy_latvian <einars8 at gmail.com>, 2014-2015
 # hairy_latvian <einars8 at gmail.com>, 2009, 2011, 2012
-# hairy_latvian <einars8 at gmail.com>, 2009,2011-2013
+# hairy_latvian <einars8 at gmail.com>, 2009,2011-2014
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 16:38+0000\n"
+"POT-Creation-Date: 2015-04-03 11:51+0200\n"
+"PO-Revision-Date: 2015-03-24 10:24+0000\n"
 "Last-Translator: hairy_latvian <einars8 at gmail.com>\n"
 "Language-Team: Latvian (http://www.transifex.com/projects/p/audacious/"
 "language/lv/)\n"
@@ -22,132 +22,138 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : "
 "2);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Meklē ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Atrasts %d fails"
-msgstr[1] "Atrasti %d faili"
-msgstr[2] "Atrasti %d faili"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Jauns repertuārs"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Kļūda"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Parādīt komandrindas palīdzību"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Parādīt versiju"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Sākt atskaņošanu"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Pauzēt atskaņošanu"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Nopauzēt, ja pašlaik atskaņo, citādi atskaņot"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Apturēt atskaņošanu"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Pāriet uz iepriekšējo dziesmu"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Pāriet uz nākamo dziesmu"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Pievieno failus repertuāram"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Pievienot jaunus failus pagaidu repertuāram"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Rādīt galveno logu"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Rādīt logu 'pāriet uz dziesmu'"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Palaist bez grafiskās saskarnes"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Iziet, kad beidzas atskaņošana"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Drukāt atkļūdošanas ziņojumus"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Drukāt atkļūdošanas ziņojumus (var tikt izmantots divas reizes)"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Palaist Qt režīmā"
+
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Nezināma opcija: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Nezināma opcija: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr "Lietošana: audacious [OPCIJA] ... [FAILS] ...\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Netika atrasts dekodētājs priekš %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Atrasts %d fails"
+msgstr[1] "Atrasti %d faili"
+msgstr[2] "Atrasti %d faili"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "Neizdevās atvērt %s."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Jauns repertuārs"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Neizdevās ielādēt %s: neatbalstīts faila paplašinājums."
+msgid "Audio CD, track %s"
+msgstr "Audio CD, %s. celiņš"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(rakstzīmju kodēšanas kļūda)"
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Kļūda ielādējot spraudni"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Neizdevās saglabāt %s: neatbalstīts faila paplašinājums."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Kļūda atverot %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Nezināma atskaņošanas kļūda"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Nederīgs audio formāts"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Pašreiz atskaņo"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -155,888 +161,1052 @@ msgstr ""
 "Repertuārs nevar tikt sakārtots, jo joprojām noris metadatu skenēšana (vai "
 "arī tā ir atslēgta)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Par"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Neizdevās ielādēt %s: neatbalstīts faila paplašinājums."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Iestatījumi"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Neizdevās saglabāt %s: neatbalstīts faila paplašinājums."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "Ie_statīt"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Meklēšanas kļūda"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "At_celt"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Faila formāts nav atpazīts"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Aizvērt"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Kļūda lasot metadatus"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "I_estatījumi"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Par"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "S_praudņi ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanāls"
+msgstr[1] "%d kanāli"
+msgstr[2] "%d kanālu"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Izskats"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Celiņš %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Skaņa"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Audio CD"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Tīkls"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(nezināms nosaukums)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Repertuārs"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Nederīgs URI"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Dziesmas info"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Nezināma URI shēma"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Spraudņi"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Nederīgs faila nosaukums"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Vispārīgi"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Izstrādātāji"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efekti"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licence"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Vizualizēšana"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Par Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Ievade"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Vai vēlaties uz visiem laikiem izņemt \"%s\"?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transports"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Izņemt"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Izpildītājs"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "At_celt"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Albums"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Izņemt repertuāru"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Nosaukums"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Nejautāt vēlreiz"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Celiņa numurs"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "Pā_rdēvēt"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Žanrs"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Pārdēvēt repertuāru"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Faila nosaukums"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Kā jūs vēlētos nosaukt šo repertuāru?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Faila ceļš"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Ieslēgts"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Datums"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Gads"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Komentārs"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Kodeks"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kvalitāte"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Neviens"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arābu"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltu"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Ķīniešu"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Grieķu"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Ebreju"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Equalizer"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japāņu"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Priekšpastiprinājums"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Korejiešu"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Atvērt failus"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Poļu"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Atvērt"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Krievu"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Atverot aizvērt _dialoglogu"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taivānu"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Pievienot failus"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turku"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "Pi_evienot"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Peldošā punkta"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Pievienojot aizvērt _dialoglogu"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Saskarnes iestatījumi</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Aizvērt"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Saskarnes spraudnis:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Nosaukums"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Izvades spraudnis:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Izpildītājs"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Izvades iestatījumi</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Albums"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bitu dziļums:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Žanrs"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Bufera izmērs:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Gads"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Celiņš"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "'Mīkstā' apgriešana"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Ilgums"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Lietot programmatūras skaļuma kontroli (nav ieteicams)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formāts:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Normalizēšana</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Kvalitāte:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Ieslēgt normalizēšanu"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bitātrums:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Albuma režīms"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Novērst apgriešanu (ieteicams)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Regulēt līmeņus</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Pastiprināt visus failus:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Pastiprināt netagotos failus:"
-
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Starpniekservera nosaukums:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Starpniekservera ports:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Starpniekservera lietotājvārds:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Starpniekservera parole:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Starpniekservera konfigurācija</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Ieslēgt starpniekservera izmantošanu"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Savienojoties ar starpniekserveri, izmantot autentificēšanos"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Automātiska rakstzīmju kodējuma noteikšana priekš:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Atkāpšanās rakstzīmju kodējumi:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Izturēšanās</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Turpināt atskaņošanu pēc programmas palaišanas"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Iet uz priekšu, ja pašreizējā dziesma tiek dzēsta"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Atverot failus, notīrīt repertuāru"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Atvērt failus pagaidu repertuārā"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Neielādēt metadatus, līdz dziesma tiek atskaņota"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Savietojamība</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpretēt \\ (otrādo slīpsvītru) kā mapju atdalītāju"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Albuma vāks</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Meklēt attēlus, kuri atbilst šiem vārdiem (atdalītiem ar komatu):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Neiekļaut attēlus, kuri atbilst šiem vārdiem (atdalītiem ar komatu):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Meklēt attēlus, kas atbilst dziesmas faila nosaukumam"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Meklēt rekursīvi"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Meklēšanas dziļums:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Izlecošā informācija</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Rādīt izlecošo informāciju"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Izlecošā loga aizture (sekundes desmitdaļas):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Rādīt laika mērogu pašreizējai dziesmai"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "NOSAUKUMS"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "IZPILDĪTĀJS - NOSAUKUMS"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "IZPILDĪTĀJS - ALBUMS - NOSAUKUMS"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "IZPILDĪTĀJS - ALBUMS - CELIŅŠ. NOSAUKUMS"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "IZPILDĪTĀJS [ ALBUMS ] - CELIŅŠ. NOSAUKUMS"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUMS - NOSAUKUMS"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategorija"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Pielāgots"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Dziesmu attēlojums</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Rādīt dziesmu numurus"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Rādīt ievadošās nulles (02:00 nevis 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Nosaukuma formāts:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Pielāgota virkne:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Audacious iestatījumi"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Neizdevās izveidot mapi (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Audio CD, %s. celiņš"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanāls"
-msgstr[1] "%d kanāli"
-msgstr[2] "%d kanālu"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Izstrādātāji"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licence"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Par Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Vai vēlaties uz visiem laikiem izņemt \"%s\"?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Izņemt"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Izņemt repertuāru"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Nejautāt vēlreiz"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "Pā_rdēvēt"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Pārdēvēt repertuāru"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Kā jūs vēlētos nosaukt šo repertuāru?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Ieslēgts"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Equalizer"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Priekšpastiprinājums"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Celiņš"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Ilgums"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Formāts:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Kvalitāte:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Bitātrums:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "Blūzs"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Chamber Music"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klasiskā mūzika"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Kantrī"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disko"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Džezs"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pops"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Pankroks"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Reps"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Regejs"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Roks"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Tehno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Saglabāšana veiksmīga"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Saglabāšanas kļūda"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Dziesmas info"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Albuma izpildītājs"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Komentārs"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Celiņa numurs"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Notī_rīt laikus, pārvietojoties uz nākamo dziesmu"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Saglabāt"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Nākamā"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/P"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Informācija priekš %s nav pieejama.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "Pār_iet"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Pāriet uz laiku"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Ievadiet laiku (minūtes:sekundes)"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Pārrakstīt %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "Ierindot"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Atrindot"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Pāriet uz dziesmu"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtrs: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtrs:"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "A_izvērt pārejot"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "Pārra_kstīt"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Apstiprināt pārrakstīšanu"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Pārrakstīt %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Eksportēt repertuāru"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Eksportēt"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importēt repertuāru"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Importēt"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Rindas pārvaldnieks"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "S_praudņi ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Izņemt no rindas"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Par %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Atvērt failus"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s iestatījumi"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Atvērt"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "Ie_statīt"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Atverot aizvērt _dialoglogu"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "I_estatījumi"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Pievienot failus"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Par"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "Pi_evienot"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Izskats"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Pievienojot aizvērt _dialoglogu"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Skaņa"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "Ierindot"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Tīkls"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Atrindot"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Repertuārs"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Pāriet uz dziesmu"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Spraudņi"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtrs: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Vispārīgi"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtrs:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efekti"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "A_izvērt pārejot"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Vizualizēšana"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Ievade"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transports"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Celiņa numurs"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Faila nosaukums"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Faila ceļš"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Datums"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Kodeks"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kvalitāte"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Neviens"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arābu"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltu"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Ķīniešu"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Grieķu"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Ebreju"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japāņu"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Korejiešu"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Poļu"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Krievu"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taivānu"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turku"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Peldošā punkta"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Saskarnes iestatījumi</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Saskarnes spraudnis:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Izvades spraudnis:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Izvades iestatījumi</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bitu dziļums:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Bufera izmērs:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "'Mīkstā' apgriešana"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Lietot programmatūras skaļuma kontroli (nav ieteicams)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Normalizēšana</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Ieslēgt normalizēšanu"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Albuma režīms"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Novērst apgriešanu (ieteicams)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Regulēt līmeņus</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Pastiprināt visus failus:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Pastiprināt netagotos failus:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Starpniekservera nosaukums:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Starpniekservera ports:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Starpniekservera lietotājvārds:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Starpniekservera parole:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Tīkla iestatījumi</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Starpniekservera konfigurācija</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Ieslēgt starpniekservera izmantošanu"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Savienojoties ar starpniekserveri, izmantot autentificēšanos"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Automātiska rakstzīmju kodējuma noteikšana priekš:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Atkāpšanās rakstzīmju kodējumi:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Izturēšanās</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Palaižot turpināt atskaņošanu"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Pauzēt nevis uzreiz atsākt"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Iet uz priekšu, ja pašreizējā dziesma tiek dzēsta"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Atverot failus, notīrīt repertuāru"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Atvērt failus pagaidu repertuārā"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Savietojamība</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpretēt \\ (otrādo slīpsvītru) kā mapju atdalītāju"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Dziesmu attēlojums</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Rādīt dziesmu numurus"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Rādīt ievadošās nulles (02:00 nevis 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Paplašināti</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Neielādēt metadatus, līdz dziesma tiek atskaņota"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Testēt failus ar neatpazītiem failu paplašinājumiem"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Albuma vāks</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Meklēt attēlus, kuri atbilst šiem vārdiem (atdalītiem ar komatu):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Neiekļaut attēlus, kuri atbilst šiem vārdiem (atdalītiem ar komatu):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Meklēt attēlus, kas atbilst dziesmas faila nosaukumam"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Meklēt rekursīvi"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Meklēšanas dziļums:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Izlecošā informācija</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Rādīt izlecošo informāciju"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Izlecošā loga aizture (sekundes desmitdaļas):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Rādīt laika mērogu pašreizējai dziesmai"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "NOSAUKUMS"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "IZPILDĪTĀJS - NOSAUKUMS"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Repertuāru pārvaldnieks"
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "IZPILDĪTĀJS - ALBUMS - NOSAUKUMS"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "IZPILDĪTĀJS - ALBUMS - CELIŅŠ. NOSAUKUMS"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "IZPILDĪTĀJS [ ALBUMS ] - CELIŅŠ. NOSAUKUMS"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Ieraksti"
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUMS - NOSAUKUMS"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Jauns"
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategorija"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Pār_dēvēt"
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Pielāgots"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "Ats_kaņot"
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Nosaukuma formāts:"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Aizvērt dialoglogu, aktivizējot repertuāru"
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Pielāgota virkne:"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Audacious iestatījumi"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Rindas pārvaldnieks"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Izņemt no rindas"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Darbojas ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Kļūda"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Atvērt URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Pievienot URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Ievadiet URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Turpmākie ziņojumi tika paslēpti.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Atvērt mapi"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Pievienot mapi"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Atvērt"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Pievienot"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadati"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Komponists"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Izpildītājs"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Ierakstīšanas gads"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Ierakstīšanas datums"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Tehniskie"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIME tips"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bitātrums"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Informācija priekš %s nav pieejama.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Līmenis"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Faila nosaukums"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Līnija"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Funkcija"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Ziņojums"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Žurnāla inspektors"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Žurnāla līmenis:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Atkļūdot"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Informācija"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Brīdinājums"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Spraudņi ..."
diff --git a/po/ml_IN.po b/po/ml_IN.po
index 2e34dec30d13..9949e74da0d1 100644
--- a/po/ml_IN.po
+++ b/po/ml_IN.po
@@ -4,15 +4,15 @@
 #
 # Translators:
 # <>, 2013
-# nandakumar <nandakumar96 at gmail.com>, 2013
-# nandakumar <nandakumar96 at gmail.com>, 2013
+# Nandakumar <nandakumar96 at gmail.com>, 2013
+# Nandakumar <nandakumar96 at gmail.com>, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Malayalam (India) (http://www.transifex.com/projects/p/"
 "audacious/language/ml_IN/)\n"
 "Language: ml_IN\n"
@@ -21,131 +21,135 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "തിരയുന്നു ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d ഫയല്‍ കണ്ടെത്തി"
-msgstr[1] "%d ഫയലുകള്‍ കണ്ടെത്തി"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "പുതിയ പ്ലേലിസ്റ്റ്"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "പതിപ്പ് കാണിയ്ക്കുക"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "പാടുകയാണെങ്കില്‍ പോസ് ചെയ്യുക, അല്ലെങ്കില്‍ പാടുക"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "പ്ലേലിസ്റ്റിലേയ്ക്ക് ഫയലുകള്‍ ചേര്‍ക്കുക"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "മുഖ്യജാലകം പ്രദര്‍ശിപ്പിയ്ക്കുക"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "പാട്ടുനിന്നാല്‍ പുറത്തുകടക്കുക"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "ഡീബഗ്ഗിങ് സന്ദേശങ്ങള്‍ പ്രദര്‍ശിപ്പിയ്ക്കുക"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "ഒഡാഷ്യസ്"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "%s-ന് ഡീകോഡറൊന്നും കണ്ടുകിട്ടിയില്ല."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d ഫയല്‍ കണ്ടെത്തി"
+msgstr[1] "%d ഫയലുകള്‍ കണ്ടെത്തി"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s - തുറക്കാനായില്ല."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "പുതിയ പ്ലേലിസ്റ്റ്"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid "Audio CD, track %s"
+msgstr "ഓഡിയോ സി.ഡി., ട്രാക്ക് %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "ഇപ്പോള്‍ പാടുന്നത്"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -153,887 +157,1051 @@ msgstr ""
 "മെറ്റാഡാറ്റാ സ്കാനിങ് കഴിഞ്ഞിട്ടില്ലാത്തതിനാല്‍ പ്ലേലിസ്റ്റ് സോര്‍ട്ട് ചെയ്യാനാവില്ല (അല്ലെങ്കില്‍ "
 "അസാദ്ധ്യമാക്കിവച്ചതിനാല്‍)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "മോണോ"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "സ്റ്റീരിയോ"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d ചാനല്‍"
+msgstr[1] "%d ചാനലുകള്‍"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "ഓഡിയോ"
-
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "നെറ്റ്‌വര്‍ക്ക്"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "പ്ലേലിസ്റ്റ്"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "സോങ് ഇന്‍ഫോ"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "പ്ലഗ്ഗിന്നുകള്‍"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "പൊതുവായ"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "പ്രഭാവം"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "ബഹുമതികള്‍"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "ദൃശ്യവത്കരണം"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "അനുമതിപത്രം"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "ഇന്‍പുട്ട്"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "ഒഡാഷ്യസ്സിനെപ്പറ്റി"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "കടത്തുക"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "ആര്‍ട്ടിസ്റ്റ്"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "ആല്‍ബം"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "ടൈറ്റില്‍"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "ട്രാക്ക് നമ്പര്‍"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "തരം"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "ഫയല്‍നെയിം"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "പ്ലേലിസ്റ്റിന്റെ പേര് മാറ്റുക"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "ഫയല്‍പാത്ത്"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "തീയതി"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_സാദ്ധ്യമാക്കുക"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "വര്‍ഷം"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "അഭിപ്രായം"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "കോഡെക്"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "ഗുണമേന്മ"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "ശൂന്യം"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "അറബിക്"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "ബാള്‍ട്ടിക്"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "ചൈനീസ്"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "ഗ്രീക്ക്"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "ഹീബ്രൂ"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "ജാപ്പനീസ്"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "ഈക്വലൈസര്‍"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "കൊറിയന്‍"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "പ്രീ‌ആംപ്"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "പോളിഷ്"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "ഫയലുകള്‍ തുറക്കുക"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "റഷ്യന്‍"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "തായ്‌വാനീസ്"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "ടര്‍ക്കിഷ്"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "ഫയലുകള്‍ ചേര്‍ക്കുക"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "ഫ്ലോട്ടിങ് പോയിന്റ്"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "ഔട്പുട്ട് പ്ലഗ്ഗിന്‍"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "ടൈറ്റില്‍"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>ഔട്പുട്ട് ക്രമീകരണങ്ങള്‍</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "ആര്‍ട്ടിസ്റ്റ്"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "ബിറ്റ് ഡെപ്ത്"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "ആല്‍ബം"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "ബഫര്‍ സൈസ്"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "തരം"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "വര്‍ഷം"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "സോഫ്റ്റ് ക്ലിപ്പിങ്"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "ട്രാക്ക്"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "സോഫ്റ്റ്‌വെയര്‍ ശബ്ദനിയന്ത്രണോപാധി ഉപയോഗിയ്ക്കുക (ശുപാര്‍ശ ചെയ്യപ്പെട്ടിട്ടില്ല)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "നീളം"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>റീപ്ലേ ഗെയ്ന്‍</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "റീപ്ലേ ഗെയ്ന്‍ സാദ്ധ്യമാക്കുക"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "ആല്‍ബം മോഡ്"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "ക്ലിപ്പിങ് തടയുക (ശുപാര്‍ശ ചെയ്യപ്പെട്ടത്)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "ആസിഡ് ജാസ്"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>ലെവലുകള്‍ ക്രമീകരിയ്ക്കുക</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "ആസിഡ് റോക്ക്"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "എല്ലാ ഫയലുകളും ആംപ്ലിഫൈ ചെയ്യുക"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "ആംബിയന്റ്"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "ബിബോപ്"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "അണ്‍ടാഗ്ഡ് ഫയലുകള്‍ ആംപ്ലിഫൈ ചെയ്യുക:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "ബ്ലൂഗ്രാസ്"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "പ്രോക്സി ഹോസ്റ്റ്നെയിം:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "ബ്ലൂസ്"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "പ്രോക്സി പോര്‍ട്ട്"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "പ്രോക്സി ഉപയോക്തൃനാമം"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "പ്രോക്സി അടയാളവാക്യം"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>പ്രോക്സി ക്രമീകരണം</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "പ്രോക്സി ഉപയോഗം സാദ്ധ്യമാക്കുക"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "പ്രോക്സി ഉപയോഗിച്ചുകൊണ്ടുള്ള ഓതന്റിക്കേഷന്‍ സാദ്ധ്യമാക്കുക"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "ഇതിനായി ഓട്ടോ ക്യാരക്റ്റര്‍ എന്‍കോഡിങ് ഡിറ്റക്റ്റര്‍:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "ഫാള്‍ബാക്ക് ക്യാരക്റ്റര്‍ എന്‍കോഡിങ്ങുകള്‍:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>സ്വഭാവം</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "പ്രാരംഭസമയത്ത് പാടല്‍ തുടരുക"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "ഈ പാട്ട് ഡിലീറ്റായാല്‍ മുന്നോട്ടുനീങ്ങുക"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "ഫയലുകള്‍ തുറക്കുമ്പോള്‍ പ്ലേലിസ്റ്റ് വെടിപ്പാക്കുക"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "ഫയലുകള്‍ ഒരു താത്കാലികപ്ലേലിസ്റ്റില്‍ തുറക്കുക"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "പാട്ടുകള്‍ പാടുന്നതുവരെ മെറ്റാഡാറ്റ ലോഡ് ചെയ്യേണ്ട"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>അനുയോഗ്യത</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "\\ (backward slash) -നെ ഒരു ഫോള്‍ഡര്‍ ഡീലിമിറ്റര്‍ ആയി വ്യാഖ്യാനിയ്ക്കുക"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>ആല്‍ബം ആര്‍ട്ട്</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "ഈ വാക്കുകള്‍ക്കു യോജിച്ച ചിത്രങ്ങള്‍ക്കായി തിരയുക (കോമയാല്‍ വേര്‍തിരിയ്ക്കപ്പെട്ടത്)"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "ഈ വാക്കുകള്‍ക്കു യോജിച്ച ചിത്രങ്ങള്‍ ഒഴിവാക്കുക (കോമയാല്‍ വേര്‍തിരിയ്ക്കപ്പെട്ടത്)"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "പാട്ടിന്റെ ഫയല്‍ നെയിമിന് യോജിച്ച ചിത്രങ്ങള്‍ക്കായി തിരയുക"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "റിക്കര്‍സീവ് ആയി തിരയുക"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "സേര്‍ച്ച് ഡെപ്ത്:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>പോപ്പപ്പ് വിവരം</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "പോപ്പപ് വിവരം പ്രദര്‍ശിപ്പിയ്ക്കുക"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "പോപ്പപ്പ് വൈകല്‍ (ഒരു സെക്കന്‍ഡിന്റെ പത്തിലൊന്നുകള്‍)"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "ഈ പാട്ടിന്റെ ടൈം സ്കെയില്‍ കാണിയ്ക്കുക"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TITLE"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTIST - TITLE"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTIST - ALBUM - TITLE"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTIST - ALBUM - TRACK. TITLE"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTIST [ ALBUM ] - TRACK. TITLE"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - TITLE"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "വിഭാഗം"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "സ്വേച്ഛയാലുള്ള"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>സോങ് ഡിസ്പ്ലേ</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "പാട്ടുനമ്പറുകള്‍ കാണിയ്ക്കുക"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "തുടക്കത്തിലുള്ള പൂജ്യങ്ങള്‍ കാണിയ്ക്കുക (2:00 എന്നതിനുപകരം 02:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "ടൈറ്റില്‍ ഫോര്‍മാറ്റ്:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "സ്വേച്ഛയാലുള്ള എഴുത്ത്:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "ഡയറക്റ്ററി ഉണ്ടാക്കാനായില്ല (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "ഓഡിയോ സി.ഡി., ട്രാക്ക് %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "മോണോ"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "സ്റ്റീരിയോ"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d ചാനല്‍"
-msgstr[1] "%d ചാനലുകള്‍"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "ബഹുമതികള്‍"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "അനുമതിപത്രം"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "ഒഡാഷ്യസ്സിനെപ്പറ്റി"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "പ്ലേലിസ്റ്റിന്റെ പേര് മാറ്റുക"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_സാദ്ധ്യമാക്കുക"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "ഈക്വലൈസര്‍"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "പ്രീ‌ആംപ്"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "ട്രാക്ക്"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "നീളം"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "ആസിഡ് ജാസ്"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "ആസിഡ് റോക്ക്"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "ആംബിയന്റ്"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "ബിബോപ്"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "ബ്ലൂഗ്രാസ്"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "ബ്ലൂസ്"
-
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "ചേംബര്‍ മ്യൂസിക്"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "ക്ലാസിക്കല്‍"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "കണ്‍ട്രി"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "ഡെത്ത് മെറ്റല്‍"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "ഡിസ്കോ"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "ഈസി ലിസണിങ്"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "നാടോടി"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "ഫങ്ക്"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "ഗങ്സ്താ റാപ്പ്"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "ഗോസ്പല്‍"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "ഗ്രങ്"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "ഹാഡ് റോക്ക്"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "ഹെവി മെറ്റല്‍"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "ഹിപ്-ഹോപ്പ്"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "വീട്"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "ജാസ്"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "കാട്"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "മെറ്റല്‍"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "നവയുഗം"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "നവതരംഗം"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "ശബ്ദം"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "പോപ്പ്"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "പങ്ക് റോക്ക്"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "റാപ്പ്"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "റെഗ്ഗേജ്"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "റോക്ക്"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "റോക്ക് ആന്‍ഡ് റോള്‍"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "റിഥം ആന്‍ഡ് ബ്ലൂസ്"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "സ്കാ"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "സോള്‍"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "സ്വിങ്"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "ടെക്നോ"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "ട്രിപ്പ്-ഹോപ്പ്"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "സോങ് ഇന്‍ഫോ"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "അഭിപ്രായം"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "%s-ഉമായി ബന്ധപ്പെട്ട വിവരങ്ങളൊന്നും ലഭ്യമല്ല.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "സമയത്തിലേയ്ക്ക് ചാടുക"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "സമയം നല്‍കുക (മിനിറ്റുകള്‍:സെക്കന്‍ഡുകള്‍)"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "മായ്ച്ചെഴുതണോ: %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_ക്യൂ"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "അ_ണ്‍ക്യൂ"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "പാട്ടിലേയ്ക്ക് ചാടുക"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "അരിപ്പ:"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_അരിപ്പ:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "മായ്ച്ചെഴുതണോ: %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "പ്ലേലിസ്റ്റ് കയറ്റുമതി ചെയ്യുക"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "പ്ലേലിസ്റ്റ് ഇറക്കുമതി ചെയ്യുക"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "ക്യൂ മാനേജര്‍"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "ഫയലുകള്‍ തുറക്കുക"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "ഫയലുകള്‍ ചേര്‍ക്കുക"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "ഓഡിയോ"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "നെറ്റ്‌വര്‍ക്ക്"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "പ്ലേലിസ്റ്റ്"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "പ്ലഗ്ഗിന്നുകള്‍"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "പൊതുവായ"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "പ്രഭാവം"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "ദൃശ്യവത്കരണം"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "ഇന്‍പുട്ട്"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "കടത്തുക"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_ക്യൂ"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "അ_ണ്‍ക്യൂ"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "പാട്ടിലേയ്ക്ക് ചാടുക"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "തീയതി"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "അരിപ്പ:"
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "കോഡെക്"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_അരിപ്പ:"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "ഗുണമേന്മ"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "ശൂന്യം"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "അറബിക്"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "ബാള്‍ട്ടിക്"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "ചൈനീസ്"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "ഗ്രീക്ക്"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "ഹീബ്രൂ"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "ജാപ്പനീസ്"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "കൊറിയന്‍"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "പോളിഷ്"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "റഷ്യന്‍"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "തായ്‌വാനീസ്"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "ടര്‍ക്കിഷ്"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "ഫ്ലോട്ടിങ് പോയിന്റ്"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "പ്ലേലിസ്റ്റ് മാനേജര്‍"
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "ഔട്പുട്ട് പ്ലഗ്ഗിന്‍"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>ഔട്പുട്ട് ക്രമീകരണങ്ങള്‍</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "ബിറ്റ് ഡെപ്ത്"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "ബഫര്‍ സൈസ്"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "സോഫ്റ്റ് ക്ലിപ്പിങ്"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "എന്‍ട്രികള്‍"
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "സോഫ്റ്റ്‌വെയര്‍ ശബ്ദനിയന്ത്രണോപാധി ഉപയോഗിയ്ക്കുക (ശുപാര്‍ശ ചെയ്യപ്പെട്ടിട്ടില്ല)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>റീപ്ലേ ഗെയ്ന്‍</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "റീപ്ലേ ഗെയ്ന്‍ സാദ്ധ്യമാക്കുക"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "ആല്‍ബം മോഡ്"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "ക്ലിപ്പിങ് തടയുക (ശുപാര്‍ശ ചെയ്യപ്പെട്ടത്)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>ലെവലുകള്‍ ക്രമീകരിയ്ക്കുക</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "എല്ലാ ഫയലുകളും ആംപ്ലിഫൈ ചെയ്യുക"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "അണ്‍ടാഗ്ഡ് ഫയലുകള്‍ ആംപ്ലിഫൈ ചെയ്യുക:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "പ്രോക്സി ഹോസ്റ്റ്നെയിം:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "പ്രോക്സി പോര്‍ട്ട്"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "പ്രോക്സി ഉപയോക്തൃനാമം"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "പ്രോക്സി അടയാളവാക്യം"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>പ്രോക്സി ക്രമീകരണം</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "പ്രോക്സി ഉപയോഗം സാദ്ധ്യമാക്കുക"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "പ്രോക്സി ഉപയോഗിച്ചുകൊണ്ടുള്ള ഓതന്റിക്കേഷന്‍ സാദ്ധ്യമാക്കുക"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "ഇതിനായി ഓട്ടോ ക്യാരക്റ്റര്‍ എന്‍കോഡിങ് ഡിറ്റക്റ്റര്‍:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "ഫാള്‍ബാക്ക് ക്യാരക്റ്റര്‍ എന്‍കോഡിങ്ങുകള്‍:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>സ്വഭാവം</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "ഈ പാട്ട് ഡിലീറ്റായാല്‍ മുന്നോട്ടുനീങ്ങുക"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "ഫയലുകള്‍ തുറക്കുമ്പോള്‍ പ്ലേലിസ്റ്റ് വെടിപ്പാക്കുക"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "ഫയലുകള്‍ ഒരു താത്കാലികപ്ലേലിസ്റ്റില്‍ തുറക്കുക"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>അനുയോഗ്യത</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "\\ (backward slash) -നെ ഒരു ഫോള്‍ഡര്‍ ഡീലിമിറ്റര്‍ ആയി വ്യാഖ്യാനിയ്ക്കുക"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>സോങ് ഡിസ്പ്ലേ</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "പാട്ടുനമ്പറുകള്‍ കാണിയ്ക്കുക"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "തുടക്കത്തിലുള്ള പൂജ്യങ്ങള്‍ കാണിയ്ക്കുക (2:00 എന്നതിനുപകരം 02:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "പാട്ടുകള്‍ പാടുന്നതുവരെ മെറ്റാഡാറ്റ ലോഡ് ചെയ്യേണ്ട"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>ആല്‍ബം ആര്‍ട്ട്</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "ഈ വാക്കുകള്‍ക്കു യോജിച്ച ചിത്രങ്ങള്‍ക്കായി തിരയുക (കോമയാല്‍ വേര്‍തിരിയ്ക്കപ്പെട്ടത്)"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "ഈ വാക്കുകള്‍ക്കു യോജിച്ച ചിത്രങ്ങള്‍ ഒഴിവാക്കുക (കോമയാല്‍ വേര്‍തിരിയ്ക്കപ്പെട്ടത്)"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "പാട്ടിന്റെ ഫയല്‍ നെയിമിന് യോജിച്ച ചിത്രങ്ങള്‍ക്കായി തിരയുക"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "റിക്കര്‍സീവ് ആയി തിരയുക"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "സേര്‍ച്ച് ഡെപ്ത്:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>പോപ്പപ്പ് വിവരം</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "പോപ്പപ് വിവരം പ്രദര്‍ശിപ്പിയ്ക്കുക"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "പോപ്പപ്പ് വൈകല്‍ (ഒരു സെക്കന്‍ഡിന്റെ പത്തിലൊന്നുകള്‍)"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "ഈ പാട്ടിന്റെ ടൈം സ്കെയില്‍ കാണിയ്ക്കുക"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TITLE"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTIST - TITLE"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTIST - ALBUM - TITLE"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTIST - ALBUM - TRACK. TITLE"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTIST [ ALBUM ] - TRACK. TITLE"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - TITLE"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "വിഭാഗം"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "സ്വേച്ഛയാലുള്ള"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "ടൈറ്റില്‍ ഫോര്‍മാറ്റ്:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "സ്വേച്ഛയാലുള്ള എഴുത്ത്:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "ക്യൂ മാനേജര്‍"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "പ്ലേലിസ്റ്റ് ആക്റ്റിവേറ്റ് ചെയ്യുമ്പോള്‍ ജാലകം അടയ്ക്കുക"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "യൂ.ആര്‍.എല്‍. തുറക്കുക"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "യൂ.ആര്‍.എല്‍. ചേര്‍ക്കുക"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "യൂ.ആര്‍.എല്‍. നല്‍കുക:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(തുടര്‍ന്നുള്ള സന്ദേശങ്ങള്‍ മറച്ചുവച്ചിരിയ്ക്കുന്നു.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "%s-ഉമായി ബന്ധപ്പെട്ട വിവരങ്ങളൊന്നും ലഭ്യമല്ല.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "ഫയല്‍നെയിം"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/ms.po b/po/ms.po
index a5ac5369572d..947bb61750c1 100644
--- a/po/ms.po
+++ b/po/ms.po
@@ -3,15 +3,17 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
+# abuyop <abuyop at gmail.com>, 2014
+# abuyop <abuyop at gmail.com>, 2014
 # Mick The KN <f.seedsss at gmail.com>, 2012
 # Mick The KN <f.seedsss at gmail.com>, 2012
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-29 00:14+0000\n"
+"Last-Translator: abuyop <abuyop at gmail.com>\n"
 "Language-Team: Malay (http://www.transifex.com/projects/p/audacious/language/"
 "ms/)\n"
 "Language: ms\n"
@@ -20,1017 +22,1190 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Mencari ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d jumpa fail"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Senarai Main Baru"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
-msgstr ""
+msgstr "Tunjuk bantuan baris-perintah"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
-msgstr "Tunjukkan versi"
+msgstr "Tunjuk versi"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
-msgstr ""
+msgstr "Mula main balik"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
-msgstr ""
+msgstr "Jeda main balik"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
-msgstr "Jeda jika bermain, bermain selainnya"
+msgstr "Jeda jika bermain, main sebaliknya"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
-msgstr ""
+msgstr "Henti main balik"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
-msgstr ""
+msgstr "Langkau ke lagu terdahulu"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
-msgstr ""
+msgstr "Langkau ke lagu berikutnya"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Tambah fail ke senarai main"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
-msgstr ""
+msgstr "Tambah fail ke senarai main sementara"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
-msgstr "Memaparkan tetingkap utama"
+msgstr "Papar tetingkap utama"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
-msgstr ""
+msgstr "Papar tetingkap lompat-ke-lagu"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
-msgstr ""
+msgstr "Mula tanpa antaramuka bergrafik"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
-msgstr ""
+msgstr "Keluar bila main balik berhenti"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Cetak mesej penyahpijatan"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Cetak mesej penyahpepijatan (mungkin diguna sebanyak dua kali)"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Jalan dalam mod Qt"
+
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
-msgstr ""
+msgstr "Pilihan tidak diketahui: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
-msgstr ""
+msgstr "Pilihan tidak diketahui: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
+"Penggunaan: audacious [PILIHAN] ... [FAIL] ...\n"
+"\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Tiada dekoder dijumpai untuk %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d fail ditemui"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr ""
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Senarai Main Baharu"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr ""
+msgid "Audio CD, track %s"
+msgstr "Audio CD, track %s"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(ralat pengekodan aksara)"
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Ralat memuatkan pemalam"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
 msgstr ""
+"Ralat membuka %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Ralat main balik tidak diketahui"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Format audio tidak sah"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
-msgstr "Sedang Dimainkan"
+msgstr "Kini Dimainkan"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr ""
-"Senarai main tidak boleh diselesaikan kerana pengimbasan metadata masih "
-"dalam progres (atau telah dilumpuhkan)."
+"Senarai main tidak boleh diisih kerana pengimbasan data meta sedang berjalan "
+"(atau telah dilumpuhkan)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr ""
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Tidak dapat muatkan %s: sambungan nama fail tidak disokong."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr ""
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Tidak dapat simpan %s: sambungan nama fail tidak disokong."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr ""
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Ralat jangkau"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr ""
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Format fail tidak dikenali"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr ""
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Ralat membaca data meta"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d saluran"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr ""
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Trek %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Audio"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "CD Audio"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Rangkaian"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(tajuk tidak diketahui)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Senarai main"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "URI tidak sah"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Maklumat Lagu"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Skema URI tidak diketahui"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Plugin"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Nama fail tidak sah"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Umum"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Kredit"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Kesan"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Lesen"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualisasi"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Tentang Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Dalaman"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Anda mahu buang \"%s\" secara kekal?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Memindah"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Buang"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artist"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Batal"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Buang Senarai Main"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Tajuk"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Jangan tanya lagi"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Nombor track"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Nama semula"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Aliran"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Namakan Semula Senarai Main"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nama fail"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Apa yang anda mahu namakan senarai main ini?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Laluan fail"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Aktifkan"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Tarikh"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Tahun"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Komen"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Kodek"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kualiti"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Tiada"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Bahasa Arab"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Bahasa Baltik"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Bahasa Cina"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Bahasa Yunani"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Bahasa Ibrani"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Equalizer"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Bahasa Jepun"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamp"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Bahasa Korea"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Buka Fail"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Bahasa Poland"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Buka"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Bahasa Rusia"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Tutup _dialog bila dibuka"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Bahasa Taiwan"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Menambah Fail"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Bahasa Turki"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "T_ambah"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Titik terapung"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Tutup _dialog bila ditambah"
+
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "T_utup"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr ""
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Tajuk"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr ""
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artis"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Plugin luaran:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Tetapan Keluaran</b>"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Genre"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Kedalaman bit:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Tahun"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Saiz penimbal:"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Track"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Panjang"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Keratan lembut"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Format:"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Gunakan perisian kawalan volum (tidak digalakkan)"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Kualiti:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Replay Gain</b>"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Kadar bit:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Aktifkan Replay Gain"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Jazz Asid"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Mod album"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Rock Asid"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Menghalang keratan (digalakkan)"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Laraskan Tahap</b>"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Menguatkan semua fail:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Menguatkan fail yang tidak tanda:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Chamber Music"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Nama host proksi:"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "Classical"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Port proksi:"
+#: src/libaudgui/infowin.cc:91
+msgid "Country"
+msgstr "Country"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Nama pengguna proksi:"
+#: src/libaudgui/infowin.cc:92
+msgid "Death Metal"
+msgstr "Death Metal"
 
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Kata laluan proksi:"
+#: src/libaudgui/infowin.cc:93
+msgid "Disco"
+msgstr "Disco"
 
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Proksi Konfigurasi</b>"
+#: src/libaudgui/infowin.cc:94
+msgid "Easy Listening"
+msgstr "Easy Listening"
 
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Aktif penggunaan proksi"
+#: src/libaudgui/infowin.cc:95
+msgid "Folk"
+msgstr "Folk"
 
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Guna pengesahan dengan proksi"
+#: src/libaudgui/infowin.cc:96
+msgid "Funk"
+msgstr "Funk"
 
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Mengesan secara automatik pengekodan aksara untuk:"
+#: src/libaudgui/infowin.cc:97
+msgid "Gangsta Rap"
+msgstr "Gangsta Rap"
 
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Undur pengekodan aksara:"
+#: src/libaudgui/infowin.cc:98
+msgid "Gospel"
+msgstr "Gospel"
 
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Kelakuan</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Teruskan main semula pada permulaan"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Advance apabila lagu semasa dipadam"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Kosongkan senarai main apabila membuka fail"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Membuka fail dalam senarai main sementara"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Jangan muatkan metadata untuk lagu sehingga dimainkan"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Keserasian</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Tafsirkan \\ (mundur mengurangkan) sebagai pemisah folder"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Seni Album</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Cari imej sepadan kata (dipisah dengan koma):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Tidak termasuk imej yang sepadan dengan kata (dipisah dengan koma):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Carian untuk imej lagu sepadan dengan nama fail"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Cari secara rekursif"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Cari dalaman:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Maklumat Timbul</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Menunjukkan maklumat popup"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Kelewatan popup (persepuluh sesaat):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Tunjukkan skala masa untuk lagu semasa"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TAJUK"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTIST - TAJUK"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTIST - ALBUM - TAJUK"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTIST - ALBUM - TRACK. TAJUK"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTIST [ ALBUM ] - TRACK. TAJUK"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - TAJUK"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategori"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Custom"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Paparan Lagu</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Tunjuk nombor lagu"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Tunjukkan mengetuai sifar (02:00 bukan 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Tajuk format:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Rentetan custom:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Tidak dapat mencipta direktori (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Audio CD, track %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d saluran"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Kredit"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Lesen"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Tentang Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Namakan Semula Senarai Main"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Aktifkan"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Equalizer"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamp"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Track"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Panjang"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Jazz Asid"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Rock Asid"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Chamber Music"
-
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "Classical"
-
-#: src/libaudgui/infowin.c:84
-msgid "Country"
-msgstr "Country"
-
-#: src/libaudgui/infowin.c:85
-msgid "Death Metal"
-msgstr "Death Metal"
-
-#: src/libaudgui/infowin.c:86
-msgid "Disco"
-msgstr "Disco"
-
-#: src/libaudgui/infowin.c:87
-msgid "Easy Listening"
-msgstr "Easy Listening"
-
-#: src/libaudgui/infowin.c:88
-msgid "Folk"
-msgstr "Folk"
-
-#: src/libaudgui/infowin.c:89
-msgid "Funk"
-msgstr "Funk"
-
-#: src/libaudgui/infowin.c:90
-msgid "Gangsta Rap"
-msgstr "Gangsta Rap"
-
-#: src/libaudgui/infowin.c:91
-msgid "Gospel"
-msgstr "Gospel"
-
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm dan Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
-msgstr ""
+msgstr "Berjaya disimpan"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
-msgstr ""
+msgstr "Ralat simpan"
+
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Maklumat Lagu"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Album Artis"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Ulasan"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
-msgstr ""
+msgstr "Nombor Trek"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "K_osongkan medan bila beralih ke lagu berikutnya"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
-msgstr ""
+msgstr "_Simpan"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Berikutnya"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
-msgstr ""
-
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Tiada maklumat tersedia untuk %s.\n"
+msgstr "T/A"
 
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
-msgstr ""
+msgstr "_Lompat"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Lompat ke Masa"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Masukkan masa (minit:saat):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Tulisganti %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Atur"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Tidak_Atur"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Lompat ke Lagu"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Tapis:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Tapis:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "T_utup bila lompat"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
-msgstr ""
+msgstr "T_ulis Ganti"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
-msgstr ""
+msgstr "Sahkan Tulis Ganti"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Tulisganti %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Eksport Senarai Main"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
-msgstr ""
+msgstr "_Eksport"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Import Senarai Main"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
-msgstr ""
+msgstr "_Import"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Pengurus Teratur"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Pemalam ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr ""
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Perihal %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Buka Fail"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "Tetapan %s"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr ""
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Tetapkan"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr ""
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Tetapan"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Menambah Fail"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "Perih_al"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Penampilan"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audio"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Atur"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Rangkaian"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Tidak_Atur"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Senarai Main"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Lompat ke Lagu"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Pemalam"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Tapis:"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Am"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Tapis:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Kesan"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Pengvisualan"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Pengurus Senarai Main"
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Input"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Penyertaan"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Pindah"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Nombor trek"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Nama fail"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Laluan fail"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Tarikh"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Kodeks"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kualiti"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Tiada"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Bahasa Arab"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Bahasa Baltik"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Bahasa Cina"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Bahasa Yunani"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Bahasa Ibrani"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Bahasa Jepun"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Bahasa Korea"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Bahasa Poland"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Bahasa Rusia"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Bahasa Taiwan"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Bahasa Turki"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Titik terapung"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Tetapan Antaramuka</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Pemalam antaramuka:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Pemalam output:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Tetapan Output</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Kedalaman bit:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Saiz penimbal:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "pengeratan lembut"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Guna perisian kawalan volum (tidak disarankan)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Gandaan Main Semula</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Benarkan Gandaan Main Semula"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Mod album"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Halang pengeratan (disaran)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Laras Aras</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Kuatkan semua fail:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Kuatkan fail tidak bertanda:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Nama hos proksi:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Port proksi:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Nama pengguna proksi:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Kata laluan proksi:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Tetapan Rangkaian</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Konfigurasi Proksi</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Benarkan penggunaan proksi"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Guna pengesahihan dengan proksi"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Pengesan pengekodan aksara berautomatik untuk:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Pengekodan aksara jatuh balik:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Kelakuan</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Sambung main balik ketika permulaan"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Jeda selain dari sambung serta-merta"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Lanjutkan bila lagu semasa dipadam"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Kosongkan senarai main bila membuka fail"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Buka fail dalam senarai main sementara"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Keserasian</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Tafsirkan \\ (miring belakang) sebagai penyahbatas folder"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Paparan Lagu</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Tunjuk nombor lagu"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Tunjukkan mengetuai sifar (02:00 bukan 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Lanjutan</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Jangan muatkan data meta lagu sehingga dimainkan"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Kuar kandungan fail tanpa sambungan nama fail dikenali"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Seni Album</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
 msgstr ""
+"Gelintar imej sepadan dengan perkataan ini (dipisah dengan tanda koma):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Tidak termasuk imej yang sepadan dengan kata (dipisah dengan koma):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Carian untuk imej lagu sepadan dengan nama fail"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Cari secara rekursif"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Cari dalaman:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Maklumat Timbul</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Menunjukkan maklumat popup"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Kelewatan popup (persepuluh sesaat):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Tunjukkan skala masa untuk lagu semasa"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TAJUK"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTIST - TAJUK"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTIST - ALBUM - TAJUK"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTIST - ALBUM - TRACK. TAJUK"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTIST [ ALBUM ] - TRACK. TAJUK"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - TAJUK"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategori"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Custom"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Tajuk format:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Rentetan custom:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Tetapan Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Pengurus Teratur"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "N_yah Baris Gilir"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Tutup dialog bila mengaktifkan senarai main"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Bekerja ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Ralat"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Buka URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Menambah URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Masukkan URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Mesej lanjut telah disembunyi.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Buka Folder"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Tambah Folder"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Buka"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Tambah"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Data meta"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Penggubah"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Penyampai"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Tahun Rakaman"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Tarikh Rakaman"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Teknikal"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Jenis MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Kadar bit"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Tiada maklumat tersedia untuk %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Aras"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nama fail"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Baris"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Fungsi"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Mesej"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Pemeriksa Log"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Aras Log:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Nyahpepijat"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Maklumat"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Amaran"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Pemalam ..."
diff --git a/po/nl.po b/po/nl.po
index 7533aaf9ec04..b4f58f71c7d1 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -5,15 +5,18 @@
 # Translators:
 # Bjorn Roesbeke <inbox at bjornroesbeke.be>, 2012-2013
 # Dennis Klomp <c_klomp at epu-forum.net>, 2012
+# dragnadh <dragnadh at gmail.com>, 2015
+# Farioko <fabianbakkum at hotmail.com>, 2014
+# Farioko <fabianbakkum at hotmail.com>, 2014
 # Glennz <glenn_de_groot at hotmail.com>, 2012
 # Glennz <glenn_de_groot at hotmail.com>, 2012
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-01-18 00:13+0000\n"
+"Last-Translator: dragnadh <dragnadh at gmail.com>\n"
 "Language-Team: Dutch (http://www.transifex.com/projects/p/audacious/language/"
 "nl/)\n"
 "Language: nl\n"
@@ -22,131 +25,139 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Zoeken..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d bestand gevonden"
-msgstr[1] "%d bestanden gevonden"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nieuwe afspeellijst"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
-msgstr ""
+msgstr "Toon opdrachtregel hulp"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Toon de versie"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
-msgstr ""
+msgstr "Afspelen"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
-msgstr ""
+msgstr "Pauzeer het afspelen"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pauzeer tijdens spelen, anders afspelen"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
-msgstr ""
+msgstr "Stop het afspelen"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
-msgstr ""
+msgstr "Naar het vorige nummer"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
-msgstr ""
+msgstr "Naar het volgende nummer"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Voeg bestanden toe aan de afspeellijst"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
-msgstr ""
+msgstr "Voeg bestanden toe aan een tijdelijke afspeellijst"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Toon het hoofdvenster"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
-msgstr ""
+msgstr "Toon het spring-naar-nummer venster"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
-msgstr ""
+msgstr "Start zonder een grafische interface"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Sluit bij stoppen met afspelen"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Toon debug berichten"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Toon debug berichten (kan tweemaal gebruikt worden)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Draaien in Qt modus"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
-msgstr ""
+msgstr "Onbekende optie: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
-msgstr ""
+msgstr "Onbekende optie: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
+"Gebruik: audacious [OPTIE] ... [BESTANDSNAAM] ...\n"
+"\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Geen decoder gevonden voor %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d bestanden gevonden"
+msgstr[1] "%d bestanden gevonden"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s kon niet geopend worden."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nieuwe afspeellijst"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr ""
+msgid "Audio CD, track %s"
+msgstr "Audio CD, nummer %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(tekencodering fout)"
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Fout bij het laden van de plugin"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
 msgstr ""
+"Fout bij het openen van %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Onbekende playback fout"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Ongeldige audioformaat"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Nu aan het afspelen"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -154,892 +165,1056 @@ msgstr ""
 "De speellijst kon niet gesorteerd worden omdat metadata scannen nog steeds "
 "bezig (of uitgeschakeld) is."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr ""
-
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr ""
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Kan %s niet laden: niet ondersteunde bestandsnaamextensie"
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr ""
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "kan %s opslaan: niet ondersteunde bestandsnaamextensie"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr ""
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Zoek fouten"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr ""
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Bestandsformaat niet herkend"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Fout bij lezen metadata"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanaal"
+msgstr[1] "%d kanalen"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Geluid"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Nummer %d"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Netwerk"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Audio CD"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Speellijst"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(Onbekende titel)"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Lied informatie"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Ongeldige URI"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Plugins"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Onbekende URI schema"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Algemeen"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Bestandsnaam ongeldig"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Effect"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Met dank aan"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualisatie "
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licentie"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Invoer"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Over Audacious"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transport"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Weet u zeker dat u \"%s\" wilt verwijderen?"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artiest"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Verwijderen"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Annuleren"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Titel"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Verwijder afspeellijst"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Nummer"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Vraag niet opnieuw"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Genre"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Hernoem"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Bestandsnaam"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Afspeellijst hernoemen"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Bestandslocatie"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Hoe wilt u deze afspeellijst noemen?"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Datum"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Inschakelen"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Jaar"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Opmerking"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kwaliteit"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Geen"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabisch"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltisch"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Chinees"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Grieks"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebreeuws"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japans"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Equalizer"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Koreaans"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Voorversterker"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Pools"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Bestanden openen"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Russisch"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Openen"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanees"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Sluit het _venster bij openen"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turks"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Bestanden toevoegen"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Zwevende komma"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Toevoegen"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr ""
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Sluit _venster bij toevoegen"
+
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Sluiten"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr ""
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Titel"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Uitvoer plugin"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artiest"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Uitvoer instellingen</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bitdiepte:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Genre"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Bufferomvang:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Jaar"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Nummer"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Zacht clippen"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Lengte"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Gebruik de software volumeregelaar (niet aangeraden)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formaat:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Normaliseren</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Kwaliteit:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Normaliseren gebruiken"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bitsnelheid:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Album modus"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Afknippen voorkomen (aanbevolen)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Niveaus aanpassen</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Versterk alle bestanden:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Versterk bestanden zonder tag"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Proxy-hostnaam:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Kamermuziek"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Proxy-poort:"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "Klassiek"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Proxy-gebruikersnaam:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Proxy-wachtwoord:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Proxy-configuratie</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Proxy gebruiken"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Gebruik authenticatie voor proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Automatische karakter-encoding detector ingeschakeld voor:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Terugvallen op karakter-encodings:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Gedrag</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Afspeelpositie onthouden"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Ga verder wanneer het huidige liedje is verwijderd"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Wis de afspeellijst wanneer bestanden worden geopend"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Open bestanden in een tijdelijke speellijst"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Laad metadata voor gegevens niet tot ze afgespeeld worden"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibiliteit</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr ""
-"Interpreteer \\ (achterwaartse schuine streep) als begrenzingsteken voor een "
-"map"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Album hoes</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
-"Zoek naar afbeeldingen die met deze woorden overeenkomen (kommagescheiden):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
-"Sluit afbeeldingen die met deze woorden overeenkomen uit (kommagescheiden): "
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr ""
-"Zoek naar afbeeldingen die met de bestandsnaam van het lied overeenkomen"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Zoek recursief"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Zoekdiepte:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Popup-informatie</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Toon popup informatie"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Popup vertraging (tienden van een seconde):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Toon tijdschaal voor het huidige lied"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TITEL"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTIEST - TITEL"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTIEST - ALBUM -TITEL"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTIEST - ALBUM - NUMMER. TITEL"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTIEST [ ALBUM ] - NUMMER. TITEL"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - TITEL"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Categorie"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Aangepast"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Nummer weergave</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Toon lied nummers"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Toon leidende nullen (02:00 in plaats van 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Titelformaat:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Handmatige instelling:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Kon de map (%s) niet aanmaken: %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Audio CD, nummer %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanaal"
-msgstr[1] "%d kanalen"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Met dank aan"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licentie"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Over Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Afspeellijst hernoemen"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Inschakelen"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Equalizer"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Voorversterker"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Nummer"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Lengte"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Kamermuziek"
-
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "Klassiek"
-
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop "
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm-and-Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
-msgstr ""
+msgstr "Succesvol opgeslagen"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
-msgstr ""
+msgstr "Er is een fout opgetreden tijdens het opslaan"
 
-#: src/libaudgui/infowin.c:359
-msgid "Track Number"
-msgstr ""
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Lied informatie"
 
-#: src/libaudgui/infowin.c:367
-msgid "_Save"
-msgstr ""
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Album Artiest"
 
-#: src/libaudgui/infowin.c:418
-#, c-format
-msgid "%d kb/s"
-msgstr "%d kb/s"
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Opmerking"
 
-#: src/libaudgui/infowin.c:423
-msgid "N/A"
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
+msgid "Track Number"
+msgstr "Titelnummer"
+
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
+msgid "_Save"
+msgstr "_Opslaan"
+
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Volgende"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
-msgid "No info available for %s.\n"
-msgstr "Geen informatie beschikbaar voor %s.\n"
+msgid "%d kb/s"
+msgstr "%d kb/s"
+
+#: src/libaudgui/infowin.cc:460
+msgid "N/A"
+msgstr "n.v.t."
 
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
-msgstr ""
+msgstr "_Spring"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Ga naar tijd"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Voer tijd in (minuten:seconden):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "%s overschrijven?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_In wachtrij plaatsen"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "_Uit wachtrij verwijderen"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Ga naar lied"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filter: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filter:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "S_luiten bij springen"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
-msgstr ""
+msgstr "_Overschrijven"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
-msgstr ""
+msgstr "Confirmatie voor overschrijven"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "%s overschrijven?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Exporteer speellijst"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
-msgstr ""
+msgstr "_Exporteer"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importeer speellijst"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
-msgstr ""
+msgstr "_Importeer"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Wachtrij beheerder"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Invoegtoepassingen ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr ""
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Over %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Bestanden openen"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Instellingen"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr ""
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Ingesteld"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr ""
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Instellingen"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Bestanden toevoegen"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Over"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Uiterlijk"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Geluid"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_In wachtrij plaatsen"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Netwerk"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "_Uit wachtrij verwijderen"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Speellijst"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Ga naar lied"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Plugins"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filter: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Algemeen"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filter:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Effect"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualisatie "
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Invoer"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transport"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Track nummer"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Bestandsnaam"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Bestandspad"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Datum"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codec"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kwaliteit"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Geen"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltisch"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Chinees"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Grieks"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebreeuws"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japans"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Koreaans"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Pools"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Russisch"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanees"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turks"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Zwevende komma"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Interface Instellingen</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Interface invoegtoepassing:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Uitvoer plugin:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Uitvoer instellingen</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bitdiepte:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Bufferomvang:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Zacht clippen"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Gebruik de software volumeregelaar (niet aangeraden)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Normaliseren</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Normaliseren gebruiken"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Album modus"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Afknippen voorkomen (aanbevolen)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Niveaus aanpassen</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Versterk alle bestanden:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Versterk bestanden zonder tag"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Proxy-hostnaam:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Proxy-poort:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Proxy-gebruikersnaam:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Proxy-wachtwoord:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Netwerk Instellingen</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Proxy-configuratie</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Proxy gebruiken"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Gebruik authenticatie voor proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Automatische karakter-encoding detector ingeschakeld voor:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Terugvallen op karakter-encodings:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Gedrag</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Hervatten bij het opstarten"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Pauzeer in plaats van onmiddellijk hervatten"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Ga verder wanneer het huidige liedje is verwijderd"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Wis de afspeellijst wanneer bestanden worden geopend"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Open bestanden in een tijdelijke speellijst"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibiliteit</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
 msgstr ""
+"Interpreteer \\ (achterwaartse schuine streep) als begrenzingsteken voor een "
+"map"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Speellijst beheerder"
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Nummer weergave</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Invoer"
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Toon lied nummers"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Toon leidende nullen (02:00 in plaats van 2:00)"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Geavanceerd</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Laad metadata voor gegevens niet tot ze afgespeeld worden"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Onderzoek inhoud van bestanden met geen erkende bestandsextensie"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Album hoes</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
 msgstr ""
+"Zoek naar afbeeldingen die met deze woorden overeenkomen (kommagescheiden):"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
 msgstr ""
+"Sluit afbeeldingen die met deze woorden overeenkomen uit (kommagescheiden): "
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
 msgstr ""
+"Zoek naar afbeeldingen die met de bestandsnaam van het lied overeenkomen"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Zoek recursief"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Zoekdiepte:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Popup-informatie</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Venster sluiten bij activeren afspeellijst"
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Toon popup informatie"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Popup vertraging (tienden van een seconde):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Toon tijdschaal voor het huidige lied"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TITEL"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTIEST - TITEL"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTIEST - ALBUM -TITEL"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTIEST - ALBUM - NUMMER. TITEL"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTIEST [ ALBUM ] - NUMMER. TITEL"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - TITEL"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Categorie"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Aangepast"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Titelformaat:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Handmatige instelling:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Audacious Instellingen"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Wachtrij beheerder"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Verwijder van wachtrij"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Werken ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Fout"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Open URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Voeg URL toe"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Voer URL in:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Verdere berichten werden verborgen.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Map Openen"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Map Toevoegen"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Openen"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Toevoegen"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadata"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Componist"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Performer"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Opname Jaar"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Opname Datum"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Technische"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIME Type"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Geen informatie beschikbaar voor %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Level"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Bestandsnaam"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Lijn"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Functie"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Bericht"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Logboek Inspecteur"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Log Level:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Debug"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Informatie"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Waarschuwing"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Plugins ..."
diff --git a/po/pl.po b/po/pl.po
index b1818025e692..933fde2e589a 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -6,24 +6,26 @@
 # Chris <259095+transifex at gmail.com>, 2012
 # Bartosz Kosiorek <gang65 at poczta.onet.pl>, 2003
 # Chris <259095+transifex at gmail.com>, 2012
+# Chris <259095+transifex at gmail.com>, 2012
 # felikstayson <felikstayson at o2.pl>, 2012
 # felikstayson <felikstayson at o2.pl>, 2012
 # GNOME PL Team <translators at gnome.pl>, 2004
 # Grzegorz Kowal <g_kowal at poczta.onet.pl>, 2000-2001
 # mkkot <marcin2006 at gmail.com>, 2013
-# Marco Oliver Grunwald <marco at mgrvnwald.com>, 2013
-# Marco Oliver Grunwald <marco at mgrvnwald.com>, 2013
-# Marco Oliver Grunwald <marco at mgrvnwald.com>, 2013
+# Marco Oliver Grunwald <m at mgrvnwald.com>, 2013
+# Marco Oliver Grunwald <m at mgrvnwald.com>, 2013
+# Marco Oliver Grunwald <m at mgrvnwald.com>, 2013
 # mkkot <marcin2006 at gmail.com>, 2013-2014
 # Piotr Sokół <psokol at jabster.pl>, 2012
+# Piotr Strębski <strebski at o2.pl>, 2014
 # Szymon Weihs <sz.weihs at gmail.com>, 2011
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 08:03+0000\n"
-"Last-Translator: mkkot <marcin2006 at gmail.com>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 18:43+0000\n"
+"Last-Translator: Piotr Strębski <strebski at o2.pl>\n"
 "Language-Team: Polish (http://www.transifex.com/projects/p/audacious/"
 "language/pl/)\n"
 "Language: pl\n"
@@ -33,97 +35,81 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
 "|| n%100>=20) ? 1 : 2);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Szukanie ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Znaleziono plik %d"
-msgstr[1] "Znaleziono %d pliki"
-msgstr[2] "Znaleziono %d plików"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nowa lista odtwarzania"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Błąd"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Wyświetl pomoc linii poleceń"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Pokaż informacje o wersji"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Rozpocznij odtwarzanie"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Wstrzymaj odtwarzanie"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Wstrzymaj i wznów odtwarzanie bieżącej ścieżki"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Zatrzymaj odtwarzanie"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Przejdź do poprzedniej piosenki"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Przejdź do następnej piosenki"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Dodaj pliki do listy odtwarzania"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Dodaj pliki do tymczasowej listy odtwarzania"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Wyświetl główne okno programu"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Wyświetla okno \"Przejdź do ścieżki\""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Uruchom bez interfejsu graficznego"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Zamknij program po zakończeniu odtwarzania"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Pokaż komunikaty błędów"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Pokaż komunikaty o błędach (może być dwukrotnie użyte)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Uruchom w trybie Qt"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Nieznana opcja: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Nieznana opcja: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -132,35 +118,57 @@ msgstr ""
 "Obsługa:  audacious [OPCJE] ... [PLIK] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Nie odnaleziono dekodera dla %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Znaleziono plik %d"
+msgstr[1] "Znaleziono %d pliki"
+msgstr[2] "Znaleziono %d plików"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "Nie można otworzyć %s."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nowa lista odtwarzania"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Nie można otworzyć %s: nieobsługiwane rozszerzenie pliku."
+msgid "Audio CD, track %s"
+msgstr "Płyta Audio CD, ścieżka %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(błąd dekodowania znaków)"
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Błąd wczytywania wtyczki"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Nie można zapisać %s: nieobsługiwane rozszerzenie pliku."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Błąd otwierania %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Nieznany błąd odtwarzania"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Nieprawidłowy format dźwięku"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Teraz odtwarzane"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -168,888 +176,1052 @@ msgstr ""
 "Nie można posortować listy odtwarzania, ponieważ odczytywanie metadanych "
 "nadal trwa albo zostało ono wyłączone."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "O programie"
-
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Ustawienia"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Nie można wczytać %s: nieobsługiwane rozszerzenie pliku."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "U_staw"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Nie można zapisać %s: nieobsługiwane rozszerzenie pliku."
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Anuluj"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Znajdź błąd"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Zamknij"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Nie rozpoznano formatu pliku"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Ustawienia"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Błąd odczytu metadanych"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_O programie"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Wtyczki..."
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Wygląd"
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanał"
+msgstr[1] "%d kanały"
+msgstr[2] "%d kanałów"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Dźwięk"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Ścieżka %d"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Sieć"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Audio CD"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Lista odtwarzania"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(nieznany tytuł)"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Informacje o nagraniu"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Błędny URL"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Wtyczki"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Nieznany protokół URL"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Ogólne"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Błędna nazwa pliku"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efekty"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Zasługi"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Wizualizacja"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licencja"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Wejście"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Informacje o programie Audacious"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transport"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Czy chcesz trwale usunąć “%s”?"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Wykonawca"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Usuń"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Anuluj"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Tytuł"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Usuń listę odtwarzania"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Numer ścieżki"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Nie pytaj więcej"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Gatunek"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Zmień nazwę"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nazwa pliku"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Zmień nazwę listy odtwarzania"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Położenie pliku"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Podaj nazwę listy odtwarzania"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Data wydania"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Włącz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Rok wydania"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Komentarz"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Kodek"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Jakość"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Brak"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabski"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Bałtycki"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Chiński"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Grecki"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebrajski"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japoński"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Korektor graficzny"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Koreański"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Przedwzmacniacz"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polski"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Otwórz pliki"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Rosyjski"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Otwórz"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Tajwański"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Z_amknij okno po otwarciu"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turecki"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Dodaj pliki"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Typ zmiennopozycyjny"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Dodaj"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Ustawienia interfejsu</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Za_mknij okno po dodaniu"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Wtyczka interfejsu:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Zamknij"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "System dźwięku:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Tytuł"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Wyjście dźwięku</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Wykonawca"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Rozdzielczość bitowa:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Rozmiar bufora:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Gatunek"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Rok wydania"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Usuń przesterowania w nagraniach"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Utwór"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Użyj programowej regulacji głośności (niezalecane)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Długość"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Wyrównaj głośność</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Format:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Włącz wyrównywanie głośności"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Jakość:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Tryb albumu"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Przepływność bitowa:"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Zapobiegaj przesterowaniu (zalecane)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Dostrajanie</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Wzmocnij wszystkie pliki:"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Wzmocnij pliki bez etykiet:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Nazwa serwera:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Port serwera:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Użytkownik:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Hasło:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Konfiguracja serwera pośredniczącego</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Użyj serwera pośredniczącego"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Uwierzytelnianie"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Automatycznie wykryj kodowania dla:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Zapasowe kodowanie znaków:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Zachowanie</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Kontynuuj odtwarzanie po uruchomieniu programu"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Przejdź do następnej gdy usunę odtwarzaną ścieżkę"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Czyść listę odtwarzania podczas otwierania nowych plików"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Dodaj pliki do tymczasowej listy odtwarzania"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Opóźnij wczytywanie metadanych ścieżek do czasu odtworzenia"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Zgodność</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpretuj \\ (ukośnik wsteczny) jako separator folderów"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Okładka albumu</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Wyszukaj obrazy pasujące do tych słów (oddzielone przecinkiem):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Wyklucz obrazy pasujące do tych słów (oddzielone przecinkiem):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Wyszukaj obrazy pasujące do nazwy pliku utworu"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Wyszukaj rekurencyjnie"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Głębokość wyszukiwania:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Wyskakujące komunikaty</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Pokaż wyskakujące informacje"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Opóźnij wyskakujące komunikaty (dziesiąte sekundy):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Pokaż skalę czasową dla bieżącej ścieżki"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TYTUŁ"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "WYKONAWCA - TYTUŁ"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "WYKONAWCA - ALBUM - TYTUŁ"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "WYKONAWCA - ALBUM - NUMER ŚCIEŻKI. TYTUŁ"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "WYKONAWCA [ ALBUM ] - NUMER ŚCIEŻKI. TYTUŁ"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - TYTUŁ"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategoria"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Własny"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Wyświetlanie ścieżki</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Numery ścieżek"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Pokaż zera (02:00 zamiast 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Format tytułu:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Własny:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Ustawienia Audaciousa"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Nie można utworzyć katalogu (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Płyta Audio CD, ścieżka %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanał"
-msgstr[1] "%d kanały"
-msgstr[2] "%d kanałów"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Zasługi"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licencja"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Informacje o programie Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Czy chcesz trwale usunąć “%s”?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Usuń"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Usuń listę odtwarzania"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Nie pytaj więcej"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Zmień nazwę"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Zmień nazwę listy odtwarzania"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Podaj nazwę listy odtwarzania"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Włącz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Korektor graficzny"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Przedwzmacniacz"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Utwór"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Długość"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Format:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Jakość:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Przepływność bitowa:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "Blues"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Muzyka kameralna"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klasyczna"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
-msgstr "Przyjemne w odbiorze"
+msgstr "Lekka muzyka"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
-msgstr "Gospel"
+msgstr "Muzyka chrześcijańska"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
-msgstr "Hip-hop"
+msgstr "Hip hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock & Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Zapisano pomyślnie"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Błąd zapisu"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Informacje o nagraniu"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Artysta albumu"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Komentarz"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Numer nagrania"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Czyść pola podczas p_rzechodzenia do następnego utworu"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Zapisz"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Następne"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "Nie dotyczy"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Brak informacji dla %s. \n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Przejdź"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Przejdź do momentu"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Wprowadź czas (min:sek):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Nadpisać %s?"
-
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "D_odaj do kolejki"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "U_suń z kolejki"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Przejdź do ścieżki"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtr: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtr: "
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Zamknij przy zmianie _nagrania"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
-msgstr "_Nadpisz"
+msgstr "N_adpisz"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Potwierdź nadpisanie"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Nadpisać %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Eksportuj listę odtwarzania"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Eksportuj"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importuj listę odtwarzania"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Importuj"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Menedżer kolejki"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Wtyczki..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Usuń z kolejki"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "O Audaciousie %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Otwórz pliki"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "Ustawienia %s"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Otwórz"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "U_staw"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Z_amknij okno po otwarciu"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Ustawienia"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Dodaj pliki"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_O Audaciousie"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Dodaj"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Wygląd"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Za_mknij okno po dodaniu"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Dźwięk"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "D_odaj do kolejki"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Sieć"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "U_suń z kolejki"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Lista odtwarzania"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Przejdź do ścieżki"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Wtyczki"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtr: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Ogólne"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtr: "
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efekty"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Zamknij przy zmianie _nagrania"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Wizualizacja"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Menedżer list odtwarzania"
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Wejście"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Pozycje"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transport"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Nowa"
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Numer ścieżki"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "_Zmień nazwę"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Nazwa pliku"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Położenie pliku"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Data wydania"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Kodek"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Jakość"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Brak"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabski"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Bałtycki"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Chiński"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Grecki"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebrajski"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japoński"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Koreański"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polski"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Rosyjski"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Tajwański"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turecki"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Typ zmiennopozycyjny"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Ustawienia interfejsu</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Wtyczka interfejsu:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "System dźwięku:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Wyjście dźwięku</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Rozdzielczość bitowa:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Rozmiar bufora:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Usuń przesterowania w nagraniach"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Użyj programowej regulacji głośności (niezalecane)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Wyrównaj głośność</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Włącz wyrównywanie głośności"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Tryb albumu"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Zapobiegaj przesterowaniu (zalecane)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Dostrajanie</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Wzmocnij wszystkie pliki:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Wzmocnij pliki bez etykiet:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Nazwa serwera:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Port serwera:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Użytkownik:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Hasło:"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Odtwarzaj"
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Ustawienia sieciowe</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Za_mknięcie tego okna po aktywowaniu listy"
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Konfiguracja serwera pośredniczącego</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Użyj serwera pośredniczącego"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Uwierzytelnianie"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Automatycznie wykryj kodowania dla:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Zapasowe kodowanie znaków:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Zachowanie</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Wznów odtwarzanie przy starcie"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Wstrzymaj zamiast natychmiastowego wznowienia"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Przejdź do następnej gdy usunę odtwarzaną ścieżkę"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Czyść listę odtwarzania podczas otwierania nowych plików"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Dodaj pliki do tymczasowej listy odtwarzania"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Zgodność</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpretuj \\ (ukośnik wsteczny) jako separator folderów"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Wyświetlanie ścieżki</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Numery ścieżek"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Pokaż zera (02:00 zamiast 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Zaawansowane</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Opóźnij wczytywanie metadanych ścieżek do czasu odtworzenia"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Wykryj zawartość plików bez rozpoznanego rozszerzenia nazwy pliku"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Okładka albumu</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Wyszukaj obrazy pasujące do tych słów (oddzielone przecinkiem):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Wyklucz obrazy pasujące do tych słów (oddzielone przecinkiem):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Wyszukaj obrazy pasujące do nazwy pliku utworu"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Wyszukaj rekurencyjnie"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Głębokość wyszukiwania:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Wyskakujące komunikaty</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Pokaż wyskakujące informacje"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Opóźnij wyskakujące komunikaty (dziesiąte sekundy):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Pokaż skalę czasową dla bieżącej ścieżki"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TYTUŁ"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "WYKONAWCA - TYTUŁ"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "WYKONAWCA - ALBUM - TYTUŁ"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "WYKONAWCA - ALBUM - NUMER ŚCIEŻKI. TYTUŁ"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "WYKONAWCA [ ALBUM ] - NUMER ŚCIEŻKI. TYTUŁ"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - TYTUŁ"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategoria"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Własny"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Format tytułu:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Własny tekst:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Ustawienia Audaciousa"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Menedżer kolejki"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Usuń z kolejki"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Działanie..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Błąd"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Otwórz adres URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Dodaj adres URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Wprowadź URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Dalsze komunikaty zostały ukryte.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Otwórz katalog"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Dodaj katalog"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Otwórz"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Dodaj"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadane"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Kompozytor"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Wykonawca"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Rok nagrania"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Data nagrania"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Techniczne"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Typ MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Tempo bitowe"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Brak informacji dla %s. \n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Poziom"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nazwa pliku"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Linia"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Funkcja"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Wiadomość"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Dziennik programu"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Poziom dziennika:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Debugowanie"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Informacje"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Ostrzeżenie"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Wtyczki..."
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 8de745508f73..acbe517e1464 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -3,28 +3,30 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# salmora8 <shorterfire at gmail.com>, 2013
-# Cleiton cleitonlima <cleitoncfl at yahoo.com.br>, 2011
-# Cleiton cleitonlima <cleitoncfl at yahoo.com.br>, 2011
+# Alexandro Casanova <shorterfire at gmail.com>, 2012-2014
+# Cleber de Souza Corrêa <cscorrea at gmail.com>, 2014
+# Cleiton Lima <cleitoncfl at yahoo.com.br>, 2011
+# Cleiton Lima <cleitoncfl at yahoo.com.br>, 2011
+# Cleiton Lima <cleitoncfl at yahoo.com.br>, 2011
 # edu engler <eduengler at gmail.com>, 2012
-# habner <habnertc at msn.com>, 2013
-# habner <habnertc at msn.com>, 2013
+# Habner Costa <habnertc at msn.com>, 2013
+# Habner Costa <habnertc at msn.com>, 2013
 # jimmiemacedo <jimmie.macedo at gmail.com>, 2012
 # jimmiemacedo <jimmie.macedo at gmail.com>, 2012
 # Karen Eliot <kareneliot at riseup. net>, 2011
 # Rafael Ferreira <rafael.f.f1 at gmail.com>, 2012
 # Rodrigo Macedo <rodrigomacedo at rmsolucoeseminformatica.com>, 2012
-# salmora8 <shorterfire at gmail.com>, 2012-2013
-# salmora8 <shorterfire at gmail.com>, 2012
+# Alexandro Casanova <shorterfire at gmail.com>, 2012-2013
+# Alexandro Casanova <shorterfire at gmail.com>, 2012
 # vitorgatti <vitorgatti at yahoo.com.br>, 2012
 # vitorgatti <vitorgatti at yahoo.com.br>, 2012
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-26 15:53+0000\n"
+"Last-Translator: Alexandro Casanova <shorterfire at gmail.com>\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/"
 "audacious/language/pt_BR/)\n"
 "Language: pt_BR\n"
@@ -33,131 +35,139 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Procurando..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d arquivo encontrado"
-msgstr[1] "%d arquivos encontrados"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nova Lista de Reprodução"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
-msgstr ""
+msgstr "Mostrar ajuda de linha de comando"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Mostrar versão"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
-msgstr ""
+msgstr "Começar reprodução"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
-msgstr ""
+msgstr "Pausar reprodução"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pausar ou reproduzir"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
-msgstr ""
+msgstr "Parar reprodução"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
-msgstr ""
+msgstr "Pular para a música anterior"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
-msgstr ""
+msgstr "Pular para a próxima música"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Adicionar arquivo(s) à lista de reprodução"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
-msgstr ""
+msgstr "Adicionar arquivos para uma lista de reprodução temporária"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Mostrar janela principal"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
-msgstr ""
+msgstr "Exibir janela ir-para-o-som"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
-msgstr ""
+msgstr "Começar sem interface gráfica"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Sair ao parar a reprodução"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Imprimir mensagens de depuração"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Imprimir mensagens de depuração (pode ser usado duas vezes)"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Rodar em modo Qt"
+
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
-msgstr ""
+msgstr "Opção desconhecida: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
-msgstr ""
+msgstr "Opção desconhecida: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
+"Uso: audacious [OPCÃO] ... [ARQUIVO] ...\n"
+"\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Decodificador para %s não encontrado "
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d arquivo encontrado"
+msgstr[1] "%d arquivos encontrados"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s não pôde ser aberto."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nova Lista de Reprodução"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr ""
+msgid "Audio CD, track %s"
+msgstr "CD de Áudio, faixa %s"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(erro de codificação de caracteres)"
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Erro ao carregar plugin"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
 msgstr ""
+"Erro ao abrir %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Erro de reprodução desconhecido"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Formato de áudio inválido "
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Reproduzindo"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -165,889 +175,1055 @@ msgstr ""
 "A lista de reprodução não pode ser organizada porque a varredura de "
 "metadados ainda está em progresso (ou foi desabilitada)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
+"Não foi possível carregar  %s: extensão do nome do arquivo não suportado."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr ""
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Não foi possível salvar %s: extensão do nome do arquivo não suportado."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr ""
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Erro de busca"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr ""
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Formato de arquivo não reconhecido"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr ""
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Erro ao ler metadata"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Estéreo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d canal"
+msgstr[1] "%d canais"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr ""
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Faixa %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Áudio"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "CD de Áudio"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Rede"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(título desconhecido)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Lista de Reprodução"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "URI inválido"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Informações da Faixa"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Esquema de URI desconhecido"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Plugins"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Nome do arquivo inválido"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Geral"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Créditos"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efeito"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licença"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualização"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Sobre o Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Entrada"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Você quer remover “%s” permanentemente?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transportar"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Remover"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artista"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Cancelar"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Álbum"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Remover lista de reprodução"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Título"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Não perguntar novamente"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Número da faixa"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Renomear"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Gênero"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Renomear Lista de Reprodução"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nome do arquivo"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Como você gostaria de chamar esta lista de reprodução?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Localização"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Ativar"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Data"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Ano"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Comentário"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Qualidade"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Nenhum"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Árabe"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Báltico"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Chinês"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Grego"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebraico"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Equalizador"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japonês"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamplificação"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Coreano"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Abrir Arquivo(s)"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polonês"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Abrir"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Russo"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Fechar _diálogo ao abrir"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanês"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Adicionar Arquivo(s)"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turco"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Adicionar"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Ponto flutuante"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Fechar _diálogo ao adicionar"
+
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Fechar"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr ""
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Título"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr ""
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artista"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Plugin de saída:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Álbum"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Configuração de Saída</b>"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Gênero"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Profundidade de bit:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Ano"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Tamanho do armazenamento:"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Faixa"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Duração"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Recorte suave"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formato:"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Usar controle de volume de software (não recomendado)"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Qualidade:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>ReplayGain</b>"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bitrate:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Habilitar ReplayGain"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Modo álbum"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Evitar distorção (recomendado)"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambiente"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Ajustar Níveis</b>"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplificar todos os arquivos:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplificar arquivos não marcados:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Música de cámara"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Proxy hostname:"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "Clásica"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Porta:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Nome de usuário proxy:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Senha do proxy:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Configurações de Proxy</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Ativar o uso de proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Usar autenticação do proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Converter caracteres automaticamente para:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Códigos de caracteres de arquivos:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Comportamento</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Continuar reprodução ao iniciar"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Avançar quando a música atual for excluída"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Limpar lista de reprodução ao abrir arquivo(s)"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Abrir arquivo(s) em uma lista de reprodução temporária"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Não carregar metadados para as músicas até que sejam tocadas"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibilidade</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr ""
-"Interpretar o carácter \\ (barra invertida) como um indicador de nível na "
-"árvore de diretórios"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Imagem do Álbum</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Pesquisar imagens destas palavras (separado por vírgula):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Excluir imagens destas palavras (separado por vírgula):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Pesquisar imagens correspondentes ao nome do arquivo da música"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Pesquisar recursivamente"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Pesquisar profundidade:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Informações Pop-up</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Mostrar informações pop-up"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Atraso do pop-up (décimos de segundo):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Mostrar escala de tempo para a música atual"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TÍTULO"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTISTA - TÍTULO"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTISTA - ÁLBUM - TÍTULO"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTISTA - ÁLBUM - FAIXA. TÍTULO"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTISTA [ ÁLBUM ] - FAIXA. TÍTULO"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ÁLBUM - TÍTULO"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Categoria"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Personalizado"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Exibição do Arquivo</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Mostrar números das músicas"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Mostrar zero a esquerda (02:00 ao invés de 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Formato do título:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Formato personalizado:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Não foi possível criar diretório (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "CD de Áudio, faixa %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Estéreo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d canal"
-msgstr[1] "%d canais"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Créditos"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licença"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Sobre o Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Renomear Lista de Reprodução"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Ativar"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Equalizador"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamplificação"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Faixa"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Duração"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambiente"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Música de cámara"
-
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "Clásica"
-
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Fácil de escutar"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
-msgstr ""
+msgstr "Salvo com sucesso"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
-msgstr ""
+msgstr "Erro ao salvar"
 
-#: src/libaudgui/infowin.c:359
-msgid "Track Number"
-msgstr ""
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Informações da Faixa"
 
-#: src/libaudgui/infowin.c:367
-msgid "_Save"
-msgstr ""
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Álbum Artista"
 
-#: src/libaudgui/infowin.c:418
-#, c-format
-msgid "%d kb/s"
-msgstr "%d kb/s"
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Comentário"
 
-#: src/libaudgui/infowin.c:423
-msgid "N/A"
-msgstr ""
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
+msgid "Track Number"
+msgstr "Número da faixa"
+
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Lim_par campos ao mover para o próximo som"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
+msgid "_Save"
+msgstr "_Salvar"
+
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Próxima"
 
-#: src/libaudgui/infowin.c:453
+#: src/libaudgui/infowin.cc:455
 #, c-format
-msgid "No info available for %s.\n"
-msgstr "Nenhuma informação disponível para %s.\n"
+msgid "%d kb/s"
+msgstr "%d kb/s"
 
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/infowin.cc:460
+msgid "N/A"
+msgstr "N/A"
+
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
-msgstr ""
+msgstr "_Pular"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Avançar Tempo até"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Digite o tempo (minutos:segundos):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Substituir %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Inserir na fila"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "_Remover da fila"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Pular para Música"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtro:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtro:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "F_echar ao saltar"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
-msgstr ""
+msgstr "_Sobrescrever"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
-msgstr ""
+msgstr "Confirmar Sobrescrever"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Substituir %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Exportar Lista de Reprodução"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
-msgstr ""
+msgstr "_Exportar"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importar Lista de Reprodução"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
-msgstr ""
+msgstr "_Importar"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Gerenciador de Fila"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Plugins ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr ""
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Sobre %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Abrir Arquivo(s)"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Ajustes"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr ""
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Definir"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr ""
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Configurações"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Adicionar Arquivo(s)"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Sobre"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Aparência"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Áudio"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Inserir na fila"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Rede"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "_Remover da fila"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Lista de Reprodução"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Pular para Música"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Plugins"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtro:"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Geral"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtro:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efeito"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualização"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Entrada"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Editor de Lista de Reprodução"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transportar"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Número da faixa"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Entradas"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Nome do arquivo"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Diretório do arquivo"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Data"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codec"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Qualidade"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Nenhum"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Árabe"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Báltico"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Chinês"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Grego"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebraico"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japonês"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Coreano"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polonês"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Russo"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanês"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turco"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Ponto flutuante"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Ajustes de Interface</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Plugin de interface:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Plugin de saída:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Configuração de Saída</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Profundidade de bit:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Tamanho do armazenamento:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Recorte suave"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Usar controle de volume de software (não recomendado)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>ReplayGain</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Habilitar ReplayGain"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Modo álbum"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Evitar distorção (recomendado)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Ajustar Níveis</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplificar todos os arquivos:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplificar arquivos não marcados:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Proxy hostname:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Porta:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Nome de usuário proxy:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Senha do proxy:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Ajustes de Rede</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Configurações de Proxy</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Ativar o uso de proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Usar autenticação do proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Converter caracteres automaticamente para:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Códigos de caracteres de arquivos:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Comportamento</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Retomar lista de reprodução ao iniciar"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Pausar em vez de retomar imediatamente"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Avançar quando a música atual for excluída"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Limpar lista de reprodução ao abrir arquivo(s)"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Abrir arquivo(s) em uma lista de reprodução temporária"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibilidade</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
 msgstr ""
+"Interpretar o carácter \\ (barra invertida) como um indicador de nível na "
+"árvore de diretórios"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Exibição do Arquivo</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Mostrar números das músicas"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Mostrar zero a esquerda (02:00 ao invés de 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Avançado</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Não carregar metadados para as músicas até que sejam tocadas"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
 msgstr ""
+"Examinar conteúdo de arquivos sem extensão de nome de arquivo reconhecido"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Fechar janela ao ativar lista de reprodução"
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Imagem do Álbum</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Pesquisar imagens destas palavras (separado por vírgula):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Excluir imagens destas palavras (separado por vírgula):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Pesquisar imagens correspondentes ao nome do arquivo da música"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Pesquisar recursivamente"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Pesquisar profundidade:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Informações Pop-up</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Mostrar informações pop-up"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Atraso do pop-up (décimos de segundo):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Mostrar escala de tempo para a música atual"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTISTA - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTISTA - ÁLBUM - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTISTA - ÁLBUM - FAIXA. TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTISTA [ ÁLBUM ] - FAIXA. TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ÁLBUM - TÍTULO"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Categoria"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Personalizado"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Formato do título:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Formato personalizado:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Ajustes do Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Gerenciador de Fila"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Retirar da fila"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Trabalhando ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Erro"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Abrir URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Adicionar URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Digite a URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Demais mensagens foram escondidas.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Abrir Pasta"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Adicionar Pasta"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Abrir"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Adicionar"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadados"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Compositor"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Artista"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Ano"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Data"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Técnico"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Tipo de MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Nenhuma informação disponível para %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Nível"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nome do arquivo"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Linha"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Função"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Mensagem"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Registro inspetor"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Nível de Registro:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Depuração"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Informações"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Aviso"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Plugins ..."
diff --git a/po/pt_PT.po b/po/pt_PT.po
index debaadca1169..be7af2a279ab 100644
--- a/po/pt_PT.po
+++ b/po/pt_PT.po
@@ -3,6 +3,7 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
+# Alexandro Casanova <shorterfire at gmail.com>, 2012
 # Pitxyoki <Pitxyoki at gmail.com>, 2010
 # Pitxyoki <Pitxyoki at gmail.com>, 2010
 # Alexandro Casanova <shorterfire at gmail.com>, 2012
@@ -13,8 +14,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-06-27 08:41+0000\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 13:24+0000\n"
 "Last-Translator: Sérgio Marques <smarquespt at gmail.com>\n"
 "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/"
 "audacious/language/pt_PT/)\n"
@@ -24,96 +25,81 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "A procurar..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d ficheiro encontrado."
-msgstr[1] "%d ficheiros encontrados."
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nova lista de reprodução"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Erro"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Mostrar ajuda da linha de comandos"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Mostrar versão"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Iniciar reprodução"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Pausar reprodução"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pausar se em reprodução. Caso contrário, reproduzir."
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Parar reprodução"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Ir para a faixa anterior"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Ir para a próxima faixa"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Adicionar ficheiros à lista de reprodução"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Adicionar ficheiros a uma lista de reprodução temporária"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Mostrar janela principal"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Mostrar janela Ir para a faixa"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Iniciar sem interface gráfica"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Sair ao parar a reprodução"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Imprimir mensagens de depuração"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Imprimir mensagens de depuração (pode ser usado duas vezes)"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Executar em modo Qt"
+
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Opção desconhecida: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Opção desconhecida: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -122,35 +108,56 @@ msgstr ""
 "Utilização: audacious [OPÇÃO] ... [FICHEIRO] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Não foi encontrado o descodificador para %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d ficheiro encontrado."
+msgstr[1] "%d ficheiros encontrados."
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s não pode ser aberto."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nova lista de reprodução"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Não foi possível carregar %s: ficheiro não suportado."
+msgid "Audio CD, track %s"
+msgstr "CD áudio, faixa %s"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(erro de codificação de caracteres)"
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Erro ao carregar suplemento"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Não foi possível gravar %s: ficheiro não suportado."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Erro ao abrir %s:\n"
+"%s"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Erro desconhecido de reprodução"
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Formato áudio inválido"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "A reproduzir"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -158,887 +165,1053 @@ msgstr ""
 "A lista de reprodução não pode ser ordenada porque a análise de detalhes "
 "ainda está a decorrer (ou inativa)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Sobre"
-
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Definições"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Não foi possível carregar %s: extensão de ficheiro não suportada."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Definir"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Não foi possível gravar %s: extensão de ficheiro não suportada."
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Cancelar"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Erro de procura"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "Fe_char"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Formato de ficheiro não reconhecido"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "Definiçõe_s"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Erro ao ler meta-dados"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "S_obre"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "E_xtras..."
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Estéreo"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Aparência"
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d canal"
+msgstr[1] "%d canais"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Áudio"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Faixa %d"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Rede"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "CD áudio"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Lista de reprodução"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(título desconhecido)"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Informações da faixa"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "URI inválido"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Extras"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Esquema URI desconhecido"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Geral"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Nome de ficheiro inválido"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efeitos"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Créditos"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualizações"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licença"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Reprodução"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Sobre o Audacious"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transporte"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Pretende eliminar \"%s\" permanentemente?"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artista"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Remover"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Álbum"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Cancelar"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Título"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Remover lista de reprodução"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "N.º da faixa"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Não perguntar novamente"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Género"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "Muda_r nome"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Nome do ficheiro"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Mudar nome da lista de reprodução"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Caminho do ficheiro"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Gostaria de invocar esta lista de reprodução?"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Data"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Ativar"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Ano"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Comentário"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codificador"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Qualidade"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Nenhum"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Árabe"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Báltico"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Mandarim"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Grego"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebraico"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japonês"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Equalizador"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Coreano"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Amplificador"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polaco"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Abrir ficheiros"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Russo"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Abrir"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanês"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Fechar _diálogo ao abrir"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turco"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Adicionar ficheiros"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Vírgula flutuante"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Adicionar"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Definições de interface</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Fechar _diálogo ao Adicionar"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Extra de interface:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "Fe_char"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Suplemento de som:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Título"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Definições de som</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artista"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Profundidade:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Álbum"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Buffer:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Género"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Ano"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Distorção suave"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Faixa"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Utilizar controlo de volume do programa (não recomendado)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Duração"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Replay Gain</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formato:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Ativar replay gain"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Qualidade:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Modo de álbum"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Taxa de dados:"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Prevenir distorção (recomendado)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Ajustar níveis</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplificar todos os ficheiros:"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambiente"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplificar ficheiros sem \"tags\":"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Nome do proxy:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Porta do proxy:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Música de câmara"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Nome de utilizador do proxy:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Senha do proxy:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Configuração do proxy</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Ativar utilização do proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Utilizar autenticação do proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Deteção automática da codificação de caracteres para:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Codificação alternativa de caracteres:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Comportamento</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Retomar reprodução ao iniciar"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Avançar ao eliminar a faixa atual"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Limpar lista de reprodução ao abrir ficheiros"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Abrir ficheiros numa lista de reprodução temporária"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Não carregar detalhes da faixa antes da reprodução"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibidade</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpretar \\ (barra invertida) como delimitador de pastas"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Imagem do álbum</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Procurar imagens que tenham estas palavras (separadas por vírgula):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Excluir imagens que tenham estas palavras (separadas por vírgula):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Procurar imagens concidentes com o nome do ficheiro"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Procurar recursivamente"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Extensão da procura:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Alertas de informação</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Mostrar alertas"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Atraso do alerta (décimas de segundo):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Mostrar escala de tempo da faixa atual"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "Título"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "Artista - Título"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "Artista - Álbum - Título"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "Artista - Álbum - Faixa. Título"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "Artista [Álbum] - Faixa. Título"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "Álbum - Título"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Categoria"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Personalizado"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Exibição de faixas</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Mostrar número da faixa"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Mostrar zeros (02:00 em vez de 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Formato do título:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Linha personalizada:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Definições do Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Não foi possível criar o diretório (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "CD áudio, faixa %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Estéreo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d canal"
-msgstr[1] "%d canais"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Créditos"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licença"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Sobre o Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Pretende eliminar %s permanentemente?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Remover"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Remover lista de reprodução"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Não perguntar novamente"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "Muda_r nome"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Mudar nome da lista de reprodução"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Gostaria de invocar esta lista de reprodução?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Ativar"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Equalizador"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Amplificador"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Faixa"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Duração"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Formato:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Qualidade:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Taxa de dados:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambiente"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Música de câmara"
-
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Clássica"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Música ligeira"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Gravação efetuada"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Erro de gravação"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Informações da faixa"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Artista do álbum"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Comentário"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Número da faixa"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Limpa_r campos ao mover para a faixa seguinte"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Gravar"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "Segui_nte"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/D"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Sem informações para %s\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Ir para faixa"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Ir para posição temporal"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Indique o tempo (minutos:segundos):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Substituir %s?"
-
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Colocar na fila"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "_Retirar da fila"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Ir para a faixa"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtro: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtro:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Fec_har ao ir para a faixa"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_Substituir"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Confirmação de substituição"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Substituir %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Exportar lista de reprodução"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Exportar"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importar lista de reprodução"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Importar"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Gestão de fila de reprodução"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "E_xtras..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Remover da fila"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Sobre o %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Abrir ficheiros"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "Definições de %s"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Abrir"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Definir"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Fechar _diálogo ao abrir"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "Definiçõe_s"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Adicionar ficheiros"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "S_obre"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Adicionar"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Aparência"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Fechar _diálogo ao Adicionar"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Áudio"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Colocar na fila"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Rede"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "_Retirar da fila"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Lista de reprodução"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Ir para a faixa"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Extras"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtro: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Geral"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtro:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efeitos"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Fec_har ao ir para a faixa"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualizações"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Gestão de lista de reprodução"
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Reprodução"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Entradas"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transporte"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Número da faixa"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Nova"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Nome de ficheiro"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Mud_ar nome"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Caminho de ficheiro"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "Re_produzir"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Data"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Fe_char diálogo ao ativar lista de reprodução"
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codificador"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Qualidade"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Nenhum"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Árabe"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Báltico"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Mandarim"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Grego"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebraico"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japonês"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Coreano"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polaco"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Russo"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanês"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turco"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Vírgula flutuante"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Definições de interface</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Extra de interface:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Suplemento de som:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Definições de som</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Profundidade:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Memória:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Distorção suave"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Utilizar controlo de volume do programa (não recomendado)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Replay Gain</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Ativar replay gain"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Modo de álbum"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Prevenir distorção (recomendado)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Ajustar níveis</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplificar todos os ficheiros:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplificar ficheiros sem \"tags\":"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Nome do proxy:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Porta do proxy:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Nome de utilizador do proxy:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Senha do proxy:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Definições de rede</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Configuração do proxy</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Ativar utilização do proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Utilizar autenticação do proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Deteção automática da codificação de caracteres para:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Codificação alternativa de caracteres:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Comportamento</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Retomar reprodução ao iniciar"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Pausa em vez de retomar imediatamente"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Avançar ao eliminar a faixa atual"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Limpar lista de reprodução ao abrir ficheiros"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Abrir ficheiros numa lista de reprodução temporária"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibidade</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpretar \\ (barra invertida) como delimitador de pastas"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Exibição de faixas</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Mostrar número da faixa"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Mostrar zeros (02:00 em vez de 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Avançado</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Não carregar detalhes da faixa antes da reprodução"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+"Testar conteúdo dos ficheiros que não tenham uma extensão de ficheiro "
+"reconhecida"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Imagem do álbum</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Procurar imagens que tenham estas palavras (separadas por vírgula):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Excluir imagens que tenham estas palavras (separadas por vírgula):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Procurar imagens concidentes com o nome do ficheiro"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Procurar recursivamente"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Extensão da procura:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Alertas de informação</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Mostrar alertas"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Atraso do alerta (décimas de segundo):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Mostrar escala de tempo da faixa atual"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "Título"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "Artista - Título"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "Artista - Álbum - Título"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "Artista - Álbum - Faixa. Título"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "Artista [Álbum] - Faixa. Título"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "Álbum - Título"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Categoria"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Personalizado"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Formato do título:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Linha personalizada:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Definições do Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Gestão de fila de reprodução"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Remover da fila"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Execução..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Erro"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Abrir URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Adicionar URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Indique o URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Foram ocultas algumas mensagens.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Abrir pasta"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Adicionar pasta"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Abrir"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Adicionar"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Detalhes"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Compositor"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Intérprete"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Ano de gravação"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Data de gravação"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Técnico"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Tipo MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Taxa de dados"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Sem informações para %s\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Nível"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Nome do ficheiro"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Linha"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Função"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Mensagem"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Inspetor de registos"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Nível de registo:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Depuração"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Info"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Aviso"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Suplementos..."
diff --git a/po/ro.po b/po/ro.po
index 15279cf1a7d4..c5e264699fa3 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -3,6 +3,9 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
+# corneliu.e <corneliueva at yahoo.com>, 2014
+# corneliu.e <corneliueva at yahoo.com>, 2014
+# Emil Ungurean <emil.ungurean at gmail.com>, 2014
 # xyz32 <oanaradu32 at yahoo.com>, 2013
 # Warui-chan <>, 2012
 # Warui-chan <>, 2012
@@ -11,9 +14,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Romanian (http://www.transifex.com/projects/p/audacious/"
 "language/ro/)\n"
 "Language: ro\n"
@@ -23,1017 +26,1189 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
 "2:1));\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Cautare ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d fisiere gasite"
-msgstr[1] "%d fisiere gasite"
-msgstr[2] "%d fisiere gasite"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nouă Listă de redare"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
-msgstr "Arata versiunea"
+msgstr "Arată versiunea"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
-msgstr ""
+msgstr "Redă"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
-msgstr ""
+msgstr "Pauză"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
-msgstr "Pauză daca se redă, redare altfel"
+msgstr "Pauză dacă se redă, redare altfel"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
-msgstr ""
+msgstr "Oprește redarea"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
-msgstr ""
+msgstr "Sari la melodia anterioară"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
-msgstr ""
+msgstr "Sari la melodia următoare"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
-msgstr "Adauga fisiere la lista de redare"
+msgstr "Adaugă fișiere la lista de redare"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
-msgstr ""
+msgstr "Adaugă fișiere la o listă de redare temporară"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Arată fereastra principală"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
-msgstr ""
+msgstr "Pornește fără o interfață grafică"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
+msgstr "Închidere la oprirea redării"
+
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
 msgstr ""
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Afișeaza mesajele de depanare"
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
-msgstr ""
+msgstr "Opțiune necunoscută: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
-msgstr ""
+msgstr "Opțiune necunoscută: %c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Nu sa găsit decodor pentru %s"
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d fisiere gasite"
+msgstr[1] "%d fisiere gasite"
+msgstr[2] "%d fișiere găsite"
+
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Listă de redare nouă"
 
-#: src/audacious/playback.c:387
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "%s could not be opened."
+msgid "Audio CD, track %s"
+msgstr "Audio CD, pista %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
 msgstr ""
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Eroare încărcare plugin"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
 msgstr ""
+"Eroare la deschiderea %s:\n"
+"%s"
 
-#: src/audacious/playlist-files.c:185
-#, c-format
-msgid "Cannot save %s: unsupported file extension."
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Eroare necunoscută de redare"
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr ""
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr ""
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Format fişier necunoscut"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d canal"
+msgstr[1] "%d canale"
+msgstr[2] "%d canale"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr ""
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Pista %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Audio"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Audio CD"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Retea"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(titlu necunoscut)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Playlist"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "URI Invalid"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Plugin-uri"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "General"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Credite"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efect"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licență"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Vizualizare"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Despre Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Intrare"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Eşti sigur că vrei să elimini definitiv \"%s\"?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Transport"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Elimină"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artist"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Anulare"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Elimină Lista de redare"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Titlu"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Nu mai întreba"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Numărul Track-ului"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Redenumeşte"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Genul"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Redenumeste Lista de redare"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Fișier"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Calea spre fișier"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Permite"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Data"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Anul"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Comentariu"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Calitate"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Nici unul"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabic"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltic"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Chinezesc"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Grec"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Ebraică"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Egalizator"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japoneză"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Koreană"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Deschide Fișiere"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Poloneză"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Deschide"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Rusă"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwaneză"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Adaugă Fișiere"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turcă"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Adaugă"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr ""
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Închidere"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr ""
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Titlu"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Plugin de iesire:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artist"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Setări Ieşire</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Adâncime bit:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Genul"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Mărimea Buffer-ului:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "An"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Pista"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr ""
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Lungime"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Controlează volumul la nivel software (nu este recomandat)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Format:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Amplificare la redare</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Calitate:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Activeaza amplificarea la redare"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bitrate:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Mod album"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Previne suprapunerea (recomandat)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Ajustați nivelele</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplifică toate fişierele:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplifică fișiere neetichetate"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Adresa sau numele:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Muzică de cameră"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Port-ul:"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "Clasic"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Utilizator:"
+#: src/libaudgui/infowin.cc:91
+msgid "Country"
+msgstr "Country"
 
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Parolă:"
+#: src/libaudgui/infowin.cc:92
+msgid "Death Metal"
+msgstr "Death Metal"
 
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Configurarea Proxy-ului</b>"
+#: src/libaudgui/infowin.cc:93
+msgid "Disco"
+msgstr "Disco"
 
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Activează proxy"
+#: src/libaudgui/infowin.cc:94
+msgid "Easy Listening"
+msgstr "Easy Listening"
 
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Folosește autentificarea"
+#: src/libaudgui/infowin.cc:95
+msgid "Folk"
+msgstr "Folk"
 
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Detecție automată a codificării caracterelor pentru:"
+#: src/libaudgui/infowin.cc:96
+msgid "Funk"
+msgstr "Funk"
 
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Setări de rezervă pentru codificările caracterelor"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Comportament</b>"
+#: src/libaudgui/infowin.cc:97
+msgid "Gangsta Rap"
+msgstr "Gangsta Rap"
 
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Continuă redarea la pornire"
+#: src/libaudgui/infowin.cc:98
+msgid "Gospel"
+msgstr "Evanghelic"
 
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Avansează dacă melodia curentă este ștearsă"
+#: src/libaudgui/infowin.cc:99
+msgid "Grunge"
+msgstr "Grunge"
 
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Golește lista de redare la deschiderea de noi fișiere"
+#: src/libaudgui/infowin.cc:100
+msgid "Hard Rock"
+msgstr "Hard Rock"
 
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Deschideti fisierele intr-o lista de redare temporara"
+#: src/libaudgui/infowin.cc:101
+msgid "Heavy Metal"
+msgstr "Heavy Metal"
 
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Nu încărca metadata melodiilor decât la momentul redării"
+#: src/libaudgui/infowin.cc:102
+msgid "Hip-hop"
+msgstr "Hip-hop"
 
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Compatibilitate</b>"
+#: src/libaudgui/infowin.cc:103
+msgid "House"
+msgstr "House"
 
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr ""
+#: src/libaudgui/infowin.cc:104
+msgid "Jazz"
+msgstr "Jazz"
 
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr ""
+#: src/libaudgui/infowin.cc:105
+msgid "Jungle"
+msgstr "Jungle"
 
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr ""
+#: src/libaudgui/infowin.cc:106
+msgid "Metal"
+msgstr "Metal"
 
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr ""
+#: src/libaudgui/infowin.cc:107
+msgid "New Age"
+msgstr "New Age"
 
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr ""
+#: src/libaudgui/infowin.cc:108
+msgid "New Wave"
+msgstr "New Wave"
 
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Caută recursiv"
+#: src/libaudgui/infowin.cc:109
+msgid "Noise"
+msgstr "Zgomot"
 
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr ""
+#: src/libaudgui/infowin.cc:110
+msgid "Pop"
+msgstr "Pop"
 
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Popup cu Informații</b>"
+#: src/libaudgui/infowin.cc:111
+msgid "Punk Rock"
+msgstr "Punk Rock"
 
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr ""
+#: src/libaudgui/infowin.cc:112
+msgid "Rap"
+msgstr "Rap"
 
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr ""
+#: src/libaudgui/infowin.cc:113
+msgid "Reggae"
+msgstr "Reggae"
 
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr ""
+#: src/libaudgui/infowin.cc:114
+msgid "Rock"
+msgstr "Rock"
 
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TITLU"
+#: src/libaudgui/infowin.cc:115
+msgid "Rock and Roll"
+msgstr "Rock & Roll"
 
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTIST - TITLU"
+#: src/libaudgui/infowin.cc:116
+msgid "Rhythm and Blues"
+msgstr "Rhythm and Blues"
 
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTIST - ALBUM - TITLU"
+#: src/libaudgui/infowin.cc:117
+msgid "Ska"
+msgstr "Ska"
 
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTIST - ALBUM - SEMN. TITLU"
+#: src/libaudgui/infowin.cc:118
+msgid "Soul"
+msgstr "Soul"
 
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTIST [ ALBUM ] - SEMN. TITLU"
+#: src/libaudgui/infowin.cc:119
+msgid "Swing"
+msgstr "Swing"
 
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - TITLU"
+#: src/libaudgui/infowin.cc:120
+msgid "Techno"
+msgstr "Techno"
 
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Categorie"
+#: src/libaudgui/infowin.cc:121
+msgid "Trip-hop"
+msgstr "Trip-hop"
 
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Personalizat"
+#: src/libaudgui/infowin.cc:227
+msgid "Save successful"
+msgstr "Salvare efectuată cu succes"
 
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Vizualizarea melodiei</b>"
+#: src/libaudgui/infowin.cc:231
+msgid "Save error"
+msgstr "Eroare la salvare"
 
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Show song numbers"
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Informații despre melodie"
 
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Prefixează cu un zero (02:00 în loc de 2:00)"
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Artist Album"
 
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Formatul titlului:"
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Comentariu"
 
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Format specificat:"
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
+msgid "Track Number"
+msgstr "Număr pistă"
 
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
 msgstr ""
 
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Nu s-a putut crea directorul (%s): %s\n"
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
+msgid "_Save"
+msgstr "_Salvează"
+
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Următorul"
 
-#: src/libaudcore/audstrings.c:385
+#: src/libaudgui/infowin.cc:455
 #, c-format
-msgid "Audio CD, track %s"
+msgid "%d kb/s"
+msgstr "%d kb/s"
+
+#: src/libaudgui/infowin.cc:460
+msgid "N/A"
+msgstr "N/A"
+
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
+msgid "_Jump"
+msgstr "_Sari"
+
+#: src/libaudgui/jump-to-time.cc:51
+msgid "Jump to Time"
+msgstr "Sari la Timp"
+
+#: src/libaudgui/jump-to-time.cc:51
+msgid "Enter time (minutes:seconds):"
+msgstr "Introdu timp (minute:secunde):"
+
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Adaugă la coadă"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Scoate din coadă"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Sari la Melodie"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtru: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtru:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
 msgstr ""
 
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
+#: src/libaudgui/playlists.cc:89
+msgid "_Overwrite"
+msgstr "_Suprascrie"
 
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
+#: src/libaudgui/playlists.cc:93
+msgid "Confirm Overwrite"
+msgstr "Confirmă Suprascrierea"
 
-#: src/libaudcore/tuple.c:446
+#: src/libaudgui/playlists.cc:93
 #, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d canal"
-msgstr[1] "%d canale"
-msgstr[2] "%d canale"
+msgid "Overwrite %s?"
+msgstr "Suprascrie %s?"
 
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Credite"
+#: src/libaudgui/playlists.cc:123
+msgid "Export Playlist"
+msgstr "Exportă Lista de redare"
 
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licență"
+#: src/libaudgui/playlists.cc:124
+msgid "_Export"
+msgstr "_Exportă"
 
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Despre Audacious"
+#: src/libaudgui/playlists.cc:130
+msgid "Import Playlist"
+msgstr "Importă Lista de redare"
+
+#: src/libaudgui/playlists.cc:131
+msgid "_Import"
+msgstr "_Importă"
 
-#: src/libaudgui/confirm.c:51
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Plugin-uri..."
+
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
 #, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
+msgid "About %s"
+msgstr "Despre %s"
 
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Setări"
 
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Stabileşte"
+
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Setări"
+
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Despre"
+
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Aspect"
+
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audio"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Rețea"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Listă de redare"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Plugin-uri"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "General"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efect"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Vizualizare"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Intrare"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transport"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
 msgstr ""
 
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
 msgstr ""
 
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Redenumeste Lista de redare"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Dată"
 
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codec"
 
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Calitate"
 
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Niciunul"
 
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabic"
 
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltic"
 
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Chinezesc"
 
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Grec"
 
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Ebraică"
 
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japoneză"
 
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Koreană"
 
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Poloneză"
 
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Rusă"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwaneză"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turcă"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Virgulă mobilă"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Setări interfață</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Plugin interfaţă:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Plugin de ieșire:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Setări Ieşire</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Adâncime bit:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Mărimea Buffer-ului:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Controlează volumul la nivel software (nu este recomandat)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Amplificare la redare</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Activează amplificarea la redare"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Mod album"
 
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Egalizator"
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Previne suprapunerea (recomandat)"
 
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Ajustați nivelele</b>"
 
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplifică toate fişierele:"
 
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
 
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplifică fișiere neetichetate"
 
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Adresa sau numele:"
 
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Portul pentru proxy:"
 
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Utilizator proxy:"
 
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Parolă proxy:"
 
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Setări de reţea</b>"
 
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
 
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Configurarea Proxy-ului</b>"
 
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Activează proxy"
 
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Folosește autentificarea"
 
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "Clasic"
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Detecție automată a codificării caracterelor pentru:"
 
-#: src/libaudgui/infowin.c:84
-msgid "Country"
-msgstr "Country"
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Setări de rezervă pentru codificările caracterelor"
 
-#: src/libaudgui/infowin.c:85
-msgid "Death Metal"
-msgstr "Death Metal"
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Comportament</b>"
 
-#: src/libaudgui/infowin.c:86
-msgid "Disco"
-msgstr "Disco"
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Continuă redare la pornire"
 
-#: src/libaudgui/infowin.c:87
-msgid "Easy Listening"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Pauză în loc de redare imediată"
 
-#: src/libaudgui/infowin.c:88
-msgid "Folk"
-msgstr "Folk"
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Avansează dacă melodia curentă este ștearsă"
 
-#: src/libaudgui/infowin.c:89
-msgid "Funk"
-msgstr "Funk"
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Golește lista de redare la deschiderea de noi fișiere"
 
-#: src/libaudgui/infowin.c:90
-msgid "Gangsta Rap"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Deschide fișierele într-o listă de redare temporară"
 
-#: src/libaudgui/infowin.c:91
-msgid "Gospel"
-msgstr "Evanghelic"
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Compatibilitate</b>"
 
-#: src/libaudgui/infowin.c:92
-msgid "Grunge"
-msgstr "Grunge"
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Consideră \\ (backward slash) ca delimitator de directoare"
 
-#: src/libaudgui/infowin.c:93
-msgid "Hard Rock"
-msgstr "Hard Rock"
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Vizualizarea melodiei</b>"
 
-#: src/libaudgui/infowin.c:94
-msgid "Heavy Metal"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Show song numbers"
 
-#: src/libaudgui/infowin.c:95
-msgid "Hip-hop"
-msgstr "Hip-hop"
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Prefixează cu un zero (02:00 în loc de 2:00)"
 
-#: src/libaudgui/infowin.c:96
-msgid "House"
-msgstr "House"
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Avansat</b>"
 
-#: src/libaudgui/infowin.c:97
-msgid "Jazz"
-msgstr "Jazz"
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Nu încărca metadata melodiilor decât la momentul redării"
 
-#: src/libaudgui/infowin.c:98
-msgid "Jungle"
-msgstr "Jungle"
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
 
-#: src/libaudgui/infowin.c:99
-msgid "Metal"
-msgstr "Metal"
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Album Art</b>"
 
-#: src/libaudgui/infowin.c:100
-msgid "New Age"
-msgstr "New Age"
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Caută imagini care se potrivesc cu cuvintele (comma-separated):"
 
-#: src/libaudgui/infowin.c:101
-msgid "New Wave"
-msgstr "New Wave"
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Exclude imaginile care se potrivesc cu cuvintele (comma-separated):"
 
-#: src/libaudgui/infowin.c:102
-msgid "Noise"
-msgstr "Zgomot"
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Caută imagini care se potrivesc cu numele de fişier al melodiei"
 
-#: src/libaudgui/infowin.c:103
-msgid "Pop"
-msgstr "Pop"
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Caută recursiv"
 
-#: src/libaudgui/infowin.c:104
-msgid "Punk Rock"
-msgstr "Punk Rock"
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Adâncime de căutare:"
 
-#: src/libaudgui/infowin.c:105
-msgid "Rap"
-msgstr "Rap"
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Popup cu Informații</b>"
 
-#: src/libaudgui/infowin.c:106
-msgid "Reggae"
-msgstr "Reggae"
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Arată informaţie popup"
 
-#: src/libaudgui/infowin.c:107
-msgid "Rock"
-msgstr "Rock"
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Întârziere popup (zecimi de secundă)"
 
-#: src/libaudgui/infowin.c:108
-msgid "Rock and Roll"
-msgstr "Rock & Roll"
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Arată scala de timp pentru melodia curentă"
 
-#: src/libaudgui/infowin.c:109
-msgid "Rhythm and Blues"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TITLU"
 
-#: src/libaudgui/infowin.c:110
-msgid "Ska"
-msgstr "Ska"
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTIST - TITLU"
 
-#: src/libaudgui/infowin.c:111
-msgid "Soul"
-msgstr "Soul"
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTIST - ALBUM - TITLU"
 
-#: src/libaudgui/infowin.c:112
-msgid "Swing"
-msgstr "Swing"
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTIST - ALBUM - SEMN. TITLU"
 
-#: src/libaudgui/infowin.c:113
-msgid "Techno"
-msgstr "Techno"
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTIST [ ALBUM ] - SEMN. TITLU"
 
-#: src/libaudgui/infowin.c:114
-msgid "Trip-hop"
-msgstr "Trip-hop"
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - TITLU"
 
-#: src/libaudgui/infowin.c:220
-msgid "Save successful"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Categorie"
 
-#: src/libaudgui/infowin.c:224
-msgid "Save error"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Personalizat"
 
-#: src/libaudgui/infowin.c:359
-msgid "Track Number"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Formatul titlului:"
 
-#: src/libaudgui/infowin.c:367
-msgid "_Save"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Format specificat:"
 
-#: src/libaudgui/infowin.c:418
-#, c-format
-msgid "%d kb/s"
-msgstr "%d kb/s"
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Setări Audacious"
 
-#: src/libaudgui/infowin.c:423
-msgid "N/A"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
-msgid "_Jump"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
-msgid "Jump to Time"
-msgstr "Sări la Timp"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Eroare"
 
-#: src/libaudgui/jump-to-time.c:52
-msgid "Enter time (minutes:seconds):"
-msgstr ""
+#: src/libaudgui/url-opener.cc:49
+msgid "Open URL"
+msgstr "Deschide URL"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Suprascrie %s?"
+#: src/libaudgui/url-opener.cc:55
+msgid "Add URL"
+msgstr "Adaugă URL"
 
-#: src/libaudgui/playlists.c:88
-msgid "_Overwrite"
-msgstr ""
+#: src/libaudgui/url-opener.cc:79
+msgid "Enter URL:"
+msgstr "Introdu URL:"
 
-#: src/libaudgui/playlists.c:92
-msgid "Confirm Overwrite"
+#: src/libaudgui/util.cc:154
+msgid ""
+"\n"
+"(Further messages have been hidden.)"
 msgstr ""
+"\n"
+"(Mesajele următoare au fost ascunse.)"
 
-#: src/libaudgui/playlists.c:121
-msgid "Export Playlist"
-msgstr "Exportă Lista de redare"
-
-#: src/libaudgui/playlists.c:122
-msgid "_Export"
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
-msgid "Import Playlist"
-msgstr "Importă Lista de redare"
-
-#: src/libaudgui/playlists.c:129
-msgid "_Import"
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Deschide Fișiere"
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadate"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr ""
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Compozitor"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr ""
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Interpret"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Adaugă Fișiere"
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Anul Înregistrării"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr ""
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Data Înregistrării"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Adaugă la coadă"
-
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Scoate din coadă"
-
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Sari la Melodie"
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIME Type"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtru: "
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bitrate"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtru:"
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Informaţii indisponibile pentru %s.\n"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr ""
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Nivel"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Manager de Playlist"
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Fișier"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Intrări"
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Linie"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr ""
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Funcţie"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr ""
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Mesaj"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
 msgstr ""
 
-#: src/libaudgui/url-opener.c:49
-msgid "Open URL"
-msgstr "Deschide URL"
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Depanare"
 
-#: src/libaudgui/url-opener.c:55
-msgid "Add URL"
-msgstr "Adaugă URL"
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Informaţii"
 
-#: src/libaudgui/url-opener.c:74
-msgid "Enter URL:"
-msgstr ""
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Avertizare"
 
-#: src/libaudgui/util.c:173
-msgid ""
-"\n"
-"(Further messages have been hidden.)"
-msgstr ""
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Plugin-uri ..."
diff --git a/po/ru.po b/po/ru.po
index ecb1cbcc8841..856177920ba0 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -4,36 +4,44 @@
 #
 # Translators:
 # Alexander Orlov <alxorlov at pochta.ru>, 2007
-# dane <alpi_bel at mail.ru>, 2014
+# Денис <alpi_bel at mail.ru>, 2014
 # michurin <a.michurin at gmail.com>, 2011
 # Andrei Stepanov, 2014
+# Andrei Stepanov, 2014
+# arinov <i.arinov at iht.kz>, 2014
+# Dmitriy Glian <d.glyan at gmail.com>, 2014
 # Someonefree <drag-sasha at mail.ru>, 2014
 # Eugene Paskevich <eugene at raptor.kiev.ua>, 2010
 # Eugene Zagidullin <e.asphyx at gmail.com>, 2007
 # arinov <i.arinov at iht.kz>, 2014
 # iavojd <iavojd at gmail.com>, 2013
 # iavojd <iavojd at gmail.com>, 2013
-# StreamThreaedr <kvantarium at gmail.com>, 2012
-# Maxim Musatov <m1kc at yandex.ru>, 2012
+# Oleg <kvantarium at gmail.com>, 2012
+# Lowrider <pams at imail.ru>, 2014
+# Max Musatov <m1kc at yandex.ru>, 2012
+# Max Musatov <m1kc at yandex.ru>, 2012
 # michurin <a.michurin at gmail.com>, 2011
-# Maxim Musatov <m1kc at yandex.ru>, 2012
+# Max Musatov <m1kc at yandex.ru>, 2012
 # NaiLi (aka jamesjames) Rootaerc <theism at mail.ru>, 2012
 # NaiLi (aka jamesjames) Rootaerc <theism at mail.ru>, 2012
-# Lowrider <pams at imail.ru>, 2014
+# Oleg <kvantarium at gmail.com>, 2012
+# Lowrider <pams at imail.ru>, 2014-2015
 # Rax Garfield <admin at dvizho.ks.ua>, 2012
 # Rax Garfield <admin at dvizho.ks.ua>, 2012
 # serg0 <serg0 at ulx.ru>, 2009
 # serg0 <sergo at bk.ru>, 2010
 # serg0 <sergo at bk.ru>, 2010
-# StreamThreaedr <kvantarium at gmail.com>, 2012
+# Someonefree <drag-sasha at mail.ru>, 2014
+# Oleg <kvantarium at gmail.com>, 2012
 # Vitaly Lipatov <lav at etersoft.ru>, 2007
+# Денис <alpi_bel at mail.ru>, 2014
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-23 10:50+0000\n"
-"Last-Translator: Andrei Stepanov\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-01-24 22:32+0000\n"
+"Last-Translator: Lowrider <pams at imail.ru>\n"
 "Language-Team: Russian (http://www.transifex.com/projects/p/audacious/"
 "language/ru/)\n"
 "Language: ru\n"
@@ -43,1022 +51,1194 @@ msgstr ""
 "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"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Выполняется поиск ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Найден %d файл"
-msgstr[1] "Найдено %d файла"
-msgstr[2] "Найдено %d файлов"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Новый плейлист"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Ошибка"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
-msgstr "показать командную строку помощи"
+msgstr "Показать командную строку помощи"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Показать версию"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
-msgstr "начать воспроизведение"
+msgstr "Начать воспроизведение"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
-msgstr "сделать паузу воспроизведения"
+msgstr "Приостановить воспроизведение"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Приостановить при проигрывании, иначе ― воспроизводить"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
-msgstr "остановить воспроизведение"
+msgstr "Остановить воспроизведение"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
-msgstr "пропуск предыдущей песни"
+msgstr "Пропуск предыдущей песни"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
-msgstr "пропустить следующую песню"
+msgstr "Пропустить следующую песню"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
-msgstr "Добавить файлы в плейлист"
+msgstr "Добавить файлы в список воспроизведения"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
-msgstr "добавить файлы в  плейлист"
+msgstr "Добавить файлы во временный список воспроизведения"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Показать главное окно"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Показать окно воспроизведения песен"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
-msgstr "начать без графического интерфейса"
+msgstr "Запуск без графического интерфейса"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Выйти по окончании воспроизведения"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Вывести сообщения об отладке"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Выводить сообщения для отладки (может использоваться дважды)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Запуск в режиме Qt"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
-msgstr "Неизвестная опция :%s\n"
+msgstr "Неизвестная опция: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
-msgstr "Неизвестная опция :%c\n"
+msgstr "Неизвестная опция: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
-msgstr "Пример: audacious [ОПЦИЯ].....[ФАЙЛ]...\n"
+msgstr ""
+"Использование: audacious [Опция] ... [Файл] ...\n"
+"\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Не найден декодер для %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Найден %d файл"
+msgstr[1] "Найдено %d файла"
+msgstr[2] "найдено %d файлов"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s не может быть открыт."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Новый список воспроизведения"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Невозможно загрузить %s: расширение файла не поддерживается."
+msgid "Audio CD, track %s"
+msgstr "Аудио CD, дорожка %s"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(ошибка кодировки)"
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Ошибка загрузки плагина"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Невозможно сохранить %s : расширение файла не поддерживается."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Ошибка открытия %s:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Неизвестная ошибка воспроизведения"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Недопустимый аудио формат"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
-msgstr "Сейчас воспроизводится"
+msgstr "Сейчас Воспроизводится"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr ""
-"Список не может быть отсортирован, так как сканирование метаданных всё ещё "
-"идёт (или было выключено)."
+"Список воспроизведения не может быть отсортирован, так как происходит "
+"сканирование метаданных (или было выключено)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "О программе"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Невозможно загрузить %s: расширение файла не поддерживается."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Настройки"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Невозможно сохранить %s : расширение файла не поддерживается."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Сделать"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Ошибка перемотки"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "Закончить"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Неопознанный формат файла"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "Закрыть"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Ошибка чтения метаданных"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "Настройки"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Моно"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_О"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Стерео"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Плагины ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d канал"
+msgstr[1] "%d каналов"
+msgstr[2] "%d каналы"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Внешний вид"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Дорожка %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Звук"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Аудио CD"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Сеть"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(неизвестное название)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Плейлист"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Неправильный URI"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Информация о песне"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Неизвестная схема URI"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Плагины"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Недопустимое имя файла"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Общие"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Авторы"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Эффекты"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Лицензия"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Визуализация"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Об Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Ввод"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Вы хотите удалить без восстановления “%s”?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Транспорт"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Удалить"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Исполнитель"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Отмена"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Альбом"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Удалить Список воспроизведения"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Название"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Не спрашивать снова"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Номер композиции"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Переименовать"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Жанр"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Переименовать список воспроизведения"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Имя файла"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Что вы хотите послушать в этом плейлисте?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Расположение"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Включить"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Дата"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Гц"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Год"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Гц"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Описание"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Гц"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Кодек"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Гц"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Качество"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Гц"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Нет"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 кГц"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Арабский"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 кГц"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Балтийские языки"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 кГц"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Китайский"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 кГц"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Греческий"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 кГц"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Иврит"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Эквалайзер"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Японский"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Предусиление"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Корейский"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Открыть файлы"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Польский"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Открыть"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Русский"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Закрыть _диалог при открытии"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Тайваньский"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Добавить файлы"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Турецкий"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Добавить"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Плавающая точка"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Закрыть _диалог при добавлении"
+
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Закрыть"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Настройки интерфейса</b>"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Название"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Плагин интерфейса:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Исполнитель"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Плагин вывода:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Альбом"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Настройки вывода</b>"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Жанр"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Качество звука:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Год"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Размер буфера:"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Дорожка"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "мс"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Продолжительность"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Мягкая обрезка"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Формат:"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Использовать программную регулировку громкости (не рекомендуется)"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Качество:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Выравнивание громкости</b>"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Битрейт:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Задействовать выравнивание громкости"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Режим альбома"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Предотвратить шипение/треск (рекомендуется)"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Регулировка уровней</b>"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Усилить звук во всех файлах на:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "дБ"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Усилить звук в файлах без меток на:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Chamber Music"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Имя узла прокси-сервера:"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "Classical"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Порт:"
+#: src/libaudgui/infowin.cc:91
+msgid "Country"
+msgstr "Country"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Имя пользователя:"
+#: src/libaudgui/infowin.cc:92
+msgid "Death Metal"
+msgstr "Death Metal"
 
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Пароль:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Настройка прокси-сервера</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Использовать прокси"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Использовать авторизацию через прокси"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Автоматически определять кодировку для языка:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Если не удалось определить, использовать кодировку:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Режим</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Продолжать воспроизведение при запуске"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Продвигаться дальше, если текущая композиция удалена"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Очищать список, если открывается новая композиция"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Открывать файлы во временном списке воспроизведения"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Не загружать метаданные композиций до воспроизведения"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Совместимость</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr ""
-"Считать \\ (обратную косую черту) разделителем имён каталогов в пути к файлу"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Обложка альбома</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Искать изображения, содержащие эти слова (разделять запятыми):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Исключать изображения, содержащие эти слова (разделять запятыми):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Искать изображения, содержащие название композиции"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Рекурсивный поиск"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Глубина поиска:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Всплывающие сведения</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Показывать всплывающую информацию"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Задержка всплывания (десятые доли секунды):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Показывать временную шкалу для текущей композиции"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "НАЗВАНИЕ"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ИСПОЛНИТЕЛЬ - НАЗВАНИЕ"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ИСПОЛНИТЕЛЬ - АЛЬБОМ - НАЗВАНИЕ"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ИСПОЛНИТЕЛЬ - АЛЬБОМ - ДОРОЖКА. НАЗВАНИЕ"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ИСПОЛНИТЕЛЬ [ АЛЬБОМ ] - ДОРОЖКА. НАЗВАНИЕ"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "АЛЬБОМ - НАЗВАНИЕ"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Категория"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Собственные установки"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Отображение композиций</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Показать номер композиции"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Отображать нули в начале (02:00 вместо 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Формат названия:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Задать формат:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Настройки Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Невозможно создать каталог (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Музыкальный компакт-диск, композиция %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Моно"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Стерео"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d канал"
-msgstr[1] "%d каналов"
-msgstr[2] "%d каналы"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Авторы"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Лицензия"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Об Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Вы хотите удалить без восстановления “%s”?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Удалить"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Удалить плейлист"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Не спрашивать снова"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Переименовать"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Переименовать список воспроизведения"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Что вы хотите послушать в этом плейлисте?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "Включить"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Гц"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 кГц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 кГц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 кГц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 кГц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 кГц"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Эквалайзер"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Предусиление"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Композиция"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Длительность"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Формат:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Качество:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Битрейт:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Chamber Music"
-
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "Classical"
-
-#: src/libaudgui/infowin.c:84
-msgid "Country"
-msgstr "Country"
-
-#: src/libaudgui/infowin.c:85
-msgid "Death Metal"
-msgstr "Death Metal"
-
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
-msgstr "успешно сохранено"
+msgstr "Успешно сохранено"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
-msgstr "сохранить ошибку"
+msgstr "Ошибка сохранения"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Информация о песне"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Исполнитель альбома"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Комментарий"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
-msgstr "номер трека"
+msgstr "Номер Дорожки"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Очищать поля при переходе к следующей композиции"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Сохранить"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Следующий"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
-msgstr "%d Кбит/с"
+msgstr "%d кб/с"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "не доступен"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Отсутствуют сведения %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Перейти"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Перейти ко времени"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Введите время (минуты:секунды):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Заменить %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Поставить в очередь"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Из_ъять из очереди"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Перейти к композиции"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Фильтр: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "Фильтр:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Закрыть после перехода"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_Перезаписать"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Подтвердить Перезапись"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Перезаписать %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Экспортировать список воспроизведения"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Экспортировать"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Импортировать список воспроизведения"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Импортировать"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Управление очередью"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Плагины ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Убрать из очереди"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Про %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Открыть файлы"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Настройки"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Открыть"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Установить"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Закрыть диалог при открытии"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Настройки"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Добавить файлы"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_О"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "Добавить"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Внешний вид"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Закрыть диалог после добавления"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Аудио"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Поставить в очередь"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Сеть"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Из_ъять из очереди"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Список воспроизведения"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Перейти к композиции"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Плагины"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Фильтр: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Общие"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "Фильтр:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Эффект"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Закрыть после перехода"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Визуализация"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Ввод"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Транспорт"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Номер дорожки"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Имя файла"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Расположение файла"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Дата"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Кодек"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Качество"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Нет"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Арабский"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Балтийские языки"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Китайский"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Греческий"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Иврит"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Японский"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Корейский"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Польский"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Русский"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Тайваньский"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Турецкий"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Плавающая точка"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Настройки интерфейса</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Плагин интерфейса:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Плагин вывода:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Настройки вывода</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Качество звука:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Размер буфера:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "мс"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Мягкая обрезка"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Использовать программную регулировку громкости (не рекомендуется)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Выравнивание громкости</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Задействовать выравнивание громкости"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Режим альбома"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Предотвратить шипение/треск (рекомендуется)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Регулировка уровней</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Усилить звук во всех файлах на:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "дБ"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Усилить звук в файлах без меток на:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Имя узла прокси-сервера:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Порт:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Имя пользователя:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Пароль:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Сетевые настройки</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "КиБ"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Настройка прокси-сервера</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Использовать прокси"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Использовать авторизацию с прокси"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Автоматически определять кодировку для языка:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Если не удалось определить, использовать кодировку:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Режим</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Продолжить воспроизведение при запуске"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Пауза вместо немедленного продолжения"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Продвигаться дальше, если текущая композиция удалена"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Очистить список воспроизведения при открытии файлов"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Открывать файлы во временном списке воспроизведения"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Совместимость</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr ""
+"Считать \\ (обратную косую черту) разделителем имён каталогов в пути к файлу"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Отображение композиций</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Показать номер композиции"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Отображать нули в начале (02:00 вместо 2:00)"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Управление списками воспроизведения"
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Расширенные</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Элементов"
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Не загружать метаданные композиций до воспроизведения"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Новый"
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Воспроизводить файлы с неизвестными расширениями"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Пере_именовать"
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Обложка альбома</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Воспроизведение"
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Искать изображения, содержащие эти слова (разделять запятыми):"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Закрыть окно при выборе списка воспроизведения"
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Исключать изображения, содержащие эти слова (разделять запятыми):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Искать изображения, содержащие название композиции"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Рекурсивный поиск"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Глубина поиска:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Всплывающие сведения</b>"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Показывать всплывающую информацию"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Задержка всплывания (десятые доли секунды):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Показывать временную шкалу для текущей композиции"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "НАЗВАНИЕ"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ИСПОЛНИТЕЛЬ - НАЗВАНИЕ"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ИСПОЛНИТЕЛЬ - АЛЬБОМ - НАЗВАНИЕ"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ИСПОЛНИТЕЛЬ - АЛЬБОМ - ДОРОЖКА. НАЗВАНИЕ"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ИСПОЛНИТЕЛЬ [ АЛЬБОМ ] - ДОРОЖКА. НАЗВАНИЕ"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "АЛЬБОМ - НАЗВАНИЕ"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Категория"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Собственные установки"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Формат названия:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Задать формат:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Настройки Audacious"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Управление очередью"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Убрать из очереди"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Работаю ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Ошибка"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Открыть веб-ссылку"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Добавить веб-ссылку"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Введите веб-ссылку:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Подробные сообщения были скрыты.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Открыть папку"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Добавить папку"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Открыть"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Добавить"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Метаданные"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Композитор"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Исполнитель"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Год издания"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Дата записи"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Технические"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Тип MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Битрейт"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Отсутствуют сведения %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Уровень"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Имя файла"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Линия"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Функция"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Сообщение"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Инспектор журнала"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Уровень логирования:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Отладка"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Инфо"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Внимание"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Плагины ..."
diff --git a/po/si.po b/po/si.po
index 8ec26d2ae7f7..35db5941dcad 100644
--- a/po/si.po
+++ b/po/si.po
@@ -3,17 +3,17 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# ashintha89 <ashintha at gmail.com>, 2013
-# ashintha89 <ashintha at gmail.com>, 2013
-# D.N.Perera <deen.niro at gmail.com>, 2013
-# D.N.Perera <deen.niro at gmail.com>, 2013
+# Ashintha Rukmal Perera <ashintha at gmail.com>, 2013
+# Ashintha Rukmal Perera <ashintha at gmail.com>, 2013
+# Deenuka Niroshini Perera <deen.niro at gmail.com>, 2013
+# Deenuka Niroshini Perera <deen.niro at gmail.com>, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Sinhala (http://www.transifex.com/projects/p/audacious/"
 "language/si/)\n"
 "Language: si\n"
@@ -22,131 +22,135 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "සොයමින් පවතී ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d ගොනුව හමුවිය "
-msgstr[1] "%d ගොනු හමුවිය "
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "නව ධාවන ලැයිස්තුව"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "අනුවාදය පෙන්නන්න "
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "අනුවාදය​ පෙන්නන්න​"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "ගොනු ධාවන ලැයිස්තුවට එකතු කරන්න "
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "ප්‍රධාන කවුළුව සංදර්ශනය කරන්න​"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr " \t \tපසුබිම් ගායනයෙන් නික්මෙන්න"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "නිදොස් කිරීමෙ හසුන මුද්‍රණය කරන්න "
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "ඔඩේෂස්"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "\t%s සදහා \tවිකේතකයක් නොමැත"
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d ගොනුව හමුවිය "
+msgstr[1] "%d ගොනු හමුවිය "
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s විවෘත කිරීමට නොහැකි විය."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "නව ධාවන ලැයිස්තුව"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid "Audio CD, track %s"
+msgstr "\tශ්‍රව්‍ය CD, පථ %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "දැන් ධාවනයවේ"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -154,887 +158,1051 @@ msgstr ""
 "පාර-දත්ත පරිලෝකනය කිරීම තවදුරටත් සිදුවන බැවින් ධාවන ලැයිස්තුව අණුපිළිවෙලට තේරීමට නොහැකිය (එසේත් "
 "නැතිනම් අක්‍රීය කර ඇත)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "තනි "
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "ත‍්‍ර‍්‍රිමාණ "
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d නාලිකාව"
+msgstr[1] "%d නාලිකා "
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "ශ්‍රව්‍ය​"
-
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "ජාලය"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "ධාවන ලැයිස්තුව​"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "ගීත තොරතුරු "
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "පේනු මෘදුකාංගය"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "සාමාන්‍ය"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "ප‍්‍රතිඑලය"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "\tසම්මානය"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "දෘෂ්‍යකරණය"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "වරපත "
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "ආදානය"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "ඔඩේෂස් පිළිබඳ "
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "\tප‍්‍රවාහණය"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "ශිල්පියා "
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "ඇල්බමය "
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "මාතෘකාව"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "ඛණ්ඩ අංකය "
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "ප්‍රභේදය"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "ගොනු නාමය "
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "ධාවන ලැයිස්තුව නැවත නම්කරනවා "
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "ගොනු පෙත"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "දිනය  "
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "\t_සබල කරනවා"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "වර්ෂය "
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "විවරණය"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "කොඩෙක් "
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "\tප්‍රශස්තතාව"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "කිසිසේත් නැති"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "අරාබි භාෂාව"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "බෝල්ටික්"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "චීන"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "ග්‍රීක"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "\tහීබෲ"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "ජපන් "
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "සමානකරණය"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "කොරියානු"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "පූර්ව වර්ධකය "
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "ඔපකරය"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "ගොනු විවෘත කරන්න"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "රුසියානු"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "තායිවානීය "
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "තුර්කීය "
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "ගොනු එකතු කරන්න"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "ඉපිලෙන ලක්ෂ්‍යය"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "  \tප්‍රතිදාන පේනු මෘදුකාංගය "
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "මාතෘකාව"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "\t<b>ප්‍රතිදාන සිටුවම්<b> "
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "ශිල්පියා "
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr " බිටු ගැඹුර"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "ඇල්බමය "
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "බෆරයේ ප්‍රමාණය "
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "ප්‍රභේදය"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "\tමෘදුකාංග පරිමා පාලකය භාවිතා කරන්න නිර්දේශ කරනොමැත"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "වර්ෂය "
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "මෘදු ඇමිණීම"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "ඛණ්ඩය "
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "මෘදුකාංග පරිමා පාලකය භාවිතා කරන්න (නිර්දේශ කරනොමැත)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "දිග"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>ප්‍රතිලාභය නැවත විකාශය කිරිම<b> "
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "\tනැවත විකාශය සබල කිරිම"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "ඇල්බම් ප්‍රකාරය"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "ඇමුණුම වළක්වන්න (නිර්දේශිතයි)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "කටුක ඝෝෂාකර සංගීතය"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>මට්ටම සීරුමාරු කිරීම<b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "ඇසිඩ් රොක් "
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "සියලු ගොනු විස්තාරණය කිරීම "
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "හාත්පස පැතිරුණු"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "ජෑස් සංගීතය "
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr " නොඇමුණු ගොනු විස්තාරණය කිරීම "
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "බ්ලුග්‍රාස් "
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "නියුතු සත්කාරක නාමය:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "බ්ලූස් "
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "නියුතු තොට:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "නියුතු පරිශීලක නාමය: "
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "\tනියුතු මුරපදය:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>නියුතු වින්‍යාසය<b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "නියුතු භාවිතය සබල කිරිම"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "නියුතු සමඟ සත්‍යාපනය භාවිතා කරන්න"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "ස්වයංක්‍රීය අනුලකුණු කේතන අනාවරකය:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "පිහිටාධාර අනුලකුණු කේතන:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "\t<b>චර්යාව</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "ඇරඹුමේ සිට නොනවත්වා වාර්තා තැබීම "
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "\tප්‍රවර්තන ගීතය මැකුනු පසු ප්‍රගමනයවේ "
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "ගොනු විවෘත වන විට ධාවන ලැයිස්තුව හිස් කරන්න "
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "ගොනු තාවකාලික ධාවන ලැයිස්තුවක විවෘත කරන්න "
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "ධාවනය වනතුරු ගීත සඳහා පාර-දත්ත  ප්‍රවේශනය නොකරන්න "
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>ගැළපුම</b> "
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "අර්ථනිරූපණය කරන්න \\ (පසු ඇල ඉර)  ෆෝල්ඩර පරිසීමකයක් ලෙස "
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>ඇල්බම් කලාව</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "මෙම වචන වලට ගැලපෙන අනුරූ සීහුම් කිරීම (විරාම වෙන්කරන ලද):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "මෙම වචන වලට ගැලපෙන අනුරූ ඉවත් කිරීම (comma-separated):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "ගීත ගොනුවේ නාමයට ගැලපෙන අනුරූ සෙවීම "
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "සමාවර්තව සෙවීම "
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "\tගැඹුරට සෙවීම:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>උත්පතන තොරතුරු</b>  "
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "උත්පතන තොරතුරු පෙන්නන්න "
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "උත්පතන ප්‍රමාදය (තත්පරයෙන් දහයෙන් පංගුවකි):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "දැන් පවත්නා ගීතයේ කාල පරිමාව පෙන්නන්න "
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "මාතෘකාව"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "\tකලාකරු - මාතෘකාව"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "කලාකරු - ඇල්බමය - මාතෘකාව"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "කලාකරු - ඇල්බමය - ඛණ්ඩය. මාතෘකාව"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "කලාකරු [ ඇල්බමය ] - ඛණ්ඩය. මාතෘකාව"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ඇල්බමය - මාතෘකාව"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "\tප්‍රවර්ගය"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "අභිරුචිය "
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>ගීත සංදර්ශකය</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "ගීත අංක පෙන්නන්න"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "ප‍්‍රමුඛ ශුන්‍ය අගයන් පෙන්වන්න (02:00 වෙනුවට 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "මාතෘකා ආකෘතිය:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "අභිරුචි අනුලකුණු වැල:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "නාමාවලිය නිර්මාණය කීරීමට නොහැකිය (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "\tශ්‍රව්‍ය CD, පථ %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "තනි "
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "ත‍්‍ර‍්‍රිමාණ "
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d නාලිකාව"
-msgstr[1] "%d නාලිකා "
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "\tසම්මානය"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "වරපත "
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "ඔඩේෂස් පිළිබඳ "
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "ධාවන ලැයිස්තුව නැවත නම්කරනවා "
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "\t_සබල කරනවා"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "සමානකරණය"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "පූර්ව වර්ධකය "
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "ඛණ්ඩය "
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "දිග"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "කටුක ඝෝෂාකර සංගීතය"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "ඇසිඩ් රොක් "
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "හාත්පස පැතිරුණු"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "ජෑස් සංගීතය "
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "බ්ලුග්‍රාස් "
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "බ්ලූස් "
-
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "ශාලිකා සංගීතය"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "සම්භාව්‍ය"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "දේශය "
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr " ඩෙත් මෙට්ල් "
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "ඩිස්කෝ නැටුම "
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "පහසු ඇහුන්කන් දීම "
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "ජන සමූහය "
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "බියගුල්ලා "
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "ගැනස්ටර් රැප් "
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "අනුශාසනය "
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "හාඩ් රොක්"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "හෙවි මෙට්ල් "
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "හිප්-පොප්"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "නිවස "
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "ජෑස්"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "කැලෑව"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "ලෝහය"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "නව යුගය"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "\tනව තරංගය"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "ඝෝෂාව"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "ජනප‍්‍රිය "
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "පන්ක් රොක් "
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "තට්ටු කරනවා"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "රෙගේයී සංගීතය"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "පැද්දෙනවා "
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "රොක් ඇන්ඩ් රෝල්  "
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr " \tරිද්මය සහ බ්ලු සංගීතය"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "ස්කා "
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "ආත්මය "
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "පැද්දීම "
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "තාක්ෂණික"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "ට්‍රිප්-හොප්"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "ගීත තොරතුරු "
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "විවරණය"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "%s සඳහා තොරතුරු උපයෝජ්‍ය නැත.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "මගහැර වේලාවට පිවිසෙන්න"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "ඇතුලත් කරන කාළය (මිනිත්තු:තත්පර):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "\tඋඩින් ලිවීම %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "\t_පේළිය"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Un_පේළිය"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "මගහැර ගීතයට පිවිසෙන්න "
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "\tපෙරහන:"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_පෙරහන:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "\tඋඩින් ලිවීම %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "ධාවන ලැයිස්තුව නිර්යාත කරන්න"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr " ධාවන ලැයිස්තුව ආයාත කරන්න"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "\tපේළි කළමනාකරණය "
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "ගොනු විවෘත කරන්න"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "ගොනු එකතු කරන්න"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "ශ්‍රව්‍ය​"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "ජාලය"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "ධාවන ලැයිස්තුව​"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "පේනු මෘදුකාංගය"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "සාමාන්‍ය"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "ප‍්‍රතිඑලය"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "දෘෂ්‍යකරණය"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "ආදානය"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "\tප‍්‍රවාහණය"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "\t_පේළිය"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Un_පේළිය"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "මගහැර ගීතයට පිවිසෙන්න "
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "දිනය  "
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "\tපෙරහන:"
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "කොඩෙක් "
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_පෙරහන:"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "\tප්‍රශස්තතාව"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "කිසිසේත් නැති"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "අරාබි භාෂාව"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "බෝල්ටික්"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "චීන"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "ග්‍රීක"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "\tහීබෲ"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "ජපන් "
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "කොරියානු"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "ඔපකරය"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "රුසියානු"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "තායිවානීය "
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "තුර්කීය "
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "ඉපිලෙන ලක්ෂ්‍යය"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "\tධාවන ලැයිස්තු කළමනාකරු"
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "  \tප්‍රතිදාන පේනු මෘදුකාංගය "
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "\t<b>ප්‍රතිදාන සිටුවම්<b> "
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr " බිටු ගැඹුර"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "බෆරයේ ප්‍රමාණය "
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "\tමෘදුකාංග පරිමා පාලකය භාවිතා කරන්න නිර්දේශ කරනොමැත"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "මෘදු ඇමිණීම"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "සටහන්"
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "මෘදුකාංග පරිමා පාලකය භාවිතා කරන්න (නිර්දේශ කරනොමැත)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>ප්‍රතිලාභය නැවත විකාශය කිරිම<b> "
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "\tනැවත විකාශය සබල කිරිම"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "ඇල්බම් ප්‍රකාරය"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "ඇමුණුම වළක්වන්න (නිර්දේශිතයි)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>මට්ටම සීරුමාරු කිරීම<b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "සියලු ගොනු විස්තාරණය කිරීම "
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr " නොඇමුණු ගොනු විස්තාරණය කිරීම "
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "නියුතු සත්කාරක නාමය:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "නියුතු තොට:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "නියුතු පරිශීලක නාමය: "
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "\tනියුතු මුරපදය:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>නියුතු වින්‍යාසය<b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "නියුතු භාවිතය සබල කිරිම"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "නියුතු සමඟ සත්‍යාපනය භාවිතා කරන්න"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "ස්වයංක්‍රීය අනුලකුණු කේතන අනාවරකය:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "පිහිටාධාර අනුලකුණු කේතන:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "\t<b>චර්යාව</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "\tප්‍රවර්තන ගීතය මැකුනු පසු ප්‍රගමනයවේ "
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "ගොනු විවෘත වන විට ධාවන ලැයිස්තුව හිස් කරන්න "
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "ගොනු තාවකාලික ධාවන ලැයිස්තුවක විවෘත කරන්න "
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>ගැළපුම</b> "
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "අර්ථනිරූපණය කරන්න \\ (පසු ඇල ඉර)  ෆෝල්ඩර පරිසීමකයක් ලෙස "
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>ගීත සංදර්ශකය</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "ගීත අංක පෙන්නන්න"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "ප‍්‍රමුඛ ශුන්‍ය අගයන් පෙන්වන්න (02:00 වෙනුවට 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "ධාවනය වනතුරු ගීත සඳහා පාර-දත්ත  ප්‍රවේශනය නොකරන්න "
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>ඇල්බම් කලාව</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "මෙම වචන වලට ගැලපෙන අනුරූ සීහුම් කිරීම (විරාම වෙන්කරන ලද):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "මෙම වචන වලට ගැලපෙන අනුරූ ඉවත් කිරීම (comma-separated):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "ගීත ගොනුවේ නාමයට ගැලපෙන අනුරූ සෙවීම "
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "සමාවර්තව සෙවීම "
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "\tගැඹුරට සෙවීම:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>උත්පතන තොරතුරු</b>  "
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "උත්පතන තොරතුරු පෙන්නන්න "
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "උත්පතන ප්‍රමාදය (තත්පරයෙන් දහයෙන් පංගුවකි):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "දැන් පවත්නා ගීතයේ කාල පරිමාව පෙන්නන්න "
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "මාතෘකාව"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "\tකලාකරු - මාතෘකාව"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "කලාකරු - ඇල්බමය - මාතෘකාව"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "කලාකරු - ඇල්බමය - ඛණ්ඩය. මාතෘකාව"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "කලාකරු [ ඇල්බමය ] - ඛණ්ඩය. මාතෘකාව"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ඇල්බමය - මාතෘකාව"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "\tප්‍රවර්ගය"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "අභිරුචිය "
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "මාතෘකා ආකෘතිය:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "අභිරුචි අනුලකුණු වැල:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "\tපේළි කළමනාකරණය "
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "\t_ධාවන ලැයිස්තුව සක්‍රිය කිරීමේදී සංවාදය වසන්න "
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "URL විවෘත කරන්න"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "URL එකතු කරන්න"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "\tURL ඇතුල් කරන්න:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(අතිරේක පණිවිඩ සඟවන ලඳි.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "%s සඳහා තොරතුරු උපයෝජ්‍ය නැත.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "ගොනු නාමය "
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/sk.po b/po/sk.po
index 65065a0ae385..30839ced3bc7 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -4,20 +4,22 @@
 #
 # Translators:
 # Andrej Herceg <herceg.andrej at zoznam.sk>, 2007,2009-2011
-# citro <lukas.dobransky at gmail.com>, 2012-2013
+# Lukáš Dobránsky <lukas.dobransky at gmail.com>, 2012-2013
 # Corduroy <vdcorduroy at gmail.com>, 2013
 # filipbielik <filip.bielik at gmail.com>, 2014
-# citro <lukas.dobransky at gmail.com>, 2012
-# citro <lukas.dobransky at gmail.com>, 2013
+# filipbielik <filip.bielik at gmail.com>, 2014
+# Lukáš Dobránsky <lukas.dobransky at gmail.com>, 2012
+# Lukáš Dobránsky <lukas.dobransky at gmail.com>, 2012-2013
+# RichiSk <richard.mosko at gmail.com>, 2015
 # Tomáš Vadina <kyberdev at gmail.com>, 2012
 # Corduroy <vdcorduroy at gmail.com>, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-02-13 23:13+0000\n"
+"Last-Translator: RichiSk <richard.mosko at gmail.com>\n"
 "Language-Team: Slovak (http://www.transifex.com/projects/p/audacious/"
 "language/sk/)\n"
 "Language: sk\n"
@@ -26,132 +28,136 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Vyhľadáva sa …"
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Nájdených %d súborov"
-msgstr[1] "Nájdený %d súbor"
-msgstr[2] "Nájdené %d súbory"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Nový zoznam skladieb"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Chyba"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Zobraziť nápovedu k príkazovému riadku"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Zobrazí verziu"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Prehrať"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Pozastaviť"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pri prehrávaní pozastaví, inak začne prehrávať"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Zastaviť"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Predchádzajúca pieseň"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Nasledujúca pieseň"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Pridá súbory do zoznamu skladieb"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Pridať súbory do dočasného zoznamu skladieb"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Zobrazí hlavné okno"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Zobraziť zoznam piesní"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Spustiť bez grafického prostredia"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Ukončiť program po zastavení prehrávania"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Vypisuje ladiace hlásenia"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Neznáma možnosť: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Neznáma možnosť: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr "Pouzitie: audacious [VOLBA] ... [SUBOR] ...\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Pre %s nebol nájdený žiadny dekodér."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Nájdených %d súborov"
+msgstr[1] "Nájdený %d súbor"
+msgstr[2] "Nájdené %d súbory"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s nemohol byť otvorený."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Nový zoznam skladieb"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Nedokážem otvoriť %s: Nepodporovaná prípona súboru."
+msgid "Audio CD, track %s"
+msgstr "Zvukové CD, stopa %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Nedokážem uložiť %s: Nepodporovaná prípona súboru.."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Neplatný zvukový formát"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Práve hrá"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -159,888 +165,1052 @@ msgstr ""
 "Zoznam skladieb nie je možné triediť, pretože skenovanie metadát stále "
 "prebieha (alebo boli zakázané)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr ""
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Nie je možné načítať %s: nepodporovaná prípona názvu súboru."
+
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Nie je možné uložiť %s: nepodporovaná prípona súboru."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Nastaviť"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Formát súboru nebol rozpoznaný"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Zrušiť"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Chyba načítavania metadát"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Zatvoriť"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Nastavenia"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Pomoc"
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanálov"
+msgstr[1] "%d kanál"
+msgstr[2] "%d kanály"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Doplnky ..."
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Stopa %d"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Vzhľad"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Zvukové CD"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Zvuk"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "Neznámy názov"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Sieť"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Neplatná URI"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Zoznam skladieb"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Neplatná URI schéma"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Informácie o skladbe"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Neplatný názov súboru"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Moduly"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Zásluhy"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Všeobecné"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licencia"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efekt"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "O Audacious"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Vizualizácia"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Naozaj chcete nenávratne odstrániť \"%s\"?"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Vstup"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Odstrániť"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Prenos"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Zrušiť"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Umelec"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Odstrániť zoznam skladieb"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Nepýtať sa nabudúce"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Názov"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Premenovať"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Číslo stopy"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Premenovať zoznam skladieb"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Žáner"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Ako chcete pomenovať Váš playlist?"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Názov súboru"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Povoliť"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Cesta k súboru"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Dátum"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Rok"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Komentár"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Kodér"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kvalita"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Žiadne"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabčina"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltské jazyky"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Čínština"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Gréčtina"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ekvalizér"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebrejčina"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Predzosilnenie"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japončina"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Otvoriť súbory"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Kórejčina"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "Otvoriť"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Poľština"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Zatvoriť okno po otvorení"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Ruština"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Pridať súbory"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwančina"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "Pridať"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turečtina"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Zatvoriť okno po pridaní"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Plávajúca desatinná čiarka"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Zatvoriť"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr ""
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Názov"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr ""
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Umelec"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Výstupný modul:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Nastavenia výstupu</b>"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Žáner"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bitová hĺbka:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Rok"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Veľkosť vyrovnávacej pamäte:"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Stopa"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Dĺžka"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Jemné orezanie"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Formát:"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Použiť softvérové ovládanie hlasitosti (neodporúča sa)"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Kvalita:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Zosilnenie pri prehrávaní</b>"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Dátový tok:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Povoliť zosilnenie pri prehrávaní"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Režim albumu"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Predchádzať orezávaniu (odporúča sa)"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Nastavenie úrovní</b>"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Zosilniť všetky súbory:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
-
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Zosilniť súbory bez popisov:"
-
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Meno počítača:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Port:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Používateľ:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Heslo:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Nastavenie proxy</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Používať proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Používať autentifikáciu"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Automatické rozoznávanie kódovania znakov:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Záložné kódovanie znakov:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Správanie</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Po spustení pokračovať v prehrávaní"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Prejsť na nasledujúcu skladbu ak je aktuálna skladba vymazaná"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Pri otvorení súborov vyprázdniť zoznam skladieb"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Otvoriť súbory do dočasného zoznamu skladieb"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Nenačítať metadáta skladieb pred prehraním"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Kompatibilita</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpret \\ (spätné lomítko) ako oddeľovač priečinku"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Album</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Vyhľadať obrázky odpovedajúce týmto slovám (oddelené čiarkou):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Vylúčiť obrázky odpovedajúce týmto slovám (oddelené čiarkou):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Hľadať obrázky odpovedajúce názvu súboru"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Hľadať rekurzivne"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Hĺka hľadania:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Vyskakovacie okno s podrobnosťami</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Zobraziť popup informácie"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Popup oneskorenie (desatiny sekundy):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Zobraziť časový merač pre aktuálnu skladbu"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "NÁZOV"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "UMELEC - NÁZOV"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "UMELEC - ALBUM - NÁZOV"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "UMELEC - ALBUM - STOPA. NÁZOV"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "UMELEC [ALBUM] - STOPA. NÁZOV"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - NÁZOV"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategória"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Vlastné"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Zobrazenie skladby</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Zobraziť čísla skladieb"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Zobrazovať úvodné nuly (02:00 namiesto 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Formát názvu:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Vlastný reťazec:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Nastavenia programu"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Nepodarilo sa vytvoriť adresár (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Zvukové CD, stopa %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanálov"
-msgstr[1] "%d kanál"
-msgstr[2] "%d kanály"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Zásluhy"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licencia"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "O Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Naozaj chcete nenávratne odstrániť \"%s\"?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Odstrániť"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Odstrániť zoznam skladieb"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Nepýtať sa nabudúce"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Premenovať zoznam skladieb"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Ako chcete pomenovať Váš playlist?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Povoliť"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ekvalizér"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Predzosilnenie"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Stopa"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Dĺžka"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Formát:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Kvalita:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Dátový tok:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "Blues"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Komorná hudba"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klasika"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Príjemné počúvanie"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "Nová vlna"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Ruch"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Úspešne uložené."
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Chyba pri ukladaní"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Informácie o skladbe"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Interprét albumu"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Komentár"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Číslo stopy"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "Uložiť"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Nasledujúca"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "Nedostupné"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Pre %s nie sú dostupné žiadne informácie.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "Skočiť"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Skočiť na čas"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Zadajte čas (minúty:sekundy):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Prepísať %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "Pri_dať do fronty"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "O_dobrať z fronty"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Skočiť na skladbu"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filter: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filter:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Zatvoriť po skoku"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
-msgstr ""
+msgstr "P_repísať"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Prepísať"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Prepísať %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Exportovať zoznam skladieb"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
-msgstr ""
+msgstr "_Exportovať"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importovať zoznam skladieb"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
+msgstr "_Importovať"
+
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Doplnky ..."
+
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "O %s"
+
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Nastavenia"
+
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Nastaviť"
+
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Nastavenia"
+
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Pomoc"
+
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Vzhľad"
+
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Zvuk"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Sieť"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Zoznam skladieb"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Moduly"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Všeobecné"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efekt"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Vizualizácia"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Vstup"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Prenos"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Číslo stopy"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Názov súboru"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Cesta k súboru"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Dátum"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Kodér"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kvalita"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Žiadne"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabčina"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltské jazyky"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Čínština"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Gréčtina"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebrejčina"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japončina"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Kórejčina"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Poľština"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Ruština"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwančina"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turečtina"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Plávajúca desatinná čiarka"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Nastavenia rozhrania</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Plugin rozhrania:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Výstupný modul:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Nastavenia výstupu</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bitová hĺbka:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Veľkosť vyrovnávacej pamäte:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Jemné orezanie"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Použiť softvérové ovládanie hlasitosti (neodporúča sa)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Zosilnenie pri prehrávaní</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Povoliť zosilnenie pri prehrávaní"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Režim albumu"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Predchádzať orezávaniu (odporúča sa)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Nastavenie úrovní</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Zosilniť všetky súbory:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Zosilniť súbory bez popisov:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Meno počítača:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Port:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Používateľ:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Heslo:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Nastavenia pripojenia</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Správca fronty"
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Nastavenie proxy</b>"
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "Odstrániť"
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Používať proxy"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Otvoriť súbory"
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Používať autentifikáciu"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "Otvoriť"
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Automatické rozoznávanie kódovania znakov:"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Zatvoriť okno po otvorení"
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Záložné kódovanie znakov:"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Pridať súbory"
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Správanie</b>"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "Pridať"
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Po spustení pokračovať v prehrávaní"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Zatvoriť okno po pridaní"
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Ihneď pozastaviť namiesto pokračovania"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "Pri_dať do fronty"
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Prejsť na nasledujúcu skladbu ak je aktuálna skladba vymazaná"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "O_dobrať z fronty"
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Pri otvorení súborov vyprázdniť zoznam skladieb"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Skočiť na skladbu"
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Otvoriť súbory do dočasného zoznamu skladieb"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filter: "
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Kompatibilita</b>"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filter:"
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpret \\ (spätné lomítko) ako oddeľovač priečinku"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Zatvoriť po skoku"
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Zobrazenie skladby</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Zobraziť čísla skladieb"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Zobrazovať úvodné nuly (02:00 namiesto 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Rozšírené</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Správca zoznamu skladieb"
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Nenačítať metadáta skladieb pred prehraním"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Položky"
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Novoý"
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Album</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Premenovať"
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Vyhľadať obrázky odpovedajúce týmto slovám (oddelené čiarkou):"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "Prehrať"
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Vylúčiť obrázky odpovedajúce týmto slovám (oddelené čiarkou):"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Zatvoriť okno po aktivácii zoznamu skladieb"
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Hľadať obrázky odpovedajúce názvu súboru"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Hľadať rekurzivne"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Hĺka hľadania:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Vyskakovacie okno s podrobnosťami</b>"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Zobraziť popup informácie"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Popup oneskorenie (desatiny sekundy):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Zobraziť časový merač pre aktuálnu skladbu"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "NÁZOV"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "UMELEC - NÁZOV"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "UMELEC - ALBUM - NÁZOV"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "UMELEC - ALBUM - STOPA. NÁZOV"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "UMELEC [ALBUM] - STOPA. NÁZOV"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - NÁZOV"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategória"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Vlastné"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Formát názvu:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Vlastný reťazec:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Nastavenia programu"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Správca fronty"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "Odstrániť"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Pracujem..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Chyba"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Otvoriť URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Pridať URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Zadajte URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Ďalšie správy boli skryté.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Otvoriť priečinok"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Pridať priečinok"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Otvoriť"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Pridať"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadáta"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Rok nahrávania"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Dátum nahrávania"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIME Typ"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Dátový tok"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Pre %s nie sú dostupné žiadne informácie.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Názov súboru"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Funkcia"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Správa"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Informácie"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Upozornenie"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Moduly..."
diff --git a/po/sq.po b/po/sq.po
index 2fbcc7123786..13c5892b1b77 100644
--- a/po/sq.po
+++ b/po/sq.po
@@ -3,16 +3,17 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# natird <dritan86 at gmail.com>, 2012
-# milot <milot.shala at gmail.com>, 2013
-# natird <dritan86 at gmail.com>, 2012
+# natird zoto <dritan86 at gmail.com>, 2012
+# Milot Shala <milot.shala at gmail.com>, 2013
+# natird zoto <dritan86 at gmail.com>, 2012
+# natird zoto <dritan86 at gmail.com>, 2012
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Albanian (http://www.transifex.com/projects/p/audacious/"
 "language/sq/)\n"
 "Language: sq\n"
@@ -21,131 +22,135 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Duke kërkuar"
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d skedar i gjetur"
-msgstr[1] "%d skedar i gjetur"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Këngëlist e Re"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Trego variantin"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "pushim nëse luhet , luaj përndryshe"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Shto skedë k"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Ekranizo dritaren kryesore"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Mbyll pasi që playback të ndalet"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Shtyp mesazhin e debagut"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Asnjë dekoder nuk u gjetë për %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d skedar i gjetur"
+msgstr[1] "%d skedar i gjetur"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s nuk mund të hapet"
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Këngëlist e Re"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid "Audio CD, track %s"
+msgstr "Audio CD, udhë %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Tani duke Luajtur"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -153,887 +158,1051 @@ msgstr ""
 "Këngëlista nuk mund të zgjidhet për shkak skanimi i metadatas është ende në "
 "zhvillim e sipër (ose ka qenë çaktivizuar)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Sterejo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanale"
+msgstr[1] "%d kanalet"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Zëri"
-
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Rrejt"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Këngëlist"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "të dhënat e këngës"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Plugine"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "E përgjithëshme"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Pasojat"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Kredite"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Vizualizimi"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Liçenca"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Të dhëna"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Rreth Audaciousit"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Trasport"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artist"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Titull"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Numërkënga"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Lloji"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Emëriskedarit"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Riemëro këngëlistën"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Shtegëskedari"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Datë"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Aktivizo"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Vitë"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Koment"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Kodek"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Cilësi"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Asnjë"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabisht"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltike"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Kinezëçe"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Greqisht"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebraishte"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japonisht"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Balancues"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Koreane"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamp"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polonisht"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Hap Skedarin"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Rusisht"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Tavanisht"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turqisht"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Shto Skedarin"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Pika lundrues"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Shtojca e Prodhimit"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Titull"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Konfigurimet e Prodhimit</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artist"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Thellësia e Bitit"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Madhësia e Bufferit"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Lloji"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Vitë"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Prerëje e butë"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Udhë"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Përdorimi i programit të kontrollit të volumit (nuk rekomandohet)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Gjatësia"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Riluaj Gain</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Aktivizo Rregulluesin Zanor"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Mënyra Album"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Parandalo klipimin (e recomanduara)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Xhaz Acid"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Rregullo Livelet </b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Rrok Acid"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Amplifiko te gjitha skedarët"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Amplifiko skedarët e pa etiketuar"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Blugras"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Prokura emërbuajtëse"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Bluz"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Prokura portë"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Prokura emërpërdorim"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Prokura fjalëkalim"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Konfigurim i Prokurës</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Aktivizo përdorimin e prokurës"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Përdorni vertetimi me prokurë"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Vetë karakteri duke koduar detektor për:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Kodifikimet follbek karakter:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Sjellëjet</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Vazhdo playback në fillimin e"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Përparo kur kënga e tanishme është fshirë"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Fshi këngëlistës kur hapen e skedarët"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Hap skedarët në një këngëlist të përkohshëme"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Mos ngarko metadata për këngën derisa të luahet"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Pajtueshmëri</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Interpreto \\ (slash e prapambetur) si një Kufizues dosjesh"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Albumi Art</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Kërko per figura që i përkojnë këtyre fjalëve ( të ndara me presje)"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Përjashto imazhet që përkojnë këto fjalë (të ndara me presje-):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Kërko për imazhe që përputhen me emëri e skedarit këngë"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Kërkim rekursivisht"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Kërko thellësi:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Informacioni Popap</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Trego informacion popap"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Vonesë popapi (të dhjetat e një sekonde):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Trego shkallëkohën për këngën e tanishme"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TITULLI"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTIST - TITULLI"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTIST - ALBUMI - TITULLI"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTISTI - ALBUMI - KËNGA. TITULLI"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTISTI [ ALBUMI ] - KËNGA. TITULLI"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "TITULLI I ALBUMIT"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategoria"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Porosi"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Ekranizimi i Këngës</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Trego numwrin e kwngws"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Trego zeron kryesore (2:00 në vend të 02:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Formati i titullit"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Vargu me porosi"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Nuk mund të krijoj direktori (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Audio CD, udhë %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Sterejo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanale"
-msgstr[1] "%d kanalet"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Kredite"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Liçenca"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Rreth Audaciousit"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Riemëro këngëlistën"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Aktivizo"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Balancues"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamp"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Udhë"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Gjatësia"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Xhaz Acid"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Rrok Acid"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Blugras"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Bluz"
-
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Muzik Dhome"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klasike"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Kauntri"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Metal Vdekje"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disko"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Dëgjimi i lehtë"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folkloristike"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gengstarep"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Granxhë"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "HardRrok"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Hevimetal "
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "Hauz"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Xhaz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Xhungël"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "Nju Eixh"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "Valë e Re"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Zhurmë"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Pank Rrok"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rrep"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Rrege"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rrok"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rrok en Rroll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Ridhëm dhe Bluz"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Suing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Tenko"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "të dhënat e këngës"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Koment"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Asnjë e dhëne e gjindëshme për %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Kalo në Kohë"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Hyrje kohës (minuta:sekonda)"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Mbishkruaj %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Radhë"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Un_radhë"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Kalo tek kënga"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filtër:"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filtër:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Mbishkruaj %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Eksporto këngëlistën"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Importo këngëlistën"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Menaxheri i radhëve"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Hap Skedarin"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Shto Skedarin"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Zëri"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Rrejt"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Këngëlist"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Plugine"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "E përgjithëshme"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Pasojat"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Vizualizimi"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Të dhëna"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Trasport"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Radhë"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Un_radhë"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Kalo tek kënga"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Datë"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filtër:"
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Kodek"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filtër:"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Cilësi"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Asnjë"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabisht"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltike"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Kinezëçe"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Greqisht"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebraishte"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japonisht"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Koreane"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polonisht"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Rusisht"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Tavanisht"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turqisht"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Pika lundrues"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Menaxher i Këngëlistës"
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Shtojca e Prodhimit"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Konfigurimet e Prodhimit</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Thellësia e Bitit"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Madhësia e Bufferit"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Prerëje e butë"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Hyrjet"
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Përdorimi i programit të kontrollit të volumit (nuk rekomandohet)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Riluaj Gain</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Aktivizo Rregulluesin Zanor"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Mënyra Album"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Parandalo klipimin (e recomanduara)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Rregullo Livelet </b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Amplifiko te gjitha skedarët"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Amplifiko skedarët e pa etiketuar"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Prokura emërbuajtëse"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Prokura portë"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Prokura emërpërdorim"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Prokura fjalëkalim"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Konfigurim i Prokurës</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Aktivizo përdorimin e prokurës"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Përdorni vertetimi me prokurë"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Vetë karakteri duke koduar detektor për:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Kodifikimet follbek karakter:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Sjellëjet</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Përparo kur kënga e tanishme është fshirë"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Fshi këngëlistës kur hapen e skedarët"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Hap skedarët në një këngëlist të përkohshëme"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Pajtueshmëri</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Interpreto \\ (slash e prapambetur) si një Kufizues dosjesh"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Ekranizimi i Këngës</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Trego numwrin e kwngws"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Trego zeron kryesore (2:00 në vend të 02:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Mos ngarko metadata për këngën derisa të luahet"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Albumi Art</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Kërko per figura që i përkojnë këtyre fjalëve ( të ndara me presje)"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Përjashto imazhet që përkojnë këto fjalë (të ndara me presje-):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Kërko për imazhe që përputhen me emëri e skedarit këngë"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Kërkim rekursivisht"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Kërko thellësi:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Informacioni Popap</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Trego informacion popap"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Vonesë popapi (të dhjetat e një sekonde):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Trego shkallëkohën për këngën e tanishme"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TITULLI"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTIST - TITULLI"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTIST - ALBUMI - TITULLI"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTISTI - ALBUMI - KËNGA. TITULLI"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTISTI [ ALBUMI ] - KËNGA. TITULLI"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "TITULLI I ALBUMIT"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategoria"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Porosi"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Formati i titullit"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Vargu me porosi"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Menaxheri i radhëve"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Mbyll Dialogun për aktivizimin këngëlistës"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Hap URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Shto URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Hyrje URL"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Mesazhe e tjera kanë qenë të fshehura.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Asnjë e dhëne e gjindëshme për %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Emëriskedarit"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/sr.po b/po/sr.po
index 7fffb8ab8940..a83593cb195c 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -3,17 +3,17 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# MirosNik <miroslavnikolic at rocketmail.com>, 2013
+# Мирослав Николић <miroslavnikolic at rocketmail.com>, 2013
 # Strahinja Kustudic <kustudic at gmail.com>, 2007-2008
-# MirosNik <miroslavnikolic at rocketmail.com>, 2011-2012,2014
-# MirosNik <miroslavnikolic at rocketmail.com>, 2013
+# Мирослав Николић <miroslavnikolic at rocketmail.com>, 2011-2014
+# Мирослав Николић <miroslavnikolic at rocketmail.com>, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-23 19:18+0000\n"
+"Last-Translator: Мирослав Николић <miroslavnikolic at rocketmail.com>\n"
 "Language-Team: Serbian (http://www.transifex.com/projects/p/audacious/"
 "language/sr/)\n"
 "Language: sr\n"
@@ -23,97 +23,81 @@ msgstr ""
 "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"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Тражим ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Пронашао сам %d датотеку"
-msgstr[1] "Пронашао сам %d датотеке"
-msgstr[2] "Пронашао сам %d датотека"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Нови списак нумера"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Грeшкa"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Приказује помоћ линије наредби"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Приказује издање"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Започиње пуштање"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Паузира пуштање"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Паузира ако свира, иначе пушта"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Зауставља пуштање"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Иде на претходну песму"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Иде на следећу песму"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Додаје датотеке на списак нумера"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Додаје датотеке на привремени списак нумера"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Приказује главни прозор"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Приказује прозор за бирање песама"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Покреће се без графичког сучеља"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Излази на заустављање пуштања"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Исписује поруке прочишћавања"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Исписује поруке прочишћавања (може бити коришћено два пута)"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Ради у Кут режиму"
+
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Непозната опција: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Непозната опција: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -122,35 +106,57 @@ msgstr ""
 "Употреба: audacious [ОПЦИЈА] ... [ДАТОТЕКА] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Безочник"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Нисам пронашао декодер за „%s“."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Пронашао сам %d датотеку"
+msgstr[1] "Пронашао сам %d датотеке"
+msgstr[2] "Пронашао сам %d датотека"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "Не могу да отворим „%s“."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Нови списак нумера"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Не могу да учитам „%s“: проширење датотеке није подржано."
+msgid "Audio CD, track %s"
+msgstr "Звучни ЦД, нумера %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(грешка кодирања знакова)"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Грешка учитавања прикључка"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Не могу да сачувам „%s“: проширење датотеке није подржано."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"Грешка отварања „%s“:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Непозната грешка пуштања"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Неисправан запис звука"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Сад пуштам"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -158,888 +164,1052 @@ msgstr ""
 "Списак нумера не може бити поређан зато што је прегледање метаподатака још "
 "увек у току (или је искључено)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr ""
-
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr ""
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "Не могу да учитам „%s“: проширење назива датотеке није подржано."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Подеси"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "Не могу да сачувам „%s“: проширење назива датотеке није подржано."
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Откажи"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Грешка премотавања"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Затвори"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Запис датотеке није познат"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Подешавања"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Грешка читања метаподатака"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_О програму"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Моно"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Прикључци ..."
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Стерео"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Изглед"
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d канал"
+msgstr[1] "%d канала"
+msgstr[2] "%d канала"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Звук"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Нумера %d"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Мрежа"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Звучни ЦД"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Списак нумера"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(непознат наслов)"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Подаци песме"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Неисправна путања"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Прикључци"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Непозната шема путање"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Опште"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Неисправан назив датотеке"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Дејство"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Заслуге"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Приказивање"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Дозвола"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Унос"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "O Безочнику"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Пренос"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Да ли желите да трајно уклоните „%s“?"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Извођач"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Уклони"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Албум"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Откажи"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Наслов"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Уклони списак нумера"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Број нумере"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Не питај поново"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Жанр"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Преименуј"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Назив датотеке"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Преименуј списак нумера"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Путања датотеке"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Како желите да назовете овај списак нумера?"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Датум"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Укључи"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Година"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Напомена"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Кодек"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Квалитет"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Ништа"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "арапски"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "балтички"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "кинески"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "грчки"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "јеврејски"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "јапански"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Уједначавач"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "корејски"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Претпојачање"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "пољски"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Отвори датотеке"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "руски"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Отвори"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "тајвански"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Затвори _прозорче на „Отвори“"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "турски"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Додај датотеке"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Покретни зарез"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Додај"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Подешавања сучеља</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Затвори _прозорче на „Додај“"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Прикључак сучеља:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Затвори"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Прикључак излаза:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Наслов"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Подешавања излаза</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Извођач"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Дубина бита:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Албум"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Величина међумеморије:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Жанр"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Година"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Меко исецање"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Нумера"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Користи софтверско управљање јачином звука (није препоручљиво)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Дужина"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Појачање понављања</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Запис:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Укључи појачање понављања"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Квалитет:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Режим албума"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Проток бита:"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Спречи одсецање (препоручљиво)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Кисели џез"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Дотеривања нивоа</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Кисели рок"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Појачај све датотеке:"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Амбијентална"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Бебоп"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Појачај датотеке без ознака:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Блуграс"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Назив домаћина посредника:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Прикључник посредника:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Корисничко име посредника:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Лозинка посредника:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Подешавања посредника</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Укључи коришћење посредника"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Користи потврђивање идентитета са посредником"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Самостални откривач кодирања знакова за:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Резервна кодирања знакова:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Понашање</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Настави пуштање приликом покретања"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Напредуј када је обрисана текућа песма"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Очисти списак нумера приликом отварања датотека"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Отвори датотеке у привременом списку нумера"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Не учитавај метаподатке за песме док се не пусте"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Сагласност</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Протумачи \\ (контра косу црту) као граничник фасцикле"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Омот албума</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Потражи слике које одговарају овим речима (раздвојене зарезом):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Искључи слике које одговарају овим речима (раздвојене зарезом):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Потражи слике које одговарају називу песме"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Потражи дубински"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Дубина претраге: "
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Облачић података</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Прикажи облачиће података"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Застој искакања (десетинке секунде):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Прикажи временску лествицу за текућу песму"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "НАСЛОВ"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ИЗВОЂАЧ — НАСЛОВ"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ИЗВОЂАЧ — АЛБУМ — НАСЛОВ"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ИЗВОЂАЧ — АЛБУМ — БРОЈ. НАСЛОВ"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ИЗВОЂАЧ [ АЛБУМ ] — БРОЈ. НАСЛОВ"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "АЛБУМ — НАСЛОВ"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Категорија"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Произвољно"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Приказ песме</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Прикажи бројеве песама"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Прикажи почетне нуле (02:00 уместо 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Запис наслова:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Произвољна ниска:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Подешавања Безочника"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Не могу да направим директоријум (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Звучни ЦД, нумера %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Моно"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Стерео"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d канал"
-msgstr[1] "%d канала"
-msgstr[2] "%d канала"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Заслуге"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Дозвола"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "O Безочнику"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Да ли желите да трајно уклоните „%s“?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Уклони"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Уклони списак нумера"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Не питај поново"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Преименуј списак нумера"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Како желите да назовете овај списак нумера?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Укључи"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Уједначавач"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Претпојачање"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Нумера"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Дужина"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Запис:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Квалитет:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Проток бита:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Кисели џез"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Кисели рок"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Амбијентална"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Бебоп"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Блуграс"
-
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "Блуз"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Камерна музика"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Класична"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Кантри"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Мртви метал"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Диско"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Лако слушање"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Народна"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Фанки"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Гангста реп"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Верска"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Гранџ"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Хард рок"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Хеви метал"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Хип-Хоп"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "Хауз"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Џез"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Џунгла"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Метал"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "Ново доба"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "Нови талас"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Бука"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Поп"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Панк Рок"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Реп"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Реге"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Рок"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Рокенрол"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Ритам и Блуз"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ска"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Соул"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Свинг"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Техно"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Трип-Хоп"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Чување је успело"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Чување није успело"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Подаци песме"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Извођач албума"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Напомена"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Број нумере"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Очисти _поља када прелазиш на следећу песму"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Сачувај"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Следеће"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "Н/Д"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Нису доступни подаци за „%s“.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Скочи"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Пређи на време"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Унесите време (минути:секунде):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Да препишем „%s“?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Стави у ред"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Избаци из _реда"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Пређи на песму"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Пропусник: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Пропусти:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Затвори после _скока"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
-msgstr ""
+msgstr "_Препиши"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Потврди преписивање"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Да препишем „%s“?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Извези списак нумера"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
-msgstr ""
+msgstr "_Извези"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Увези списак нумера"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
-msgstr ""
+msgstr "_Увези"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Управник реда"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Прикључци ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "Избаци из _реда"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "О програму „%s“"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Отвори датотеке"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "Подешавања %sа"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Отвори"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Подеси"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Затвори _прозорче на „Отвори“"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Подешавања"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Додај датотеке"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_О програму"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Додај"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Изглед"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Затвори _прозорче на „Додај“"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Звук"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "Стави у _ред"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Мрежа"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Избаци из _реда"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Списак нумера"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Пређи на песму"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Прикључци"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Пропусник: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Опште"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Пропусти:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Дејство"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Затвори после _скока"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Приказивање"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Управник списка нумера"
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Унос"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Ставке"
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Пренос"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Нова"
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Број нумере"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "_Преименуј"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Назив датотеке"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Пусти"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Путања датотеке"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Затвори прозорче на покретање списка нумера"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Датум"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Кодек"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Квалитет"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Ништа"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "арапски"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "балтички"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "кинески"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "грчки"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "јеврејски"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "јапански"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "корејски"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "пољски"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "руски"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "тајвански"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "турски"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Покретни зарез"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Подешавања сучеља</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Прикључак сучеља:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Прикључак излаза:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Подешавања излаза</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Дубина бита:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Величина међумеморије:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Меко исецање"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Користи софтверско управљање јачином звука (није препоручљиво)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Појачање понављања</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Укључи појачање понављања"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Режим албума"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Спречи одсецање (препоручљиво)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Дотеривања нивоа</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Појачај све датотеке:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Појачај датотеке без ознака:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Назив домаћина посредника:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Прикључник посредника:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Корисничко име посредника:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Лозинка посредника:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Подешавања мреже</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Подешавања посредника</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Укључи коришћење посредника"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Користи потврђивање идентитета са посредником"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Самостални откривач кодирања знакова за:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Резервна кодирања знакова:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Понашање</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Настави пуштање при покретању"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Застани уместо да наставиш одмах"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Напредуј када је обрисана текућа песма"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Очисти списак нумера приликом отварања датотека"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Отвори датотеке у привременом списку нумера"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Сагласност</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Протумачи \\ (контра косу црту) као граничник фасцикле"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Приказ песме</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Прикажи бројеве песама"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Прикажи почетне нуле (02:00 уместо 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Напредно</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Не учитавај метаподатке за песме док се не пусте"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Испробај садржај датотека са непознатим проширењем назива датотеке"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Омот албума</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Потражи слике које одговарају овим речима (раздвојене зарезом):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Искључи слике које одговарају овим речима (раздвојене зарезом):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Потражи слике које одговарају називу песме"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Потражи дубински"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Дубина претраге:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Облачић података</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Прикажи облачиће података"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Застој искакања (десетинке секунде):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Прикажи временску лествицу за текућу песму"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "НАСЛОВ"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ИЗВОЂАЧ — НАСЛОВ"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ИЗВОЂАЧ — АЛБУМ — НАСЛОВ"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ИЗВОЂАЧ — АЛБУМ — БРОЈ. НАСЛОВ"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ИЗВОЂАЧ [ АЛБУМ ] — БРОЈ. НАСЛОВ"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "АЛБУМ — НАСЛОВ"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Категорија"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Произвољно"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Запис наслова:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Произвољна ниска:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Подешавања Безочника"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Управник реда"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Избаци из реда"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Радим ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Грeшкa"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Отворите адресу"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Додајте адресу"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Унеси адресу:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Додатне поруке су скривене.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Отворите фасциклу"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Додајте фасциклу"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Отвори"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Додај"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Метаподаци"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Композитор"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Извођач"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Година снимања"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Датум снимања"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Технички"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "МИМЕ врста"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Проток бита"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Нису доступни подаци за „%s“.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Ниво"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Назив датотеке"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Ред"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Функција"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Порука"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Надзорник дневника"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Ниво дневника:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Прочишћавање"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Подаци"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Упозорење"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Прикључци ..."
diff --git a/po/sr at latin.po b/po/sr at latin.po
index a4cb03f41714..6cb288368e1d 100644
--- a/po/sr at latin.po
+++ b/po/sr at latin.po
@@ -3,17 +3,18 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# MirosNik <miroslavnikolic at rocketmail.com>, 2011-2012
-# MirosNik <miroslavnikolic at rocketmail.com>, 2013
-# MirosNik <miroslavnikolic at rocketmail.com>, 2013
+# Мирослав Николић <miroslavnikolic at rocketmail.com>, 2011-2012
+# Мирослав Николић <miroslavnikolic at rocketmail.com>, 2013
+# Мирослав Николић <miroslavnikolic at rocketmail.com>, 2013
 # Strahinja Kustudic <kustudic at gmail.com>, 2007-2008
+# Мирослав Николић <miroslavnikolic at rocketmail.com>, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/"
 "audacious/language/sr at latin/)\n"
 "Language: sr at latin\n"
@@ -23,132 +24,136 @@ msgstr ""
 "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"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Tražim ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Pronašao sam %d datoteku"
-msgstr[1] "Pronašao sam %d datoteke"
-msgstr[2] "Pronašao sam %d datoteka"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Novi spisak numera"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Prikazuje izdanje"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pauzira ako pušta, inače pušta"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Dodaje datoteke u spisak numera"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Prikazuje glavni prozor"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Izlazi na zaustavljanje puštanja"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Ispisuje poruke za ispravljanje grešaka"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Bezočnik"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Nisam pronašao dekoder za %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Pronašao sam %d datoteku"
+msgstr[1] "Pronašao sam %d datoteke"
+msgstr[2] "Pronašao sam %d datoteka"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "Ne mogu da otvorim „%s“."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Novi spisak numera"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid "Audio CD, track %s"
+msgstr "Zvučni CD, numera %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr ""
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Sad puštam"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -156,888 +161,1052 @@ msgstr ""
 "Spisak numera ne može biti poređan zato što je pregledanje metapodataka još "
 "uvek u toku (ili je isključeno)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanal"
+msgstr[1] "%d kanala"
+msgstr[2] "%d kanala"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Audio"
-
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Mreža"
-
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Spisak numera"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Podaci o pesmi"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Priključci"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Opšte"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Dejstvo"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Prikazivanje"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Zasluge"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Unos"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Dozvola"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Prenos"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "O Bezočniku"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Izvođač"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Naslov"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Broj numere"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Žanr"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Naziv datoteke"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Putanja datoteke"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Preimenuj spisak numera"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Datum"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Godina"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Uključi"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Komentar"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Kodek"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kvalitet"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Ništa"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arapski"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltički"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Kineski"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Grčki"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Jevrejski"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japanski"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Korejski"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ujednačavač"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Poljski"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Pretpojačanje"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Ruski"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Otvorite datoteke"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Tajvanski"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turski"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Pokretni zarez"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Dodajte datoteke"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Priključak izlaza:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Podešavanja izlaza</b>"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Naslov"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Dubina bita:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Izvođač"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Veličina međumemorije:"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Žanr"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Meko isecanje"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Godina"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Koristi softversko upravljanje jačinom zvuka (nije preporučljivo)"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Numera"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Pojačanje ponavljanja</b>"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Trajanje"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Uključi pojačanje ponavljanja"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Režim albuma"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Spreči odsecanje (preporučljivo)"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Podesi nivoe</b>"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Kiseli džez"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Pojačaj sve datoteke:"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Kiseli rok"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambijentalna"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Pojačaj datoteke bez oznaka:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Naziv domaćina posrednika:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Blugras"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Priključnik posrednika:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Korisničko ime posrednika:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Lozinka posrednika:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Podešavanja posrednika</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Uključi korišćenje posrednika"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Koristi potvrđivanje identiteta sa posrednikom"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Detektor automatskog kodiranja znakova za:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Rezervno kodiranje znakova:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Ponašanje</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Nastavi puštanje pri pokretanju"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Napreduj kada je obrisana tekuća pesma"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Očisti spisak numera prilikom otvaranja datoteka"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Otvori datoteke u privremenom spisku numera"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Ne učitavaj metapodatke za pesme dok se ne puste"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Usaglašenost</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Protumači \\ (kontra kosu crtu) kao graničnik fascikle"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Omot albuma</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Potraži slike koje odgovaraju ovim rečima (razdvojene zarezom):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Isključi slike koje odgovaraju ovim rečima (razdvojene zarezom):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Potražite slike koje odgovaraju nazivu pesme"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Potraži dubinski"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Dubina pretrage:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Oblačić informacija</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Prikaži oblačiće podataka"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Zastoj prikaza (desetinke sekunde):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Prikažite vremensku lestvicu za tekuću pesmu"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "NASLOV"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "IZVOĐAČ — NASLOV"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "IZVOĐAČ — ALBUM — NASLOV"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "IZVOĐAČ — ALBUM — BROJ. NASLOV"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "IZVOĐAČ [ ALBUM ] — BROJ. NASLOV"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM — NASLOV"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategorija"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Proizvoljno"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Prikaz pesme</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Prikaži brojeve pesama"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Prikaži početne nule (02:00 umesto 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Zapis naslova:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Proizvoljna niska:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Ne mogu da napravim fasciklu (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Zvučni CD, numera %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanal"
-msgstr[1] "%d kanala"
-msgstr[2] "%d kanala"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Zasluge"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Dozvola"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "O Bezočniku"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Preimenuj spisak numera"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Uključi"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ujednačavač"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Pretpojačanje"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Numera"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Trajanje"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Kiseli džez"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Kiseli rok"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambijentalna"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Blugras"
-
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "Bluz"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Kamerna muzika"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klasična"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Kantri"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Mrtvi metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disko"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Lako slušanje"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Narodna"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Fanki"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta rep"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Verska"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grandž"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard rok"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Hevi metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-Hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "Haus"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Džez"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Džungla"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "Novo doba"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "Novi talas"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Buka"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Pank Rok"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rep"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Rege"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rok"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rokenrol"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Ritam i Bluz"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Sving"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Tehno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-Hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Podaci o pesmi"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Komentar"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Nisu dostupni podaci za %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Pređi na vreme"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Unesite vreme (minuti:sekunde):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Da prepišem %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "Stavi u _red"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Izbaci iz _reda"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Pređi na pesmu"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Propusnik: "
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Propusnik:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Da prepišem %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Izvezi spisak"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Uvezi spisak"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Upravnik redosleda"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Otvorite datoteke"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Dodajte datoteke"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Audio"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Mreža"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Spisak numera"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Priključci"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Opšte"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Dejstvo"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Prikazivanje"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Unos"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Prenos"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "Stavi u _red"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Izbaci iz _reda"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Pređi na pesmu"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Datum"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Propusnik: "
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Kodek"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Propusnik:"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kvalitet"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Ništa"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arapski"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltički"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Kineski"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Grčki"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Jevrejski"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japanski"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Korejski"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Poljski"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Ruski"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Tajvanski"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turski"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Pokretni zarez"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Upravnik spiska numera"
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Priključak izlaza:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Podešavanja izlaza</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Dubina bita:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Veličina međumemorije:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Meko isecanje"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Stavke"
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Koristi softversko upravljanje jačinom zvuka (nije preporučljivo)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Pojačanje ponavljanja</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Uključi pojačanje ponavljanja"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Režim albuma"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Spreči odsecanje (preporučljivo)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Podesi nivoe</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Pojačaj sve datoteke:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Pojačaj datoteke bez oznaka:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Naziv domaćina posrednika:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Priključnik posrednika:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Korisničko ime posrednika:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Lozinka posrednika:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Podešavanja posrednika</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Uključi korišćenje posrednika"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Koristi potvrđivanje identiteta sa posrednikom"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Detektor automatskog kodiranja znakova za:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Rezervno kodiranje znakova:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Ponašanje</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Napreduj kada je obrisana tekuća pesma"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Očisti spisak numera prilikom otvaranja datoteka"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Otvori datoteke u privremenom spisku numera"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Usaglašenost</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Protumači \\ (kontra kosu crtu) kao graničnik fascikle"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Prikaz pesme</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Prikaži brojeve pesama"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Prikaži početne nule (02:00 umesto 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Ne učitavaj metapodatke za pesme dok se ne puste"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Omot albuma</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Potraži slike koje odgovaraju ovim rečima (razdvojene zarezom):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Isključi slike koje odgovaraju ovim rečima (razdvojene zarezom):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Potražite slike koje odgovaraju nazivu pesme"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Potraži dubinski"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Dubina pretrage:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Oblačić informacija</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Prikaži oblačiće podataka"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Zastoj prikaza (desetinke sekunde):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Prikažite vremensku lestvicu za tekuću pesmu"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "NASLOV"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "IZVOĐAČ — NASLOV"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "IZVOĐAČ — ALBUM — NASLOV"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "IZVOĐAČ — ALBUM — BROJ. NASLOV"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "IZVOĐAČ [ ALBUM ] — BROJ. NASLOV"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM — NASLOV"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategorija"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Proizvoljno"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Zapis naslova:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Proizvoljna niska:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Upravnik redosleda"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Zatvori prozorče nakon aktiviranja spiska numera"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Otvorite adresu"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Dodajte adresu"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Unesi adresu:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "sss(Dodatne poruke su skrivene.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Nisu dostupni podaci za %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Naziv datoteke"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/sr_RS.po b/po/sr_RS.po
index 5e22ad5b26ad..23446334b66b 100644
--- a/po/sr_RS.po
+++ b/po/sr_RS.po
@@ -3,14 +3,14 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# MirosNik <miroslavnikolic at rocketmail.com>, 2014
+# Мирослав Николић <miroslavnikolic at rocketmail.com>, 2014
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-03-15 22:38+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Serbian (Serbia) (http://www.transifex.com/projects/p/"
 "audacious/language/sr_RS/)\n"
 "Language: sr_RS\n"
@@ -20,97 +20,81 @@ msgstr ""
 "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"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Тражим ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Пронашао сам %d датотеку"
-msgstr[1] "Пронашао сам %d датотеке"
-msgstr[2] "Пронашао сам %d датотека"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Нови списак нумера"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Грeшкa"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Приказује помоћ линије наредби"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Приказује издање"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Започиње пуштање"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Паузира пуштање"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Паузира ако свира, иначе пушта"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Зауставља пуштање"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Иде на претходну песму"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Иде на следећу песму"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Додаје датотеке на списак нумера"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Додаје датотеке на привремени списак нумера"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Приказује главни прозор"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Приказује прозор за бирање песама"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Покреће се без графичког сучеља"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Излази на заустављање пуштања"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Исписује поруке прочишћавања"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Непозната опција: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Непозната опција: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -119,35 +103,55 @@ msgstr ""
 "Употреба: audacious [ОПЦИЈА] ... [ДАТОТЕКА] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Безочник"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Нисам пронашао декодер за „%s“."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Пронашао сам %d датотеку"
+msgstr[1] "Пронашао сам %d датотеке"
+msgstr[2] "Пронашао сам %d датотека"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "Не могу да отворим „%s“."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Нови списак нумера"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Не могу да учитам „%s“: проширење датотеке није подржано."
+msgid "Audio CD, track %s"
+msgstr "Звучни ЦД, нумера %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Не могу да сачувам „%s“: проширење датотеке није подржано."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Сад пуштам"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -155,887 +159,952 @@ msgstr ""
 "Списак нумера не може бити поређан зато што је прегледање метаподатака још "
 "увек у току (или је искључено)."
 
-#: src/audacious/plugin-preferences.c:55
-#, fuzzy
-msgid "About"
-msgstr "О програму "
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-#, fuzzy
-msgid "Settings"
-msgstr " Подешавања"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Подеси"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Откажи"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Затвори"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Подешавања"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Моно"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_О програму"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Стерео"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Прикључци ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d канал"
+msgstr[1] "%d канала"
+msgstr[2] "%d канала"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Изглед"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Звук"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Мрежа"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Списак нумера"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Подаци песме"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Прикључци"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Опште"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Заслуге"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Дејство"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Дозвола"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Приказивање"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "O Безочнику"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Унос"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Да ли желите да трајно уклоните „%s“?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Пренос"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Уклони"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Извођач"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Откажи"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Албум"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Уклони списак нумера"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Наслов"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Не питај поново"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Број нумере"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Жанр"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Преименуј списак нумера"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Назив датотеке"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Како желите да назовете овај списак нумера?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Путања датотеке"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Укључи"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Датум"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Година"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Напомена"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Кодек"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Квалитет"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Ништа"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "арапски"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "балтички"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "кинески"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "грчки"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "јеврејски"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Уједначавач"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "јапански"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Претпојачање"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "корејски"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Отвори датотеке"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "пољски"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Отвори"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "руски"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Затвори _прозорче на „Отвори“"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "тајвански"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Додај датотеке"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "турски"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Додај"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Покретни зарез"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Затвори _прозорче на „Додај“"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Подешавања сучеља</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Затвори"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Прикључак сучеља:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Наслов"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Прикључак излаза:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Извођач"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Подешавања излаза</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Албум"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Дубина бита:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Жанр"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Величина међумеморије:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Година"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Нумера"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Меко исецање"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Дужина"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Користи софтверско управљање јачином звука (није препоручљиво)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Запис:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Појачање понављања</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Квалитет:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Укључи појачање понављања"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Проток бита:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Режим албума"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Кисели џез"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Спречи одсецање (препоручљиво)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Кисели рок"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Дотеривања нивоа</b>"
-
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Појачај све датотеке:"
-
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
-
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Појачај датотеке без ознака:"
-
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Назив домаћина посредника:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Прикључник посредника:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Корисничко име посредника:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Лозинка посредника:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Подешавања посредника</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Укључи коришћење посредника"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Користи потврђивање идентитета са посредником"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Самостални откривач кодирања знакова за:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Резервна кодирања знакова:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Понашање</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Настави пуштање приликом покретања"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Напредуј када је обрисана текућа песма"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Очисти списак нумера приликом отварања датотека"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Отвори датотеке у привременом списку нумера"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Не учитавај метаподатке за песме док се не пусте"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Сагласност</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Протумачи \\ (контра косу црту) као граничник фасцикле"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Омот албума</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Потражи слике које одговарају овим речима (раздвојене зарезом):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Искључи слике које одговарају овим речима (раздвојене зарезом):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Потражи слике које одговарају називу песме"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Потражи дубински"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Дубина претраге: "
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Облачић података</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Прикажи облачиће података"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Застој искакања (десетинке секунде):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Прикажи временску лествицу за текућу песму"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "НАСЛОВ"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ИЗВОЂАЧ — НАСЛОВ"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ИЗВОЂАЧ — АЛБУМ — НАСЛОВ"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ИЗВОЂАЧ — АЛБУМ — БРОЈ. НАСЛОВ"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ИЗВОЂАЧ [ АЛБУМ ] — БРОЈ. НАСЛОВ"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "АЛБУМ — НАСЛОВ"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Категорија"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Произвољно"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Приказ песме</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Прикажи бројеве песама"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Прикажи почетне нуле (02:00 уместо 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Запис наслова:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Произвољна ниска:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Подешавања Безочника"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Не могу да направим директоријум (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Звучни ЦД, нумера %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Моно"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Стерео"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d канал"
-msgstr[1] "%d канала"
-msgstr[2] "%d канала"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Заслуге"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Дозвола"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "O Безочнику"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Да ли желите да трајно уклоните „%s“?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Уклони"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Уклони списак нумера"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Не питај поново"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Преименуј списак нумера"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Како желите да назовете овај списак нумера?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Укључи"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Уједначавач"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Претпојачање"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Нумера"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Дужина"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Запис:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Квалитет:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Проток бита:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Кисели џез"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Кисели рок"
-
-#: src/libaudgui/infowin.c:78
+#: src/libaudgui/infowin.cc:85
 msgid "Ambient"
 msgstr "Амбијентална"
 
-#: src/libaudgui/infowin.c:79
+#: src/libaudgui/infowin.cc:86
 msgid "Bebop"
 msgstr "Бебоп"
 
-#: src/libaudgui/infowin.c:80
+#: src/libaudgui/infowin.cc:87
 msgid "Bluegrass"
 msgstr "Блуграс"
 
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "Блуз"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Камерна музика"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Класична"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Кантри"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Мртви метал"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Диско"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Лако слушање"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Народна"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Фанки"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Гангста реп"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Верска"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Гранџ"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Хард рок"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Хеви метал"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Хип-Хоп"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "Хауз"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Џез"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Џунгла"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Метал"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "Ново доба"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "Нови талас"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Бука"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Поп"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Панк Рок"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Реп"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Реге"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Рок"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Рокенрол"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Ритам и Блуз"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ска"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Соул"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Свинг"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Техно"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Трип-Хоп"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Чување је успело"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Чување није успело"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Подаци песме"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Напомена"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Број нумере"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Сачувај"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "Н/Д"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Нису доступни подаци за „%s“.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Скочи"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Пређи на време"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Унесите време (минути:секунде):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Да препишем „%s“?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "Стави у _ред"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Избаци из _реда"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Пређи на песму"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Пропусник: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Пропусти:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Затвори после _скока"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Потврди преписивање"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Да препишем „%s“?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Извези списак нумера"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Увези списак нумера"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Управник реда"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Прикључци ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "Избаци из _реда"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Отвори датотеке"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Отвори"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Подеси"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Затвори _прозорче на „Отвори“"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Подешавања"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Додај датотеке"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_О програму"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Додај"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Изглед"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Затвори _прозорче на „Додај“"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Звук"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "Стави у _ред"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Мрежа"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Избаци из _реда"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Списак нумера"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Пређи на песму"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Прикључци"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Пропусник: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Опште"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Пропусти:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Дејство"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Затвори после _скока"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Приказивање"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Унос"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Пренос"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Датум"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Кодек"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Квалитет"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Ништа"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "арапски"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "балтички"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "кинески"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "грчки"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "јеврејски"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "јапански"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "корејски"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "пољски"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "руски"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "тајвански"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "турски"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Покретни зарез"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Подешавања сучеља</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Прикључак сучеља:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Прикључак излаза:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Подешавања излаза</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Дубина бита:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Величина међумеморије:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Меко исецање"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Користи софтверско управљање јачином звука (није препоручљиво)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Појачање понављања</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Укључи појачање понављања"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Режим албума"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Спречи одсецање (препоручљиво)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Дотеривања нивоа</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Појачај све датотеке:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Управник списка нумера"
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Појачај датотеке без ознака:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Назив домаћина посредника:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Прикључник посредника:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Корисничко име посредника:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Лозинка посредника:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Подешавања посредника</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Укључи коришћење посредника"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Користи потврђивање идентитета са посредником"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Самостални откривач кодирања знакова за:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Резервна кодирања знакова:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Понашање</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Напредуј када је обрисана текућа песма"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Очисти списак нумера приликом отварања датотека"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Отвори датотеке у привременом списку нумера"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Сагласност</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Протумачи \\ (контра косу црту) као граничник фасцикле"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Приказ песме</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Прикажи бројеве песама"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Прикажи почетне нуле (02:00 уместо 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Не учитавај метаподатке за песме док се не пусте"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Омот албума</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Потражи слике које одговарају овим речима (раздвојене зарезом):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Искључи слике које одговарају овим речима (раздвојене зарезом):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Потражи слике које одговарају називу песме"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Потражи дубински"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Дубина претраге: "
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Облачић података</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Прикажи облачиће података"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Ставке"
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Застој искакања (десетинке секунде):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Прикажи временску лествицу за текућу песму"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "НАСЛОВ"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ИЗВОЂАЧ — НАСЛОВ"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ИЗВОЂАЧ — АЛБУМ — НАСЛОВ"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ИЗВОЂАЧ — АЛБУМ — БРОЈ. НАСЛОВ"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ИЗВОЂАЧ [ АЛБУМ ] — БРОЈ. НАСЛОВ"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "АЛБУМ — НАСЛОВ"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Категорија"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Произвољно"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Запис наслова:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Произвољна ниска:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Подешавања Безочника"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Нова"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Управник реда"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "_Преименуј"
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "Избаци из _реда"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Пусти"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_Затвори прозорче на покретање списка нумера"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Грeшкa"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Отворите адресу"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Додајте адресу"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Унеси адресу:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
@@ -1043,5 +1112,99 @@ msgstr ""
 "\n"
 "(Додатне поруке су скривене.)"
 
-#~ msgid "_Remember"
-#~ msgstr "_Запамти"
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Нису доступни подаци за „%s“.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Назив датотеке"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/sv.po b/po/sv.po
index 8bf180020ea7..eaddb9d3fd72 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -3,15 +3,17 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# Bosse <bserrander at gmail.com>, 2013
+# Bo Serrander <bserrander at gmail.com>, 2013
+# Fredrik Ismyren <fredrik at ismyren.se>, 2014
+# Martin Jernberg <bittin at cafe8bitar.se>, 2014
 # Martin Persenius <martin at persenius.net>, 2004
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Swedish (http://www.transifex.com/projects/p/audacious/"
 "language/sv/)\n"
 "Language: sv\n"
@@ -20,1015 +22,1189 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Söker..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Ny spellista"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
-msgstr ""
+msgstr "Visa kommandoradshjälp"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Visa version"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
-msgstr ""
+msgstr "Börja uppspelning "
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
-msgstr ""
+msgstr "Pausa uppspelning "
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Pausa om spelandes, spela annars"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
-msgstr ""
+msgstr "Stoppa uppspelning "
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
-msgstr ""
+msgstr "Byt till förra låten"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
-msgstr ""
+msgstr "Byt till nästa låt"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Lägg till filer i spellista"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
-msgstr ""
+msgstr "Lägg till nya filer i temporär spellista"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Visa huvudfönster"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
-msgstr ""
+msgstr "Visa hoppa-till-låt -fönstret"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
-msgstr ""
+msgstr "Starta utan ett grafiskt interface"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
-msgstr ""
+msgstr "Avsluta vid uppspelnings stopp"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr ""
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Skriv ut avlusningsmeddelanden (kan användas dubbelt)"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Kör i QT-läge"
+
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
-msgstr ""
+msgstr "Okänt alternativ: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
-msgstr ""
+msgstr "Okänt alternativ: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
-msgstr ""
+msgstr "Användning: audacious [OPTION] ... [FILE] ... \n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Kunde inte hitta dekoder för %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d fil funnen"
+msgstr[1] "%d filer funna"
 
-#: src/audacious/playback.c:387
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Ny spellista"
+
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "%s could not be opened."
+msgid "Audio CD, track %s"
+msgstr "Ljud-CD, spår %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
 msgstr ""
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Fel vid laddning av plugin"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
 msgstr ""
+"Fel vid öppning av %s:\n"
+"%s"
 
-#: src/audacious/playlist-files.c:185
-#, c-format
-msgid "Cannot save %s: unsupported file extension."
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Okänt uppspelningsfel"
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Spelar nu"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr ""
+"Spellistan kan inte sorteras eftersom metadata scanning pågår fortfarande "
+"(eller har inaktiverats)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr ""
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Sökfel"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr ""
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Okänt filformat"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr ""
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Fel vid läsning av metadata"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
+
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanal "
+msgstr[1] "%d kanaler"
+
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Ljud"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Felaktig URI"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Nätverk"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Okänt URI-schema"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Spellista"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Låtinformation"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Lista över medverkande"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Plugin"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Licens"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Allmänt"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Om Audacious"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Effekt"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Vill du radera \"%s\" permanent?"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Visualisering"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Ta Bort"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Input"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Avbryt"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr ""
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Ta Bort Spellista"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Artist"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Fråga inte igen"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Byt namn"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Titel"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Döp om spellista"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Spårnummer"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Vad vill du döpa denna spellista till?"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Genre"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Aktivera"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Filnamn"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Sökväg"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Datum"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "År"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Kommentar"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Codec"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kvalitet"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Ingen"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arabisk"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltisk"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Kinesisk"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Equalizer"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Grekisk"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Preamp"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Hebreisk"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Öppna filer"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japansk"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Öppna"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Koreansk"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Stäng _dialogfönstret vid öppning"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Polsk"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Lägg till filer"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Rysk"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Lägg till"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Taiwanesisk"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Stäng _dialogfönstret vid addera"
+
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Stäng"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Turkiska"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Titel"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "flyttal"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Artist"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr ""
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr ""
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Genre"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr ""
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "År"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr ""
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Spår"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bitdjup:"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Längd"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Buffertstorlek:"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Format:"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Kvalite:"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr ""
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bitrate:"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr ""
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr ""
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr ""
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Bakgrundsljud"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Albumläge"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr ""
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr ""
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr ""
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Rumsmusik"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "Klassiskt"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr ""
+#: src/libaudgui/infowin.cc:91
+msgid "Country"
+msgstr "Country"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr ""
+#: src/libaudgui/infowin.cc:92
+msgid "Death Metal"
+msgstr "Dödsmetall"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr ""
+#: src/libaudgui/infowin.cc:93
+msgid "Disco"
+msgstr "Disco"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Proxy användar-ID:"
+#: src/libaudgui/infowin.cc:94
+msgid "Easy Listening"
+msgstr "Easy Listening"
 
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Proxy lösenord:"
+#: src/libaudgui/infowin.cc:95
+msgid "Folk"
+msgstr "Folkdans"
 
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Proxy-konfiguration</b>"
+#: src/libaudgui/infowin.cc:96
+msgid "Funk"
+msgstr "Funk"
 
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Använd proxy"
+#: src/libaudgui/infowin.cc:97
+msgid "Gangsta Rap"
+msgstr "Gangsterrap"
 
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Använd autentisering med proxy"
+#: src/libaudgui/infowin.cc:98
+msgid "Gospel"
+msgstr "Gospell"
 
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr ""
+#: src/libaudgui/infowin.cc:99
+msgid "Grunge"
+msgstr "Grunge"
 
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr ""
+#: src/libaudgui/infowin.cc:100
+msgid "Hard Rock"
+msgstr "Hård rock"
 
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr ""
+#: src/libaudgui/infowin.cc:101
+msgid "Heavy Metal"
+msgstr "Heavy Metal"
 
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr ""
+#: src/libaudgui/infowin.cc:102
+msgid "Hip-hop"
+msgstr "Hip-hop"
 
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr ""
+#: src/libaudgui/infowin.cc:103
+msgid "House"
+msgstr "House"
 
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr ""
+#: src/libaudgui/infowin.cc:104
+msgid "Jazz"
+msgstr "Jazz"
 
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr ""
+#: src/libaudgui/infowin.cc:105
+msgid "Jungle"
+msgstr "Jungel"
 
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr ""
+#: src/libaudgui/infowin.cc:106
+msgid "Metal"
+msgstr "Metall"
 
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr ""
+#: src/libaudgui/infowin.cc:107
+msgid "New Age"
+msgstr "New Age"
 
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr ""
+#: src/libaudgui/infowin.cc:108
+msgid "New Wave"
+msgstr "New Wave"
 
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Albumomslag</b>"
+#: src/libaudgui/infowin.cc:109
+msgid "Noise"
+msgstr "Oljud"
 
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Leta efter bilder som matchar följande ord (kommaseparerade):"
+#: src/libaudgui/infowin.cc:110
+msgid "Pop"
+msgstr "Pop"
 
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Ta inte med bilder som matchar orden (kommaseparerade):"
+#: src/libaudgui/infowin.cc:111
+msgid "Punk Rock"
+msgstr "Punkrock"
 
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Sök efter bilder som matchar låttitel"
+#: src/libaudgui/infowin.cc:112
+msgid "Rap"
+msgstr "Rap"
 
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Rekursiv sökning"
+#: src/libaudgui/infowin.cc:113
+msgid "Reggae"
+msgstr "Reggae"
 
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Sökdjup:"
+#: src/libaudgui/infowin.cc:114
+msgid "Rock"
+msgstr "Rock"
 
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr ""
+#: src/libaudgui/infowin.cc:115
+msgid "Rock and Roll"
+msgstr "Rock and Roll"
 
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Visa popup-information"
+#: src/libaudgui/infowin.cc:116
+msgid "Rhythm and Blues"
+msgstr "Rhythm and Blues"
 
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr ""
+#: src/libaudgui/infowin.cc:117
+msgid "Ska"
+msgstr "Ska"
 
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr ""
+#: src/libaudgui/infowin.cc:118
+msgid "Soul"
+msgstr "Soul"
 
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "RUBRIK"
+#: src/libaudgui/infowin.cc:119
+msgid "Swing"
+msgstr "Swing"
 
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ARTIST - RUBRIK"
+#: src/libaudgui/infowin.cc:120
+msgid "Techno"
+msgstr "Techno"
 
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ARTIST - ALBUM - RUBRIK"
+#: src/libaudgui/infowin.cc:121
+msgid "Trip-hop"
+msgstr "Trip-hop"
 
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ARTIST - ALBUM - SPÅR. RUBRIK"
+#: src/libaudgui/infowin.cc:227
+msgid "Save successful"
+msgstr "Sparning lyckades"
 
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ARTIST [ ALBUM ] - SPÅR. RUBRIK"
+#: src/libaudgui/infowin.cc:231
+msgid "Save error"
+msgstr "Sparning misslyckades"
 
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - RUBRIK"
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Låtinformation"
 
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategori"
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Albumartist"
 
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Anpassad"
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Kommentar"
 
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr ""
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
+msgid "Track Number"
+msgstr "Spår Nummer"
 
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
+msgid "_Save"
+msgstr "_Spara"
+
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Rubrikformat:"
+#: src/libaudgui/infowin.cc:455
+#, c-format
+msgid "%d kb/s"
+msgstr "%d kb/s"
 
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr ""
+#: src/libaudgui/infowin.cc:460
+msgid "N/A"
+msgstr "N/A"
 
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
+msgid "_Jump"
+msgstr "_Hoppa"
 
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Kunde inte skapa mapp (%s): %s\n"
+#: src/libaudgui/jump-to-time.cc:51
+msgid "Jump to Time"
+msgstr "Hoppa till tid"
 
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Ljud-CD, spår %s"
+#: src/libaudgui/jump-to-time.cc:51
+msgid "Enter time (minutes:seconds):"
+msgstr "Ange tid (minuter:sekunder):"
 
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Kö"
 
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Ta _bort från kö"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Hoppa till låt"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Filter:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Filter:"
 
-#: src/libaudcore/tuple.c:446
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "S_täng vid hopp"
+
+#: src/libaudgui/playlists.cc:89
+msgid "_Overwrite"
+msgstr "_Skriv över"
+
+#: src/libaudgui/playlists.cc:93
+msgid "Confirm Overwrite"
+msgstr "Bekräfta överskrivning"
+
+#: src/libaudgui/playlists.cc:93
 #, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Overwrite %s?"
+msgstr "Skriva över %s?"
 
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr ""
+#: src/libaudgui/playlists.cc:123
+msgid "Export Playlist"
+msgstr "Exportera spellista"
 
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Licens"
+#: src/libaudgui/playlists.cc:124
+msgid "_Export"
+msgstr "_Exportera"
 
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Om Audacious"
+#: src/libaudgui/playlists.cc:130
+msgid "Import Playlist"
+msgstr "Importera spellista"
+
+#: src/libaudgui/playlists.cc:131
+msgid "_Import"
+msgstr "_Importera"
+
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Plugins ..."
 
-#: src/libaudgui/confirm.c:51
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
 #, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
+msgid "About %s"
+msgstr "Om %s"
 
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s inställningar"
 
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Ställ in"
+
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Inställningar"
+
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Om"
+
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Utseende"
+
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Ljud"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Nätverk"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Spellista"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Plugin"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Allmänt"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Effekt"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Visualisering"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Input"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Transport"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
 msgstr ""
 
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
 msgstr ""
 
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Döp om spellista"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Datum"
 
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Codec"
 
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Aktivera"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kvalitet"
 
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Ingen"
 
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arabisk"
 
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltisk"
 
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Kinesisk"
 
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Grekisk"
 
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Hebreisk"
 
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japansk"
 
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Koreansk"
 
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Polsk"
 
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Rysk"
 
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Equalizer"
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Taiwanesisk"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Turkiska"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "flyttal"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b> Interface Inställningar</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Interface plugin:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Utgångsplugin:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Utgångsinställningar</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bitdjup:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Buffertstorlek:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Mjuk klippning"
 
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Preamp"
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Använd programvaru volymkontroll (rekommenderas inte)"
 
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Spår"
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Replay Gain</b>"
 
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Längd"
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Aktivera ReplayGain"
 
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Albumläge"
 
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Förhindra klippning (rekommenderas)"
 
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b> Justera nivåer </ b>"
 
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Förstärk alla filer:"
 
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
 
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Bakgrundsljud"
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Förstärk otaggade filer:"
 
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Proxy hostname:"
 
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Proxy port:"
 
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Proxy användar-ID:"
 
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Rumsmusik"
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Proxy lösenord:"
 
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "Klassiskt"
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Nätverksinställningar</b>"
 
-#: src/libaudgui/infowin.c:84
-msgid "Country"
-msgstr "Country"
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
 
-#: src/libaudgui/infowin.c:85
-msgid "Death Metal"
-msgstr "Dödsmetall"
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Proxy-konfiguration</b>"
 
-#: src/libaudgui/infowin.c:86
-msgid "Disco"
-msgstr "Disco"
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Använd proxy"
 
-#: src/libaudgui/infowin.c:87
-msgid "Easy Listening"
-msgstr "Easy Listening"
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Använd autentisering med proxy"
 
-#: src/libaudgui/infowin.c:88
-msgid "Folk"
-msgstr "Folkdans"
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Automatiskt teckenkodnings detektor för:"
 
-#: src/libaudgui/infowin.c:89
-msgid "Funk"
-msgstr "Funk"
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Reserv teckenkodningar:"
 
-#: src/libaudgui/infowin.c:90
-msgid "Gangsta Rap"
-msgstr "Gangsterrap"
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b> Beteende </ b>"
 
-#: src/libaudgui/infowin.c:91
-msgid "Gospel"
-msgstr "Gospell"
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Fortsätt uppspelning vid start"
 
-#: src/libaudgui/infowin.c:92
-msgid "Grunge"
-msgstr "Grunge"
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Pausa istället för att direkt fortsätta"
 
-#: src/libaudgui/infowin.c:93
-msgid "Hard Rock"
-msgstr "Hård rock"
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Avancera när den aktuella låten tas bort"
 
-#: src/libaudgui/infowin.c:94
-msgid "Heavy Metal"
-msgstr "Heavy Metal"
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Rensa spellistan när du öppnar filer"
 
-#: src/libaudgui/infowin.c:95
-msgid "Hip-hop"
-msgstr "Hip-hop"
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Öppna filer i en temporär spellista"
 
-#: src/libaudgui/infowin.c:96
-msgid "House"
-msgstr "House"
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Kompabilitet</b>"
 
-#: src/libaudgui/infowin.c:97
-msgid "Jazz"
-msgstr "Jazz"
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Tolka \\ (omvänt snedstreck) som en mapp avgränsare"
 
-#: src/libaudgui/infowin.c:98
-msgid "Jungle"
-msgstr "Jungel"
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Låtvisning</b>"
 
-#: src/libaudgui/infowin.c:99
-msgid "Metal"
-msgstr "Metall"
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Visa sång nummer"
 
-#: src/libaudgui/infowin.c:100
-msgid "New Age"
-msgstr "New Age"
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Visa ledande nollor (02:00 istället för 02:00)"
 
-#: src/libaudgui/infowin.c:101
-msgid "New Wave"
-msgstr "New Wave"
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Avancerat</b>"
 
-#: src/libaudgui/infowin.c:102
-msgid "Noise"
-msgstr "Oljud"
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Ladda inte låtarnas metadata innan de spelas"
 
-#: src/libaudgui/infowin.c:103
-msgid "Pop"
-msgstr "Pop"
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
 
-#: src/libaudgui/infowin.c:104
-msgid "Punk Rock"
-msgstr "Punkrock"
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Albumomslag</b>"
 
-#: src/libaudgui/infowin.c:105
-msgid "Rap"
-msgstr "Rap"
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Leta efter bilder som matchar följande ord (kommaseparerade):"
 
-#: src/libaudgui/infowin.c:106
-msgid "Reggae"
-msgstr "Reggae"
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Ta inte med bilder som matchar orden (kommaseparerade):"
 
-#: src/libaudgui/infowin.c:107
-msgid "Rock"
-msgstr "Rock"
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Sök efter bilder som matchar låttitel"
 
-#: src/libaudgui/infowin.c:108
-msgid "Rock and Roll"
-msgstr "Rock and Roll"
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Rekursiv sökning"
 
-#: src/libaudgui/infowin.c:109
-msgid "Rhythm and Blues"
-msgstr "Rhythm and Blues"
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Sökdjup:"
 
-#: src/libaudgui/infowin.c:110
-msgid "Ska"
-msgstr "Ska"
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Popup Information</b>"
 
-#: src/libaudgui/infowin.c:111
-msgid "Soul"
-msgstr "Soul"
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Visa popup-information"
 
-#: src/libaudgui/infowin.c:112
-msgid "Swing"
-msgstr "Swing"
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Popup fördröjning (tiondelar av en sekund):"
 
-#: src/libaudgui/infowin.c:113
-msgid "Techno"
-msgstr "Techno"
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Visa tidsskala för aktuell låt"
 
-#: src/libaudgui/infowin.c:114
-msgid "Trip-hop"
-msgstr "Trip-hop"
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "RUBRIK"
 
-#: src/libaudgui/infowin.c:220
-msgid "Save successful"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ARTIST - RUBRIK"
 
-#: src/libaudgui/infowin.c:224
-msgid "Save error"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ARTIST - ALBUM - RUBRIK"
 
-#: src/libaudgui/infowin.c:359
-msgid "Track Number"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ARTIST - ALBUM - SPÅR. RUBRIK"
 
-#: src/libaudgui/infowin.c:367
-msgid "_Save"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ARTIST [ ALBUM ] - SPÅR. RUBRIK"
 
-#: src/libaudgui/infowin.c:418
-#, c-format
-msgid "%d kb/s"
-msgstr "%d kb/s"
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - RUBRIK"
 
-#: src/libaudgui/infowin.c:423
-msgid "N/A"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategori"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Ingen information om %s.\n"
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Anpassad"
 
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
-msgid "_Jump"
-msgstr ""
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Rubrikformat:"
 
-#: src/libaudgui/jump-to-time.c:52
-msgid "Jump to Time"
-msgstr "Hoppa till tid"
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Anpassad sträng:"
 
-#: src/libaudgui/jump-to-time.c:52
-msgid "Enter time (minutes:seconds):"
-msgstr "Ange tid (minuter:sekunder):"
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Audacious Inställningar"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Skriva över %s?"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Köhanterare"
 
-#: src/libaudgui/playlists.c:88
-msgid "_Overwrite"
-msgstr ""
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Ta bort från kön"
 
-#: src/libaudgui/playlists.c:92
-msgid "Confirm Overwrite"
-msgstr ""
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Arbetar ..."
 
-#: src/libaudgui/playlists.c:121
-msgid "Export Playlist"
-msgstr "Exportera spellista"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Fel"
 
-#: src/libaudgui/playlists.c:122
-msgid "_Export"
-msgstr ""
+#: src/libaudgui/url-opener.cc:49
+msgid "Open URL"
+msgstr "Öppna URL"
 
-#: src/libaudgui/playlists.c:128
-msgid "Import Playlist"
-msgstr "Importera spellista"
+#: src/libaudgui/url-opener.cc:55
+msgid "Add URL"
+msgstr "Lägg till URL"
 
-#: src/libaudgui/playlists.c:129
-msgid "_Import"
-msgstr ""
+#: src/libaudgui/url-opener.cc:79
+msgid "Enter URL:"
+msgstr "Ange URL:"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
+#: src/libaudgui/util.cc:154
+msgid ""
+"\n"
+"(Further messages have been hidden.)"
 msgstr ""
+"\n"
+"(Ytterligare meddelanden har dolts.)"
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Öppna filer"
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Lägg till filer"
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Metadata"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr ""
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Kompositör"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr ""
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Artist"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Kö"
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Inspelningsår"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Ta _bort från kö"
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Inspelningsdatum"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Hoppa till låt"
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Teknisk"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Filter:"
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIME-typ"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Filter:"
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bitrate"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr ""
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Ingen information om %s.\n"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr ""
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Filnamn"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
 msgstr ""
 
-#: src/libaudgui/url-opener.c:49
-msgid "Open URL"
-msgstr "Öppna URL"
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Loggnivå:"
 
-#: src/libaudgui/url-opener.c:55
-msgid "Add URL"
-msgstr "Lägg till URL"
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Avlusa"
 
-#: src/libaudgui/url-opener.c:74
-msgid "Enter URL:"
-msgstr "Ange URL:"
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Info"
 
-#: src/libaudgui/util.c:173
-msgid ""
-"\n"
-"(Further messages have been hidden.)"
-msgstr ""
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Varning"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Programtillägg ..."
diff --git a/po/ta.po b/po/ta.po
index 1fadbad2b11f..cfd1bfb322d6 100644
--- a/po/ta.po
+++ b/po/ta.po
@@ -3,17 +3,17 @@
 # This file is distributed under the same license as the Audacious package.
 #
 # Translators:
-# bage <bagerathan at gmail.com>, 2013
-# nar7esh <rajnareshwar at gmail.com>, 2013
-# nar7esh <rajnareshwar at gmail.com>, 2013
-# bage <bagerathan at gmail.com>, 2013
+# Sivarajah Bagerathan <bagerathan at gmail.com>, 2013
+# Nareshwar Raju Vaneshwar <rajnareshwar at gmail.com>, 2013
+# Nareshwar Raju Vaneshwar <rajnareshwar at gmail.com>, 2013
+# Sivarajah Bagerathan <bagerathan at gmail.com>, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Tamil (http://www.transifex.com/projects/p/audacious/language/"
 "ta/)\n"
 "Language: ta\n"
@@ -22,131 +22,135 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "தேடுகின்றது ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d கோப்பு காணப்படவில்லை"
-msgstr[1] "%d கோப்புக்கள் காணப்படவில்லை"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "புதிய பாடல் பட்டியல்"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "பதிப்பை காட்டு"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "பாடல் இயங்குமானால் இடைநிறுத்து, இல்லையெனில் இயங்க வை"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "பாடல் பட்டியலுக்கு கோப்புகளை உட்செலுத்தவும்"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "பிரதான சாளரத்தை காட்சிப்படுத்தவும்"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "பாடல் இயக்கத்தை நிறுத்தும் போது விலக்குக"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "வழு நீக்கல் தகவல்களை திரையிடு "
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "ஔடகிவஸ்"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "%s இற்கான குறிவிலக்கிகள் காணப்படவில்லை "
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d கோப்பு காணப்படவில்லை"
+msgstr[1] "%d கோப்புக்கள் காணப்படவில்லை"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s இனை திறக்க முடியவில்லை "
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "புதிய பாடல் பட்டியல்"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
+msgid "Audio CD, track %s"
+msgstr "ஒலி இறுவட்டு, பாடல், %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "தற்போது இயக்கப்படுவது"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -154,885 +158,1049 @@ msgstr ""
 "மீத்தரவு வருடுதல் இடம்பெறுவதால் பாடல் பட்டியலை வரிசையாக்க இயலவில்லை (அல்லது "
 "முடக்கப்பட்டுள்ளது)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr ""
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "தனித்த "
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr ""
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "ஒலிப்பிரிப்பு"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr ""
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] ""
+msgstr[1] ""
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "ஒலி"
-
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "வலையமைப்பு"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "பாடல் பட்டியல்"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "பாடல் விபரம்"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "நீட்சிகள்"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "பொதுவானது"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "vilaivugal"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "நற்பெயர்கl"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "உருவக காட்சிப்படுthதல் "
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "உரிமம்"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "ulleedu"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "ஔடகிவஸ் பற்றி"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "போக்குவரத்து"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "பாடகர்"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "குறுவட்டு"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "தலைப்பு"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "பாடல் எண்"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "வகை"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "கோப்பின் பெயர்"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "பாடல் பட்டியலினை மறுபெயர் செய்க "
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "கோப்பிற்கு செல்லும் vazhi"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "திகதி"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_செயல்படுத்தவும்"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "வருடம்"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "பின்னூட்டம்"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "குறியாக்கி / விலக்கி"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "தரம்"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "எதுவும் alla"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "அரபிக்"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "பால்ரிக்"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "சீனம்"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "கிரேக்கம்"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "ஹீபுரு"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "ஜப்பானீஸ்"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "சமமாக்கி"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "கொரியன்"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "munperukki"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "பொலிஸ்"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "கோப்புக்களைத் திறkkavum"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "உருசியன்"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "தாய்வானீஸ்"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "துருக்கி"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "கோப்புக்களை சேர்kkavum"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "மிதவை புள்ளி"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "வெளியீட்டு நீட்சிகள்"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "தலைப்பு"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>வெளியீட்டு அமைப்புகl</b>"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "பாடகர்"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "பிட் ஆழம்"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "குறுவட்டு"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "தாங்கல் அளவு"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "வகை"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "வருடம்"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "மென்மையான thundaakkal"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "paadal"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "மென்பொருள் ஒலி கட்டுப்படுத்தியை உபயோகிக்க (பரிந்துரைக்கப்பட்ட முறைமை அல்ல)"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "பாடலின் கால alavidai"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>பயனினை மீளியக்கு</b>"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "பயன் மீளியக்கியை செயல்ப்படுத்துக"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "குறுவட்டு முறைமை"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "நறுக்குதலை தவிர்க்கவும் (பரிந்துரைக்கப்பட்ட முறைமை)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "ஆசிட் ஜாஸ்"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>நிலைகளை சரிசெய்ga</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "ஆசிட் ராக்"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "அனைத்து கோப்புகளினதும் சப்தத்தை perukku:"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "சுற்றுச்சூழல்"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "பெபாப்"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "இணைக்கப்படாத கோப்புகளின் சப்தத்தை பெருக்கு:"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "ப்ளூகிராஸ்"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "பதிலி வழங்குநர் பெயர்"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "ப்ளூஸ்"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "பதிலி போர்ட் எண்:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "பதிலி பயனர்பெயர்:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "பதிலி kadavuchchol"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>பதிலி உள்ளமைவு</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "பதிலி பயன்பாட்டினை செயல்படுத்துக"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "பதிலியுடன் உறுதிப்பாட்டினையும் பயன்படுத்துக "
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "குறியிடப்பட்ட உணர்கருவிகள் எந்த தானியங்கு எழுத்துகளுக்கு: "
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "குறைவடையும் எழுத்துகளுக்கான குறியீடுகள்:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>நடத்தை</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "துவக்கநிலையிலிருந்து பாடல் இயக்கத்தை நீடிக்கச் செய்"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "தற்போதைய பாடல் நீக்கப்படும் பட்சத்தில் அடுத்த பாடலுக்கு முன்னேறு "
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "கோப்புகளை திறக்கும் போது குறித்த பாடல் பட்டியலை நீக்குக "
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "தற்காலிக பாடல் பட்டியலில் கோப்புகளை திறக்க "
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "பாடல்களினை இயக்கும் வரை மீத்தரவினை ஏற்ற வேண்டாம்"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>இணக்கத்தன்மை</b> "
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr " \\ (பின்னோக்கிய சாய்வு) இனை கோப்புறை எல்லையாக வரையறுக்க"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>குறுவட்டு varaivu</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "இச்சொற்களுக்கு பொருத்தமான நிழற்படங்களை தேடுக (காற்புள்ளியால் பிரிக்குக):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "இச்சொற்களுக்கு பொருத்தமான நிழற்படங்களை நீக்குக (காற்புள்ளியால் பிரிக்குக):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "இப்பாடல் கோப்பு பெயருக்கு பொருத்தமான நிழற்படங்களை தேடுக"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "மீள்சுழலலாக தேடுக "
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "தேடும் ஆழம்:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>மேல்மீட்பு தகவல்</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "மேல்மீட்பு தகவல்களை காண்பிkkuga"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "மேல்மீட்பு தாமதம் (ஒரு வினாடியின் பத்து பிரிவுகளாக)"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "தற்போதைய பாடலின் கால அளவிடையை காண்பிக்க"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "thalaippu"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "கலைஞர் - தலைப்பு"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "கலைஞர் - குறுவட்டு - தலைப்பு"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "கலைஞர் - குறுவட்டு - பாடல். தலைப்பு"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "கலைஞர் [குறுவட்டு] - பாடல். தலைப்பு"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "குறுவட்டு - தலைப்பு"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "பிரிவு"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "தனிப்பயன்"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>பாடல் kaatchippaduththu</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "பாடல் இலக்கங்களை kaattuga"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "முன்னைய சுழியத்தை காட்டுக (2:00 இற்கு பதிலாக 02:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "தலைப்பு வடிவம்:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "தனிப்பயன் சரம்:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "கோப்பகமொன்றை உருவாக்க முடியவில்லை (%s): %s⏎\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "ஒலி இறுவட்டு, பாடல், %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "தனித்த "
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "ஒலிப்பிரிப்பு"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "நற்பெயர்கl"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "உரிமம்"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "ஔடகிவஸ் பற்றி"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "பாடல் பட்டியலினை மறுபெயர் செய்க "
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_செயல்படுத்தவும்"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "சமமாக்கி"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "munperukki"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "paadal"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "பாடலின் கால alavidai"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "ஆசிட் ஜாஸ்"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "ஆசிட் ராக்"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "சுற்றுச்சூழல்"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "பெபாப்"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "ப்ளூகிராஸ்"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "ப்ளூஸ்"
-
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "சபை இசை"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "பாரம்பரிய இசை"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "கிராமப்புறப்பாடல்கள் "
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "டெத் metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "எளிதாக கேட்கkகூடியவை"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "நாட்டுப்புறpபாடல்கள்"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "நவனாகரீகமானவை"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "குழு ராப்"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "gaasbel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "granj"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "ஹார்ட் raak"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "ஹெவி mettal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "ஹிப்-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "hawus"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "jaas"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "ஜங்கள்"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "mettal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "புதிய படிப்புகl"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "புதிய alaigal"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "இரைச்சல் சத்தம் "
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "paap"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "பங்க் raak"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "raap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "rage"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "raak"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "ராக் மற்றும் rol"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "ரிதம் மற்றும் blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "skaa"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "sowul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "tekno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "ட்ரிப்-ஹாப் "
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "பாடல் விபரம்"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "பின்னூட்டம்"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr ""
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "எவ்வித தகவல்களும் கிடைக்கவில்லை %s.⏎\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "நேரத்திற்கு செல்லவும் "
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "நேரத்தை பதிவு செய்க (நிமிடங்கள்:வினாடிகள்)"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "%s மேலெழுதுக ?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_வரிசை"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "வரிசைகளை நீக்கு"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "பாடலுக்கு தாவுக"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "வடிகட்டுக"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_வடிகட்டுக:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "%s மேலெழுதுக ?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "பாடல் பட்டியலை ஏற்றுமதி செய்க "
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "பாடல் பட்டியலை இறக்குமதி செய்க "
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "வரிசை நிர்வாகி"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "கோப்புக்களைத் திறkkavum"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "கோப்புக்களை சேர்kkavum"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "ஒலி"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "வலையமைப்பு"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "பாடல் பட்டியல்"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "நீட்சிகள்"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "பொதுவானது"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "vilaivugal"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "உருவக காட்சிப்படுthதல் "
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "ulleedu"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "போக்குவரத்து"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_வரிசை"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "வரிசைகளை நீக்கு"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "பாடலுக்கு தாவுக"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "திகதி"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "வடிகட்டுக"
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "குறியாக்கி / விலக்கி"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_வடிகட்டுக:"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "தரம்"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "எதுவும் alla"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "அரபிக்"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "பால்ரிக்"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "சீனம்"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "கிரேக்கம்"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "ஹீபுரு"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "ஜப்பானீஸ்"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "கொரியன்"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "பொலிஸ்"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "உருசியன்"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "தாய்வானீஸ்"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "துருக்கி"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "மிதவை புள்ளி"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "பாடல் பட்டிய nirvaagi"
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "வெளியீட்டு நீட்சிகள்"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>வெளியீட்டு அமைப்புகl</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "பிட் ஆழம்"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "தாங்கல் அளவு"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "மென்மையான thundaakkal"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "varavugal"
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "மென்பொருள் ஒலி கட்டுப்படுத்தியை உபயோகிக்க (பரிந்துரைக்கப்பட்ட முறைமை அல்ல)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>பயனினை மீளியக்கு</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "பயன் மீளியக்கியை செயல்ப்படுத்துக"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "குறுவட்டு முறைமை"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "நறுக்குதலை தவிர்க்கவும் (பரிந்துரைக்கப்பட்ட முறைமை)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>நிலைகளை சரிசெய்ga</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "அனைத்து கோப்புகளினதும் சப்தத்தை perukku:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "இணைக்கப்படாத கோப்புகளின் சப்தத்தை பெருக்கு:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "பதிலி வழங்குநர் பெயர்"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "பதிலி போர்ட் எண்:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "பதிலி பயனர்பெயர்:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "பதிலி kadavuchchol"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>பதிலி உள்ளமைவு</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "பதிலி பயன்பாட்டினை செயல்படுத்துக"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "பதிலியுடன் உறுதிப்பாட்டினையும் பயன்படுத்துக "
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "குறியிடப்பட்ட உணர்கருவிகள் எந்த தானியங்கு எழுத்துகளுக்கு: "
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "குறைவடையும் எழுத்துகளுக்கான குறியீடுகள்:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>நடத்தை</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "தற்போதைய பாடல் நீக்கப்படும் பட்சத்தில் அடுத்த பாடலுக்கு முன்னேறு "
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "கோப்புகளை திறக்கும் போது குறித்த பாடல் பட்டியலை நீக்குக "
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "தற்காலிக பாடல் பட்டியலில் கோப்புகளை திறக்க "
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>இணக்கத்தன்மை</b> "
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr " \\ (பின்னோக்கிய சாய்வு) இனை கோப்புறை எல்லையாக வரையறுக்க"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>பாடல் kaatchippaduththu</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "பாடல் இலக்கங்களை kaattuga"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "முன்னைய சுழியத்தை காட்டுக (2:00 இற்கு பதிலாக 02:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "பாடல்களினை இயக்கும் வரை மீத்தரவினை ஏற்ற வேண்டாம்"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>குறுவட்டு varaivu</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "இச்சொற்களுக்கு பொருத்தமான நிழற்படங்களை தேடுக (காற்புள்ளியால் பிரிக்குக):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "இச்சொற்களுக்கு பொருத்தமான நிழற்படங்களை நீக்குக (காற்புள்ளியால் பிரிக்குக):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "இப்பாடல் கோப்பு பெயருக்கு பொருத்தமான நிழற்படங்களை தேடுக"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "மீள்சுழலலாக தேடுக "
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "தேடும் ஆழம்:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>மேல்மீட்பு தகவல்</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "மேல்மீட்பு தகவல்களை காண்பிkkuga"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "மேல்மீட்பு தாமதம் (ஒரு வினாடியின் பத்து பிரிவுகளாக)"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "தற்போதைய பாடலின் கால அளவிடையை காண்பிக்க"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "thalaippu"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "கலைஞர் - தலைப்பு"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "கலைஞர் - குறுவட்டு - தலைப்பு"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "கலைஞர் - குறுவட்டு - பாடல். தலைப்பு"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "கலைஞர் [குறுவட்டு] - பாடல். தலைப்பு"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "குறுவட்டு - தலைப்பு"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "பிரிவு"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "தனிப்பயன்"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "தலைப்பு வடிவம்:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "தனிப்பயன் சரம்:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "வரிசை நிர்வாகி"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "_செயல்படுத்தும் போது உரையாடல் பெட்டியினை மூடுக"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "முகவரியை திற"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "முகவரியை சேர்"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "முகவரியை உள்ளிடு:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "எவ்வித தகவல்களும் கிடைக்கவில்லை %s.⏎\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "கோப்பின் பெயர்"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/tr.po b/po/tr.po
index 6435dace9bd3..06d777d36b1d 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -14,20 +14,24 @@
 # hsngrms <dead-bodies-everywhere at hotmail.com>, 2012
 # Imnune <alikoc at hush.ai>, 2012
 # irem harmancı <kodadiirem at gmail.com>, 2013
+# irem harmancı <kodadiirem at gmail.com>, 2013
 # maruf1 <turk.etna at gmail.com>, 2013
+# M. Tayyip Yel <m.tayyib.yel at gmail.com>, 2013
 # Murat Senel <muratasenel at gmail.com>, 2007
 # Murat Şenel <muratasenel at gmail.com>, 2007
 # Zekeriya Cihan <zekeriya.cihan at gmail.com>, 2013
+# Önder Yıldırım <onder.y at msn.com>, 2013
 # tarkan255 <t.oguzman at hotmail.com>, 2012
 # M. Tayyip Yel <m.tayyib.yel at gmail.com>, 2013
 # tarkan255 <t.oguzman at hotmail.com>, 2012
-# Volkan Gezer <volkangezer at gmail.com>, 2014
+# Volkan Gezer <volkangezer at gmail.com>, 2014-2015
+# Zekeriya Cihan <zekeriya.cihan at gmail.com>, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 12:43+0000\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2015-02-13 00:58+0000\n"
 "Last-Translator: Volkan Gezer <volkangezer at gmail.com>\n"
 "Language-Team: Turkish (http://www.transifex.com/projects/p/audacious/"
 "language/tr/)\n"
@@ -37,96 +41,81 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Aranıyor..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d dosya bulundu"
-msgstr[1] "%d dosya bulundu"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Yeni Çalma Listesi"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Hata"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Komut satırı yardımını göster"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Sürüm bilgisini göster"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Oynatmayı başlat"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Oynatmayı duraklat"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Duraklat veya devam et"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Oynatmayı durdur"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Önceki şarkıya geç"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Sonraki şarkıya geç"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Çalma listesine dosya ekle"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Dosyaları geçici bir listeye ekle"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Ana pencereyi göster"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Şarkıya atla penceresini görüntüle"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Grafiksel arayüz olmadan başla"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Kayıttan yürütmeyi durdur ve çık"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Hata ayıklama iletilerini göster"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "Hata ayıklama mesajlarını yazdır (iki kez kullanılabilir)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "Qt kipinde çalış"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Bilinmeyen seçenek: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Bilinmeyen seçenek: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -135,35 +124,56 @@ msgstr ""
 "Kullanım: audacious [SEÇENEK] ... [DOSYA] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "%s için çözücü bulunamadı."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d dosya bulundu"
+msgstr[1] "%d dosya bulundu"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s açılamadı."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Yeni Çalma Listesi"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "%s yüklenemiyor: desteklenmeyen dosya uzantısı."
+msgid "Audio CD, track %s"
+msgstr "Ses CD'si, parça %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(karakter kodlama hatası)"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "Eklenti yüklenirken hata"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "%s kaydedilemiyor: desteklenmeyen dosya uzantısı."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"%s açılırken hata:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "Bilinmeyen oynatma hatası"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "Geçersiz ses biçimi"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Şimdi Çalınıyor"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -171,887 +181,1051 @@ msgstr ""
 "Üstveri taraması devam ettiğinden (veya iptal edildiğinden) listede sıralama "
 "yapılamıyor."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Hakkında"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "%s yüklenemiyor: bilinmeyen dosya uzantısı."
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Ayarlar"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "%s kaydedilemiyor: bilinmeyen dosya uzantısı."
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Ayarla"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "Arama hatası"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_İptal"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "Dosya biçimi tanınmadı"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Kapat"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "Üst veri okunurken hata"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "A_yarlar"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Hakkında"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Eklentiler ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kanal"
+msgstr[1] "%d kanal"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Görünüm"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "Parça %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Ses"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "Ses CD'si"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Ağ"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(bilinmeyen başlık)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Çalma Listesi"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "Geçersiz URI"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Şarkı bilgisi"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "Bilinmeyen URI şeması"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Eklentiler"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "Geçersiz dosya adı"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Genel"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Katkıda bulunanlar"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Efekt"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Lisans"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Görsel öğeler"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Audacious Hakkında"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Giriş"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "\"%s\" ögesini kalıcı olarak silmek istiyor musunuz?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Aktarım"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Kaldır"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Sanatçı"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_İptal"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Albüm"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Çalma Listesini Kaldır"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Başlık"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Bir daha sorma"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Parça Numarası"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Yeniden Adlandır"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Tür"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Listeyi Yeniden Adlandır"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Dosya Adı"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Bu dosya adına ne ad vermek istersiniz?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Dosya Yolu"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Etkinleştir"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Tarih"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Yıl"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Yorum"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Çözücü"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Kalite"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Hiçbiri"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Arapça"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Baltık Dili"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Çince"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Yunanca"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "İbranice"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Ekolayzer"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Japonca"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Ön güçlendirme"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Korece"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Dosyaları Aç"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Lehçe"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Aç"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Rusça"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Açtıktan sonra _pencereyi kapat"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Tayvanca"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Dosyaları Ekle"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Türkçe"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Ekle"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Kayan noktalı"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Ekledikten sonra _pencereyi kapat"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Arayüz Ayarları</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Kapat"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Arayüz eklentisi:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Başlık"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Çıkış eklentisi:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Sanatçı"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Çıkış Ayarları</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Albüm"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Bit derinliği:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Tür"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Arabellek boyutu:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Yıl"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Parça"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "Yumuşak kesim"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "uzunluk"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Yazılımsal ses denetimi kullan (önerilmez)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Biçim:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Ses Güçlendirme</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Kalite:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Çalarken ses güçlendirmeyi etkinleştir"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Bit oranı:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Albüm modu"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Tıraşlamayı önle (önerilir)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Seviyeleri Ayarla</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Çevre"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Tüm dosyaları yükselt:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Etiketsiz dosyaları yükselt:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Vekil sunucu makine adı:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Vekil sunucu bağlantı noktası:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Vekil sunucu kullanıcı adı:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Vekil sunucu şifresi:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Vekil Sunucu Yapılandırması</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Vekil sunucu kullanımını etkinleştir"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Vekil sunucu doğrulaması kullan"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Şu dil için otomatik karakter tanımlamayı aç:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Alternatif karakter kodlamaları:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Davranış</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Başlangıçta kalınan yerden devam et"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Çalan şarkı silindiğinde sonrakine atla"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Dosya açarken listeyi temizle"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Dosyaları geçici bir listede aç"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Çalınana kadar şarkı üstverilerini yükleme"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Uyumluluk</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Geriye yatık taksimi ( \\ ) klasör sınırlayıcı olarak yorumla"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Album resmi</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Bu kelimelerle eşleşen resimleri ara (virgülle ayırın)"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Bu kelimeleri içeren resimleri çıkar (virgülle ayırın):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Şarkı ismiyle eşleşen resimleri ara"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Arama yineleme"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Arama derinliği:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Açılır Bilgi</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Popup bilgisi göster"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Popup erteleme (saniyenin onda biri):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Şarkı zamanını göster"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "BAŞLIK"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "SANATÇI - BAŞLIK"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "SANATÇI - ALBÜM - BAŞLIK"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "SANATÇI - ALBÜM - PARÇA. BAŞLIK"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "SANATÇI  [ ALBÜM ] - PARÇA. BAŞLIK"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBÜM - BAŞLIK"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Kategori"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Özel"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Şarkı Göstergesi</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Şarkı numaralarını göster"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Baştaki sıfırları göster (2:00 yerine 02:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Başlık biçimi:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Özel metin:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Audacious Ayarları"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Dizin oluşturulamadı (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Ses CD'si, parça %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kanal"
-msgstr[1] "%d kanal"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Katkıda bulunanlar"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Lisans"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Audacious Hakkında"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "\"%s\" ögesini kalıcı olarak silmek istiyor musunuz?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Kaldır"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Çalma Listesini Kaldır"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Bir daha sorma"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Yeniden Adlandır"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Listeyi Yeniden Adlandır"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Bu dosya adına ne ad vermek istersiniz?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Etkinleştir"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Ekolayzer"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Ön güçlendirme"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Parça"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "uzunluk"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Biçim:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Kalite:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Bit oranı:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Çevre"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Oda müziği"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Klasik"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disko"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Kolay Dinleme"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Caz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Tekno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Kayıt başarılı"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Kayıt hatası"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Şarkı bilgisi"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "Albüm Sanatçısı"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Yorum"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Parça Numarası"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "Sonraki şarkıya geçerken alanları te_mizle"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Kaydet"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "_Sonraki"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "Bilinmiyor"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "%s için kullanılabilir bilgi yok.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Atla"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Zamana Atla"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Giriş zamanı (dakika:saniye):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "%s üzerine yazılsın mı?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Kuyruğa al"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Kuyruktan _çıkar"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Şarkıya Atla"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Süzgeç:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Süzgeç:"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "Geçişten sonra _kapat"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_Üzerine Yaz"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Üzerine Yazmayı Onayla"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "%s üzerine yazılsın mı?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Çalma Listesini Dışa Aktar"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Dışa Aktar"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Çalma Listesini İçe Aktar"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_İçe Aktar"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Kuyruk Yöneticisi"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Eklentiler ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "_Sıradan Kaldır"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "%s Hakkında"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Dosyaları Aç"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Ayarları"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Aç"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Ayarla"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Açtıktan sonra _pencereyi kapat"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "A_yarlar"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Dosyaları Ekle"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Hakkında"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Ekle"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Görünüm"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Ekledikten sonra _pencereyi kapat"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Ses"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Kuyruğa al"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Ağ"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Kuyruktan _çıkar"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Çalma Listesi"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Şarkıya Atla"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Eklentiler"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Süzgeç:"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Genel"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Süzgeç:"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Efekt"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "Geçişten sonra _kapat"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Görsel öğeler"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Giriş"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Aktarım"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "Parça numarası"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "Dosya adı"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "Dosya yolu"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Tarih"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Çözücü"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Kalite"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Hiçbiri"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Arapça"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Baltık Dili"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Çince"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Yunanca"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "İbranice"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Japonca"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Korece"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Lehçe"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Rusça"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Tayvanca"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Türkçe"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Kayan noktalı"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Çalma Listesi Yöneticisi"
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Arayüz Ayarları</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Arayüz eklentisi:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Çıkış eklentisi:"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Girişler"
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Çıkış Ayarları</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Yeni"
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Bit derinliği:"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "_Adlandır"
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Arabellek boyutu:"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Oynat"
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Liste etkinleştirildiğinde diyaloğu _kapat"
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "Yumuşak kesim"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Yazılımsal ses denetimi kullan (önerilmez)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Ses Güçlendirme</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Çalarken ses güçlendirmeyi etkinleştir"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Albüm modu"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Tıraşlamayı önle (önerilir)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Seviyeleri Ayarla</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Tüm dosyaları yükselt:"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Etiketsiz dosyaları yükselt:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Vekil sunucu makine adı:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Vekil sunucu bağlantı noktası:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Vekil sunucu kullanıcı adı:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Vekil sunucu şifresi:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Ağ Ayarları</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Vekil Sunucu Yapılandırması</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Vekil sunucu kullanımını etkinleştir"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Vekil sunucu doğrulaması kullan"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Şu dil için otomatik karakter tanımlamayı aç:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Alternatif karakter kodlamaları:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Davranış</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "Başlangıçta oynatmaya devam et"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "Hemen devam etmek yerine duraklat"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Çalan şarkı silindiğinde sonrakine atla"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Dosya açarken listeyi temizle"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Dosyaları geçici bir listede aç"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Uyumluluk</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Geriye yatık taksimi ( \\ ) klasör sınırlayıcı olarak yorumla"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Şarkı Göstergesi</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Şarkı numaralarını göster"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Baştaki sıfırları göster (2:00 yerine 02:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Gelişmiş</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Çalınana kadar şarkı üstverilerini yükleme"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "Tanımlanamayan dosya uzantısı bulunan dosya içeriklerini tara"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Album resmi</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Bu kelimelerle eşleşen resimleri ara (virgülle ayırın)"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Bu kelimeleri içeren resimleri çıkar (virgülle ayırın):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Şarkı ismiyle eşleşen resimleri ara"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Arama yineleme"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Arama derinliği:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Açılır Bilgi</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Popup bilgisi göster"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Popup erteleme (saniyenin onda biri):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Şarkı zamanını göster"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "BAŞLIK"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "SANATÇI - BAŞLIK"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "SANATÇI - ALBÜM - BAŞLIK"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "SANATÇI - ALBÜM - PARÇA. BAŞLIK"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "SANATÇI  [ ALBÜM ] - PARÇA. BAŞLIK"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBÜM - BAŞLIK"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Kategori"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Özel"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Başlık biçimi:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Özel metin:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Audacious Ayarları"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Kuyruk Yöneticisi"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "_Sıradan Kaldır"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "Çalışıyor..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Hata"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Bağlantı Aç"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Bağlantı Ekle"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "URL gir :"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Devam eden iletiler gizlendi.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "Klasörü Aç"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "Klasör Ekle"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "Aç"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "Ekle"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Üst veri"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Besteci"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Söyleyen"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Kayıt Yılı"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Kayıt Tarihi"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Teknik"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIME Türü"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Bit oranı"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "%s için kullanılabilir bilgi yok.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "Seviye"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Dosya Adı"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Satır"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Fonksiyon"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Mesaj"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "Günlük Denetleyici"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "Günlük Seviyesi:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "Hata giderme"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Bilgi"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Uyarı"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Eklentiler..."
diff --git a/po/uk.po b/po/uk.po
index 95ff90dc27b5..235a948116ad 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -5,22 +5,23 @@
 # Translators:
 # Dennis <tymbood at gmail.com>, 2014
 # Kostyantyn Fedenko <fedenko at ukr.net>, 2011
-# StreamThreaedr <kvantarium at gmail.com>, 2012
+# Oleg <kvantarium at gmail.com>, 2012
 # NaiLi (aka jamesjames) Rootaerc <theism at mail.ru>, 2012
 # NaiLi (aka jamesjames) Rootaerc <theism at mail.ru>, 2012
+# Oleg <kvantarium at gmail.com>, 2012
 # Rax Garfield <admin at dvizho.ks.ua>, 2012
 # Rax Garfield (http://biokillaz.com/), 2012
 # Rax Garfield <admin at dvizho.ks.ua>, 2012-2013
 # Rustam Tsurik <rustam.tsurik at gmail.com>, 2013
 # Rustam Tsurik <rustam.tsurik at gmail.com>, 2013
-# StreamThreaedr <kvantarium at gmail.com>, 2012
+# Oleg <kvantarium at gmail.com>, 2012
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-06-21 10:10+0000\n"
-"Last-Translator: Dennis <tymbood at gmail.com>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Ukrainian (http://www.transifex.com/projects/p/audacious/"
 "language/uk/)\n"
 "Language: uk\n"
@@ -30,97 +31,81 @@ msgstr ""
 "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"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Шукаю..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "Знайдено %d файл"
-msgstr[1] "Знайдено %d файли"
-msgstr[2] "Знайдено %d файлів"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "Новий список відтворення"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "Помилка"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "Показати довідку командного рядка"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Показати версію"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "Почати відтворення"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "Призупинити відтворення"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Призупинити, якщо що-небуть програється, в іншому випадку програвати"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "Зупинити відтворення"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "Пропустити попередню пісню"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "Пропустити наступну пісню"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Додати файли до списку відтворення"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "Додати файли до тимчасового списку відтворення"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Показати головне вікно"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "Показати вікно \"перейти до пісні\""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "Запуск без графічного інтерфейсу"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "Вийти при завершенні відтворення"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Друкувати повідомлення про налагодження"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "Невідома опція: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "Невідома опція: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
@@ -129,35 +114,55 @@ msgstr ""
 "Приклад: audacious [ОПЦІЯ] ... [ФАЙЛ] ...\n"
 "\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Не знайдено декодера для %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "Знайдено %d файл"
+msgstr[1] "Знайдено %d файли"
+msgstr[2] "Знайдено %d файлів"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "Не вдалося відкрити %s."
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "Новий список відтворення"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "Неможливо завантажити %s: розширення файлу не підтримується."
+msgid "Audio CD, track %s"
+msgstr "Звуковий CD, доріжка %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr ""
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "Неможливо зберегти %s: розширення файлу не підтримується."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr ""
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Зараз відтворюється"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -165,890 +170,1054 @@ msgstr ""
 "Список відтворення неможливо відсортувати, поки сканування метаданих триває "
 "або вимкнено."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "Про"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "Налаштування"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "_Застосувати"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "_Скасувати"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "_Закрити"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "_Налаштування"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Моно"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "_Про"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Стерео"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "_Модулі ..."
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d канал"
+msgstr[1] "%d канали"
+msgstr[2] "%d каналів"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "Зовнішній вигляд"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Звук"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Мережа"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Списки відтворення"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Інформація про композицію"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Модулі"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Інше"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Автори"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Ефекти"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Ліцензія"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Візуалізація"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Про Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Вхід"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "Ви хочете видалити “%s”?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Транспорт"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "_Видалити"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Виконавець"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "_Скасувати"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Альбом"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "Видалення списку відтворення"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Заголовок"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "_Більше не питати"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Номер доріжки"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "_Перейменувати"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Стиль"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Перейменувати список відтворення"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Ім'я файлу"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "Як ви б хотіли назвати цей список відтворення?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Шлях до файлу"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "Увімкнути"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Дата"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Гц"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Рік"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Гц"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Коментар"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Гц"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Кодек"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Гц"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Якість"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Гц"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Нічого"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 кГц"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Арабська"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 кГц"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Балтійські мови"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 кГц"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Китайська"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 кГц"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Грецька"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "18 кГц"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Іврит"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Еквалайзер"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Японська"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr ""
+"Попереднє\n"
+"підсилення"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Корейська"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Відкрити файли"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Польська"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "_Відкрити"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Російська"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "Закрити _діалог при відкритті"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Тайванська"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Додати файли"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Турецька"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "_Додати"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Рухома кома"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "Закрити _діалог після додавання"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>Параметри інтерфейсу</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "_Закрити"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "Плаґін інтерфейсу:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Заголовок"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Модуль виведення:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Виконавець"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Параметри виводу</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Альбом"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Амплітудна розрядність:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Стиль"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Розмір буфера:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Рік"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "мс"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Доріжка"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "М’яке відсікання"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Тривалість"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Керувати гучністю лише Audacious (не рекомендовано)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "Формат:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Replay Gain</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "Якість:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Увімкнути Replay Gain"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "Бітрейт:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Режим альбому"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Запобігати зрізанню (рекомендовано)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Регулювати рівні</b>"
-
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Підсилювати всі файли:"
-
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "дБ"
-
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Підсилювати непозначені файли:"
-
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Адреса проксі-сервера:"
-
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Порт:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Ім'я користувача:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Пароль:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Конфігурація проксі</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Використовувати проксі"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Використовувати автентифікацію"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Автовизначення кодування символів:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Типове кодування символів:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Поведінка</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Продовжувати відтворення під час запуску"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "При видаленні поточної пісні відтворювати наступну"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Стирати список відтворення при відкритті файлів"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Відкривати файли у тимчасовому списку відтворення"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Не завантажувати метадані доріжок до відтворення"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>Сумісність</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "Вважати \\ (обернену косу риску) розділювачем тек"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Обкладинка альбому</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Шукати зображення за цими словами (розділюйте комами):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Пропускати зображення за з цими словами (розділюйте комами):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Шукати зображення за іменем файлу доріжки"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "Рекурсивний пошук"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "Глибина пошуку:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Спливна інформація</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Показувати спливну інформацію"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "Затримка спливання (десяті частки секунди):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "Показувати прогрес відтворення композиції"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "НАЗВА"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "ВИКОНАВЕЦЬ - НАЗВА"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "ВИКОНАВЕЦЬ - АЛЬБОМ - НАЗВА"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "ВИКОНАВЕЦЬ - АЛЬБОМ - ДОРІЖКА. НАЗВА"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "ВИКОНАВЕЦЬ [ АЛЬБОМ ] ДОРІЖКА. НАЗВА"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "АЛЬБОМ - НАЗВА"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Категорія"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Власні налаштування"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Відображення пісні</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Показувати номер пісні"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Показувати нульові старші розряди (02:00 замість 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Формат назви:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Власний формат:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Налаштування Audacious"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Не можу створити теку (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Звуковий CD, доріжка %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Моно"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Стерео"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d канал"
-msgstr[1] "%d канали"
-msgstr[2] "%d каналів"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Автори"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Ліцензія"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Про Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "Ви хочете видалити “%s”?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "_Видалити"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "Видалення списку відтворення"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "_Більше не питати"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "_Перейменувати"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Перейменувати список відтворення"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "Як ви б хотіли назвати цей список відтворення?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "Увімкнути"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Гц"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Гц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 кГц"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 кГц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 кГц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 кГц"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "18 кГц"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Еквалайзер"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr ""
-"Попереднє\n"
-"підсилення"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Доріжка"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Тривалість"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "Формат:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "Якість:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "Бітрейт:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
+#: src/libaudgui/infowin.cc:85
 msgid "Ambient"
 msgstr "Ambient"
 
-#: src/libaudgui/infowin.c:79
+#: src/libaudgui/infowin.cc:86
 msgid "Bebop"
 msgstr "Bebop"
 
-#: src/libaudgui/infowin.c:80
+#: src/libaudgui/infowin.cc:87
 msgid "Bluegrass"
 msgstr "Bluegrass"
 
-#: src/libaudgui/infowin.c:81
+#: src/libaudgui/infowin.cc:88
 msgid "Blues"
 msgstr "Blues"
 
-#: src/libaudgui/infowin.c:82
+#: src/libaudgui/infowin.cc:89
 msgid "Chamber Music"
 msgstr "Chamber Music"
 
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "Classical"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "Country"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "Death Metal"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "Збереження успішне"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "Зберегти помилку"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Інформація про композицію"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Коментар"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "Номер пісні"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "_Зберегти"
 
-#: src/libaudgui/infowin.c:418
-#, c-format
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
+#, c-format
 msgid "%d kb/s"
 msgstr "%d кб/с"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "N/A"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Інформація недоступна для %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "_Перейти"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Перейти до часу"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Введіть час (хвилини:секунди):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Перезаписати %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Додати до списку"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "В_илучити зі списку"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Перейти до доріжки"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Фільтр: "
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Фільтр: "
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "З_акрити після переходу"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "_Перезаписати"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "Підтвердити перезапис"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Перезаписати %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Експортувати список відтворення"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "_Експортувати"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Імпортувати список відтворення"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "_Імпортувати"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Керування чергою"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "_Модулі ..."
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "Прибрати з черги"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "Про %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Відкрити файли"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s Налаштування"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "_Відкрити"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "_Застосувати"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "Закрити _діалог при відкритті"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "_Налаштування"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Додати файли"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "_Про"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "_Додати"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "Зовнішній вигляд"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "Закрити _діалог після додавання"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Звук"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Додати до списку"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Мережа"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "В_илучити зі списку"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Списки відтворення"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Перейти до доріжки"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Модулі"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Фільтр: "
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Інше"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Фільтр: "
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Ефекти"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "З_акрити після переходу"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Візуалізація"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Вхід"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Транспорт"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Дата"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Кодек"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Якість"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Нічого"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Арабська"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Балтійські мови"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Китайська"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Грецька"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Іврит"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Японська"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Корейська"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Польська"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Російська"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Тайванська"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Турецька"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Рухома кома"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>Параметри інтерфейсу</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "Плаґін інтерфейсу:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Модуль виведення:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Параметри виводу</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Амплітудна розрядність:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Розмір буфера:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "мс"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "М’яке відсікання"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Керувати гучністю лише Audacious (не рекомендовано)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Replay Gain</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Увімкнути Replay Gain"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Режим альбому"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Запобігати зрізанню (рекомендовано)"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Менеджер списків"
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Регулювати рівні</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Підсилювати всі файли:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "дБ"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Підсилювати непозначені файли:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Адреса проксі-сервера:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Порт:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Ім'я користувача:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Пароль:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>Мережеві налаштування</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "КіБ"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Конфігурація проксі</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Використовувати проксі"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Використовувати автентифікацію"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Автовизначення кодування символів:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Типове кодування символів:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Поведінка</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "При видаленні поточної пісні відтворювати наступну"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Стирати список відтворення при відкритті файлів"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Відкривати файли у тимчасовому списку відтворення"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>Сумісність</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "Вважати \\ (обернену косу риску) розділювачем тек"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Відображення пісні</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Показувати номер пісні"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Показувати нульові старші розряди (02:00 замість 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>Додаткові</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Не завантажувати метадані доріжок до відтворення"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Обкладинка альбому</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Шукати зображення за цими словами (розділюйте комами):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Пропускати зображення за з цими словами (розділюйте комами):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Шукати зображення за іменем файлу доріжки"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "Рекурсивний пошук"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Елементи"
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "Глибина пошуку:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Спливна інформація</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Показувати спливну інформацію"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "Затримка спливання (десяті частки секунди):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "Показувати прогрес відтворення композиції"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "НАЗВА"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "ВИКОНАВЕЦЬ - НАЗВА"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "ВИКОНАВЕЦЬ - АЛЬБОМ - НАЗВА"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "ВИКОНАВЕЦЬ - АЛЬБОМ - ДОРІЖКА. НАЗВА"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "ВИКОНАВЕЦЬ [ АЛЬБОМ ] ДОРІЖКА. НАЗВА"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "АЛЬБОМ - НАЗВА"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Категорія"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Власні налаштування"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Формат назви:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Власний формат:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Налаштування Audacious"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "_Новий"
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Керування чергою"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "Пере_йменувати"
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "Прибрати з черги"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "_Відтворити"
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Закрити вікно після вибору списку"
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "Помилка"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Відкрити адресу"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Додати адресу"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Введіть URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Наступні повідомлення були приховані.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "Метадані"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "Композитор"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "Виконавець"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "Рік запису"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "Дата запису"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "Технічні"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "Тип MIME"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "Бітрейт"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Інформація недоступна для %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Ім'я файлу"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "Лінія"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "Функція"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "Повідомлення"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "Інформація"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "Попереждення"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "Модулі ..."
diff --git a/po/vi.po b/po/vi.po
index 389e1c9fe37a..9eb52a9f808f 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -9,9 +9,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 07:08+0000\n"
-"Last-Translator: Radioactiveman <thomas-lange2 at gmx.de>\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-22 12:38+0000\n"
+"Last-Translator: Thomas Lange <thomas-lange2 at gmx.de>\n"
 "Language-Team: Vietnamese (http://www.transifex.com/projects/p/audacious/"
 "language/vi/)\n"
 "Language: vi\n"
@@ -20,130 +20,134 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "Đang tìm ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "%d tập tin được tìm thấy"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "D.sách mới"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr ""
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr ""
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "Hiện phiên bản"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr ""
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr ""
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "Tạm dừng nếu đang phát, phát trở lại nếu đang tạm dừng"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr ""
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr ""
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr ""
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "Thêm tập tin vào danh sách"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr ""
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "Hiện cửa sổ chính"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr ""
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr ""
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr ""
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "Hiện thông báo gỡ lỗi"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr ""
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr ""
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr ""
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr ""
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr ""
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "Không tìm thấy bộ giải mã cho %s."
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "%d tập tin được tìm thấy"
+
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "D.sách mới"
 
-#: src/audacious/playback.c:387
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "%s could not be opened."
+msgid "Audio CD, track %s"
+msgstr "Đĩa nhạc, bài %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
 msgstr ""
 
-#: src/audacious/playlist-files.c:95
-#, c-format
-msgid "Cannot load %s: unsupported file extension."
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
 msgstr ""
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
 msgstr ""
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr ""
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "Đang phát"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
@@ -151,886 +155,1050 @@ msgstr ""
 "Danh sách không thể được sắp xếp vì quá trình quét thông tin đang diễn ra "
 "(hoặc bị tắt)."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
 msgstr ""
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
 msgstr ""
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "Mono"
+
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "Stereo"
+
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d kênh"
+
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
 msgstr ""
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
 msgstr ""
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "Âm thanh"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "Mạng"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "Danh sách"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "Đóng góp"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "Thông tin bài hát"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "Giấy phép"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "Trình cắm"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "Giới thiệu Audacious"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "Tổng quát"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "Hiệu ứng"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "Hình ảnh ảo"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "Đầu vào"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "Truyền tải"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "Nghệ sĩ"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "Album"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "Đổi tên danh sách"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "Tựa đề"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "Bài số"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "_Bật"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "Thể loại"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "Tên tập tin"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "Đường dẫn tập tin"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "Ngày"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "Năm"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "Bình luận"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "Bộ giải mã"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "Chất lượng"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "Không"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "Tiếng Ả Rập"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "Tiếng Ban-tic"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "Bộ cân chỉnh âm"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "Tiếng Trung"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "Độ lớn"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "Tiếng Hy Lạp"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "Mở tập tin"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "Tiếng Do Thái"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "Tiếng Nhật"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "Tiếng Hàn"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "Thêm tập tin"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "Tiếng Ba Lan"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "Tiếng Nga"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "Tiếng Đài Loan"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "Tiếng Thổ Nhĩ Kỳ"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "Tựa đề"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "Điểm chuyển động"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "Nghệ sĩ"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr ""
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "Album"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr ""
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "Thể loại"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "Trình cắm xuất ra:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "Năm"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>Thiết lập xuất âm thanh</b>"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "Bài hát"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "Chiều sâu âm thanh:"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "Độ dài"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "Dung lượng bộ đệm:"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "ms"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr ""
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
 msgstr ""
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "Sử dụng kiểm soát âm lượng của phần mềm (không nên)"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "Acid Jazz"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>Tăng âm</b>"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "Acid Rock"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "Bật chế độ tăng thêm âm lượng"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "Ambient"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "Chế độ album"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "Tránh tổn thất (khuyên dùng)"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "Bluegrass"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>Các mức điều chỉnh</b>"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "Blues"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "Khuếch đại mọi tập tin:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "Chamber Music"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "Classical"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "Khuếch đại tập tin chưa gán thẻ:"
+#: src/libaudgui/infowin.cc:91
+msgid "Country"
+msgstr "Country"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "Tên máy chủ proxy:"
+#: src/libaudgui/infowin.cc:92
+msgid "Death Metal"
+msgstr "Death Metal"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "Cổng proxy:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "Tên người dùng proxy:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "Mật khẩu proxy:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>Cấu hình Proxy</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "Cho phép dùng proxy"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "Xác thực với proxy"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "Tự động nhận diện bảng mã kí tự cho:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "Bảng mã kí tự dự phòng:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>Hành động</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "Tiếp tục phát khi khởi động"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "Đến bài kế tiếp khi xóa bài hiện tại"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "Dọn sạch danh sách khi mở các tập tin"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "Mở các tập tin trong một danh sách tạm"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "Không nạp thông tin bài hát cho đến khi nó được phát"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>Ảnh bìa</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "Tìm ảnh có tên chứa các từ sau (cách bằng dấu phẩy):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "Ngoại trừ tên ảnh chứa các từ sau (cách bằng dấu phẩy):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "Tìm ảnh khớp với tên tập tin"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>Cửa sổ thông tin bật lên</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "Hiện ô chú thích thông tin"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr ""
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "TỰA ĐỀ"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "NGHỆ SĨ - TỰA ĐỀ"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "NGHỆ SĨ - ALBUM - TỰA"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "NGHỆ SĨ - ALBUM - BÀI. TỰA"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "NGHỆ SĨ [ALBUM ] - BÀI. TỰA"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "ALBUM - TỰA ĐỀ"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "Danh mục"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "Tùy chọn"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>Hiển thị bài hát</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "Hiện số thứ tự trong danh sách của bài hát"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "Hiện số không ở đầu (02:00 thay vì of 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "Định dạng tựa đề:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "Chuỗi tùy chọn:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr ""
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "Không thể tạo thư mục (%s): %s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "Đĩa nhạc, bài %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "Mono"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "Stereo"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d kênh"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "Đóng góp"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "Giấy phép"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "Giới thiệu Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr ""
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr ""
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr ""
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr ""
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr ""
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "Đổi tên danh sách"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr ""
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "_Bật"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "Bộ cân chỉnh âm"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "Độ lớn"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "Bài hát"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "Độ dài"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr ""
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "Acid Jazz"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "Acid Rock"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "Ambient"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "Bluegrass"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "Blues"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "Chamber Music"
-
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "Classical"
-
-#: src/libaudgui/infowin.c:84
-msgid "Country"
-msgstr "Country"
-
-#: src/libaudgui/infowin.c:85
-msgid "Death Metal"
-msgstr "Death Metal"
-
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "Disco"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "Easy Listening"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "Folk"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "Funk"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "Gangsta Rap"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "Gospel"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "Grunge"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "Hard Rock"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "Heavy Metal"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "Hip-hop"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "Jazz"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "Jungle"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "Metal"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "New Age"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "New Wave"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "Noise"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "Pop"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "Punk Rock"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "Rap"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "Reggae"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "Rock"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "Rock and Roll"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "Rhythm and Blues"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "Soul"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "Swing"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "Techno"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "Trip-hop"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr ""
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr ""
 
-#: src/libaudgui/infowin.c:359
-msgid "Track Number"
-msgstr ""
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "Thông tin bài hát"
 
-#: src/libaudgui/infowin.c:367
-msgid "_Save"
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
 msgstr ""
 
-#: src/libaudgui/infowin.c:418
-#, c-format
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "Bình luận"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
+msgid "Track Number"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
+msgid "_Save"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr ""
+
+#: src/libaudgui/infowin.cc:455
+#, c-format
 msgid "%d kb/s"
 msgstr "%d kb/giây"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr ""
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "Không có thông tin của %s.\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr ""
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "Định mốc t.gian phát nhạc"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "Nhập thời gian (phút:giây):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "Ghi đè %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "_Hàng đợi"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "Bỏ khỏi _hàng đợi"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "Chuyển đến bài hát"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "Bộ lọc:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "_Bộ lọc:"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr ""
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "Ghi đè %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "Xuất danh sách"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr ""
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "Nhập danh sách"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr ""
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "Trình quản lí hàng đợi"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr ""
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "Mở tập tin"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "Thêm tập tin"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
 msgstr ""
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "Âm thanh"
+
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "Mạng"
+
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "Danh sách"
+
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "Trình cắm"
+
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "Tổng quát"
+
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "Hiệu ứng"
+
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "Hình ảnh ảo"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "Đầu vào"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "Truyền tải"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
 msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "_Hàng đợi"
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "Bỏ khỏi _hàng đợi"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr ""
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "Chuyển đến bài hát"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "Ngày"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "Bộ lọc:"
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "Bộ giải mã"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "_Bộ lọc:"
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "Chất lượng"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "Không"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "Tiếng Ả Rập"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "Tiếng Ban-tic"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "Tiếng Trung"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "Tiếng Hy Lạp"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "Tiếng Do Thái"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "Tiếng Nhật"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "Tiếng Hàn"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "Tiếng Ba Lan"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "Tiếng Nga"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "Tiếng Đài Loan"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "Tiếng Thổ Nhĩ Kỳ"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "Điểm chuyển động"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "Trình cắm xuất ra:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>Thiết lập xuất âm thanh</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "Chiều sâu âm thanh:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "Dung lượng bộ đệm:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "ms"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "Sử dụng kiểm soát âm lượng của phần mềm (không nên)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>Tăng âm</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "Bật chế độ tăng thêm âm lượng"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "Chế độ album"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "Tránh tổn thất (khuyên dùng)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>Các mức điều chỉnh</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "Khuếch đại mọi tập tin:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "Khuếch đại tập tin chưa gán thẻ:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "Tên máy chủ proxy:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "Cổng proxy:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "Tên người dùng proxy:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "Mật khẩu proxy:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>Cấu hình Proxy</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "Cho phép dùng proxy"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "Xác thực với proxy"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "Tự động nhận diện bảng mã kí tự cho:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "Bảng mã kí tự dự phòng:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>Hành động</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "Đến bài kế tiếp khi xóa bài hiện tại"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "Dọn sạch danh sách khi mở các tập tin"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "Mở các tập tin trong một danh sách tạm"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>Hiển thị bài hát</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "Hiện số thứ tự trong danh sách của bài hát"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "Hiện số không ở đầu (02:00 thay vì of 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr ""
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "Không nạp thông tin bài hát cho đến khi nó được phát"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "Quản lý danh sách"
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>Ảnh bìa</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "Tìm ảnh có tên chứa các từ sau (cách bằng dấu phẩy):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "Ngoại trừ tên ảnh chứa các từ sau (cách bằng dấu phẩy):"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "Số mục"
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "Tìm ảnh khớp với tên tập tin"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>Cửa sổ thông tin bật lên</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "Hiện ô chú thích thông tin"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
 msgstr ""
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "Đóng hộp thoại khi _kích hoạt danh sách"
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr ""
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "TỰA ĐỀ"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "NGHỆ SĨ - TỰA ĐỀ"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "NGHỆ SĨ - ALBUM - TỰA"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "NGHỆ SĨ - ALBUM - BÀI. TỰA"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "NGHỆ SĨ [ALBUM ] - BÀI. TỰA"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "ALBUM - TỰA ĐỀ"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "Danh mục"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "Tùy chọn"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "Định dạng tựa đề:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "Chuỗi tùy chọn:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr ""
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "Trình quản lí hàng đợi"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr ""
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr ""
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr ""
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "Mở địa chỉ URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "Thêm URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "Nhập URL:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(Các thông báo khác đã bị ẩn.)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr ""
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr ""
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr ""
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "Không có thông tin của %s.\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "Tên tập tin"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr ""
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr ""
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
index bc5c59a776fb..e86bdb41e717 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -4,8 +4,10 @@
 #
 # Translators:
 # Chasye <chasye at gmail.com>, 2010
-# JeffBai <jeffbaichina at members.fsf.org>, 2014
+# 白铭骢 <jeffbaichina at members.fsf.org>, 2014
+# 白铭骢 <jeffbaichina at members.fsf.org>, 2014
 # Luke <runningwaterpro at gmail.com>, 2012
+# Michael Jay Tong <michaeljayt at gmail.com>, 2014
 # Luke <runningwaterpro at gmail.com>, 2012
 # zhangmin <zm1990s at gmail.com>, 2013-2014
 # zhangmin <zm1990s at gmail.com>, 2013
@@ -13,8 +15,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-04 14:48+0000\n"
+"POT-Creation-Date: 2015-02-28 19:15+0100\n"
+"PO-Revision-Date: 2014-12-26 02:37+0000\n"
 "Last-Translator: zhangmin <zm1990s at gmail.com>\n"
 "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/"
 "audacious/language/zh_CN/)\n"
@@ -24,1015 +26,1185 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "搜索中..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "找到%d个文件"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "新建播放列表"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "错误"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "显示命令行帮助"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "显示版本信息"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "开始回放"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "暂停回放"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "暂停/播放"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "停止回放"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "跳回上一曲目"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "跳至下一曲目"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "添加文件到播放列表"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "添加文件到一个临时播放列表"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "显示主界面"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "显示曲目选择窗口"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "不启动图形界面"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "停止播放时退出"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "输出调试信息"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "打印调试信息 (或许需要使用两次)"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "以 Qt 模式运行"
+
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "未知选项: %s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "未知选项: -%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr "用法: audacious [选项] ... [文件] ...\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "未能为 %s 找到解码器。"
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "找到%d个文件"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "%s 不能打开。"
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "新建播放列表"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "无法载入 %s: 不被支持的文件后缀。"
+msgid "Audio CD, track %s"
+msgstr "音频CD, 音轨 %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(字符编码错误)"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "加载插件出错"
+
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "无法保存 %s: 不被支持的文件后缀"
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"打开 %s 时错误:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "未知播放错误"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "不可用音频格式"
+
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "正在播放"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr "因正在扫描歌曲信息, 播放列表暂时无法保存."
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "关于"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "无法载入 %s: 不支持的文件扩展名。"
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "设置"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "无法保存 %s: 不支持的文件扩展名。"
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "设置 (&S)"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "定位错误"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "取消 (&C)"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "不识别文件格式"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "关闭 (&C)"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "读取元数据时出错"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "设置 (&S)"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "单声道"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "关于 (&A)"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "立体声"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "插件... (&P)"
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d声道"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "外观"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "音轨 %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "音频"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "音频CD"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "网络"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(未知标题)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "播放列表"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "未知 URI"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "歌曲信息"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "未知 URI 图表"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "插件"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "无效的文件名"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "一般"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "特别鸣谢"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "音效"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "许可"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "虚拟效果"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "关于Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "输入"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "你希望完全删除 \"%s\" 吗?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "传输"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "移除 (&R)"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "艺术家"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "取消 (&C)"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "专辑"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "移除播放列表"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "标题"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "不再询问 (&D)"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "音轨序号"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "重命名(_R)"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "风格"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "重命名播放列表"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "文件名"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "你希望如何称呼这个播放列表?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "路径"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "启用(_E)"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "时间"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "年份"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "备注"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "编码"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "音质"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "无"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "阿拉伯语"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "波罗的语"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "汉语"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "加载"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "希腊语"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "希伯来语"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "均衡器"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "日语"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "前置放大器"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "韩语"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "打开文件"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "波兰语"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "打开 (&O)"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "俄语"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "打开时关闭对话框 (&D)"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "台语"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "添加文件"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "土耳其语"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "添加 (&A)"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "浮点"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "添加时关闭对话框 (&D)"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>界面设置</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "关闭 (&C)"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "界面插件: "
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "标题"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "输出插件:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "艺术家"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>输出设置</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "专辑"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "位深:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "风格"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "缓冲大小:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "年份"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "毫秒"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "音轨"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "柔性剪峰"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "长度"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "使用软音量控制(非建议)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "格式: "
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>回放增益</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "音质: "
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "启用回放增益"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "比特率: "
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "专辑模式"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "迷幻爵士乐"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "避免爆音(推荐)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "酸性摇滚"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>调整幅度</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "氛围音乐"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "应用到文件:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "比波普爵士乐"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "dB"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "蓝草音乐"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "应用到无标签文件:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "蓝调"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "主机地址:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "室内音乐"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "连接端口:"
+#: src/libaudgui/infowin.cc:90
+msgid "Classical"
+msgstr "古典"
 
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "认证用户:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "认证密码:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>代理服务器设置</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "启用代理服务器"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "代理服务器要求认证"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "自动检测下列编码:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "备用字符编码:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>行为</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "启动时恢复播放"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "歌曲播放中被删除则播放下一首"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "打开文件时清空当前播放列表"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "在临时播放列表打开文件"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "未播放时切勿加载元数据"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>兼容性</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "说明 \\(反斜杠)作为一个文件夹分隔符"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>专辑封面</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "搜索匹配以下词语的图片(用逗号分隔):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "排除匹配以下词语的图片(用逗号分隔):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "搜索匹配歌曲文件名的图片"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "递归搜索"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "搜索深度:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>弹出信息</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "显示弹出信息"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "弹出延迟 (十分之一秒):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "停止播放"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "标题"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "艺术家 - 标题"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "艺术家 - 专辑 - 标题"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "艺术家 - 专辑 - 曲目号. 标题"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "艺术家 [专辑] - 曲目号. 标题"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "专辑 - 标题"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "分类"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "自定义"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>歌曲显示</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "显示歌曲序号"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "显示时间前的0(如:显示2:00为02:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "标题样式:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "自定字符:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Audacious 设置"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "无法创建目录(%s):%s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "音频CD, 音轨 %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "单声道"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "立体声"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d声道"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "特别鸣谢"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "许可"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "关于Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "你希望完全删除 \"%s\" 吗?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "移除 (&R)"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "移除播放列表"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "不再询问 (&D)"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "重命名(_R)"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "重命名播放列表"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "你希望如何称呼这个播放列表?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "启用(_E)"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "加载"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "均衡器"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "前置放大器"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "音轨"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "长度"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "格式: "
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "音质: "
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "比特率: "
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "迷幻爵士乐"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "酸性摇滚"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "氛围音乐"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "比波普爵士乐"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "蓝草音乐"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "蓝调"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "室内音乐"
-
-#: src/libaudgui/infowin.c:83
-msgid "Classical"
-msgstr "古典"
-
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "乡村音乐"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "死亡金属"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "迪斯科"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "轻音乐"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "民谣"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "放克"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "匪帮说唱"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "福音音乐"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "垃圾摇滚"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "硬摇滚"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "重金属"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "嘻哈音乐"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr " 浩室舞曲"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "爵士"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "丛林音乐"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "金属"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "新世纪"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "新浪潮"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "噪音音乐"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "流行"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "朋克摇滚乐"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "说唱"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "雷盖舞曲"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "摇滚"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "摇滚乐"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "节奏布鲁斯音乐"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "斯卡"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "灵魂乐"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr " 摇摆乐"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr " 电子舞曲"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "神游舞曲"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "保存成功"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "保存出错"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "歌曲信息"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "专辑艺术家"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "备注"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "音轨序号"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "当移动到下一首歌时清除此栏 (_r)"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "保存 (&S)"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "下一首(_N)"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "不可用"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "未找到与‘%s’相关信息。\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "跳至 (&J)"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "跳到时间"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "输入时间 (分:秒):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "是否覆盖 %s?"
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "入队(_Q)"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "出列(_q)"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "跳到歌曲"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "过滤器:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "过滤器(_F):"
 
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "跳转时关闭 (&C)"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "覆盖(O)"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "确定覆盖"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "是否覆盖 %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "导出播放列表"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "导出(E)"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "导入播放列表"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "导入(I)"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "队列管理器"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "插件... (&P)"
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "从队列移除 (&U)"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "关于 %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "打开文件"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s 设置"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "打开 (&O)"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "设置 (&S)"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "打开时关闭对话框 (&D)"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "设置 (&S)"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "添加文件"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "关于 (&A)"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "添加 (&A)"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "外观"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "添加时关闭对话框 (&D)"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "音频"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "入队(_Q)"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "网络"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "出列(_q)"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "播放列表"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "跳到歌曲"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "插件"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "过滤器:"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "一般"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "过滤器(_F):"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "音效"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "跳转时关闭 (&C)"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "虚拟效果"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "输入"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "传输"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "音轨序号"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "文件名"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "播放列表管理器"
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "文件路径"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "条目"
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "时间"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "编码"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "音质"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "无"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "阿拉伯语"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "波罗的语"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "汉语"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "希腊语"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "希伯来语"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "日语"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "韩语"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "波兰语"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "新建 (&N)"
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "俄语"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "重命名 (&A)"
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "台语"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "播放 (&P)"
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "土耳其语"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "激活播放列表时关闭对话框(_C)"
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "浮点"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>界面设置</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "界面插件: "
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "输出插件:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>输出设置</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "位深:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "缓冲大小:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "毫秒"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "柔性剪峰"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "使用软音量控制(非建议)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>回放增益</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "启用回放增益"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "专辑模式"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "避免爆音(推荐)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>调整幅度</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "应用到文件:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "dB"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "应用到无标签文件:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "主机地址:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "连接端口:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "认证用户:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "认证密码:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>网络设置</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>代理服务器设置</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "启用代理服务器"
+
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "代理服务器要求认证"
+
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "自动检测下列编码:"
+
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "备用字符编码:"
+
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>行为</b>"
+
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "启动时恢复播放"
+
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "立刻暂停,而不是继续播放"
+
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "歌曲播放中被删除则播放下一首"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "打开文件时清空当前播放列表"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "在临时播放列表打开文件"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>兼容性</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "说明 \\(反斜杠)作为一个文件夹分隔符"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>歌曲显示</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "显示歌曲序号"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "显示时间前的0(如:显示2:00为02:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>高级</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "未播放时切勿加载元数据"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "待检测文件包含不能识别的文件扩展名"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>专辑封面</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "搜索匹配以下词语的图片(用逗号分隔):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "排除匹配以下词语的图片(用逗号分隔):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "搜索匹配歌曲文件名的图片"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "递归搜索"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "搜索深度:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>弹出信息</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "显示弹出信息"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "弹出延迟 (十分之一秒):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "停止播放"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "标题"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "艺术家 - 标题"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "艺术家 - 专辑 - 标题"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "艺术家 - 专辑 - 曲目号. 标题"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "艺术家 [专辑] - 曲目号. 标题"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "专辑 - 标题"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "分类"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "自定义"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "标题样式:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "自定字符:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Audacious 设置"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "队列管理器"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "从队列移除 (&U)"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "进行中..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "错误"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "打开URL"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "添加URL"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "输入地址"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(详细信息已隐藏。)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "打开文件夹"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "添加文件夹"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "打开"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "添加"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "元数据"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "作曲"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "演奏"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "录制年代"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "录制日期"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "技术员"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "媒体类型"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "比特率"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "未找到与‘%s’相关信息。\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "级别"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "文件名"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "线路"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "功能"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "消息"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "日志监视器"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "日志级别:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "调试"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "信息"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "警告"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "插件 ..."
diff --git a/po/zh_TW.po b/po/zh_TW.po
index a9799af6e50c..210a85aa452c 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -6,12 +6,13 @@
 # Ruei-Yuan Lu <RueiYuan.Lu at gmail.com>, 2011
 # whhone <whhone at gmail.com>, 2013
 # whhone <whhone at gmail.com>, 2013
+# whhone <whhone at gmail.com>, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: Audacious\n"
 "Report-Msgid-Bugs-To: http://redmine.audacious-media-player.org/\n"
-"POT-Creation-Date: 2014-07-20 15:58+0200\n"
-"PO-Revision-Date: 2014-04-06 06:19+0000\n"
+"POT-Creation-Date: 2015-04-03 11:51+0200\n"
+"PO-Revision-Date: 2015-02-24 05:42+0000\n"
 "Last-Translator: Ruei-Yuan Lu <rueiyuan.lu at gmail.com>\n"
 "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/"
 "audacious/language/zh_TW/)\n"
@@ -21,1015 +22,1185 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: src/audacious/adder.c:76
-msgid "Searching ..."
-msgstr "搜尋中 ..."
-
-#: src/audacious/adder.c:104
-#, c-format
-msgid "%d file found"
-msgid_plural "%d files found"
-msgstr[0] "找到 %d 個檔案"
-
-#: src/audacious/adder.c:386 src/audacious/playlist-new.c:97
-msgid "New Playlist"
-msgstr "新播放清單"
-
-#: src/audacious/interface.c:93
-msgid "Error"
-msgstr "錯誤"
-
-#: src/audacious/main.c:70
+#: src/audacious/main.cc:60
 msgid "Show command-line help"
 msgstr "顯示命令列的求助訊息"
 
-#: src/audacious/main.c:71
+#: src/audacious/main.cc:61
 msgid "Show version"
 msgstr "顯示版本資訊"
 
-#: src/audacious/main.c:72
+#: src/audacious/main.cc:62
 msgid "Start playback"
 msgstr "開始播放"
 
-#: src/audacious/main.c:73
+#: src/audacious/main.cc:63
 msgid "Pause playback"
 msgstr "暫停播放"
 
-#: src/audacious/main.c:74
+#: src/audacious/main.cc:64
 msgid "Pause if playing, play otherwise"
 msgstr "在播放與暫停之間的切換"
 
-#: src/audacious/main.c:75
+#: src/audacious/main.cc:65
 msgid "Stop playback"
 msgstr "停止播放"
 
-#: src/audacious/main.c:76
+#: src/audacious/main.cc:66
 msgid "Skip to previous song"
 msgstr "跳到上一首歌曲"
 
-#: src/audacious/main.c:77
+#: src/audacious/main.cc:67
 msgid "Skip to next song"
 msgstr "跳到下一首歌曲"
 
-#: src/audacious/main.c:78
+#: src/audacious/main.cc:68
 msgid "Add files to the playlist"
 msgstr "加入檔案到播放清單"
 
-#: src/audacious/main.c:79
+#: src/audacious/main.cc:69
 msgid "Add files to a temporary playlist"
 msgstr "加入檔案到暫存的播放清單"
 
-#: src/audacious/main.c:80
+#: src/audacious/main.cc:70
 msgid "Display the main window"
 msgstr "顯示主視窗"
 
-#: src/audacious/main.c:81
+#: src/audacious/main.cc:71
 msgid "Display the jump-to-song window"
 msgstr "顯示跳轉視窗"
 
-#: src/audacious/main.c:82
+#: src/audacious/main.cc:72
 msgid "Start without a graphical interface"
 msgstr "以隱匿模式啟動"
 
-#: src/audacious/main.c:83
+#: src/audacious/main.cc:73
 msgid "Quit on playback stop"
 msgstr "播放停止後離開"
 
-#: src/audacious/main.c:84
-msgid "Print debugging messages"
-msgstr "顯示除錯訊息"
+#: src/audacious/main.cc:74
+msgid "Print debugging messages (may be used twice)"
+msgstr "顯示除錯訊息 (也許需要輸入兩次)"
+
+#: src/audacious/main.cc:76
+msgid "Run in Qt mode"
+msgstr "以 Qt 模式啟動"
 
-#: src/audacious/main.c:269
+#: src/audacious/main.cc:127
 #, c-format
 msgid "Unknown option: %s\n"
 msgstr "未知的選項:%s\n"
 
-#: src/audacious/main.c:291
+#: src/audacious/main.cc:150
 #, c-format
 msgid "Unknown option: -%c\n"
 msgstr "未知的選項:-%c\n"
 
-#: src/audacious/main.c:314
+#: src/audacious/main.cc:177
 #, c-format
 msgid ""
 "Usage: audacious [OPTION] ... [FILE] ...\n"
 "\n"
 msgstr "使用方式:audacious [選項] ... [檔案] ...\n"
 
-#: src/audacious/main.c:601
+#: src/audacious/main.cc:345
 msgid "Audacious"
 msgstr "Audacious"
 
-#: src/audacious/playback.c:354
+#: src/libaudcore/adder.cc:77
 #, c-format
-msgid "No decoder found for %s."
-msgstr "找不到適用於 %s 的解碼器。"
+msgid "%d file found"
+msgid_plural "%d files found"
+msgstr[0] "找到 %d 個檔案"
 
-#: src/audacious/playback.c:387
-#, c-format
-msgid "%s could not be opened."
-msgstr "無法開啟 %s。"
+#: src/libaudcore/adder.cc:317 src/libaudcore/playlist.cc:141
+msgid "New Playlist"
+msgstr "新播放清單"
 
-#: src/audacious/playlist-files.c:95
+#: src/libaudcore/audstrings.cc:528
 #, c-format
-msgid "Cannot load %s: unsupported file extension."
-msgstr "無法載入「%s」:未支援的副檔名。"
+msgid "Audio CD, track %s"
+msgstr "音樂 CD,音軌 %s"
+
+#: src/libaudcore/audstrings.cc:532 src/libaudcore/tuple.cc:481
+msgid "(character encoding error)"
+msgstr "(字元編碼錯誤)"
+
+#: src/libaudcore/playback.cc:328 src/libaudcore/probe.cc:151
+msgid "Error loading plugin"
+msgstr "載入外掛時發生錯誤"
 
-#: src/audacious/playlist-files.c:185
+#: src/libaudcore/playback.cc:383 src/libaudgui/infowin.cc:496
 #, c-format
-msgid "Cannot save %s: unsupported file extension."
-msgstr "無法儲存「%s」:未支援的副檔名。"
+msgid ""
+"Error opening %s:\n"
+"%s"
+msgstr ""
+"開啟 %s 時發生錯誤:\n"
+"%s"
+
+#: src/libaudcore/playback.cc:385
+msgid "Unknown playback error"
+msgstr "播放時發生未知的錯誤"
+
+#: src/libaudcore/playback.cc:514
+msgid "Invalid audio format"
+msgstr "無效的音訊格式"
 
-#: src/audacious/playlist-new.c:98
+#: src/libaudcore/playlist.cc:142
 msgid "Now Playing"
 msgstr "正在播放"
 
-#: src/audacious/playlist-new.c:1656
+#: src/libaudcore/playlist.cc:1638
 msgid ""
 "The playlist cannot be sorted because metadata scanning is still in progress "
 "(or has been disabled)."
 msgstr "因為正在進行詮釋資料的掃描,無法對播放清單進行排序。(或者已經被關閉)"
 
-#: src/audacious/plugin-preferences.c:55
-msgid "About"
-msgstr "關於"
+#: src/libaudcore/playlist-files.cc:76
+#, c-format
+msgid "Cannot load %s: unsupported file name extension."
+msgstr "無法載入 %s:不支援該副檔名。"
 
-#: src/audacious/plugin-preferences.c:94
-msgid "Settings"
-msgstr "設定"
+#: src/libaudcore/playlist-files.cc:136
+#, c-format
+msgid "Cannot save %s: unsupported file name extension."
+msgstr "無法儲存 %s:不支援該副檔名。"
 
-#: src/audacious/plugin-preferences.c:99
-msgid "_Set"
-msgstr "套用(_S)"
+#: src/libaudcore/probe.cc:119
+msgid "Seek error"
+msgstr "搜尋發生錯誤"
 
-#: src/audacious/plugin-preferences.c:100 src/libaudgui/confirm.c:57
-#: src/libaudgui/confirm.c:90 src/libaudgui/jump-to-time.c:49
-#: src/libaudgui/playlists.c:89 src/libaudgui/playlists.c:142
-#: src/libaudgui/url-opener.c:71
-msgid "_Cancel"
-msgstr "取消(_C)"
+#: src/libaudcore/probe.cc:127
+msgid "File format not recognized"
+msgstr "無法辨識檔案格式"
 
-#: src/audacious/plugin-preferences.c:106 src/audacious/ui_preferences.c:763
-#: src/libaudgui/infowin.c:370 src/libaudgui/queue-manager.c:189
-#: src/libaudgui/ui_fileopener.c:127 src/libaudgui/ui_jumptotrack.c:312
-#: src/libaudgui/util.c:186
-msgid "_Close"
-msgstr "關閉(_C)"
+#: src/libaudcore/probe.cc:161
+msgid "Error reading metadata"
+msgstr "讀取詮釋資料時發生錯誤"
 
-#: src/audacious/plugin-view.c:242 src/audacious/ui_preferences.c:641
-msgid "_Settings"
-msgstr "設定(_S)"
+#: src/libaudcore/tuple.cc:528
+msgid "Mono"
+msgstr "單聲道"
 
-#: src/audacious/plugin-view.c:250 src/audacious/ui_preferences.c:652
-msgid "_About"
-msgstr "關於(_A)"
+#: src/libaudcore/tuple.cc:530
+msgid "Stereo"
+msgstr "立體聲"
 
-#: src/audacious/ui_plugin_menu.c:37
-msgid "_Plugins ..."
-msgstr "外掛(_P)"
+#: src/libaudcore/tuple.cc:532
+#, c-format
+msgid "%d channel"
+msgid_plural "%d channels"
+msgstr[0] "%d 聲道"
 
-#: src/audacious/ui_preferences.c:82
-msgid "Appearance"
-msgstr "外觀"
+#: src/libaudcore/tuple.cc:699
+#, c-format
+msgid "Track %d"
+msgstr "音軌 %d"
 
-#: src/audacious/ui_preferences.c:83
-msgid "Audio"
-msgstr "音訊"
+#: src/libaudcore/tuple.cc:701
+msgid "Audio CD"
+msgstr "音訊 CD"
 
-#: src/audacious/ui_preferences.c:84
-msgid "Network"
-msgstr "網路"
+#: src/libaudcore/tuple.cc:707
+msgid "(unknown title)"
+msgstr "(未知的標題)"
 
-#: src/audacious/ui_preferences.c:85 src/audacious/ui_preferences.c:95
-msgid "Playlist"
-msgstr "播放清單"
+#: src/libaudcore/vfs.cc:67
+msgid "Invalid URI"
+msgstr "無效的連結"
 
-#: src/audacious/ui_preferences.c:86 src/libaudgui/infowin.c:299
-msgid "Song Info"
-msgstr "歌曲資訊"
+#: src/libaudcore/vfs.cc:83
+msgid "Unknown URI scheme"
+msgstr "未知的連結格式"
 
-#: src/audacious/ui_preferences.c:87
-msgid "Plugins"
-msgstr "外掛"
+#: src/libaudcore/vfs_local.cc:82
+msgid "Invalid file name"
+msgstr "無效的檔案名稱"
 
-#: src/audacious/ui_preferences.c:91
-msgid "General"
-msgstr "一般"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "Credits"
+msgstr "開發團隊"
 
-#: src/audacious/ui_preferences.c:92
-msgid "Effect"
-msgstr "特效"
+#: src/libaudgui/about.cc:35 src/libaudqt/about.cc:37
+msgid "License"
+msgstr "授權條款"
 
-#: src/audacious/ui_preferences.c:93
-msgid "Visualization"
-msgstr "視覺特效"
+#: src/libaudgui/about.cc:69 src/libaudqt/about.cc:88
+msgid "About Audacious"
+msgstr "關於 Audacious"
 
-#: src/audacious/ui_preferences.c:94
-msgid "Input"
-msgstr "輸入"
+#: src/libaudgui/confirm.cc:51 src/libaudqt/playlist-management.cc:41
+#, c-format
+msgid "Do you want to permanently remove “%s”?"
+msgstr "您確定要永久地移除「%s」?"
 
-#: src/audacious/ui_preferences.c:96
-msgid "Transport"
-msgstr "傳輸"
+#: src/libaudgui/confirm.cc:55 src/libaudqt/playlist-management.cc:46
+msgid "_Remove"
+msgstr "移除(_R)"
 
-#: src/audacious/ui_preferences.c:100 src/libaudgui/infopopup.c:151
-#: src/libaudgui/infowin.c:343
-msgid "Artist"
-msgstr "藝人"
+#: src/libaudgui/confirm.cc:57 src/libaudgui/confirm.cc:88
+#: src/libaudgui/jump-to-time.cc:48 src/libaudgui/playlists.cc:90
+#: src/libaudgui/playlists.cc:144 src/libaudgui/plugin-prefs.cc:160
+#: src/libaudgui/url-opener.cc:76 src/libaudqt/playlist-management.cc:47
+#: src/libaudqt/prefs-plugin.cc:121
+msgid "_Cancel"
+msgstr "取消(_C)"
 
-#: src/audacious/ui_preferences.c:101 src/libaudgui/infopopup.c:152
-#: src/libaudgui/infowin.c:346
-msgid "Album"
-msgstr "專輯"
+#: src/libaudgui/confirm.cc:60 src/libaudqt/playlist-management.cc:72
+msgid "Remove Playlist"
+msgstr "移除播放清單"
 
-#: src/audacious/ui_preferences.c:102 src/libaudgui/infopopup.c:150
-#: src/libaudgui/infowin.c:340 src/libaudgui/ui_playlist_manager.c:235
-msgid "Title"
-msgstr "標題"
+#: src/libaudgui/confirm.cc:62 src/libaudqt/playlist-management.cc:44
+msgid "_Don’t ask again"
+msgstr "不再詢問(_D)"
 
-#: src/audacious/ui_preferences.c:103
-msgid "Tracknumber"
-msgstr "音軌編號"
+#: src/libaudgui/confirm.cc:87
+msgid "_Rename"
+msgstr "重新命名(_R)"
 
-#: src/audacious/ui_preferences.c:104 src/libaudgui/infopopup.c:153
-#: src/libaudgui/infowin.c:352
-msgid "Genre"
-msgstr "類型"
+#: src/libaudgui/confirm.cc:91
+msgid "Rename Playlist"
+msgstr "重新命名播放清單"
 
-#: src/audacious/ui_preferences.c:105
-msgid "Filename"
-msgstr "檔案名稱"
+#: src/libaudgui/confirm.cc:91
+msgid "What would you like to call this playlist?"
+msgstr "您希望怎麼命名這份播放清單?"
 
-#: src/audacious/ui_preferences.c:106
-msgid "Filepath"
-msgstr "檔案路徑"
+#: src/libaudgui/equalizer.cc:45 src/libaudqt/equalizer.cc:63
+msgid "_Enable"
+msgstr "啟用(_E)"
 
-#: src/audacious/ui_preferences.c:107
-msgid "Date"
-msgstr "日期"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "31 Hz"
+msgstr "31 Hz"
 
-#: src/audacious/ui_preferences.c:108 src/libaudgui/infopopup.c:154
-#: src/libaudgui/infowin.c:356
-msgid "Year"
-msgstr "年份"
+#: src/libaudgui/equalizer.cc:119 src/libaudqt/equalizer.cc:65
+msgid "63 Hz"
+msgstr "63 Hz"
 
-#: src/audacious/ui_preferences.c:109 src/libaudgui/infowin.c:349
-msgid "Comment"
-msgstr "備註"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "125 Hz"
+msgstr "125 Hz"
 
-#: src/audacious/ui_preferences.c:110
-msgid "Codec"
-msgstr "編解碼器"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "250 Hz"
+msgstr "250 Hz"
 
-#: src/audacious/ui_preferences.c:111
-msgid "Quality"
-msgstr "品質"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "500 Hz"
+msgstr "500 Hz"
 
-#: src/audacious/ui_preferences.c:116
-msgid "None"
-msgstr "無"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "1 kHz"
+msgstr "1 kHz"
 
-#: src/audacious/ui_preferences.c:117
-msgid "Arabic"
-msgstr "阿拉伯語"
+#: src/libaudgui/equalizer.cc:120 src/libaudqt/equalizer.cc:66
+msgid "2 kHz"
+msgstr "2 kHz"
 
-#: src/audacious/ui_preferences.c:118
-msgid "Baltic"
-msgstr "波羅的海"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "4 kHz"
+msgstr "4 kHz"
 
-#: src/audacious/ui_preferences.c:119
-msgid "Chinese"
-msgstr "中文"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "8 kHz"
+msgstr "8 kHz"
 
-#: src/audacious/ui_preferences.c:120
-msgid "Greek"
-msgstr "希臘語"
+#: src/libaudgui/equalizer.cc:121 src/libaudqt/equalizer.cc:67
+msgid "16 kHz"
+msgstr "16 kHz"
 
-#: src/audacious/ui_preferences.c:121
-msgid "Hebrew"
-msgstr "希伯來語"
+#: src/libaudgui/equalizer.cc:124 src/libaudqt/equalizer.cc:90
+msgid "Equalizer"
+msgstr "等化器"
 
-#: src/audacious/ui_preferences.c:122
-msgid "Japanese"
-msgstr "日本語"
+#: src/libaudgui/equalizer.cc:138 src/libaudqt/equalizer.cc:72
+msgid "Preamp"
+msgstr "前置放大"
 
-#: src/audacious/ui_preferences.c:123
-msgid "Korean"
-msgstr "韓文"
+#: src/libaudgui/file-opener.cc:80 src/libaudqt/fileopener.cc:39
+msgid "Open Files"
+msgstr "開啟檔案"
 
-#: src/audacious/ui_preferences.c:124
-msgid "Polish"
-msgstr "波蘭語"
+#: src/libaudgui/file-opener.cc:81 src/libaudgui/url-opener.cc:50
+msgid "_Open"
+msgstr "開啟(_O)"
 
-#: src/audacious/ui_preferences.c:125
-msgid "Russian"
-msgstr "俄語"
+#: src/libaudgui/file-opener.cc:83
+msgid "Close _dialog on open"
+msgstr "開啟後關閉對話視窗(_D)"
 
-#: src/audacious/ui_preferences.c:126
-msgid "Taiwanese"
-msgstr "正體中文"
+#: src/libaudgui/file-opener.cc:88 src/libaudqt/fileopener.cc:41
+msgid "Add Files"
+msgstr "加入檔案"
 
-#: src/audacious/ui_preferences.c:127
-msgid "Turkish"
-msgstr "土耳其語"
+#: src/libaudgui/file-opener.cc:89 src/libaudgui/url-opener.cc:56
+msgid "_Add"
+msgstr "加入(_A)"
 
-#: src/audacious/ui_preferences.c:135
-msgid "Floating point"
-msgstr "浮點數"
+#: src/libaudgui/file-opener.cc:91
+msgid "Close _dialog on add"
+msgstr "加入後關閉對話視窗(_D)"
 
-#: src/audacious/ui_preferences.c:147
-msgid "<b>Interface Settings</b>"
-msgstr "<b>介面設定</b>"
+#: src/libaudgui/file-opener.cc:127 src/libaudgui/infowin.cc:406
+#: src/libaudgui/jump-to-track.cc:307 src/libaudgui/plugin-prefs.cc:166
+#: src/libaudgui/prefs-window.cc:762 src/libaudgui/queue-manager.cc:194
+#: src/libaudgui/util.cc:167 src/libaudqt/infowin.cc:73
+#: src/libaudqt/prefs-plugin.cc:135 src/libaudqt/prefs-window.cc:679
+#: src/libaudqt/queue-manager.cc:116 src/libaudqt/util.cc:70
+msgid "_Close"
+msgstr "關閉(_C)"
 
-#: src/audacious/ui_preferences.c:148
-msgid "Interface plugin:"
-msgstr "介面外掛:"
+#: src/libaudgui/infopopup.cc:200 src/libaudgui/infowin.cc:360
+#: src/libaudgui/prefs-window.cc:102 src/libaudqt/info-widget.cc:40
+#: src/libaudqt/prefs-window.cc:105
+msgid "Title"
+msgstr "標題"
 
-#: src/audacious/ui_preferences.c:165
-msgid "Output plugin:"
-msgstr "輸出外掛:"
+#: src/libaudgui/infopopup.cc:201 src/libaudgui/infowin.cc:363
+#: src/libaudgui/prefs-window.cc:100 src/libaudqt/info-widget.cc:38
+#: src/libaudqt/prefs-window.cc:103
+msgid "Artist"
+msgstr "藝人"
 
-#: src/audacious/ui_preferences.c:172
-msgid "<b>Output Settings</b>"
-msgstr "<b>輸出設定</b>"
+#: src/libaudgui/infopopup.cc:202 src/libaudgui/infowin.cc:366
+#: src/libaudgui/prefs-window.cc:101 src/libaudqt/info-widget.cc:39
+#: src/libaudqt/prefs-window.cc:104
+msgid "Album"
+msgstr "專輯"
 
-#: src/audacious/ui_preferences.c:175
-msgid "Bit depth:"
-msgstr "取樣格式:"
+#: src/libaudgui/infopopup.cc:203 src/libaudgui/infowin.cc:375
+#: src/libaudgui/prefs-window.cc:104 src/libaudqt/info-widget.cc:42
+#: src/libaudqt/prefs-window.cc:107
+msgid "Genre"
+msgstr "類型"
 
-#: src/audacious/ui_preferences.c:178
-msgid "Buffer size:"
-msgstr "緩衝區大小:"
+#: src/libaudgui/infopopup.cc:204 src/libaudgui/infowin.cc:379
+#: src/libaudgui/prefs-window.cc:108 src/libaudqt/prefs-window.cc:111
+msgid "Year"
+msgstr "年份"
 
-#: src/audacious/ui_preferences.c:180
-msgid "ms"
-msgstr "毫秒"
+#: src/libaudgui/infopopup.cc:205
+msgid "Track"
+msgstr "音軌"
 
-#: src/audacious/ui_preferences.c:181
-msgid "Soft clipping"
-msgstr "軟性削峰"
+#: src/libaudgui/infopopup.cc:206 src/libaudqt/info-widget.cc:52
+msgid "Length"
+msgstr "長度"
 
-#: src/audacious/ui_preferences.c:183
-msgid "Use software volume control (not recommended)"
-msgstr "使用軟體音量控制 (不建議開啟)"
+#: src/libaudgui/infowin.cc:49
+msgid "Format:"
+msgstr "標題格式:"
 
-#: src/audacious/ui_preferences.c:185
-msgid "<b>Replay Gain</b>"
-msgstr "<b>播放增益</b>"
+#: src/libaudgui/infowin.cc:50
+msgid "Quality:"
+msgstr "品質:"
 
-#: src/audacious/ui_preferences.c:186
-msgid "Enable Replay Gain"
-msgstr "啟用播放增益"
+#: src/libaudgui/infowin.cc:51
+msgid "Bitrate:"
+msgstr "位元率:"
 
-#: src/audacious/ui_preferences.c:188
-msgid "Album mode"
-msgstr "專輯模式"
+#: src/libaudgui/infowin.cc:83
+msgid "Acid Jazz"
+msgstr "迷幻爵士"
 
-#: src/audacious/ui_preferences.c:190
-msgid "Prevent clipping (recommended)"
-msgstr "防止訊號裁剪 (建議開啟)"
+#: src/libaudgui/infowin.cc:84
+msgid "Acid Rock"
+msgstr "迷幻搖滾"
 
-#: src/audacious/ui_preferences.c:192
-msgid "<b>Adjust Levels</b>"
-msgstr "<b>調整音量</b>"
+#: src/libaudgui/infowin.cc:85
+msgid "Ambient"
+msgstr "氛圍音樂"
 
-#: src/audacious/ui_preferences.c:193
-msgid "Amplify all files:"
-msgstr "放大所有檔案的音量:"
+#: src/libaudgui/infowin.cc:86
+msgid "Bebop"
+msgstr "Bebop"
 
-#: src/audacious/ui_preferences.c:195 src/audacious/ui_preferences.c:198
-msgid "dB"
-msgstr "分貝"
+#: src/libaudgui/infowin.cc:87
+msgid "Bluegrass"
+msgstr "藍草"
 
-#: src/audacious/ui_preferences.c:196
-msgid "Amplify untagged files:"
-msgstr "放大無標籤檔案的音量:"
+#: src/libaudgui/infowin.cc:88
+msgid "Blues"
+msgstr "藍調"
 
-#: src/audacious/ui_preferences.c:201
-msgid "Proxy hostname:"
-msgstr "代理伺服器名稱:"
+#: src/libaudgui/infowin.cc:89
+msgid "Chamber Music"
+msgstr "室內樂"
 
-#: src/audacious/ui_preferences.c:202
-msgid "Proxy port:"
-msgstr "代理伺服器連接埠:"
-
-#: src/audacious/ui_preferences.c:205
-msgid "Proxy username:"
-msgstr "代理伺服器使用者名稱:"
-
-#: src/audacious/ui_preferences.c:206
-msgid "Proxy password:"
-msgstr "代理伺服器密碼:"
-
-#: src/audacious/ui_preferences.c:210
-msgid "<b>Proxy Configuration</b>"
-msgstr "<b>代理伺服器設定</b>"
-
-#: src/audacious/ui_preferences.c:211
-msgid "Enable proxy usage"
-msgstr "啟用代理伺服器"
-
-#: src/audacious/ui_preferences.c:214
-msgid "Use authentication with proxy"
-msgstr "需要認證"
-
-#: src/audacious/ui_preferences.c:221
-msgid "Auto character encoding detector for:"
-msgstr "自動偵測字元編碼:"
-
-#: src/audacious/ui_preferences.c:225
-msgid "Fallback character encodings:"
-msgstr "備用字元編碼:"
-
-#: src/audacious/ui_preferences.c:229
-msgid "<b>Behavior</b>"
-msgstr "<b>行為</b>"
-
-#: src/audacious/ui_preferences.c:230
-msgid "Continue playback on startup"
-msgstr "啟動後繼續之前的播放"
-
-#: src/audacious/ui_preferences.c:232
-msgid "Advance when the current song is deleted"
-msgstr "目前的歌曲被刪除時移到下一個項目"
-
-#: src/audacious/ui_preferences.c:234
-msgid "Clear the playlist when opening files"
-msgstr "開啟檔案後清除播放清單"
-
-#: src/audacious/ui_preferences.c:236
-msgid "Open files in a temporary playlist"
-msgstr "在暫存播放清單中開啟檔案"
-
-#: src/audacious/ui_preferences.c:238
-msgid "Do not load metadata for songs until played"
-msgstr "在歌曲播放以前不要載入詮釋資料"
-
-#: src/audacious/ui_preferences.c:241
-msgid "<b>Compatibility</b>"
-msgstr "<b>相容性</b>"
-
-#: src/audacious/ui_preferences.c:242
-msgid "Interpret \\ (backward slash) as a folder delimiter"
-msgstr "將 \\ (反斜線) 視為資料夾分隔符號"
-
-#: src/audacious/ui_preferences.c:247
-msgid "<b>Album Art</b>"
-msgstr "<b>專輯封面</b>"
-
-#: src/audacious/ui_preferences.c:248
-msgid "Search for images matching these words (comma-separated):"
-msgstr "搜尋符合這些單字的圖片 (以逗號分隔):"
-
-#: src/audacious/ui_preferences.c:250
-msgid "Exclude images matching these words (comma-separated):"
-msgstr "排除符合這些單字的圖片 (以逗號分隔):"
-
-#: src/audacious/ui_preferences.c:252
-msgid "Search for images matching song file name"
-msgstr "搜尋符合歌曲檔名的圖片"
-
-#: src/audacious/ui_preferences.c:254
-msgid "Search recursively"
-msgstr "遞迴搜尋"
-
-#: src/audacious/ui_preferences.c:256
-msgid "Search depth:"
-msgstr "搜尋深度:"
-
-#: src/audacious/ui_preferences.c:259
-msgid "<b>Popup Information</b>"
-msgstr "<b>彈出式資訊視窗</b>"
-
-#: src/audacious/ui_preferences.c:260
-msgid "Show popup information"
-msgstr "顯示彈出式資訊視窗"
-
-#: src/audacious/ui_preferences.c:262
-msgid "Popup delay (tenths of a second):"
-msgstr "彈出視窗的延遲時間 (十分之一秒):"
-
-#: src/audacious/ui_preferences.c:265
-msgid "Show time scale for current song"
-msgstr "顯示目前歌曲的時間軸"
-
-#: src/audacious/ui_preferences.c:280
-msgid "TITLE"
-msgstr "標題"
-
-#: src/audacious/ui_preferences.c:281
-msgid "ARTIST - TITLE"
-msgstr "藝人 - 標題"
-
-#: src/audacious/ui_preferences.c:282
-msgid "ARTIST - ALBUM - TITLE"
-msgstr "藝人 - 專輯 - 標題"
-
-#: src/audacious/ui_preferences.c:283
-msgid "ARTIST - ALBUM - TRACK. TITLE"
-msgstr "藝人 - 專輯 - 音軌. 標題"
-
-#: src/audacious/ui_preferences.c:284
-msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
-msgstr "藝人 [ 專輯 ] - 音軌. 標題"
-
-#: src/audacious/ui_preferences.c:285
-msgid "ALBUM - TITLE"
-msgstr "專輯 - 標題"
-
-#: src/audacious/ui_preferences.c:375
-msgid "Category"
-msgstr "目錄"
-
-#: src/audacious/ui_preferences.c:457
-msgid "Custom"
-msgstr "自訂"
-
-#: src/audacious/ui_preferences.c:481
-msgid "<b>Song Display</b>"
-msgstr "<b>顯示歌曲</b>"
-
-#: src/audacious/ui_preferences.c:490
-msgid "Show song numbers"
-msgstr "顯示歌曲編號"
-
-#: src/audacious/ui_preferences.c:501
-msgid "Show leading zeroes (02:00 instead of 2:00)"
-msgstr "顯示開頭的數字零 (例:02:00 而不是 2:00)"
-
-#: src/audacious/ui_preferences.c:515
-msgid "Title format:"
-msgstr "標題格式:"
-
-#: src/audacious/ui_preferences.c:520
-msgid "Custom string:"
-msgstr "自訂字串:"
-
-#: src/audacious/ui_preferences.c:714
-msgid "Audacious Settings"
-msgstr "Audacious 設定"
-
-#: src/audacious/util.c:112
-#, c-format
-msgid "Could not create directory (%s): %s\n"
-msgstr "無法建立資料夾 (%s):%s\n"
-
-#: src/libaudcore/audstrings.c:385
-#, c-format
-msgid "Audio CD, track %s"
-msgstr "音樂 CD,音軌 %s"
-
-#: src/libaudcore/tuple.c:442
-msgid "Mono"
-msgstr "單聲道"
-
-#: src/libaudcore/tuple.c:444
-msgid "Stereo"
-msgstr "立體聲"
-
-#: src/libaudcore/tuple.c:446
-#, c-format
-msgid "%d channel"
-msgid_plural "%d channels"
-msgstr[0] "%d 聲道"
-
-#: src/libaudgui/about.c:37
-msgid "Credits"
-msgstr "開發團隊"
-
-#: src/libaudgui/about.c:37
-msgid "License"
-msgstr "授權條款"
-
-#: src/libaudgui/about.c:69
-msgid "About Audacious"
-msgstr "關於 Audacious"
-
-#: src/libaudgui/confirm.c:51
-#, c-format
-msgid "Do you want to permanently remove “%s”?"
-msgstr "您確定要永久地移除「%s」?"
-
-#: src/libaudgui/confirm.c:55 src/libaudgui/ui_playlist_manager.c:255
-msgid "_Remove"
-msgstr "移除(_R)"
-
-#: src/libaudgui/confirm.c:60
-msgid "Remove Playlist"
-msgstr "移除播放清單"
-
-#: src/libaudgui/confirm.c:62
-msgid "_Don’t ask again"
-msgstr "不再詢問(_D)"
-
-#: src/libaudgui/confirm.c:89
-msgid "_Rename"
-msgstr "重新命名(_R)"
-
-#: src/libaudgui/confirm.c:93
-msgid "Rename Playlist"
-msgstr "重新命名播放清單"
-
-#: src/libaudgui/confirm.c:93
-msgid "What would you like to call this playlist?"
-msgstr "您希望怎麼命名這份播放清單?"
-
-#: src/libaudgui/equalizer.c:44
-msgid "_Enable"
-msgstr "啟用(_E)"
-
-#: src/libaudgui/equalizer.c:119
-msgid "31 Hz"
-msgstr "31 Hz"
-
-#: src/libaudgui/equalizer.c:119
-msgid "63 Hz"
-msgstr "63 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "125 Hz"
-msgstr "125 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "250 Hz"
-msgstr "250 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "500 Hz"
-msgstr "500 Hz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "1 kHz"
-msgstr "1 kHz"
-
-#: src/libaudgui/equalizer.c:120
-msgid "2 kHz"
-msgstr "2 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "4 kHz"
-msgstr "4 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: src/libaudgui/equalizer.c:121
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: src/libaudgui/equalizer.c:124
-msgid "Equalizer"
-msgstr "等化器"
-
-#: src/libaudgui/equalizer.c:138
-msgid "Preamp"
-msgstr "前置放大"
-
-#: src/libaudgui/infopopup.c:155
-msgid "Track"
-msgstr "音軌"
-
-#: src/libaudgui/infopopup.c:156
-msgid "Length"
-msgstr "長度"
-
-#: src/libaudgui/infowin.c:46
-msgid "Format:"
-msgstr "標題格式:"
-
-#: src/libaudgui/infowin.c:47
-msgid "Quality:"
-msgstr "品質:"
-
-#: src/libaudgui/infowin.c:48
-msgid "Bitrate:"
-msgstr "位元率:"
-
-#: src/libaudgui/infowin.c:76
-msgid "Acid Jazz"
-msgstr "迷幻爵士"
-
-#: src/libaudgui/infowin.c:77
-msgid "Acid Rock"
-msgstr "迷幻搖滾"
-
-#: src/libaudgui/infowin.c:78
-msgid "Ambient"
-msgstr "氛圍音樂"
-
-#: src/libaudgui/infowin.c:79
-msgid "Bebop"
-msgstr "Bebop"
-
-#: src/libaudgui/infowin.c:80
-msgid "Bluegrass"
-msgstr "藍草"
-
-#: src/libaudgui/infowin.c:81
-msgid "Blues"
-msgstr "藍調"
-
-#: src/libaudgui/infowin.c:82
-msgid "Chamber Music"
-msgstr "室內樂"
-
-#: src/libaudgui/infowin.c:83
+#: src/libaudgui/infowin.cc:90
 msgid "Classical"
 msgstr "古典"
 
-#: src/libaudgui/infowin.c:84
+#: src/libaudgui/infowin.cc:91
 msgid "Country"
 msgstr "鄉村"
 
-#: src/libaudgui/infowin.c:85
+#: src/libaudgui/infowin.cc:92
 msgid "Death Metal"
 msgstr "死亡金屬"
 
-#: src/libaudgui/infowin.c:86
+#: src/libaudgui/infowin.cc:93
 msgid "Disco"
 msgstr "迪斯可"
 
-#: src/libaudgui/infowin.c:87
+#: src/libaudgui/infowin.cc:94
 msgid "Easy Listening"
 msgstr "輕音樂"
 
-#: src/libaudgui/infowin.c:88
+#: src/libaudgui/infowin.cc:95
 msgid "Folk"
 msgstr "民謠"
 
-#: src/libaudgui/infowin.c:89
+#: src/libaudgui/infowin.cc:96
 msgid "Funk"
 msgstr "放客"
 
-#: src/libaudgui/infowin.c:90
+#: src/libaudgui/infowin.cc:97
 msgid "Gangsta Rap"
 msgstr "黑幫說唱"
 
-#: src/libaudgui/infowin.c:91
+#: src/libaudgui/infowin.cc:98
 msgid "Gospel"
 msgstr "福音音樂"
 
-#: src/libaudgui/infowin.c:92
+#: src/libaudgui/infowin.cc:99
 msgid "Grunge"
 msgstr "垃圾搖滾"
 
-#: src/libaudgui/infowin.c:93
+#: src/libaudgui/infowin.cc:100
 msgid "Hard Rock"
 msgstr "硬式搖滾"
 
-#: src/libaudgui/infowin.c:94
+#: src/libaudgui/infowin.cc:101
 msgid "Heavy Metal"
 msgstr "重金屬"
 
-#: src/libaudgui/infowin.c:95
+#: src/libaudgui/infowin.cc:102
 msgid "Hip-hop"
 msgstr "嘻哈"
 
-#: src/libaudgui/infowin.c:96
+#: src/libaudgui/infowin.cc:103
 msgid "House"
 msgstr "House"
 
-#: src/libaudgui/infowin.c:97
+#: src/libaudgui/infowin.cc:104
 msgid "Jazz"
 msgstr "爵士"
 
-#: src/libaudgui/infowin.c:98
+#: src/libaudgui/infowin.cc:105
 msgid "Jungle"
 msgstr "叢林"
 
-#: src/libaudgui/infowin.c:99
+#: src/libaudgui/infowin.cc:106
 msgid "Metal"
 msgstr "金屬"
 
-#: src/libaudgui/infowin.c:100
+#: src/libaudgui/infowin.cc:107
 msgid "New Age"
 msgstr "新世紀"
 
-#: src/libaudgui/infowin.c:101
+#: src/libaudgui/infowin.cc:108
 msgid "New Wave"
 msgstr "新浪潮"
 
-#: src/libaudgui/infowin.c:102
+#: src/libaudgui/infowin.cc:109
 msgid "Noise"
 msgstr "噪音"
 
-#: src/libaudgui/infowin.c:103
+#: src/libaudgui/infowin.cc:110
 msgid "Pop"
 msgstr "流行"
 
-#: src/libaudgui/infowin.c:104
+#: src/libaudgui/infowin.cc:111
 msgid "Punk Rock"
 msgstr "龐克搖滾"
 
-#: src/libaudgui/infowin.c:105
+#: src/libaudgui/infowin.cc:112
 msgid "Rap"
 msgstr "說唱"
 
-#: src/libaudgui/infowin.c:106
+#: src/libaudgui/infowin.cc:113
 msgid "Reggae"
 msgstr "雷鬼"
 
-#: src/libaudgui/infowin.c:107
+#: src/libaudgui/infowin.cc:114
 msgid "Rock"
 msgstr "搖滾 (Rock)"
 
-#: src/libaudgui/infowin.c:108
+#: src/libaudgui/infowin.cc:115
 msgid "Rock and Roll"
 msgstr "搖滾 (Rock&Roll)"
 
-#: src/libaudgui/infowin.c:109
+#: src/libaudgui/infowin.cc:116
 msgid "Rhythm and Blues"
 msgstr "R&B"
 
-#: src/libaudgui/infowin.c:110
+#: src/libaudgui/infowin.cc:117
 msgid "Ska"
 msgstr "Ska"
 
-#: src/libaudgui/infowin.c:111
+#: src/libaudgui/infowin.cc:118
 msgid "Soul"
 msgstr "靈魂"
 
-#: src/libaudgui/infowin.c:112
+#: src/libaudgui/infowin.cc:119
 msgid "Swing"
 msgstr "搖擺樂"
 
-#: src/libaudgui/infowin.c:113
+#: src/libaudgui/infowin.cc:120
 msgid "Techno"
 msgstr "數位"
 
-#: src/libaudgui/infowin.c:114
+#: src/libaudgui/infowin.cc:121
 msgid "Trip-hop"
 msgstr "迷幻舞曲"
 
-#: src/libaudgui/infowin.c:220
+#: src/libaudgui/infowin.cc:227
 msgid "Save successful"
 msgstr "儲存成功"
 
-#: src/libaudgui/infowin.c:224
+#: src/libaudgui/infowin.cc:231
 msgid "Save error"
 msgstr "儲存失敗"
 
-#: src/libaudgui/infowin.c:359
+#: src/libaudgui/infowin.cc:316 src/libaudgui/prefs-window.cc:86
+#: src/libaudqt/infowin.cc:62 src/libaudqt/prefs-window.cc:89
+msgid "Song Info"
+msgstr "歌曲資訊"
+
+#: src/libaudgui/infowin.cc:369 src/libaudqt/info-widget.cc:44
+msgid "Album Artist"
+msgstr "專輯藝人"
+
+#: src/libaudgui/infowin.cc:372 src/libaudgui/prefs-window.cc:109
+#: src/libaudqt/info-widget.cc:43 src/libaudqt/prefs-window.cc:112
+msgid "Comment"
+msgstr "備註"
+
+#: src/libaudgui/infowin.cc:382 src/libaudqt/info-widget.cc:41
 msgid "Track Number"
 msgstr "音軌編號"
 
-#: src/libaudgui/infowin.c:367
+#: src/libaudgui/infowin.cc:389
+msgid "Clea_r fields when moving to next song"
+msgstr "移到下一首歌曲時清除欄位(_R)"
+
+#: src/libaudgui/infowin.cc:403 src/libaudqt/infowin.cc:72
 msgid "_Save"
 msgstr "儲存(_S)"
 
-#: src/libaudgui/infowin.c:418
+#: src/libaudgui/infowin.cc:409
+msgid "_Next"
+msgstr "下一個(_N)"
+
+#: src/libaudgui/infowin.cc:455
 #, c-format
 msgid "%d kb/s"
 msgstr "%d kb/s"
 
-#: src/libaudgui/infowin.c:423
+#: src/libaudgui/infowin.cc:460
 msgid "N/A"
 msgstr "無"
 
-#: src/libaudgui/infowin.c:453
-#, c-format
-msgid "No info available for %s.\n"
-msgstr "無關於 %s 的資訊。\n"
-
-#: src/libaudgui/jump-to-time.c:48 src/libaudgui/ui_jumptotrack.c:305
+#: src/libaudgui/jump-to-time.cc:47 src/libaudgui/jump-to-track.cc:312
 msgid "_Jump"
 msgstr "跳轉(_J)"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Jump to Time"
 msgstr "跳轉到指定時間"
 
-#: src/libaudgui/jump-to-time.c:52
+#: src/libaudgui/jump-to-time.cc:51
 msgid "Enter time (minutes:seconds):"
 msgstr "請輸入時間 (分:秒):"
 
-#: src/libaudgui/playlists.c:86
-#, c-format
-msgid "Overwrite %s?"
-msgstr "覆寫 %s?"
-
-#: src/libaudgui/playlists.c:88
+#: src/libaudgui/jump-to-track.cc:95 src/libaudgui/jump-to-track.cc:103
+#: src/libaudgui/jump-to-track.cc:303
+msgid "_Queue"
+msgstr "排入佇列(_Q)"
+
+#: src/libaudgui/jump-to-track.cc:101
+msgid "Un_queue"
+msgstr "移出佇列(_Q)"
+
+#: src/libaudgui/jump-to-track.cc:238
+msgid "Jump to Song"
+msgstr "跳轉到指定歌曲"
+
+#: src/libaudgui/jump-to-track.cc:263
+msgid "Filter: "
+msgstr "過濾器:"
+
+#: src/libaudgui/jump-to-track.cc:264
+msgid "_Filter:"
+msgstr "過濾器(_F):"
+
+#: src/libaudgui/jump-to-track.cc:296
+msgid "C_lose on jump"
+msgstr "切換後關閉(_C)"
+
+#: src/libaudgui/playlists.cc:89
 msgid "_Overwrite"
 msgstr "覆寫(_O)"
 
-#: src/libaudgui/playlists.c:92
+#: src/libaudgui/playlists.cc:93
 msgid "Confirm Overwrite"
 msgstr "確認是否覆寫"
 
-#: src/libaudgui/playlists.c:121
+#: src/libaudgui/playlists.cc:93
+#, c-format
+msgid "Overwrite %s?"
+msgstr "覆寫 %s?"
+
+#: src/libaudgui/playlists.cc:123
 msgid "Export Playlist"
 msgstr "匯出播放清單"
 
-#: src/libaudgui/playlists.c:122
+#: src/libaudgui/playlists.cc:124
 msgid "_Export"
 msgstr "匯出(_E)"
 
-#: src/libaudgui/playlists.c:128
+#: src/libaudgui/playlists.cc:130
 msgid "Import Playlist"
 msgstr "匯入播放清單"
 
-#: src/libaudgui/playlists.c:129
+#: src/libaudgui/playlists.cc:131
 msgid "_Import"
 msgstr "匯入(_I)"
 
-#: src/libaudgui/queue-manager.c:172
-msgid "Queue Manager"
-msgstr "佇列管理"
+#: src/libaudgui/plugin-menu.cc:40
+msgid "_Plugins ..."
+msgstr "外掛(_P)"
 
-#: src/libaudgui/queue-manager.c:188
-msgid "_Unqueue"
-msgstr "移出佇列(_U)"
+#: src/libaudgui/plugin-prefs.cc:109 src/libaudqt/prefs-plugin.cc:56
+#, c-format
+msgid "About %s"
+msgstr "關於 %s"
 
-#: src/libaudgui/ui_fileopener.c:79
-msgid "Open Files"
-msgstr "開啟檔案"
+#: src/libaudgui/plugin-prefs.cc:155 src/libaudqt/prefs-plugin.cc:108
+#, c-format
+msgid "%s Settings"
+msgstr "%s 設定"
 
-#: src/libaudgui/ui_fileopener.c:80 src/libaudgui/url-opener.c:50
-msgid "_Open"
-msgstr "開啟(_O)"
+#: src/libaudgui/plugin-prefs.cc:159 src/libaudqt/prefs-plugin.cc:120
+msgid "_Set"
+msgstr "套用(_S)"
 
-#: src/libaudgui/ui_fileopener.c:82
-msgid "Close _dialog on open"
-msgstr "開啟後關閉對話視窗(_D)"
+#: src/libaudgui/plugin-view.cc:235 src/libaudgui/prefs-window.cc:650
+#: src/libaudqt/prefs-window.cc:490
+msgid "_Settings"
+msgstr "設定(_S)"
 
-#: src/libaudgui/ui_fileopener.c:87
-msgid "Add Files"
-msgstr "加入檔案"
+#: src/libaudgui/plugin-view.cc:242 src/libaudgui/prefs-window.cc:661
+#: src/libaudqt/prefs-window.cc:504
+msgid "_About"
+msgstr "關於(_A)"
 
-#: src/libaudgui/ui_fileopener.c:88 src/libaudgui/url-opener.c:56
-msgid "_Add"
-msgstr "加入(_A)"
+#: src/libaudgui/prefs-window.cc:82 src/libaudqt/prefs-window.cc:85
+msgid "Appearance"
+msgstr "外觀"
 
-#: src/libaudgui/ui_fileopener.c:90
-msgid "Close _dialog on add"
-msgstr "加入後關閉對話視窗(_D)"
+#: src/libaudgui/prefs-window.cc:83 src/libaudqt/prefs-window.cc:86
+msgid "Audio"
+msgstr "音訊"
 
-#: src/libaudgui/ui_jumptotrack.c:101 src/libaudgui/ui_jumptotrack.c:109
-#: src/libaudgui/ui_jumptotrack.c:301
-msgid "_Queue"
-msgstr "排入佇列(_Q)"
+#: src/libaudgui/prefs-window.cc:84 src/libaudqt/prefs-window.cc:87
+msgid "Network"
+msgstr "網路"
 
-#: src/libaudgui/ui_jumptotrack.c:107
-msgid "Un_queue"
-msgstr "移出佇列(_Q)"
+#: src/libaudgui/prefs-window.cc:85 src/libaudgui/prefs-window.cc:95
+#: src/libaudqt/prefs-window.cc:88 src/libaudqt/prefs-window.cc:98
+msgid "Playlist"
+msgstr "播放清單"
 
-#: src/libaudgui/ui_jumptotrack.c:245
-msgid "Jump to Song"
-msgstr "跳轉到指定歌曲"
+#: src/libaudgui/prefs-window.cc:87 src/libaudqt/prefs-window.cc:90
+msgid "Plugins"
+msgstr "外掛"
 
-#: src/libaudgui/ui_jumptotrack.c:270
-msgid "Filter: "
-msgstr "過濾器:"
+#: src/libaudgui/prefs-window.cc:91 src/libaudqt/prefs-window.cc:94
+msgid "General"
+msgstr "一般"
 
-#: src/libaudgui/ui_jumptotrack.c:271
-msgid "_Filter:"
-msgstr "過濾器(_F):"
+#: src/libaudgui/prefs-window.cc:92 src/libaudqt/prefs-window.cc:95
+msgid "Effect"
+msgstr "特效"
 
-#: src/libaudgui/ui_jumptotrack.c:294
-msgid "C_lose on jump"
-msgstr "切換後關閉(_C)"
+#: src/libaudgui/prefs-window.cc:93 src/libaudqt/prefs-window.cc:96
+msgid "Visualization"
+msgstr "視覺特效"
+
+#: src/libaudgui/prefs-window.cc:94 src/libaudqt/prefs-window.cc:97
+msgid "Input"
+msgstr "輸入"
+
+#: src/libaudgui/prefs-window.cc:96 src/libaudqt/prefs-window.cc:99
+msgid "Transport"
+msgstr "傳輸"
+
+#: src/libaudgui/prefs-window.cc:103 src/libaudqt/prefs-window.cc:106
+msgid "Track number"
+msgstr "音軌編號"
+
+#: src/libaudgui/prefs-window.cc:105 src/libaudqt/prefs-window.cc:108
+msgid "File name"
+msgstr "檔案名稱"
+
+#: src/libaudgui/prefs-window.cc:106 src/libaudqt/prefs-window.cc:109
+msgid "File path"
+msgstr "檔案路徑"
+
+#: src/libaudgui/prefs-window.cc:107 src/libaudqt/prefs-window.cc:110
+msgid "Date"
+msgstr "日期"
+
+#: src/libaudgui/prefs-window.cc:110 src/libaudqt/info-widget.cc:54
+#: src/libaudqt/prefs-window.cc:113
+msgid "Codec"
+msgstr "編解碼器"
+
+#: src/libaudgui/prefs-window.cc:111 src/libaudqt/info-widget.cc:55
+#: src/libaudqt/prefs-window.cc:114
+msgid "Quality"
+msgstr "品質"
+
+#: src/libaudgui/prefs-window.cc:116 src/libaudqt/prefs-window.cc:119
+msgid "None"
+msgstr "無"
+
+#: src/libaudgui/prefs-window.cc:117 src/libaudqt/prefs-window.cc:120
+msgid "Arabic"
+msgstr "阿拉伯語"
+
+#: src/libaudgui/prefs-window.cc:118 src/libaudqt/prefs-window.cc:121
+msgid "Baltic"
+msgstr "波羅的海"
+
+#: src/libaudgui/prefs-window.cc:119 src/libaudqt/prefs-window.cc:122
+msgid "Chinese"
+msgstr "中文"
+
+#: src/libaudgui/prefs-window.cc:120 src/libaudqt/prefs-window.cc:123
+msgid "Greek"
+msgstr "希臘語"
+
+#: src/libaudgui/prefs-window.cc:121 src/libaudqt/prefs-window.cc:124
+msgid "Hebrew"
+msgstr "希伯來語"
+
+#: src/libaudgui/prefs-window.cc:122 src/libaudqt/prefs-window.cc:125
+msgid "Japanese"
+msgstr "日本語"
+
+#: src/libaudgui/prefs-window.cc:123 src/libaudqt/prefs-window.cc:126
+msgid "Korean"
+msgstr "韓文"
+
+#: src/libaudgui/prefs-window.cc:124 src/libaudqt/prefs-window.cc:127
+msgid "Polish"
+msgstr "波蘭語"
+
+#: src/libaudgui/prefs-window.cc:125 src/libaudqt/prefs-window.cc:128
+msgid "Russian"
+msgstr "俄語"
+
+#: src/libaudgui/prefs-window.cc:126 src/libaudqt/prefs-window.cc:129
+msgid "Taiwanese"
+msgstr "正體中文"
+
+#: src/libaudgui/prefs-window.cc:127 src/libaudqt/prefs-window.cc:130
+msgid "Turkish"
+msgstr "土耳其語"
+
+#: src/libaudgui/prefs-window.cc:135 src/libaudqt/prefs-window.cc:138
+msgid "Floating point"
+msgstr "浮點數"
+
+#: src/libaudgui/prefs-window.cc:147 src/libaudqt/prefs-window.cc:150
+msgid "<b>Interface Settings</b>"
+msgstr "<b>介面設定</b>"
+
+#: src/libaudgui/prefs-window.cc:148 src/libaudqt/prefs-window.cc:151
+msgid "Interface plugin:"
+msgstr "介面外掛:"
+
+#: src/libaudgui/prefs-window.cc:166 src/libaudqt/prefs-window.cc:169
+msgid "Output plugin:"
+msgstr "輸出外掛:"
+
+#: src/libaudgui/prefs-window.cc:174 src/libaudqt/prefs-window.cc:177
+msgid "<b>Output Settings</b>"
+msgstr "<b>輸出設定</b>"
+
+#: src/libaudgui/prefs-window.cc:176 src/libaudqt/prefs-window.cc:179
+msgid "Bit depth:"
+msgstr "取樣格式:"
+
+#: src/libaudgui/prefs-window.cc:179 src/libaudgui/prefs-window.cc:224
+#: src/libaudqt/prefs-window.cc:182 src/libaudqt/prefs-window.cc:227
+msgid "Buffer size:"
+msgstr "緩衝區大小:"
+
+#: src/libaudgui/prefs-window.cc:181 src/libaudqt/prefs-window.cc:184
+msgid "ms"
+msgstr "毫秒"
+
+#: src/libaudgui/prefs-window.cc:182 src/libaudqt/prefs-window.cc:185
+msgid "Soft clipping"
+msgstr "軟性削峰"
+
+#: src/libaudgui/prefs-window.cc:184 src/libaudqt/prefs-window.cc:187
+msgid "Use software volume control (not recommended)"
+msgstr "使用軟體音量控制 (不建議開啟)"
+
+#: src/libaudgui/prefs-window.cc:186 src/libaudqt/prefs-window.cc:189
+msgid "<b>Replay Gain</b>"
+msgstr "<b>播放增益</b>"
+
+#: src/libaudgui/prefs-window.cc:187 src/libaudqt/prefs-window.cc:190
+msgid "Enable Replay Gain"
+msgstr "啟用播放增益"
+
+#: src/libaudgui/prefs-window.cc:189 src/libaudqt/prefs-window.cc:192
+msgid "Album mode"
+msgstr "專輯模式"
+
+#: src/libaudgui/prefs-window.cc:192 src/libaudqt/prefs-window.cc:195
+msgid "Prevent clipping (recommended)"
+msgstr "防止訊號裁剪 (建議開啟)"
+
+#: src/libaudgui/prefs-window.cc:195 src/libaudqt/prefs-window.cc:198
+msgid "<b>Adjust Levels</b>"
+msgstr "<b>調整音量</b>"
+
+#: src/libaudgui/prefs-window.cc:197 src/libaudqt/prefs-window.cc:200
+msgid "Amplify all files:"
+msgstr "放大所有檔案的音量:"
+
+#: src/libaudgui/prefs-window.cc:199 src/libaudgui/prefs-window.cc:203
+#: src/libaudqt/prefs-window.cc:202 src/libaudqt/prefs-window.cc:206
+msgid "dB"
+msgstr "分貝"
+
+#: src/libaudgui/prefs-window.cc:201 src/libaudqt/prefs-window.cc:204
+msgid "Amplify untagged files:"
+msgstr "放大無標籤檔案的音量:"
+
+#: src/libaudgui/prefs-window.cc:208 src/libaudqt/prefs-window.cc:211
+msgid "Proxy hostname:"
+msgstr "代理伺服器名稱:"
+
+#: src/libaudgui/prefs-window.cc:210 src/libaudqt/prefs-window.cc:213
+msgid "Proxy port:"
+msgstr "代理伺服器連接埠:"
+
+#: src/libaudgui/prefs-window.cc:215 src/libaudqt/prefs-window.cc:218
+msgid "Proxy username:"
+msgstr "代理伺服器使用者名稱:"
+
+#: src/libaudgui/prefs-window.cc:217 src/libaudqt/prefs-window.cc:220
+msgid "Proxy password:"
+msgstr "代理伺服器密碼:"
+
+#: src/libaudgui/prefs-window.cc:223 src/libaudqt/prefs-window.cc:226
+msgid "<b>Network Settings</b>"
+msgstr "<b>網路設定</b>"
+
+#: src/libaudgui/prefs-window.cc:226 src/libaudqt/prefs-window.cc:229
+msgid "KiB"
+msgstr "KiB"
+
+#: src/libaudgui/prefs-window.cc:227 src/libaudqt/prefs-window.cc:230
+msgid "<b>Proxy Configuration</b>"
+msgstr "<b>代理伺服器設定</b>"
+
+#: src/libaudgui/prefs-window.cc:228 src/libaudqt/prefs-window.cc:231
+msgid "Enable proxy usage"
+msgstr "啟用代理伺服器"
 
-#: src/libaudgui/ui_playlist_manager.c:223
-msgid "Playlist Manager"
-msgstr "播放清單管理"
+#: src/libaudgui/prefs-window.cc:232 src/libaudqt/prefs-window.cc:235
+msgid "Use authentication with proxy"
+msgstr "需要認證"
 
-#: src/libaudgui/ui_playlist_manager.c:236
-msgid "Entries"
-msgstr "數量"
+#: src/libaudgui/prefs-window.cc:240 src/libaudqt/prefs-window.cc:243
+msgid "Auto character encoding detector for:"
+msgstr "自動偵測字元編碼:"
 
-#: src/libaudgui/ui_playlist_manager.c:254
-msgid "_New"
-msgstr "新增(_N)"
+#: src/libaudgui/prefs-window.cc:244 src/libaudqt/prefs-window.cc:247
+msgid "Fallback character encodings:"
+msgstr "備用字元編碼:"
 
-#: src/libaudgui/ui_playlist_manager.c:256
-msgid "Ren_ame"
-msgstr "重新命名(_A)"
+#: src/libaudgui/prefs-window.cc:252 src/libaudqt/prefs-window.cc:256
+msgid "<b>Behavior</b>"
+msgstr "<b>行為</b>"
 
-#: src/libaudgui/ui_playlist_manager.c:257
-msgid "_Play"
-msgstr "播放(_P)"
+#: src/libaudgui/prefs-window.cc:253 src/libaudqt/prefs-window.cc:257
+msgid "Resume playback on startup"
+msgstr "啟動時回復之前的播放狀態"
 
-#: src/libaudgui/ui_playlist_manager.c:269
-msgid "_Close dialog on activating playlist"
-msgstr "啟用播放清單後關閉對話視窗(_C)"
+#: src/libaudgui/prefs-window.cc:255 src/libaudqt/prefs-window.cc:259
+msgid "Pause instead of resuming immediately"
+msgstr "暫停而非立刻回復播放"
 
-#: src/libaudgui/url-opener.c:49
+#: src/libaudgui/prefs-window.cc:258 src/libaudqt/prefs-window.cc:262
+msgid "Advance when the current song is deleted"
+msgstr "目前的歌曲被刪除時移到下一個項目"
+
+#: src/libaudgui/prefs-window.cc:260 src/libaudqt/prefs-window.cc:264
+msgid "Clear the playlist when opening files"
+msgstr "開啟檔案後清除播放清單"
+
+#: src/libaudgui/prefs-window.cc:262 src/libaudqt/prefs-window.cc:266
+msgid "Open files in a temporary playlist"
+msgstr "在暫存播放清單中開啟檔案"
+
+#: src/libaudgui/prefs-window.cc:264 src/libaudqt/prefs-window.cc:270
+msgid "<b>Compatibility</b>"
+msgstr "<b>相容性</b>"
+
+#: src/libaudgui/prefs-window.cc:265 src/libaudqt/prefs-window.cc:271
+msgid "Interpret \\ (backward slash) as a folder delimiter"
+msgstr "將 \\ (反斜線) 視為資料夾分隔符號"
+
+#: src/libaudgui/prefs-window.cc:268 src/libaudqt/prefs-window.cc:274
+msgid "<b>Song Display</b>"
+msgstr "<b>顯示歌曲</b>"
+
+#: src/libaudgui/prefs-window.cc:269 src/libaudqt/prefs-window.cc:275
+msgid "Show song numbers"
+msgstr "顯示歌曲編號"
+
+#: src/libaudgui/prefs-window.cc:271 src/libaudqt/prefs-window.cc:277
+msgid "Show leading zeroes (02:00 instead of 2:00)"
+msgstr "顯示開頭的數字零 (例:02:00 而不是 2:00)"
+
+#: src/libaudgui/prefs-window.cc:274 src/libaudqt/prefs-window.cc:280
+msgid "<b>Advanced</b>"
+msgstr "<b>進階</b>"
+
+#: src/libaudgui/prefs-window.cc:275 src/libaudqt/prefs-window.cc:268
+#: src/libaudqt/prefs-window.cc:281
+msgid "Do not load metadata for songs until played"
+msgstr "在歌曲播放以前不要載入詮釋資料"
+
+#: src/libaudgui/prefs-window.cc:277 src/libaudqt/prefs-window.cc:283
+msgid "Probe content of files with no recognized file name extension"
+msgstr "偵測帶有不明副檔名的檔案內容"
+
+#: src/libaudgui/prefs-window.cc:282 src/libaudqt/prefs-window.cc:288
+msgid "<b>Album Art</b>"
+msgstr "<b>專輯封面</b>"
+
+#: src/libaudgui/prefs-window.cc:283 src/libaudqt/prefs-window.cc:289
+msgid "Search for images matching these words (comma-separated):"
+msgstr "搜尋符合這些單字的圖片 (以逗號分隔):"
+
+#: src/libaudgui/prefs-window.cc:285 src/libaudqt/prefs-window.cc:291
+msgid "Exclude images matching these words (comma-separated):"
+msgstr "排除符合這些單字的圖片 (以逗號分隔):"
+
+#: src/libaudgui/prefs-window.cc:287 src/libaudqt/prefs-window.cc:293
+msgid "Search for images matching song file name"
+msgstr "搜尋符合歌曲檔名的圖片"
+
+#: src/libaudgui/prefs-window.cc:289 src/libaudqt/prefs-window.cc:295
+msgid "Search recursively"
+msgstr "遞迴搜尋"
+
+#: src/libaudgui/prefs-window.cc:291 src/libaudqt/prefs-window.cc:297
+msgid "Search depth:"
+msgstr "搜尋深度:"
+
+#: src/libaudgui/prefs-window.cc:295 src/libaudqt/prefs-window.cc:301
+msgid "<b>Popup Information</b>"
+msgstr "<b>彈出式資訊視窗</b>"
+
+#: src/libaudgui/prefs-window.cc:296 src/libaudqt/prefs-window.cc:302
+msgid "Show popup information"
+msgstr "顯示彈出式資訊視窗"
+
+#: src/libaudgui/prefs-window.cc:298 src/libaudqt/prefs-window.cc:304
+msgid "Popup delay (tenths of a second):"
+msgstr "彈出視窗的延遲時間 (十分之一秒):"
+
+#: src/libaudgui/prefs-window.cc:302 src/libaudqt/prefs-window.cc:308
+msgid "Show time scale for current song"
+msgstr "顯示目前歌曲的時間軸"
+
+#: src/libaudgui/prefs-window.cc:319 src/libaudqt/prefs-window.cc:325
+msgid "TITLE"
+msgstr "標題"
+
+#: src/libaudgui/prefs-window.cc:320 src/libaudqt/prefs-window.cc:326
+msgid "ARTIST - TITLE"
+msgstr "藝人 - 標題"
+
+#: src/libaudgui/prefs-window.cc:321 src/libaudqt/prefs-window.cc:327
+msgid "ARTIST - ALBUM - TITLE"
+msgstr "藝人 - 專輯 - 標題"
+
+#: src/libaudgui/prefs-window.cc:322 src/libaudqt/prefs-window.cc:328
+msgid "ARTIST - ALBUM - TRACK. TITLE"
+msgstr "藝人 - 專輯 - 音軌. 標題"
+
+#: src/libaudgui/prefs-window.cc:323 src/libaudqt/prefs-window.cc:329
+msgid "ARTIST [ ALBUM ] - TRACK. TITLE"
+msgstr "藝人 [ 專輯 ] - 音軌. 標題"
+
+#: src/libaudgui/prefs-window.cc:324 src/libaudqt/prefs-window.cc:330
+msgid "ALBUM - TITLE"
+msgstr "專輯 - 標題"
+
+#: src/libaudgui/prefs-window.cc:418
+msgid "Category"
+msgstr "目錄"
+
+#: src/libaudgui/prefs-window.cc:487 src/libaudqt/prefs-window.cc:346
+msgid "Custom"
+msgstr "自訂"
+
+#: src/libaudgui/prefs-window.cc:505 src/libaudqt/prefs-window.cc:338
+msgid "Title format:"
+msgstr "標題格式:"
+
+#: src/libaudgui/prefs-window.cc:509 src/libaudqt/prefs-window.cc:349
+msgid "Custom string:"
+msgstr "自訂字串:"
+
+#: src/libaudgui/prefs-window.cc:711 src/libaudqt/prefs-window.cc:648
+msgid "Audacious Settings"
+msgstr "Audacious 設定"
+
+#: src/libaudgui/queue-manager.cc:175 src/libaudqt/queue-manager.cc:133
+msgid "Queue Manager"
+msgstr "佇列管理"
+
+#: src/libaudgui/queue-manager.cc:193 src/libaudqt/queue-manager.cc:115
+msgid "_Unqueue"
+msgstr "移出佇列(_U)"
+
+#: src/libaudgui/status.cc:36
+msgid "Working ..."
+msgstr "處理中 ..."
+
+#: src/libaudgui/status.cc:85 src/libaudqt/log-inspector.cc:192
+msgid "Error"
+msgstr "錯誤"
+
+#: src/libaudgui/url-opener.cc:49
 msgid "Open URL"
 msgstr "開啟網址"
 
-#: src/libaudgui/url-opener.c:55
+#: src/libaudgui/url-opener.cc:55
 msgid "Add URL"
 msgstr "加入網址"
 
-#: src/libaudgui/url-opener.c:74
+#: src/libaudgui/url-opener.cc:79
 msgid "Enter URL:"
 msgstr "請輸入網址:"
 
-#: src/libaudgui/util.c:173
+#: src/libaudgui/util.cc:154
 msgid ""
 "\n"
 "(Further messages have been hidden.)"
 msgstr ""
 "\n"
 "(詳細訊息已被隱藏。)"
+
+#: src/libaudqt/fileopener.cc:40
+msgid "Open Folder"
+msgstr "開啟資料夾"
+
+#: src/libaudqt/fileopener.cc:42
+msgid "Add Folder"
+msgstr "加入資料夾"
+
+#: src/libaudqt/fileopener.cc:46 src/libaudqt/fileopener.cc:47
+msgid "Open"
+msgstr "開啟"
+
+#: src/libaudqt/fileopener.cc:48 src/libaudqt/fileopener.cc:49
+msgid "Add"
+msgstr "加入"
+
+#: src/libaudqt/info-widget.cc:37
+msgid "Metadata"
+msgstr "詮釋資料"
+
+#: src/libaudqt/info-widget.cc:45
+msgid "Composer"
+msgstr "作曲"
+
+#: src/libaudqt/info-widget.cc:46
+msgid "Performer"
+msgstr "表演者"
+
+#: src/libaudqt/info-widget.cc:47
+msgid "Recording Year"
+msgstr "錄製年份"
+
+#: src/libaudqt/info-widget.cc:48
+msgid "Recording Date"
+msgstr "錄製日期"
+
+#: src/libaudqt/info-widget.cc:51
+msgid "Technical"
+msgstr "技術性資訊"
+
+#: src/libaudqt/info-widget.cc:53
+msgid "MIME Type"
+msgstr "MIME 類型"
+
+#: src/libaudqt/info-widget.cc:56
+msgid "Bitrate"
+msgstr "位元率"
+
+#: src/libaudqt/infowin.cc:129
+#, c-format
+msgid "No info available for %s.\n"
+msgstr "無關於 %s 的資訊。\n"
+
+#: src/libaudqt/log-inspector.cc:106
+msgid "Level"
+msgstr "等級"
+
+#: src/libaudqt/log-inspector.cc:107
+msgid "Filename"
+msgstr "檔案名稱"
+
+#: src/libaudqt/log-inspector.cc:108
+msgid "Line"
+msgstr "行號"
+
+#: src/libaudqt/log-inspector.cc:109
+msgid "Function"
+msgstr "功能"
+
+#: src/libaudqt/log-inspector.cc:110
+msgid "Message"
+msgstr "訊息"
+
+#: src/libaudqt/log-inspector.cc:175
+msgid "Log Inspector"
+msgstr "記錄監控"
+
+#: src/libaudqt/log-inspector.cc:186
+msgid "Log Level:"
+msgstr "記錄等級:"
+
+#: src/libaudqt/log-inspector.cc:189
+msgid "Debug"
+msgstr "除錯"
+
+#: src/libaudqt/log-inspector.cc:190
+msgid "Info"
+msgstr "資訊"
+
+#: src/libaudqt/log-inspector.cc:191
+msgid "Warning"
+msgstr "警告"
+
+#: src/libaudqt/plugin-menu.cc:40
+msgid "Plugins ..."
+msgstr "外掛 ..."
diff --git a/src/Makefile b/src/Makefile
index 482f7c05a03c..105caa116e19 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,6 +1,14 @@
 include ../extra.mk
 
-SUBDIRS := audacious libaudcore libaudgui libaudtag
+SUBDIRS := audacious libaudcore libaudtag
+
+ifeq ($(USE_GTK),yes)
+SUBDIRS += libaudgui
+endif
+
+ifeq ($(USE_QT),yes)
+SUBDIRS += libaudqt
+endif
 
 ifeq ($(USE_DBUS),yes)
 SUBDIRS := dbus audtool ${SUBDIRS}
@@ -8,8 +16,16 @@ endif
 
 include ../buildsys.mk
 
-audacious libaudgui libaudtag: libaudcore
-audacious: libaudgui libaudtag
+audacious: libaudcore
+libaudtag: libaudcore
+
+ifeq ($(USE_GTK),yes)
+libaudgui: libaudcore
+endif
+
+ifeq ($(USE_QT),yes)
+libaudqt: libaudcore
+endif
 
 ifeq ($(USE_DBUS),yes)
 audacious audtool: dbus
diff --git a/src/audacious/Makefile b/src/audacious/Makefile
index bccf8365a31e..89a017e822d1 100644
--- a/src/audacious/Makefile
+++ b/src/audacious/Makefile
@@ -1,79 +1,17 @@
 include ../../extra.mk
 
 PROG = audacious${PROG_SUFFIX}
-SRCS = adder.c \
-       art.c \
-       chardet.c								\
-       config.c \
-       drct.c \
-       effect.c									\
-       equalizer.c								\
-       equalizer_preset.c						\
-       fft.c									\
-       general.c \
-       history.c \
-       interface.c								\
-       main.c									\
-       output.c									\
-       playback.c								\
-       playlist-files.c \
-       playlist-new.c \
-       playlist-utils.c \
-       pluginenum.c								\
-       plugin-preferences.c \
-       plugin-registry.c \
-       plugin-init.c \
-       plugin-view.c \
-       preferences.c \
-       probe.c \
-       probe-buffer.c \
-       scanner.c \
-       signals.c								\
-       ui_plugin_menu.c \
-       ui_preferences.c							\
-       util.c									\
-       vis_runner.c \
-       visualization.c							\
-       ui_albumart.c
+
+SRCS = main.cc \
+       signals.cc \
+       util.cc
 
 ifeq ($(HAVE_MSWINDOWS),yes)
 SRCS += audacious.rc
 endif
 
-INCLUDES = api.h \
-           api-alias-begin.h \
-           api-alias-end.h \
-           api-define-begin.h \
-           api-define-end.h \
-           debug.h \
-           drct.h \
-           drct-api.h \
-           i18n.h				\
-           input.h \
-           input-api.h \
-           misc.h \
-           misc-api.h \
-           playlist.h \
-           playlist-api.h \
-           plugin.h				\
-           plugins.h \
-           plugins-api.h \
-           preferences.h		\
-           types.h
-
-DATA = images/about-logo.png				\
-       images/album.png \
-       images/appearance.png \
-       images/audio.png						\
-       images/connectivity.png				\
-       images/info.png \
-       images/playlist.png					\
-       images/plugins.png
-
-CLEAN = build_stamp.c
-
 ifeq ($(USE_DBUS),yes)
-SRCS += dbus-server.c
+SRCS += dbus-server.cc
 EXT_DEPS += ../dbus/aud-dbus.a
 endif
 
@@ -84,30 +22,16 @@ CPPFLAGS := -I../dbus ${CPPFLAGS} ${GIO_CFLAGS}
 LIBS := ../dbus/aud-dbus.a ${LIBS} ${GIO_LIBS}
 endif
 
+LD = ${CXX}
+
 CPPFLAGS := -I.. -I../.. \
             ${CPPFLAGS} \
-		${GLIB_CFLAGS}			\
-		${GMODULE_CFLAGS} \
-		${GTK_CFLAGS}			\
-		${LIBGUESS_CFLAGS}
+            ${GLIB_CFLAGS}
 
-CPPFLAGS := ${CPPFLAGS} \
-            -D_AUDACIOUS_CORE \
-            -DHARDCODE_BINDIR=\"${bindir}\" \
-            -DHARDCODE_DATADIR=\"${datadir}/audacious\" \
-            -DHARDCODE_PLUGINDIR=\"${plugindir}\" \
-            -DHARDCODE_LOCALEDIR=\"${localedir}\" \
-            -DHARDCODE_DESKTOPFILE=\"${datarootdir}/applications/audacious.desktop\" \
-            -DHARDCODE_ICONFILE=\"${datarootdir}/pixmaps/audacious.png\"
+CPPFLAGS += -D_AUDACIOUS_CORE
 
 LIBS := -L../libaudcore -laudcore \
-        -L../libaudgui -laudgui \
-        -L../libaudtag -laudtag \
         ${LIBS} -lm \
-		${LIBINTL}						\
-		${GLIB_LIBS}					\
-		${GMODULE_LIBS} \
-		${GTK_LIBS}
+        ${LIBINTL} \
+        ${GLIB_LIBS}
 
-desktop_DATA = audacious.desktop
-desktopdir = ${datarootdir}/applications
diff --git a/src/audacious/adder.c b/src/audacious/adder.c
deleted file mode 100644
index 509f363027e0..000000000000
--- a/src/audacious/adder.c
+++ /dev/null
@@ -1,573 +0,0 @@
-/*
- * adder.c
- * Copyright 2011-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <pthread.h>
-#include <string.h>
-#include <sys/stat.h>
-
-#include <glib/gstdio.h>
-#include <gtk/gtk.h>
-
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-
-#include "drct.h"
-#include "i18n.h"
-#include "playlist.h"
-#include "plugins.h"
-#include "main.h"
-#include "misc.h"
-#include "util.h"
-
-typedef struct {
-    int playlist_id, at;
-    bool_t play;
-    Index * filenames, * tuples;
-    PlaylistFilterFunc filter;
-    void * user;
-} AddTask;
-
-typedef struct {
-    int playlist_id, at;
-    bool_t play;
-    char * title;
-    Index * filenames, * tuples, * decoders;
-} AddResult;
-
-static GList * add_tasks = NULL;
-static GList * add_results = NULL;
-static int current_playlist_id = -1;
-
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
-static bool_t add_quit;
-static pthread_t add_thread;
-static int add_source = 0;
-
-static int status_source = 0;
-static char status_path[512];
-static int status_count;
-static GtkWidget * status_window = NULL, * status_path_label,
- * status_count_label;
-
-static bool_t status_cb (void * unused)
-{
-    if (! headless_mode () && ! status_window)
-    {
-        status_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-        gtk_window_set_type_hint ((GtkWindow *) status_window,
-         GDK_WINDOW_TYPE_HINT_DIALOG);
-        gtk_window_set_title ((GtkWindow *) status_window, _("Searching ..."));
-        gtk_window_set_resizable ((GtkWindow *) status_window, FALSE);
-        gtk_container_set_border_width ((GtkContainer *) status_window, 6);
-
-        GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
-        gtk_container_add ((GtkContainer *) status_window, vbox);
-
-        status_path_label = gtk_label_new (NULL);
-        gtk_label_set_width_chars ((GtkLabel *) status_path_label, 40);
-        gtk_label_set_max_width_chars ((GtkLabel *) status_path_label, 40);
-        gtk_label_set_ellipsize ((GtkLabel *) status_path_label,
-         PANGO_ELLIPSIZE_MIDDLE);
-        gtk_box_pack_start ((GtkBox *) vbox, status_path_label, FALSE, FALSE, 0);
-
-        status_count_label = gtk_label_new (NULL);
-        gtk_label_set_width_chars ((GtkLabel *) status_count_label, 40);
-        gtk_label_set_max_width_chars ((GtkLabel *) status_count_label, 40);
-        gtk_box_pack_start ((GtkBox *) vbox, status_count_label, FALSE, FALSE, 0);
-
-        gtk_widget_show_all (status_window);
-
-        g_signal_connect (status_window, "destroy", (GCallback)
-         gtk_widget_destroyed, & status_window);
-    }
-
-    pthread_mutex_lock (& mutex);
-
-    char scratch[128];
-    snprintf (scratch, sizeof scratch, dngettext (PACKAGE, "%d file found",
-     "%d files found", status_count), status_count);
-
-    if (headless_mode ())
-    {
-        printf ("Searching, %s ...\r", scratch);
-        fflush (stdout);
-    }
-    else
-    {
-        gtk_label_set_text ((GtkLabel *) status_path_label, status_path);
-        gtk_label_set_text ((GtkLabel *) status_count_label, scratch);
-    }
-
-    pthread_mutex_unlock (& mutex);
-    return TRUE;
-}
-
-static void status_update (const char * filename, int found)
-{
-    pthread_mutex_lock (& mutex);
-
-    snprintf (status_path, sizeof status_path, "%s", filename);
-    status_count = found;
-
-    if (! status_source)
-        status_source = g_timeout_add (250, status_cb, NULL);
-
-    pthread_mutex_unlock (& mutex);
-}
-
-static void status_done_locked (void)
-{
-    if (status_source)
-    {
-        g_source_remove (status_source);
-        status_source = 0;
-    }
-
-    if (headless_mode ())
-        printf ("\n");
-    else if (status_window)
-        gtk_widget_destroy (status_window);
-}
-
-static AddTask * add_task_new (int playlist_id, int at, bool_t play,
- Index * filenames, Index * tuples, PlaylistFilterFunc filter,
- void * user)
-{
-    AddTask * task = g_slice_new (AddTask);
-    task->playlist_id = playlist_id;
-    task->at = at;
-    task->play = play;
-    task->filenames = filenames;
-    task->tuples = tuples;
-    task->filter = filter;
-    task->user = user;
-    return task;
-}
-
-static void add_task_free (AddTask * task)
-{
-    if (task->filenames)
-        index_free_full (task->filenames, (IndexFreeFunc) str_unref);
-    if (task->tuples)
-        index_free_full (task->tuples, (IndexFreeFunc) tuple_unref);
-
-    g_slice_free (AddTask, task);
-}
-
-static AddResult * add_result_new (int playlist_id, int at, bool_t play)
-{
-    AddResult * result = g_slice_new (AddResult);
-    result->playlist_id = playlist_id;
-    result->at = at;
-    result->play = play;
-    result->title = NULL;
-    result->filenames = index_new ();
-    result->tuples = index_new ();
-    result->decoders = index_new ();
-    return result;
-}
-
-static void add_result_free (AddResult * result)
-{
-    str_unref (result->title);
-
-    if (result->filenames)
-        index_free_full (result->filenames, (IndexFreeFunc) str_unref);
-    if (result->tuples)
-        index_free_full (result->tuples, (IndexFreeFunc) tuple_unref);
-    if (result->decoders)
-        index_free (result->decoders);
-
-    g_slice_free (AddResult, result);
-}
-
-static void add_file (char * filename, Tuple * tuple, PluginHandle * decoder,
- PlaylistFilterFunc filter, void * user, AddResult * result, bool_t validate)
-{
-    g_return_if_fail (filename);
-    if (filter && ! filter (filename, user))
-    {
-        str_unref (filename);
-        return;
-    }
-
-    status_update (filename, index_count (result->filenames));
-
-    if (! tuple && ! decoder)
-    {
-        decoder = file_find_decoder (filename, TRUE);
-        if (validate && ! decoder)
-        {
-            str_unref (filename);
-            return;
-        }
-    }
-
-    if (! tuple && decoder && input_plugin_has_subtunes (decoder) && ! strchr
-     (filename, '?'))
-        tuple = file_read_tuple (filename, decoder);
-
-    int n_subtunes = tuple ? tuple_get_n_subtunes (tuple) : 0;
-
-    if (n_subtunes)
-    {
-        for (int sub = 0; sub < n_subtunes; sub ++)
-        {
-            char * subname = str_printf ("%s?%d", filename,
-             tuple_get_nth_subtune (tuple, sub));
-            add_file (subname, NULL, decoder, filter, user, result, FALSE);
-        }
-
-        str_unref (filename);
-        tuple_unref (tuple);
-        return;
-    }
-
-    index_insert (result->filenames, -1, filename);
-    index_insert (result->tuples, -1, tuple);
-    index_insert (result->decoders, -1, decoder);
-}
-
-static void add_folder (char * filename, PlaylistFilterFunc filter,
- void * user, AddResult * result, bool_t is_single)
-{
-    char * path = NULL;
-
-    g_return_if_fail (filename);
-
-    if (filter && ! filter (filename, user))
-        goto DONE;
-
-    status_update (filename, index_count (result->filenames));
-
-    if (! (path = uri_to_filename (filename)))
-        goto DONE;
-
-    GList * files = NULL;
-    GDir * folder = g_dir_open (path, 0, NULL);
-    if (! folder)
-        goto DONE;
-
-    const char * name;
-    while ((name = g_dir_read_name (folder)))
-    {
-        char * filepath = filename_build (path, name);
-        files = g_list_prepend (files, filepath);
-    }
-
-    g_dir_close (folder);
-
-    if (files && is_single)
-    {
-        char * last = last_path_element (path);
-        result->title = str_get (last ? last : path);
-    }
-
-    files = g_list_sort (files, (GCompareFunc) str_compare);
-
-    while (files)
-    {
-        GStatBuf info;
-        if (g_lstat (files->data, & info) < 0)
-            goto NEXT;
-
-        if (S_ISREG (info.st_mode))
-        {
-            char * item_name = filename_to_uri (files->data);
-            if (item_name)
-                add_file (item_name, NULL, NULL, filter, user, result, TRUE);
-        }
-        else if (S_ISDIR (info.st_mode))
-        {
-            char * item_name = filename_to_uri (files->data);
-            if (item_name)
-                add_folder (item_name, filter, user, result, FALSE);
-        }
-
-    NEXT:
-        str_unref (files->data);
-        files = g_list_delete_link (files, files);
-    }
-
-DONE:
-    str_unref (filename);
-    str_unref (path);
-}
-
-static void add_playlist (char * filename, PlaylistFilterFunc filter,
- void * user, AddResult * result, bool_t is_single)
-{
-    g_return_if_fail (filename);
-    if (filter && ! filter (filename, user))
-    {
-        str_unref (filename);
-        return;
-    }
-
-    status_update (filename, index_count (result->filenames));
-
-    char * title = NULL;
-    Index * filenames, * tuples;
-    if (! playlist_load (filename, & title, & filenames, & tuples))
-    {
-        str_unref (filename);
-        return;
-    }
-
-    if (is_single)
-        result->title = title;
-    else
-        str_unref (title);
-
-    int count = index_count (filenames);
-    for (int i = 0; i < count; i ++)
-        add_file (index_get (filenames, i), tuples ? index_get (tuples, i) :
-         NULL, NULL, filter, user, result, FALSE);
-
-    str_unref (filename);
-    index_free (filenames);
-    if (tuples)
-        index_free (tuples);
-}
-
-static void add_generic (char * filename, Tuple * tuple,
- PlaylistFilterFunc filter, void * user, AddResult * result, bool_t is_single)
-{
-    g_return_if_fail (filename);
-
-    if (tuple)
-        add_file (filename, tuple, NULL, filter, user, result, FALSE);
-    else if (vfs_file_test (filename, G_FILE_TEST_IS_DIR))
-        add_folder (filename, filter, user, result, is_single);
-    else if (filename_is_playlist (filename))
-        add_playlist (filename, filter, user, result, is_single);
-    else
-        add_file (filename, NULL, NULL, filter, user, result, FALSE);
-}
-
-static bool_t add_finish (void * unused)
-{
-    pthread_mutex_lock (& mutex);
-
-    while (add_results)
-    {
-        AddResult * result = add_results->data;
-        add_results = g_list_delete_link (add_results, add_results);
-
-        int playlist = playlist_by_unique_id (result->playlist_id);
-        if (playlist < 0) /* playlist deleted */
-            goto FREE;
-
-        int count = playlist_entry_count (playlist);
-        if (result->at < 0 || result->at > count)
-            result->at = count;
-
-        if (result->title && ! count)
-        {
-            char * old_title = playlist_get_title (playlist);
-
-            if (! strcmp (old_title, N_("New Playlist")))
-                playlist_set_title (playlist, result->title);
-
-            str_unref (old_title);
-        }
-
-        playlist_entry_insert_batch_raw (playlist, result->at,
-         result->filenames, result->tuples, result->decoders);
-        result->filenames = NULL;
-        result->tuples = NULL;
-        result->decoders = NULL;
-
-        if (result->play && playlist_entry_count (playlist) > count)
-        {
-            if (! get_bool (NULL, "shuffle"))
-                playlist_set_position (playlist, result->at);
-
-            drct_play_playlist (playlist);
-        }
-
-    FREE:
-        add_result_free (result);
-    }
-
-    if (add_source)
-    {
-        g_source_remove (add_source);
-        add_source = 0;
-    }
-
-    if (! add_tasks)
-        status_done_locked ();
-
-    pthread_mutex_unlock (& mutex);
-
-    hook_call ("playlist add complete", NULL);
-    return FALSE;
-}
-
-static void * add_worker (void * unused)
-{
-    pthread_mutex_lock (& mutex);
-
-    while (! add_quit)
-    {
-        if (! add_tasks)
-        {
-            pthread_cond_wait (& cond, & mutex);
-            continue;
-        }
-
-        AddTask * task = add_tasks->data;
-        add_tasks = g_list_delete_link (add_tasks, add_tasks);
-
-        current_playlist_id = task->playlist_id;
-        pthread_mutex_unlock (& mutex);
-
-        AddResult * result = add_result_new (task->playlist_id, task->at,
-         task->play);
-
-        int count = index_count (task->filenames);
-        if (task->tuples)
-            count = MIN (count, index_count (task->tuples));
-
-        for (int i = 0; i < count; i ++)
-        {
-            add_generic (index_get (task->filenames, i), task->tuples ?
-             index_get (task->tuples, i) : NULL, task->filter, task->user,
-             result, (count == 1));
-
-            index_set (task->filenames, i, NULL);
-            if (task->tuples)
-                index_set (task->tuples, i, NULL);
-        }
-
-        add_task_free (task);
-
-        pthread_mutex_lock (& mutex);
-        current_playlist_id = -1;
-
-        add_results = g_list_append (add_results, result);
-
-        if (! add_source)
-            add_source = g_timeout_add (0, add_finish, NULL);
-    }
-
-    pthread_mutex_unlock (& mutex);
-    return NULL;
-}
-
-void adder_init (void)
-{
-    pthread_mutex_lock (& mutex);
-    add_quit = FALSE;
-    pthread_create (& add_thread, NULL, add_worker, NULL);
-    pthread_mutex_unlock (& mutex);
-}
-
-void adder_cleanup (void)
-{
-    pthread_mutex_lock (& mutex);
-    add_quit = TRUE;
-    pthread_cond_broadcast (& cond);
-    pthread_mutex_unlock (& mutex);
-    pthread_join (add_thread, NULL);
-
-    g_list_free_full (add_tasks, (GDestroyNotify) add_task_free);
-    add_tasks = NULL;
-    g_list_free_full (add_results, (GDestroyNotify) add_result_free);
-    add_results = NULL;
-
-    if (add_source)
-    {
-        g_source_remove (add_source);
-        add_source = 0;
-    }
-
-    status_done_locked ();
-}
-
-void playlist_entry_insert (int playlist, int at, const char * filename,
- Tuple * tuple, bool_t play)
-{
-    Index * filenames = index_new ();
-    Index * tuples = index_new ();
-    index_insert (filenames, -1, str_get (filename));
-    index_insert (tuples, -1, tuple);
-
-    playlist_entry_insert_batch (playlist, at, filenames, tuples, play);
-}
-
-void playlist_entry_insert_batch (int playlist, int at,
- Index * filenames, Index * tuples, bool_t play)
-{
-    playlist_entry_insert_filtered (playlist, at, filenames, tuples, NULL, NULL, play);
-}
-
-void playlist_entry_insert_filtered (int playlist, int at,
- Index * filenames, Index * tuples, PlaylistFilterFunc filter,
- void * user, bool_t play)
-{
-    int playlist_id = playlist_get_unique_id (playlist);
-    g_return_if_fail (playlist_id >= 0);
-
-    AddTask * task = add_task_new (playlist_id, at, play, filenames, tuples, filter, user);
-
-    pthread_mutex_lock (& mutex);
-    add_tasks = g_list_append (add_tasks, task);
-    pthread_cond_broadcast (& cond);
-    pthread_mutex_unlock (& mutex);
-}
-
-bool_t playlist_add_in_progress (int playlist)
-{
-    pthread_mutex_lock (& mutex);
-
-    if (playlist >= 0)
-    {
-        int playlist_id = playlist_get_unique_id (playlist);
-
-        for (GList * node = add_tasks; node; node = node->next)
-        {
-            if (((AddTask *) node->data)->playlist_id == playlist_id)
-                goto YES;
-        }
-
-        if (current_playlist_id == playlist_id)
-            goto YES;
-
-        for (GList * node = add_results; node; node = node->next)
-        {
-            if (((AddResult *) node->data)->playlist_id == playlist_id)
-                goto YES;
-        }
-    }
-    else
-    {
-        if (add_tasks || current_playlist_id >= 0 || add_results)
-            goto YES;
-    }
-
-    pthread_mutex_unlock (& mutex);
-    return FALSE;
-
-YES:
-    pthread_mutex_unlock (& mutex);
-    return TRUE;
-}
diff --git a/src/audacious/api-alias-begin.h b/src/audacious/api-alias-begin.h
deleted file mode 100644
index 457d29d662b5..000000000000
--- a/src/audacious/api-alias-begin.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * api-alias-begin.h
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#if ! defined AUD_API_NAME || ! defined AUD_API_SYMBOL || defined AUD_API_ALIAS
-#error Bad usage of api-alias-begin.h
-#endif
-
-#define AUD_API_ALIAS
-
-extern AudAPITable * _aud_api_table;
-
-#define AUD_FUNC0(t,n) static inline t aud_##n(void) {return _aud_api_table->AUD_API_SYMBOL->n();}
-#define AUD_FUNC1(t,n,t1,n1) static inline t aud_##n(t1 n1) {return _aud_api_table->AUD_API_SYMBOL->n(n1);}
-#define AUD_FUNC2(t,n,t1,n1,t2,n2) static inline t aud_##n(t1 n1, t2 n2) {return _aud_api_table->AUD_API_SYMBOL->n(n1,n2);}
-#define AUD_FUNC3(t,n,t1,n1,t2,n2,t3,n3) static inline t aud_##n(t1 n1, t2 n2, t3 n3) {return _aud_api_table->AUD_API_SYMBOL->n(n1,n2,n3);}
-#define AUD_FUNC4(t,n,t1,n1,t2,n2,t3,n3,t4,n4) static inline t aud_##n(t1 n1, t2 n2, t3 n3, t4 n4) {return _aud_api_table->AUD_API_SYMBOL->n(n1,n2,n3,n4);}
-#define AUD_FUNC5(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5) static inline t aud_##n(t1 n1, t2 n2, t3 n3, t4 n4, t5 n5) {return _aud_api_table->AUD_API_SYMBOL->n(n1,n2,n3,n4,n5);}
-#define AUD_FUNC6(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6) static inline t aud_##n(t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6) {return _aud_api_table->AUD_API_SYMBOL->n(n1,n2,n3,n4,n5,n6);}
-#define AUD_FUNC7(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7) static inline t aud_##n(t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6, t7 n7) {return _aud_api_table->AUD_API_SYMBOL->n(n1,n2,n3,n4,n5,n6,n7);}
-#define AUD_FUNC8(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7,t8,n8) static inline t aud_##n(t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6, t7 n7, t8 n8) {return _aud_api_table->AUD_API_SYMBOL->n(n1,n2,n3,n4,n5,n6,n7,n8);}
-
-#define AUD_VFUNC0(n) static inline void aud_##n(void) {_aud_api_table->AUD_API_SYMBOL->n();}
-#define AUD_VFUNC1(n,t1,n1) static inline void aud_##n(t1 n1) {_aud_api_table->AUD_API_SYMBOL->n(n1);}
-#define AUD_VFUNC2(n,t1,n1,t2,n2) static inline void aud_##n(t1 n1, t2 n2) {_aud_api_table->AUD_API_SYMBOL->n(n1,n2);}
-#define AUD_VFUNC3(n,t1,n1,t2,n2,t3,n3) static inline void aud_##n(t1 n1, t2 n2, t3 n3) {_aud_api_table->AUD_API_SYMBOL->n(n1,n2,n3);}
-#define AUD_VFUNC4(n,t1,n1,t2,n2,t3,n3,t4,n4) static inline void aud_##n(t1 n1, t2 n2, t3 n3, t4 n4) {_aud_api_table->AUD_API_SYMBOL->n(n1,n2,n3,n4);}
-#define AUD_VFUNC5(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5) static inline void aud_##n(t1 n1, t2 n2, t3 n3, t4 n4, t5 n5) {_aud_api_table->AUD_API_SYMBOL->n(n1,n2,n3,n4,n5);}
-#define AUD_VFUNC6(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6) static inline void aud_##n(t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6) {_aud_api_table->AUD_API_SYMBOL->n(n1,n2,n3,n4,n5,n6);}
-#define AUD_VFUNC7(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7) static inline void aud_##n(t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6, t7 n7) {_aud_api_table->AUD_API_SYMBOL->n(n1,n2,n3,n4,n5,n6,n7);}
-#define AUD_VFUNC8(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7,t8,n8) static inline void aud_##n(t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6, t7 n7, t8 n8) {_aud_api_table->AUD_API_SYMBOL->n(n1,n2,n3,n4,n5,n6,n7,n8);}
diff --git a/src/audacious/api-alias-end.h b/src/audacious/api-alias-end.h
deleted file mode 100644
index a003cde2f373..000000000000
--- a/src/audacious/api-alias-end.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * api-alias-end.h
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#if ! defined AUD_API_NAME || ! defined AUD_API_SYMBOL || ! defined AUD_API_ALIAS
-#error Bad usage of api-alias-end.h
-#endif
-
-#undef AUD_API_ALIAS
-
-#undef AUD_FUNC0
-#undef AUD_FUNC1
-#undef AUD_FUNC2
-#undef AUD_FUNC3
-#undef AUD_FUNC4
-#undef AUD_FUNC5
-#undef AUD_FUNC6
-#undef AUD_FUNC7
-#undef AUD_FUNC8
-
-#undef AUD_VFUNC0
-#undef AUD_VFUNC1
-#undef AUD_VFUNC2
-#undef AUD_VFUNC3
-#undef AUD_VFUNC4
-#undef AUD_VFUNC5
-#undef AUD_VFUNC6
-#undef AUD_VFUNC7
-#undef AUD_VFUNC8
diff --git a/src/audacious/api-declare-begin.h b/src/audacious/api-declare-begin.h
deleted file mode 100644
index defc557ad172..000000000000
--- a/src/audacious/api-declare-begin.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * api-declare-begin.h
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#if ! defined AUD_API_NAME || ! defined AUD_API_SYMBOL || defined AUD_API_DECLARE_H
-#error Bad usage of api-declare-begin.h
-#endif
-
-#define AUD_API_DECLARE_H
-
-#define AUD_FUNC0(t,n) .n = n,
-#define AUD_FUNC1(t,n,t1,n1) .n = n,
-#define AUD_FUNC2(t,n,t1,n1,t2,n2) .n = n,
-#define AUD_FUNC3(t,n,t1,n1,t2,n2,t3,n3) .n = n,
-#define AUD_FUNC4(t,n,t1,n1,t2,n2,t3,n3,t4,n4) .n = n,
-#define AUD_FUNC5(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5) .n = n,
-#define AUD_FUNC6(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6) .n = n,
-#define AUD_FUNC7(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7) .n = n,
-#define AUD_FUNC8(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7,t8,n8) .n = n,
-
-#define AUD_VFUNC0(n) .n = n,
-#define AUD_VFUNC1(n,t1,n1) .n = n,
-#define AUD_VFUNC2(n,t1,n1,t2,n2) .n = n,
-#define AUD_VFUNC3(n,t1,n1,t2,n2,t3,n3) .n = n,
-#define AUD_VFUNC4(n,t1,n1,t2,n2,t3,n3,t4,n4) .n = n,
-#define AUD_VFUNC5(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5) .n = n,
-#define AUD_VFUNC6(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6) .n = n,
-#define AUD_VFUNC7(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7) .n = n,
-#define AUD_VFUNC8(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7,t8,n8) .n = n,
-
-const struct AUD_API_NAME AUD_API_SYMBOL = {
diff --git a/src/audacious/api-declare-end.h b/src/audacious/api-declare-end.h
deleted file mode 100644
index fa73092d8a34..000000000000
--- a/src/audacious/api-declare-end.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * api-declare-end.h
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#if ! defined AUD_API_NAME || ! defined AUD_API_SYMBOL || ! defined AUD_API_DECLARE_H
-#error Bad usage of api-declare-end.h
-#endif
-
-};
-
-#undef AUD_API_DECLARE_H
-
-#undef AUD_FUNC0
-#undef AUD_FUNC1
-#undef AUD_FUNC2
-#undef AUD_FUNC3
-#undef AUD_FUNC4
-#undef AUD_FUNC5
-#undef AUD_FUNC6
-#undef AUD_FUNC7
-#undef AUD_FUNC8
-
-#undef AUD_VFUNC0
-#undef AUD_VFUNC1
-#undef AUD_VFUNC2
-#undef AUD_VFUNC3
-#undef AUD_VFUNC4
-#undef AUD_VFUNC5
-#undef AUD_VFUNC6
-#undef AUD_VFUNC7
-#undef AUD_VFUNC8
diff --git a/src/audacious/api-define-begin.h b/src/audacious/api-define-begin.h
deleted file mode 100644
index 5fe32cdd5dc0..000000000000
--- a/src/audacious/api-define-begin.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * api-define-begin.h
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#if ! defined AUD_API_NAME || ! defined AUD_API_SYMBOL || defined AUD_API_DEFINE_H
-#error Bad usage of api-define-begin.h
-#endif
-
-#define AUD_API_DEFINE_H
-
-#define AUD_FUNC0(t,n) t (* n) (void);
-#define AUD_FUNC1(t,n,t1,n1) t (* n) (t1 n1);
-#define AUD_FUNC2(t,n,t1,n1,t2,n2) t (* n) (t1 n1, t2 n2);
-#define AUD_FUNC3(t,n,t1,n1,t2,n2,t3,n3) t (* n) (t1 n1, t2 n2, t3 n3);
-#define AUD_FUNC4(t,n,t1,n1,t2,n2,t3,n3,t4,n4) t (* n) (t1 n1, t2 n2, t3 n3, t4 n4);
-#define AUD_FUNC5(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5) t (* n) (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5);
-#define AUD_FUNC6(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6) t (* n) (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6);
-#define AUD_FUNC7(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7) t (* n) (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6, t7 n7);
-#define AUD_FUNC8(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7,t8,n8) t (* n) (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6, t7 n7, t8 n8);
-
-#define AUD_VFUNC0(n) void (* n) (void);
-#define AUD_VFUNC1(n,t1,n1) void (* n) (t1 n1);
-#define AUD_VFUNC2(n,t1,n1,t2,n2) void (* n) (t1 n1, t2 n2);
-#define AUD_VFUNC3(n,t1,n1,t2,n2,t3,n3) void (* n) (t1 n1, t2 n2, t3 n3);
-#define AUD_VFUNC4(n,t1,n1,t2,n2,t3,n3,t4,n4) void (* n) (t1 n1, t2 n2, t3 n3, t4 n4);
-#define AUD_VFUNC5(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5) void (* n) (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5);
-#define AUD_VFUNC6(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6) void (* n) (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6);
-#define AUD_VFUNC7(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7) void (* n) (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6, t7 n7);
-#define AUD_VFUNC8(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7,t8,n8) void (* n) (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6, t7 n7, t8 n8);
-
-struct AUD_API_NAME {
diff --git a/src/audacious/api-define-end.h b/src/audacious/api-define-end.h
deleted file mode 100644
index 91bd85f8731f..000000000000
--- a/src/audacious/api-define-end.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * api-define-end.h
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#if ! defined AUD_API_NAME || ! defined AUD_API_SYMBOL || ! defined AUD_API_DEFINE_H
-#error Bad usage of api-define-end.h
-#endif
-
-};
-
-#undef AUD_API_DEFINE_H
-
-#undef AUD_FUNC0
-#undef AUD_FUNC1
-#undef AUD_FUNC2
-#undef AUD_FUNC3
-#undef AUD_FUNC4
-#undef AUD_FUNC5
-#undef AUD_FUNC6
-#undef AUD_FUNC7
-#undef AUD_FUNC8
-
-#undef AUD_VFUNC0
-#undef AUD_VFUNC1
-#undef AUD_VFUNC2
-#undef AUD_VFUNC3
-#undef AUD_VFUNC4
-#undef AUD_VFUNC5
-#undef AUD_VFUNC6
-#undef AUD_VFUNC7
-#undef AUD_VFUNC8
diff --git a/src/audacious/api-local-begin.h b/src/audacious/api-local-begin.h
deleted file mode 100644
index b32eeb1c84b2..000000000000
--- a/src/audacious/api-local-begin.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * api-local-begin.h
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#if ! defined AUD_API_NAME || ! defined AUD_API_SYMBOL || defined AUD_API_LOCAL_H
-#error Bad usage of api-local-begin.h
-#endif
-
-#define AUD_API_LOCAL_H
-
-#define AUD_FUNC0(t,n) t n (void);
-#define AUD_FUNC1(t,n,t1,n1) t n (t1 n1);
-#define AUD_FUNC2(t,n,t1,n1,t2,n2) t n (t1 n1, t2 n2);
-#define AUD_FUNC3(t,n,t1,n1,t2,n2,t3,n3) t n (t1 n1, t2 n2, t3 n3);
-#define AUD_FUNC4(t,n,t1,n1,t2,n2,t3,n3,t4,n4) t n (t1 n1, t2 n2, t3 n3, t4 n4);
-#define AUD_FUNC5(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5) t n (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5);
-#define AUD_FUNC6(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6) t n (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6);
-#define AUD_FUNC7(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7) t n (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6, t7 n7);
-#define AUD_FUNC8(t,n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7,t8,n8) t n (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6, t7 n7, t8 n8);
-
-#define AUD_VFUNC0(n) void n (void);
-#define AUD_VFUNC1(n,t1,n1) void n (t1 n1);
-#define AUD_VFUNC2(n,t1,n1,t2,n2) void n (t1 n1, t2 n2);
-#define AUD_VFUNC3(n,t1,n1,t2,n2,t3,n3) void n (t1 n1, t2 n2, t3 n3);
-#define AUD_VFUNC4(n,t1,n1,t2,n2,t3,n3,t4,n4) void n (t1 n1, t2 n2, t3 n3, t4 n4);
-#define AUD_VFUNC5(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5) void n (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5);
-#define AUD_VFUNC6(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6) void n (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6);
-#define AUD_VFUNC7(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7) void n (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6, t7 n7);
-#define AUD_VFUNC8(n,t1,n1,t2,n2,t3,n3,t4,n4,t5,n5,t6,n6,t7,n7,t8,n8) void n (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, t6 n6, t7 n7, t8 n8);
diff --git a/src/audacious/api-local-end.h b/src/audacious/api-local-end.h
deleted file mode 100644
index 81ec43d3feb4..000000000000
--- a/src/audacious/api-local-end.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * api-local-end.h
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#if ! defined AUD_API_NAME || ! defined AUD_API_SYMBOL || ! defined AUD_API_LOCAL_H
-#error Bad usage of api-local-end.h
-#endif
-
-#undef AUD_API_LOCAL_H
-
-#undef AUD_FUNC0
-#undef AUD_FUNC1
-#undef AUD_FUNC2
-#undef AUD_FUNC3
-#undef AUD_FUNC4
-#undef AUD_FUNC5
-#undef AUD_FUNC6
-#undef AUD_FUNC7
-#undef AUD_FUNC8
-
-#undef AUD_VFUNC0
-#undef AUD_VFUNC1
-#undef AUD_VFUNC2
-#undef AUD_VFUNC3
-#undef AUD_VFUNC4
-#undef AUD_VFUNC5
-#undef AUD_VFUNC6
-#undef AUD_VFUNC7
-#undef AUD_VFUNC8
diff --git a/src/audacious/api.h b/src/audacious/api.h
deleted file mode 100644
index f68987a11c94..000000000000
--- a/src/audacious/api.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * api.h
- * Copyright 2010-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_API_H
-#define AUDACIOUS_API_H
-
-/* API version.  Plugins are marked with this number at compile time.
- *
- * _AUD_PLUGIN_VERSION is the current version; _AUD_PLUGIN_VERSION_MIN is
- * the oldest one we are backward compatible with.  Plugins marked older than
- * _AUD_PLUGIN_VERSION_MIN or newer than _AUD_PLUGIN_VERSION are not loaded.
- *
- * Before releases that add new pointers to the end of the API tables, increment
- * _AUD_PLUGIN_VERSION but leave _AUD_PLUGIN_VERSION_MIN the same.
- *
- * Before releases that break backward compatibility (e.g. remove pointers from
- * the API tables), increment _AUD_PLUGIN_VERSION *and* set
- * _AUD_PLUGIN_VERSION_MIN to the same value. */
-
-#define _AUD_PLUGIN_VERSION_MIN 45 /* 3.5-devel */
-#define _AUD_PLUGIN_VERSION     45 /* 3.5-devel */
-
-typedef const struct {
-    const struct ConfigDBAPI * configdb_api;
-    const struct DRCTAPI * drct_api;
-    const struct InputAPI * input_api;
-    const struct MiscAPI * misc_api;
-    const struct PlaylistAPI * playlist_api;
-    const struct PluginsAPI * plugins_api;
-    char * verbose;
-} AudAPITable;
-
-#ifdef _AUDACIOUS_CORE
-extern char verbose;
-#else
-extern AudAPITable * _aud_api_table;
-#endif
-
-#endif
diff --git a/src/audacious/art.c b/src/audacious/art.c
deleted file mode 100644
index 24658a06b5c7..000000000000
--- a/src/audacious/art.c
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * art.c
- * Copyright 2011-2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <assert.h>
-#include <errno.h>
-#include <pthread.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <glib.h>
-#include <glib/gstdio.h>
-
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-
-#include "main.h"
-#include "misc.h"
-#include "playlist.h"
-#include "scanner.h"
-#include "util.h"
-
-#define FLAG_DONE 1
-#define FLAG_SENT 2
-
-typedef struct {
-    int refcount;
-    int flag;
-
-    /* album art as JPEG or PNG data */
-    void * data;
-    int64_t len;
-
-    /* album art as (possibly a temporary) file */
-    char * art_file; /* pooled */
-    bool_t is_temp;
-} ArtItem;
-
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-
-static GHashTable * art_items; /* of ArtItem */
-static char * current_ref; /* pooled */
-static int send_source;
-
-static void art_item_free (ArtItem * item)
-{
-    /* delete temporary file */
-    if (item->art_file && item->is_temp)
-    {
-        char * unixname = uri_to_filename (item->art_file);
-        if (unixname)
-        {
-            g_unlink (unixname);
-            str_unref (unixname);
-        }
-    }
-
-    g_free (item->data);
-    str_unref (item->art_file);
-    g_slice_free (ArtItem, item);
-}
-
-static bool_t send_requests (void * unused)
-{
-    pthread_mutex_lock (& mutex);
-
-    GQueue queue = G_QUEUE_INIT;
-
-    GHashTableIter iter;
-    void * ptr1, * ptr2;
-
-    g_hash_table_iter_init (& iter, art_items);
-    while (g_hash_table_iter_next (& iter, & ptr1, & ptr2))
-    {
-        char * file = ptr1;
-        ArtItem * item = ptr2;
-
-        if (item->flag == FLAG_DONE)
-        {
-            g_queue_push_tail (& queue, str_ref (file));
-            item->flag = FLAG_SENT;
-        }
-    }
-
-    if (send_source)
-    {
-        g_source_remove (send_source);
-        send_source = 0;
-    }
-
-    pthread_mutex_unlock (& mutex);
-
-    char * current = NULL;
-    if (! current_ref)
-        current = playback_entry_get_filename ();
-
-    char * file;
-    while ((file = g_queue_pop_head (& queue)))
-    {
-        hook_call ("art ready", file);
-
-        if (current && ! strcmp (file, current))
-        {
-            hook_call ("current art ready", file);
-            current_ref = file;
-        }
-        else
-        {
-            art_unref (file); /* release temporary reference */
-            str_unref (file);
-        }
-    }
-
-    str_unref (current);
-    return FALSE;
-}
-
-static void request_callback (ScanRequest * request)
-{
-    pthread_mutex_lock (& mutex);
-
-    const char * file = scan_request_get_filename (request);
-    ArtItem * item = g_hash_table_lookup (art_items, file);
-    assert (item != NULL && ! item->flag);
-
-    scan_request_get_image_data (request, & item->data, & item->len);
-    item->art_file = str_get (scan_request_get_image_file (request));
-    item->flag = FLAG_DONE;
-
-    if (! send_source)
-        send_source = g_idle_add (send_requests, NULL);
-
-    pthread_mutex_unlock (& mutex);
-}
-
-static ArtItem * art_item_get (const char * file)
-{
-    ArtItem * item = g_hash_table_lookup (art_items, file);
-
-    if (item && item->flag)
-    {
-        item->refcount ++;
-        return item;
-    }
-
-    if (! item)
-    {
-        item = g_slice_new0 (ArtItem);
-        g_hash_table_insert (art_items, str_get (file), item);
-        item->refcount = 1; /* temporary reference */
-
-        scan_request (file, SCAN_IMAGE, NULL, request_callback);
-    }
-
-    return NULL;
-}
-
-static void art_item_unref (const char * file, ArtItem * item)
-{
-    if (! -- item->refcount)
-        g_hash_table_remove (art_items, file);
-}
-
-static void release_current (void)
-{
-    if (current_ref)
-    {
-        art_unref (current_ref);
-        str_unref (current_ref);
-        current_ref = NULL;
-    }
-}
-
-void art_init (void)
-{
-    art_items = g_hash_table_new_full (g_str_hash, g_str_equal,
-     (GDestroyNotify) str_unref, (GDestroyNotify) art_item_free);
-
-    hook_associate ("playlist position", (HookFunction) release_current, NULL);
-    hook_associate ("playlist set playing", (HookFunction) release_current, NULL);
-}
-
-void art_cleanup (void)
-{
-    hook_dissociate ("playlist position", (HookFunction) release_current);
-    hook_dissociate ("playlist set playing", (HookFunction) release_current);
-
-    if (send_source)
-    {
-        g_source_remove (send_source);
-        send_source = 0;
-    }
-
-    release_current ();
-
-    g_hash_table_destroy (art_items);
-    art_items = NULL;
-}
-
-void art_request_data (const char * file, const void * * data, int64_t * len)
-{
-    * data = NULL;
-    * len = 0;
-
-    pthread_mutex_lock (& mutex);
-
-    ArtItem * item = art_item_get (file);
-    if (! item)
-        goto UNLOCK;
-
-    /* load data from external image file */
-    if (! item->data && item->art_file)
-        vfs_file_get_contents (item->art_file, & item->data, & item->len);
-
-    if (item->data)
-    {
-        * data = item->data;
-        * len = item->len;
-    }
-    else
-        art_item_unref (file, item);
-
-UNLOCK:
-    pthread_mutex_unlock (& mutex);
-}
-
-const char * art_request_file (const char * file)
-{
-    const char * art_file = NULL;
-    pthread_mutex_lock (& mutex);
-
-    ArtItem * item = art_item_get (file);
-    if (! item)
-        goto UNLOCK;
-
-    /* save data to temporary file */
-    if (item->data && ! item->art_file)
-    {
-        char * unixname = write_temp_file (item->data, item->len);
-        if (unixname)
-        {
-            item->art_file = filename_to_uri (unixname);
-            item->is_temp = TRUE;
-            str_unref (unixname);
-        }
-    }
-
-    if (item->art_file)
-        art_file = item->art_file;
-    else
-        art_item_unref (file, item);
-
-UNLOCK:
-    pthread_mutex_unlock (& mutex);
-    return art_file;
-}
-
-void art_unref (const char * file)
-{
-    pthread_mutex_lock (& mutex);
-
-    ArtItem * item = g_hash_table_lookup (art_items, file);
-    assert (item != NULL);
-
-    art_item_unref (file, item);
-
-    pthread_mutex_unlock (& mutex);
-}
diff --git a/src/audacious/audacious.rc b/src/audacious/audacious.rc
index b37beebd9151..c7b9839040f2 100644
--- a/src/audacious/audacious.rc
+++ b/src/audacious/audacious.rc
@@ -4,4 +4,4 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
 
 #define IDI_ICON_AUDACIOUS 102
 
-IDI_ICON_AUDACIOUS ICON "../../pixmaps/audacious.ico"
+IDI_ICON_AUDACIOUS ICON "../../images/audacious.ico"
diff --git a/src/audacious/chardet.c b/src/audacious/chardet.c
deleted file mode 100644
index 08fe97efcd41..000000000000
--- a/src/audacious/chardet.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * chardet.c
- * Copyright 2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-
-#include "main.h"
-#include "misc.h"
-
-static void chardet_update (void)
-{
-    char * region = get_str (NULL, "chardet_detector");
-    char * fallbacks = get_str (NULL, "chardet_fallback");
-
-    Index * list = str_list_to_index (fallbacks, ", ");
-    str_set_charsets (region[0] ? region : NULL, list);
-
-    str_unref (region);
-    str_unref (fallbacks);
-}
-
-void chardet_init (void)
-{
-    chardet_update ();
-
-    hook_associate ("set chardet_detector", (HookFunction) chardet_update, NULL);
-    hook_associate ("set chardet_fallback", (HookFunction) chardet_update, NULL);
-}
-
-void chardet_cleanup (void)
-{
-    hook_dissociate ("set chardet_detector", (HookFunction) chardet_update);
-    hook_dissociate ("set chardet_fallback", (HookFunction) chardet_update);
-
-    str_set_charsets (NULL, NULL);
-}
diff --git a/src/audacious/config.c b/src/audacious/config.c
deleted file mode 100644
index 0bc49660ddc1..000000000000
--- a/src/audacious/config.c
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * config.c
- * Copyright 2011-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <string.h>
-
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-#include <libaudcore/inifile.h>
-#include <libaudcore/multihash.h>
-
-#include "main.h"
-#include "misc.h"
-
-#define DEFAULT_SECTION "audacious"
-
-static const char * const core_defaults[] = {
-
- /* general */
- "advance_on_delete", "FALSE",
- "clear_playlist", "TRUE",
- "open_to_temporary", "TRUE",
- "resume_playback_on_startup", "FALSE",
- "show_interface", "TRUE",
-
- /* equalizer */
- "eqpreset_default_file", "",
- "eqpreset_extension", "",
- "equalizer_active", "FALSE",
- "equalizer_autoload", "FALSE",
- "equalizer_bands", "0,0,0,0,0,0,0,0,0,0",
- "equalizer_preamp", "0",
-
- /* info popup / info window */
- "cover_name_exclude", "back",
- "cover_name_include", "album,cover,front,folder",
- "filepopup_delay", "5",
- "filepopup_showprogressbar", "TRUE",
- "recurse_for_cover", "FALSE",
- "recurse_for_cover_depth", "0",
- "show_filepopup_for_tuple", "TRUE",
- "use_file_cover", "FALSE",
-
- /* network */
- "use_proxy", "FALSE",
- "use_proxy_auth", "FALSE",
-
- /* output */
- "default_gain", "0",
- "enable_replay_gain", "TRUE",
- "enable_clipping_prevention", "TRUE",
- "output_bit_depth", "16",
- "output_buffer_size", "500",
- "replay_gain_album", "FALSE",
- "replay_gain_preamp", "0",
- "soft_clipping", "FALSE",
- "software_volume_control", "FALSE",
- "sw_volume_left", "100",
- "sw_volume_right", "100",
-
- /* playback */
- "no_playlist_advance", "FALSE",
- "repeat", "FALSE",
- "shuffle", "FALSE",
- "stop_after_current_song", "FALSE",
-
- /* playlist */
- "chardet_fallback", "ISO-8859-1",
-#ifdef _WIN32
- "convert_backslash", "TRUE",
-#else
- "convert_backslash", "FALSE",
-#endif
- "generic_title_format", "${?artist:${artist} - }${?album:${album} - }${title}",
- "leading_zero", "FALSE",
- "metadata_on_play", "FALSE",
- "show_numbers_in_pl", "FALSE",
-
- NULL};
-
-typedef enum {
-    OP_IS_DEFAULT,
-    OP_GET,
-    OP_SET,
-    OP_SET_NO_FLAG,
-    OP_CLEAR,
-    OP_CLEAR_NO_FLAG
-} OpType;
-
-typedef struct {
-    const char * section;
-    const char * key;
-    const char * value;
-} ConfigItem;
-
-typedef struct {
-    MultihashNode node;
-    ConfigItem item;
-} ConfigNode;
-
-typedef struct {
-    OpType type;
-    ConfigItem item;
-    unsigned hash;
-    bool_t result;
-} ConfigOp;
-
-typedef struct {
-    char * section;
-} LoadState;
-
-typedef struct {
-    GArray * list;
-} SaveState;
-
-static unsigned item_hash (const ConfigItem * item)
-{
-    return g_str_hash (item->section) + g_str_hash (item->key);
-}
-
-/* assumes pooled strings */
-static int item_compare (const ConfigItem * a, const ConfigItem * b)
-{
-    if (str_equal (a->section, b->section))
-        return strcmp (a->key, b->key);
-    else
-        return strcmp (a->section, b->section);
-}
-
-/* assumes pooled strings */
-static void item_clear (ConfigItem * item)
-{
-    str_unref ((char *) item->section);
-    str_unref ((char *) item->key);
-    str_unref ((char *) item->value);
-}
-
-static unsigned config_node_hash (const MultihashNode * node0)
-{
-    const ConfigNode * node = (const ConfigNode *) node0;
-
-    return item_hash (& node->item);
-}
-
-static bool_t config_node_match (const MultihashNode * node0, const void * data, unsigned hash)
-{
-    const ConfigNode * node = (const ConfigNode *) node0;
-    const ConfigItem * item = data;
-
-    return ! strcmp (node->item.section, item->section) && ! strcmp (node->item.key, item->key);
-}
-
-static MultihashTable defaults = {
-    .hash_func = config_node_hash,
-    .match_func = config_node_match
-};
-
-static MultihashTable config = {
-    .hash_func = config_node_hash,
-    .match_func = config_node_match
-};
-
-static volatile bool_t modified;
-
-static MultihashNode * add_cb (const void * data, unsigned hash, void * state)
-{
-    ConfigOp * op = state;
-
-    switch (op->type)
-    {
-    case OP_IS_DEFAULT:
-        op->result = ! op->item.value[0]; /* empty string is default */
-        return NULL;
-
-    case OP_SET:
-        op->result = TRUE;
-        modified = TRUE;
-
-    case OP_SET_NO_FLAG:;
-        ConfigNode * node = g_slice_new (ConfigNode);
-        node->item.section = str_get (op->item.section);
-        node->item.key = str_get (op->item.key);
-        node->item.value = str_get (op->item.value);
-        return (MultihashNode *) node;
-
-    default:
-        return NULL;
-    }
-}
-
-static bool_t action_cb (MultihashNode * node0, void * state)
-{
-    ConfigNode * node = (ConfigNode *) node0;
-    ConfigOp * op = state;
-
-    switch (op->type)
-    {
-    case OP_IS_DEFAULT:
-        op->result = ! strcmp (node->item.value, op->item.value);
-        return FALSE;
-
-    case OP_GET:
-        op->item.value = str_ref (node->item.value);
-        return FALSE;
-
-    case OP_SET:
-        op->result = !! strcmp (node->item.value, op->item.value);
-        if (op->result)
-            modified = TRUE;
-
-    case OP_SET_NO_FLAG:
-        str_unref ((char *) node->item.value);
-        node->item.value = str_get (op->item.value);
-        return FALSE;
-
-    case OP_CLEAR:
-        op->result = TRUE;
-        modified = TRUE;
-
-    case OP_CLEAR_NO_FLAG:
-        item_clear (& node->item);
-        g_slice_free (ConfigNode, node);
-        return TRUE;
-
-    default:
-        return FALSE;
-    }
-}
-
-static bool_t config_op_run (ConfigOp * op, OpType type, MultihashTable * table)
-{
-    if (! op->hash)
-        op->hash = item_hash (& op->item);
-
-    op->type = type;
-    op->result = FALSE;
-    multihash_lookup (table, & op->item, op->hash, add_cb, action_cb, op);
-    return op->result;
-}
-
-static void load_heading (const char * section, void * data)
-{
-    LoadState * state = data;
-
-    str_unref (state->section);
-    state->section = str_get (section);
-}
-
-static void load_entry (const char * key, const char * value, void * data)
-{
-    LoadState * state = data;
-    g_return_if_fail (state->section);
-
-    ConfigOp op = {.item = {state->section, key, value}};
-    config_op_run (& op, OP_SET_NO_FLAG, & config);
-}
-
-void config_load (void)
-{
-    char * folder = filename_to_uri (get_path (AUD_PATH_USER_DIR));
-    SCONCAT2 (path, folder, "/config");
-    str_unref (folder);
-
-    if (vfs_file_test (path, VFS_EXISTS))
-    {
-        VFSFile * file = vfs_fopen (path, "r");
-
-        if (file)
-        {
-            LoadState state = {0};
-
-            inifile_parse (file, load_heading, load_entry, & state);
-
-            str_unref (state.section);
-            vfs_fclose (file);
-        }
-    }
-
-    config_set_defaults (NULL, core_defaults);
-}
-
-static bool_t add_to_save_list (MultihashNode * node0, void * state0)
-{
-    ConfigNode * node = (ConfigNode *) node0;
-    SaveState * state = state0;
-
-    int pos = state->list->len;
-    g_array_set_size (state->list, pos + 1);
-
-    ConfigItem * copy = & g_array_index (state->list, ConfigItem, pos);
-    copy->section = str_ref (node->item.section);
-    copy->key = str_ref (node->item.key);
-    copy->value = str_ref (node->item.value);
-
-    modified = FALSE;
-
-    return FALSE;
-}
-
-void config_save (void)
-{
-    if (! modified)
-        return;
-
-    SaveState state = {.list = g_array_new (FALSE, FALSE, sizeof (ConfigItem))};
-
-    multihash_iterate (& config, add_to_save_list, & state);
-    g_array_sort (state.list, (GCompareFunc) item_compare);
-
-    char * folder = filename_to_uri (get_path (AUD_PATH_USER_DIR));
-    SCONCAT2 (path, folder, "/config");
-    str_unref (folder);
-
-    VFSFile * file = vfs_fopen (path, "w");
-
-    if (file)
-    {
-        const char * current_heading = NULL;
-
-        for (int i = 0; i < state.list->len; i ++)
-        {
-            ConfigItem * item = & g_array_index (state.list, ConfigItem, i);
-
-            if (! str_equal (item->section, current_heading))
-            {
-                inifile_write_heading (file, item->section);
-                current_heading = item->section;
-            }
-
-            inifile_write_entry (file, item->key, item->value);
-        }
-
-        vfs_fclose (file);
-    }
-
-    g_array_set_clear_func (state.list, (GDestroyNotify) item_clear);
-    g_array_free (state.list, TRUE);
-}
-
-void config_set_defaults (const char * section, const char * const * entries)
-{
-    if (! section)
-        section = DEFAULT_SECTION;
-
-    while (1)
-    {
-        const char * name = * entries ++;
-        const char * value = * entries ++;
-        if (! name || ! value)
-            break;
-
-        ConfigOp op = {.item = {section, name, value}};
-        config_op_run (& op, OP_SET_NO_FLAG, & defaults);
-    }
-}
-
-void config_cleanup (void)
-{
-    ConfigOp op = {.type = OP_CLEAR_NO_FLAG};
-    multihash_iterate (& config, action_cb, & op);
-    multihash_iterate (& defaults, action_cb, & op);
-}
-
-void set_str (const char * section, const char * name, const char * value)
-{
-    g_return_if_fail (name && value);
-
-    ConfigOp op = {.item = {section ? section : DEFAULT_SECTION, name, value}};
-
-    bool_t is_default = config_op_run (& op, OP_IS_DEFAULT, & defaults);
-    bool_t changed = config_op_run (& op, is_default ? OP_CLEAR : OP_SET, & config);
-
-    if (changed && ! section)
-    {
-        SCONCAT2 (event, "set ", name);
-        event_queue (event, NULL);
-    }
-}
-
-char * get_str (const char * section, const char * name)
-{
-    g_return_val_if_fail (name, NULL);
-
-    ConfigOp op = {.item = {section ? section : DEFAULT_SECTION, name, NULL}};
-
-    config_op_run (& op, OP_GET, & config);
-
-    if (! op.item.value)
-        config_op_run (& op, OP_GET, & defaults);
-
-    return op.item.value ? (char *) op.item.value : str_get ("");
-}
-
-void set_bool (const char * section, const char * name, bool_t value)
-{
-    set_str (section, name, value ? "TRUE" : "FALSE");
-}
-
-bool_t get_bool (const char * section, const char * name)
-{
-    char * string = get_str (section, name);
-    bool_t value = ! strcmp (string, "TRUE");
-    str_unref (string);
-    return value;
-}
-
-void set_int (const char * section, const char * name, int value)
-{
-    char * string = int_to_str (value);
-    g_return_if_fail (string);
-    set_str (section, name, string);
-    str_unref (string);
-}
-
-int get_int (const char * section, const char * name)
-{
-    char * string = get_str (section, name);
-    int value = str_to_int (string);
-    str_unref (string);
-    return value;
-}
-
-void set_double (const char * section, const char * name, double value)
-{
-    char * string = double_to_str (value);
-    g_return_if_fail (string);
-    set_str (section, name, string);
-    str_unref (string);
-}
-
-double get_double (const char * section, const char * name)
-{
-    char * string = get_str (section, name);
-    double value = str_to_double (string);
-    str_unref (string);
-    return value;
-}
diff --git a/src/audacious/dbus-server.c b/src/audacious/dbus-server.c
deleted file mode 100644
index af55f201bdcf..000000000000
--- a/src/audacious/dbus-server.c
+++ /dev/null
@@ -1,779 +0,0 @@
-/*
- * dbus-server.c
- * Copyright 2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <stdio.h>
-
-#include <libaudgui/libaudgui.h>
-
-#include "aud-dbus.h"
-#include "drct.h"
-#include "main.h"
-#include "misc.h"
-#include "playlist.h"
-#include "ui_preferences.h"
-
-typedef ObjAudacious Obj;
-typedef GDBusMethodInvocation Invoc;
-
-#define FINISH(name) \
- obj_audacious_complete_##name (obj, invoc)
-
-#define FINISH2(name, ...) \
- obj_audacious_complete_##name (obj, invoc, __VA_ARGS__)
-
-static Index * strv_to_index (const char * const * strv)
-{
-    Index * index = index_new ();
-    while (* strv)
-        index_insert (index, -1, str_get (* strv ++));
-
-    return index;
-}
-
-static bool_t do_add (Obj * obj, Invoc * invoc, const char * file)
-{
-    playlist_entry_insert (playlist_get_active (), -1, file, NULL, FALSE);
-    FINISH (add);
-    return TRUE;
-}
-
-static bool_t do_add_list (Obj * obj, Invoc * invoc, const char * const * filenames)
-{
-    playlist_entry_insert_batch (playlist_get_active (), -1,
-     strv_to_index (filenames), NULL, FALSE);
-    FINISH (add_list);
-    return TRUE;
-}
-
-static bool_t do_add_url (Obj * obj, Invoc * invoc, const char * url)
-{
-    playlist_entry_insert (playlist_get_active (), -1, url, NULL, FALSE);
-    FINISH (add_url);
-    return TRUE;
-}
-
-static bool_t do_advance (Obj * obj, Invoc * invoc)
-{
-    drct_pl_next ();
-    FINISH (advance);
-    return TRUE;
-}
-
-static bool_t do_auto_advance (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (auto_advance, ! get_bool (NULL, "no_playlist_advance"));
-    return TRUE;
-}
-
-static bool_t do_balance (Obj * obj, Invoc * invoc)
-{
-    int balance;
-    drct_get_volume_balance (& balance);
-    FINISH2 (balance, balance);
-    return TRUE;
-}
-
-static bool_t do_clear (Obj * obj, Invoc * invoc)
-{
-    int playlist = playlist_get_active ();
-    playlist_entry_delete (playlist, 0, playlist_entry_count (playlist));
-    FINISH (clear);
-    return TRUE;
-}
-
-static bool_t do_delete (Obj * obj, Invoc * invoc, unsigned pos)
-{
-    playlist_entry_delete (playlist_get_active (), pos, 1);
-    FINISH (delete);
-    return TRUE;
-}
-
-static bool_t do_delete_active_playlist (Obj * obj, Invoc * invoc)
-{
-    playlist_delete (playlist_get_active ());
-    FINISH (delete_active_playlist);
-    return TRUE;
-}
-
-static bool_t do_eject (Obj * obj, Invoc * invoc)
-{
-    if (! headless_mode ())
-        audgui_run_filebrowser (TRUE);
-
-    FINISH (eject);
-    return TRUE;
-}
-
-static bool_t do_equalizer_activate (Obj * obj, Invoc * invoc, bool_t active)
-{
-    set_bool (NULL, "equalizer_active", active);
-    FINISH (equalizer_activate);
-    return TRUE;
-}
-
-static bool_t do_get_active_playlist (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (get_active_playlist, playlist_get_active ());
-    return TRUE;
-}
-
-static bool_t do_get_active_playlist_name (Obj * obj, Invoc * invoc)
-{
-    char * title = playlist_get_title (playlist_get_active ());
-    FINISH2 (get_active_playlist_name, title ? title : "");
-    str_unref (title);
-    return TRUE;
-}
-
-static bool_t do_get_eq (Obj * obj, Invoc * invoc)
-{
-    double preamp = get_double (NULL, "equalizer_preamp");
-    double bands[AUD_EQUALIZER_NBANDS];
-    eq_get_bands (bands);
-
-    GVariant * var = g_variant_new_fixed_array (G_VARIANT_TYPE_DOUBLE, bands,
-     AUD_EQUALIZER_NBANDS, sizeof (double));
-    FINISH2 (get_eq, preamp, var);
-    return TRUE;
-}
-
-static bool_t do_get_eq_band (Obj * obj, Invoc * invoc, int band)
-{
-    FINISH2 (get_eq_band, eq_get_band (band));
-    return TRUE;
-}
-
-static bool_t do_get_eq_preamp (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (get_eq_preamp, get_double (NULL, "equalizer_preamp"));
-    return TRUE;
-}
-
-static bool_t do_get_info (Obj * obj, Invoc * invoc)
-{
-    int bitrate, samplerate, channels;
-    drct_get_info (& bitrate, & samplerate, & channels);
-    FINISH2 (get_info, bitrate, samplerate, channels);
-    return TRUE;
-}
-
-static bool_t do_get_playqueue_length (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (get_playqueue_length, playlist_queue_count (playlist_get_active ()));
-    return TRUE;
-}
-
-static bool_t do_get_tuple_fields (Obj * obj, Invoc * invoc)
-{
-    const char * fields[TUPLE_FIELDS + 1];
-
-    for (int i = 0; i < TUPLE_FIELDS; i ++)
-        fields[i] = tuple_field_get_name (i);
-
-    fields[TUPLE_FIELDS] = NULL;
-
-    FINISH2 (get_tuple_fields, fields);
-    return TRUE;
-}
-
-static bool_t do_info (Obj * obj, Invoc * invoc)
-{
-    int bitrate, samplerate, channels;
-    drct_get_info (& bitrate, & samplerate, & channels);
-    FINISH2 (info, bitrate, samplerate, channels);
-    return TRUE;
-}
-
-static bool_t do_jump (Obj * obj, Invoc * invoc, unsigned pos)
-{
-    playlist_set_position (playlist_get_active (), pos);
-    FINISH (jump);
-    return TRUE;
-}
-
-static bool_t do_length (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (length, playlist_entry_count (playlist_get_active ()));
-    return TRUE;
-}
-
-static bool_t do_main_win_visible (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (main_win_visible, ! headless_mode () && interface_is_shown ());
-    return TRUE;
-}
-
-static bool_t do_new_playlist (Obj * obj, Invoc * invoc)
-{
-    playlist_insert (-1);
-    playlist_set_active (playlist_count () - 1);
-    FINISH (new_playlist);
-    return TRUE;
-}
-
-static bool_t do_number_of_playlists (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (number_of_playlists, playlist_count ());
-    return TRUE;
-}
-
-static bool_t do_open_list (Obj * obj, Invoc * invoc, const char * const * filenames)
-{
-    drct_pl_open_list (strv_to_index (filenames));
-    FINISH (open_list);
-    return TRUE;
-}
-
-static bool_t do_open_list_to_temp (Obj * obj, Invoc * invoc, const char * const * filenames)
-{
-    drct_pl_open_temp_list (strv_to_index (filenames));
-    FINISH (open_list_to_temp);
-    return TRUE;
-}
-
-static bool_t do_pause (Obj * obj, Invoc * invoc)
-{
-    drct_pause ();
-    FINISH (pause);
-    return TRUE;
-}
-
-static bool_t do_paused (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (paused, drct_get_paused ());
-    return TRUE;
-}
-
-static bool_t do_play (Obj * obj, Invoc * invoc)
-{
-    drct_play ();
-    FINISH (play);
-    return TRUE;
-}
-
-static bool_t do_play_active_playlist (Obj * obj, Invoc * invoc)
-{
-    drct_play_playlist (playlist_get_active ());
-    FINISH (play_active_playlist);
-    return TRUE;
-}
-
-static bool_t do_play_pause (Obj * obj, Invoc * invoc)
-{
-    drct_play_pause ();
-    FINISH (play_pause);
-    return TRUE;
-}
-
-static bool_t do_playing (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (playing, drct_get_playing ());
-    return TRUE;
-}
-
-static bool_t do_playlist_add (Obj * obj, Invoc * invoc, const char * list)
-{
-    playlist_entry_insert (playlist_get_active (), -1, list, NULL, FALSE);
-    FINISH (playlist_add);
-    return TRUE;
-}
-
-static bool_t do_playlist_enqueue_to_temp (Obj * obj, Invoc * invoc, const char * url)
-{
-    drct_pl_open_temp (url);
-    FINISH (playlist_enqueue_to_temp);
-    return TRUE;
-}
-
-static bool_t do_playlist_ins_url_string (Obj * obj, Invoc * invoc, const char * url, int pos)
-{
-    playlist_entry_insert (playlist_get_active (), pos, url, NULL, FALSE);
-    FINISH (playlist_ins_url_string);
-    return TRUE;
-}
-
-static bool_t do_playqueue_add (Obj * obj, Invoc * invoc, int pos)
-{
-    playlist_queue_insert (playlist_get_active (), -1, pos);
-    FINISH (playqueue_add);
-    return TRUE;
-}
-
-static bool_t do_playqueue_clear (Obj * obj, Invoc * invoc)
-{
-    int playlist = playlist_get_active ();
-    playlist_queue_delete (playlist, 0, playlist_queue_count (playlist));
-    FINISH (playqueue_clear);
-    return TRUE;
-}
-
-static bool_t do_playqueue_is_queued (Obj * obj, Invoc * invoc, int pos)
-{
-    bool_t queued = (playlist_queue_find_entry (playlist_get_active (), pos) >= 0);
-    FINISH2 (playqueue_is_queued, queued);
-    return TRUE;
-}
-
-static bool_t do_playqueue_remove (Obj * obj, Invoc * invoc, int pos)
-{
-    int playlist = playlist_get_active ();
-    int qpos = playlist_queue_find_entry (playlist, pos);
-
-    if (qpos >= 0)
-        playlist_queue_delete (playlist, qpos, 1);
-
-    FINISH (playqueue_remove);
-    return TRUE;
-}
-
-static bool_t do_position (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (position, playlist_get_position (playlist_get_active ()));
-    return TRUE;
-}
-
-static bool_t do_queue_get_list_pos (Obj * obj, Invoc * invoc, unsigned qpos)
-{
-    FINISH2 (queue_get_list_pos, playlist_queue_get_entry (playlist_get_active (), qpos));
-    return TRUE;
-}
-
-static bool_t do_queue_get_queue_pos (Obj * obj, Invoc * invoc, unsigned pos)
-{
-    FINISH2 (queue_get_queue_pos, playlist_queue_find_entry (playlist_get_active (), pos));
-    return TRUE;
-}
-
-static bool_t do_quit (Obj * obj, Invoc * invoc)
-{
-    drct_quit ();
-    FINISH (quit);
-    return TRUE;
-}
-
-static bool_t do_repeat (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (repeat, get_bool (NULL, "repeat"));
-    return TRUE;
-}
-
-static bool_t do_reverse (Obj * obj, Invoc * invoc)
-{
-    drct_pl_prev ();
-    FINISH (reverse);
-    return TRUE;
-}
-
-static bool_t do_seek (Obj * obj, Invoc * invoc, unsigned pos)
-{
-    drct_seek (pos);
-    FINISH (seek);
-    return TRUE;
-}
-
-static bool_t do_set_active_playlist (Obj * obj, Invoc * invoc, int playlist)
-{
-    playlist_set_active (playlist);
-    FINISH (set_active_playlist);
-    return TRUE;
-}
-
-static bool_t do_set_active_playlist_name (Obj * obj, Invoc * invoc, const char * title)
-{
-    playlist_set_title (playlist_get_active (), title);
-    FINISH (set_active_playlist_name);
-    return TRUE;
-}
-
-static bool_t do_set_eq (Obj * obj, Invoc * invoc, double preamp, GVariant * var)
-{
-    if (! g_variant_is_of_type (var, G_VARIANT_TYPE ("ad")))
-        return FALSE;
-
-    size_t nbands = 0;
-    const double * bands = g_variant_get_fixed_array (var, & nbands, sizeof (double));
-
-    if (nbands != AUD_EQUALIZER_NBANDS)
-        return FALSE;
-
-    set_double (NULL, "equalizer_preamp", preamp);
-    eq_set_bands (bands);
-    FINISH (set_eq);
-    return TRUE;
-}
-
-static bool_t do_set_eq_band (Obj * obj, Invoc * invoc, int band, double value)
-{
-    eq_set_band (band, value);
-    FINISH (set_eq_band);
-    return TRUE;
-}
-
-static bool_t do_set_eq_preamp (Obj * obj, Invoc * invoc, double preamp)
-{
-    set_double (NULL, "equalizer_preamp", preamp);
-    FINISH (set_eq_preamp);
-    return TRUE;
-}
-
-static bool_t do_set_volume (Obj * obj, Invoc * invoc, int vl, int vr)
-{
-    drct_set_volume (vl, vr);
-    FINISH (set_volume);
-    return TRUE;
-}
-
-static bool_t do_show_about_box (Obj * obj, Invoc * invoc, bool_t show)
-{
-    if (! headless_mode ())
-    {
-        if (show)
-            audgui_show_about_window ();
-        else
-            audgui_hide_about_window ();
-    }
-
-    FINISH (show_about_box);
-    return TRUE;
-}
-
-static bool_t do_show_filebrowser (Obj * obj, Invoc * invoc, bool_t show)
-{
-    if (! headless_mode ())
-    {
-        if (show)
-            audgui_run_filebrowser (FALSE);
-        else
-            audgui_hide_filebrowser ();
-    }
-
-    FINISH (show_filebrowser);
-    return TRUE;
-}
-
-static bool_t do_show_jtf_box (Obj * obj, Invoc * invoc, bool_t show)
-{
-    if (! headless_mode ())
-    {
-        if (show)
-            audgui_jump_to_track ();
-        else
-            audgui_jump_to_track_hide ();
-    }
-
-    FINISH (show_jtf_box);
-    return TRUE;
-}
-
-static bool_t do_show_main_win (Obj * obj, Invoc * invoc, bool_t show)
-{
-    if (! headless_mode ())
-        interface_show (show);
-
-    FINISH (show_main_win);
-    return TRUE;
-}
-
-static bool_t do_show_prefs_box (Obj * obj, Invoc * invoc, bool_t show)
-{
-    if (! headless_mode ())
-    {
-        if (show)
-            show_prefs_window ();
-        else
-            hide_prefs_window ();
-    }
-
-    FINISH (show_prefs_box);
-    return TRUE;
-}
-
-static bool_t do_shuffle (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (shuffle, get_bool (NULL, "shuffle"));
-    return TRUE;
-}
-
-static bool_t do_song_filename (Obj * obj, Invoc * invoc, unsigned pos)
-{
-    char * filename = playlist_entry_get_filename (playlist_get_active (), pos);
-    FINISH2 (song_filename, filename ? filename : "");
-    str_unref (filename);
-    return TRUE;
-}
-
-static bool_t do_song_frames (Obj * obj, Invoc * invoc, unsigned pos)
-{
-    FINISH2 (song_frames, playlist_entry_get_length (playlist_get_active (), pos, FALSE));
-    return TRUE;
-}
-
-static bool_t do_song_length (Obj * obj, Invoc * invoc, unsigned pos)
-{
-    int length = playlist_entry_get_length (playlist_get_active (), pos, FALSE);
-    FINISH2 (song_length, length >= 0 ? length / 1000 : -1);
-    return TRUE;
-}
-
-static bool_t do_song_title (Obj * obj, Invoc * invoc, unsigned pos)
-{
-    char * title = playlist_entry_get_title (playlist_get_active (), pos, FALSE);
-    FINISH2 (song_title, title ? title : "");
-    str_unref (title);
-    return TRUE;
-}
-
-static bool_t do_song_tuple (Obj * obj, Invoc * invoc, unsigned pos, const char * key)
-{
-    int field = tuple_field_by_name (key);
-    Tuple * tuple = NULL;
-    GVariant * var = NULL;
-
-    if (field >= 0)
-        tuple = playlist_entry_get_tuple (playlist_get_active (), pos, FALSE);
-
-    if (tuple)
-    {
-        char * str;
-
-        switch (tuple_get_value_type (tuple, field))
-        {
-        case TUPLE_STRING:
-            str = tuple_get_str (tuple, field);
-            var = g_variant_new_string (str);
-            str_unref (str);
-            break;
-
-        case TUPLE_INT:
-            var = g_variant_new_int32 (tuple_get_int (tuple, field));
-            break;
-
-        default:
-            break;
-        }
-
-        tuple_unref (tuple);
-    }
-
-    if (! var)
-        var = g_variant_new_string ("");
-
-    FINISH2 (song_tuple, g_variant_new_variant (var));
-    return TRUE;
-}
-
-static bool_t do_status (Obj * obj, Invoc * invoc)
-{
-    const char * status = "stopped";
-    if (drct_get_playing ())
-        status = drct_get_paused () ? "paused" : "playing";
-
-    FINISH2 (status, status);
-    return TRUE;
-}
-
-static bool_t do_stop (Obj * obj, Invoc * invoc)
-{
-    drct_stop ();
-    FINISH (stop);
-    return TRUE;
-}
-
-static bool_t do_stop_after (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (stop_after, get_bool (NULL, "stop_after_current_song"));
-    return TRUE;
-}
-
-static bool_t do_stopped (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (stopped, ! drct_get_playing ());
-    return TRUE;
-}
-
-static bool_t do_time (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (time, drct_get_time ());
-    return TRUE;
-}
-
-static bool_t do_toggle_auto_advance (Obj * obj, Invoc * invoc)
-{
-    set_bool (NULL, "no_playlist_advance", ! get_bool (NULL, "no_playlist_advance"));
-    FINISH (toggle_auto_advance);
-    return TRUE;
-}
-
-static bool_t do_toggle_repeat (Obj * obj, Invoc * invoc)
-{
-    set_bool (NULL, "repeat", ! get_bool (NULL, "repeat"));
-    FINISH (toggle_repeat);
-    return TRUE;
-}
-
-static bool_t do_toggle_shuffle (Obj * obj, Invoc * invoc)
-{
-    set_bool (NULL, "shuffle", ! get_bool (NULL, "shuffle"));
-    FINISH (toggle_shuffle);
-    return TRUE;
-}
-
-static bool_t do_toggle_stop_after (Obj * obj, Invoc * invoc)
-{
-    set_bool (NULL, "stop_after_current_song", ! get_bool (NULL, "stop_after_current_song"));
-    FINISH (toggle_stop_after);
-    return TRUE;
-}
-
-static bool_t do_version (Obj * obj, Invoc * invoc)
-{
-    FINISH2 (version, VERSION);
-    return TRUE;
-}
-
-static bool_t do_volume (Obj * obj, Invoc * invoc)
-{
-    int left, right;
-    drct_get_volume (& left, & right);
-    FINISH2 (volume, left, right);
-    return TRUE;
-}
-
-static const struct
-{
-    const char * signal;
-    GCallback callback;
-}
-handlers[] =
-{
-    {"handle-add", (GCallback) do_add},
-    {"handle-add-list", (GCallback) do_add_list},
-    {"handle-add-url", (GCallback) do_add_url},
-    {"handle-advance", (GCallback) do_advance},
-    {"handle-auto-advance", (GCallback) do_auto_advance},
-    {"handle-balance", (GCallback) do_balance},
-    {"handle-clear", (GCallback) do_clear},
-    {"handle-delete", (GCallback) do_delete},
-    {"handle-delete-active-playlist", (GCallback) do_delete_active_playlist},
-    {"handle-eject", (GCallback) do_eject},
-    {"handle-equalizer-activate", (GCallback) do_equalizer_activate},
-    {"handle-get-active-playlist", (GCallback) do_get_active_playlist},
-    {"handle-get-active-playlist-name", (GCallback) do_get_active_playlist_name},
-    {"handle-get-eq", (GCallback) do_get_eq},
-    {"handle-get-eq-band", (GCallback) do_get_eq_band},
-    {"handle-get-eq-preamp", (GCallback) do_get_eq_preamp},
-    {"handle-get-info", (GCallback) do_get_info},
-    {"handle-get-playqueue-length", (GCallback) do_get_playqueue_length},
-    {"handle-get-tuple-fields", (GCallback) do_get_tuple_fields},
-    {"handle-info", (GCallback) do_info},
-    {"handle-jump", (GCallback) do_jump},
-    {"handle-length", (GCallback) do_length},
-    {"handle-main-win-visible", (GCallback) do_main_win_visible},
-    {"handle-new-playlist", (GCallback) do_new_playlist},
-    {"handle-number-of-playlists", (GCallback) do_number_of_playlists},
-    {"handle-open-list", (GCallback) do_open_list},
-    {"handle-open-list-to-temp", (GCallback) do_open_list_to_temp},
-    {"handle-pause", (GCallback) do_pause},
-    {"handle-paused", (GCallback) do_paused},
-    {"handle-play", (GCallback) do_play},
-    {"handle-play-active-playlist", (GCallback) do_play_active_playlist},
-    {"handle-play-pause", (GCallback) do_play_pause},
-    {"handle-playing", (GCallback) do_playing},
-    {"handle-playlist-add", (GCallback) do_playlist_add},
-    {"handle-playlist-enqueue-to-temp", (GCallback) do_playlist_enqueue_to_temp},
-    {"handle-playlist-ins-url-string", (GCallback) do_playlist_ins_url_string},
-    {"handle-playqueue-add", (GCallback) do_playqueue_add},
-    {"handle-playqueue-clear", (GCallback) do_playqueue_clear},
-    {"handle-playqueue-is-queued", (GCallback) do_playqueue_is_queued},
-    {"handle-playqueue-remove", (GCallback) do_playqueue_remove},
-    {"handle-position", (GCallback) do_position},
-    {"handle-queue-get-list-pos", (GCallback) do_queue_get_list_pos},
-    {"handle-queue-get-queue-pos", (GCallback) do_queue_get_queue_pos},
-    {"handle-quit", (GCallback) do_quit},
-    {"handle-repeat", (GCallback) do_repeat},
-    {"handle-reverse", (GCallback) do_reverse},
-    {"handle-seek", (GCallback) do_seek},
-    {"handle-set-active-playlist", (GCallback) do_set_active_playlist},
-    {"handle-set-active-playlist-name", (GCallback) do_set_active_playlist_name},
-    {"handle-set-eq", (GCallback) do_set_eq},
-    {"handle-set-eq-band", (GCallback) do_set_eq_band},
-    {"handle-set-eq-preamp", (GCallback) do_set_eq_preamp},
-    {"handle-set-volume", (GCallback) do_set_volume},
-    {"handle-show-about-box", (GCallback) do_show_about_box},
-    {"handle-show-filebrowser", (GCallback) do_show_filebrowser},
-    {"handle-show-jtf-box", (GCallback) do_show_jtf_box},
-    {"handle-show-main-win", (GCallback) do_show_main_win},
-    {"handle-show-prefs-box", (GCallback) do_show_prefs_box},
-    {"handle-shuffle", (GCallback) do_shuffle},
-    {"handle-song-filename", (GCallback) do_song_filename},
-    {"handle-song-frames", (GCallback) do_song_frames},
-    {"handle-song-length", (GCallback) do_song_length},
-    {"handle-song-title", (GCallback) do_song_title},
-    {"handle-song-tuple", (GCallback) do_song_tuple},
-    {"handle-status", (GCallback) do_status},
-    {"handle-stop", (GCallback) do_stop},
-    {"handle-stop-after", (GCallback) do_stop_after},
-    {"handle-stopped", (GCallback) do_stopped},
-    {"handle-time", (GCallback) do_time},
-    {"handle-toggle-auto-advance", (GCallback) do_toggle_auto_advance},
-    {"handle-toggle-repeat", (GCallback) do_toggle_repeat},
-    {"handle-toggle-shuffle", (GCallback) do_toggle_shuffle},
-    {"handle-toggle-stop-after", (GCallback) do_toggle_stop_after},
-    {"handle-version", (GCallback) do_version},
-    {"handle-volume", (GCallback) do_volume}
-};
-
-static GDBusInterfaceSkeleton * skeleton = NULL;
-
-void dbus_server_init (void)
-{
-    GError * error = NULL;
-    GDBusConnection * bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, & error);
-
-    if (! bus)
-        goto ERROR;
-
-    g_bus_own_name_on_connection (bus, "org.atheme.audacious", 0, NULL, NULL, NULL, NULL);
-
-    skeleton = (GDBusInterfaceSkeleton *) obj_audacious_skeleton_new ();
-
-    for (int i = 0; i < ARRAY_LEN (handlers); i ++)
-        g_signal_connect (skeleton, handlers[i].signal, handlers[i].callback, NULL);
-
-    if (! g_dbus_interface_skeleton_export (skeleton, bus, "/org/atheme/audacious", & error))
-        goto ERROR;
-
-    return;
-
-ERROR:
-    if (error)
-    {
-        fprintf (stderr, "D-Bus error: %s\n", error->message);
-        g_error_free (error);
-    }
-}
-
-void dbus_server_cleanup (void)
-{
-    if (skeleton)
-    {
-        g_object_unref (skeleton);
-        skeleton = NULL;
-    }
-}
diff --git a/src/audacious/dbus-server.cc b/src/audacious/dbus-server.cc
new file mode 100644
index 000000000000..90f464e08ae1
--- /dev/null
+++ b/src/audacious/dbus-server.cc
@@ -0,0 +1,815 @@
+/*
+ * dbus-server.c
+ * Copyright 2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <libaudcore/drct.h>
+#include <libaudcore/equalizer.h>
+#include <libaudcore/interface.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/runtime.h>
+#include <libaudcore/tuple.h>
+
+#include "aud-dbus.h"
+#include "main.h"
+
+typedef ObjAudacious Obj;
+typedef GDBusMethodInvocation Invoc;
+
+#define FINISH(name) \
+ obj_audacious_complete_##name (obj, invoc)
+
+#define FINISH2(name, ...) \
+ obj_audacious_complete_##name (obj, invoc, __VA_ARGS__)
+
+static Index<PlaylistAddItem> strv_to_index (const char * const * strv)
+{
+    Index<PlaylistAddItem> index;
+    while (* strv)
+        index.append (String (* strv ++));
+
+    return index;
+}
+
+static gboolean do_add (Obj * obj, Invoc * invoc, const char * file)
+{
+    aud_playlist_entry_insert (aud_playlist_get_active (), -1, file, Tuple (), false);
+    FINISH (add);
+    return true;
+}
+
+static gboolean do_add_list (Obj * obj, Invoc * invoc, const char * const * filenames)
+{
+    aud_playlist_entry_insert_batch (aud_playlist_get_active (), -1,
+     strv_to_index (filenames), false);
+    FINISH (add_list);
+    return true;
+}
+
+static gboolean do_add_url (Obj * obj, Invoc * invoc, const char * url)
+{
+    aud_playlist_entry_insert (aud_playlist_get_active (), -1, url, Tuple (), false);
+    FINISH (add_url);
+    return true;
+}
+
+static gboolean do_advance (Obj * obj, Invoc * invoc)
+{
+    aud_drct_pl_next ();
+    FINISH (advance);
+    return true;
+}
+
+static gboolean do_auto_advance (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (auto_advance, ! aud_get_bool (nullptr, "no_playlist_advance"));
+    return true;
+}
+
+static gboolean do_balance (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (balance, aud_drct_get_volume_balance ());
+    return true;
+}
+
+static gboolean do_clear (Obj * obj, Invoc * invoc)
+{
+    int playlist = aud_playlist_get_active ();
+    aud_playlist_entry_delete (playlist, 0, aud_playlist_entry_count (playlist));
+    FINISH (clear);
+    return true;
+}
+
+static gboolean do_delete (Obj * obj, Invoc * invoc, unsigned pos)
+{
+    aud_playlist_entry_delete (aud_playlist_get_active (), pos, 1);
+    FINISH (delete);
+    return true;
+}
+
+static gboolean do_delete_active_playlist (Obj * obj, Invoc * invoc)
+{
+    aud_playlist_delete (aud_playlist_get_active ());
+    FINISH (delete_active_playlist);
+    return true;
+}
+
+static gboolean do_eject (Obj * obj, Invoc * invoc)
+{
+    if (! aud_get_headless_mode ())
+        aud_ui_show_filebrowser (true);
+
+    FINISH (eject);
+    return true;
+}
+
+static gboolean do_equalizer_activate (Obj * obj, Invoc * invoc, gboolean active)
+{
+    aud_set_bool (nullptr, "equalizer_active", active);
+    FINISH (equalizer_activate);
+    return true;
+}
+
+static gboolean do_get_active_playlist (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (get_active_playlist, aud_playlist_get_active ());
+    return true;
+}
+
+static gboolean do_get_active_playlist_name (Obj * obj, Invoc * invoc)
+{
+    String title = aud_playlist_get_title (aud_playlist_get_active ());
+    FINISH2 (get_active_playlist_name, title ? title : "");
+    return true;
+}
+
+static gboolean do_get_eq (Obj * obj, Invoc * invoc)
+{
+    double preamp = aud_get_double (nullptr, "equalizer_preamp");
+    double bands[AUD_EQ_NBANDS];
+    aud_eq_get_bands (bands);
+
+    GVariant * var = g_variant_new_fixed_array (G_VARIANT_TYPE_DOUBLE, bands,
+     AUD_EQ_NBANDS, sizeof (double));
+    FINISH2 (get_eq, preamp, var);
+    return true;
+}
+
+static gboolean do_get_eq_band (Obj * obj, Invoc * invoc, int band)
+{
+    FINISH2 (get_eq_band, aud_eq_get_band (band));
+    return true;
+}
+
+static gboolean do_get_eq_preamp (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (get_eq_preamp, aud_get_double (nullptr, "equalizer_preamp"));
+    return true;
+}
+
+static gboolean do_get_info (Obj * obj, Invoc * invoc)
+{
+    int bitrate, samplerate, channels;
+    aud_drct_get_info (bitrate, samplerate, channels);
+    FINISH2 (get_info, bitrate, samplerate, channels);
+    return true;
+}
+
+static gboolean do_get_playqueue_length (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (get_playqueue_length, aud_playlist_queue_count (aud_playlist_get_active ()));
+    return true;
+}
+
+static gboolean do_get_tuple_fields (Obj * obj, Invoc * invoc)
+{
+    const char * fields[Tuple::n_fields + 1];
+
+    for (auto f : Tuple::all_fields ())
+        fields[f] = Tuple::field_get_name (f);
+
+    fields[Tuple::n_fields] = nullptr;
+
+    FINISH2 (get_tuple_fields, fields);
+    return true;
+}
+
+static gboolean do_info (Obj * obj, Invoc * invoc)
+{
+    int bitrate, samplerate, channels;
+    aud_drct_get_info (bitrate, samplerate, channels);
+    FINISH2 (info, bitrate, samplerate, channels);
+    return true;
+}
+
+static gboolean do_jump (Obj * obj, Invoc * invoc, unsigned pos)
+{
+    aud_playlist_set_position (aud_playlist_get_active (), pos);
+    FINISH (jump);
+    return true;
+}
+
+static gboolean do_length (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (length, aud_playlist_entry_count (aud_playlist_get_active ()));
+    return true;
+}
+
+static gboolean do_main_win_visible (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (main_win_visible, ! aud_get_headless_mode () && aud_ui_is_shown ());
+    return true;
+}
+
+static gboolean do_new_playlist (Obj * obj, Invoc * invoc)
+{
+    aud_playlist_insert (-1);
+    aud_playlist_set_active (aud_playlist_count () - 1);
+    FINISH (new_playlist);
+    return true;
+}
+
+static gboolean do_number_of_playlists (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (number_of_playlists, aud_playlist_count ());
+    return true;
+}
+
+static gboolean do_open_list (Obj * obj, Invoc * invoc, const char * const * filenames)
+{
+    aud_drct_pl_open_list (strv_to_index (filenames));
+    FINISH (open_list);
+    return true;
+}
+
+static gboolean do_open_list_to_temp (Obj * obj, Invoc * invoc, const char * const * filenames)
+{
+    aud_drct_pl_open_temp_list (strv_to_index (filenames));
+    FINISH (open_list_to_temp);
+    return true;
+}
+
+static gboolean do_pause (Obj * obj, Invoc * invoc)
+{
+    aud_drct_pause ();
+    FINISH (pause);
+    return true;
+}
+
+static gboolean do_paused (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (paused, aud_drct_get_paused ());
+    return true;
+}
+
+static gboolean do_play (Obj * obj, Invoc * invoc)
+{
+    aud_drct_play ();
+    FINISH (play);
+    return true;
+}
+
+static gboolean do_play_active_playlist (Obj * obj, Invoc * invoc)
+{
+    aud_playlist_play (aud_playlist_get_active ());
+    FINISH (play_active_playlist);
+    return true;
+}
+
+static gboolean do_play_pause (Obj * obj, Invoc * invoc)
+{
+    aud_drct_play_pause ();
+    FINISH (play_pause);
+    return true;
+}
+
+static gboolean do_playing (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (playing, aud_drct_get_playing ());
+    return true;
+}
+
+static gboolean do_playlist_add (Obj * obj, Invoc * invoc, const char * list)
+{
+    aud_playlist_entry_insert (aud_playlist_get_active (), -1, list, Tuple (), false);
+    FINISH (playlist_add);
+    return true;
+}
+
+static gboolean do_playlist_enqueue_to_temp (Obj * obj, Invoc * invoc, const char * url)
+{
+    aud_drct_pl_open_temp (url);
+    FINISH (playlist_enqueue_to_temp);
+    return true;
+}
+
+static gboolean do_playlist_ins_url_string (Obj * obj, Invoc * invoc, const char * url, int pos)
+{
+    aud_playlist_entry_insert (aud_playlist_get_active (), pos, url, Tuple (), false);
+    FINISH (playlist_ins_url_string);
+    return true;
+}
+
+static gboolean do_playqueue_add (Obj * obj, Invoc * invoc, int pos)
+{
+    aud_playlist_queue_insert (aud_playlist_get_active (), -1, pos);
+    FINISH (playqueue_add);
+    return true;
+}
+
+static gboolean do_playqueue_clear (Obj * obj, Invoc * invoc)
+{
+    int playlist = aud_playlist_get_active ();
+    aud_playlist_queue_delete (playlist, 0, aud_playlist_queue_count (playlist));
+    FINISH (playqueue_clear);
+    return true;
+}
+
+static gboolean do_playqueue_is_queued (Obj * obj, Invoc * invoc, int pos)
+{
+    bool queued = (aud_playlist_queue_find_entry (aud_playlist_get_active (), pos) >= 0);
+    FINISH2 (playqueue_is_queued, queued);
+    return true;
+}
+
+static gboolean do_playqueue_remove (Obj * obj, Invoc * invoc, int pos)
+{
+    int playlist = aud_playlist_get_active ();
+    int qpos = aud_playlist_queue_find_entry (playlist, pos);
+
+    if (qpos >= 0)
+        aud_playlist_queue_delete (playlist, qpos, 1);
+
+    FINISH (playqueue_remove);
+    return true;
+}
+
+static gboolean do_position (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (position, aud_playlist_get_position (aud_playlist_get_active ()));
+    return true;
+}
+
+static gboolean do_queue_get_list_pos (Obj * obj, Invoc * invoc, unsigned qpos)
+{
+    FINISH2 (queue_get_list_pos, aud_playlist_queue_get_entry (aud_playlist_get_active (), qpos));
+    return true;
+}
+
+static gboolean do_queue_get_queue_pos (Obj * obj, Invoc * invoc, unsigned pos)
+{
+    FINISH2 (queue_get_queue_pos, aud_playlist_queue_find_entry (aud_playlist_get_active (), pos));
+    return true;
+}
+
+static gboolean do_quit (Obj * obj, Invoc * invoc)
+{
+    aud_quit ();
+    FINISH (quit);
+    return true;
+}
+
+static gboolean do_repeat (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (repeat, aud_get_bool (nullptr, "repeat"));
+    return true;
+}
+
+static gboolean do_reverse (Obj * obj, Invoc * invoc)
+{
+    aud_drct_pl_prev ();
+    FINISH (reverse);
+    return true;
+}
+
+static gboolean do_seek (Obj * obj, Invoc * invoc, unsigned pos)
+{
+    aud_drct_seek (pos);
+    FINISH (seek);
+    return true;
+}
+
+static gboolean do_set_active_playlist (Obj * obj, Invoc * invoc, int playlist)
+{
+    aud_playlist_set_active (playlist);
+    FINISH (set_active_playlist);
+    return true;
+}
+
+static gboolean do_set_active_playlist_name (Obj * obj, Invoc * invoc, const char * title)
+{
+    aud_playlist_set_title (aud_playlist_get_active (), title);
+    FINISH (set_active_playlist_name);
+    return true;
+}
+
+static gboolean do_set_eq (Obj * obj, Invoc * invoc, double preamp, GVariant * var)
+{
+    if (! g_variant_is_of_type (var, G_VARIANT_TYPE ("ad")))
+        return false;
+
+    size_t nbands = 0;
+    const double * bands = (double *) g_variant_get_fixed_array (var, & nbands, sizeof (double));
+
+    if (nbands != AUD_EQ_NBANDS)
+        return false;
+
+    aud_set_double (nullptr, "equalizer_preamp", preamp);
+    aud_eq_set_bands (bands);
+    FINISH (set_eq);
+    return true;
+}
+
+static gboolean do_set_eq_band (Obj * obj, Invoc * invoc, int band, double value)
+{
+    aud_eq_set_band (band, value);
+    FINISH (set_eq_band);
+    return true;
+}
+
+static gboolean do_set_eq_preamp (Obj * obj, Invoc * invoc, double preamp)
+{
+    aud_set_double (nullptr, "equalizer_preamp", preamp);
+    FINISH (set_eq_preamp);
+    return true;
+}
+
+static gboolean do_set_volume (Obj * obj, Invoc * invoc, int vl, int vr)
+{
+    aud_drct_set_volume ({vl, vr});
+    FINISH (set_volume);
+    return true;
+}
+
+static gboolean do_show_about_box (Obj * obj, Invoc * invoc, gboolean show)
+{
+    if (! aud_get_headless_mode ())
+    {
+        if (show)
+            aud_ui_show_about_window ();
+        else
+            aud_ui_hide_about_window ();
+    }
+
+    FINISH (show_about_box);
+    return true;
+}
+
+static gboolean do_show_filebrowser (Obj * obj, Invoc * invoc, gboolean show)
+{
+    if (! aud_get_headless_mode ())
+    {
+        if (show)
+            aud_ui_show_filebrowser (false);
+        else
+            aud_ui_hide_filebrowser ();
+    }
+
+    FINISH (show_filebrowser);
+    return true;
+}
+
+static gboolean do_show_jtf_box (Obj * obj, Invoc * invoc, gboolean show)
+{
+    if (! aud_get_headless_mode ())
+    {
+        if (show)
+            aud_ui_show_jump_to_song ();
+        else
+            aud_ui_hide_jump_to_song ();
+    }
+
+    FINISH (show_jtf_box);
+    return true;
+}
+
+static gboolean do_show_main_win (Obj * obj, Invoc * invoc, gboolean show)
+{
+    if (! aud_get_headless_mode ())
+        aud_ui_show (show);
+
+    FINISH (show_main_win);
+    return true;
+}
+
+static gboolean do_show_prefs_box (Obj * obj, Invoc * invoc, gboolean show)
+{
+    if (! aud_get_headless_mode ())
+    {
+        if (show)
+            aud_ui_show_prefs_window ();
+        else
+            aud_ui_hide_prefs_window ();
+    }
+
+    FINISH (show_prefs_box);
+    return true;
+}
+
+static gboolean do_shuffle (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (shuffle, aud_get_bool (nullptr, "shuffle"));
+    return true;
+}
+
+static gboolean do_song_filename (Obj * obj, Invoc * invoc, unsigned pos)
+{
+    String filename = aud_playlist_entry_get_filename (aud_playlist_get_active (), pos);
+    FINISH2 (song_filename, filename ? filename : "");
+    return true;
+}
+
+static gboolean do_song_frames (Obj * obj, Invoc * invoc, unsigned pos)
+{
+    Tuple tuple = aud_playlist_entry_get_tuple (aud_playlist_get_active (), pos);
+    FINISH2 (song_frames, aud::max (0, tuple.get_int (Tuple::Length)));
+    return true;
+}
+
+static gboolean do_song_length (Obj * obj, Invoc * invoc, unsigned pos)
+{
+    Tuple tuple = aud_playlist_entry_get_tuple (aud_playlist_get_active (), pos);
+    int length = aud::max (0, tuple.get_int (Tuple::Length));
+    FINISH2 (song_length, length / 1000);
+    return true;
+}
+
+static gboolean do_song_title (Obj * obj, Invoc * invoc, unsigned pos)
+{
+    Tuple tuple = aud_playlist_entry_get_tuple (aud_playlist_get_active (), pos);
+    String title = tuple.get_str (Tuple::FormattedTitle);
+    FINISH2 (song_title, title ? title : "");
+    return true;
+}
+
+static gboolean do_song_tuple (Obj * obj, Invoc * invoc, unsigned pos, const char * key)
+{
+    Tuple::Field field = Tuple::field_by_name (key);
+    Tuple tuple;
+    GVariant * var = nullptr;
+
+    if (field >= 0)
+        tuple = aud_playlist_entry_get_tuple (aud_playlist_get_active (), pos);
+
+    if (tuple)
+    {
+        switch (tuple.get_value_type (field))
+        {
+        case Tuple::String:
+            var = g_variant_new_string (tuple.get_str (field));
+            break;
+
+        case Tuple::Int:
+            var = g_variant_new_int32 (tuple.get_int (field));
+            break;
+
+        default:
+            break;
+        }
+    }
+
+    if (! var)
+        var = g_variant_new_string ("");
+
+    FINISH2 (song_tuple, g_variant_new_variant (var));
+    return true;
+}
+
+static gboolean do_status (Obj * obj, Invoc * invoc)
+{
+    const char * status = "stopped";
+    if (aud_drct_get_playing ())
+        status = aud_drct_get_paused () ? "paused" : "playing";
+
+    FINISH2 (status, status);
+    return true;
+}
+
+static gboolean do_stop (Obj * obj, Invoc * invoc)
+{
+    aud_drct_stop ();
+    FINISH (stop);
+    return true;
+}
+
+static gboolean do_stop_after (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (stop_after, aud_get_bool (nullptr, "stop_after_current_song"));
+    return true;
+}
+
+static gboolean do_stopped (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (stopped, ! aud_drct_get_playing ());
+    return true;
+}
+
+static gboolean do_time (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (time, aud_drct_get_time ());
+    return true;
+}
+
+static gboolean do_toggle_auto_advance (Obj * obj, Invoc * invoc)
+{
+    aud_set_bool (nullptr, "no_playlist_advance", ! aud_get_bool (nullptr, "no_playlist_advance"));
+    FINISH (toggle_auto_advance);
+    return true;
+}
+
+static gboolean do_toggle_repeat (Obj * obj, Invoc * invoc)
+{
+    aud_set_bool (nullptr, "repeat", ! aud_get_bool (nullptr, "repeat"));
+    FINISH (toggle_repeat);
+    return true;
+}
+
+static gboolean do_toggle_shuffle (Obj * obj, Invoc * invoc)
+{
+    aud_set_bool (nullptr, "shuffle", ! aud_get_bool (nullptr, "shuffle"));
+    FINISH (toggle_shuffle);
+    return true;
+}
+
+static gboolean do_toggle_stop_after (Obj * obj, Invoc * invoc)
+{
+    aud_set_bool (nullptr, "stop_after_current_song", ! aud_get_bool (nullptr, "stop_after_current_song"));
+    FINISH (toggle_stop_after);
+    return true;
+}
+
+static gboolean do_version (Obj * obj, Invoc * invoc)
+{
+    FINISH2 (version, VERSION);
+    return true;
+}
+
+static gboolean do_volume (Obj * obj, Invoc * invoc)
+{
+    StereoVolume volume = aud_drct_get_volume ();
+    FINISH2 (volume, volume.left, volume.right);
+    return true;
+}
+
+static const struct
+{
+    const char * signal;
+    GCallback callback;
+}
+handlers[] =
+{
+    {"handle-add", (GCallback) do_add},
+    {"handle-add-list", (GCallback) do_add_list},
+    {"handle-add-url", (GCallback) do_add_url},
+    {"handle-advance", (GCallback) do_advance},
+    {"handle-auto-advance", (GCallback) do_auto_advance},
+    {"handle-balance", (GCallback) do_balance},
+    {"handle-clear", (GCallback) do_clear},
+    {"handle-delete", (GCallback) do_delete},
+    {"handle-delete-active-playlist", (GCallback) do_delete_active_playlist},
+    {"handle-eject", (GCallback) do_eject},
+    {"handle-equalizer-activate", (GCallback) do_equalizer_activate},
+    {"handle-get-active-playlist", (GCallback) do_get_active_playlist},
+    {"handle-get-active-playlist-name", (GCallback) do_get_active_playlist_name},
+    {"handle-get-eq", (GCallback) do_get_eq},
+    {"handle-get-eq-band", (GCallback) do_get_eq_band},
+    {"handle-get-eq-preamp", (GCallback) do_get_eq_preamp},
+    {"handle-get-info", (GCallback) do_get_info},
+    {"handle-get-playqueue-length", (GCallback) do_get_playqueue_length},
+    {"handle-get-tuple-fields", (GCallback) do_get_tuple_fields},
+    {"handle-info", (GCallback) do_info},
+    {"handle-jump", (GCallback) do_jump},
+    {"handle-length", (GCallback) do_length},
+    {"handle-main-win-visible", (GCallback) do_main_win_visible},
+    {"handle-new-playlist", (GCallback) do_new_playlist},
+    {"handle-number-of-playlists", (GCallback) do_number_of_playlists},
+    {"handle-open-list", (GCallback) do_open_list},
+    {"handle-open-list-to-temp", (GCallback) do_open_list_to_temp},
+    {"handle-pause", (GCallback) do_pause},
+    {"handle-paused", (GCallback) do_paused},
+    {"handle-play", (GCallback) do_play},
+    {"handle-play-active-playlist", (GCallback) do_play_active_playlist},
+    {"handle-play-pause", (GCallback) do_play_pause},
+    {"handle-playing", (GCallback) do_playing},
+    {"handle-playlist-add", (GCallback) do_playlist_add},
+    {"handle-playlist-enqueue-to-temp", (GCallback) do_playlist_enqueue_to_temp},
+    {"handle-playlist-ins-url-string", (GCallback) do_playlist_ins_url_string},
+    {"handle-playqueue-add", (GCallback) do_playqueue_add},
+    {"handle-playqueue-clear", (GCallback) do_playqueue_clear},
+    {"handle-playqueue-is-queued", (GCallback) do_playqueue_is_queued},
+    {"handle-playqueue-remove", (GCallback) do_playqueue_remove},
+    {"handle-position", (GCallback) do_position},
+    {"handle-queue-get-list-pos", (GCallback) do_queue_get_list_pos},
+    {"handle-queue-get-queue-pos", (GCallback) do_queue_get_queue_pos},
+    {"handle-quit", (GCallback) do_quit},
+    {"handle-repeat", (GCallback) do_repeat},
+    {"handle-reverse", (GCallback) do_reverse},
+    {"handle-seek", (GCallback) do_seek},
+    {"handle-set-active-playlist", (GCallback) do_set_active_playlist},
+    {"handle-set-active-playlist-name", (GCallback) do_set_active_playlist_name},
+    {"handle-set-eq", (GCallback) do_set_eq},
+    {"handle-set-eq-band", (GCallback) do_set_eq_band},
+    {"handle-set-eq-preamp", (GCallback) do_set_eq_preamp},
+    {"handle-set-volume", (GCallback) do_set_volume},
+    {"handle-show-about-box", (GCallback) do_show_about_box},
+    {"handle-show-filebrowser", (GCallback) do_show_filebrowser},
+    {"handle-show-jtf-box", (GCallback) do_show_jtf_box},
+    {"handle-show-main-win", (GCallback) do_show_main_win},
+    {"handle-show-prefs-box", (GCallback) do_show_prefs_box},
+    {"handle-shuffle", (GCallback) do_shuffle},
+    {"handle-song-filename", (GCallback) do_song_filename},
+    {"handle-song-frames", (GCallback) do_song_frames},
+    {"handle-song-length", (GCallback) do_song_length},
+    {"handle-song-title", (GCallback) do_song_title},
+    {"handle-song-tuple", (GCallback) do_song_tuple},
+    {"handle-status", (GCallback) do_status},
+    {"handle-stop", (GCallback) do_stop},
+    {"handle-stop-after", (GCallback) do_stop_after},
+    {"handle-stopped", (GCallback) do_stopped},
+    {"handle-time", (GCallback) do_time},
+    {"handle-toggle-auto-advance", (GCallback) do_toggle_auto_advance},
+    {"handle-toggle-repeat", (GCallback) do_toggle_repeat},
+    {"handle-toggle-shuffle", (GCallback) do_toggle_shuffle},
+    {"handle-toggle-stop-after", (GCallback) do_toggle_stop_after},
+    {"handle-version", (GCallback) do_version},
+    {"handle-volume", (GCallback) do_volume}
+};
+
+static GMainLoop * mainloop = nullptr;
+static unsigned owner_id = 0;
+
+static GDBusInterfaceSkeleton * skeleton = nullptr;
+
+static void name_acquired (GDBusConnection *, const char *, void *)
+{
+    AUDINFO ("Owned D-Bus name (org.atheme.audacious) on session bus.\n");
+
+    g_main_loop_quit (mainloop);
+}
+
+static void name_lost (GDBusConnection *, const char *, void *)
+{
+    AUDINFO ("Owning D-Bus name (org.atheme.audacious) failed, already taken?\n");
+
+    g_bus_unown_name (owner_id);
+    owner_id = 0;
+
+    g_main_loop_quit (mainloop);
+}
+
+StartupType dbus_server_init (void)
+{
+    GError * error = nullptr;
+    GDBusConnection * bus = g_bus_get_sync (G_BUS_TYPE_SESSION, nullptr, & error);
+    GMainContext * context;
+
+    if (! bus)
+        goto ERROR;
+
+    skeleton = (GDBusInterfaceSkeleton *) obj_audacious_skeleton_new ();
+
+    for (auto & handler : handlers)
+        g_signal_connect (skeleton, handler.signal, handler.callback, nullptr);
+
+    if (! g_dbus_interface_skeleton_export (skeleton, bus, "/org/atheme/audacious", & error))
+        goto ERROR;
+
+    context = g_main_context_new ();
+    g_main_context_push_thread_default (context);
+
+    owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, "org.atheme.audacious",
+     (GBusNameOwnerFlags) 0, nullptr, name_acquired, name_lost, nullptr, nullptr);
+
+    mainloop = g_main_loop_new (context, true);
+    g_main_loop_run (mainloop);
+    g_main_loop_unref (mainloop);
+    mainloop = nullptr;
+
+    g_main_context_pop_thread_default (context);
+    g_main_context_unref (context);
+
+    if (owner_id)
+        return StartupType::Server;
+
+    dbus_server_cleanup ();
+    return StartupType::Client;
+
+ERROR:
+    if (error)
+    {
+        AUDERR ("D-Bus error: %s\n", error->message);
+        g_error_free (error);
+    }
+
+    dbus_server_cleanup ();
+    return StartupType::Unknown;
+}
+
+void dbus_server_cleanup (void)
+{
+    if (owner_id)
+    {
+        g_bus_unown_name (owner_id);
+        owner_id = 0;
+    }
+
+    if (skeleton)
+    {
+        g_object_unref (skeleton);
+        skeleton = nullptr;
+    }
+}
diff --git a/src/audacious/debug.h b/src/audacious/debug.h
deleted file mode 100644
index 2b372ad5c672..000000000000
--- a/src/audacious/debug.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * debug.h
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_DEBUG_H
-#define AUDACIOUS_DEBUG_H
-
-#include <stdio.h>
-
-#include <audacious/api.h>
-
-#ifdef _AUDACIOUS_CORE
-#define AUDDBG(...) do {if (verbose) {printf ("%s:%d [%s]: ", __FILE__, __LINE__, __FUNCTION__); printf (__VA_ARGS__);}} while (0)
-#else
-#define AUDDBG(...) do {if (* _aud_api_table->verbose) {printf ("%s:%d [%s]: ", __FILE__, __LINE__, __FUNCTION__); printf (__VA_ARGS__);}} while (0)
-#endif
-
-#endif
diff --git a/src/audacious/drct-api.h b/src/audacious/drct-api.h
deleted file mode 100644
index cffaf4b2719b..000000000000
--- a/src/audacious/drct-api.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * drct-api.h
- * Copyright 2010-2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-/* Do not include this file directly; use drct.h instead. */
-
-/* CAUTION: These functions are not thread safe. */
-
-/* --- PROGRAM CONTROL --- */
-
-AUD_VFUNC0 (drct_quit)
-
-/* --- PLAYBACK CONTROL --- */
-
-/* The strings returned by drct_get_filename() and drct_get_title() are pooled
- * and must be freed with str_unref(). */
-
-AUD_VFUNC0 (drct_play)
-AUD_VFUNC0 (drct_play_pause)
-AUD_VFUNC1 (drct_play_playlist, int, playlist)
-AUD_VFUNC0 (drct_pause)
-AUD_VFUNC0 (drct_stop)
-AUD_FUNC0 (bool_t, drct_get_playing)
-AUD_FUNC0 (bool_t, drct_get_ready)
-AUD_FUNC0 (bool_t, drct_get_paused)
-AUD_FUNC0 (char *, drct_get_filename)
-AUD_FUNC0 (char *, drct_get_title)
-AUD_VFUNC3 (drct_get_info, int *, bitrate, int *, samplerate, int *, channels)
-AUD_FUNC0 (int, drct_get_time)
-AUD_FUNC0 (int, drct_get_length)
-AUD_VFUNC1 (drct_seek, int, time)
-
-/* "A-B repeat": when playback reaches point B, it returns to point A (where A
- * and B are in milliseconds).  The value -1 is interpreted as the beginning of
- * the song (for A) or the end of the song (for B).  A-B repeat is disabled
- * entirely by setting both A and B to -1. */
-AUD_VFUNC2 (drct_set_ab_repeat, int, a, int, b)
-AUD_VFUNC2 (drct_get_ab_repeat, int *, a, int *, b)
-
-/* --- VOLUME CONTROL --- */
-
-AUD_VFUNC2 (drct_get_volume, int *, left, int *, right)
-AUD_VFUNC2 (drct_set_volume, int, left, int, right)
-AUD_VFUNC1 (drct_get_volume_main, int *, volume)
-AUD_VFUNC1 (drct_set_volume_main, int, volume)
-AUD_VFUNC1 (drct_get_volume_balance, int *, balance)
-AUD_VFUNC1 (drct_set_volume_balance, int, balance)
-
-/* --- PLAYLIST CONTROL --- */
-
-/* The indexes passed to drct_pl_add_list(), drct_pl_open_list(), and
- * drct_pl_open_temp_list() contain pooled strings to which the caller gives up
- * one reference.  The indexes themselves are freed by these functions. */
-
-AUD_VFUNC0 (drct_pl_next)
-AUD_VFUNC0 (drct_pl_prev)
-
-AUD_VFUNC2 (drct_pl_add, const char *, filename, int, at)
-AUD_VFUNC2 (drct_pl_add_list, Index *, filenames, int, at)
-AUD_VFUNC1 (drct_pl_open, const char *, filename)
-AUD_VFUNC1 (drct_pl_open_list, Index *, filenames)
-AUD_VFUNC1 (drct_pl_open_temp, const char *, filename)
-AUD_VFUNC1 (drct_pl_open_temp_list, Index *, filenames)
diff --git a/src/audacious/drct.c b/src/audacious/drct.c
deleted file mode 100644
index 5fbef8f2ffa9..000000000000
--- a/src/audacious/drct.c
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * drct.c
- * Copyright 2009-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <libaudcore/hook.h>
-#include <libaudcore/vfs.h>
-
-#include "drct.h"
-#include "i18n.h"
-#include "misc.h"
-#include "playlist.h"
-
-/* --- PLAYBACK CONTROL --- */
-
-void drct_play (void)
-{
-    if (drct_get_playing ())
-    {
-        if (drct_get_paused ())
-            drct_pause ();
-        else
-        {
-            int a, b;
-            drct_get_ab_repeat (& a, & b);
-            drct_seek (MAX (a, 0));
-        }
-    }
-    else
-    {
-        int playlist = playlist_get_active ();
-        playlist_set_position (playlist, playlist_get_position (playlist));
-        drct_play_playlist (playlist);
-    }
-}
-
-void drct_play_pause (void)
-{
-    if (drct_get_playing ())
-        drct_pause ();
-    else
-        drct_play ();
-}
-
-void drct_play_playlist (int playlist)
-{
-    playlist_set_playing (playlist);
-    if (drct_get_paused ())
-        drct_pause ();
-}
-
-void drct_stop (void)
-{
-    playlist_set_playing (-1);
-}
-
-/* --- VOLUME CONTROL --- */
-
-void drct_get_volume_main (int * volume)
-{
-    int left, right;
-    drct_get_volume (& left, & right);
-    * volume = MAX (left, right);
-}
-
-void drct_set_volume_main (int volume)
-{
-    int left, right, current;
-    drct_get_volume (& left, & right);
-    current = MAX (left, right);
-
-    if (current > 0)
-        drct_set_volume (volume * left / current, volume * right / current);
-    else
-        drct_set_volume (volume, volume);
-}
-
-void drct_get_volume_balance (int * balance)
-{
-    int left, right;
-    drct_get_volume (& left, & right);
-
-    if (left == right)
-        * balance = 0;
-    else if (left > right)
-        * balance = -100 + right * 100 / left;
-    else
-        * balance = 100 - left * 100 / right;
-}
-
-void drct_set_volume_balance (int balance)
-{
-    int left, right;
-    drct_get_volume_main (& left);
-
-    if (balance < 0)
-        right = left * (100 + balance) / 100;
-    else
-    {
-        right = left;
-        left = right * (100 - balance) / 100;
-    }
-
-    drct_set_volume (left, right);
-}
-
-/* --- PLAYLIST CONTROL --- */
-
-void drct_pl_next (void)
-{
-    int playlist = playlist_get_playing ();
-    if (playlist < 0)
-        playlist = playlist_get_active ();
-
-    playlist_next_song (playlist, get_bool (NULL, "repeat"));
-}
-
-void drct_pl_prev (void)
-{
-    int playlist = playlist_get_playing ();
-    if (playlist < 0)
-        playlist = playlist_get_active ();
-
-    playlist_prev_song (playlist);
-}
-
-static void add_list (Index * filenames, int at, bool_t to_temp, bool_t play)
-{
-    if (to_temp)
-        playlist_set_active (playlist_get_temporary ());
-
-    int playlist = playlist_get_active ();
-
-    /* queue the new entries before deleting the old ones */
-    /* this is to avoid triggering the --quit-after-play condition */
-    playlist_entry_insert_batch (playlist, at, filenames, NULL, play);
-
-    if (play)
-    {
-        if (get_bool (NULL, "clear_playlist"))
-            playlist_entry_delete (playlist, 0, playlist_entry_count (playlist));
-        else
-            playlist_queue_delete (playlist, 0, playlist_queue_count (playlist));
-    }
-}
-
-void drct_pl_add (const char * filename, int at)
-{
-    Index * filenames = index_new ();
-    index_insert (filenames, -1, str_get (filename));
-    add_list (filenames, at, FALSE, FALSE);
-}
-
-void drct_pl_add_list (Index * filenames, int at)
-{
-    add_list (filenames, at, FALSE, FALSE);
-}
-
-void drct_pl_open (const char * filename)
-{
-    Index * filenames = index_new ();
-    index_insert (filenames, -1, str_get (filename));
-    add_list (filenames, -1, get_bool (NULL, "open_to_temporary"), TRUE);
-}
-
-void drct_pl_open_list (Index * filenames)
-{
-    add_list (filenames, -1, get_bool (NULL, "open_to_temporary"), TRUE);
-}
-
-void drct_pl_open_temp (const char * filename)
-{
-    Index * filenames = index_new ();
-    index_insert (filenames, -1, str_get (filename));
-    add_list (filenames, -1, TRUE, TRUE);
-}
-
-void drct_pl_open_temp_list (Index * filenames)
-{
-    add_list (filenames, -1, TRUE, TRUE);
-}
diff --git a/src/audacious/drct.h b/src/audacious/drct.h
deleted file mode 100644
index 836a9bcc2bfa..000000000000
--- a/src/audacious/drct.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * drct.h
- * Copyright 2010 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_DRCT_H
-#define AUDACIOUS_DRCT_H
-
-#include <audacious/api.h>
-#include <libaudcore/core.h>
-#include <libaudcore/index.h>
-
-#define AUD_API_NAME DRCTAPI
-#define AUD_API_SYMBOL drct_api
-
-#ifdef _AUDACIOUS_CORE
-
-#include "api-local-begin.h"
-#include "drct-api.h"
-#include "api-local-end.h"
-
-#else
-
-#include <audacious/api-define-begin.h>
-#include <audacious/drct-api.h>
-#include <audacious/api-define-end.h>
-
-#include <audacious/api-alias-begin.h>
-#include <audacious/drct-api.h>
-#include <audacious/api-alias-end.h>
-
-#endif
-
-#undef AUD_API_NAME
-#undef AUD_API_SYMBOL
-
-#endif
-
-#ifdef AUD_API_DECLARE
-
-#define AUD_API_NAME DRCTAPI
-#define AUD_API_SYMBOL drct_api
-
-#include "api-define-begin.h"
-#include "drct-api.h"
-#include "api-define-end.h"
-
-#include "api-declare-begin.h"
-#include "drct-api.h"
-#include "api-declare-end.h"
-
-#undef AUD_API_NAME
-#undef AUD_API_SYMBOL
-
-#endif
diff --git a/src/audacious/effect.c b/src/audacious/effect.c
deleted file mode 100644
index 7d34368cb934..000000000000
--- a/src/audacious/effect.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * effect.c
- * Copyright 2010-2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <pthread.h>
-
-#include "debug.h"
-#include "drct.h"
-#include "effect.h"
-#include "misc.h"
-#include "plugin.h"
-#include "plugins.h"
-
-typedef struct {
-    PluginHandle * plugin;
-    EffectPlugin * header;
-    int channels_returned, rate_returned;
-    bool_t remove_flag;
-} RunningEffect;
-
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-static GList * running_effects = NULL; /* (RunningEffect *) */
-static int input_channels, input_rate;
-
-typedef struct {
-    int * channels, * rate;
-} EffectStartState;
-
-static bool_t effect_start_cb (PluginHandle * plugin, EffectStartState * state)
-{
-    AUDDBG ("Starting %s at %d channels, %d Hz.\n", plugin_get_name (plugin),
-     * state->channels, * state->rate);
-    EffectPlugin * header = plugin_get_header (plugin);
-    g_return_val_if_fail (header != NULL, TRUE);
-    header->start (state->channels, state->rate);
-
-    RunningEffect * effect = g_slice_new (RunningEffect);
-    effect->plugin = plugin;
-    effect->header = header;
-    effect->channels_returned = * state->channels;
-    effect->rate_returned = * state->rate;
-    effect->remove_flag = FALSE;
-
-    running_effects = g_list_prepend (running_effects, effect);
-    return TRUE;
-}
-
-void effect_start (int * channels, int * rate)
-{
-    pthread_mutex_lock (& mutex);
-
-    AUDDBG ("Starting effects.\n");
-
-    for (GList * node = running_effects; node; node = node->next)
-        g_slice_free (RunningEffect, node->data);
-
-    g_list_free (running_effects);
-    running_effects = NULL;
-
-    input_channels = * channels;
-    input_rate = * rate;
-
-    EffectStartState state = {channels, rate};
-    plugin_for_enabled (PLUGIN_TYPE_EFFECT, (PluginForEachFunc) effect_start_cb,
-     & state);
-    running_effects = g_list_reverse (running_effects);
-
-    pthread_mutex_unlock (& mutex);
-}
-
-typedef struct {
-    float * * data;
-    int * samples;
-} EffectProcessState;
-
-static void effect_process_cb (RunningEffect * effect, EffectProcessState *
- state)
-{
-    if (effect->remove_flag)
-    {
-        /* call finish twice to completely drain buffers */
-        effect->header->finish (state->data, state->samples);
-        effect->header->finish (state->data, state->samples);
-
-        running_effects = g_list_remove (running_effects, effect);
-        g_slice_free (RunningEffect, effect);
-    }
-    else
-        effect->header->process (state->data, state->samples);
-}
-
-void effect_process (float * * data, int * samples)
-{
-    pthread_mutex_lock (& mutex);
-
-    EffectProcessState state = {data, samples};
-    g_list_foreach (running_effects, (GFunc) effect_process_cb, & state);
-
-    pthread_mutex_unlock (& mutex);
-}
-
-void effect_flush (void)
-{
-    pthread_mutex_lock (& mutex);
-
-    for (GList * node = running_effects; node != NULL; node = node->next)
-    {
-        if (PLUGIN_HAS_FUNC (((RunningEffect *) node->data)->header, flush))
-            ((RunningEffect *) node->data)->header->flush ();
-    }
-
-    pthread_mutex_unlock (& mutex);
-}
-
-void effect_finish (float * * data, int * samples)
-{
-    pthread_mutex_lock (& mutex);
-
-    for (GList * node = running_effects; node != NULL; node = node->next)
-        ((RunningEffect *) node->data)->header->finish (data, samples);
-
-    pthread_mutex_unlock (& mutex);
-}
-
-int effect_adjust_delay (int delay)
-{
-    pthread_mutex_lock (& mutex);
-
-    for (GList * node = g_list_last (running_effects); node != NULL; node = node->prev)
-    {
-        if (PLUGIN_HAS_FUNC (((RunningEffect *) node->data)->header, adjust_delay))
-            delay = ((RunningEffect *) node->data)->header->adjust_delay (delay);
-    }
-
-    pthread_mutex_unlock (& mutex);
-    return delay;
-}
-
-static int effect_find_cb (RunningEffect * effect, PluginHandle * plugin)
-{
-    return (effect->plugin == plugin) ? 0 : -1;
-}
-
-static int effect_compare (RunningEffect * a, RunningEffect * b)
-{
-    return plugin_compare (a->plugin, b->plugin);
-}
-
-static void effect_insert (PluginHandle * plugin, EffectPlugin * header)
-{
-    GList * node = g_list_find_custom (running_effects, plugin, (GCompareFunc) effect_find_cb);
-
-    if (node)
-    {
-        ((RunningEffect *) node->data)->remove_flag = FALSE;
-        return;
-    }
-
-    AUDDBG ("Adding %s without reset.\n", plugin_get_name (plugin));
-    RunningEffect * effect = g_slice_new (RunningEffect);
-    effect->plugin = plugin;
-    effect->header = header;
-    effect->remove_flag = FALSE;
-
-    running_effects = g_list_insert_sorted (running_effects, effect,
-     (GCompareFunc) effect_compare);
-    node = g_list_find (running_effects, effect);
-
-    int channels, rate;
-    if (node->prev != NULL)
-    {
-        RunningEffect * prev = node->prev->data;
-        AUDDBG ("Added %s after %s.\n", plugin_get_name (plugin),
-         plugin_get_name (prev->plugin));
-        channels = prev->channels_returned;
-        rate = prev->rate_returned;
-    }
-    else
-    {
-        AUDDBG ("Added %s as first effect.\n", plugin_get_name (plugin));
-        channels = input_channels;
-        rate = input_rate;
-    }
-
-    AUDDBG ("Starting %s at %d channels, %d Hz.\n", plugin_get_name (plugin),
-     channels, rate);
-    header->start (& channels, & rate);
-    effect->channels_returned = channels;
-    effect->rate_returned = rate;
-}
-
-static void effect_remove (PluginHandle * plugin)
-{
-    GList * node = g_list_find_custom (running_effects, plugin, (GCompareFunc)
-     effect_find_cb);
-    if (node == NULL)
-        return;
-
-    AUDDBG ("Removing %s without reset.\n", plugin_get_name (plugin));
-    ((RunningEffect *) node->data)->remove_flag = TRUE;
-}
-
-static void effect_enable (PluginHandle * plugin, EffectPlugin * ep, bool_t
- enable)
-{
-    if (ep->preserves_format)
-    {
-        pthread_mutex_lock (& mutex);
-
-        if (enable)
-            effect_insert (plugin, ep);
-        else
-            effect_remove (plugin);
-
-        pthread_mutex_unlock (& mutex);
-    }
-    else
-    {
-        AUDDBG ("Reset to add/remove %s.\n", plugin_get_name (plugin));
-        output_reset (OUTPUT_RESET_EFFECTS_ONLY);
-    }
-}
-
-bool_t effect_plugin_start (PluginHandle * plugin)
-{
-    if (drct_get_playing ())
-    {
-        EffectPlugin * ep = plugin_get_header (plugin);
-        g_return_val_if_fail (ep != NULL, FALSE);
-        effect_enable (plugin, ep, TRUE);
-    }
-
-    return TRUE;
-}
-
-void effect_plugin_stop (PluginHandle * plugin)
-{
-    if (drct_get_playing ())
-    {
-        EffectPlugin * ep = plugin_get_header (plugin);
-        g_return_if_fail (ep != NULL);
-        effect_enable (plugin, ep, FALSE);
-    }
-}
diff --git a/src/audacious/effect.h b/src/audacious/effect.h
deleted file mode 100644
index 2a0add982a4f..000000000000
--- a/src/audacious/effect.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * effect.h
- * Copyright 2010-2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_EFFECT_H
-#define AUDACIOUS_EFFECT_H
-
-#include <libaudcore/core.h>
-
-#include "types.h"
-
-void effect_start (int * channels, int * rate);
-void effect_process (float * * data, int * samples);
-void effect_flush (void);
-void effect_finish (float * * data, int * samples);
-int effect_adjust_delay (int delay);
-
-bool_t effect_plugin_start (PluginHandle * plugin);
-void effect_plugin_stop (PluginHandle * plugin);
-
-#endif
diff --git a/src/audacious/equalizer.c b/src/audacious/equalizer.c
deleted file mode 100644
index 1b74f31eff09..000000000000
--- a/src/audacious/equalizer.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * equalizer.c
- * Copyright 2001 Anders Johansson
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-/*
- * Anders Johansson prefers float *ptr; formatting. Please keep it that way.
- *    - tallica
- */
-
-#include <glib.h>
-#include <math.h>
-#include <pthread.h>
-#include <string.h>
-
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-
-#include "equalizer.h"
-#include "misc.h"
-#include "types.h"
-
-#define EQ_BANDS AUD_EQUALIZER_NBANDS
-#define MAX_CHANNELS 10
-
-/* Q value for band-pass filters 1.2247 = (3/2)^(1/2)
- * Gives 4 dB suppression at Fc*2 and Fc/2 */
-#define Q 1.2247449
-
-/* Center frequencies for band-pass filters (Hz) */
-/* These are not the historical WinAmp frequencies, because the IIR filters used
- * here are designed for each frequency to be twice the previous.  Using WinAmp
- * frequencies leads to too much gain in some bands and too little in others. */
-static const float CF[EQ_BANDS] = {31.25, 62.5, 125, 250, 500, 1000, 2000,
- 4000, 8000, 16000};
-
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-static bool_t active;
-static int channels, rate;
-static float a[EQ_BANDS][2]; /* A weights */
-static float b[EQ_BANDS][2]; /* B weights */
-static float wqv[MAX_CHANNELS][EQ_BANDS][2]; /* Circular buffer for W data */
-static float gv[MAX_CHANNELS][EQ_BANDS]; /* Gain factor for each channel and band */
-static int K; /* Number of used eq bands */
-
-/* 2nd order band-pass filter design */
-static void bp2 (float *a, float *b, float fc, float q)
-{
-    float th = 2 * M_PI * fc;
-    float C = (1 - tanf (th * q / 2)) / (1 + tanf (th * q / 2));
-
-    a[0] = (1 + C) * cosf (th);
-    a[1] = -C;
-    b[0] = (1 - C) / 2;
-    b[1] = -1.005;
-}
-
-void eq_set_format (int new_channels, int new_rate)
-{
-    int k;
-
-    pthread_mutex_lock (& mutex);
-
-    channels = new_channels;
-    rate = new_rate;
-
-    /* Calculate number of active filters */
-    K = EQ_BANDS;
-
-    while (CF[K - 1] > (float) rate / 2.2)
-        K --;
-
-    /* Generate filter taps */
-    for (k = 0; k < K; k ++)
-        bp2 (a[k], b[k], CF[k] / (float) rate, Q);
-
-    /* Reset state */
-    memset (wqv[0][0], 0, sizeof wqv);
-
-    pthread_mutex_unlock (& mutex);
-}
-
-static void eq_set_bands_real (double preamp, double *values)
-{
-    float adj[EQ_BANDS];
-    for (int i = 0; i < EQ_BANDS; i ++)
-        adj[i] = preamp + values[i];
-
-    for (int c = 0; c < MAX_CHANNELS; c ++)
-    for (int i = 0; i < EQ_BANDS; i ++)
-        gv[c][i] = pow (10, adj[i] / 20) - 1;
-}
-
-void eq_filter (float *data, int samples)
-{
-    int channel;
-
-    pthread_mutex_lock (& mutex);
-
-    if (! active)
-    {
-        pthread_mutex_unlock (& mutex);
-        return;
-    }
-
-    for (channel = 0; channel < channels; channel ++)
-    {
-        float *g = gv[channel]; /* Gain factor */
-        float *end = data + samples;
-        float *f;
-
-        for (f = data + channel; f < end; f += channels)
-        {
-            int k; /* Frequency band index */
-            float yt = *f; /* Current input sample */
-
-            for (k = 0; k < K; k ++)
-            {
-                /* Pointer to circular buffer wq */
-                float *wq = wqv[channel][k];
-                /* Calculate output from AR part of current filter */
-                float w = yt * b[k][0] + wq[0] * a[k][0] + wq[1] * a[k][1];
-
-                /* Calculate output from MA part of current filter */
-                yt += (w + wq[1] * b[k][1]) * g[k];
-
-                /* Update circular buffer */
-                wq[1] = wq[0];
-                wq[0] = w;
-            }
-
-            /* Calculate output */
-            *f = yt;
-        }
-    }
-
-    pthread_mutex_unlock (& mutex);
-}
-
-static void eq_update (void *data, void *user)
-{
-    pthread_mutex_lock (& mutex);
-
-    active = get_bool (NULL, "equalizer_active");
-
-    double values[EQ_BANDS];
-    eq_get_bands (values);
-    eq_set_bands_real (get_double (NULL, "equalizer_preamp"), values);
-
-    pthread_mutex_unlock (& mutex);
-}
-
-void eq_init (void)
-{
-    eq_update (NULL, NULL);
-    hook_associate ("set equalizer_active", eq_update, NULL);
-    hook_associate ("set equalizer_preamp", eq_update, NULL);
-    hook_associate ("set equalizer_bands", eq_update, NULL);
-}
-
-void eq_cleanup (void)
-{
-    hook_dissociate ("set equalizer_active", eq_update);
-    hook_dissociate ("set equalizer_preamp", eq_update);
-    hook_dissociate ("set equalizer_bands", eq_update);
-}
-
-void eq_set_bands (const double *values)
-{
-    char *string = double_array_to_str (values, EQ_BANDS);
-    g_return_if_fail (string);
-    set_str (NULL, "equalizer_bands", string);
-    str_unref (string);
-}
-
-void eq_get_bands (double *values)
-{
-    memset (values, 0, sizeof (double) * EQ_BANDS);
-    char *string = get_str (NULL, "equalizer_bands");
-    str_to_double_array (string, values, EQ_BANDS);
-    str_unref (string);
-}
-
-void eq_set_band (int band, double value)
-{
-    g_return_if_fail (band >= 0 && band < EQ_BANDS);
-    double values[EQ_BANDS];
-    eq_get_bands (values);
-    values[band] = value;
-    eq_set_bands (values);
-}
-
-double eq_get_band (int band)
-{
-    g_return_val_if_fail (band >= 0 && band < EQ_BANDS, 0);
-    double values[EQ_BANDS];
-    eq_get_bands (values);
-    return values[band];
-}
diff --git a/src/audacious/equalizer.h b/src/audacious/equalizer.h
deleted file mode 100644
index 3acb472323fa..000000000000
--- a/src/audacious/equalizer.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * equalizer.h
- * Copyright 2010 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_EQUALIZER_H
-#define AUDACIOUS_EQUALIZER_H
-
-void eq_init (void);
-void eq_cleanup (void);
-void eq_set_format (int new_channels, int new_rate);
-void eq_filter (float * data, int samples);
-
-#endif
diff --git a/src/audacious/equalizer_preset.c b/src/audacious/equalizer_preset.c
deleted file mode 100644
index 6c70eb873e53..000000000000
--- a/src/audacious/equalizer_preset.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * equalizer_preset.c
- * Copyright 2003-2013 Eugene Zagidullin, William Pitcock, John Lindgren, and
- *                     Thomas Lange
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <math.h>
-#include <string.h>
-
-#include <libaudcore/audstrings.h>
-
-#include "debug.h"
-#include "i18n.h"
-#include "misc.h"
-
-EqualizerPreset * equalizer_preset_new (const char * name)
-{
-    EqualizerPreset * preset = g_slice_new0 (EqualizerPreset);
-    preset->name = str_get (name);
-    return preset;
-}
-
-void equalizer_preset_free (EqualizerPreset * preset)
-{
-    str_unref (preset->name);
-    g_slice_free (EqualizerPreset, preset);
-}
-
-Index * equalizer_read_presets (const char * basename)
-{
-    GKeyFile * rcfile = g_key_file_new ();
-
-    char * filename = filename_build (get_path (AUD_PATH_USER_DIR), basename);
-
-    if (! g_key_file_load_from_file (rcfile, filename, G_KEY_FILE_NONE, NULL))
-    {
-        str_unref (filename);
-        filename = filename_build (get_path (AUD_PATH_DATA_DIR), basename);
-
-        if (! g_key_file_load_from_file (rcfile, filename, G_KEY_FILE_NONE, NULL))
-        {
-            str_unref (filename);
-            g_key_file_free (rcfile);
-            return NULL;
-        }
-    }
-
-    str_unref (filename);
-
-    Index * list = index_new ();
-
-    for (int p = 0;; p ++)
-    {
-        SPRINTF (section, "Preset%d", p);
-
-        char * name = g_key_file_get_string (rcfile, "Presets", section, NULL);
-        if (! name)
-            break;
-
-        EqualizerPreset * preset = equalizer_preset_new (name);
-        preset->preamp = g_key_file_get_double (rcfile, name, "Preamp", NULL);
-
-        for (int i = 0; i < AUD_EQUALIZER_NBANDS; i++)
-        {
-            SPRINTF (band, "Band%d", i);
-            preset->bands[i] = g_key_file_get_double (rcfile, name, band, NULL);
-        }
-
-        index_insert (list, -1, preset);
-
-        g_free (name);
-    }
-
-    g_key_file_free (rcfile);
-
-    return list;
-}
-
-bool_t equalizer_write_presets (Index * list, const char * basename)
-{
-    GKeyFile * rcfile = g_key_file_new ();
-
-    for (int p = 0; p < index_count (list); p ++)
-    {
-        EqualizerPreset * preset = index_get (list, p);
-
-        SPRINTF (tmp, "Preset%d", p);
-        g_key_file_set_string (rcfile, "Presets", tmp, preset->name);
-        g_key_file_set_double (rcfile, preset->name, "Preamp", preset->preamp);
-
-        for (int i = 0; i < AUD_EQUALIZER_NBANDS; i ++)
-        {
-            SPRINTF (tmp, "Band%d", i);
-            g_key_file_set_double (rcfile, preset->name, tmp, preset->bands[i]);
-        }
-    }
-
-    size_t len;
-    char * data = g_key_file_to_data (rcfile, & len, NULL);
-
-    char * filename = filename_build (get_path (AUD_PATH_USER_DIR), basename);
-    bool_t success = g_file_set_contents (filename, data, len, NULL);
-    str_unref (filename);
-
-    g_key_file_free (rcfile);
-    g_free (data);
-
-    return success;
-}
-
-/* Note: Winamp 2.x had a +/- 20 dB range.
- *       Winamp 5.x had a +/- 12 dB range, which we use here. */
-#define FROM_WINAMP_VAL(x)  ((31.5 - (x)) * (12.0 / 31.5))
-#define TO_WINAMP_VAL(x)  (round (31.5 - (x) * (31.5 / 12.0)))
-
-Index * import_winamp_presets (VFSFile * file)
-{
-    char header[31];
-    char bands[11];
-    char preset_name[181];
-
-    if (vfs_fread (header, 1, sizeof header, file) != sizeof header ||
-     strncmp (header, "Winamp EQ library file v1.1", 27))
-        return NULL;
-
-    Index * list = index_new ();
-
-    while (vfs_fread (preset_name, 1, 180, file) == 180)
-    {
-        preset_name[180] = 0; /* protect against buffer overflow */
-
-        if (vfs_fseek (file, 77, SEEK_CUR)) /* unknown crap --asphyx */
-            break;
-
-        if (vfs_fread (bands, 1, 11, file) != 11)
-            break;
-
-        EqualizerPreset * preset = equalizer_preset_new (preset_name);
-        preset->preamp = FROM_WINAMP_VAL (bands[10]);
-
-        for (int i = 0; i < AUD_EQUALIZER_NBANDS; i ++)
-            preset->bands[i] = FROM_WINAMP_VAL (bands[i]);
-
-        index_insert (list, -1, preset);
-    }
-
-    return list;
-}
-
-bool_t export_winamp_preset (EqualizerPreset * preset, VFSFile * file)
-{
-    char name[257];
-    char bands[11];
-
-    if (vfs_fwrite ("Winamp EQ library file v1.1\x1a!--", 1, 31, file) != 31)
-        return FALSE;
-
-    strncpy (name, preset->name, 257);
-
-    if (vfs_fwrite (name, 1, 257, file) != 257)
-        return FALSE;
-
-    for (int i = 0; i < AUD_EQUALIZER_NBANDS; i ++)
-        bands[i] = TO_WINAMP_VAL (preset->bands[i]);
-
-    bands[10] = TO_WINAMP_VAL (preset->preamp);
-
-    if (vfs_fwrite (bands, 1, 11, file) != 11)
-        return FALSE;
-
-    return TRUE;
-}
-
-bool_t save_preset_file (EqualizerPreset * preset, const char * filename)
-{
-    GKeyFile * rcfile = g_key_file_new ();
-
-    g_key_file_set_double (rcfile, "Equalizer preset", "Preamp", preset->preamp);
-
-    for (int i = 0; i < AUD_EQUALIZER_NBANDS; i ++)
-    {
-        SPRINTF (tmp, "Band%d", i);
-        g_key_file_set_double (rcfile, "Equalizer preset", tmp, preset->bands[i]);
-    }
-
-    size_t len;
-    char * data = g_key_file_to_data (rcfile, & len, NULL);
-
-    VFSFile * file = vfs_fopen (filename, "w");
-    bool_t success = FALSE;
-
-    if (file)
-    {
-        success = (vfs_fwrite (data, 1, len, file) == len);
-        vfs_fclose (file);
-    }
-
-    g_key_file_free (rcfile);
-    g_free (data);
-
-    return success;
-}
-
-EqualizerPreset * load_preset_file (const char * filename)
-{
-    GKeyFile * rcfile = g_key_file_new ();
-
-    if (! g_key_file_load_from_file (rcfile, filename, G_KEY_FILE_NONE, NULL))
-    {
-        g_key_file_free (rcfile);
-        return NULL;
-    }
-
-    EqualizerPreset * preset = equalizer_preset_new ("");
-
-    preset->preamp = g_key_file_get_double (rcfile, "Equalizer preset", "Preamp", NULL);
-
-    for (int i = 0; i < AUD_EQUALIZER_NBANDS; i ++)
-    {
-        SPRINTF (tmp, "Band%d", i);
-        preset->bands[i] = g_key_file_get_double (rcfile, "Equalizer preset", tmp, NULL);
-    }
-
-    g_key_file_free (rcfile);
-
-    return preset;
-}
diff --git a/src/audacious/fft.c b/src/audacious/fft.c
deleted file mode 100644
index 09a660293d9c..000000000000
--- a/src/audacious/fft.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * fft.c
- * Copyright 2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <complex.h>
-#include <math.h>
-
-#include "fft.h"
-
-#define N 512                         /* size of the DFT */
-#define LOGN 9                        /* log N (base 2) */
-
-static float hamming[N];              /* hamming window, scaled to sum to 1 */
-static int reversed[N];               /* bit-reversal table */
-static float complex roots[N / 2];    /* N-th roots of unity */
-static char generated = 0;            /* set if tables have been generated */
-
-/* Reverse the order of the lowest LOGN bits in an integer. */
-
-static int bit_reverse (int x)
-{
-    int y = 0;
-
-    for (int n = LOGN; n --; )
-    {
-        y = (y << 1) | (x & 1);
-        x >>= 1;
-    }
-
-    return y;
-}
-
-/* Generate lookup tables. */
-
-static void generate_tables (void)
-{
-    if (generated)
-        return;
-
-    for (int n = 0; n < N; n ++)
-        hamming[n] = 1 - 0.85 * cosf (2 * M_PI * n / N);
-    for (int n = 0; n < N; n ++)
-        reversed[n] = bit_reverse (n);
-    for (int n = 0; n < N / 2; n ++)
-        roots[n] = cexpf (2 * M_PI * I * n / N);
-
-    generated = 1;
-}
-
-/* Perform the DFT using the Cooley-Tukey algorithm.  At each step s, where
- * s=1..log N (base 2), there are N/(2^s) groups of intertwined butterfly
- * operations.  Each group contains (2^s)/2 butterflies, and each butterfly has
- * a span of (2^s)/2.  The twiddle factors are nth roots of unity where n = 2^s. */
-
-static void do_fft (float complex a[N])
-{
-    int half = 1;       /* (2^s)/2 */
-    int inv = N / 2;    /* N/(2^s) */
-
-    /* loop through steps */
-    while (inv)
-    {
-        /* loop through groups */
-        for (int g = 0; g < N; g += half << 1)
-        {
-            /* loop through butterflies */
-            for (int b = 0, r = 0; b < half; b ++, r += inv)
-            {
-                float complex even = a[g + b];
-                float complex odd = roots[r] * a[g + half + b];
-                a[g + b] = even + odd;
-                a[g + half + b] = even - odd;
-            }
-        }
-
-        half <<= 1;
-        inv >>= 1;
-    }
-}
-
-/* Input is N=512 PCM samples.
- * Output is intensity of frequencies from 1 to N/2=256. */
-
-void calc_freq (const float data[N], float freq[N / 2])
-{
-    generate_tables ();
-
-    /* input is filtered by a Hamming window */
-    /* input values are in bit-reversed order */
-    float complex a[N];
-    for (int n = 0; n < N; n ++)
-        a[reversed[n]] = data[n] * hamming[n];
-
-    do_fft (a);
-
-    /* output values are divided by N */
-    /* frequencies from 1 to N/2-1 are doubled */
-    for (int n = 0; n < N / 2 - 1; n ++)
-        freq[n] = 2 * cabsf (a[1 + n]) / N;
-
-    /* frequency N/2 is not doubled */
-    freq[N / 2 - 1] = cabsf (a[N / 2]) / N;
-}
diff --git a/src/audacious/fft.h b/src/audacious/fft.h
deleted file mode 100644
index bb8cba3edc34..000000000000
--- a/src/audacious/fft.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * fft.h
- * Copyright 2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_FFT_H
-#define AUDACIOUS_FFT_H
-
-void calc_freq (const float data[512], float freq[256]);
-
-#endif
diff --git a/src/audacious/general.c b/src/audacious/general.c
deleted file mode 100644
index e0b9ea25ee98..000000000000
--- a/src/audacious/general.c
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * general.c
- * Copyright 2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gtk/gtk.h>
-
-#include "debug.h"
-#include "general.h"
-#include "interface.h"
-#include "plugin.h"
-#include "plugins.h"
-#include "ui_preferences.h"
-
-typedef struct {
-    PluginHandle * plugin;
-    GeneralPlugin * gp;
-    GtkWidget * widget;
-} LoadedGeneral;
-
-static int running = FALSE;
-static GList * loaded_general_plugins = NULL;
-
-static int general_find_cb (LoadedGeneral * general, PluginHandle * plugin)
-{
-    return (general->plugin == plugin) ? 0 : -1;
-}
-
-static void general_load (PluginHandle * plugin)
-{
-    GList * node = g_list_find_custom (loaded_general_plugins, plugin,
-     (GCompareFunc) general_find_cb);
-    if (node != NULL)
-        return;
-
-    AUDDBG ("Loading %s.\n", plugin_get_name (plugin));
-    GeneralPlugin * gp = plugin_get_header (plugin);
-    g_return_if_fail (gp != NULL);
-
-    LoadedGeneral * general = g_slice_new (LoadedGeneral);
-    general->plugin = plugin;
-    general->gp = gp;
-    general->widget = NULL;
-
-    if (gp->get_widget != NULL)
-        general->widget = gp->get_widget ();
-
-    if (general->widget != NULL)
-    {
-        AUDDBG ("Adding %s to interface.\n", plugin_get_name (plugin));
-        g_signal_connect (general->widget, "destroy", (GCallback)
-         gtk_widget_destroyed, & general->widget);
-        interface_add_plugin_widget (plugin, general->widget);
-    }
-
-    loaded_general_plugins = g_list_prepend (loaded_general_plugins, general);
-}
-
-static void general_unload (PluginHandle * plugin)
-{
-    GList * node = g_list_find_custom (loaded_general_plugins, plugin,
-     (GCompareFunc) general_find_cb);
-    if (node == NULL)
-        return;
-
-    AUDDBG ("Unloading %s.\n", plugin_get_name (plugin));
-    LoadedGeneral * general = node->data;
-    loaded_general_plugins = g_list_delete_link (loaded_general_plugins, node);
-
-    if (general->widget != NULL)
-    {
-        AUDDBG ("Removing %s from interface.\n", plugin_get_name (plugin));
-        interface_remove_plugin_widget (plugin, general->widget);
-        g_return_if_fail (general->widget == NULL); /* not destroyed? */
-    }
-
-    g_slice_free (LoadedGeneral, general);
-}
-
-static bool_t general_init_cb (PluginHandle * plugin)
-{
-    general_load (plugin);
-    return TRUE;
-}
-
-void general_init (void)
-{
-    g_return_if_fail (! running);
-    running = TRUE;
-
-    plugin_for_enabled (PLUGIN_TYPE_GENERAL, (PluginForEachFunc)
-     general_init_cb, NULL);
-}
-
-static void general_cleanup_cb (LoadedGeneral * general)
-{
-    general_unload (general->plugin);
-}
-
-void general_cleanup (void)
-{
-    g_return_if_fail (running);
-    running = FALSE;
-
-    g_list_foreach (loaded_general_plugins, (GFunc) general_cleanup_cb, NULL);
-}
-
-bool_t general_plugin_start (PluginHandle * plugin)
-{
-    GeneralPlugin * gp = plugin_get_header (plugin);
-    g_return_val_if_fail (gp != NULL, FALSE);
-
-    if (gp->init != NULL && ! gp->init ())
-        return FALSE;
-
-    if (running)
-        general_load (plugin);
-
-    return TRUE;
-}
-
-void general_plugin_stop (PluginHandle * plugin)
-{
-    GeneralPlugin * gp = plugin_get_header (plugin);
-    g_return_if_fail (gp != NULL);
-
-    if (running)
-        general_unload (plugin);
-
-    if (gp->cleanup != NULL)
-        gp->cleanup ();
-}
-
-PluginHandle * general_plugin_by_widget (/* GtkWidget * */ void * widget)
-{
-    g_return_val_if_fail (widget, NULL);
-
-    for (GList * node = loaded_general_plugins; node; node = node->next)
-    {
-        LoadedGeneral * general = node->data;
-        if (general->widget == widget)
-            return general->plugin;
-    }
-
-    return NULL;
-}
diff --git a/src/audacious/general.h b/src/audacious/general.h
deleted file mode 100644
index c9a7c9e84f00..000000000000
--- a/src/audacious/general.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * general.h
- * Copyright 2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_GENERAL_H
-#define AUDACIOUS_GENERAL_H
-
-#include "plugins.h"
-
-void general_init (void);
-void general_cleanup (void);
-
-bool_t general_plugin_start (PluginHandle * plugin);
-void general_plugin_stop (PluginHandle * plugin);
-
-PluginHandle * general_plugin_by_widget (/* GtkWidget * */ void * widget);
-
-#endif
diff --git a/src/audacious/history.c b/src/audacious/history.c
deleted file mode 100644
index 4dde3686bbd3..000000000000
--- a/src/audacious/history.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * history.c
- * Copyright 2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <libaudcore/hook.h>
-
-#include "main.h"
-#include "misc.h"
-
-#define MAX_ENTRIES 30
-
-static GQueue history = G_QUEUE_INIT;
-static bool_t loaded, modified;
-
-static void history_save (void)
-{
-    if (! modified)
-        return;
-
-    GList * node = history.head;
-    for (int i = 0; i < MAX_ENTRIES; i ++)
-    {
-        if (! node)
-            break;
-
-        char name[32];
-        snprintf (name, sizeof name, "entry%d", i);
-        set_str ("history", name, node->data);
-
-        node = node->next;
-    }
-
-    modified = FALSE;
-}
-
-static void history_load (void)
-{
-    if (loaded)
-        return;
-
-    for (int i = 0; ; i ++)
-    {
-        char name[32];
-        snprintf (name, sizeof name, "entry%d", i);
-        char * path = get_str ("history", name);
-
-        if (! path[0])
-        {
-            str_unref (path);
-            break;
-        }
-
-        g_queue_push_tail (& history, path);
-    }
-
-    loaded = TRUE;
-    hook_associate ("config save", (HookFunction) history_save, NULL);
-}
-
-void history_cleanup (void)
-{
-    if (! loaded)
-        return;
-
-    hook_dissociate ("config save", (HookFunction) history_save);
-
-    g_queue_foreach (& history, (GFunc) str_unref, NULL);
-    g_queue_clear (& history);
-
-    loaded = FALSE;
-    modified = FALSE;
-}
-
-const char * history_get (int entry)
-{
-    history_load ();
-    return g_queue_peek_nth (& history, entry);
-}
-
-void history_add (const char * path)
-{
-    history_load ();
-
-    GList * next;
-    for (GList * node = history.head; node; node = next)
-    {
-        next = node->next;
-        if (! strcmp (node->data, path))
-        {
-            str_unref (node->data);
-            g_queue_delete_link (& history, node);
-        }
-    }
-
-    g_queue_push_head (& history, str_get (path));
-    modified = TRUE;
-}
diff --git a/src/audacious/i18n.h b/src/audacious/i18n.h
deleted file mode 100644
index 5b5205c26dd9..000000000000
--- a/src/audacious/i18n.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * i18n.h
- * Copyright 2007 William Pitcock
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_I18N_H
-#define AUDACIOUS_I18N_H
-
-#include <libintl.h>
-
-#define _(String) dgettext (PACKAGE, String)
-#ifdef gettext_noop
-#define N_(String) gettext_noop (String)
-#else
-#define N_(String) (String)
-#endif
-
-#endif /* AUDACIOUS_I18N_H */
diff --git a/src/audacious/images/about-logo.png b/src/audacious/images/about-logo.png
deleted file mode 100644
index 32fb69faa57b204783f0c9455c0a5bb0ccd2ab0a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 20019
zcmafbWmHvL*zTs0Qt1u}=?+0kx&@?LLb^MoySt^~sFWZ`hzLqIC at I|_D5WS8_ub!j
z at 9(Q)92sZecCESQe4kvzX=*6q<51!t5D0u_B{^*b0;L|lHp9k*|7K1V+=4$)Jhc^N
z5OrhJdk6$QLRs#Sj^DzesjpwA?(bmRsb^EN0oZqpSY at QqKi!kZh at 3EqEh($xo<<GF
z{U}dNN=$;yT0<WmN+>O_qsfMux~#f*$4D?rkWePz1yjc0<@LaajE5pCBB$!A2EJpb
zLF3X at OKmG{I}-4_2zRcR+ovJH^uUtr{r~^VN<;Z)#i;LdUlAGo)0s#9&4?URql at cd
zIoe)n)q~0Z{iszNvV!oe3Fe*aaWt|I`)!I3bN}D>I(ZZux}|&Op!p7pBCH;%%GQZ(
zul%AenGYL5{@u}@NlA>5fQfW>i!JFN4+BN{as=8~V;f|`UT2#KZEC4=la2^dr_Mk6
zpYN79X-rTq=?%}sZ6hA}xOX!@92ZJP<!_Izq>HARRvrI0L<q~y+eAmt6^jpfbH4|M
zxwWN-<52GFBU})RgIfyMRo2}4Cq}j>!K5Ag*u1)EFVQs_P7IXIK8I6KWz91-+?XlO
z1dktBV)48;SUMV*P&yYSn$RXJIYD2=?@I7Lqet|G=X at Qgjz@Xzfv{QB)!@FMBthX9
zB1)Q1T8k(ZkV&yDnbwXHt!k9>`OpZ9b*);)l|NpVMw;}d1LY6m$cCE^^%*VGl;xi6
zE75vNLG2jM&@5Eer*)Pm1}bJx<d=>6<(~S;e&M(1B|8#V(ygir{~m$bh+KI2qS>4H
zvY}kN;k3{c4isiOL at nZvKn~sC0x}d~91{(-iY;vW>F6e<h^bh1!HH-R^p`3q#3-zY
z)Z43)p)#n}B%8mQ^^!jwh*^@O|515@^`pqRdgyE6-)3}^%J3SRfrHgw(o>W-j%H+3
z&Z6aMv}Y{zBnbLc6O>I?!F7*_V6$PA3!77IaW{w7{fS)M@<{`dxJDIhzpXU)Eq;2v
zA^E3OsJWt4H8(k4JqDF*#-<J`JzRP=4leG=m8&>JkKQd4So<6`3R&ds`(N=mm)PL)
zv&!#AVXE*Vq<KT{ARcYrbgDH~GARrxcaaa!OPsF_jJQi!aoP!1-P1DTK+Ru9f3Qbx
zG9k^TmpYKN{RwZ0j^Qe`z5C+P at rbi2dG~k>8k&xi4cn+|BgVsQy}W$wLRl$u7nW9>
zupEZeS`w7`n`x!Xk3}!sf<jp`&I#3zJMt42{8B at Q<H)IeQ3+7c-xy_Z<Z4C<E?Bb3
zV4+2uu^b26Q*4wopAY2ad3H8VMwt9SO*3ypp`1(&R$8)HN-y&FBvHU7In?aZ##y}m
zZe3@$NU4_JhKH?JRA$4=T6&1sZR?dft#x&)B2H8D$lUcouWX1B=I}8}o({wK at I3nX
zaPBO#g7XoruV<ieRXFQy6WT}uJj^>dC0tl0%Y|AVcMSdnY~bVI$h`MCymRLcqEh>o
zzP|p~>FGz6+NF(+g!A+Bt)4ps>>M2P=WmBbvv(hQ_6=mUWvZd;N!#_PL at Rv7@!RRJ
z{W0)7hgr;$YkV;~>aG!*R-)!4!DvW8S;J7KUj9@#jfkL29&gJ~Cg~nI``D`;YFb*8
zr4fWaZAYZ^JJh7C`X-!g41<81DC!(6`$H*Kycsk!>trr$6aF#BDoiDmD+$Ge^3<J5
zp@;>G?h)-f0xj(E=XOmB#Q9j<k5Nr(QJNU_jZsZ9St=&88AWW{8@#{I;74HM%iLUF
zO}_VaZEbH?xtJ6c6>ar9zQ=9a9{J=yjlrSeVSoA!l$a&gzGbWH&g_i9il>q>-gXA{
zCMX+JH8!K0c_R8xBU8gjI2Mi-tfF4gQF5q9y;E-Ox at 3QXV`AAWno0VM%{KqPUlyU$
z{c>(X#QwVO2-SWi6g}(#wc1eUx at K2y8z&CT?_mQ}Lq_CH2JN8%=Cq0H0dBOp|9dkp
zExXj5 at 5LIHv#ShzzWW^)yD#>%iv))rPdX6QjA8R9t=)*Tkd}_Qxw%@t;4Q2EWch!;
z54k#D2?+^32)=yK`R~U=lXkB-^T at Lnt#a*0cmvM`iQTMG2AERXdUkcwXNSonYAnt^
z%Xa-~m+^~e=A&u&D&Si83A=Paa~P3B)RW+Ys>C#=pU+Mn{rT3mZeC-rXp|l6*dT^m
z3QB{=i4p!^6WiS#`*{Zg9E-lLX at jxq{I>BeyP9AwYude!suZcUTidhwT1l at Q%^g|n
zM0rOdg(zx_(D3x$M&#DyJyPupBfV|#^`9ltC9Q%uPi@>+1-1=;T{ngJ!@>WW8*TB?
zXf<de|DigFvL|atUE{fV)2Gx9uAf_P$0grJSfikz<O(}e76o6}vl8PJEbjL7$OZkL
zw|(&ZqG`glmeJERs!yfI1VMqA8noi}uggw+5uSZtHc;!zZ3nOL6CMrUw16#&nhGwr
zDh^}MJ=tudN{u9rJjT*88q!w3`x9xCPd%&E_JrdI3H_JQQf2D`(dpR-Tr)C6OAu6Y
zb<+GkI40WNBnr~m`&3JxwAA`C9)}92ggT`myiHxZ{=WOQkb{b2N#k8O+2okqhL_ED
z5cy6NMQtXrtJf!3ledWMeb_sa(*bQNoV1Rl+<tmFXU$$N;-mJVJiEll{GVmUjnu;C
z_d6&B4{-<B8w-QpVG+4E-|w0(LgYyK7h!NyAo9w~8O?%@<vT9+tKB?39Z7q|0)KO6
z^Oz?e95_kheBs5cPb5#HMm4iXG!A}v#c-<17^jyQ{73p at z*H|@{S@(d2i_;$G=6Sh
z#;@VSQ=ejSc71tELygq8Gs45jCd25l$qqH8S2@(Tcx#6;Q^*ah^p&^MP-O`yTNE?X
zSGJ|M!!YLQ%Vw7+>SMET>UeqIiH$uiJ#P<<BV?OcjtRzaqS<-*MkD@}RuY at zih;|r
zCe?#?<;nMn5C)$tglw0O!ccf56Ky`&(UrXsuU$j?Twqt})-3Z?0VCg~uu`8vYk~h{
z!AQZKLB=!x2}$qiX)|ity>Dcxlqy&!ZJj-=%~%s@;?e1C<#%%!A1cy3^y$eLa=b%J
zyL?dS<?St`S8tZI^xjvNNu(RqKsc_0)o(hz?e}IOm7Wx_n#TCub*dV!Un8d!cb at RI
zuXXWZ%W$=FawV2vMkH6q%00-krsgD{aQLFhvQEgpaJQ^QjcaX|GWPZGz=NLxr;6PP
zVobHU-am)sqqak<8B(XQ$+xu2Y|mrIY|<1}O!avQPzwUR`51Xz#}>$jM^AmS)ZhE@
zqM&@=H5{_Y%MfW24IRu!X`N%@zipJsZ*hLl-;L<NPC8A!RQTmoHs7F4d+U!hj$(1e
zR}ld$KR;2jc~+OvudZo+9z4geey=$&Xp5D;sCOULtkn94IL1A0wOn451Tvm?6!NUP
z1T<oim8v;quV2TDuoHK^Y$;Oxp?J%GEYC1evM{)n*OSvGqFJ=)@AE!^amJAHzf at d`
zv$vX88!LFjQ}7Zf`V&yulB~sVVQU`YShHF;l+i3*_`174`nmjJvdz;rGAgS3+czqe
zO2S{ierdka85kc|G%})eS?-9ds9 at qNdAZX!CYI2P=e*nXhI<)L{iSuE{jF9N3_hGj
z4C_N%!X37Z;SV!>@+ at AC@iB48>G08nNyL1-^6sB?Y6s&hivPO$Q89=0{AH_S%ag)}
z<4WHLksC4QqSfi~F8+P=nviNi`a8}QX0s%<{9v%}-SSqC<n5*kn34aq`AUYiw^RmK
zUJw3T91M!OMQkgGQaAtBc4J!Kyf=crTroxA+dF4I#~IGd%*=sSRAN2b!hxT!m`*oF
z<OF}9Vo-Pp;JwJzvO2AovDq@)WWT2%uj=(JV>gwq$JotKo4i{=pk~LoPgJ-`nlY5m
zpiKTDEW_uR+x at NX8x!^BQV$+JRBg{;W at diiy-yr`d8}yC8I<?J77K+^wOh_`TCHOD
zQw>SORZPG+pSU>nZK+FMF|XZFVdsUe(NTPyC{$R{mvwat_V#T2{QRl;`SBe3b at U=4
zIV(d9I#>H6T4Ng27>YXv3fJRL=CsQxpUg^rqiRZwb7Bn@<^AjGTDQv_Iw|WaxU^wU
z5Mg7#tm(*++Q97A5SSLORB>m>KW2GRMgXg+LYs;bB|@5`!eD_tWf5IScKDAQ=FsA6
z)}r&er<twceA>*3_r7NQ#70bD;xivV+WeO#j?rvANGSgA;H}@p=GcpexnkbzKUO~S
z5Qj|;#7w>WmFWA5IIc&1$-+6=)~tt^Ve{_u($&h);9hFgF9zD=TCSl#*mriF^G_|=
zR7GG%@$m3;oK30v{b<`+-P^ODyi!wE?ygcVxI;#URjcP{$89L4JjP4mbUhko{vEka
zMFIP4;>SHiN56gv**op+?LF{2q7S~<yTAA$Fz4e=5C&&6nrNit$i4ITktjU+$)ALU
zUh~-;p0 at q96m;2~P5pan at p6`aw<XN6SL^%OGhTz4A*$ET7#93gC}j8zhGOM3ag+<G
zgH=QaLz at oNdE*mQ#l^*R0lyF8-n`+BjE?^F`7 at e}i_3(a;LDdUrQO~6-~qYqjL|T$
zu#{C*DU2u`KXn(?N;LtRA<W7!wAFK&EFHZr*usv3+J;)%8M>7?TgjlX7()?pJ0o<K
z;-$z+5Yd<a9`{GEv$3)H9ru!H>FKcu-u6~2dd!hZ?|bLVZ6I1_`_s6G-&z!5&#rB4
zVfgy`4p{T+=;@W!)ZiH!8Y(@0tY~R at Penx~GF0s)c9`Cz)=*vK;(f024JRh<negHC
zPqAWsbJM(kF^nFp<E_1&JL~j3*&NJ$=*!*l;X`e}V<IA=hM>P5i|yX3i7K0_|K?eh
zcs#O)w_ at YtKP6HKOu%tZ=&zb~a6g#iLt-oE7Te~7tc*alBzH-}5Fxd(ywUr4l+(G5
zzyB@<p`clKZw7Wu&gsU~&TM|ippNqDR`dCk*}<UN at D07oTJM@O58>9pyp;Ll#HNhv
zelqG*QZ=v^a;ac(+Q0)oul=veC(;g%j>q3zKQeH06MVcp!DVM>?>Vuo2`js6K#<}4
z%BE{L<=Ba{HlFYaUgtnX{OP+z3d-TE;}dIy^|-`2H7SqTA}4)?UiI4Mru9tV#>NJp
z^Mc^ZX$OYY)vUsC+r6`L-D*AZhd!JNiR59ivDgp9#8iasl$Dhq_#BWU_tWO)W^9-N
zjbh$}i8VeNrBmILTN_-hBV38Azand6ZC>%te8xoNwX}%n)tSU~M__$ZqZ6dWpQ$%b
z;WB<lZYdSH at O*E(%5|mFpu?|0S6Wr+_u;n~A;%fbe)*Sk72$C~tlvwYX=6Ec4v!|j
zRM=mz^*oJ2$Ht+c{E~-KZ^8ZR)0Z~{de(0$w($iJi_9TBZ%IN2Yw%16CV2K-WTg}I
z`kF}xz6kRDPLcRcUiG**IfgEHZaqv_Uw>n#IHZrvJSeQDhLdkRLDwWdl=J?$D1Q^f
z<6DN>B+N~3gbF>r@)PG59=|d5TMgJPjd|lZ%RShJ>&Yx4LI#tjr~czL4jmnxoPvVo
zOpPInzQB*U2DECuTEcu>pGj;V?%k<M+-D=XVRso7lrTAErG0)M7&^^2VjLeIN4MS>
z?fz^)J*$5FB8dVIHm~^Q(dXU8Hi3m^M=Ut*z|r6_=;-RM{aAXB6b- at u4n;P%x8wJ2
ztu$iUwVx}UFC8v4f1ar|zDr1W&tFob at IhE)B)Zp+MT*Cgf0;~7Oqj-ZjyL-GLau|p
z&di)(YJR<LZEdxfER)X_v`-&>QMbNs$!XMtZ97(oLdMV-IP-GD;IrlnLHtiHqrCTD
z^S%2$-#0^ILQq4UL{gCXse%p97fq|hMSOXAdH2hIx5a!8Vv&=0Y031z2=*)--=E9!
z4i4;ugoFnFjoo=zdT)cBJ~;$4^x<avu-u#JnXxcKq7FMzajtLp%w5xYq54$2IbIKs
zMLyV$7a25K-=YoJWhn5AmbyGbgL{gZn$o_0_U2MxX;zw%HlNyiqr=fySN_%{*RP3{
z)mmHnEEQ(tPJt_!^IH44@{#W6hjZFm%CB)58AM1X18bgp<_}LuOruDgO_)yI>+8x2
zo$H5RqzXxtHW at 3vdsECEH`o7^R8=>ACPaI3&Yjpd2uxTbR=2mKU%q5bq!J<c5O|)A
z_s-tlzP%71&DxSH3jI+hXq`VN!#tC(bvcw*47IhxMLoAyTULV6RA)mjkNf>L(-fJ;
zH>Rugk*KMouTS;d+0Kqt^6KnKMlOk?W*n7>OHW at C6@#?<6l-jfiw$O(v2pG5W@(KY
zoFsW`rxg|9UsFuv*m!t7xqMc4NJyewmf9b&WC)MIHl>ybAPzkL(fi_|Z^b4)F1AHw
z`P1=j8X3kD#Ir2^0LM_W7fcI9eKDF5G>FKIYMM3c4+D;8cpqU&NI4Bc*`8EMbLV{1
zaZiYkKl<_h=lZO92#L0d5Ygewyx9J`7nSqjx>_0<8oSfgWcL^uCtp3e-{ky_G&nfe
z&DS?3A_5I`tCo>b{CnS at _ar1}U>CP~?GeT&BqV8Zb;Q*ES9tTMUy2vzN5R;)pC50M
zcX#dbb6xKNPX9aqnRBrAh1KO?t|2|q#LG*Nl-tDaRDH&wnX)+KS`?mQ<i$lma05>B
zZ6a~)KHy8R&b<QT;%G3$6AJ5OV+hvXj!ViaC`2=*Vuhxr-U<3Ot&fe3oqA~+a`SJ+
z{qM;ZO9-&8?#}1`ChANd4i<Y~oY{{QNl;NHDVzzJzW3<`xLp1DGbKB<zViZyF8EKW
zW)oM_e0GvULCvE!ljIoM0Bkf&Jn0;6(}{P^#^~tiNRlx&Hum!MYZ-rk(Z;uL)6&wy
z9B1p+K1JaU3=b0-{|jR3^Fgs>d_<OJhl}LXfC0P#XLb)BJTMT{hjY~pPdY6(*N)Xy
z35Bx&q0f%ez{!H8P;QujGD5k^Y`ZJ-7*+czqCK^m5k-IwTc<B7I@)rn-Fp{Kz+3ho
zu&okEIP~85lUdz*hQ&9rKmYcAS$X+g5)zxn(%1F%{aeF14X!Ja)RIBD$yj$>@V`_v
z)&WBNS&N|?8Iw}ZLZYT(GBw`?<&y+?<Rbt2KARv}ugQ9}9QgC;NG{*#YdUz0xl$pL
zC#R?QOSem3Vj*E+*>3|sq57}EtJ>OL<cL%+5N;5=$I8vk{b#$tb)r(0Y_Paq`_)8?
ztNG-Pm8GRxCssp4Lu_2!-5_otYTsI1V{&rHjI at 0Y7oy+>$P=9W6-`~Q<P{aI7F*rZ
z8BO#E0ZEZp{=hBNMzF_#{GEHarYbukwe9_TtFb~+B+=o-<T4|meh><0sl22lw57ls
zy=%8<loQo#aN=j-6O^m68d5Z#cbv;fNA=FPbmx-9-!X*vV(C-N)*6dAEi~PNjmuTm
zO2%!{MdjMj?NUS%A0T(z;ow^fk6GZM5KL_&8}aiWOP}94e|uv)P75}Ta=<u at -{Z}U
z#|uGq0p~xQzuLjY5P9y53GI36vXcM^b}JN%9iN<hvMqidZT2CcIW`y&(4sGq0 at y{)
z*~K<%VypLe(&eC2^#vbQ&1^2?XL{FmfDR7=e>-J-3=9ZZKU(|zEUe*<5H%rTxNGO%
zs@@q1p6|2u{jfh1CuakGH^LV4J8Ygk>LGfpRJE3<_3ok1K^Kt7UTHN#+%M&dw}W8N
z*e$g;k8W32RG=r2a;^W%IZ?+tnMl34h%m9Y8;Bz*cOTD}pUkOzGoonfMMwC}b36x;
zgFD<0PlN;>l^)MGA^C+S`-p)7C2DcMJKo;j;t%4yol`L|F)iUN8N9JTk&%_H6{dyr
zheyGWUapYz3C0c{C2I-8f5&4Fe;U{vlV{*l36nn`ohX%^{O>VchUDzv;4O#d{6mG?
zh at +#Uu4I~r6EH$azubmja`N(PJ#j=q_RooK;o^RV***Ez_HjY-AWY?rzNF7t9QwP#
zq7r*w{!5t`<8zwhHTe)g0#E15zklHvxOfUS(G`!2B?HECVVDWKE<0s?!K-1u`gh*n
z>^M6Y&Mp0?!o|<u|0$eJgLh6808Vzz&Hrh#-l3p~`>!Yf=lti2qKXQR6lUqO)c`9P
zfS>*=4n~4^!B~z=X&21el1V$ev<yxCK+0PuOJa84B at zPZjZn>;zHX`5bz2D1PEKN8
z)Fyak8Y?MbcV3>T7Cdewz6DkvT;uUD&&P?N<dLqZQrQ^G;cPBpHulo>jg1I^-_J`+
zG%!-i+Q=T|*R>@+%vdDNN at G;a7vfo4TbpZk%;A<=-`tEGm;5)fEln?<slrSfa_QdF
z+bhJTQ##dPrFgK=j2jjfHp<TuB at +g~gtVwe^LERyJw26RSd;TvMiO)t78W80uUfI>
zk`v?M+8Ro;QBt*jJt|^*w7~XlIMrMHJhkXBG%U-N&gYn?^>^=rcue5owdg_=h$jB{
z at x$+A at cvy=(rDP}TJL0^jc}_MiBr%89fkEyw^WT7T3a)9badD?jroi{MMDw3&w_42
zDz7nv;0fqKd7suoLgqe*GEn&9#qr?%;wFQ1JtfTBw48B2@<H_g at _l)>v1cBz$L#d&
zo%$Q4N2Qt;n*(X1{K+6M<4GNkyi!Hi_x9q}KF55&zL_z0Ej9lbd^<5XGBVNv2u}Fl
zh^{VaC)n-t6zC!%B2J5~cb&hzn@$Mg8l?&J^Rw6)d-1?)_YRzo82{64L#LPKerp)O
zo+4vnHY#(>K1Hy0c6P#q>)buH>Pzf~O?ii!dXaO3Lf{!*=ihBAWgm|}M{B at 9l;865
z%AEVaS+&fSek at kfe~Nym&<$gDY|I4FNZh(OSh7&gF#hWfrH5%L6J<GbAwPm&)tJn_
z*$DIiF6avo_n>!R=S#b}@wWRMI{cQrU#pjpCt$mN`S&z at e7r#9w!pIyyR<0p(`|Kl
zRxf-iC)ipH_!mupP<Mj`Q8MiSy8;C<FfbtP<Wy4;-vtjO&$(wDZVo=i64vd{pN$l*
z3!1#VJb3yF^70rU0M at p*F{PxWybc$p%kIUGOWjc4T%UiWvd6{3>gnq<YNFGsp1#M$
zh2PfJhLp?TKBT9oYnqzkhlGTj{aB*<9F0#zb50j>8D?ALkJ;SZJonC-3KNgqg2WW2
z+N|!7ku2baL?WdS4xG4_KX3Q<_r07V)mYvdHKglRBXK&SK*V+b>MGB+$ezz_U~H^!
z<>uNqcs$GO>&;=yip(pWcdUQL0gdl#6e7-WAH1GO-564kUF+jQDBHc18&R}6jy4SZ
z$ce(!elu8r(6vQKV266shxU=$58S(V at 95X8c|iqwe+pecY?HL2qU4hk53nRAo*Sw6
zOitc?{_l71pW_WAF!HC`*w{P;lu^eas?vDjFu_q>T^#|J8ensqBQ7ouJkb2)cB3{A
zX253K<DKQs=Tu+=e}<#_H>rVT7|>?aOb&Pn(xw0<ZJ~Yd28Pui;7h56g^B6uggQDp
z*xTVRz4oRskQ*xU7Li&V0sJGM;j3LqUO-i})9q1#@8_h%#H%o6KAo?Gq>PNHMbyKT
z?S)a12#*qnav#R&Jz-%|#T44+xh~}Qj*6`GxPH9Cw6(Pz$rHc=2Gop09vu~x_iK57
z-=R<{gchzpHYEi_Y?;}kC$OA+b`$hxhu_E~0)IEzJ?urYecLhWr5nX0$|%rKv15*=
zrZi1Pwd&Q+1q1|+;mA+nNWFL<D!TUX=SLCyltu9S?$Xhv{Q2W&^4<rZmX`MD^i<Zv
z!-MFeQ8kC#Z?7^3hC5byu`$rTIHLPgL2TcGTB-4`2!0}3 at mE<;8l424I;!qFiBS1X
zet6vUDOJH#Vp5ZqPQ^}^S(d^QX5;Q;dCVq{|IO9;{M!<>^pX<#j^jQm(6AlKKaE>l
zXx_Ojz5aKzks_50szpxIpNNp~&9hNT<mE`qVoWWzc_MF8dBuBk;BJlC2TBqWlHG-7
zj-rrje~F949HRRgyQDLN8TYwf&#-fG^~RHMxUF`fRC6_gKr`4xp%wM$sTdkW^2gei
zWx~;0l!TSqaUZV^U2{b}tCVS&kaNTE?K1{m-aA+X)VzPsvokX-reEvAOiAsQ(3F|_
z7!m?Ar(y7}2xSr`Fq;;?dUIvvTP%- at 7JG(^#r^rOf7OQwy%#AiC`hO^Zn1=rr0lN(
z1J-Ytg*}C$o+ArQ_0tY~E{hK;{`(I`9_?J4=YRCPl~q;uSXeO0c+4Ud${)oL(C|LL
z at EZKRy+2*;cfRDCmXi~6bmVpkpDpj@)x at f_+~H5e({U7DWF_Ibt%h8~^qBxBCr$!d
z at d07BY$kvLB=8}9pYnQ%fHPJk1;H^p+a)6*dVWQ)iW%26rF^E_D`(CUCt8a7EhvZU
zt6f6$=s>rf6J_<c2j?(X3VM89L7swrB4B*X!OrdmHbzB7#p-cCT~5c}Hh5fret&Z<
z)vLZsOdJWE at K#Zb_wl+s?08w%QZm at V18I!l71SjA5M{uYLb7i-j4x|z<ux=2*4Nil
zv$Bu~iIXhC$%&VhmBq@=-WdC-!($8Q*;rxR&E<}io{%t1$TzG{7m*zPoJ~@a)^mG=
z54ZJYKQ-)A^N=eN7*-K*+A7YQ?Z03GvVH<xkg)tAu;A<k$c+Aj`M2(e3qs1Gat!rt
zWo2b?o)EK7RH;)9ete_`c1I#;<VT+=C at AKg{?a1;z^xtcSJ$rt?Ney6d!ub`o&rt?
zNb%c8=jV#Eb*7{7XD*AaVPIBZPpu9P4*FgH-N6b;wD^BrfVAxFs`n|qy}d|7g!cKF
zR(aGz_;lpaNi8nE4LA&nZEbTfLrF=g>&?^8=-pGmcmQ(SYw?;+;~IYXtbM{zD-gy9
z87%Mb-!|x}1=q0ApHdDerx2*&vpa#JUuW_NR`BC_8dv#$Nilofb<MnQ-9DQfmC*>9
zC`XdWbR|ek>(>hgZw+O!kl1q?zZ<dhZzNV$SC_Z9f3^8R1c*DRm`^ZVqJd}O{646D
z^{V^pt0(i(9|O#IM|H{5F>px**_1IUJ;)JqxTLiHn|CX!s at 5C&X$2f5k^VS9YhL9*
zpY{INSEQ5otGx8*+r1q#79&NqO-vHONVohHc`N;+l%OCn7%jQV8%uAVqFGv6GHnqg
zO;*4mbwbt2M%6bo%<HZi1A!wDC)6O<d9lyIY2ImaVy4KqvkBx7tirCYFf{c5*Y7j6
zYd?STTy*N2KiAE)^!4!IcW_(|xp{uA`51x!x3;509O-U`|NIW)rH-TDvHrueCY#wL
zDiL0g-H#sHye^aoBz;n)#@F6?b#)arN6mHiSmVEb3Eh$g$JoK;!nWyXCmz{=WkLze
zg5OtPvOIi#F4Mq;Md(#$1sQsxZGh_ndm}{Y`Ul8ZJX&$`2&~(rLDzE)R!%!nEFRaF
z{t?CIFcpEhCv-{)3+we)p60xLD_{ofBV#+=%=gD)_f(~-dR29Wij7UB;RgQ>|F59?
zvL`TkH{Sp3%(z at i5kJAErlDc}7z}vv=kj#CmVc(bU99}VW-P0)(219llbhQm`(J))
zDpCU(A1?n`Y$Jk|5wOR*zP`>C_ix<&<FeA}%sa*R`!CQS0rD3+J3F|Yw-KaVM(CB=
zuN<dYe5R+T*IxK8KTU~lRC--qotBwteb#cd#S>C0`hX&zHckF^pv~jWJ7P^=o~`z}
zWLiDs!WF8)KxCY1Ab7z!db>~?JLtRe{Qlo&1_lO at 1!23V(V<ufZu3qjw+MH*Gc9?(
zO|HCeJzig`)b*Y`>*igK#^C7aIQoREx3uvNbX7s(DG28D-vi1dj~_oS at Hyf|H+x44
z#0b!J!in8Lt at F=1E?661**QZSnv3)DUVZz*!UV&XJ!@#ymfR!pz4!O%HqRZ(q^8G(
z54wfFG#dmxf6n~#{pEM_8+OuNO@!4rl_#%AEWgO3N8^WOXdXi7W-#!D at -}|X)KVcO
zB$zH;Koh_lp55@>%Tohv%hF-?1v at UI59t<6&QhTv_DzBG8Xo-(4MmvR-jXeTs$nLl
z2C?@1vmVS!nA@?*$<Zd<iY6x1+$OE`d(UyAKE1XQW`d&(G at cAOB!-4mymlu_2gAn(
z2fN$7zcVFC2?>z^>%zvtX<Q(8bZ|i0E|f1a0CbQM%e3QOx%MkJ7yv<6zh=eaXTkRX
z at fX$7(lWg>Keq!|H-EWID-~>#s_{0u#;6%5<nORKr^^9n at 85@>+lj1|_j86P;UGqk
zRQ1gu_h!;^0`L}N=O3`I?h+A|TTvwr!ccAiM3tO-+VF|w!j_?ts*af>@6~E=a2(p%
zV>cVDa<qCdRM0Un at +$wRR8Flvn-0FZVBq9bBlKJP5J(mk6{Q!qUBQU}%k83Icz8I8
zrL-2`47f--;R>9JK1I6c6&vqhg_6LqFizibIOL<!RmdAD5h16gO$I|o1#<;%%dlBh
z!NjCcYw2L36wT7g3Zt4d at YjA6xKgVii2)^g;Y!zbc5E|5g at 5M}5D*A|Y%zcSD{FEV
zE^V#&=JG!?BL;9 at hjVyD2J|*}b{N6)Mvj)r=EpQBsxxT?1qG9VPgyUB(xI at xz{-m4
z?(U8p at ZP^LVV3q{(FKLlN(3l%-heTHjf*QA5Fm!ZD0!h>c6`wAETv-;&#x^t>`la^
zZo%2X{Fm1%=DNC3Fo+qMnK49M7AGDC4&*Z3zi(`lQ9+D2J3lA8S{i9U9mPb~&L0L8
zCU=~vnLK?%O-;@F^iw1jVMmW$9xfU8>cy|`;4yxF_2fUbsoPJ+nFO}Os4^g9qe?W8
z5Enl>`|?;7lftvtz&*0QzFz&OGYtAb@|U~$3!TpcGpx)4&UVA#>2#b7abU9jZEbx3
z$z^w$yNbO%*_}J|V*21tD&VqmnkrHz^|4Byq-SQLL%~5#QSrO5{6kUEz2AO$Vntw7
zXcc_k=`1V>ajTv;73M6(-@?ns!B=>e7 at UEl2kV3s6WZE@!8cdFZ%>6GFVeGr$YgT^
zY%^u|r!Xc{QBe_?fGw{Zl+ at LQ{&XPy{2BuWC48mB{7J%9U4Se|XEp#u;e+~s2FZyu
zP-P at 0;#DWF7+Bf3y1Kq)^)`+z700bib`sTK)95?f`y&716HHmF^`1B+CEESxy3}rS
z>}v7Noua+oa^>@jL6!j)bSx}mL5*5H+%^*z?H_J1W7@|qJld#1!6Jvz{Ko27 at CFsm
z+nhEm|9lLygPdcuv{R)8I1_L0uY&6G16w%%fKx>O$MOfqEDY8tBW?DqvK5<`Xy}#c
z*8F+8Nl|<k?Be1kf~ct~&B7vnHqV}|o8Md@&-1bLUd&g!Z7|b<=|d9~^!mC+v#o at 5
zx)r-UzrNJM?6+{D)3&i;h7rN#;LmJx_`bb8|HE&9n>A!aXEMCy0XNxiy`Soh4XhTa
z&w)rz)-cA&T@(&IpckkfnwT0;J&_(sqW^s`9|45jz`L86l+<YJbdEM6`kq3=PkvI2
z`Ec5F{$~w8GZ(^u&d9jQws392I{TfDiqy87j~ZP(>NN=DSCw#bjL%fjGESb(jo9DX
zvbjTyP+E}9DK2)^nvBkTS>!^&XM1QoZ2$c4R?a9U4?C1zawP(V!JuMkKOadwbwLPN
z-$O~Wr*}qiQ>Mt&SW|05;yx01o;PT+k58!%NxpjM`y;l~T&2R|@JgVs43VV3cwttl
z&1T>IrJ}R8{_9trkrxkV_o-@)n;mSX-6<Vuw$|1ro&K#?n2gqD9N5%6k$d`-0S5;M
zFBmgKJTZ0R%4yq7`{e^!Xgj?6(7gRN<mOsWIqjtmJEuwO9jx25f_wi)ol}>oSD6j*
zDCA2y7#Y!!#;tlEzuT&GHLF5 at GEGvjen3F`Y9P?nM1 at CycB3x2tTrrOgVy}YF)r<`
zt#gZAGhe?VV-JP%q2`L<iD3f|DGrYBA2B;vBP^>`afF;lvdM?<H)y4`>04NoOiJik
zI+|BcQ&#?jfn6i~AF?K}kQZ0{{CD2q_pdXS+|Dma{(M}0l^eY)z~B#Do%!krID#pY
zH_&C}X)nM at n3q98L5b1lF#E&DRsT9eXbH+&_|?;zO5z#t#N0Oe at Dm8;ostV@;R!G~
zcY+aG;zD#fS|GxlHEgUZm3VY5CK~jI7pZfU$23)kL3ld{xVE8x9K3+j#`EfAZt6oU
z49TP4zlG;m{{R7g_VX?m7ni(`&%5O!DNkk)G{}q!1QeHxYBtCTQ0OWyc=Y^ImJgoJ
z;5RVs$YW{UMpG2a$;?#J%YOZuT{)AoHuC8W&layT+doF8m>Q3^M;E*>{UBynZ<nL0
z-bbY*yaMOpneWscLN<~JP(x%AjA}T$!dQN$?Oube+7HFnug+IyCw)Lb%SPkb>s=v2
zQP40g;6Y(B#)VvcH=pb9f7 at GN%SB at K5oGr_;SVj^2yp>{Cr!?aKuwvlVvNf-R}3Bx
zLnQ~oFQL*T037Dpa at bpMZ~KrmW+CH(<$&*8lLFlpLzCr-%yd5NC#LDVpR=1vv;Dui
zkv(M1cy;$x<%^&nDk=o8A-&YAluXpZLK?kbfaNE80;x|AE;n$M_2gl*JpqM=39`aF
z<NTSet!liJ^CRDU*)aAjl@~Ewx>7ICT}Ry&<mAXJjh{Su(qPdY{;c4k=T37;N!KPZ
z;=^v0sjPmn<nu(-Ki60P<X1jE|L3Eu1;YJ>Q|E8kJ#WCiVfiVb)8{(eyaI8`!SV+x
z)ojj3EiOwVKACEJu7g^woEFEqr9vVXjgi6?Xj<i^0&ntBc;jC-f at 3gPl>Bw}1?Yaj
zR(bH?R8&=uCl%?G<HhseH-7(oTS^W_Hd1pyQfT^+kxd3as<{H9)YzmXp^J9#`ZoZ4
z{D4|OLKqI5M_IBV at 8lO3*Vfk7T$4Q!L<yxj><v!y{DYIPg!*|h26=6Uh|5oNfN%oe
ze|mAY2SH!TvL{3Y&=M1bVIAYX(MKW9QP<f?3zpThUqPAL6B!v9R-`Yy{~SFnzfz~6
zrUuW~*QCuu{!9pPg`D3SJDPyz_4zq41r at Pn+oRQPy_CA%P4GeFo;_oMFb)GT*Wy~d
z%XTPpKDl7!<>uD)Qmfo+V{l-g3wHG}>?hT0JV-<bH_B|OJtp;Nx^d#kym?QFZB)Aw
zQ1!V&DFq9o4U?)451Rp|Q<bl}A+*tCC06)r2<i)5wR}N~W+P|aC^vWaG at ZkDzCX<l
zmfp{9j*IBHIC4K<{r)}S(<d1a&Hg7$8pV?MU{+ at cUy_oN=6h3yDwL-!ew`g2R-O9p
zb1?Tbwb7CLh(^?d3F!crdmV%M%nOc-UqHY<`_Hcq%|*%ZxXfnDA17)r!3smN at XRB_
zn$63}$S8l%OAi>wOr2 at MqX<k2E?S7$avmL_hBB*WuR_Wq2dNlXsP5oiENvTE^#y{|
z(rf#u?KugD=W~NqzuNU>d^}Ed;wj)!7g)%vTU$}U48%_c7?F+$5RcU#Ka#;8D?m5X
zK4)Hj at 0;@5<tx9Rmf{<ksAx1+U6U>=&xKU=R;?pTtS7_e_D`Rd)_I0C40m^Tvv0kS
zNzcl%Y5F>oIXq`5HZ$<ZAR)c<;g5M?S?vy~Cl7U%MEScX+^My>`93 at 2D=R7S#;s=?
z at n3>=R-u(OG^B`+kJr at E`Pw6j%%$L9%YSqPCqxN+%{tTfHD<3h!Unz`Qb0H^<Lt~8
z{CA72yq-?TAyaFj@;`+X$XbyB1MF7jUk8PP_Jj*9uC7_l<BI)UZP&eZ;FMW{72N87
z$}(0gl>*r!ErcGRIEi?JFZ~kfq-g6qPU1I at y$<H?LWGxkwq(N57C^wkKIxXMPlEDR
zjGXn)Tc5Fna08l0V-A=d4v{k5a7dMl&S15^sWE74Yu8|!fp6NOo`NWyPK>StCVvTr
zNP7Pz at H1nsyH0HP$6RRc4Bd`3Me5tp?Iq%?lG^Bs{WBPEHT-=O6Pn#W!7J^D`~pRg
z8pY%4!aL(f1o3~9Q2DJGPfSXhK6JbQ^F+(o*zxEWbTP?ATnd#j&EmbFTZ^<j78X*H
zli&G=B~@C92Vb^M_pKisB=#nd$#UnYdh8=z9;}Cy;rLm04-y*_FW)Z^?oTX+<L3vJ
zuU7J-o54v-mkJt4Wk`?59l7gB`2$)w;=jH=5q at IE=9!wC8#^~=FnC|%J>>s`>CD3O
z(yTedqw(>urNabl$CO-9wt;u2hrNvowiBcbf-nH+c-G}S68c&LbXYRt6vn|7`a<EE
zq!0lYg<JI1IaW_N^RXv1d-l$LAYC{TEubz)_e)_#1T=V)>&mjjxgb3~0vRJz5Or1-
zEgl>mCgqq1&p&fCSJ|p;IGwKX&;1D`joEbv;xW#{J>^5G+62wC*y>Ca9^sQlQRe|v
zavI`sE8$xh;9r7M$&<Hi)a;N|q25q60M4TKbJ8SJZH|vn>~J9}Ih?9YsQZ{#`W<K&
z(n>%gYoIk)oc)b9!!_+Ocy at OA4i3!v&{9D1EeM=5?hPR0dzh)s?QeM at bW&ak+5gIh
z^z#FMAEb#tgIVA-_XZ{7{^M+GrKnIxaN)3T-*!Ej&*3re1K07FnYoTmB$y|$MME53
zAAZdkhhL$*fFJ~NjJ=_eB-5So;{KDZ;Q~1YaL<G&UjRp3FHez_0pp6Z^FOFkKxmpK
z4wKbawMwD9yxduaE+8;a)kqPZDCW*d+fI>Vqk2De9yB)U{;SA*nNWREvr|^5jbKLa
zcs*gj_*8FfnEE>E&|YcW_80;0Jz$02M^E+x0s2TsC$oYFdaklMI>b1*xM}I>mJ<U~
z5XbmIGwJy2lgE<+*7;7URFXjtw#SQk;#}H8ZX`8ch(&?#SYGe#;ql4*`h=`d+<$7d
zO8$vWcQ}SZH(Wj?u!=~dS_QCVz?o;FtC$0GP5ffF98`|L9BUJ3uRq^buA at QMS<Jn8
z3Q;!I{`c=`#l`h4wQGNOibdv$YQZdD?@jPtDF#O!Ol#G6oGlO0BER)pt!-^<Qa687
zc1dwnWYzQdF^E{yqyb=4b8==Y>|mC28*~P>ReW$WswG7hKA_9x21gANN;!|aanSFD
z5fZ~^)hAu5SppaZLJw at b7^H|P8i3?y9kK}010H>-ZA9Uc;q043a}Y*;5`ecVWjVMv
zz_5`+6vz-HNO<JD2tez!#ll~(YrDa?;c1m9efN$O!bDeXu7L#YS3Lk#^cjOlI`=l7
zEIcCO81$y<!X=*IX3q*lCQz3u13*qMjDwlK2KTHdVRMnCZ<f}S;{aau0Qdx8cwrRZ
z#>0yQO~q~2VK?&tCi&5nD$i2 at 0EP2rt@)23Qea}x%aLWHwBDwtl4c2|Mno|YKKVRy
zWwtFNAW_hZA4(Vc8_|xkd#eODR1;B)9lJ+BW!zvHHMn^5_jCt|Dabe#NEtFQln4;)
zOQGW-{{^%GnJUcIo5xgFb3o-oeV-Csg9zxQ20_IxedUR!W~j|@_8O#!m?&-FPzE53
z^!1TUa)0bxi<KA|Q!`CkO5I!v0IpU4`&eJk1DMA$pQ<eijZT1p|M_0K4EUe-#Kb5e
zFS&~zl%*0Sb^Qkod<A5PZD at 9Kzc?ryBAmUeL&%T#*y7Yqb&!z^h-7c)7RaGOA$nL(
zQ>49X;s at 8-58FWV$&-j8i9pMVl1J%ey8wo7EPHX5Zh(-cJeIopYDXu_rmdwFmYGQm
zze>u=P$AlYa at E^iK58(QK$Z&z5M)E{+u?u8>#?a+pk)er2zD!)kQwII&GpY4WQ{|)
zxF9<_8eqXhTZqZqNdXKFeKUV~53|=*Rhac3ep60OO(8)TY*jse0WCwrIOsa80^!DF
zn}w>JM1P`-V at cP}?k?;6t&X6-{Lp#9h8PxUPTadEbJpDAy3z- at 4mNQLWVMvujU+f2
zz?I_R<S2<<N2vq{OF}0=At7-typtc{kI+V0M0G=x<_|R?j5{XT7slcVppFlhGbu%g
zq3u4Bu0ab$Abv2RW}u};MMkbB at O1KW>}Z>sCIOZHb8%r*Yo0Ta6bx(-MetyfAHz<F
z5<i(vDj7!4_XRTlfPgZ{*U82Gc#(v%d!=^LE)~24U{G*wpv@^e<@*6VJ$1 at 7NpQyv
z+B_-^n=<vP<#lyQHa*&O at fsMAaz(G!h<W!A+?LS_`Ojm at K=7c4=A at UY4U2;eUDU-7
z!4Fyo>YAz3V9Pb>(EJCi_Fk2SW*Nta{QQJq_BUKy7K(Y}0MBpJT#@W{hmNq-ul;Gv
z$KBgoun*f8cR>pMy7v%@31AMCgR!(bTVFi6VS46Qdl3+H)Q$DPeLeDrt82$G=Jmzw
z$NU595YWnESTobpBp(8PeJXhr!RxiF*_|{BLj;5wD+h-xY&T{)iL*W`*WKR<7ytfQ
zL5P2Jc9z-W12*`*`}eWnS%E*2?n3+d^JhK~pHMX&w*FT$X~*ljEPnBAUcyut5wFzq
z3oEn$;es}RNPYaW2RtQ%g^3pklB7=Bd(xyTq3X(If)t4P3gry7-*pADFVE#4DkJ-P
zU{7Wqq`ghg$-#oN0Tm6yDBtZZaG!f%oM99P9yIj7 at jJFG2&xy_gzW`6Paf;^EYR#4
z)A#QT!=zu=7{0}X_GiMXC#+3B*v<u8O62h9a&yVwm5pfTpnmv#jdTQ|PPS7Ns4+FK
z6OA_mDdd~La~H6*3d9K at Sx2@?^qj+<C8NFZIW&4FMj$QQfb40EdaNVK9r*k}DhhOZ
z%{u(<{_HqSUS5Iue}{<3D*KB=l4xRFTsNFUzxFrza;E2qMU+&zP>!gHXy!L>EIy~t
zXYmo270MalAnMR3G7%=&U3+7f;E<AvdG9mr39fHvB3oPmR7}v!m_SzR+ISe^HTU;E
zSAo&Rmd$O-ZnT#Tu`l at k(A$x8Lm*QV$PN}Q-d9~-20_nGb?Bksf7B0s at XUk%R_>l6
z+lWCy;upUU9l!AJmzCY)G;E9<wK=+4pVM<T3R9B(4a;i*6 at 6q|Cp0=~MH^4Z<`%Mo
z-qX`V&&{3uo5=c6f-8y+&z-2juMR>`B8-DG{pa65k$*5>1P$IkOR`}0g557jnPiAT
zp;D<m+xl%m+t at e(_`Kl!O%5n- at W1e=A53uCej{AH03!K!%Figu45K7BRG$Uqjhf(Q
z=Mc7Ao;;ZmrGLX at jsOZr2m;Dr>DV;_p)+;^&)fLvS)Q<G{n;%~Nh}IlFgXD!WCc+{
zcs$hS6{__mjmkKYPWD%Z=P(ET{vEa$_fQd~gGUJaLeJx72r1$qoV(pK=L+sLAf5_)
z()rmL(i317LKW79Zc_xLu8}TD7VpXIVzE@~0|d4IC2y9s*>=A at mywY{7U7y)mMD?#
zpSQO>gvn3=1Sn5|kpc(fWXW}o&#ukgj=al*m>df+K#YR{RKiu8qO($4PcIt8_ZpC&
zvih{)E#zHHK>Uf-7q$R%7Fivh+<|BeDbS3(w42zZ+rgyHcCq1@&_!?cm`MG8 at xo-!
zZXhJfkkZ=_$4qeF($ky)Ax4P!F4M({9ZL2XNt8B#OF0~49{@g2as;hb0*V;4xV#uW
zmDb*bR&+1m4!XPgu32<Uj1>@H(n;Bwl2(YEhe&PhFcQs)jFh=^HXt79UhR%B_8J2z
zdpsU;ogpQq=IA5=0{S*`Th_`XEI~^EYEuVkbTU`#yTQW_mU7lT4PFf2zvMkgC9rrM
zI{F69D2z{YqU at ifeRXTVi7B`B)fe{%9 at 6nz<qA)sQzE=_83?%~>@Fp-rS92TGC1^2
zhRI9BqA;z at N>g*uF)`QSN*;kd;VhgDZBOJV15QO0->PHB+A|<4>+=1!N9A2!4h1Vm
z)`a#U<BZHKzU3mKHj{x~4o=8+Y`}Mrfi2B^pS_j~*%OV%r^4&3f{GZJ#300#5~kcf
zUSDuL)LRafmcDBZ0Q>-gVpKFV<{UiZC(zJ;11~MSV_;h`Q`@yer-<XX0mzRkE;dhi
z;p+`FtK;hTH>arVY=H%%yS&+3o13e!Y)UFB;n2wf?xSAjrNd5w>>)!A2i1mbQrS0Y
z1mBoS3dy5_WQK{MIi`uS)`wz*R$`6a6p2Vcy}#7|M6OROG}>d=Bl;fdZKE?jW at dSx
zvt2C!tOYrJTwL6S;Hv<q<&M0M#bp|?DwUr=aU+XyO?Cvr3=AkB1trIg?4tTi0AL{b
zDDUW?20&|JKSiEIX#Z03@$ogiLj07Q6xT-yea|%2jz*slYRHDdoj`eF#BpL-&SNWh
zaD0L_kv$Q;#zcrKFRT24DtBL2g$le(vJ|Onzqf3%>gxE=IZK34NjcdP3DLm#o3QbH
zFaNm1=#6IQaTWib$2XkYmi6|$6<`$Uxzu_Lyx at CPQ_}-s&++NF)T!08SIqdf6V!6M
zT*&tic|Kk?s(*7o_5gB*yush28;>HS#vYAbVm at -vDAimojiHrEp_M>p*8p^%0lkoA
z)K{+_f#(brjZ`S3!X8?M3GFm4Sz1VVNYam{&&PL<zj1l at T9xioXshSlR5XF$yjb-+
zL)FKJYeR8s>@51C{z<rhT|zvXWj=Rmibb=WzlU-xG{Om^@hB|aMRE%ZsZAq{TqNaR
zNM2vd%gI^nO;vJvY%hddpVD>w`|&=rZW?D7P0D2{|NP`c226{-WE#gaaxz(Mh)ZCF
zp27}1$g?-%UbhV6C<xVKk85olSTR)WD|<O?w90Jd=gf at qhF*q38}S`MpUc`{cAb#?
zv?um1RPdrJwB1!Vp)S)8!&&V;EgFlC67mX;*L#KO7&%s+pVPeGNjwio+Im1ew?dyY
z%op^>4f&D{HUYuA3xnaIp`$O4rPiR>Ullm(SN>SSJAe?Sl7Kpobt$T}#VaiU&em~C
z$mQp4K~F8MyTVR$UE3so?IL`#;6;hqw8VKsiyt=6>V#^QdSu^w>fe3*F4eEuck+#I
zRjRmR_i)UE<ZDFGtz7?f at 7+&tm<aA6SkC_4`lzJ at KRjR>`EvoLN677li!BMgNz(g0
zP69AcYAggRNKgm;#3^jEx%Q_<vkD5RklP0=(GoaX=^Ua0 at ZJ*GZQw?%!Gr88Q+!<@
zqY<ld^Xb#4H}I;!v&z*JnukcrIC+)Rfu=RyK;rR3%a_j7#Do`E2(p<8-JeYKPtc}N
zQd8>z`@tQM@%J6|<-0cJA;Rk_jEHP?>S}($-~3JFtu>I4Y>KAIKRPw1!S?e;oglzx
z{v~)bE%#JHLW0kGUk8s$cx2zq2UI;WoHzA#6jT at f{zA6zlH~)&A(W@(6G-PXpI}ms
zRT#bZ;WF3lLk(47>My0wNyyboAKuzs`6yKsbfSFreRjO84cgtvYl2f4|JHUKhfS1<
zO*7zCA-M#Jf06*7HSK0u^mN+vZAC>zwZaE?Gg#Cc+sRDe*n(4N2~P^@be6<4LUUQ0
zWhB&Na{rl58rXct4qHsV%S(jH`FlcNNFau}$6%2Wld&LF|8AasYJ=b12}_ibn31<s
z<ve4k1h-p%{&$}GA*GVqjwG!?mv41TmU=-`kk}m~t>F)ES_u&rWq{}A?rtnno<Ma0
zYL?&|f=&1ckj}xuK@)T$Af2_f^{#L=6{1$`8O@|;<x8UV5yb1FYh+dV`tomVVxkl2
zv)EUW#6w&&w|L1kc(n@|bB2*^N^pgsM!s8iv#?+Up~mLc)*eAINeNr8NA1?;^-ikz
zERDw!38F5*5s at R*jhndh7(b0iYlZ;5L+nm(rCE-4qA>DB0BA-)*Ws}N at efpd#Tewf
z4&VoGvC;czosejI2-c=fv4ul04Kg43c5Aib(=(+oh`PTpDo1v>>>p;|>3zj)Rh3qM
z|Ez^W at Gt(^zs04c;|bZ at rLYBezrG@ZqAxznOYqqtK}`V3Wb!eX26Wbr$RUna<k#IN
zMsbwwDt%r4L`z3jiTMednRPnsd_D&TQ0X;1xCQY6viI|6 at 4w<X%zn!*V~y=XN;@3F
zCi#3afpeTRr4f^WWHC;X&G)AitL>`SrqX9+(I~ni{48{YC|XDGCelb2+8r at ThTHGs
zQR?{lNmWRuI=!3r93(O{ju=a(^Gz6f@|=6+!pAJXHjv!Y$M5;qpnbn5Y9!`;C|V`e
za4Lf=GFqz^{#fY&TOSThlra73_~+Lo6fK%siCpoXe?%)B^A&Cknf8a6#0<L-ISct+
zHn>OWd_;SXh=nsXV-J<NIU_mgd90ekzym-EPN+o#!&lXwzAZs}4{+wc$Hjfnk3?Z4
z#tzA?B8}##@Ursq^!yA%>j<0_!;bm{my5->wzmT#-`%M<(MYtV9dy at xY^*_Q%EABh
zfEw3-rfjH2haLG^8ocWR=7On4RYyl*eY-%_CcLIALu+L>JmC5y{aD+9E%tK7wCCl1
zAB3D?kgXFVUqk7rWRQ}gyLIbUtJ at lCok`oLfZV>&mei5I5`w><eMvtK6j-HK7(Etc
zc^6(@RIYCruiLwsHRnIVJo}u#h+k08Bg~y8%bHsvZ#d#|^u?FEiYQ0xxB~10x?`aR
zqLe9Z7Q-d;Ug12Y_z at I{4STt$D0&the8c{wVI2N#ZGM-0#)_J>dTE`PEx*Ct;<N0*
zhJ at MpKpM)gVD)2wS at zUkqtp_+Jy~VK;8L0fUH?a?iVcD@?=xW^=~n8lRDt2j);m;g
z#|X0G8*N?$DQXFRn at rqEz8sb2P#ugnXh?*^aD at 6ZydC!X^=nO_kAOt*wxa$lho+2R
zi6wDcq88?TmxlKgD!gB!tDy!aTW|J(DQEi2*go=A3-FQVu@!1w*CgH=e at h|R7LUTS
zzlP~?%R?V`m-C4Szf2JY7wZ7C)qg{#kCw~nF&QHtJaCRp{v#vR_7fW|FiTuQ;w~j+
z{OYQOpPyeBpe=tM9=z5B9gKm|Q7Et_PuNe%WMXsutKGc!g8Jm)3B{4N+Zpxa(FToF
z0W52N4W8)<p6B%z_ncKGNlF@|%kLy*MX`@*zVRZ&;A2*FZ|C30AoOo23L#N6pY`xJ
z;N3&VDOr}|i6FOS4jm~VE3d}6+m%Bxq17;uHFm$Cn8SKISuBLs+Ns<6O7n`yCeE6l
z0$xc-0?WD_C<Y53A5 at N!wkhcIK3a3Dmt~o#^0a6KPF||zj>g10N1jT*jwClyml*?;
zaeW+|FihSdc!Y1{Q4$r<P~^0X^MzMc191n{S?`G`$R>7>$yzn9i`#2aYH;T;LLT1F
z@$b(c<T60UD8`tdkr4rubg}b!!3r0T&a^@jt9tA<p_wRJlCHQ at cqhrm5+<MLf%Cl=
z%mUpUR{cX$#+4>b>BHo~`DBynqQ6)+Ts|Ynh3JEbtrEhqlh9W`sCIFr?5dJji7!&r
zf5<`z?ew8wsK(8Ba)!p2Z>vzGypJs1wcG3}QW++tf750xd>@8xJ}%m8Z4a|%weI+Q
zG|o;$cncOcUebI#LY{udt|40AK`SovQ#wD3!{~i|hP=-XC-bz{oTZyMmgIQlj^->G
z&^;uuTj`X5fd at SkEI5czh5f%jngjAdSv@^cC`Qi>Nw7J7Ox>mTHaaaapWN#nVQV&?
z;T~JtIg%8~>9rI8QPH;`TDOhh;fwke5Ne0E- at EB4s3)3ZO~8ah-NPC&C|F3bVe^6J
zwV<GAv2rL!2CKj?Y8$nt at 2b)Xl+g&rp^>rX2m@=hwdY3Os7-`I7d5sD_8R#)udMBi
z?qmAdn=xfhLf5QPAvIh3p7_!K36BME`qGGz0vGixDb1{446_h5$5M1|46Q at KtA+tB
z7P#1}oT29`(RhBI8u~4v#7e(ex{~TH>%>SgX#7?OzWR-?-W38+C1VpP)#}UqyA>0K
zNhvCkQdmNxE#BDDV>uic=7KUstr?c6CD%R$t}L?dDdR%zl_Tdo*{V2)pTh#ik)lpi
zwSYd_L~OP5jx`EGCB79*r4scjn~OG}JS`gy<Z%TAH1aB9lF;Q0)#+&kBPvF@)rmxh
z_lVMFLBF!Bf=S#uaS3%++59EaSz?}<m{(TIB=Rc+s4aRGF?0fZ5FHo;%<dgxH at yZh
z5wN**h$WN=3%rz~W6OT!Twbb(qvUAR<;DOQ)gK2mo_j>+uu|Z$k})PVOvJ<QIn#>#
zW*Hi{R0!<}lu4kHg!UI|A#L-sMub{sX<2qpnzzKF5=bm8VGD(d$$e%waXT=&sbcO0
zy&i<M&*qe9rwR>|qc39Cd!7x7bA;xwoN=ORIeoMlaM=>PAfVtH&e&BlVQ679(+0dz
zDrBl+XwIvI^Li=B8l&N)7*VnDvOqw=olVZ?kn29<HPXcgj at D6e5s;WNvvih{p^>O(
zrdL<Ocx5$AzJo2BX7dS!jAurTFdr#^i9T2-r;^c)d@}F;X3`;+QX)L?)^K?p8F&9G
z1gJR$mvd4GL|)a5 at nqXQu{2$sK*R$`>yQEHZ^ExPA>XMr at +jrI>qU%Y1#_=G82yw|
zR04^GCG1+Rfc~lP_2fR(Fqeue?068?elEB6YZ-^ciCKqqF7vEhoFg`eYK|hbIdIvM
zHWVu2c+hAA)+n*bZnoNxb|~;Ok%n_HAt}l$3kw1)waHc&mNGz4ho+kq9T=l&tkR69
zvxGb|81Tx3ax?64-xUTtGgesrpr;eCCv;OP#2h-rQc6S&c(o#WE=0|-xhB448oz<N
zmH}5by3%k?A*^I1%qgF?rcGdrN)#p*mB7Tp5*0JQ?0uAR_R0MLU;DMp+LtwRagK^}
zrkWMBniIU(?~!x4FbZPS+iEV_popOjSe}-x(xS$O8c`o6A!>;cWeq7`^;pVyO@#~%
zP{@tBngIg-$O##jb2OyPLUfjpX9fdaStUoW(7#nNQG*mEXSZ7L;7j*VnX^~P5?ZO;
z2=Hn}^jwUZbKn3?&KQn*0ideqXgXLKv|3VRoWms-0eUG#C8iXX7|RbjF!t%cW$ib2
zagNX&YFkQyn)CZuWp(0=lv at kX2DNBfCB-WNyLpjDi{=<n-jLRE^h7ZOuEkuwt&*cU
z4Dre`6O@^!vy>7eFBRjF at e~&eSf+SpV&E$!g0z)>nCo52L;#J?GYQe`V#N>t?SN%$
zp3E&OF}JWpD}g2YZ(92;QJkY~X~jVcf>=w^24Y4@#(83<&~S!~sE{G85~1CArLAS6
z!+ME|BSo2o=qxEYFENU%4#FMdwPxst)CjV<^}|vl4H$0^^=AbuQ-I8rq7uNe!V>(6
z*1je4XpK4iQ-jxoMjL3G$%qPhUu>mb1*5dpT#iL!0%)14%u+lvsa}~ib26qxkS(Df
z)?R!6YhYy#*qgEy!V*W|&$#xb&ZD*F at J|a~4<c>Q97dGqz11Au#!^*0C|E;*q|#Z&
z_IWiY#U*>d^}{X?o~_c_NcaAm*S at LqsQoi3#Qy?qU~3~PWJv3bP;RzVBvU=Jmh{RV
zbp5c)pBp^?Y-|62%A5ILq77_mM1>5gwJA4S>x9;>A9nd4wwZs%wQmQnKN)RcD<jGq
zPVIk7xNg at EyV%9P_U+(hpHsWS+QlyRwQm=@*u^e(v5Q^oVi&vE#V&TSi(Twu7rWTS
vE_ShtUF>2PyV%7pcCm|H>|z(YJlOL8eRS-82%9z$00000NkvXXu0mjfndO|k

diff --git a/src/audacious/images/album.png b/src/audacious/images/album.png
deleted file mode 100644
index a47bc7d7335d00e077a7bc0ad315f0fb235cb30a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5418
zcmV+_71ipAP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00001b5ch_0Itp)
z=>Px}<Vi$9RCwC$n|qL4)qUqb=bZcK$Gp0yhtUHGG%^SwVM$0B at ERLoJBrzmbzH`a
z?T~WTcFa13YqPbrRlDUXw}mk##&(QTwdJkatSei=vE#%c#x{{LU;%QFECmT99 at Yai
z8qNFF-80>N?>*<Yf848KB)|z?2}3QX>eQX-$L;g`{@&kTH at vytTyL&7*PH9j_5bZs
zueSr;d`tg%kyRHcZ7)!$mA+ at zinzX3=zsWczILK{wm;8%Erq-BMvUoOwoE1Q1t at i)
zF?zM}SckAmM3yJ9^!Z`VEh+cfa=GmHluBNASD8m1-5IrJX8VBSuWJB4_OYIx$n#dC
z)c}eCQTk%flZ!wtbqUKr{J at uHxxb=%%jK|KE(hIRCAzyx6pJMa`EIn*wBuRYagBB~
zOSx+`dv^aKL66yUp_H=*z|DW$|9F(R&AzAS%avZ+TkiErJ*7fVPmk{EEYZ=?Lr1X(
ztv$aLP0@~Ki83J@(FjwGS>j|4C#TEVSy+Y>QK3`rbq#=ZT=vONeA09jdOM8{GcC>%
zMK#*-7?ZWboSd8?ie_IT<f)~VAs<%A1wDjeiCj>^=nxT6*6G(b0015Nex7^bJG7!1
zKwj~6f!|3O^rV6YCGtTT&+9>Ko_cMD$?3^tv_9$HcE#!-u`L8gV&4D&07OXx5JJC;
zAm}FayUB%R@?kHb-;L1)YK>{8XT}*nInx at OI1!DF?)7J8$HltVVJouFS=p!1cWvHu
zIZA<8r}72!#sFaDlC5+WSD;nM?Cc~nvr`-&nslRM$J%4#<6eDkswK3a!O6ZjaX*(>
zo(huW$hW>VGqd<UANh~{cb>}Bf+#&VXWtM26moq$@YDO|4n6&h(S{*~9Ec*fTPY5Z
zcn9zKU&AlFx=Kaitf;v24dMcz7#o`<5!U|opN~BM|9&?ON{H;aaRGhy#aD=kLTh{0
z?&m}ihV~5s07 at eQ*0tSPLKG)fHIm#L$O4 at EwF{SOwW_Pt>cER<Q;49q^nBpzYPDK<
z{l@^MaJW}hxNP6P{R+?XJ`e=KP3`vl%3`tL^qA+J0 at R793olr`V`5 at Tf9Z}dCSjP{
zU#r*u(irpipZ)A-hhA3zC_qI1#lq$8yYCKbwc5u$&$~UJ&v&d at v&LJttU{?&LMyHJ
z-Ff!{ponn&`>ywmF+}aiOixe0ZFqR(iv0%;{MpyO`qgJ=Yqd{TtJR&an=F9HD;6#y
zqHeqGwvRU&jjs<34CL3YU8_o^676=KBuSW at m`ZC%k%cVa#8I!+QA*?cK9x!zE6!i3
z-gd>?ypfTSb&u`Z_25^&@|EZ7_4)^^)#?+!c^42=;u`K{{Cnk{ciwq_UtiyvtFF3A
z7mG#e^*W=YgD9o4l&8_koPJ9I=LD^UIEvBQ04<C$^e<V$2S4~hb7F9C^#c$7bkALP
z-SroZM&s6MwHp1#f*@igKEnk*|M|~v4T9j=jT<+vz3#f}bR5SF4Gqz3&SI^_S;2{5
zlXRbEQChIpVV%o>&>-NfBWg#)QOvUC%endYZ}!%_<t?A+C={Ol!WX`<{5O*ZQCLBB
zCNH|c9e3RE(OfR~lk2X#F1K{)QU(VHnVp?QsTk)R&Ppnrb%+B&EwoaCLW at S6ATEPA
zOSPxAb3zg)09^a7YxTRXdFMbF1P5=s?Y7mwAqx-{$0-1}-+uc|zVCl)+qP{c2m*$N
zhKS=BrDH@=p`1u2V73=ofC8LKg>=?|fH+B;&BYs)T0|VPX3ZL||Lx!I4ujyItJUht
z*VqEma~qSl+qZAO+V}mx+_r6-Cn8KvPNKEOcoxY7I;Htk`;uz)C7{ZJwv9FmKp|<y
zkqki6s*yNJSg~RS+ur-0&SIhP_?N%@<>G5t34%DQ`ueW#@jP$Gwbx$j8)K-|Y8YcM
z#+)i|af`I+oM5fsT=v*P)<}hPiNhrhqdgF{U^xpGk)>ayQl2-769xuWv*E4lml&hJ
z_nM|baj4$PivP2I-DMqpeSM6KjG(nfM9?~+*=jL7c7*ZC=a{JvlGqkDX at i1XSfZHg
z#U;^cZeX2&QJ at VDg+gIOrO&Dq3?mAWv~*BPVXfuLE3f4EiNW_)tJUABR;%~D28EEq
zAu8~Lts6FMc+u>Qp&d=~_!Hmd*`qt at t5g^mxR6yBuOyc%;`?D%Kne4WS<YMWc8p1n
zCraTg_`Zj;sV}68R)|goS59!GkDH9`7fIdhns>az{KF4^cu%!jT~e)9=YMSgZoH*;
zxv}Otja;lewL+m{2P0y60m<Act=!brSHIoV>vh`gHr85Bj_v114}FEpH*MtBZU2pq
zVlVT}Q5wx*=35gq+s8<36Rixzo*sJ7TShCIBn<k&2@{jkR4TpX!#v_Cv{qncAtR_%
z?OA#hL^+~3!il9+DlxF?!s64<Jojnfu2%)XO}8w$&{Ou4O6foJf}rdCW&O5NsT7OF
zoN>+)$HL^qbaP~ML{k4#2tuh;Vrps%Yb~?&F at E&mpYov_Kg^2dm(pyFQ=2<ZlFVn!
z at HEZ#1g-YeX`kKGxten47L+n1u|-5vZ_E>f0r^}Gj6$V}0bi%FKxv5DZNyoWQD_a;
zS~hHat3G_>NcEfF{N~p`^{G$A{~`b%y|vt>t^ZZvBbzs0Vb))|DX5fJ5=FDjN0Y>H
zW8t;_x=Zu<pci92oLH1VtyWvm{=TQa!&O&aL2tR2!QqDpf-Z~>h?6;5(F{>sBZ}*%
z6Rd at 0tmxm$kMI9J=lA~`Qo}ZgXrjnsU6Vo~pB2jr>x3wdh~qX|D?Cr9F at Y3-uC6YY
zE$z=8IeL5>aNn;4;O0;CuM(?vu3x{lZ|gh%UFdrObFERvr}t+Aiy4~jN!rnAG#<X!
z!KDL#fE7!<UMG&zLT7yHFq^O3%Fx(jw4y0IQv?KSTSQ6YG~sh$ne$2;=q#+_ClB7o
z<b>mzjUUDj^H@<h2L>P!=I2`!iv=9Q{QNvlEXGT#L~9+Wv}!a)W36S)B^R6ViRu6R
zD*^bUKf-Ss9(?CDS1sGJ={<V3ehjTW3b}ra4$w^x=OUuG_7dRw%Nsd4e3b6aKAO!Y
z)>=d&%3Z5DaNtSaz4f=4n0b=M{7GUvkGKTS<j98=iuomU7FS?Y2haWT0K0bmPnP#@
z;_{1bqTLiK<s!b9BXJ2XD}E$#jE;{J1_8!^@ibx`X`<C&B~21qp`Ea7*)pQ2^^Wg;
z_q*mpANr7eSpepwe_L<4t8)2<cj==;KO*Os2!rl4RoOPJXqskwl2$Z*n%0(9uEfSg
zesJGk^Y+XCc)|QdA}+q*ee5~(zxnoezRi}+o2XQ-ppY-3lp%^+v|CL^hEDQN#~$H@
z!NYWSTqNh0Z;S%Ee=;(8WJKewd;a({TUHIM^VeK-F|kc(&d)Pjn?{_Yr_ at cM5Fkq7
zDV1tor-hM9=_!<gAPDFwb*n>%4s8JTy(|ENbQcPFoLJ`OM``K_e6NU78fzn>q=B_9
z!l0YZ!V0=OR}ttw_CB#E-t&vc^@cUSZ at LOAXti31L}^v$G at CE^1k<(WIk^7-Gxfc+
zqB<fD&xH7XC&h3nOZu+n(v|OZ)6<P_|LymF_$N<1 at k9eifVf(%u6$we$%mtMvT9)U
z03+j*Xf0^1sL#z2<^r&80R&}T28IUZuvQQ}ddo}n$neDaR|G)ik{_HnG5Ti*p4?O1
zaM{hO*&3ytnY&hoAm}0tdJv~MdGZ)PKlsnBLkFL7lasCQo!|3&zqfMf#!ly4nuAZ3
zs|u7;lsX3}b-e|Jq1lXSw%Xtnf+iQje5=9a%*f6=?zsKdOz?$cRjbwG)oS(f6T^p2
zbe2lRT&}>}d;`x at wAwLIV(~F}3akR91m#jjS!snP?I?RnC2fpZ|B5l-uf8!=`@qMS
zZrQo>q5tvoU5{^FwQ3;l>MjIIYbD~S)uxlN(J4DMHI+*ed1`t(-f>`8{YS&YN%NLl
zf}1)zI!KZP;|b1rhy$CXThNHppi`D7 at HI+l6oy>RXJTr?9z6Kef90jEj%0ko%=Ycu
zw at -`@eraG}jjGSpNL;G%c9ftz15VIRkyub#Ksl5Js}$B*^7%Z4LUG_%W`Vy;hZi?o
zv#oO8%<O?{l~SujBorq)NvJn!$+1IEHV=&)kJ{Ni3}Cd at UT0?~Q52CRnj~=~3B+3P
z42Y<-(bWb|E0lJ4zQ*@8LEtknrR}}<-g_9ZXY7ULoO`$(O(bD%t*^4DtZ3S?#UvIy
zy<q;a70?>xELcq(8;tSLT2=lvg^+#ZA1B6uzg;BcnOBpUssXg;c~U48 at O;508k-1C
z9B~_>$RSQ;fmx;QfkSDHHX7d#P|6b^&hBZm>r1ArzNeMeb0~>X;y?^e5}XT35{K40
zEsz{&o5l$xvcMgP$iKQ9wAq28Y`3%B%64<nwVBW7lQ0bF?ChkYqe!7xq);f**;Sys
zr$ARvkzyfFkjrCqo;VJeZ}`ki`_yJTXt#3St+(E~BKxfP<%BoJY+bUXXrO@?wouBV
zlua#+1P4UckvPHGv<OP9BS}20b+n at h5t(>3y?|tzNET^bFS_ciVbi%>Zq67J=JO#*
zl4LGmu{L!Dn+QQ5SeJ$YS9e&eu~tAU%DqdB(v7bJzx8ql`QjJ9*xT3J^SR~A&r{9T
zJVv)b1SdH>EhtISBFGtH>p*L?K$18xf&laLP3Gq2j{Lga;9{RtivZAo%IEV(t!tKx
z#r{<I*pehE*^$_^)3Y``kY_?#ksw*XDilICZG0<_Jv#C3FW-6BU(7WdpRQJ`t;K|D
zrP90W^37}W#bQ9McAPK}+EIk3e6)7y(XtLXaR%drG%P3*>u>_Iv$M`Qckpbq!*XVj
za?U+4*O=SV^_DK;*b>JUy9kKbI-*E0+M<-Bqa#Md5Qe!lC?dS;nyvc4fqfqv9yxN;
zm%j9;4 at A-YkxHd>Z6WVpcG+dCO>eoI$;oj7Ut^ud;qW~{DZ7Xn0(2S#mC{J$;d?0o
zGd?lywATC22_KLo$^C~9AN?<zHf{2h))<opB4ZTdEY^WBf=eJ51T0-rq~2(zU7T2)
zO>6lpwro}-BTMu3`q&NVc`AJ!<njf=KruRc9Gg{kMnm915Gq9GQM!OjS!py1!NX>h
znTMj;Y|*IKt#j_la{@q5PtQLM4xW&9tBn_gparKjq6MV|qe1(Iz}F;+kT^w{6QWid
zm2tsNEaMZCw4)YXon at 5iz$Fp0Q`5w at fi@b?^AH7E3&oBQn<Q8?qHL;hB?uOrqMdjI
zewqP>M at 9$&v+J|}z3R>hC-|Aqe5URDxgQ)odMs^6w80pS)*3$u$mR2RzK>SvW9j#W
z0>UszE7mL}&Nt_X+b!yi8D^(vn3`x1CoxGBVdEC<XdY)HJYS>aRKb%V(n7E(vEVF8
zqS9G|btr9k{@BrEzR~#VIVDAFwc6Jnd+g_lWQ3(Lh9K}UMxzuNJ*H7grTJPb{2(Bo
z%VRu^a|zbQD3f(@o<=Lc1z=NRM2X-T1<vA#voPdPE=lVGmA1m^kimh{OwY_PJ3ZcB
zx^(G3o>Ks-)#{_Ic64;`_;Iw>Xmv_hg;ps;gH|aBn(Q%+=X)v3qZGMZ4lnRgTBYyx
z)21euFVWpuqL9xcl9skENi~dQGc-xSS>iaIDLQA-+Hm-}=bVzbx|j_*XLEsiz45Uf
zJARTl=Q5g5rDkt*T9sw2t*11~WK$reL8mjp?w%fc%M~hp70SJ3Dt&!)b#_xIcHsFr
zl**x12+pMG&5;E=QlZ5m&VmS@?=dqo!}P?7*(6E+{3V6exd7myhaNid?svauv+tWr
zmMvSJ4SF-eGUNKysqvSj<F9nCZfUn$=|D_7G=erM%c!&<sMOyjEj^t0IHz$=qwqj^
zpbc^C0XmC8K2Pl1leqTmzpqxSPrp`^A?o$|e|Y4P$7aUI#}=w4r4=S~1(h|0MyKwf
zP{dJ!HYtU!wLu$$N`pbh`sy at s=~Phd8MFyd%EOV;Wl>u#Op83v<GE*_5tY>L{oLn1
z_rsSvr#VORn};8MSk_!}$*z+pPkv<Gx^*V-gUn4&4Kgwc{ZtW!q8+smaT!{Ikg~iB
zLt?TNmoo1-Ns}iFq^L<*X{8B*94Cf`85=q>{Nwxn;dciI2Vc at zo(ljp5CVB1zkB!Y
z=?hn_Iy^EueElVttku3BEc%5)I>kXL6p%Pa9K{(XDVHZI10xd?4Web?eJJ(fG+8O)
zM4^-+4D*bRO>pAavyGqb`0 at K5ee}_Kb~f+Sy!BiFU^3xP+k5x!J#pT7{e#29C$C#`
z(ZxE<<x(rqYSCa<5yvr!lk9(42$Yb{`_j1&>0A(%R(!lDd=mR8?cw`5P7aMQc=WlM
zpYFK-#+^HNj<C=noVMJ#0Km^s_Oicyz~8 at r{|kje;i<`~$@lh_E2doOJ at acb#7UfW
zc3C<*bz+qbJ+(sAi(kcq%#E}rPCPt6#5u*`UmljRq2t5f`SxFZbno81qZ!8T6}FsB
z0M6_VPutHt^UTP^#Kev;7hE-X{CL*|D=$<*7-RxEoO2605=nz(Y7H*?<{2+4QXHZ*
zXpKl7-wzob9p~wT2kqF<@gIKU8+ZT7(9qEAqBj1O_F1)nQ%I{bh>QhZZ)9Yo{<EL`
z?EA%z;>6I&6I&X!hAEfJDhyA#1qi3|c at _s21xq0-sEmj4Jd(s`bZmly2cEQ}LxU$C
zdSJ(Yy62vI{w9i|<{|<oTC^9FI|AqKM^gp}vhAO-J;3Yj?Jd6l{qO(XHES;UR6gHX
zT65`oQ>paPQ!0bfM2RD at 7I6vICZH^cr8z&x<n$!NCnx3PiRT?jbZFn+U)+7~z4z`u
zMWHXcp1Ip+vP|dtS7T~XY*-v0PU97CxZ#HNmtMO5-}d$O{my(V>dzMnuB)qz@;qgo
zD3nOMIVX+Uj7D4nJUe{i`1kkh*>nHy-Mh!m;1JK;(c-B8atC~^mtI7zd5hwN0aUSA
zG~2dqTiM&&yK=FMI_H{4jvV>r!w)|^`7(jcE&{>wtA4KXIso9+TF~NHa at N=X1+4NT
UP7q7Xf&c&j07*qoM6N<$f at _h^X8-^I

diff --git a/src/audacious/images/appearance.png b/src/audacious/images/appearance.png
deleted file mode 100644
index f73239a5dd1a60cf435abf193020776e80b9af1b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2721
zcmV;S3SRYzP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000VTNkl<ZXx{Bv
zS!`U at 8UD_>=PomM7RSywF^NqUvSA>Q&4d7nsge?)tg>hV>cT^o2S9x&Bq^dsY*|#K
zQa~i?163tb)rf}%C`v^^G!R8JA%x(96Pw_Ur?w~KWjxDW&eDg>Oec=*5M{xYIMT0s
z=gd9#e&4^Ig<u at Fb=T_)m`3gv9Dmw*z-t}p89H9UuWvB!GIj04mDklh!F2kM<`rNg
zJ;%l)_zg?VA5x0fA6Q at ovtkHRN#lzc)c=JA)-N+}qZDthT at VPGjNt9h2Qy01hg(`8
z#yx at cHw2by3N3flTfqv8;DdJ0&wKdd)sLM&j5cQ65ZKtDFQkxrZ=Guf>n2cq-p$e0
z<NE~aL11L}88<Poewn_=A<++(Opn-;t2`V_Ww8GnFDnUoZ0E=B at v+8|?+SG7>g_Wv
z1CJ7=?iNzinpD9u2y&i+%PCBn_grG{mR$b!o4;=UbX*abe*4x3HI2SHZF+5>YSKhH
zbIJsCp3Ea;5hMpa_*@{99>QS%py=!F at d+VYJKlQysc{nnnyx)_{j!DjjSX{YI1<8w
z={5kMDx{y%Dggo^8&x%vwYn?kT1v?+<0^;=RM0eZ7~0t#Kw}I_!5B9L9&SKH7x at Y0
zeX@{axIFjwT~Y$;79!|V;{!^R1^|7zQ?==x!+lUnp}i*yCC`n;B}=0}TLFu>*54<G
z$-F6nEa~k at qNn{Zm~#>~&4DV8pb}6}P(+6Z18Eh3$0h-U_I;-W)-8liU2{)mkX&>B
zwE=5!{!P5xk;6}$R^a9vn-Gaaz!-z3X;4Z*DTRDKkFKsR?0DfNk=Cjo7&S&NMa(Xm
zX8bW?(p75~1Ok)*9eoPnIX7X$hK&e^!_ajdnx=tL3Q8$7O at nEgh{a-9vUmac;-fd_
z&7M8`wbs^Famfj6xZZprXwtR!UuOkvgW~u}i4WCH*z(j?Se69<P)dPw4$e7*5T$zn
zh(@C%7K>FMJ$f{D`0(L(E~yJ`yuo-v*T}m2t~Tw;07Y9;;6QpRmfdqNf<YUu>q65s
z5JJ$~+Y8V0&LBZ4#jIJg7-MW*Q&ZC;EiEnLl4PL`ORa}AN;chDZ`o6$8ro9=?J0qz
zti-H2^Wb?ND5W5T6pGi#HNo>dxUP$6H0m3MQFBSs=(=TABZYc#<!sZQ6QgKP33L<)
z5N5(O%|iZH;6lRZ5@|<ZAjdI~<H&obr&7*2s;jFxfXgqs3$4E)u#`%<XZb9{UQ(;$
zt0XUJ-{lI>1EP=H+Q<76m_Ka-CWKBE+1&^F(49)daU8gg1J84yD-MfEtXwo5!DzKE
zrK|(+(M2K9+}s at W5{DZ5Ti<`Zp%!-IOapC6fsT|!drBbfDufJVGg=^@75c=1tc$!S
zV7j6-|2eHXONF%Kqt|ip&$eDnjZ~PF(%Oq=0mHyl>xzcADrPRkOz%B(B#)Fde=@63
z9in{DkzFt%9;I|5mkN1LKxcf+7yy8woC|C61i~1bbx~qKDMfV4dfKu~XThRn_%w1m
z4u)<;M at k?*C@?8P)Sx2=IUy at 0U=u>YrG(=P<lIvNHR_ at Z>8u0Ov_L7Hbx|y^W5;uk
zn1SH!ci(xhRZ~-gy4pIt^EQy4l)`0V9|m%2KybBm*8!*Vp*bo at 34ss_c~63pQx;HT
zyg!|FU|A-VQgs*H0?+^E`Rj<LJv;yEYi-N2Kq*CEUmq%~YB2e#n~)*lEa&9Tod?`w
z0HBB#)HDJv6&#Nv>k4FDF_r<4$+<8M9YSH!1+~DoZQH_BslUvgJvX>`@e*V*8SLM`
zAMtn`jA at E!46&s at e)q|zU)=Y<sWY`If(#8aqo}L0U@!to6y{Eh!gT}ieGi-qq_cVS
z4>{;g4WTWbLf-LV1j0sBQ&Xs=r6qGg2v8lb#j2{SRxEEMLI at l`ejJHJ0;Xx;>l5uc
z`10pwXi6#VH8nM9+!<o^Q$x5Srb8(ODJ3}PaG4IzQ{bFH2!ZOb20qaOuMMH`su(6z
zO~jY`E8I+fZ!Lg-oi~B)zuCIcG>nzEt-d2*7zRH3>@y at 12?)tm=ht6nxls3Q-u%Sg
z(=(M}8;0Qnr&d at +0%|P(DNfpmLd~R!s`Es9-FXw(zWv#2p|InQ+wQU}Dk^Z~$PsjP
zbzv|)!21VM1H$)i*}Un=&(8p%Y2jcn$jb>7N#yf+B$G*ao(EmmVcYg;V}0L8RaF%u
zgw&l^3~bxBEljA|bIUC&gLQRvXl-ppXJ;ppCwuZkLxca8f;Mj2^kibBu~N!VFc=hN
z=@(K;bar;4tE=lYOHfJ?i^X6VMrk at xSy^dPN-sYz0#sMK=FPq`HvgLW<k+!eXzyr8
zyz85+=ewU|GwzR?o0~JEjpdw&ZQDN0UlNG~lF1}=T_0Xs(AU?8Xfz64*TFeQG#Vw0
zu{q~VVAZNs3r*9UHnr}udL?mBW8)9Zcs!1;zWNd;PPAva;CoFyxTd*zlRM`6m9bDT
z7%XXeXlMxi{r#{ktK?3_|BCmyTn?d72%K|-!(k9YW_)V`4Gj&GDk>`e9E-(nuB at y?
zZ*MPpyFcNSyzI`HKGQtjaV#sP{N3Zf+`NSla at I%`LWFJGCIxpwGMR*Fny1A=Igw(Y
z<2ay{!nSQlDW`m^LRMd2U#aW*`<kZRynOj`tX{nuH8nMmQnJ78eNSus@~DtX{$kT(
zTQ+|i at P!t#ZJR2kFf=p-#uzNif at zvC45M__bsf5{gE0oi7$~LieIKT2f)G+wzN5%S
z0dEjO-jGtxi$<g9=;#3F9H~?azVE|zUAFJTk2b&i?%v%1LWP+?QDoUwmi2=W5)K3c
z8UVPi3(K+~gn*Q?Bti%%rOxOt{ud61`I<Frs(0_+-BTn$3s<cusZ{EPXf)bbQ&WQ}
zQ>Nh1p+h)w<Oq~fa9tO!>mnYHp9D}<HjNnxyaXT$B7NVlv~64CoR=2zLWq(`DM2ZP
zloEuH66j$I8$Xpw)dA=!ZtjN52r$dCHiSZ<U)R>wV#bUaNF)*<gp{^CeBVbtpLg5Z
z+EzM_lO3k{;h<H~+-ujaeN at x5jY5d?-bi4K`Icopw`<p~W>zRFtROc#j`OQXB!X-<
zi-QLb!Zgj2wu-w4>2!LJ<2V)ovj9>6;AK~gP{h`6- at aWd7O0Veb*$gzec5bQ- at 0|{
zCIHW{G7Z)P*a?88QYqweIaroes*IFUD5a$1IB#`#cke2I9qu|sw<P7-2S9`ntU&&(
zV8;Sqyca?k01O7eD`;{ZfKLk_BbiKw_`VNa*B!>#f25QhuIui1T{khpxk8adF|(0^
zOOoPmP1ATh9 at iOTV}dQF*x}C%pH@&xJphye$O3QxJXrWxF_@|Ay3}=DS_X=aaxhY!
zh1jt75CEFvIKO}8l~;bElseZKI3q<9LIkDsB>;k)<@kw|fgdiT5l}@1l#yU%qLnMD
z?ES;7S)L5a<Etn>0RLhiF%?}&9|l?*K{3OXF;Z45C!@ZrGcqzv^K=wz$`KO8_wD<3
bq1%4}<Nc)}8e<j*00000NkvXXu0mjfezg0a

diff --git a/src/audacious/images/audio.png b/src/audacious/images/audio.png
deleted file mode 100644
index a41d51a0fd82c1ae76a8325e4d34fb31d00b0ea5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3224
zcmWkx2{@G7AO0{|2ZM>R6IVl%aK%^(lWpeOZwpd(Q6_7JglvNhQq(0&TngdRHCdxv
z)Zb2H8^dHUNtR3)+5V^JIp24l=RD8(&hK}A at 9%xzFV(@$N?1 at v5P~3KytTO#n6-XA
z{Jh|OiF=0xCay3iD;!iaAh!fTa3{RE*?Iq&6_?9_vX`O`2A)Za7^rqtVZO at zUjGXH
z)-(h8&aQzXMU1y>LOLr6VVZ-M{wQ)Pw!8oKXyn&(g&QNZbNXl}%$UEB&&fCUT=>k=
z1CRYCdm_!tvHVt@%|r3EbD^tYKOOo#tRLpm1K)`DLneOMlH}R#!`WDau(-9%wamj=
zz8&J(Z=2)pqC8k%moasmb)5F%@x<WtIt}kv1oi4EO55AUM&})q<66J}t^yYp-p|tB
z;(;zfHsUzD|GczS#RaUhVfbtaN-HUz3 at kaX@!Y8*PWv{*(2TQ3dADb)E^TctkLS!9
z-hbjA6Zwp_V{$}m5GBj~Pd{q+4(<aUGD+)UrvCMpw2hseS40HrdxTsfVuB(}qj<VV
zLUBwi0%xk8M5MjEST#YTbuKQdtxh*3 at QEsXLU|v)N9`U_o{#LF at Wp)yfPA|ro}|~c
zw?(oSHzdR&7IH4d5Y+d3c6K5UM#}!kQWYRu^5o~|Lvcb<njRh=P-SI_GsY_ at NVLgK
zB!_UMJfN8uG9FA|MRKCgnwL7l;qc=2cEyiA;xX-t{eBWBPMqLyn3>vIT5+tRScQky
zu<`&eZ*Ly`pqa$-fY^J?ZgP7xhFeHTh^31E*-r~<x3w=iD_k^4>hHJp&r9~v5$HzU
zzJ2>23MILqKpvIMg*(`FOw6L(Sex7*?i at 58RLLQHUV2f~Ju!h&#dCYZt1k*woEM}J
znG6QhT*IW_nYCzgJNP&^H#gWeIM*V^z^;ncx;5cQBvM^{JvTx9e+xQ+wC?V1-m$T<
zVsx5Nu2U2y;*<a at PdmA-?aa5870-YG0Vb1a{bKYVj8K`A0EOrs8>{%|pMN?#J9qFY
zMz3qcF$EAf1)XjWnjSXeT$$5-PZVd17UWnv&c)#WVz*9*w$oscb8eE2+OH}w_IB9o
zJJJ5SGS;f%2-v&Sjdx<#wyp2~SyffVh*TK%M}kv|Vh;>_TzGpziXS&$V at +wVonigN
z+l=aBPM-9<b4Lo~c--!pY3XnWSyo>LnpuWLsdCr0ZA~dAb$)JdzP%!Yw0Ji%B0e at g
zo*B{n<V@=0)`uSH4RjivexwX3rRip>g)&DY1yASq&+`1Uw6Cxk6Tu|wbC(AkY)m!W
zsIyj$Us&*cRZ~NW<b;qB8wGFe`OVs{l4jSej1_vC!dSt(TPwZb5)Om6SFbcwCAwCR
z6}h!VZO(uBf~LHA^PPIh{mh0{+w*NgRsQ2<{94F-Zoi)+M)IMx>iWnZr+%{?-D4LT
zbc9SRwsYnlyrf=tc6SeY)ET1iEk}xOD*r at rru{}9uS at Q5pq{pgi74)aecM72yHERE
z#rf-+3Yn$U>&j1h_cQ+<J;|N9alk}4UO1Xpu8e|vMMv+=SJl3aI<OYcFOR$)8k&tt
zzHeE|)muN+8av%EZrJe6cIf5;^=?FaFN((-o>tOPk9k_28g57q)H4!b*vWDcmV&Wz
z$pLvcuWiN~XTW+w_+i}ZyZftsou~v~msPj<KFgWIWs8ox<&SX)*aU^_fQHd1qzv;o
z?XfIh>Bml-=(pbQ?yjYlr1<L!7P9Dyw|JZFf(#48{Zvk+-kjl!1Isju8NXQ-mAfZ|
zd=s`xZ at Vi6z>I?9kQPtNBh6(B7zJEpR^+8O884*0&)iL_S at uW=>75<fP1jCOPcI(!
zk8?`9yS at 63va+dyZ*6Sk5T83tU?d-aSW(i_29$shIo7~lhK<c=_`+zfTyR=RBa`r^
zzAr at X=k6}u|Fn#7U{KKb#?D at CORgi0GTU-%SrYdgp{AzR!Hyo(Tt3a$_{b#LvqRVR
z(qZN?AC%=KhFp&s0%l`xUwXCn9MU3sYx0_wEj#EfXHKZ}1Q$O0VD*vx*~!6$(3CDO
z?A@)v%Uxgej{V?XJAM3qTcVs(rbemMsjKD<u1QM#{(AY1;5>fi`LEQf=yAtm1$KvB
z91dqWEG!HpfPisjtD0T7 at TECMl@FU?l>P4vbs}UN<&6!QOI(iZF*6=yHn9p50`i7*
zg+WwE3%Aw?v3ks))PpXezibv+M3|(cWTA|_{QjFaGf at v-6J;wan~(bW_`m=Kb$Qj@
z(3LX?=iZ86we$z1maW>5^C=jcJ~`>4n{WHFQZR$r!8UfS2Jt;DEVR^olAqqgT>i_(
zFNd8j#(w?!b*scz0GES<80Xw0F1ccvJs}JKI||6S`3BdTr%Ub$MJob*-X~8Duz^Mn
z4vh>=WgBN!RH#2Qx+Ai?y9<Jbw6NHe;bBJ at H<z58T!$9CZ(!g(Wo0(#L}?--_G}Sf
z8IpSa=xj7w7~W}Gah|&j2?B?*2xY+=^LXR~i|O`Qz^|iMatws~@;mIpBMN`DCg^D;
zL~t)rSEdW_A*iNCj-X&t{4&yZG^^jwOx>dGs#V4L_v`CgTie at QO49~}J=VrXy`HwV
za-m7ALQ6{v`bjS!eZVe|Llspi?HIo at KdJL+etv=yKR|X8j;p~{m~7cebeQ?=MVJV0
zLP`(QTI~_o(p&>t(##S0vNElq;WSXWzefX7N>T`A at vhap1ogtmMd`r6K<vl8S}Vy-
z!1pGL*wuukrGQ^D13u!B4$2)!B>v*IbZxLbolN!&4o1lJG*SPH+-3YY!q+$&8Cggw
z4;Z>dCub08fV?KArf_PH%*vd&2HB0#J384PRk`m&{K_EGJFC<0#@%CuuZ+|6kp-P8
zy88Ot38qTx*Ng`b at 1xUN(P<Ive*Ndmh9V*&4rruXn*=V)Moo-tDfXZX at t|wEdu-VO
zc?2jNsKP?1w2_e!xEcQjS0DjE*-o{tbLaJ|)lXtJc8oE-@#O&&BCTkWvOi;`crRQ&
zj*2&h5aBk6#9(*#*$)8MChhD2Bd6+%VWf&cy$87GLyPzqorcV$K~@4f4dgzm3s86A
zf+vbM{ECUV06sf-u}>N<D(X!n3Ijcmm6hde^q#6^v3FuC&uh?{YsMj6u75?UiMD-r
z`?cUT=QXIKOS)kl2KX~NI`IH$K({`B?j(I+u^lcn+>l=J8(_!3Q*x?6svSQrmTLY>
zPpMQYWyTAY?1n}XNCT20WRtx<P6kzaMJq$w??l?%S1IW0reP&j16_s<TZH at h`4tDq
zq;(ww1FS#0ItLFgK?Azt?8m4+!UIzS1TOk)W_9&RRPwMMIaH3%cC-WaS{@_c&7&1D
zC~G+Ky*mR^q7bF(Cj&X(CSL;*AV%rId3K^_HZjVuRP*<?HwhKvj~p%>1=ax=3~=j2
z$AG&R-m at 845rDnC@`WgmK-m{Aq{)oaGGzCAoX?~e<>loFIInVV=pd{CBSf}jrnohK
ze95Bu;fBV?NkDO3t1tGm*zHRl^Ia2qeJ)q}T4N6nPWigb#2oH#E2kX;)i|8;1FBf(
z4Bv at X0G0*#CX*Wtt~$_bA-$Hcr>{j-aBVvsD3#`#TG!mu`5%4WOGrr6#K_an4tzUA
zhm9T0R`mp?rnk2@%Xdd=dzIcIV!HWsu?fhDmc33GDT)apEFAOdF^74GjUO8up#(=H
zu!YJBnJwf#-Tvdp7>{YDN^xMgX_D+s_K}w_UnW#v+}%C5p4KDB7`Qb!zRU$VkqoxE
z?ayp}q6TC4BnV3kptObewp`LPGgZV><)r5 at y`f>nVW|Nwx%qwI3!qOv-P#|e)9FPY
z>-W|X{=H$hUoCxLIm*g$i3Zp16tEc#hK;VwJv<^Yj6&pl|5-~s6$Zp%czm3%kfqEY
zFDq|5T8tJ14hf7(YUQIL1KZJ?Qi4f`S-wp}pMA>`tYtY&%F}3)>Yl=S3{=AUR{HoS
z^E+qB0Udr7k!VI(g37|Pv=>zpQxqaK((96aT|{k1F{tD^7tJT_hOlbIua}pHnx>Rh
zw*JnK{+lnto%Ed~KSF~UEmKysN4*W9Qa*tdMC11>chn6;xrTYBX;YCweA|!xN6Ol<
zzQe{a7Gmg(`6nx`LrvPNcoJ+)+0=+XLWM!hzQ`xgDIw7FZI)`Ozk=d!64}Yh&{@fO
rDAh`}oo#0q{PZsDU*8Y;!8zsK-#y*>?++jFs{!FH?96L$9`XMNscRGk

diff --git a/src/audacious/images/connectivity.png b/src/audacious/images/connectivity.png
deleted file mode 100644
index 2d80e79d014ab86497060884d98d67e11ac50ee2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4452
zcmV-q5u5IbP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00001b5ch_0Itp)
z=>Px`9!W$&RA}DqnQ4rjS9!;O at BY4bpSd%h8IQ-~Wnw3BY>byIj<XO5G)Y;jN|h*l
zDH0Sl{QwnGRYf8csn9R2SSo0XDA0mX>#8kH8k&GpoW$|ON$hyb*t2=|<=#7YzwdU=
z>4$sm*dfFYOIuYO>Cw6G)zSO@|L6HX&w0){@ay*L_6s%bm;J&A9(dSUTN7I}P1~wz
zbSb4Ll#;%#Qx-x_#jzNF at x{Mx{+}YSfBz@@EzA0_ldwN1qIgd_n-V?idr75InqiwN
z3?dq}28E?n8kM at KbmOcD!hefn`R&osuT1@~5xDcthi^A6`*Vh=-*w9!yY)@mhV7lZ
zMyS>U=9kx~)?3t at 0r{>py*)WBQzwoE%X7<2o|_2IA3rUEFgz`z_>rSWzw*OhIRT}V
z1{m*o&!-1Mp?xWpO1%5N_rKH4^mgf*Y2$~Ar=B~7lmgGTFiaf{h=pY5&09!j(gb0I
z4p^p!WoXQdO{<fKpKI1Cjh7-n_}J*^SI_^_2`Hr!Kpseb;S1k;Xl!iu^9SF3hqZOb
zHsiu<iCjKM!gJA3j9r-J!qgm|ZDN@^Xc~rYuy at aPntn{R5mIRegpnYM1dgSVbPT3W
zkI7ele6%G*{726o`O?>}mw<5{;Cp}}V8hqH{@AC&Nc_Ql?|+Az>Fw5E9-AkY at bvTN
z02tZWLtjst;_4dRS&w`!$;faYJGKpxbZrbxL(@P?h+;_;hUig?ZdYg5%^S6Q?!VQ}
zB;EV-xm$Mk_TKZ))6-AOU&sSWsT?p241W9XpZb(;824<td8 at fvZlD=9`Fs}3ayWW&
zl61mh at 6Juk&8;vyzsyZr*E2NGjiy1h5imWwO1`(7W)PE4Sqyc%q&$<;6Duqfn at rCa
z$Y#^zGY(O?EY7}s{^YIu^9LS$@WJ5cBGA$MR$%j?LqB;~Gpz?kc5F4nSklv-!L)6r
z<_fIUeKu_zz%ort9dsmf^DAuI)Q4wl7#cKuK{JfWCM;5p!A!BiKRo_2hhG?HXhT0j
z!Q|9DLI_;jWZT9(nWz<27nUFY=HGtm18-SE9q_}z at RLuzc>h|t`MW#!-DC~+rrA2!
zMcT7a3dSZESz4{Iuw3S*E&aHbj%Vxicc)3aI%!A8F?EuzLDn;=G-HmOoMW*ZQf)~L
z)5dje%9RGSS_7pZj3kwskC{puE3?bPeO)`(W at nGR@RmHFl-dV)r%p}hpZMYEcklj<
z171FtU}Qu0<uPF_38NTY(};w?G)yeZMAJYA4E^eNMnbVtZZWe|;gyM1=8AR3rk0Ut
zEG!fdQX!>8D20 at YOu}YeF2UmSFSbMw?mKqu%V*yRtN8}tM}RHBGvE9E;m_TA*B-}n
zExOX~RpVMg#0%#ZkeEm`a at i#7*LC3-;Fyqgub!PSme`iXP=A(@!5m>2apFP`&zziL
zb)|%i1ZbeC_V{w$$8#()J8pC<r_X!`*axU<dO#`lVPN9XN55rfbLl7VdEkJ(y4Jw4
zO?GeVC!2H#Bf+VO6&4D0T9IVmt{bS-TXbiWBy8yRAeMAu0)kjls6|v;G2=4 at o<4St
zawA}UKFvLQhS at dJ&od`4^2E^#yfn6mlnNmgpx8Rt&FYy~n^cOw{p_<}ef*jp05$_>
z7njPP at 85oddE~@JbWNitm!K6yq&%A_64d>Oq4n!XrjkfaCzVR#n2>X!+-gsiMq3tP
zEb(K-;%bEp7nf)Sg5GsKOfQu=b?7C+AmomngM8vc`>{-ezxt<9o;y8 at 6pGcg2ANG8
z6XjPbUjTlJfc^#qk|$0~c<0W|-0AD4J~3aSSZT7l)?levXJ)BFEf9=s9weX7VOSPI
zLE3?w2TL_*#SjSyVnr)zn;%KWFRn7XxW at MF8`(J2&)av6kk4mGWmBA;uk*=2e~hpE
z<1s$|p?&<#AHR>m-VEiMkL9{(o_E7-w>^CGHM7uXKl|C;Kl;&2 at 2Fz!ZeW_rr8-JM
zEEGW)(+nbR**;7*mmyXlBy_uwuwkwOg0 at m6?ZqmLC4MMqh62N~srwPtR>=HP2|oxJ
z=<g++PLfO}aXp8{Vx8~)#|fH##OFSKA5A}Ee6EP)*qW%UwdQ6=pS+fYj%*wr_;ha}
zb}ts{tW|xYSkek2(g~OQ4&FjCohB3 at 74#&)HejaQmW{4J>Y!pt9802D;)jw}AedVz
zbL53F!dM_XS!e5(4M-GzC~zDH+p$4Oo*W(L<*@}m^O1w(GagSqcg|>F{1)(;Yf0#Z
zglF|`Sl>;#?qiw;>w3Ex-Z+TRO!D2`)clybFUYyznlM*=Ej>sDek5rGf<_>y`!RJt
zW@=%LfB*4I#6qGJD5X%q`SDrC&d)M6Img*E<1EZCU(PKnYYiU##!u+&N^sBq5zvjH
z+irU}^QHvuzWWb*{^ehvllSi3gzeZobpNfq^WaYQ at 7~J04&H)N5+NihOOmz~lO;(k
z6-p_Dl!TEW2;+`yVw!=V;fFka_&8xG+Q2*D+eBU?qX5$~$@k{l{{yjR at U0)7VSR6g
zjW?{1be$XDlt2{8Ew7wk3|nE$d+)l5eAdG;H9Qk~a|tY?9k3g_3|?IdX$28}5Ow;P
zAdCqjK^VnEksyi%<I_vjYkmiOCrB<6>G-ZgBnU!G%fz%ylv32IRhE`Z96K}1javpZ
zO_N*Rlz^`5S<mz24~~rS?)}4fdd&3HES{y~T9B|bM%Fn at 7enGWCW>PGAjS`4{4m0g
zq7I1;kyucvwUA0(VQs0ky`X-|E2~SZq%xUH0}w*6uu`Vc3JlXU^4ADr>Dji)z`#0w
zaO6B6y7xxHRucn3(l+VOIaFJ1(4bJVt$EN;9e_eggiyqy?SZM8rK^EnWn7larH3$z
zNf`#ZX`)0#CY3-+!Ss9qP16!@N<avjni5)XK8=!TmdZZ&?cGGN8n8a^VVfG`b0uug
zLlc+4N+Qt)BUPuS5t6uLy*)V=mP<&fUeo-~AR{}mP^(libZ}e`(@<!D5>kYrtiCA$
zUDqp`6c`%lmQE`MiOvlha+k+=CY+yIU~#p^@a7Fjbo@}Fppzb7BNhwE at K7J;C+4X)
ze58^{*_M!$Z$L)2z0hj5KuS~`;iN2jvniHl1EFcMa*Z@<j at QaHSJ$-8%RqZw#gxw_
zkU|i}G2>GU6xSN<80f at 85VeEZkJ`@)jeUEzW0(fnY?}VQZhCrhn5J<#9xlg4$BXS~
zmw1jzSIWjQb!z3h6vDXhrXDzY^e;;9ecvOkW}{`<u1gpTYORQT+POR?2nA8xp53{{
z6^f^4xc&B>=$ei~UFC&KGO{e2+xG7OO(TliS;}#2=I53%o%TG&LUvNH1SK&IgG|C=
z^FWruYKf>7x}F!0U2{XTY3p5g4-EC)kjSM#)96V%Sf)X-++=pSLONmN+9v0wRw-1P
ztd#1EPcLE^I<D&xi}nf}#o{%K1VX9H&$<RGjxaPyI$@Ja*d$#W&o*%^16_ke!eal8
z11v0;@XHlyh0547N51-(*Cf!J-{pBp?_K>{hAcmf*|j;(#A20~U!7xqwZ^H5Wzq?o
zgS$5}wXnvkGX?x0Vt%p6+~O*ZZDH9KaV!b1AQ47_SV$aG$FmK(a!H5+(g}y8XOnO(
zJln*!bP}G$9XmEqsnjSG*9Z#bFs!xyZf<V$N7t%_Fim;r+>2+weDi_57`BCN>5R=)
zSXikML=nCpb7pFVq+|2Y!ENl=vW{;(c7kHHMWxbYez8O%nLvoEWfTiZ!ZvU$1J5>a
zOdZjc#4-#t4TO{gK}4fvvOeG5;GaBwfrPCwzgmf<)V_0Fd*Ydy<No>$x4jL^x^ef;
zEqcR`I6GUW=|{{hmMB(z3Y8`oW{W)W`~@u2;A8LGOVYDgSgo^R;{c#_X1*<@SO_d#
z!?kr1j!DunNx3Fz&uaHchoo!a*d{~kvfQ|-hhwiyVrr7OR%dOgeERw4zx?^@J{KAs
z*mJtHRQSC+?%iuGmRgL>R|u8P!g7g)LWNSLNf=9{g6V}ahhLgzus6d;9@<TBSBjN#
zle!<Z!FNcwmVxIOBpj2JXOQ-6JQH#$mrT+j>6i at kq}aBxhtX3rh{z}Dn3Seg8(|QB
zVruH>_;nMQn|q<Keqi75_HBc2YiN%C>TH=-5Mw72RI5#VKe(zOi(<+7*&@fzE-*OI
z!<{#+qrW>rD~Ku80zl!~2A*w_a!gX5P1>{Q&$%4fImE7!ezpvDlS_M?8ebp^eQZOc
zS*(h%(K>nP(4&9)=%bH at Z{=i8w=L`B=Ao^>FKpLp#L#F(C<Si9qgY&ftsuLis?27y
zlzqvI<ExbGK12BwZ{M0HpK<Xl1IyI0ES;oll1*3~xMc%L&u+(_p<`Pnb4w+Zh*42Q
zX}%cWd{fV#OiY|vK6L0%^?LTims(<S@|iG>e&^2?M_+ox-hPX185+$XLJEnL>WY&A
zg>D)Q4i4ZZJp3?5D#g at dmGSuspcv{+vAI9PV0V&S%EGk_atRyHxf+6P8FZyx!d8=F
zxfyL3OdrbU^~&`0bPDi**7bP61`<G`USC}7Temqke&WK&z_zVcC?r87s8#F8%bOFh
zZHr7-u9IzETj(yO&sG at IXazJ{0j*X5N|1C+hWfH-S1k2XDQ4$aDJ&M_I1I-6`;Euf
z*4C<%larNW$Bxy3=*r`jpGCj{T)<meTC%35PMo%k-tOk|+Lpd8!=^;1RH_okal4KO
zykrvHvWZ0}XoVo|WFHyFXfh^Yf at 6SZYHaGuuzTA8<ywnW!bQ{C6EU+;U}kbb_|4X0
zKF?#-YNb*tmDbLmKVLj^=1dca>1 at 5PC85jHQZAQex%|Cv><}M_<x}AYNA9}a?#ntX
zm14q3kVqx4U579XJ2gya!y?-y0aCR0#ioFy&cR(bFw~djzm8u(Ly^mP^kfq>n?B2P
z1?l^Z`D`ZsajjNs*6a0Fp-}LTA3yHDmE(0Cu&yu at uvS-Iy`ZBl4y1ebhA~=KPeylL
z8^?1{A_ftIh(JWBPEXwaZE1qvJg|+AKDdYT(@Q-0+!_2Jz|=qqL2-Fatu7X&l#NrC
z*?OVTsF$kMYOz=>7A{`AxN`XL;S%6??3xmi9ni)VrUQDpJiEH%<_%MWxqSb{(-Y}*
z%GTDc%W96Pp=3lHMaVe1OeF1^Jb1?lpZVxJD3q#v?fZwBTP)yOI<Bb`)S9ZiRFd^t
zwP>03r=@62G#ZUkwOTEd%jM<y`T3<Mo_J!uTCFxZ0UTcM{eTIifh3UX^hqF@&1N%S
z{Nfky1!w3#pE`fj%5rm~m(P;!>ovVxlJ2fFLw#MmZQFWwZ5!n1i3y%K@(RVZ8jc2z
zrm%#RhD3R;R!XJ((R5m$vn;Cx)Po=>HyVvXp-@;J9UYxJe*Ab5sCP`gl`AIWb>I`7
z-pl23=|>)U<n{vx4(!QhbL-3HR?c;k`CKmTRI5!UrWVDibJOa%(R0LMEJY-g3}Rix
z!U#ocIqAk at o>xEB-R+bznT$-OQlViOzEY|l1VOn}Dixl6_SwbB$;k at P=z#yZFZnKk
z_pa#OOSW_8&hEj%!R+$#vYMZtS3%%*Wiow(x^7=S(w0(0wc7GRtv0hPgb0DKtE)>5
z4-ad(Tu!7?sn9e{-}n96%*@Q%*|TTM9mzC+;Fobrsl5Ssr(<@<tk=bkcEvYTC$>b#
zqK<_f3p(a^fVVooe<k<CW`~G#1 at KFDRnT|7p{_^{mk7iiyOM<8AtC-JZ|b!UV7o)i
qd>!~JJ#eKL;tuHetpNUi*Zvz}LgKBy4!!&U0000<MNUMnLSTYHi at 4_i

diff --git a/src/audacious/images/info.png b/src/audacious/images/info.png
deleted file mode 100644
index 91e2c17d6ecc55ab5f7a1fbee1b205344821cb5c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3194
zcmV-=42AQFP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00001b5ch_0Itp)
z=>Px>G)Y83RA}DqnQM$))pf`JYwh#6kD0mS at ywlJ>=`^j#|C3w114^8hyo3Q096_x
zM5+i8f~!hZnlxXk^ou{VQdL??L|b8sA%N5t8kL8{qe+?+L%<MRFgE64d&YxjJma}@
z=f2N9=j_MohZ#$jl{VNjj{BioS~^GfO6UB4YyH={Tl)h4zs~KVm3q+j?c2S{sp=Pm
z)$cKTH^RB1INJpP#HtSFIf(l)w0(AXxa+m;+qawl69C(`ZSx&EzUAQkMXs|~4Ub-#
zKW}KA%I0&(g#nlWV^gH<7}Hae_LBqew3-Vg!?52U8tmG+T##h}+_UXFR{{PD-Nki<
zjn~}Nv8ua(QX at vG9wF8Ssn#GCguX&PqcGgtiIHL_%9T2P@$;8kvr~r`#Od3A_>T|1
z_ZtVe_rC9a1MEF~+15L=#layuQfgwZ(nMdkht&lS-FXk$fQ1!_vyetR#cZW5GnI%&
ziUqZKv>%@yosn05^kmz)<i4Gc{Ov#e#sKd5gYVrH1RalDeZ$=y356J+tzl#!!1|#)
z@)-sbIgkj19Fd4~0s-KhAa#QM6ANy-9Pt-6uJH>QMNdDmqt$BF?tOg615cl>7IoU<
z at B8lctipe}=F9hXR1**7Muh7wE#QK|EJB}z8IFi8LmV+#fE*E70vr)J21&7yk>mAt
zdhl4)<}yBCf8FOZd-uF^^A(%Me*W&eyQj_?z_xAMe4&olH*LMMC*@Am<2Jr{`6_hg
z7zA-dWSL- at VF9uL9MNKc*b2cB;D||bzUSuZv7W6&uD2_%F2DS;%>KRa-E_^^#=qOM
zXOH`=n)q}8Gz#DCT{~LHtvV00l at _*cDj at I|%|Qf1Bo-h8kYOUDh_qr#nUN|Itq3VI
zQX)$Gx-+gL>&Ky|+PgoQZ4`@rcEjaY_F5_Y@#$#d)5$(S- at jnf7ju)xo49l&i_ixk
z;s|6wutcPpNi&gV#$pgOgESMTibxaD;%5Zi(-CUVqu66gUORBCb?Ys+1YrEx_U+rf
z6$dbqyRoPLd{~u*wi;`C1Bf^Q!3xCEQr1CYKw?gaX6BTcQd$(9dW2Llr$m%yeJ>3>
z75hHN^R=jzTCx|6Zd8-gl^a$ZfH?E@;`x_#RT?q+x*0?c0GUPWkYOSXh+!h_oe-`l
zB|^$fDKjOkC{@gfVk|*P<og`^ieum7WMZz`9@~6vmc8(<6$cQe&4twiREuI{LqGsW
zBvu4=$wG#gEJ6$o63v8ku?Hyim=ndE5K#(3%EU=(T{BP|2i_vYRJqx>==?P#!k_!B
zx<0elU~Mr7L!`C^AOHwP0LvhA!t2Cjm{>E!uwsM7 at 2!Xk$ccajiU>l~YNsiIB42R`
z00MA3u~9yk1;iFt9Dqsk#0-!@oU&#IOAJd4bD{zSXeQA_tQkwzVzMIQWU<&HR)_#B
zG}`mN&jbKMLRN^K6BZFs%pEHZ-~dBxe88a6lGFjt0}Klc5e#E-WGd#A2}UW_ScI?)
z<p2=}z*B;SYP%vtai}<0qymW&hJzv^h=^W!3qe(3ldQ)u0O{#+E4^T#6T~nAF~qEi
zNQ1E010q^^N;8Q8u_Nc46`<Zo%28sPfucYQFPcjUizwxUd?JAW)fER2!l8Dnc3wUc
zSb>=7`6wFb&Z*A4Z<$#G&_t9fAXThVMU*m=CK1aJn*vd}k<7MJV|-8fMC<?q5vD+d
zoj7k*7<NWcY?*j^<)@HMpPD~59`zNnP7xVm=!3^<mE#MoYLeP$<8b$e!Jh0;=(8e7
z3MHvH+e$2E>yiGbTuTpFXKSmu{iTtv<lBKl5-3i5#i?Rw&r|7eUuV~$Ba?~M`neSc
z2#B6Nc4)s06nyf1woGK5AT8CC>fxFCbQJ4_&{yGbvGeL;S8!=4w#TFiblmWu>*w`k
zlj}!TdG`&k?YlC}bj*56#Y(9}d7LQ4sYhhi^>q!t{fpN~ES_8O&D@?nZ$_72aZT1I
zzV?C(FSLzz+VmC2fzR#0=R|qj><s<j-SN_oe1)VlANF<S!wrRexT!Ojx!CtqK8o7o
zVVH3m-p`teSrCX42L*u|>F-{jM2+5mf8~|e9((k!e{dF>7{~?bpMSLf-P;G(t{oZf
zTbnI6S`}tk#bjp6?V}@o9c#nDvokgGMm3Ts at Tu)9PKimgD9Lv86mz-Yj+vR(2Z~kT
zlk*J2 at 9)m_4tD1^{?+~eV6>BOpOwuV06g^2LkV>I%dh_Q#aftFx`$SGb}^AtAnTk<
zs*#@P$%h4Bv1Uc7uQ>G;wKIy_LCEb~My*P$+e=C!Uy&xIbWc}yU|nzFcOKrc!&c`@
zcRlgQ{fEyQ002Dt=nszDc4Nyc&pnfbw%Om;mCJ+4GLx+~lPQMFvl8PIYvoZAcz*0<
zxE*+Y<V at NXr{)8tIAuk;D-&dgx;uXN;T=2d#Q2eK?A-a_i>IsSv;h_&9-3+;dh3h-
z_Dr at f@2_D+j)+}7(&bvM;)_l~&x29KDF>2fnA=f(Av-rW$HrjVV=;<hx;rvsukPBF
zOpK5J(GPe2&2wj><%|FT;E6}>Kiq7#o==lzCoN6`aRgghs8(vFQm-&uR<OP(&B{xT
z9R8#@KR0)jeMv}^^@yzk4SxL5$Khj-KJe6;>NsNn0MORFSFP5N551g_2tx$K^W)<m
z_cI_$loJK(Dbf4(?OVfsaD+uU#o_=6gZgWY+OfsG+?g$JIRI?kn;-6bU)^-uSJ#Xm
zo2kW(Mo!Y2KRtC|(=T5y_vW%9#zgIfa=m at zNU3LFu<Ll7R=Nv4=bN7H!GYAIVP&E6
z?s7CN3*fQG9(?n at Km60u=eL%Ilvya&E1wMb?6TQVP?{@mx_HAdf}j(nxjNR3tU at k3
zf8*4rM`u5sJn-R-H{3J&)1UlDWQ>0LoB;rU*6BC@`Kc#=_WO5#J?IEGsB&c*tBZs9
zbYdKy-vQ4Dtnn~9I)b&sgKEg~nr!BxHRBTpTf1I={m}55!t>|!Z1j#hHU`8)`}zm3
z8vWYWzKVf?B5IA}NRt`}8lGnn1R?U7PUJg^$Yuxd%RRg0nP*;zMXU9XKmNecb6SBo
zc9#wgE{tA%<t(0k_FvK4JAlobufovUb;#xO2s|IgXhd-f9~_v#Pk#I)n$207KmOM4
z7oLCb=yKn`Yye~QT)nQX;->o6H!sCpsSEGF|2AHFv4SW{VT?l<ddTNJ^sXjcxGqLJ
zYGe9neErzin7?Pw9(_&$UViz|)UCI!f8*ex=GM*E_Ts85#;|GA9Ecp8b8uFp)oP(u
zT|lK=#;21Fy#M|bMCgs>ieC|c+izdLzOS!q>(yg@=<6Fpci|EwItycGVU0!{TM!Yn
zc9 at x2K)ultCx%2&UWq?Ac=;CMI86;&trYX+chHJHfi`mh1gSQtR-2ePHjjmJ6 at 9%0
z6#ELa{<lWJEMFNL8}rXOz)LTEI9aL0ukYVqfwKaw4chHCqIL|i7M-0r44k(b{rx at g
ze1$Z%n3^s at 1Rt-2g_aF)^UW7s*xQ at CZu8~=6pL4*yKo7*I){<VW)WsWD8(QmSm#hG
z)sY&9k at NeJ$%dEQcH8=qbJ+s~z>8yKoO94RMQQ#W_`VOJ1rPxuK&#b8sZ>S17NOYR
z4c~J(TrR^|=SrnG10cJ2Y6AzrobJ9zok7LC#iKcd0D>b&7FzxNon~sf_1hwv1$BtC
zsMne(mCLABDp)8lV0wBQA09Z2cmC at DKKy7rjiUH3ckP;Z6 at b6=Om))r#1E`|mMor5
zwY*>PG6lf9_~PP*!NHC at v)PWXD1`yfQ&>8r0>CiFL2J9eR;#^o_;C5f+1chCfD}No
zlzF=p=A`S1Sat=}DF7!&2p~T{-%2MYD*O8TN7JF9%f{}$`#av2Ew^BF^jdUuti|kX
zJDHrU?0oy}k9IYisXZwHyp(DAUlJ;3t%*-vd-v}B&w9Pyc<ZgVOdQ8Zk_3~Jlg1cR
zKX~xqft7yWidpDHPXGu82M3E=wru&6FbqE at B8Z}B_wL=h|Ni*#<MT_F&`b7NwuR^n
znppi0!6#kml=~Ala7*G&zIP{yKQ-J+R^V5T(It_m2A%ZmQzwd?1aNAc_86tJWJ&rp
g4Jn^>O#Zs{-^VjQ%B@{Mn*aa+07*qoM6N<$f=@6yQ~&?~

diff --git a/src/audacious/images/playlist.png b/src/audacious/images/playlist.png
deleted file mode 100644
index 2574ef03c3a7032b7665312124985f9456e62b87..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1995
zcmV;+2Q>JJP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00001b5ch_0Itp)
z=>Px+g-Jv~RA}DqnO%%kR~5(qYoD+CG571-J9A-RpaX$~kBSs1t&|pO6XKJJkwhUV
zjitdD5+8i=#o(jS=!=bsNt4DVMvF#m8Z at MpT7*UrEHEHa=)hR!`_BEC`*FVZUOvnn
zy#se(X1H_X!>nZI=H{HN{r|1C&RKi!11#B+E!mPS*<%>}zX>{YG~4A#T1`T(CeSKF
z*ETS#PRBC7dg3Ra*6zPwZ>PBZ`=M!_-Q5)Ut3mXHrirzhj!j_nGV_YS=T5^4sbzLr
z+O};ZQz<<Ww{hmLA9zlo*a=`@Q2`DgP9{BFUkgENKv=^h*6TX218BJl&<(I*8eFrp
z8A{u>W!tuyh^LT<rx1;%5D6zBNWk at raQzZouLwK778lO{J%AXM&E{+wz at cwt|K<g1
zo1u%Uok`2Ioz_#yR3w>9ig+xAj*cWcqDcs$8;&;t*DJ!Si!6J?m?#(F2NfuusWTSo
zhGHg5ky=y$sqo~HSB_{Mk#tNGRy~SEcwPyvKZ;!G76x+#cwX at Vk<%tfL)gk7WF}!*
zDTK at vG+}|6Nh-0p007Vt&f at 0XU&HYV0C?8>Od|%%Oil?kQwW<jbUg`{VN8|^$mMgv
z$Yf4Ey<@EzNCymsK(+w at 0KA|KfMFSNm}UZ&kwD0 at 5w_B>j07|hL8+WazA%Qd!Gbe7
z{;4-Qa?vOh$5<-omSn!9Bwr$kA8p(E6o>$pioy}CJpikg?L{ow13?yw#T*L72 at KrJ
zsgcoscXVt_pR7zc4EF{UU-AR>A^Y5C2Epw&-Y66r{T%pa_6O5%dIpoIRAgHKBB4&a
z``$a1>;Jr=2 at UrMe8uzBc_LgvpkMpt>qB?v*Qp3fGWoGKl at LG}9W5eYZ1~krhwnVT
zHvtgClg&#=v|c`enF&J3mibdmuq at dY0FVGPAeF0Hwb)TCsT_pbm;t3`Z9EI{$PDUn
zZ>ctAfS{meZ9EGJh+?MhZpb!e0AS`>8_z-l0%kgX9Bs+~rY4-N at hs#mq*%?`))%LQ
z7!;_oYMD#s_5lzGV99=~N(cm|c4hzs$)H%!ni66Vh-ZJJEm8)Ue7{xC0HDC_%)r#V
zniiI=bJtD)0$53^RHCX?()l58p+#BDu>y^4x~6cV`5gz3+3~>DpV0)K(=@S_h+_nb
zP1QUPD~Um+l+i$;+6F)%C@}2-)cZ}2Oce3=;nUZbciF+Zb?d{OnJzsPio!6gdIMxs
z%SB99$DnC?{XuRK!2YA at 6`Isu6yWuwQxAcB1q`#qU2we||JOP7>BbBIUp}1qoFe+|
zvpaXic5eT?(Gg9fS{p&RHiW7(j+)z#K-M5gLo}I0x~m(GmxE<yr&{|$0lso{*%La+
zBShk5-8ADXyR$Nr$wZ^kkfxM`?=y1a`P%TvFcZ=A4vGOpr+w_&XLpCg#@h!Eyd3LU
zu at N<A45i8df}mPInaHE&j>B;$X3U+8t%V)i4#lcAZ-9fx?6{D|j{zLmwrz*DdE-_y
zW3Phe6;bta at cr_C?=?1U42R7$G);$MIo&xU)7Mw7(7(I;x!uvUoyNb1PQx_g(1Zy;
zsKD_G at ca@ye{$vlL8Kc!*}XXVrxT6>|6*PMhhE9{vZN0-Z{E<k_xUechHj$bj9 at H(
zxqjeOK+Vm;^=52iVdx#$xaMo{m9H8zpqtpfVr7rGH+mM1HvwIX0$@n#zzfPV#D^>!
zU8yaIMS5}Sz27^x`|tGmA at h5426**V7&Q%let!2e-P^amB#M*$5JE>Jl!Ycth?)+i
zJa~TT0cTnJvltxu1WE=2jTxwx)juv@{;2n*7r$VR7p|gQ9fU8dU=={uLI_(KM8nGv
zi}paH4&1zTIXH9XHP7*CZ|c?Xw@<uw$C)!gg|qw8c0BXcmKVe)_f8^Yq+po|1k!<&
zE*vk9nwx{;<!3}~d1fc1AH^Tue$)9^U-gG|00O|L-zoguu&%Bd9vS=0&K*x%namD~
zgrgwR;Q0<*r-tFdL3Qr->FS+<kA+nH$MF&O_^IFJKL!vy>>1S`TzhaL5(z`GM5Q`{
zniz+nM?oYYr3Wu4LrMphnLsSkgG8(srs%}Qk1qJ<FPwF6^p%cZJX^lmP(rFu2-I7z
zkA7#{uIi?{cLw)FqGGEMl%6_`qpD;z<kk2}vEZLP_io|CN(F9RxTp^~=i~K*$Lu%-
z#_c^X>`8BV@>!}mBXH~GB1nU2#$lOBuo4&??8l8;H=OI&`cy9G{O0^$s&9=CyVZJN
zw7P#;A3?+L at B2TOYdq)g17G^a^3@%d{F$Lg_V)I!@#BezNkR~_LaCGwMn@*(#Kc4>
z2)Hkw_fK6pH+gbsD5%v%YYmY at ePUG~jUe(N5Y5KCKX7Qf_hq`emSGPO^)j=?ibW7$
zvRn%KuV1ZQA0F`BhG;hm7mYj2CJ^$z%sdK=7y5-}T9`h|@3iPf at zi9I*bG9=0&+hT
zKWe!>mnFG2%V;LPaWn&X6v(u2g*l3wk3A~t&BV_ag6F&8d7RCXm_zi at AgUQa%QpW@
dwqy&i{{V2l*F&%q9l`(r002ovPDHLkV1mXK!g&Ay

diff --git a/src/audacious/images/plugins.png b/src/audacious/images/plugins.png
deleted file mode 100644
index da9f9e141bcdfad759dced27bbd8175818dcd45d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4241
zcmV;C5N_{@P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00001b5ch_0Itp)
z=>Px_OG!jQRA}DiT4#_H*PZ{p_j-C}dcw};$OeL75lMg$L9n|Zk|g6(maRIF1h!;f
zNoSSrd?(%6#|QgLb at H9gW&6sO6;MC{S*klFk}ydI2 at os-?ZPf>VrOS(cXICOe*Nyl
zgdI>KeYmRY+E?B6UiW*ye-5(*SNU4K`Vn)2$JZGIlc^9c0(b=A2gI4ZJ2t&{wa+70
zd&9Py9{8@}biQ6(U1tShfZz~@u6cUT2%>2<yLP?oznbSsSDOHXkU4b|CzxFowMeEk
z5CW9B?50Q{5RQaKrvljjf0_Wo=t761h`L8Y2!#^>0JCg@)8#Tng8t^KO#r>>1PDxb
z6gi=#IT)po7)3g*!{IEl5<+KO?ei{50<9}H{G$L}NYZ$4&z@&}U-#akH4i#S8ZN7%
zK-W1WN&!NksyduSMT8JC>)YsWS+U^}3j7lUzkB!27x!L~1X^1+N-ZllyfEpS at jqYE
zws5tO`RTUh>y~}p`=*p=u@||Ly2e2X1!EKvrO<Q^XOR;yjOJy_HdKBk at yj2qX<fBp
ze@#u*Q;U|iR+z2U4_jBPU-xYUuy5i<(=`)bxnaSayKleq7VCuZ^>qBC3D(o6&fZzu
zFr&QGHTTaR&u7Ns)en?6HO=|wrb%-)F(&=>glnf;%oc?O!wE1#z$gWQKx176V(~bS
z#UhV4Oq_jJ<M>(8>t|2w=;-JWOO|c8N0#Z1x!2EYnm&7utP2U(PH#4OJ?@oN)y?j{
zo at 4Eo>_%HxZg^(KjOK^#xa(G{FBpfx4HUa<fMH<ETOTI7PMz)}0v}lv^ZF$%i=?WW
zYB`+Xh$qt+9tj~BNrDmrWd2ZD=0tIk0*7LO+wDQeiS~Fj5DXh2CtR+g#f#fo6@!}4
zKj;VN23$@Bb(MB(fB%DIBpAMZ&#q0|F2x22fcxezy1|;(I5;;z2oMY>U{_?^zxH<P
zr-x5YQB#Qt^XJc!qX`Wi-9zZ=@j~Mq1c1aS2na})MgCwM!B7ISNkVz41FLSn#pWFu
zwME0Bs%x&9M2AKq at CAH8R%-D?8kETx*U%_+#!lV?VB00BP-D}qgZ=#j-&?e3u1V(t
z!T<;%(76FMtz+VZT2fzM!(xdv_I=uoezzYG0HYZIIrX80<mV`%00iO*6~15$4u=C3
z73HLF(2r<b1*HUxP%uhRUsHlu$S*$q<P(p{NZ)++?C07g5zyCjY at o8HxfUSPr%jzG
zB~ob+LO=+C5CX}RhGa^EVF(P5hLKFBGr+STC?y#~E+B{&5JU+<GMPpwl7L}|Ja9%S
z%8TuA+GT8e|NUgz&{yo<@zTI$c_9l`9^13~fOlwUM7W#^C?WZgBZd-!`Lo7jX7e~m
zjAp=Qy$@sbOLG#VkSNQnXGeaXF*xm3)Kt2#bKBOq%C(LAx4(Gwvfb#`t-n#Zp at 09i
zSO1ihB?_}FWx&%hLJT3`9u6WJOXUMs4zP(804xB at a`X8+17j3s*@UKXr8s)zm>LX*
zkMEsd|L<2EiTCYz at jxgX^$fbbuq)=QYK(C|5Q?Lt+XL at tWDF3ckeLLh-3o_dJ|8eU
zp9m8xln#N!7<_?IP9WaH#*M}mXQNA&-+yyML;YJndGtZW7m8;*Qub3qfHS=#=ouIV
zKp-)SNlg`~uPsGci5-b#3XCzxCJDo%5%iz)V`w-C5CQ^Z)es=L9SK2Mi5(_p;Egxm
zh^7qDcyRmkfh$TSBqsfO&6<^ps&NQIWVoL>4FtfXrb?)39h$~*<GhLRdj0tDgYEGX
zCpu*zjI<DttyVLiH*YRlTjpD?nNWelNBfZ0cy=EYxLblqB#BAmD==kpv)tLy`S$>x
zxNH?_TlwJ3vhvcJiQ~s1kx<8sm{Je`-MwB64h3PBCA2M^jIG;tCx839=RC)bo&2$p
z(kgauf8M at l$MbSBrB2_w_rO!X{KYfz{=Rd at vc=6%Eb at 7Vol~dEawkkC3D?h=WoC?S
zz{ZXAa#IO3O_=?+t5&tO)YMebl&WR)o at Vsl?Fpj)oF7S5!{T|9 at cNc_Q%8=p?@NWl
z3;(ij^Jjg1?Ww#=K6@<CclPMs`U%%<`QnStzbY>;cg&bJo(_3J8Q)K7#>G;C`nnR7
zmpNgQWt{3d!^=7bO^r>n(@hNvLVbOQ(_d=?bLRZeWGgl%G8j`0My{2pbiE<;wkQ7K
zQJZ43K~=SUS^yCEgE5@!9K at _?^$7S!#cP}Y)FBhgoUL1bqka=pZoFx2y;-)L`1zAR
zah at 9rV|XNzNjXFYO<he1>g$S;NTku*?-uRt$761{+Xw{1Hc4V$0PUKVK0qYt<vm-U
z8<YTG>FS3*GD)<hp<$fXSU*nG)K*$5%FAhKnG1^50)H?LN;8KHxC0=BptwkZ)nZ0N
zT`4xb_)0P@^tHRTeKU9f`1qrj2U=FF-?($v{$H+Mxy&jIpsuDEXM0CcR%%0ar3-`r
zid9BURV67~y3AoVOMnmvg~GKXK7VaTXXlEp?z2?@9+dz<aDCBJ|MoM9P$qGmL*oXx
zZa`HHB$BbLkrDKr^WmI30Dxf79Y9676Fy%Eu~;ndZ2{*zv8UN9hYq*@>-X-y6%M-v
zHbusaYwPk7R#hG61_Ovhk^mu~1dtem*({-9Ts;(vZ0hOl9R~pPuDkAHl8KpRSw<)n
zM>M7)mDHf=9J+46=Z~Sg#|vQyIBb@@u~AB3SIqGFgCL9^xs)nu&z@&}2G^tUcoNY_
z3Y;7H_!0~zaJtKbcudWll?{LpKw8z2h-<Lf6cErF0Fc6Ai^X6<Cx9s$OX1WRFDL=7
zn_iE2T*aB55fA{H#-XM(NQ`BDHy}w2DOCpyBrl_QPH}Fay4nS^Yytp`j6^Ur6gtmY
z<j%^uZP`QtDg%HE0HmU#RB9w7Nj`rR=`@GUB127UaC<`F+{hFp1W3eH5JIwLV#ast
z8b^`K2|~%lOTpgSx=}LtV0led2}0o{3_~CsPGERA0>)@Q$XTs2WSK#hCCDZTvMfOe
z13f(h5P${%(pzu6#oJb_kH50{ZKJxn%3fAlM$1cz;c!?og?R<Vs6YCp07eKwG at 8V<
zlgC4FKC`v;e%GEon?e`Gd{b}Bl*yC1#UcZt1UNS^<PJe%8JAB9f!WMZUg1E0|2d3|
z`i0x$NesF at x-Z~UC}nX<P4DI-v1W*wU0vNbbakJ(&Lqq81vjP&A&RPNs?zt~dAkyc
zWVn<M`y_LSt{G6%9IY)2#qK=^eg@$2Z$-axBW0g at p1y6(DkYW5#FkNS6a>iD3>hXV
zRx{3??ZvBG-WdeMYZ~XDQ-RZ(6{r95?z7SJQi+d0dZ7nE4}jOl#C*SNWO#JPu-ALN
z!(N1VJeAK^NL~s+f1eMxu4*$MI at 11d>x%pL at 7b~GzrTt3%MQ8!W9sCIlczQ}k#Hyp
zgByrOQ(09Vldj!nMrZe#q^9dn?c4dn?=CqK_w}`>8k=TG5 at T)6&67;=xSB6k#tIaI
zw8~+%$XIgYT+ at -GC%#)dZo0K(>fBE}U7wv-LA9>lP&aAH+&6BRJ?oCY`O$q!GM*`h
zBH<(w@$`9nnoJUkiWI#0&U<Oj)hGJSw)-wC8(q3|Z7sD}yMOxFBi7N;jFIP(uAFzs
zNu;T%3{IyR?|!f=`RBa{3_|FB&b1B#CQA~VM=6<p_Z_#$Yi?~}v51OfGLsc}+#y7x
zsk~|u07WhZ!=oek<I9`-cYg5u#w$vvm*4z at 9ZOr=md=?qgAIEldC)myD<r6-Si!jZ
zQWyqDZ@(MiP!x<Yl$E*A*ieg9QbQ=1fZ1Y#(_sM!Fwhr(nzaQ2fHH#0DkpyZ?50Rh
zfB&QVcD(q~6{XWUPd~PM-`+!WXHQq`iaC=Lf#i*iV9c;1;S at Sf4na|5xEv*@D6N1H
zfTrr`KIMh3aS%c>>qXYg0Rma?liAB=Gb0p?U|?WS_7}xozv7B)_x6{*5ZvhP?&?8t
zv2uPXNDJ!SY)vaM3Qgq*_~Y;ng)urDK{%9z;38jzF~;&0opeE6%ryh0B}Hgz7{@Ck
z&L3Ve0n1jcf2gFav}wk)DTqbX49E-WTIqtkek{*tV{=)MrKL8Mm)rAYsVqwcMSUh^
zNW?TewC?*hSvEhl<fi+lUv at pP<faYHCP{kxM-Q%5gh7#3^?b`D*Y_#(9=SG3;k~fe
z!ze{%RT0b<Q@%N%r#ZMbmJ2aTAq)Y#V#T<+YSZVPr<Pl0j{n1GM+d(o0v0T|%c|Iw
z1NYpvrmU`}mc$~dd^N at hfyH8iBr!mspx2WDEam$@WBs7qx|-6Eh^1jsGT&25A)6%-
z0YHp(J9N!JV?#CZj*eQR=VFeY?$35!k_y?2i=Uo0b#m3rX;VowoIFqWT`mQsWp<R8
zJ5X9;gT*Wrs1y5AdqpZxH-igs-GG+j(9;}=coIjBe-4XXf?}8Reo+X4SR{peZ~Km7
zlISCgmpw4`qP<XS>yPc4o_c6`%MwXTbI?rg07;^76)W%s19;~5uP3;{ao?S{E0ZTS
zg6kY=N=I7d5JH?6BXZA_QJBpPvc&{LaBSOkfd9|-of_BlWAASNXy&8q*D00dWr&4U
zaBjdPOX%u3Yv`N at ghlmSv<mh09ZuIzm^ILOx_iaq1#?ZZ$pl%J;3`(I|C7V|3$MKq
zA0F<1!XNN{*wNiP<CDYf%xse7%8F7_Qs#tWH9;5|7nvi%<}kzNFk{H;#m>F^wLfm&
zqII6?I at r;1 at CWTjwr{f7N;;2x-q~ieTBXTT8mS~P_(DGX_JvpCk+8q*z(;QmW_G-|
zKt=&bOIJMb(~^>sCm(xwy;TU{`B&da3=X-Eb)Go*_~2kiAS*#OWqQkk>gvWj8Iy0c
zSS|GNhc;MBoGv62W7$MeiGnTfzOR1#>ETc~;(y0I(Dk8v;N&>~IsgtpuWg)B*4#Y*
zza}=-Pg&8r#PZy0Z$?K)Jl{Ed;GM(S_w);i_(lQ%m=?C(x30+P{FPxCMkpBkmrp<5
z@^*IZE60K*_x#=3d+uFx<Mne%JUUh)msHsC<S(9%e|BW|W4&jOevt$HrD3rcH!is2
zVMVdu>mBaD at Azliju)(J7aNI<+&Hj%^DDFFu0EcK_+wpNhkV&@L;(YGg94zDsQ=W!
z;NVKOV4fw<4MxB at M<5ik3=N(>msMS(;M=h)mEs at o-u#~cew76*vctI4R6@@k(0*j=
z2>_;o_sQ3dcqGu<?{*uEjX5~RD181P7^QwyjVH3)=LJ%@P#Rw~&o3tz(h8-K-Q>b&
zy+DODpZ{E^cf>D)W=Rqm0zBRk=v?ar5dT{BIbT%@pN%W|nKj2LmIHZ#-m`)=8Vila
z2_=bGH12ejC=ddmlwi=~(Gv0KApnsA27H|aa^qXO)0gr~eeOWD0B{aGEx1!gNcS^;
zc(K`LvkFRyP*qKMyd$!vsRsdsFOcAc>SSC3rpx|U1O62{NpmAGGJIPs8qFtRh7fT9
nBYO1E`(I=MiUL*q|9$;0dgL8G_52VO00000NkvXXu0mjf64e0c

diff --git a/src/audacious/input-api.h b/src/audacious/input-api.h
deleted file mode 100644
index 7c49b0e4407f..000000000000
--- a/src/audacious/input-api.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * input-api.h
- * Copyright 2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-/* Do not include this file directly; use input.h instead. */
-
-/* These functions are to be used only from the play() function of an input plugin. */
-
-/* Prepares the output system for playback in the specified format.  Returns
- * TRUE on success, FALSE if the selected format is not supported. */
-AUD_FUNC3 (bool_t, input_open_audio, int, format, int, rate, int, channels)
-
-/* Informs the output system of replay gain values for the current song so
- * that volume levels can be adjusted accordingly, if the user so desires.
- * This may be called at any time during playback should the values change. */
-AUD_VFUNC1 (input_set_gain, const ReplayGainInfo *, info)
-
-/* Passes audio data to the output system for playback.  The data must be in
- * the format passed to open_audio, and the length (in bytes) must be an
- * integral number of frames.  This function blocks until all the data has
- * been written (though it may not yet be heard by the user). */
-AUD_VFUNC2 (input_write_audio, void *, data, int, length)
-
-/* Returns the time counter.  Note that this represents the amount of audio
- * data passed to the output system, not the amount actually heard by the
- * user. */
-AUD_FUNC0 (int, input_written_time)
-
-/* Returns a reference to the current tuple for the stream. */
-AUD_FUNC0 (Tuple *, input_get_tuple)
-
-/* Updates the tuple for the stream.  The caller gives up ownership of one
- * reference to the tuple. */
-AUD_VFUNC1 (input_set_tuple, Tuple *, tuple)
-
-/* Updates the displayed bitrate, in bits per second. */
-AUD_VFUNC1 (input_set_bitrate, int, bitrate)
-
-/* Checks whether playback is to be stopped.  The play() function should poll
- * check_stop() periodically and return as soon as check_stop() returns TRUE. */
-AUD_FUNC0 (bool_t, input_check_stop)
-
-/* Checks whether a seek has been requested.  If so, discards any buffered audio
- * and returns the position to seek to, in milliseconds.  Otherwise, returns -1. */
-AUD_FUNC0 (int, input_check_seek)
diff --git a/src/audacious/input.h b/src/audacious/input.h
deleted file mode 100644
index 49354833a38f..000000000000
--- a/src/audacious/input.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * input.h
- * Copyright 2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_INPUT_H
-#define AUDACIOUS_INPUT_H
-
-#include <audacious/api.h>
-#include <audacious/types.h>
-#include <libaudcore/tuple.h>
-
-#define AUD_API_NAME InputAPI
-#define AUD_API_SYMBOL input_api
-
-#ifdef _AUDACIOUS_CORE
-
-#include "api-local-begin.h"
-#include "input-api.h"
-#include "api-local-end.h"
-
-#else
-
-#include <audacious/api-define-begin.h>
-#include <audacious/input-api.h>
-#include <audacious/api-define-end.h>
-
-#include <audacious/api-alias-begin.h>
-#include <audacious/input-api.h>
-#include <audacious/api-alias-end.h>
-
-#endif
-
-#undef AUD_API_NAME
-#undef AUD_API_SYMBOL
-
-#endif
-
-#ifdef AUD_API_DECLARE
-
-#define AUD_API_NAME InputAPI
-#define AUD_API_SYMBOL input_api
-
-#include "api-define-begin.h"
-#include "input-api.h"
-#include "api-define-end.h"
-
-#include "api-declare-begin.h"
-#include "input-api.h"
-#include "api-declare-end.h"
-
-#undef AUD_API_NAME
-#undef AUD_API_SYMBOL
-
-#endif
diff --git a/src/audacious/interface.c b/src/audacious/interface.c
deleted file mode 100644
index 5c8045f1bd93..000000000000
--- a/src/audacious/interface.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * interface.c
- * Copyright 2010-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gtk/gtk.h>
-#include <pthread.h>
-
-#include <libaudcore/hook.h>
-#include <libaudgui/libaudgui-gtk.h>
-
-#include "debug.h"
-#include "general.h"
-#include "i18n.h"
-#include "interface.h"
-#include "misc.h"
-#include "plugin.h"
-#include "plugins.h"
-#include "visualization.h"
-
-static IfacePlugin * current_interface = NULL;
-
-static pthread_mutex_t error_mutex = PTHREAD_MUTEX_INITIALIZER;
-static GQueue error_queue = G_QUEUE_INIT;
-static int error_source;
-static GtkWidget * error_win;
-
-bool_t interface_load (PluginHandle * plugin)
-{
-    IfacePlugin * i = plugin_get_header (plugin);
-    g_return_val_if_fail (i, FALSE);
-
-    if (PLUGIN_HAS_FUNC (i, init) && ! i->init ())
-        return FALSE;
-
-    current_interface = i;
-    return TRUE;
-}
-
-void interface_unload (void)
-{
-    g_return_if_fail (current_interface);
-
-    if (PLUGIN_HAS_FUNC (current_interface, cleanup))
-        current_interface->cleanup ();
-
-    current_interface = NULL;
-}
-
-void interface_show (bool_t show)
-{
-    g_return_if_fail (current_interface);
-
-    set_bool (NULL, "show_interface", show);
-
-    if (PLUGIN_HAS_FUNC (current_interface, show))
-        current_interface->show (show);
-}
-
-bool_t interface_is_shown (void)
-{
-    g_return_val_if_fail (current_interface, FALSE);
-
-    return get_bool (NULL, "show_interface");
-}
-
-static bool_t error_idle_func (void * unused)
-{
-    pthread_mutex_lock (& error_mutex);
-
-    char * message;
-    while ((message = g_queue_pop_head (& error_queue)))
-    {
-        pthread_mutex_unlock (& error_mutex);
-
-        if (headless_mode ())
-            fprintf (stderr, "ERROR: %s\n", message);
-        else
-            audgui_simple_message (& error_win, GTK_MESSAGE_ERROR, _("Error"), message);
-
-        str_unref (message);
-
-        pthread_mutex_lock (& error_mutex);
-    }
-
-    error_source = 0;
-
-    pthread_mutex_unlock (& error_mutex);
-    return FALSE;
-}
-
-void interface_show_error (const char * message)
-{
-    pthread_mutex_lock (& error_mutex);
-
-    g_queue_push_tail (& error_queue, str_get (message));
-
-    if (! error_source)
-        error_source = g_idle_add (error_idle_func, NULL);
-
-    pthread_mutex_unlock (& error_mutex);
-}
-
-static bool_t delete_cb (GtkWidget * window, GdkEvent * event, PluginHandle *
- plugin)
-{
-    plugin_enable (plugin, FALSE);
-    return TRUE;
-}
-
-void interface_add_plugin_widget (PluginHandle * plugin, GtkWidget * widget)
-{
-    g_return_if_fail (current_interface);
-
-    if (PLUGIN_HAS_FUNC (current_interface, run_gtk_plugin))
-        current_interface->run_gtk_plugin (widget, plugin_get_name (plugin));
-    else
-    {
-        GtkWidget * window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-        gtk_window_set_title ((GtkWindow *) window, plugin_get_name (plugin));
-        gtk_window_set_default_size ((GtkWindow *) window, 300, 200);
-        gtk_window_set_has_resize_grip ((GtkWindow *) window, FALSE);
-        gtk_container_add ((GtkContainer *) window, widget);
-        g_signal_connect (window, "delete-event", (GCallback) delete_cb, plugin);
-        gtk_widget_show_all (window);
-    }
-}
-
-void interface_remove_plugin_widget (PluginHandle * plugin, GtkWidget * widget)
-{
-    g_return_if_fail (current_interface);
-
-    if (PLUGIN_HAS_FUNC (current_interface, stop_gtk_plugin))
-        current_interface->stop_gtk_plugin (widget);
-    else
-        gtk_widget_destroy (gtk_widget_get_parent (widget));
-}
-
-static bool_t probe_cb (PluginHandle * p, PluginHandle * * pp)
-{
-    * pp = p;
-    return FALSE;
-}
-
-PluginHandle * iface_plugin_probe (void)
-{
-    PluginHandle * p = NULL;
-    plugin_for_each (PLUGIN_TYPE_IFACE, (PluginForEachFunc) probe_cb, & p);
-    return p;
-}
-
-static PluginHandle * current_plugin = NULL;
-
-PluginHandle * iface_plugin_get_current (void)
-{
-    return current_plugin;
-}
-
-bool_t iface_plugin_set_current (PluginHandle * plugin)
-{
-    hook_call ("config save", NULL); /* tell interface to save layout */
-
-    if (current_plugin != NULL)
-    {
-        if (get_bool (NULL, "show_interface") && current_interface &&
-         PLUGIN_HAS_FUNC (current_interface, show))
-            current_interface->show (FALSE);
-
-        AUDDBG ("Unloading plugin widgets.\n");
-        general_cleanup ();
-
-        AUDDBG ("Unloading visualizers.\n");
-        vis_cleanup ();
-
-        AUDDBG ("Unloading %s.\n", plugin_get_name (current_plugin));
-        interface_unload ();
-
-        current_plugin = NULL;
-    }
-
-    if (plugin != NULL)
-    {
-        AUDDBG ("Loading %s.\n", plugin_get_name (plugin));
-
-        if (! interface_load (plugin))
-            return FALSE;
-
-        current_plugin = plugin;
-
-        AUDDBG ("Loading visualizers.\n");
-        vis_init ();
-
-        AUDDBG ("Loading plugin widgets.\n");
-        general_init ();
-
-        if (get_bool (NULL, "show_interface") && current_interface &&
-         PLUGIN_HAS_FUNC (current_interface, show))
-            current_interface->show (TRUE);
-    }
-
-    return TRUE;
-}
diff --git a/src/audacious/interface.h b/src/audacious/interface.h
deleted file mode 100644
index 8bc5727314ab..000000000000
--- a/src/audacious/interface.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * interface.h
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef __AUDACIOUS2_INTERFACE_H__
-#define __AUDACIOUS2_INTERFACE_H__
-
-#include <gtk/gtk.h>
-#include <audacious/plugins.h>
-
-bool_t interface_load (PluginHandle * plugin);
-void interface_unload (void);
-
-void interface_add_plugin_widget (PluginHandle * plugin, GtkWidget * widget);
-void interface_remove_plugin_widget (PluginHandle * plugin, GtkWidget * widget);
-
-PluginHandle * iface_plugin_probe (void);
-PluginHandle * iface_plugin_get_current (void);
-bool_t iface_plugin_set_current (PluginHandle * plugin);
-
-#endif
diff --git a/src/audacious/main.c b/src/audacious/main.c
deleted file mode 100644
index 84409694cd8e..000000000000
--- a/src/audacious/main.c
+++ /dev/null
@@ -1,634 +0,0 @@
-/*
- * main.c
- * Copyright 2007-2013 William Pitcock and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <locale.h>
-
-#include <gtk/gtk.h>
-
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-#include <libaudgui/libaudgui.h>
-#include <libaudtag/audtag.h>
-
-#ifdef USE_DBUS
-#include "aud-dbus.h"
-#endif
-
-#include "debug.h"
-#include "drct.h"
-#include "equalizer.h"
-#include "i18n.h"
-#include "interface.h"
-#include "main.h"
-#include "misc.h"
-#include "playlist.h"
-#include "plugins.h"
-#include "scanner.h"
-#include "util.h"
-
-#define AUTOSAVE_INTERVAL 300 /* seconds */
-
-static struct {
-    bool_t help, version;
-    bool_t play, pause, play_pause, stop, fwd, rew;
-    bool_t enqueue, enqueue_to_temp;
-    bool_t mainwin, show_jump_box;
-    bool_t headless, quit_after_play;
-    bool_t verbose;
-} options;
-
-static Index * filenames;
-
-static const struct {
-    const char * long_arg;
-    char short_arg;
-    bool_t * value;
-    const char * desc;
-} arg_map[] = {
-    {"help", 'h', & options.help, N_("Show command-line help")},
-    {"version", 'v', & options.version, N_("Show version")},
-    {"play", 'p', & options.play, N_("Start playback")},
-    {"pause", 'u', & options.pause, N_("Pause playback")},
-    {"play-pause", 't', & options.play_pause, N_("Pause if playing, play otherwise")},
-    {"stop", 's', & options.stop, N_("Stop playback")},
-    {"rew", 'r', & options.rew, N_("Skip to previous song")},
-    {"fwd", 'f', & options.fwd, N_("Skip to next song")},
-    {"enqueue", 'e', & options.enqueue, N_("Add files to the playlist")},
-    {"enqueue-to-temp", 'E', & options.enqueue_to_temp, N_("Add files to a temporary playlist")},
-    {"show-main-window", 'm', & options.mainwin, N_("Display the main window")},
-    {"show-jump-box", 'j', & options.show_jump_box, N_("Display the jump-to-song window")},
-    {"headless", 'H', & options.headless, N_("Start without a graphical interface")},
-    {"quit-after-play", 'q', & options.quit_after_play, N_("Quit on playback stop")},
-    {"verbose", 'V', & options.verbose, N_("Print debugging messages")},
-};
-
-static char * aud_paths[AUD_PATH_COUNT];
-
-static void make_dirs(void)
-{
-#ifdef S_IRGRP
-    const mode_t mode755 = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
-#else
-    const mode_t mode755 = S_IRWXU;
-#endif
-
-    make_directory(aud_paths[AUD_PATH_USER_DIR], mode755);
-    make_directory(aud_paths[AUD_PATH_PLAYLISTS_DIR], mode755);
-}
-
-static char * relocate_path (const char * path, const char * old, const char * new)
-{
-    int oldlen = strlen (old);
-    int newlen = strlen (new);
-
-    if (oldlen && old[oldlen - 1] == G_DIR_SEPARATOR)
-        oldlen --;
-    if (newlen && new[newlen - 1] == G_DIR_SEPARATOR)
-        newlen --;
-
-#ifdef _WIN32
-    if (g_ascii_strncasecmp (path, old, oldlen) || (path[oldlen] && path[oldlen] != G_DIR_SEPARATOR))
-#else
-    if (strncmp (path, old, oldlen) || (path[oldlen] && path[oldlen] != G_DIR_SEPARATOR))
-#endif
-    {
-        fprintf (stderr, "Failed to relocate a data path.  Falling back to "
-         "compile-time path: %s\n", path);
-        return str_get (path);
-    }
-
-    return str_printf ("%.*s%s", newlen, new, path + oldlen);
-}
-
-static void relocate_paths (void)
-{
-    char bindir[] = HARDCODE_BINDIR;
-    char datadir[] = HARDCODE_DATADIR;
-    char plugindir[] = HARDCODE_PLUGINDIR;
-    char localedir[] = HARDCODE_LOCALEDIR;
-    char desktopfile[] = HARDCODE_DESKTOPFILE;
-    char iconfile[] = HARDCODE_ICONFILE;
-
-    filename_normalize (bindir);
-    filename_normalize (datadir);
-    filename_normalize (plugindir);
-    filename_normalize (localedir);
-    filename_normalize (desktopfile);
-    filename_normalize (iconfile);
-
-    /* Compare the compile-time path to the executable and the actual path to
-     * see if we have been moved. */
-    char * self = get_path_to_self ();
-    if (! self)
-    {
-FALLBACK:
-        /* Fall back to compile-time paths. */
-        aud_paths[AUD_PATH_BIN_DIR] = str_get (bindir);
-        aud_paths[AUD_PATH_DATA_DIR] = str_get (datadir);
-        aud_paths[AUD_PATH_PLUGIN_DIR] = str_get (plugindir);
-        aud_paths[AUD_PATH_LOCALE_DIR] = str_get (localedir);
-        aud_paths[AUD_PATH_DESKTOP_FILE] = str_get (desktopfile);
-        aud_paths[AUD_PATH_ICON_FILE] = str_get (iconfile);
-
-        return;
-    }
-
-    SCOPY (old, bindir);
-    SCOPY (new, self);
-
-    str_unref (self);
-
-    filename_normalize (new);
-
-    /* Strip the name of the executable file, leaving the path. */
-    char * base = last_path_element (new);
-    if (! base)
-        goto FALLBACK;
-
-    cut_path_element (new, base);
-
-    /* Strip innermost folder names from both paths as long as they match.  This
-     * leaves a compile-time prefix and a run-time one to replace it with. */
-    char * a, * b;
-    while ((a = last_path_element (old)) && (b = last_path_element (new)) &&
-#ifdef _WIN32
-     ! g_ascii_strcasecmp (a, b))
-#else
-     ! strcmp (a, b))
-#endif
-    {
-        cut_path_element (old, a);
-        cut_path_element (new, b);
-    }
-
-    /* Do the replacements. */
-    aud_paths[AUD_PATH_BIN_DIR] = relocate_path (bindir, old, new);
-    aud_paths[AUD_PATH_DATA_DIR] = relocate_path (datadir, old, new);
-    aud_paths[AUD_PATH_PLUGIN_DIR] = relocate_path (plugindir, old, new);
-    aud_paths[AUD_PATH_LOCALE_DIR] = relocate_path (localedir, old, new);
-    aud_paths[AUD_PATH_DESKTOP_FILE] = relocate_path (desktopfile, old, new);
-    aud_paths[AUD_PATH_ICON_FILE] = relocate_path (iconfile, old, new);
-}
-
-static void init_paths (void)
-{
-    relocate_paths ();
-
-    const char * xdg_config_home = g_get_user_config_dir ();
-
-    aud_paths[AUD_PATH_USER_DIR] = filename_build (xdg_config_home, "audacious");
-    aud_paths[AUD_PATH_PLAYLISTS_DIR] = filename_build (aud_paths[AUD_PATH_USER_DIR], "playlists");
-
-#ifdef _WIN32
-    /* Some libraries (libmcs) and plugins (filewriter) use these variables,
-     * which are generally not set on Windows. */
-    g_setenv ("HOME", g_get_home_dir (), TRUE);
-    g_setenv ("XDG_CONFIG_HOME", xdg_config_home, TRUE);
-    g_setenv ("XDG_DATA_HOME", g_get_user_data_dir (), TRUE);
-    g_setenv ("XDG_CACHE_HOME", g_get_user_cache_dir (), TRUE);
-#endif
-}
-
-const char * get_path (int id)
-{
-    g_return_val_if_fail (id >= 0 && id < AUD_PATH_COUNT, NULL);
-    return aud_paths[id];
-}
-
-static bool_t parse_options (int argc, char * * argv)
-{
-    char * cur = g_get_current_dir ();
-    bool_t success = TRUE;
-
-#ifdef _WIN32
-    get_argv_utf8 (& argc, & argv);
-#endif
-
-    for (int n = 1; n < argc; n ++)
-    {
-        if (argv[n][0] != '-')  /* filename */
-        {
-            char * uri = NULL;
-
-            if (strstr (argv[n], "://"))
-                uri = str_get (argv[n]);
-            else if (g_path_is_absolute (argv[n]))
-                uri = filename_to_uri (argv[n]);
-            else
-            {
-                char * tmp = filename_build (cur, argv[n]);
-                uri = filename_to_uri (tmp);
-                str_unref (tmp);
-            }
-
-            if (uri)
-            {
-                if (! filenames)
-                    filenames = index_new ();
-
-                index_insert (filenames, -1, uri);
-            }
-        }
-        else if (argv[n][1] == '-')  /* long option */
-        {
-            int i;
-
-            for (i = 0; i < ARRAY_LEN (arg_map); i ++)
-            {
-                if (! strcmp (argv[n] + 2, arg_map[i].long_arg))
-                {
-                    * arg_map[i].value = TRUE;
-                    break;
-                }
-            }
-
-            if (i == ARRAY_LEN (arg_map))
-            {
-                fprintf (stderr, _("Unknown option: %s\n"), argv[n]);
-                success = FALSE;
-                goto OUT;
-            }
-        }
-        else  /* short form */
-        {
-            for (int c = 1; argv[n][c]; c ++)
-            {
-                int i;
-
-                for (i = 0; i < ARRAY_LEN (arg_map); i ++)
-                {
-                    if (argv[n][c] == arg_map[i].short_arg)
-                    {
-                        * arg_map[i].value = TRUE;
-                        break;
-                    }
-                }
-
-                if (i == ARRAY_LEN (arg_map))
-                {
-                    fprintf (stderr, _("Unknown option: -%c\n"), argv[n][c]);
-                    success = FALSE;
-                    goto OUT;
-                }
-            }
-        }
-    }
-
-    verbose = options.verbose;
-
-OUT:
-#ifdef _WIN32
-    free_argv_utf8 (& argc, & argv);
-#endif
-
-    g_free (cur);
-    return success;
-}
-
-static void print_help (void)
-{
-    static const char pad[20] = "                    ";
-
-    fprintf (stderr, _("Usage: audacious [OPTION] ... [FILE] ...\n\n"));
-
-    for (int i = 0; i < ARRAY_LEN (arg_map); i ++)
-        fprintf (stderr, "  -%c, --%s%.*s%s\n", arg_map[i].short_arg,
-         arg_map[i].long_arg, (int) (20 - strlen (arg_map[i].long_arg)), pad,
-         _(arg_map[i].desc));
-
-    fprintf (stderr, "\n");
-}
-
-bool_t headless_mode (void)
-{
-    return options.headless;
-}
-
-#ifdef USE_DBUS
-static void do_remote (void)
-{
-    GDBusConnection * bus = NULL;
-    ObjAudacious * obj = NULL;
-    GError * error = NULL;
-
-    if (! (bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, & error)))
-        goto ERR;
-
-    if (! (obj = obj_audacious_proxy_new_sync (bus, 0, "org.atheme.audacious",
-     "/org/atheme/audacious", NULL, & error)))
-        goto ERR;
-
-    /* check whether remote is running */
-    char * version = NULL;
-    obj_audacious_call_version_sync (obj, & version, NULL, NULL);
-
-    if (! version)
-        goto DONE;
-
-    AUDDBG ("Connected to remote version %s.\n", version);
-
-    /* if no command line options, then present running instance */
-    if (! (filenames || options.play || options.pause || options.play_pause ||
-     options.stop || options.rew || options.fwd || options.show_jump_box ||
-     options.mainwin))
-        options.mainwin = TRUE;
-
-    if (filenames)
-    {
-        int n_filenames = index_count (filenames);
-        const char * * list = g_new (const char *, n_filenames + 1);
-
-        for (int i = 0; i < n_filenames; i ++)
-            list[i] = index_get (filenames, i);
-
-        list[n_filenames] = NULL;
-
-        if (options.enqueue_to_temp)
-            obj_audacious_call_open_list_to_temp_sync (obj, list, NULL, NULL);
-        else if (options.enqueue)
-            obj_audacious_call_add_list_sync (obj, list, NULL, NULL);
-        else
-            obj_audacious_call_open_list_sync (obj, list, NULL, NULL);
-
-        g_free (list);
-    }
-
-    if (options.play)
-        obj_audacious_call_play_sync (obj, NULL, NULL);
-    if (options.pause)
-        obj_audacious_call_pause_sync (obj, NULL, NULL);
-    if (options.play_pause)
-        obj_audacious_call_play_pause_sync (obj, NULL, NULL);
-    if (options.stop)
-        obj_audacious_call_stop_sync (obj, NULL, NULL);
-    if (options.rew)
-        obj_audacious_call_reverse_sync (obj, NULL, NULL);
-    if (options.fwd)
-        obj_audacious_call_advance_sync (obj, NULL, NULL);
-    if (options.show_jump_box)
-        obj_audacious_call_show_jtf_box_sync (obj, TRUE, NULL, NULL);
-    if (options.mainwin)
-        obj_audacious_call_show_main_win_sync (obj, TRUE, NULL, NULL);
-
-    g_free (version);
-    g_object_unref (obj);
-
-    exit (EXIT_SUCCESS);
-
-ERR:
-    fprintf (stderr, "D-Bus error: %s\n", error->message);
-    g_error_free (error);
-
-DONE:
-    if (obj)
-        g_object_unref (obj);
-
-    return;
-}
-#endif
-
-static void do_commands (void)
-{
-    bool_t resume = get_bool (NULL, "resume_playback_on_startup");
-
-    if (filenames)
-    {
-        if (options.enqueue_to_temp)
-        {
-            drct_pl_open_temp_list (filenames);
-            resume = FALSE;
-        }
-        else if (options.enqueue)
-            drct_pl_add_list (filenames, -1);
-        else
-        {
-            drct_pl_open_list (filenames);
-            resume = FALSE;
-        }
-
-        filenames = NULL;
-    }
-
-    if (resume)
-        playlist_resume ();
-
-    if (options.play || options.play_pause)
-    {
-        if (! drct_get_playing ())
-            drct_play ();
-        else if (drct_get_paused ())
-            drct_pause ();
-    }
-
-    if (options.show_jump_box && ! options.headless)
-        audgui_jump_to_track ();
-    if (options.mainwin && ! options.headless)
-        interface_show (TRUE);
-}
-
-static void main_cleanup (void)
-{
-    for (int i = 0; i < AUD_PATH_COUNT; i ++)
-        str_unref (aud_paths[i]);
-
-    if (filenames)
-        index_free_full (filenames, (IndexFreeFunc) str_unref);
-
-    strpool_shutdown ();
-}
-
-static void init_one (void)
-{
-    atexit (main_cleanup);
-
-#ifdef HAVE_SIGWAIT
-    signals_init_one ();
-#endif
-
-    init_paths ();
-    make_dirs ();
-
-    setlocale (LC_ALL, "");
-    bindtextdomain (PACKAGE, aud_paths[AUD_PATH_LOCALE_DIR]);
-    bind_textdomain_codeset (PACKAGE, "UTF-8");
-    bindtextdomain (PACKAGE "-plugins", aud_paths[AUD_PATH_LOCALE_DIR]);
-    bind_textdomain_codeset (PACKAGE "-plugins", "UTF-8");
-    textdomain (PACKAGE);
-
-#if ! GLIB_CHECK_VERSION (2, 36, 0)
-    g_type_init ();
-#endif
-}
-
-static void init_two (void)
-{
-    if (! options.headless)
-        gtk_init (NULL, NULL);
-
-#ifdef HAVE_SIGWAIT
-    signals_init_two ();
-#endif
-
-    AUDDBG ("Loading configuration.\n");
-    config_load ();
-
-    AUDDBG ("Initializing.\n");
-    art_init ();
-    chardet_init ();
-    eq_init ();
-    playlist_init ();
-
-    tag_set_verbose (verbose);
-    vfs_set_verbose (verbose);
-
-    AUDDBG ("Loading lowlevel plugins.\n");
-    start_plugins_one ();
-
-    AUDDBG ("Starting worker threads.\n");
-    adder_init ();
-    scanner_init ();
-
-    AUDDBG ("Restoring state.\n");
-    load_playlists ();
-
-    do_commands ();
-
-    AUDDBG ("Loading highlevel plugins.\n");
-    start_plugins_two ();
-
-#ifdef USE_DBUS
-    dbus_server_init ();
-#endif
-}
-
-static void shut_down (void)
-{
-    AUDDBG ("Saving playlist state.\n");
-    save_playlists (TRUE);
-
-    AUDDBG ("Unloading highlevel plugins.\n");
-    stop_plugins_two ();
-
-#ifdef USE_DBUS
-    dbus_server_cleanup ();
-#endif
-
-    AUDDBG ("Stopping playback.\n");
-    if (drct_get_playing ())
-        drct_stop ();
-
-    AUDDBG ("Stopping worker threads.\n");
-    adder_cleanup ();
-    scanner_cleanup ();
-
-    AUDDBG ("Unloading lowlevel plugins.\n");
-    stop_plugins_one ();
-
-    event_queue_cancel_all ();
-
-    AUDDBG ("Saving configuration.\n");
-    config_save ();
-    config_cleanup ();
-
-    AUDDBG ("Cleaning up.\n");
-    art_cleanup ();
-    chardet_cleanup ();
-    eq_cleanup ();
-    history_cleanup ();
-    playlist_end ();
-}
-
-bool_t do_autosave (void)
-{
-    AUDDBG ("Saving configuration.\n");
-    hook_call ("config save", NULL);
-    save_playlists (FALSE);
-    config_save ();
-    return TRUE;
-}
-
-static bool_t check_should_quit (void)
-{
-    return options.quit_after_play && ! drct_get_playing () && ! playlist_add_in_progress (-1);
-}
-
-static void maybe_quit (void)
-{
-    if (check_should_quit ())
-        gtk_main_quit ();
-}
-
-int main (int argc, char * * argv)
-{
-    init_one ();
-
-    if (! parse_options (argc, argv))
-    {
-        print_help ();
-        return EXIT_FAILURE;
-    }
-
-    if (options.help)
-    {
-        print_help ();
-        return EXIT_SUCCESS;
-    }
-
-    if (options.version)
-    {
-        printf ("%s %s (%s)\n", _("Audacious"), VERSION, BUILDSTAMP);
-        return EXIT_SUCCESS;
-    }
-
-#if USE_DBUS
-    do_remote (); /* may exit */
-#endif
-
-    AUDDBG ("No remote session; starting up.\n");
-    init_two ();
-
-    AUDDBG ("Startup complete.\n");
-    g_timeout_add_seconds (AUTOSAVE_INTERVAL, (GSourceFunc) do_autosave, NULL);
-
-    if (check_should_quit ())
-        goto QUIT;
-
-    hook_associate ("playback stop", (HookFunction) maybe_quit, NULL);
-    hook_associate ("playlist add complete", (HookFunction) maybe_quit, NULL);
-
-    gtk_main ();
-
-    hook_dissociate ("playback stop", (HookFunction) maybe_quit);
-    hook_dissociate ("playlist add complete", (HookFunction) maybe_quit);
-
-QUIT:
-    shut_down ();
-    return EXIT_SUCCESS;
-}
-
-void drct_quit (void)
-{
-    gtk_main_quit ();
-}
diff --git a/src/audacious/main.cc b/src/audacious/main.cc
new file mode 100644
index 000000000000..ca6526ffef02
--- /dev/null
+++ b/src/audacious/main.cc
@@ -0,0 +1,384 @@
+/*
+ * main.c
+ * Copyright 2007-2013 William Pitcock and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>  /* for g_get_current_dir, g_path_is_absolute */
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/drct.h>
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/interface.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/runtime.h>
+#include <libaudcore/tuple.h>
+
+#ifdef USE_DBUS
+#include "aud-dbus.h"
+#endif
+
+#include "main.h"
+#include "util.h"
+
+static struct {
+    int help, version;
+    int play, pause, play_pause, stop, fwd, rew;
+    int enqueue, enqueue_to_temp;
+    int mainwin, show_jump_box;
+    int headless, quit_after_play;
+    int verbose;
+    int qt;
+} options;
+
+static Index<PlaylistAddItem> filenames;
+
+static const struct {
+    const char * long_arg;
+    char short_arg;
+    int * value;
+    const char * desc;
+} arg_map[] = {
+    {"help", 'h', & options.help, N_("Show command-line help")},
+    {"version", 'v', & options.version, N_("Show version")},
+    {"play", 'p', & options.play, N_("Start playback")},
+    {"pause", 'u', & options.pause, N_("Pause playback")},
+    {"play-pause", 't', & options.play_pause, N_("Pause if playing, play otherwise")},
+    {"stop", 's', & options.stop, N_("Stop playback")},
+    {"rew", 'r', & options.rew, N_("Skip to previous song")},
+    {"fwd", 'f', & options.fwd, N_("Skip to next song")},
+    {"enqueue", 'e', & options.enqueue, N_("Add files to the playlist")},
+    {"enqueue-to-temp", 'E', & options.enqueue_to_temp, N_("Add files to a temporary playlist")},
+    {"show-main-window", 'm', & options.mainwin, N_("Display the main window")},
+    {"show-jump-box", 'j', & options.show_jump_box, N_("Display the jump-to-song window")},
+    {"headless", 'H', & options.headless, N_("Start without a graphical interface")},
+    {"quit-after-play", 'q', & options.quit_after_play, N_("Quit on playback stop")},
+    {"verbose", 'V', & options.verbose, N_("Print debugging messages (may be used twice)")},
+#if defined(USE_QT) && defined(USE_GTK)
+    {"qt", 'Q', & options.qt, N_("Run in Qt mode")},
+#endif
+};
+
+static bool parse_options (int argc, char * * argv)
+{
+    char * cur = g_get_current_dir ();
+    bool success = true;
+
+#ifdef _WIN32
+    Index<String> args = get_argv_utf8 ();
+
+    for (int n = 1; n < args.len (); n ++)
+    {
+        const char * arg = args[n];
+#else
+    for (int n = 1; n < argc; n ++)
+    {
+        const char * arg = argv[n];
+#endif
+
+        if (arg[0] != '-')  /* filename */
+        {
+            String uri;
+
+            if (strstr (arg, "://"))
+                uri = String (arg);
+            else if (g_path_is_absolute (arg))
+                uri = String (filename_to_uri (arg));
+            else
+                uri = String (filename_to_uri (filename_build ({cur, arg})));
+
+            if (uri)
+                filenames.append (uri);
+        }
+        else if (arg[1] == '-')  /* long option */
+        {
+            bool found = false;
+
+            for (auto & arg_info : arg_map)
+            {
+                if (! strcmp (arg + 2, arg_info.long_arg))
+                {
+                    (* arg_info.value) ++;
+                    found = true;
+                    break;
+                }
+            }
+
+            if (! found)
+            {
+                fprintf (stderr, _("Unknown option: %s\n"), arg);
+                success = false;
+                goto OUT;
+            }
+        }
+        else  /* short form */
+        {
+            for (int c = 1; arg[c]; c ++)
+            {
+                bool found = false;
+
+                for (auto & arg_info : arg_map)
+                {
+                    if (arg[c] == arg_info.short_arg)
+                    {
+                        (* arg_info.value) ++;
+                        found = true;
+                        break;
+                    }
+                }
+
+                if (! found)
+                {
+                    fprintf (stderr, _("Unknown option: -%c\n"), arg[c]);
+                    success = false;
+                    goto OUT;
+                }
+            }
+        }
+    }
+
+    aud_set_headless_mode (options.headless);
+
+    if (options.verbose >= 2)
+        audlog::set_stderr_level (audlog::Debug);
+    else if (options.verbose)
+        audlog::set_stderr_level (audlog::Info);
+
+    if (options.qt)
+        aud_set_mainloop_type (MainloopType::Qt);
+
+OUT:
+    g_free (cur);
+    return success;
+}
+
+static void print_help (void)
+{
+    static const char pad[21] = "                    ";
+
+    fprintf (stderr, _("Usage: audacious [OPTION] ... [FILE] ...\n\n"));
+
+    for (auto & arg_info : arg_map)
+        fprintf (stderr, "  -%c, --%s%.*s%s\n", arg_info.short_arg,
+         arg_info.long_arg, (int) (20 - strlen (arg_info.long_arg)), pad,
+         _(arg_info.desc));
+
+    fprintf (stderr, "\n");
+}
+
+#ifdef USE_DBUS
+static void do_remote (void)
+{
+    GDBusConnection * bus = nullptr;
+    ObjAudacious * obj = nullptr;
+    GError * error = nullptr;
+
+#if ! GLIB_CHECK_VERSION (2, 36, 0)
+    g_type_init ();
+#endif
+
+    /* check whether this is the first instance */
+    if (dbus_server_init () != StartupType::Client)
+        return;
+
+    if (! (bus = g_bus_get_sync (G_BUS_TYPE_SESSION, nullptr, & error)))
+        goto ERR;
+
+    if (! (obj = obj_audacious_proxy_new_sync (bus, (GDBusProxyFlags) 0,
+     "org.atheme.audacious", "/org/atheme/audacious", nullptr, & error)))
+        goto ERR;
+
+    AUDINFO ("Connected to remote session.\n");
+
+    /* if no command line options, then present running instance */
+    if (! (filenames.len () || options.play || options.pause ||
+     options.play_pause || options.stop || options.rew || options.fwd ||
+     options.show_jump_box || options.mainwin))
+        options.mainwin = true;
+
+    if (filenames.len ())
+    {
+        Index<const char *> list;
+
+        for (auto & item : filenames)
+            list.append (item.filename);
+
+        list.append (nullptr);
+
+        if (options.enqueue_to_temp)
+            obj_audacious_call_open_list_to_temp_sync (obj, list.begin (), nullptr, nullptr);
+        else if (options.enqueue)
+            obj_audacious_call_add_list_sync (obj, list.begin (), nullptr, nullptr);
+        else
+            obj_audacious_call_open_list_sync (obj, list.begin (), nullptr, nullptr);
+    }
+
+    if (options.play)
+        obj_audacious_call_play_sync (obj, nullptr, nullptr);
+    if (options.pause)
+        obj_audacious_call_pause_sync (obj, nullptr, nullptr);
+    if (options.play_pause)
+        obj_audacious_call_play_pause_sync (obj, nullptr, nullptr);
+    if (options.stop)
+        obj_audacious_call_stop_sync (obj, nullptr, nullptr);
+    if (options.rew)
+        obj_audacious_call_reverse_sync (obj, nullptr, nullptr);
+    if (options.fwd)
+        obj_audacious_call_advance_sync (obj, nullptr, nullptr);
+    if (options.show_jump_box)
+        obj_audacious_call_show_jtf_box_sync (obj, true, nullptr, nullptr);
+    if (options.mainwin)
+        obj_audacious_call_show_main_win_sync (obj, true, nullptr, nullptr);
+
+    g_object_unref (obj);
+
+    exit (EXIT_SUCCESS);
+
+ERR:
+    if (error)
+    {
+        AUDERR ("D-Bus error: %s\n", error->message);
+        g_error_free (error);
+    }
+}
+#endif
+
+static void do_commands (void)
+{
+    bool resume = aud_get_bool (nullptr, "resume_playback_on_startup");
+
+    if (filenames.len ())
+    {
+        if (options.enqueue_to_temp)
+        {
+            aud_drct_pl_open_temp_list (std::move (filenames));
+            resume = false;
+        }
+        else if (options.enqueue)
+            aud_drct_pl_add_list (std::move (filenames), -1);
+        else
+        {
+            aud_drct_pl_open_list (std::move (filenames));
+            resume = false;
+        }
+    }
+
+    if (resume)
+        aud_resume ();
+
+    if (options.play || options.play_pause)
+    {
+        if (! aud_drct_get_playing ())
+            aud_drct_play ();
+        else if (aud_drct_get_paused ())
+            aud_drct_pause ();
+    }
+
+    if (options.show_jump_box && ! options.headless)
+        aud_ui_show_jump_to_song ();
+    if (options.mainwin && ! options.headless)
+        aud_ui_show (true);
+}
+
+static void main_cleanup (void)
+{
+    filenames.clear ();
+    aud_cleanup_paths ();
+    aud_leak_check ();
+}
+
+static bool check_should_quit (void)
+{
+    return options.quit_after_play && ! aud_drct_get_playing () &&
+     ! aud_playlist_add_in_progress (-1);
+}
+
+static void maybe_quit (void)
+{
+    if (check_should_quit ())
+        aud_quit ();
+}
+
+int main (int argc, char * * argv)
+{
+    atexit (main_cleanup);
+
+#ifdef HAVE_SIGWAIT
+    signals_init_one ();
+#endif
+
+    aud_init_paths ();
+    aud_init_i18n ();
+
+    if (! parse_options (argc, argv))
+    {
+        print_help ();
+        return EXIT_FAILURE;
+    }
+
+    if (options.help)
+    {
+        print_help ();
+        return EXIT_SUCCESS;
+    }
+
+    if (options.version)
+    {
+        printf ("%s %s (%s)\n", _("Audacious"), VERSION, BUILDSTAMP);
+        return EXIT_SUCCESS;
+    }
+
+#if USE_DBUS
+    do_remote (); /* may exit */
+#endif
+
+    AUDINFO ("No remote session; starting up.\n");
+
+#ifdef HAVE_SIGWAIT
+    signals_init_two ();
+#endif
+
+    aud_init ();
+
+    do_commands ();
+
+    if (check_should_quit ())
+        goto QUIT;
+
+    hook_associate ("playback stop", (HookFunction) maybe_quit, nullptr);
+    hook_associate ("playlist add complete", (HookFunction) maybe_quit, nullptr);
+    hook_associate ("quit", (HookFunction) aud_quit, nullptr);
+
+    aud_run ();
+
+    hook_dissociate ("playback stop", (HookFunction) maybe_quit);
+    hook_dissociate ("playlist add complete", (HookFunction) maybe_quit);
+    hook_dissociate ("quit", (HookFunction) aud_quit);
+
+QUIT:
+#ifdef USE_DBUS
+    dbus_server_cleanup ();
+#endif
+
+    aud_cleanup ();
+
+    return EXIT_SUCCESS;
+}
diff --git a/src/audacious/main.h b/src/audacious/main.h
index 0fa34323e96d..88fd0def8980 100644
--- a/src/audacious/main.h
+++ b/src/audacious/main.h
@@ -17,41 +17,22 @@
  * the use of this software.
  */
 
-/* Header for all those files that have just one or two public identifiers. */
-
 #ifndef _AUDACIOUS_MAIN_H
 #define _AUDACIOUS_MAIN_H
 
-#include <libaudcore/core.h>
-
-/* adder.c */
-void adder_init (void);
-void adder_cleanup (void);
-
-/* art.c */
-void art_init (void);
-void art_cleanup (void);
-
 /* dbus-server.c */
 #ifdef USE_DBUS
-void dbus_server_init (void);
-void dbus_server_cleanup (void);
-#endif
-
-/* chardet.c */
-void chardet_init (void);
-void chardet_cleanup (void);
 
-/* config.c */
-void config_load (void);
-void config_save (void);
-void config_cleanup (void);
+enum class StartupType {
+    Server,
+    Client,
+    Unknown
+};
 
-/* history.c */
-void history_cleanup (void);
+StartupType dbus_server_init (void);
+void dbus_server_cleanup (void);
 
-/* main.c */
-bool_t do_autosave (void);
+#endif
 
 /* signals.c */
 #ifdef HAVE_SIGWAIT
@@ -59,7 +40,4 @@ void signals_init_one (void);
 void signals_init_two (void);
 #endif
 
-/* ui_albumart.c */
-char * get_associated_image_file (const char * filename); /* pooled */
-
 #endif
diff --git a/src/audacious/misc-api.h b/src/audacious/misc-api.h
deleted file mode 100644
index b9ea2a596d04..000000000000
--- a/src/audacious/misc-api.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * misc-api.h
- * Copyright 2010-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-/* Do not include this file directly; use misc.h instead. */
-
-/* all (char *) return values must be freed with str_unref() */
-
-/* art.c (thread-safe) */
-
-/* Gets album art for <file> (the URI of a song file) as JPEG or PNG data.  If
- * the album art is not yet loaded, sets <data> to NULL and begins to load the
- * album art in the background.  On completion, the "art ready" hook is called,
- * with <file> as a parameter.  The "current art ready" hook is also called if
- * <file> is the currently playing song. */
-AUD_VFUNC3 (art_request_data, const char *, file, const void * *, data, int64_t *, len)
-
-/* Similar to art_request_data() but returns the URI of an image file.
- * (A temporary file will be created if necessary.) */
-AUD_FUNC1 (const char *, art_request_file, const char *, file)
-
-/* Releases album art returned by art_request_data() or art_request_file(). */
-AUD_VFUNC1 (art_unref, const char *, file)
-
-/* config.c (thread-safe) */
-
-AUD_VFUNC2 (config_set_defaults, const char *, section, const char * const *, entries)
-
-AUD_VFUNC3 (set_str, const char *, section, const char *, name, const char *, value)
-AUD_FUNC2 (char *, get_str, const char *, section, const char *, name)
-AUD_VFUNC3 (set_bool, const char *, section, const char *, name, bool_t, value)
-AUD_FUNC2 (bool_t, get_bool, const char *, section, const char *, name)
-AUD_VFUNC3 (set_int, const char *, section, const char *, name, int, value)
-AUD_FUNC2 (int, get_int, const char *, section, const char *, name)
-AUD_VFUNC3 (set_double, const char *, section, const char *, name, double, value)
-AUD_FUNC2 (double, get_double, const char *, section, const char *, name)
-
-/* equalizer.c */
-AUD_VFUNC1 (eq_set_bands, const double *, values)
-AUD_VFUNC1 (eq_get_bands, double *, values)
-AUD_VFUNC2 (eq_set_band, int, band, double, value)
-AUD_FUNC1 (double, eq_get_band, int, band)
-
-/* equalizer_preset.c */
-AUD_FUNC1 (EqualizerPreset *, equalizer_preset_new, const char *, name)
-AUD_VFUNC1 (equalizer_preset_free, EqualizerPreset *, preset)
-AUD_FUNC1 (Index *, equalizer_read_presets, const char *, basename)
-AUD_FUNC2 (bool_t, equalizer_write_presets, Index *, list, const char *, basename)
-
-/* note: legacy code! these are local filenames, not URIs */
-AUD_FUNC1 (EqualizerPreset *, load_preset_file, const char *, filename)
-AUD_FUNC2 (bool_t, save_preset_file, EqualizerPreset *, preset, const char *, filename)
-
-AUD_FUNC1 (Index *, import_winamp_presets, VFSFile *, file)
-AUD_FUNC2 (bool_t, export_winamp_preset, EqualizerPreset *, preset, VFSFile *, file)
-
-/* history.c */
-AUD_FUNC1 (const char *, history_get, int, entry)
-AUD_VFUNC1 (history_add, const char *, path)
-
-/* interface.c */
-AUD_VFUNC1 (interface_show, bool_t, show)
-AUD_FUNC0 (bool_t, interface_is_shown)
-
-/* interface_show_error() is safe to call from any thread */
-AUD_VFUNC1 (interface_show_error, const char *, message)
-
-/* main.c */
-AUD_FUNC1 (const char *, get_path, int, path)
-AUD_FUNC0 (bool_t, headless_mode)
-
-/* output.c */
-AUD_VFUNC1 (output_reset, int, type)
-
-/* probe.c */
-AUD_FUNC2 (PluginHandle *, file_find_decoder, const char *, filename, bool_t,
- fast)
-AUD_FUNC2 (Tuple *, file_read_tuple, const char *, filename, PluginHandle *,
- decoder)
-AUD_FUNC4 (bool_t, file_read_image, const char *, filename, PluginHandle *,
- decoder, void * *, data, int64_t *, size)
-AUD_FUNC2 (bool_t, file_can_write_tuple, const char *, filename,
- PluginHandle *, decoder)
-AUD_FUNC3 (bool_t, file_write_tuple, const char *, filename, PluginHandle *,
- decoder, const Tuple *, tuple)
-AUD_FUNC2 (bool_t, custom_infowin, const char *, filename, PluginHandle *,
- decoder)
-
-/* ui_plugin_menu.c */
-AUD_FUNC1 (/* GtkWidget * */ void *, get_plugin_menu, int, id)
-AUD_VFUNC4 (plugin_menu_add, int, id, MenuFunc, func, const char *, name,
- const char *, icon)
-AUD_VFUNC2 (plugin_menu_remove, int, id, MenuFunc, func)
-
-/* ui_preferences.c */
-AUD_VFUNC4 (create_widgets_with_domain, /* GtkWidget * */ void *, box,
- const PreferencesWidget *, widgets, int, n_widgets, const char *, domain)
-AUD_VFUNC0 (show_prefs_window)
-AUD_VFUNC1 (show_prefs_for_plugin_type, int, type)
-
-/* util.c */
-
-/* Constructs a full URI given:
- *   1. path: one of the following:
- *     a. a full URI (returned unchanged)
- *     b. an absolute filename (in the system locale)
- *     c. a relative path (character set detected according to user settings)
- *   2. reference: the full URI of the playlist containing <path> */
-AUD_FUNC2 (char *, construct_uri, const char *, path, const char *, reference)
-
-/* visualization.c */
-AUD_VFUNC2 (vis_func_add, int, type, VisFunc, func)
-AUD_VFUNC1 (vis_func_remove, VisFunc, func)
diff --git a/src/audacious/misc.h b/src/audacious/misc.h
deleted file mode 100644
index 3d25517c1d05..000000000000
--- a/src/audacious/misc.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * misc.h
- * Copyright 2010-2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_MISC_H
-#define AUDACIOUS_MISC_H
-
-#include <audacious/api.h>
-#include <audacious/types.h>
-#include <libaudcore/index.h>
-#include <libaudcore/tuple.h>
-#include <libaudcore/vfs.h>
-
-enum {
- AUD_PATH_BIN_DIR,
- AUD_PATH_DATA_DIR,
- AUD_PATH_PLUGIN_DIR,
- AUD_PATH_LOCALE_DIR,
- AUD_PATH_DESKTOP_FILE,
- AUD_PATH_ICON_FILE,
- AUD_PATH_USER_DIR,
- AUD_PATH_PLAYLISTS_DIR,
- AUD_PATH_COUNT
-};
-
-enum {OUTPUT_RESET_EFFECTS_ONLY, OUTPUT_RESET_SOFT, OUTPUT_RESET_HARD};
-
-enum {
- AUD_MENU_MAIN,
- AUD_MENU_PLAYLIST,
- AUD_MENU_PLAYLIST_ADD,
- AUD_MENU_PLAYLIST_REMOVE,
- AUD_MENU_COUNT};
-
-typedef void (* MenuFunc) (void);
-
-enum {
- AUD_VIS_TYPE_CLEAR,        /* like VisPlugin::clear() */
- AUD_VIS_TYPE_MONO_PCM,     /* like VisPlugin::render_mono_pcm() */
- AUD_VIS_TYPE_MULTI_PCM,    /* like VisPlugin::render_multi_pcm() */
- AUD_VIS_TYPE_FREQ,         /* like VisPlugin::render_freq() */
- AUD_VIS_TYPES};
-
-/* generic type; does not correspond to actual function types */
-typedef void (* VisFunc) (void);
-
-#define AUD_API_NAME MiscAPI
-#define AUD_API_SYMBOL misc_api
-
-#ifdef _AUDACIOUS_CORE
-
-#include "api-local-begin.h"
-#include "misc-api.h"
-#include "api-local-end.h"
-
-#define create_widgets(b, w, a) create_widgets_with_domain (b, w, a, PACKAGE)
-
-#else
-
-#include <audacious/api-define-begin.h>
-#include <audacious/misc-api.h>
-#include <audacious/api-define-end.h>
-
-#include <audacious/api-alias-begin.h>
-#include <audacious/misc-api.h>
-#include <audacious/api-alias-end.h>
-
-#define aud_create_widgets(b, w, a) aud_create_widgets_with_domain (b, w, a, \
- PACKAGE)
-
-#endif
-
-#undef AUD_API_NAME
-#undef AUD_API_SYMBOL
-
-#endif
-
-#ifdef AUD_API_DECLARE
-
-#define AUD_API_NAME MiscAPI
-#define AUD_API_SYMBOL misc_api
-
-#include "api-define-begin.h"
-#include "misc-api.h"
-#include "api-define-end.h"
-
-#include "api-declare-begin.h"
-#include "misc-api.h"
-#include "api-declare-end.h"
-
-#undef AUD_API_NAME
-#undef AUD_API_SYMBOL
-
-#endif
diff --git a/src/audacious/output.c b/src/audacious/output.c
deleted file mode 100644
index b6f862aed36f..000000000000
--- a/src/audacious/output.c
+++ /dev/null
@@ -1,642 +0,0 @@
-/*
- * output.c
- * Copyright 2009-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <math.h>
-#include <pthread.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h> /* for g_usleep */
-
-#include "debug.h"
-#include "effect.h"
-#include "equalizer.h"
-#include "misc.h"
-#include "output.h"
-#include "plugin.h"
-#include "plugins.h"
-#include "vis_runner.h"
-
-#define SW_VOLUME_RANGE 40 /* decibels */
-
-static pthread_mutex_t mutex_major = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t mutex_minor = PTHREAD_MUTEX_INITIALIZER;
-
-#define LOCK_MAJOR pthread_mutex_lock (& mutex_major)
-#define UNLOCK_MAJOR pthread_mutex_unlock (& mutex_major)
-#define LOCK_MINOR pthread_mutex_lock (& mutex_minor)
-#define UNLOCK_MINOR pthread_mutex_unlock (& mutex_minor)
-#define LOCK_ALL do { LOCK_MAJOR; LOCK_MINOR; } while (0)
-#define UNLOCK_ALL do { UNLOCK_MINOR; UNLOCK_MAJOR; } while (0)
-
-/* State variables.  State changes that are allowed between LOCK_MINOR and
- * UNLOCK_MINOR (all others must take place between LOCK_ALL and UNLOCK_ALL):
- * s_paused -> TRUE or FALSE, s_aborted -> TRUE, s_resetting -> TRUE */
-
-static bool_t s_input; /* input plugin connected */
-static bool_t s_output; /* output plugin connected */
-static bool_t s_gain; /* replay gain info set */
-static bool_t s_paused; /* paused */
-static bool_t s_aborted; /* writes aborted */
-static bool_t s_resetting; /* resetting output system */
-
-static OutputPlugin * cop;
-static int seek_time;
-static int in_format, in_channels, in_rate;
-static int out_format, out_channels, out_rate;
-static int64_t in_frames, out_frames;
-static ReplayGainInfo gain_info;
-
-static bool_t change_op;
-static OutputPlugin * new_op;
-
-static void * buffer1, * buffer2;
-static int buffer1_size, buffer2_size;
-
-static inline int FR2MS (int64_t f, int r)
- { return (f > 0) ? (f * 1000 + r / 2) / r : (f * 1000 - r / 2) / r; }
-static inline int MS2FR (int64_t ms, int r)
- { return (ms > 0) ? (ms * r + 500) / 1000 : (ms * r - 500) / 1000; }
-
-static inline int get_format (void)
-{
-    switch (get_int (NULL, "output_bit_depth"))
-    {
-        case 16: return FMT_S16_NE;
-        case 24: return FMT_S24_NE;
-        case 32: return FMT_S32_NE;
-        default: return FMT_FLOAT;
-    }
-}
-
-static void ensure_buffer (void * * buffer, int * size, int newsize)
-{
-    if (newsize > * size)
-    {
-        g_free (* buffer);
-        * buffer = g_malloc (newsize);
-        * size = newsize;
-    }
-}
-
-/* assumes LOCK_ALL, s_output */
-static void cleanup_output (void)
-{
-    if (! (s_paused || s_aborted) && PLUGIN_HAS_FUNC (cop, drain))
-    {
-        UNLOCK_MINOR;
-        cop->drain ();
-        LOCK_MINOR;
-    }
-
-    s_output = FALSE;
-
-    g_free (buffer1);
-    g_free (buffer2);
-    buffer1 = NULL;
-    buffer2 = NULL;
-    buffer1_size = 0;
-    buffer2_size = 0;
-
-    if (PLUGIN_HAS_FUNC (cop, close_audio))
-        cop->close_audio ();
-
-    effect_flush ();
-    vis_runner_start_stop (FALSE, FALSE);
-}
-
-/* assumes LOCK_ALL, s_output */
-static void apply_pause (void)
-{
-    if (PLUGIN_HAS_FUNC (cop, pause))
-        cop->pause (s_paused);
-
-    vis_runner_start_stop (TRUE, s_paused);
-}
-
-/* assumes LOCK_ALL, s_input */
-static void setup_output (void)
-{
-    int format = get_format ();
-    int channels = in_channels;
-    int rate = in_rate;
-
-    effect_start (& channels, & rate);
-    eq_set_format (channels, rate);
-
-    if (s_output && format == out_format && channels == out_channels && rate ==
-     out_rate && ! PLUGIN_HAS_FUNC (cop, force_reopen))
-        return;
-
-    if (s_output)
-        cleanup_output ();
-
-    if (! cop || ! PLUGIN_HAS_FUNC (cop, open_audio) || ! cop->open_audio (format, rate, channels))
-        return;
-
-    s_output = TRUE;
-
-    out_format = format;
-    out_channels = channels;
-    out_rate = rate;
-    out_frames = 0;
-
-    apply_pause ();
-}
-
-/* assumes LOCK_MINOR, s_output */
-static void flush_output (void)
-{
-    if (PLUGIN_HAS_FUNC (cop, flush))
-    {
-        cop->flush (0);
-        out_frames = 0;
-    }
-
-    effect_flush ();
-    vis_runner_flush ();
-}
-
-static void apply_replay_gain (float * data, int samples)
-{
-    if (! get_bool (NULL, "enable_replay_gain"))
-        return;
-
-    float factor = powf (10, get_double (NULL, "replay_gain_preamp") / 20);
-
-    if (s_gain)
-    {
-        float peak;
-
-        if (get_bool (NULL, "replay_gain_album"))
-        {
-            factor *= powf (10, gain_info.album_gain / 20);
-            peak = gain_info.album_peak;
-        }
-        else
-        {
-            factor *= powf (10, gain_info.track_gain / 20);
-            peak = gain_info.track_peak;
-        }
-
-        if (get_bool (NULL, "enable_clipping_prevention") && peak * factor > 1)
-            factor = 1 / peak;
-    }
-    else
-        factor *= powf (10, get_double (NULL, "default_gain") / 20);
-
-    if (factor < 0.99 || factor > 1.01)
-        audio_amplify (data, 1, samples, & factor);
-}
-
-static void apply_software_volume (float * data, int channels, int samples)
-{
-    if (! get_bool (NULL, "software_volume_control"))
-        return;
-
-    int l = get_int (NULL, "sw_volume_left");
-    int r = get_int (NULL, "sw_volume_right");
-
-    if (l == 100 && r == 100)
-        return;
-
-    float lfactor = (l == 0) ? 0 : powf (10, (float) SW_VOLUME_RANGE * (l - 100) / 100 / 20);
-    float rfactor = (r == 0) ? 0 : powf (10, (float) SW_VOLUME_RANGE * (r - 100) / 100 / 20);
-    float factors[channels];
-
-    if (channels == 2)
-    {
-        factors[0] = lfactor;
-        factors[1] = rfactor;
-    }
-    else
-    {
-        for (int c = 0; c < channels; c ++)
-            factors[c] = MAX (lfactor, rfactor);
-    }
-
-    audio_amplify (data, channels, samples / channels, factors);
-}
-
-/* assumes LOCK_ALL, s_output */
-static void write_output_raw (void * data, int samples)
-{
-    vis_runner_pass_audio (FR2MS (out_frames, out_rate), data, samples,
-     out_channels, out_rate);
-    out_frames += samples / out_channels;
-
-    eq_filter (data, samples);
-    apply_software_volume (data, out_channels, samples);
-
-    if (get_bool (NULL, "soft_clipping"))
-        audio_soft_clip (data, samples);
-
-    if (out_format != FMT_FLOAT)
-    {
-        ensure_buffer (& buffer2, & buffer2_size, FMT_SIZEOF (out_format) * samples);
-        audio_to_int (data, buffer2, out_format, samples);
-        data = buffer2;
-    }
-
-    while (! (s_aborted || s_resetting))
-    {
-        bool_t blocking = ! PLUGIN_HAS_FUNC (cop, buffer_free);
-        int ready;
-
-        if (blocking)
-            ready = out_channels * (out_rate / 50);
-        else
-            ready = cop->buffer_free () / FMT_SIZEOF (out_format);
-
-        ready = MIN (ready, samples);
-
-        if (PLUGIN_HAS_FUNC (cop, write_audio))
-        {
-            cop->write_audio (data, FMT_SIZEOF (out_format) * ready);
-            data = (char *) data + FMT_SIZEOF (out_format) * ready;
-            samples -= ready;
-        }
-
-        if (samples == 0)
-            break;
-
-        UNLOCK_MINOR;
-
-        if (! blocking)
-        {
-            if (PLUGIN_HAS_FUNC (cop, period_wait))
-                cop->period_wait ();
-            else
-                g_usleep (20000);
-        }
-
-        LOCK_MINOR;
-    }
-}
-
-/* assumes LOCK_ALL, s_input, s_output */
-static bool_t write_output (void * data, int size, int stop_time)
-{
-    bool_t stopped = FALSE;
-
-    int64_t cur_frame = in_frames;
-    int samples = size / FMT_SIZEOF (in_format);
-
-    /* always update in_frames, whether we use all the decoded frames or not */
-    in_frames += samples / in_channels;
-
-    if (stop_time != -1)
-    {
-        int64_t frames_left = MS2FR (stop_time - seek_time, in_rate) - cur_frame;
-        int64_t samples_left = in_channels * MAX (0, frames_left);
-
-        if (samples >= samples_left)
-        {
-            samples = samples_left;
-            stopped = TRUE;
-        }
-    }
-
-    if (s_aborted)
-        return ! stopped;
-
-    if (in_format != FMT_FLOAT)
-    {
-        ensure_buffer (& buffer1, & buffer1_size, sizeof (float) * samples);
-        audio_from_int (data, in_format, buffer1, samples);
-        data = buffer1;
-    }
-
-    float * fdata = data;
-    apply_replay_gain (fdata, samples);
-    effect_process (& fdata, & samples);
-    write_output_raw (fdata, samples);
-
-    return ! stopped;
-}
-
-/* assumes LOCK_ALL, s_output */
-static void finish_effects (void)
-{
-    float * data = NULL;
-    int samples = 0;
-
-    effect_finish (& data, & samples);
-    write_output_raw (data, samples);
-}
-
-bool_t output_open_audio (int format, int rate, int channels)
-{
-    /* prevent division by zero */
-    if (rate < 1 || channels < 1)
-        return FALSE;
-
-    LOCK_ALL;
-
-    if (s_output && s_paused)
-    {
-        flush_output ();
-        s_paused = FALSE;
-        apply_pause ();
-    }
-
-    s_input = TRUE;
-    s_gain = s_paused = s_aborted = FALSE;
-    seek_time = 0;
-
-    in_format = format;
-    in_channels = channels;
-    in_rate = rate;
-    in_frames = 0;
-
-    setup_output ();
-
-    UNLOCK_ALL;
-    return TRUE;
-}
-
-void output_set_replaygain_info (const ReplayGainInfo * info)
-{
-    LOCK_ALL;
-
-    if (s_input)
-    {
-        memcpy (& gain_info, info, sizeof (ReplayGainInfo));
-        s_gain = TRUE;
-
-        AUDDBG ("Replay Gain info:\n");
-        AUDDBG (" album gain: %f dB\n", info->album_gain);
-        AUDDBG (" album peak: %f\n", info->album_peak);
-        AUDDBG (" track gain: %f dB\n", info->track_gain);
-        AUDDBG (" track peak: %f\n", info->track_peak);
-    }
-
-    UNLOCK_ALL;
-}
-
-/* returns FALSE if stop_time is reached */
-bool_t output_write_audio (void * data, int size, int stop_time)
-{
-    LOCK_ALL;
-    bool_t good = FALSE;
-
-    if (s_input)
-    {
-        while ((! s_output || s_resetting) && ! s_aborted)
-        {
-            UNLOCK_ALL;
-            g_usleep (20000);
-            LOCK_ALL;
-        }
-
-        good = write_output (data, size, stop_time);
-    }
-
-    UNLOCK_ALL;
-    return good;
-}
-
-void output_abort_write (void)
-{
-    LOCK_MINOR;
-
-    if (s_input)
-    {
-        s_aborted = TRUE;
-
-        if (s_output)
-            flush_output ();
-    }
-
-    UNLOCK_MINOR;
-}
-
-void output_pause (bool_t pause)
-{
-    LOCK_MINOR;
-
-    if (s_input)
-    {
-        s_paused = pause;
-
-        if (s_output)
-            apply_pause ();
-    }
-
-    UNLOCK_MINOR;
-}
-
-int output_written_time (void)
-{
-    LOCK_MINOR;
-    int time = 0;
-
-    if (s_input)
-        time = seek_time + FR2MS (in_frames, in_rate);
-
-    UNLOCK_MINOR;
-    return time;
-}
-
-void output_set_time (int time)
-{
-    LOCK_ALL;
-
-    if (s_input)
-    {
-        s_aborted = FALSE;
-        seek_time = time;
-        in_frames = 0;
-    }
-
-    UNLOCK_ALL;
-}
-
-bool_t output_is_open (void)
-{
-    LOCK_MINOR;
-    bool_t is_open = s_input;
-    UNLOCK_MINOR;
-    return is_open;
-}
-
-int output_get_time (void)
-{
-    LOCK_MINOR;
-    int time = 0, delay = 0;
-
-    if (s_input)
-    {
-        if (s_output && PLUGIN_HAS_FUNC (cop, output_time))
-            delay = FR2MS (out_frames, out_rate) - cop->output_time ();
-
-        delay = effect_adjust_delay (delay);
-        time = FR2MS (in_frames, in_rate);
-        time = seek_time + MAX (time - delay, 0);
-    }
-
-    UNLOCK_MINOR;
-    return time;
-}
-
-int output_get_raw_time (void)
-{
-    LOCK_MINOR;
-    int time = 0;
-
-    if (s_output && PLUGIN_HAS_FUNC (cop, output_time))
-        time = cop->output_time ();
-
-    UNLOCK_MINOR;
-    return time;
-}
-
-void output_close_audio (void)
-{
-    LOCK_ALL;
-
-    if (s_input)
-    {
-        s_input = FALSE;
-
-        if (s_output && ! (s_paused || s_aborted || s_resetting))
-            finish_effects (); /* first time for end of song */
-    }
-
-    UNLOCK_ALL;
-}
-
-void output_drain (void)
-{
-    LOCK_ALL;
-
-    if (! s_input && s_output)
-    {
-        finish_effects (); /* second time for end of playlist */
-        cleanup_output ();
-    }
-
-    UNLOCK_ALL;
-}
-
-void output_reset (int type)
-{
-    LOCK_MINOR;
-
-    s_resetting = TRUE;
-
-    if (s_output)
-        flush_output ();
-
-    UNLOCK_MINOR;
-    LOCK_ALL;
-
-    if (s_output && type != OUTPUT_RESET_EFFECTS_ONLY)
-        cleanup_output ();
-
-    if (type == OUTPUT_RESET_HARD)
-    {
-        if (cop && PLUGIN_HAS_FUNC (cop, cleanup))
-            cop->cleanup ();
-
-        if (change_op)
-            cop = new_op;
-
-        if (cop && PLUGIN_HAS_FUNC (cop, init) && ! cop->init ())
-            cop = NULL;
-    }
-
-    if (s_input)
-        setup_output ();
-
-    s_resetting = FALSE;
-
-    UNLOCK_ALL;
-}
-
-void output_get_volume (int * left, int * right)
-{
-    LOCK_MINOR;
-
-    * left = * right = 0;
-
-    if (get_bool (NULL, "software_volume_control"))
-    {
-        * left = get_int (NULL, "sw_volume_left");
-        * right = get_int (NULL, "sw_volume_right");
-    }
-    else if (cop && PLUGIN_HAS_FUNC (cop, get_volume))
-        cop->get_volume (left, right);
-
-    UNLOCK_MINOR;
-}
-
-void output_set_volume (int left, int right)
-{
-    LOCK_MINOR;
-
-    if (get_bool (NULL, "software_volume_control"))
-    {
-        set_int (NULL, "sw_volume_left", left);
-        set_int (NULL, "sw_volume_right", right);
-    }
-    else if (cop && PLUGIN_HAS_FUNC (cop, set_volume))
-        cop->set_volume (left, right);
-
-    UNLOCK_MINOR;
-}
-
-static bool_t probe_cb (PluginHandle * p, PluginHandle * * pp)
-{
-    OutputPlugin * op = plugin_get_header (p);
-
-    if (! op || (PLUGIN_HAS_FUNC (op, init) && ! op->init ()))
-        return TRUE; /* keep searching */
-
-    if (PLUGIN_HAS_FUNC (op, cleanup))
-        op->cleanup ();
-
-    * pp = p;
-    return FALSE; /* stop searching */
-}
-
-PluginHandle * output_plugin_probe (void)
-{
-    PluginHandle * p = NULL;
-    plugin_for_each (PLUGIN_TYPE_OUTPUT, (PluginForEachFunc) probe_cb, & p);
-    return p;
-}
-
-PluginHandle * output_plugin_get_current (void)
-{
-    return cop ? plugin_by_header (cop) : NULL;
-}
-
-bool_t output_plugin_set_current (PluginHandle * plugin)
-{
-    change_op = TRUE;
-    new_op = plugin ? plugin_get_header (plugin) : NULL;
-    output_reset (OUTPUT_RESET_HARD);
-
-    bool_t success = (cop == new_op);
-    change_op = FALSE;
-    new_op = NULL;
-
-    return success;
-}
diff --git a/src/audacious/output.h b/src/audacious/output.h
deleted file mode 100644
index ac9ee4820336..000000000000
--- a/src/audacious/output.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * output.h
- * Copyright 2010-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_OUTPUT_H
-#define AUDACIOUS_OUTPUT_H
-
-#include <libaudcore/core.h>
-#include "types.h"
-
-bool_t output_open_audio (int format, int rate, int channels);
-void output_set_replaygain_info (const ReplayGainInfo * info);
-bool_t output_write_audio (void * data, int size, int stop_time);
-void output_abort_write (void);
-void output_pause (bool_t pause);
-int output_written_time (void);
-void output_set_time (int time);
-
-bool_t output_is_open (void);
-int output_get_time (void);
-int output_get_raw_time (void);
-void output_close_audio (void);
-void output_drain (void);
-
-void output_get_volume (int * left, int * right);
-void output_set_volume (int left, int right);
-
-PluginHandle * output_plugin_probe (void);
-PluginHandle * output_plugin_get_current (void);
-bool_t output_plugin_set_current (PluginHandle * plugin);
-
-#endif /* AUDACIOUS_OUTPUT_H */
diff --git a/src/audacious/playback.c b/src/audacious/playback.c
deleted file mode 100644
index 7d9c56fd4655..000000000000
--- a/src/audacious/playback.c
+++ /dev/null
@@ -1,652 +0,0 @@
-/*
- * playback.c
- * Copyright 2009-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <pthread.h>
-#include <string.h>
-
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-#include <libaudgui/libaudgui.h>
-
-#include "drct.h"
-#include "i18n.h"
-#include "input.h"
-#include "interface.h"
-#include "misc.h"
-#include "output.h"
-#include "playback.h"
-#include "playlist.h"
-#include "plugin.h"
-
-static pthread_t playback_thread_handle;
-static int end_source = 0;
-
-static pthread_mutex_t ready_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t ready_cond = PTHREAD_COND_INITIALIZER;
-
-static pthread_mutex_t control_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-/* level 1 data (persists to end of song) */
-static bool_t playing = FALSE;
-static int time_offset = 0;
-static int stop_time = -1;
-static bool_t paused = FALSE;
-static bool_t ready_flag = FALSE;
-static bool_t playback_error = FALSE;
-static bool_t song_finished = FALSE;
-
-static int seek_request = -1; /* under control_mutex */
-static int repeat_a = -1; /* under control_mutex */
-
-static volatile int repeat_b = -1; /* atomic */
-static volatile int stop_flag = FALSE; /* atomic */
-
-static int current_bitrate = -1, current_samplerate = -1, current_channels = -1;
-
-static int current_entry = -1;
-static char * current_filename = NULL; /* pooled */
-static char * current_title = NULL; /* pooled */
-static int current_length = -1;
-
-static InputPlugin * current_decoder = NULL;
-static VFSFile * current_file = NULL;
-static ReplayGainInfo current_gain;
-
-/* level 2 data (persists to end of playlist) */
-static bool_t stopped = TRUE;
-static int failed_entries = 0;
-
-/* clears gain info if tuple == NULL */
-static void read_gain_from_tuple (const Tuple * tuple)
-{
-    memset (& current_gain, 0, sizeof current_gain);
-
-    if (tuple == NULL)
-        return;
-
-    int album_gain = tuple_get_int (tuple, FIELD_GAIN_ALBUM_GAIN);
-    int album_peak = tuple_get_int (tuple, FIELD_GAIN_ALBUM_PEAK);
-    int track_gain = tuple_get_int (tuple, FIELD_GAIN_TRACK_GAIN);
-    int track_peak = tuple_get_int (tuple, FIELD_GAIN_TRACK_PEAK);
-    int gain_unit = tuple_get_int (tuple, FIELD_GAIN_GAIN_UNIT);
-    int peak_unit = tuple_get_int (tuple, FIELD_GAIN_PEAK_UNIT);
-
-    if (gain_unit)
-    {
-        current_gain.album_gain = album_gain / (float) gain_unit;
-        current_gain.track_gain = track_gain / (float) gain_unit;
-    }
-
-    if (peak_unit)
-    {
-        current_gain.album_peak = album_peak / (float) peak_unit;
-        current_gain.track_peak = track_peak / (float) peak_unit;
-    }
-}
-
-static bool_t update_from_playlist (void)
-{
-    int entry = playback_entry_get_position ();
-    char * title = playback_entry_get_title ();
-    int length = playback_entry_get_length ();
-
-    if (entry == current_entry && str_equal (title, current_title) && length == current_length)
-    {
-        str_unref (title);
-        return FALSE;
-    }
-
-    current_entry = entry;
-    str_unref (current_title);
-    current_title = title;
-    current_length = length;
-    return TRUE;
-}
-
-bool_t drct_get_ready (void)
-{
-    if (! playing)
-        return FALSE;
-
-    pthread_mutex_lock (& ready_mutex);
-    bool_t ready = ready_flag;
-    pthread_mutex_unlock (& ready_mutex);
-    return ready;
-}
-
-static void set_ready (void)
-{
-    g_return_if_fail (playing);
-
-    pthread_mutex_lock (& ready_mutex);
-
-    update_from_playlist ();
-    event_queue ("playback ready", NULL);
-    ready_flag = TRUE;
-
-    pthread_cond_signal (& ready_cond);
-    pthread_mutex_unlock (& ready_mutex);
-}
-
-static void wait_until_ready (void)
-{
-    g_return_if_fail (playing);
-    pthread_mutex_lock (& ready_mutex);
-
-    /* on restart, we still have to wait, but presumably not long */
-    while (! ready_flag)
-        pthread_cond_wait (& ready_cond, & ready_mutex);
-
-    pthread_mutex_unlock (& ready_mutex);
-}
-
-static void update_cb (void * hook_data, void * user_data)
-{
-    g_return_if_fail (playing);
-
-    if (GPOINTER_TO_INT (hook_data) < PLAYLIST_UPDATE_METADATA || ! drct_get_ready ())
-        return;
-
-    if (update_from_playlist ())
-        event_queue ("title change", NULL);
-}
-
-int drct_get_time (void)
-{
-    if (! playing)
-        return 0;
-
-    wait_until_ready ();
-
-    return output_get_time () - time_offset;
-}
-
-void drct_pause (void)
-{
-    if (! playing)
-        return;
-
-    wait_until_ready ();
-
-    paused = ! paused;
-
-    output_pause (paused);
-
-    if (paused)
-        hook_call ("playback pause", NULL);
-    else
-        hook_call ("playback unpause", NULL);
-}
-
-static void playback_cleanup (void)
-{
-    g_return_if_fail (playing);
-    wait_until_ready ();
-
-    if (! song_finished)
-    {
-        g_atomic_int_set (& stop_flag, TRUE);
-        output_abort_write ();
-    }
-
-    pthread_join (playback_thread_handle, NULL);
-    output_close_audio ();
-
-    hook_dissociate ("playlist update", update_cb);
-
-    event_queue_cancel ("playback ready", NULL);
-    event_queue_cancel ("playback seek", NULL);
-    event_queue_cancel ("info change", NULL);
-    event_queue_cancel ("title change", NULL);
-
-    if (end_source)
-    {
-        g_source_remove (end_source);
-        end_source = 0;
-    }
-
-    /* level 1 data cleanup */
-    playing = FALSE;
-    time_offset = 0;
-    stop_time = -1;
-    paused = FALSE;
-    ready_flag = FALSE;
-    playback_error = FALSE;
-    song_finished = FALSE;
-
-    seek_request = -1;
-    repeat_a = -1;
-
-    g_atomic_int_set (& repeat_b, -1);
-    g_atomic_int_set (& stop_flag, FALSE);
-
-    current_bitrate = current_samplerate = current_channels = -1;
-
-    current_entry = -1;
-    str_unref (current_filename);
-    current_filename = NULL;
-    str_unref (current_title);
-    current_title = NULL;
-    current_length = -1;
-
-    current_decoder = NULL;
-
-    if (current_file)
-    {
-        vfs_fclose (current_file);
-        current_file = NULL;
-    }
-
-    read_gain_from_tuple (NULL);
-
-    set_bool (NULL, "stop_after_current_song", FALSE);
-}
-
-void playback_stop (void)
-{
-    if (stopped)
-        return;
-
-    if (playing)
-        playback_cleanup ();
-
-    output_drain ();
-
-    /* level 2 data cleanup */
-    stopped = TRUE;
-    failed_entries = 0;
-
-    hook_call ("playback stop", NULL);
-}
-
-static void do_stop (int playlist)
-{
-    playlist_set_playing (-1);
-    playlist_set_position (playlist, playlist_get_position (playlist));
-}
-
-static void do_next (int playlist)
-{
-    if (! playlist_next_song (playlist, get_bool (NULL, "repeat")))
-    {
-        playlist_set_position (playlist, -1);
-        hook_call ("playlist end reached", NULL);
-    }
-}
-
-static bool_t end_cb (void * unused)
-{
-    g_return_val_if_fail (playing, FALSE);
-
-    if (! playback_error)
-        song_finished = TRUE;
-
-    hook_call ("playback end", NULL);
-
-    if (playback_error)
-        failed_entries ++;
-    else
-        failed_entries = 0;
-
-    int playlist = playlist_get_playing ();
-
-    if (get_bool (NULL, "stop_after_current_song"))
-    {
-        do_stop (playlist);
-
-        if (! get_bool (NULL, "no_playlist_advance"))
-            do_next (playlist);
-    }
-    else if (get_bool (NULL, "no_playlist_advance"))
-    {
-        if (get_bool (NULL, "repeat") && ! failed_entries)
-            playback_play (0, FALSE);
-        else
-            do_stop (playlist);
-    }
-    else
-    {
-        if (failed_entries < 10)
-            do_next (playlist);
-        else
-            do_stop (playlist);
-    }
-
-    return FALSE;
-}
-
-static bool_t open_file (void)
-{
-    /* no need to open a handle for custom URI schemes */
-    if (current_decoder->schemes && current_decoder->schemes[0])
-        return TRUE;
-
-    current_file = vfs_fopen (current_filename, "r");
-    return (current_file != NULL);
-}
-
-static void * playback_thread (void * unused)
-{
-    if (! current_decoder)
-    {
-        PluginHandle * p = playback_entry_get_decoder ();
-        current_decoder = p ? plugin_get_header (p) : NULL;
-
-        if (! current_decoder)
-        {
-            SPRINTF (error, _("No decoder found for %s."), current_filename);
-            interface_show_error (error);
-            playback_error = TRUE;
-            goto DONE;
-        }
-    }
-
-    Tuple * tuple = playback_entry_get_tuple ();
-    int length = playback_entry_get_length ();
-
-    if (length < 1)
-        seek_request = -1;
-
-    if (tuple && length > 0)
-    {
-        if (tuple_get_value_type (tuple, FIELD_SEGMENT_START) == TUPLE_INT)
-        {
-            time_offset = tuple_get_int (tuple, FIELD_SEGMENT_START);
-            if (time_offset)
-                seek_request = time_offset + MAX (seek_request, 0);
-        }
-
-        if (tuple_get_value_type (tuple, FIELD_SEGMENT_END) == TUPLE_INT)
-            stop_time = tuple_get_int (tuple, FIELD_SEGMENT_END);
-    }
-
-    read_gain_from_tuple (tuple);
-
-    if (tuple)
-        tuple_unref (tuple);
-
-    if (! open_file ())
-    {
-        SPRINTF (error, _("%s could not be opened."), current_filename);
-        interface_show_error (error);
-        playback_error = TRUE;
-        goto DONE;
-    }
-
-    playback_error = ! current_decoder->play (current_filename, current_file);
-
-DONE:
-    if (! ready_flag)
-        set_ready ();
-
-    end_source = g_timeout_add (0, end_cb, NULL);
-    return NULL;
-}
-
-void playback_play (int seek_time, bool_t pause)
-{
-    char * new_filename = playback_entry_get_filename ();
-    g_return_if_fail (new_filename);
-
-    if (playing)
-        playback_cleanup ();
-
-    current_filename = new_filename;
-
-    playing = TRUE;
-    paused = pause;
-
-    seek_request = (seek_time > 0) ? seek_time : -1;
-
-    stopped = FALSE;
-
-    hook_associate ("playlist update", update_cb, NULL);
-    pthread_create (& playback_thread_handle, NULL, playback_thread, NULL);
-
-    hook_call ("playback begin", NULL);
-}
-
-bool_t drct_get_playing (void)
-{
-    return playing;
-}
-
-bool_t drct_get_paused (void)
-{
-    return paused;
-}
-
-void drct_seek (int time)
-{
-    if (! playing)
-        return;
-
-    wait_until_ready ();
-
-    if (current_length < 1)
-        return;
-
-    pthread_mutex_lock (& control_mutex);
-
-    seek_request = time_offset + CLAMP (time, 0, current_length);
-    output_abort_write ();
-
-    pthread_mutex_unlock (& control_mutex);
-}
-
-bool_t input_open_audio (int format, int rate, int channels)
-{
-    g_return_val_if_fail (playing, FALSE);
-
-    if (! output_open_audio (format, rate, channels))
-        return FALSE;
-
-    output_set_replaygain_info (& current_gain);
-
-    if (paused)
-        output_pause (TRUE);
-
-    current_samplerate = rate;
-    current_channels = channels;
-
-    if (ready_flag)
-        event_queue ("info change", NULL);
-
-    return TRUE;
-}
-
-void input_set_gain (const ReplayGainInfo * info)
-{
-    g_return_if_fail (playing);
-    memcpy (& current_gain, info, sizeof current_gain);
-    output_set_replaygain_info (& current_gain);
-}
-
-void input_write_audio (void * data, int length)
-{
-    g_return_if_fail (playing);
-
-    if (! ready_flag)
-        set_ready ();
-
-    int b = g_atomic_int_get (& repeat_b);
-
-    if (b >= 0)
-    {
-        if (! output_write_audio (data, length, b))
-        {
-            pthread_mutex_lock (& control_mutex);
-            seek_request = MAX (repeat_a, time_offset);
-            pthread_mutex_unlock (& control_mutex);
-        }
-    }
-    else
-    {
-        if (! output_write_audio (data, length, stop_time))
-            g_atomic_int_set (& stop_flag, TRUE);
-    }
-}
-
-int input_written_time (void)
-{
-    g_return_val_if_fail (playing, -1);
-    return output_written_time ();
-}
-
-Tuple * input_get_tuple (void)
-{
-    g_return_val_if_fail (playing, NULL);
-    return playback_entry_get_tuple ();
-}
-
-void input_set_tuple (Tuple * tuple)
-{
-    g_return_if_fail (playing);
-    playback_entry_set_tuple (tuple);
-}
-
-void input_set_bitrate (int bitrate)
-{
-    g_return_if_fail (playing);
-    current_bitrate = bitrate;
-
-    if (ready_flag)
-        event_queue ("info change", NULL);
-}
-
-bool_t input_check_stop (void)
-{
-    g_return_val_if_fail (playing, TRUE);
-    return g_atomic_int_get (& stop_flag);
-}
-
-int input_check_seek (void)
-{
-    g_return_val_if_fail (playing, -1);
-
-    pthread_mutex_lock (& control_mutex);
-    int seek = seek_request;
-
-    if (seek != -1)
-    {
-        output_set_time (seek);
-        seek_request = -1;
-
-        event_queue ("playback seek", NULL);
-    }
-
-    pthread_mutex_unlock (& control_mutex);
-    return seek;
-}
-
-char * drct_get_filename (void)
-{
-    if (! playing)
-        return NULL;
-
-    return str_ref (current_filename);
-}
-
-char * drct_get_title (void)
-{
-    if (! playing)
-        return NULL;
-
-    wait_until_ready ();
-
-    char s[32];
-
-    if (current_length > 0)
-    {
-        char t[16];
-        audgui_format_time (t, sizeof t, current_length);
-        snprintf (s, sizeof s, " (%s)", t);
-    }
-    else
-        s[0] = 0;
-
-    if (get_bool (NULL, "show_numbers_in_pl"))
-        return str_printf ("%d. %s%s", 1 + current_entry, current_title, s);
-
-    return str_printf ("%s%s", current_title, s);
-}
-
-int drct_get_length (void)
-{
-    if (playing)
-        wait_until_ready ();
-
-    return current_length;
-}
-
-void drct_get_info (int * bitrate, int * samplerate, int * channels)
-{
-    if (playing)
-        wait_until_ready ();
-
-    * bitrate = current_bitrate;
-    * samplerate = current_samplerate;
-    * channels = current_channels;
-}
-
-void drct_get_volume (int * l, int * r)
-{
-    output_get_volume (l, r);
-}
-
-void drct_set_volume (int l, int r)
-{
-    output_set_volume (CLAMP (l, 0, 100), CLAMP (r, 0, 100));
-}
-
-void drct_set_ab_repeat (int a, int b)
-{
-    if (! playing)
-        return;
-
-    wait_until_ready ();
-
-    if (current_length < 1)
-        return;
-
-    if (a >= 0)
-        a += time_offset;
-    if (b >= 0)
-        b += time_offset;
-
-    pthread_mutex_lock (& control_mutex);
-
-    repeat_a = a;
-    g_atomic_int_set (& repeat_b, b);
-
-    if (b != -1 && output_get_time () >= b)
-    {
-        seek_request = MAX (a, time_offset);
-        output_abort_write ();
-    }
-
-    pthread_mutex_unlock (& control_mutex);
-}
-
-void drct_get_ab_repeat (int * a, int * b)
-{
-    * a = (playing && repeat_a != -1) ? repeat_a - time_offset : -1;
-    * b = (playing && repeat_b != -1) ? repeat_b - time_offset : -1;
-}
diff --git a/src/audacious/playback.h b/src/audacious/playback.h
deleted file mode 100644
index 2937791a715b..000000000000
--- a/src/audacious/playback.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * playback.h
- * Copyright 2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_PLAYBACK_H
-#define AUDACIOUS_PLAYBACK_H
-
-#include <libaudcore/core.h>
-
-/* for use from playback.c and playlist-new.c ONLY */
-/* anywhere else, use drct_* and/or playlist_* functions */
-void playback_play (int seek_time, bool_t pause);
-void playback_stop (void);
-
-#endif /* AUDACIOUS_PLAYBACK_H */
diff --git a/src/audacious/playlist-api.h b/src/audacious/playlist-api.h
deleted file mode 100644
index 634fd05a7983..000000000000
--- a/src/audacious/playlist-api.h
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- * playlist-api.h
- * Copyright 2010-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-/* Do not include this file directly; use playlist.h instead. */
-
-/* Any functions in this API with a return type of (char *) return pooled
- * strings that must not be modified and must be released with str_unref() when
- * no longer needed. */
-
-/* --- PLAYLIST CORE API --- */
-
-/* Returns the number of playlists currently open.  There will always be at
- * least one playlist open.  The playlists are numbered starting from zero. */
-AUD_FUNC0 (int, playlist_count)
-
-/* Adds a new playlist before the one numbered <at>.  If <at> is -1 or equal to
- * the number of playlists, adds a new playlist after the last one. */
-AUD_VFUNC1 (playlist_insert, int, at)
-
-/* Moves a contiguous block of <count> playlists starting with the one numbered
- * <from> such that that playlist ends up at the position <to>. */
-AUD_VFUNC3 (playlist_reorder, int, from, int, to, int, count)
-
-/* Closes a playlist.  CAUTION: The playlist is not saved, and no confirmation
- * is presented to the user.  If <playlist> is the only playlist, a new playlist
- * is added.  If <playlist> is the active playlist, another playlist is marked
- * active.  If <playlist> is the currently playing playlist, playback is
- * stopped. */
-AUD_VFUNC1 (playlist_delete, int, playlist)
-
-/* Returns a unique non-negative integer which can be used to identify a given
- * playlist even if its numbering changes (as when playlists are reordered).
- * On error, returns -1. */
-AUD_FUNC1 (int, playlist_get_unique_id, int, playlist)
-
-/* Returns the number of the playlist identified by a given integer ID as
- * returned by playlist_get_unique_id().  If the playlist no longer exists,
- * returns -1. */
-AUD_FUNC1 (int, playlist_by_unique_id, int, id)
-
-/* Sets the filename associated with a playlist.  (Audacious currently makes no
- * use of the filename.) */
-AUD_VFUNC2 (playlist_set_filename, int, playlist, const char *, filename)
-
-/* Returns the filename associated with a playlist. */
-AUD_FUNC1 (char *, playlist_get_filename, int, playlist)
-
-/* Sets the title associated with a playlist. */
-AUD_VFUNC2 (playlist_set_title, int, playlist, const char *, title)
-
-/* Returns the title associated with a playlist. */
-AUD_FUNC1 (char *, playlist_get_title, int, playlist)
-
-/* Sets the active playlist.  This is the playlist that user interfaces will
- * show to the user. */
-AUD_VFUNC1 (playlist_set_active, int, playlist)
-
-/* Returns the number of the active playlist. */
-AUD_FUNC0 (int, playlist_get_active)
-
-/* Sets the currently playing playlist.  Starts playback, resuming from the
- * position last played if possible.  If <playlist> is -1 or if the requested
- * playlist is empty, stops playback. */
-AUD_VFUNC1 (playlist_set_playing, int, playlist)
-
-/* Returns the number of the currently playing playlist.  If no playlist is
- * playing, returns -1. */
-AUD_FUNC0 (int, playlist_get_playing)
-
-/* Returns the number of a "blank" playlist.  The active playlist is returned if
- * it has the default title and has no entries; otherwise, a new playlist is
- * added and returned. */
-AUD_FUNC0 (int, playlist_get_blank)
-
-/* Returns the number of the "temporary" playlist (which is no different from
- * any other playlist except in name).  If the playlist does not exist, a
- * "blank" playlist is obtained from playlist_get_blank() and is renamed to
- * become the temporary playlist. */
-AUD_FUNC0 (int, playlist_get_temporary)
-
-/* Returns the number of entries in a playlist.  The entries are numbered
- * starting from zero. */
-AUD_FUNC1 (int, playlist_entry_count, int, playlist)
-
-/* Adds a song file, playlist file, or folder to a playlist before the entry
- * numbered <at>.  If <at> is negative or equal to the number of entries, the
- * item is added after the last entry.  <tuple> may be NULL, in which case
- * Audacious will attempt to read metadata from the song file.  The caller gives
- * up one reference count to <tuple>.  If <play> is nonzero, Audacious will
- * begin playback of the items once they have been added.
- *
- * Because adding items to the playlist can be a slow process, this function may
- * return before the process is complete.  Hence, the caller must not assume
- * that there will be new entries in the playlist immediately. */
-AUD_VFUNC5 (playlist_entry_insert, int, playlist, int, at, const char *,
- filename, Tuple *, tuple, bool_t, play)
-
-/* Similar to playlist_entry_insert, adds multiple song files, playlist files,
- * or folders to a playlist.  The filenames, stored as (char *) in an index
- * (see libaudcore/index.h), must be pooled with str_get(); the caller gives up
- * one reference count to each filename.  Tuples are likewise stored as
- * (Tuple *) in an index of the same length; the caller gives up one reference
- * count to each tuple.  <tuples> may be NULL, or individual pointers within it
- * may be NULL.  Finally, the caller also gives up ownership of the indexes
- * themselves and should not access them after the call.   */
-AUD_VFUNC5 (playlist_entry_insert_batch, int, playlist, int, at,
- Index *, filenames, Index *, tuples, bool_t, play)
-
-/* Similar to playlist_entry_insert_batch, but allows the caller to prevent some
- * items from being added by returning false from the <filter> callback.  Useful
- * for searching a folder and adding only new files to the playlist.  Filenames
- * passed to the callback can be used with str_ref(), str_equal(), etc.  <user>
- * is an additional, untyped pointer passed to the callback. */
-AUD_VFUNC7 (playlist_entry_insert_filtered, int, playlist, int, at,
- Index *, filenames, Index *, tuples, PlaylistFilterFunc, filter,
- void *, user, bool_t, play)
-
-/* Removes a contiguous block of <number> entries starting from the one numbered
- * <at> from a playlist.  If necessary, the playback position is moved elsewhere
- * in the playlist and playback is restarted (or stopped). */
-AUD_VFUNC3 (playlist_entry_delete, int, playlist, int, at, int, number)
-
-/* Returns the filename of an entry. */
-AUD_FUNC2 (char *, playlist_entry_get_filename, int, playlist, int, entry)
-
-/* Returns a handle to the decoder plugin associated with an entry, or NULL if
- * none can be found.  If <fast> is nonzero, returns NULL if no decoder plugin
- * has yet been found. */
-AUD_FUNC3 (PluginHandle *, playlist_entry_get_decoder, int, playlist, int,
- entry, bool_t, fast)
-
-/* Returns the tuple associated with an entry, or NULL if one is not available.
- * The reference count of the tuple is incremented.  If <fast> is nonzero,
- * returns NULL if metadata for the entry has not yet been read from the song
- * file. */
-AUD_FUNC3 (Tuple *, playlist_entry_get_tuple, int, playlist, int, entry,
- bool_t, fast)
-
-/* Returns a formatted title string for an entry.  This may include information
- * such as the filename, song title, and/or artist.  If <fast> is nonzero,
- * returns a "best guess" based on the entry's filename if metadata for the
- * entry has not yet been read. */
-AUD_FUNC3 (char *, playlist_entry_get_title, int, playlist, int, entry,
- bool_t, fast)
-
-/* Returns three strings (title, artist, and album) describing an entry.  The
- * strings are pooled, and the usual cautions apply.  If <fast> is nonzero,
- * returns a "best guess" based on the entry's filename if metadata for the
- * entry has not yet been read.  The caller may pass NULL for any values that
- * are not needed; NULL may also be returned for any values that are not
- * available. */
-AUD_VFUNC6 (playlist_entry_describe, int, playlist, int, entry,
- char * *, title, char * *, artist, char * *, album, bool_t, fast)
-
-/* Returns the length in milliseconds of an entry, or -1 if the length is not
- * known.  <fast> is as in playlist_entry_get_tuple(). */
-AUD_FUNC3 (int, playlist_entry_get_length, int, playlist, int, entry,
- bool_t, fast)
-
-/* Moves the playback position to the beginning of the entry at <position>.  If
- * <position> is -1, unsets the playback position.  If <playlist> is the
- * currently playing playlist, playback is restarted (or stopped). */
-AUD_VFUNC2 (playlist_set_position, int, playlist, int, position)
-
-/* Returns the playback position, or -1 if it is not set.  Note that the
- * position may be set even if <playlist> is not currently playing. */
-AUD_FUNC1 (int, playlist_get_position, int, playlist)
-
-/* Sets whether an entry is selected. */
-AUD_VFUNC3 (playlist_entry_set_selected, int, playlist, int, entry,
- bool_t, selected)
-
-/* Returns whether an entry is selected. */
-AUD_FUNC2 (bool_t, playlist_entry_get_selected, int, playlist, int, entry)
-
-/* Returns the number of selected entries in a playlist. */
-AUD_FUNC1 (int, playlist_selected_count, int, playlist)
-
-/* Selects all (or none) of the entries in a playlist. */
-AUD_VFUNC2 (playlist_select_all, int, playlist, bool_t, selected)
-
-/* Moves a selected entry within a playlist by an offset of <distance> entries.
- * Other selected entries are gathered around it.  Returns the offset by which
- * the entry was actually moved, which may be less in absolute value than the
- * requested offset. */
-AUD_FUNC3 (int, playlist_shift, int, playlist, int, position, int, distance)
-
-/* Removes the selected entries from a playlist.  If necessary, the playback
- * position is moved elsewhere in the playlist and playback is restarted (or
- * stopped). */
-AUD_VFUNC1 (playlist_delete_selected, int, playlist)
-
-/* Sorts the entries in a playlist based on filename.  The callback function
- * should return negative if the first filename comes before the second,
- * positive if it comes after, or zero if the two are indistinguishable. */
-AUD_VFUNC2 (playlist_sort_by_filename, int, playlist,
- PlaylistStringCompareFunc, compare)
-
-/* Sorts the entries in a playlist based on tuple.  May fail if metadata
- * scanning is still in progress (or has been disabled). */
-AUD_VFUNC2 (playlist_sort_by_tuple, int, playlist,
- PlaylistTupleCompareFunc, compare)
-
-/* Sorts the entries in a playlist based on formatted title string.  May fail if
- * metadata scanning is still in progress (or has been disabled). */
-AUD_VFUNC2 (playlist_sort_by_title, int, playlist,
- PlaylistStringCompareFunc, compare)
-
-/* Sorts only the selected entries in a playlist based on filename. */
-AUD_VFUNC2 (playlist_sort_selected_by_filename, int, playlist,
- PlaylistStringCompareFunc, compare)
-
-/* Sorts only the selected entries in a playlist based on tuple.  May fail if
- * metadata scanning is still in progress (or has been disabled). */
-AUD_VFUNC2 (playlist_sort_selected_by_tuple, int, playlist,
- PlaylistTupleCompareFunc, compare)
-
-/* Sorts only the selected entries in a playlist based on formatted title
- * string.  May fail if metadata scanning is still in progress (or has been
- * disabled). */
-AUD_VFUNC2 (playlist_sort_selected_by_title, int, playlist,
- PlaylistStringCompareFunc, compare)
-
-/* Reverses the order of the entries in a playlist. */
-AUD_VFUNC1 (playlist_reverse, int, playlist)
-
-/* Reorders the entries in a playlist randomly. */
-AUD_VFUNC1 (playlist_randomize, int, playlist)
-
-/* Discards the metadata stored for all the entries in a playlist and starts
- * reading it afresh from the song files in the background. */
-AUD_VFUNC1 (playlist_rescan, int, playlist)
-
-/* Like playlist_rescan, but applies only to the selected entries in a playlist. */
-AUD_VFUNC1 (playlist_rescan_selected, int, playlist)
-
-/* Discards the metadata stored for all the entries that refer to a particular
- * song file, in whatever playlist they appear, and starts reading it afresh
- * from that file in the background. */
-AUD_VFUNC1 (playlist_rescan_file, const char *, filename)
-
-/* Calculates the total length in milliseconds of all the entries in a playlist.
- * Only takes into account entries for which metadata has already been read. */
-AUD_FUNC1 (int64_t, playlist_get_total_length, int, playlist)
-
-/* Calculates the total length in milliseconds of only the selected entries in a
- * playlist.  Only takes into account entries for which metadata has already
- * been read. */
-AUD_FUNC1 (int64_t, playlist_get_selected_length, int, playlist)
-
-/* Returns the number of entries in a playlist queue.  The entries are numbered
- * starting from zero, lower numbers being played first. */
-AUD_FUNC1 (int, playlist_queue_count, int, playlist)
-
-/* Adds an entry to a playlist's queue before the entry numbered <at> in the
- * queue.  If <at> is negative or equal to the number of entries in the queue,
- * adds the entry after the last one in the queue.  The same entry cannot be
- * added to the queue more than once. */
-AUD_VFUNC3 (playlist_queue_insert, int, playlist, int, at, int, entry)
-
-/* Adds the selected entries in a playlist to the queue, if they are not already
- * in it. */
-AUD_VFUNC2 (playlist_queue_insert_selected, int, playlist, int, at)
-
-/* Returns the position in the playlist of the entry at a given position in the
- * queue. */
-AUD_FUNC2 (int, playlist_queue_get_entry, int, playlist, int, at)
-
-/* Returns the position in the queue of the entry at a given position in the
- * playlist.  If it is not in the queue, returns -1. */
-AUD_FUNC2 (int, playlist_queue_find_entry, int, playlist, int, entry)
-
-/* Removes a contiguous block of <number> entries starting with the one numbered
- * <at> from the queue. */
-AUD_VFUNC3 (playlist_queue_delete, int, playlist, int, at, int, number)
-
-/* Removes the selected entries in a playlist from the queue, if they are in it. */
-AUD_VFUNC1 (playlist_queue_delete_selected, int, playlist)
-
-/* Returns nonzero if a "playlist update" hook call is pending.  If called from
- * within the hook, the current hook call is not considered pending. */
-AUD_FUNC0 (bool_t, playlist_update_pending)
-
-/* May be called within the "playlist update" hook to determine the update level
- * and number of entries changed in a playlist.  Returns the update level for
- * the playlist, storing the number of the first entry changed in <at> and the
- * number of contiguous entries to be updated in <count>.  Note that entries may
- * have been added or removed within this range.  If no entries in the playlist
- * have changed, returns zero. */
-AUD_FUNC3 (int, playlist_updated_range, int, playlist, int *, at, int *, count)
-
-/* Returns nonzero if entries are being added to a playlist in the background.
- * If <playlist> is -1, checks all playlists. */
-AUD_FUNC1 (bool_t, playlist_add_in_progress, int, playlist)
-
-/* Returns nonzero if entries in a playlist are being scanned for metadata in
- * the background.  If <playlist> is -1, checks all playlists. */
-AUD_FUNC1 (bool_t, playlist_scan_in_progress, int, playlist)
-
-/* --- PLAYLIST UTILITY API --- */
-
-/* Sorts the entries in a playlist according to one of the schemes listed in
- * playlist.h. */
-AUD_VFUNC2 (playlist_sort_by_scheme, int, playlist, int, scheme)
-
-/* Sorts only the selected entries in a playlist according to one of those
- * schemes. */
-AUD_VFUNC2 (playlist_sort_selected_by_scheme, int, playlist, int, scheme)
-
-/* Removes duplicate entries in a playlist according to one of those schemes.
- * As currently implemented, first sorts the playlist. */
-AUD_VFUNC2 (playlist_remove_duplicates_by_scheme, int, playlist, int,
- scheme)
-
-/* Removes all entries referring to unavailable files in a playlist.  ("Remove
- * failed" is something of a misnomer for the current behavior.)  As currently
- * implemented, only works for file:// URIs. */
-AUD_VFUNC1 (playlist_remove_failed, int, playlist)
-
-/* Selects all the entries in a playlist that match regular expressions stored
- * in the fields of a tuple.  Does not free the memory used by the tuple.
- * Example: To select all the songs whose title starts with the letter "A",
- * create a blank tuple and set its title field to "^A". */
-AUD_VFUNC2 (playlist_select_by_patterns, int, playlist, const Tuple *,
- patterns)
-
-/* Returns nonzero if <filename> refers to a playlist file. */
-AUD_FUNC1 (bool_t, filename_is_playlist, const char *, filename)
-
-/* Saves the entries in a playlist to a playlist file.  The format of the file
- * is determined from the file extension.  Returns nonzero on success. */
-AUD_FUNC2 (bool_t, playlist_save, int, playlist, const char *, filename)
-
-/* added in Audacious 3.4 */
-
-/* Reverses the order of the selected entries in a playlist. */
-AUD_VFUNC1 (playlist_reverse_selected, int, playlist)
-
-/* Reorders the selected entries in a playlist randomly. */
-AUD_VFUNC1 (playlist_randomize_selected, int, playlist)
-
-/* Sets the entry which has keyboard focus (-1 means no entry). */
-AUD_VFUNC2 (playlist_set_focus, int, playlist_num, int, entry_num)
-
-/* Gets the entry which has keyboard focus (-1 means no entry). */
-AUD_FUNC1 (int, playlist_get_focus, int, playlist_num)
diff --git a/src/audacious/playlist-files.c b/src/audacious/playlist-files.c
deleted file mode 100644
index 8ebe5218503e..000000000000
--- a/src/audacious/playlist-files.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * playlist-files.c
- * Copyright 2010-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <libaudcore/audstrings.h>
-
-#include "debug.h"
-#include "i18n.h"
-#include "misc.h"
-#include "playlist.h"
-#include "plugin.h"
-#include "plugins.h"
-
-typedef struct
-{
-    const char * filename;
-    char * title;
-    Index * filenames;
-    Index * tuples;
-    bool_t plugin_found;
-    bool_t success;
-}
-PlaylistData;
-
-static void plugin_for_filename (const char * filename, PluginForEachFunc func, void * data)
-{
-    char ext[32];
-    if (uri_get_extension (filename, ext, sizeof ext))
-        playlist_plugin_for_ext (ext, func, data);
-}
-
-static bool_t plugin_found_cb (PluginHandle * plugin, void * data)
-{
-    * (PluginHandle * *) data = plugin;
-    return FALSE; /* stop when first plugin is found */
-}
-
-bool_t filename_is_playlist (const char * filename)
-{
-    PluginHandle * plugin = NULL;
-    plugin_for_filename (filename, plugin_found_cb, & plugin);
-    return (plugin != NULL);
-}
-
-static bool_t playlist_load_cb (PluginHandle * plugin, void * data_)
-{
-    PlaylistData * data = (PlaylistData *) data_;
-
-    PlaylistPlugin * pp = plugin_get_header (plugin);
-    if (! pp || ! PLUGIN_HAS_FUNC (pp, load))
-        return TRUE; /* try another plugin */
-
-    data->plugin_found = TRUE;
-
-    VFSFile * file = vfs_fopen (data->filename, "r");
-    if (! file)
-        return FALSE; /* stop if we can't open file */
-
-    data->success = pp->load (data->filename, file, & data->title, data->filenames, data->tuples);
-
-    vfs_fclose (file);
-    return ! data->success; /* stop when playlist is loaded */
-}
-
-bool_t playlist_load (const char * filename, char * * title, Index * * filenames, Index * * tuples)
-{
-    PlaylistData data =
-    {
-        .filename = filename,
-        .filenames = index_new (),
-        .tuples = index_new ()
-    };
-
-    AUDDBG ("Loading playlist %s.\n", filename);
-    plugin_for_filename (filename, playlist_load_cb, & data);
-
-    if (! data.plugin_found)
-    {
-        SPRINTF (error, _("Cannot load %s: unsupported file extension."), filename);
-        interface_show_error (error);
-    }
-
-    if (! data.success)
-    {
-        str_unref (data.title);
-        index_free_full (data.filenames, (IndexFreeFunc) str_unref);
-        index_free_full (data.tuples, (IndexFreeFunc) tuple_unref);
-        return FALSE;
-    }
-
-    if (index_count (data.tuples))
-        g_return_val_if_fail (index_count (data.tuples) == index_count (data.filenames), FALSE);
-    else
-    {
-        index_free (data.tuples);
-        data.tuples = NULL;
-    }
-
-    * title = data.title;
-    * filenames = data.filenames;
-    * tuples = data.tuples;
-    return TRUE;
-}
-
-bool_t playlist_insert_playlist_raw (int list, int at, const char * filename)
-{
-    char * title = NULL;
-    Index * filenames, * tuples;
-
-    if (! playlist_load (filename, & title, & filenames, & tuples))
-        return FALSE;
-
-    if (title && ! playlist_entry_count (list))
-        playlist_set_title (list, title);
-
-    playlist_entry_insert_batch_raw (list, at, filenames, tuples, NULL);
-
-    str_unref (title);
-    return TRUE;
-}
-
-static bool_t playlist_save_cb (PluginHandle * plugin, void * data_)
-{
-    PlaylistData * data = data_;
-
-    PlaylistPlugin * pp = plugin_get_header (plugin);
-    if (! pp || ! PLUGIN_HAS_FUNC (pp, save))
-        return TRUE; /* try another plugin */
-
-    data->plugin_found = TRUE;
-
-    VFSFile * file = vfs_fopen (data->filename, "w");
-    if (! file)
-        return FALSE; /* stop if we can't open file */
-
-    data->success = pp->save (data->filename, file, data->title, data->filenames, data->tuples);
-
-    vfs_fclose (file);
-    return FALSE; /* stop after first attempt (successful or not) */
-}
-
-bool_t playlist_save (int list, const char * filename)
-{
-    PlaylistData data =
-    {
-        .filename = filename,
-        .title = playlist_get_title (list),
-        .filenames = index_new (),
-        .tuples = index_new ()
-    };
-
-    int entries = playlist_entry_count (list);
-    bool_t fast = get_bool (NULL, "metadata_on_play");
-
-    index_allocate (data.filenames, entries);
-    index_allocate (data.tuples, entries);
-
-    for (int i = 0; i < entries; i ++)
-    {
-        index_insert (data.filenames, -1, playlist_entry_get_filename (list, i));
-        index_insert (data.tuples, -1, playlist_entry_get_tuple (list, i, fast));
-    }
-
-    AUDDBG ("Saving playlist %s.\n", filename);
-    plugin_for_filename (filename, playlist_save_cb, & data);
-
-    if (! data.plugin_found)
-    {
-        SPRINTF (error, _("Cannot save %s: unsupported file extension."), filename);
-        interface_show_error (error);
-    }
-
-    str_unref (data.title);
-    index_free_full (data.filenames, (IndexFreeFunc) str_unref);
-    index_free_full (data.tuples, (IndexFreeFunc) tuple_unref);
-
-    return data.success;
-}
diff --git a/src/audacious/playlist-new.c b/src/audacious/playlist-new.c
deleted file mode 100644
index 23696b0add2e..000000000000
--- a/src/audacious/playlist-new.c
+++ /dev/null
@@ -1,2401 +0,0 @@
-/*
- * playlist-new.c
- * Copyright 2009-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#include <glib.h>
-#include <glib/gstdio.h>
-
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-#include <libaudcore/tuple.h>
-
-#include "drct.h"
-#include "i18n.h"
-#include "misc.h"
-#include "playback.h"
-#include "playlist.h"
-#include "plugins.h"
-#include "scanner.h"
-#include "util.h"
-
-enum {RESUME_STOP, RESUME_PLAY, RESUME_PAUSE};
-
-#define STATE_FILE "playlist-state"
-
-#define ENTER pthread_mutex_lock (& mutex)
-#define LEAVE pthread_mutex_unlock (& mutex)
-
-#define RETURN(...) do { \
-    pthread_mutex_unlock (& mutex); \
-    return __VA_ARGS__; \
-} while (0)
-
-#define ENTER_GET_PLAYLIST(...) ENTER; \
-    Playlist * playlist = lookup_playlist (playlist_num); \
-    if (! playlist) \
-        RETURN (__VA_ARGS__);
-
-#define ENTER_GET_ENTRY(...) ENTER_GET_PLAYLIST (__VA_ARGS__); \
-    Entry * entry = lookup_entry (playlist, entry_num); \
-    if (! entry) \
-        RETURN (__VA_ARGS__);
-
-typedef struct {
-    int level, before, after;
-} Update;
-
-typedef struct {
-    int number;
-    char * filename;
-    PluginHandle * decoder;
-    Tuple * tuple;
-    char * formatted, * title, * artist, * album;
-    int length;
-    bool_t failed;
-    bool_t selected;
-    int shuffle_num;
-    bool_t queued;
-} Entry;
-
-typedef struct {
-    int number, unique_id;
-    char * filename, * title;
-    bool_t modified;
-    Index * entries;
-    Entry * position, * focus;
-    int selected_count;
-    int last_shuffle_num;
-    GList * queued;
-    int64_t total_length, selected_length;
-    bool_t scanning, scan_ending;
-    Update next_update, last_update;
-    bool_t resume_paused;
-    int resume_time;
-} Playlist;
-
-static const char * const default_title = N_("New Playlist");
-static const char * const temp_title = N_("Now Playing");
-
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
-
-/* The unique ID table contains pointers to Playlist for ID's in use and NULL
- * for "dead" (previously used and therefore unavailable) ID's. */
-static GHashTable * unique_id_table = NULL;
-static int next_unique_id = 1000;
-
-static Index * playlists = NULL;
-static Playlist * active_playlist = NULL;
-static Playlist * playing_playlist = NULL;
-static int resume_playlist = -1;
-
-static int update_source = 0, update_level;
-
-typedef struct {
-    Playlist * playlist;
-    Entry * entry;
-    ScanRequest * request;
-} ScanItem;
-
-static int scan_playlist, scan_row;
-static GList * scan_list = NULL;
-
-static void scan_finish (ScanRequest * request);
-static void scan_cancel (Entry * entry);
-static void scan_restart (void);
-
-static bool_t next_song_locked (Playlist * playlist, bool_t repeat, int hint);
-
-static TupleFormatter * title_formatter;
-
-static void entry_set_tuple_real (Entry * entry, Tuple * tuple)
-{
-    /* Hack: We cannot refresh segmented entries (since their info is read from
-     * the cue sheet when it is first loaded), so leave them alone. -jlindgren */
-    if (entry->tuple && tuple_get_value_type (entry->tuple, FIELD_SEGMENT_START) == TUPLE_INT)
-    {
-        if (tuple)
-            tuple_unref (tuple);
-        return;
-    }
-
-    if (entry->tuple)
-        tuple_unref (entry->tuple);
-
-    entry->tuple = tuple;
-    entry->failed = FALSE;
-
-    str_unref (entry->formatted);
-    str_unref (entry->title);
-    str_unref (entry->artist);
-    str_unref (entry->album);
-
-    describe_song (entry->filename, tuple, & entry->title, & entry->artist, & entry->album);
-
-    if (! tuple)
-    {
-        entry->formatted = NULL;
-        entry->length = 0;
-    }
-    else
-    {
-        entry->formatted = tuple_format_title (title_formatter, tuple);
-        entry->length = tuple_get_int (tuple, FIELD_LENGTH);
-        if (entry->length < 0)
-            entry->length = 0;
-    }
-}
-
-static void entry_set_tuple (Playlist * playlist, Entry * entry, Tuple * tuple)
-{
-    scan_cancel (entry);
-
-    if (entry->tuple)
-    {
-        playlist->total_length -= entry->length;
-        if (entry->selected)
-            playlist->selected_length -= entry->length;
-    }
-
-    entry_set_tuple_real (entry, tuple);
-
-    if (tuple)
-    {
-        playlist->total_length += entry->length;
-        if (entry->selected)
-            playlist->selected_length += entry->length;
-    }
-}
-
-static void entry_set_failed (Playlist * playlist, Entry * entry)
-{
-    entry_set_tuple (playlist, entry, tuple_new_from_filename (entry->filename));
-    entry->failed = TRUE;
-}
-
-static Entry * entry_new (char * filename, Tuple * tuple, PluginHandle * decoder)
-{
-    Entry * entry = g_slice_new (Entry);
-
-    entry->filename = filename;
-    entry->decoder = decoder;
-    entry->tuple = NULL;
-    entry->formatted = NULL;
-    entry->title = NULL;
-    entry->artist = NULL;
-    entry->album = NULL;
-    entry->failed = FALSE;
-    entry->number = -1;
-    entry->selected = FALSE;
-    entry->shuffle_num = 0;
-    entry->queued = FALSE;
-
-    entry_set_tuple_real (entry, tuple);
-    return entry;
-}
-
-static void entry_free (Entry * entry)
-{
-    scan_cancel (entry);
-
-    str_unref (entry->filename);
-    if (entry->tuple)
-        tuple_unref (entry->tuple);
-
-    str_unref (entry->formatted);
-    str_unref (entry->title);
-    str_unref (entry->artist);
-    str_unref (entry->album);
-    g_slice_free (Entry, entry);
-}
-
-static int new_unique_id (int preferred)
-{
-    if (preferred >= 0 && ! g_hash_table_lookup_extended (unique_id_table,
-     GINT_TO_POINTER (preferred), NULL, NULL))
-        return preferred;
-
-    while (g_hash_table_lookup_extended (unique_id_table,
-     GINT_TO_POINTER (next_unique_id), NULL, NULL))
-        next_unique_id ++;
-
-    return next_unique_id ++;
-}
-
-static Playlist * playlist_new (int id)
-{
-    Playlist * playlist = g_slice_new (Playlist);
-
-    playlist->number = -1;
-    playlist->unique_id = new_unique_id (id);
-    playlist->filename = NULL;
-    playlist->title = str_get (_(default_title));
-    playlist->modified = TRUE;
-    playlist->entries = index_new();
-    playlist->position = NULL;
-    playlist->focus = NULL;
-    playlist->selected_count = 0;
-    playlist->last_shuffle_num = 0;
-    playlist->queued = NULL;
-    playlist->total_length = 0;
-    playlist->selected_length = 0;
-    playlist->scanning = FALSE;
-    playlist->scan_ending = FALSE;
-    playlist->resume_paused = FALSE;
-    playlist->resume_time = 0;
-
-    memset (& playlist->last_update, 0, sizeof (Update));
-    memset (& playlist->next_update, 0, sizeof (Update));
-
-    g_hash_table_insert (unique_id_table, GINT_TO_POINTER (playlist->unique_id), playlist);
-    return playlist;
-}
-
-static void playlist_free (Playlist * playlist)
-{
-    g_hash_table_insert (unique_id_table, GINT_TO_POINTER (playlist->unique_id), NULL);
-
-    str_unref (playlist->filename);
-    str_unref (playlist->title);
-    index_free_full (playlist->entries, (IndexFreeFunc) entry_free);
-    g_list_free (playlist->queued);
-    g_slice_free (Playlist, playlist);
-}
-
-static void number_playlists (int at, int length)
-{
-    for (int count = 0; count < length; count ++)
-    {
-        Playlist * playlist = index_get (playlists, at + count);
-        playlist->number = at + count;
-    }
-}
-
-static Playlist * lookup_playlist (int playlist_num)
-{
-    return (playlists && playlist_num >= 0 && playlist_num < index_count
-     (playlists)) ? index_get (playlists, playlist_num) : NULL;
-}
-
-static void number_entries (Playlist * playlist, int at, int length)
-{
-    for (int count = 0; count < length; count ++)
-    {
-        Entry * entry = index_get (playlist->entries, at + count);
-        entry->number = at + count;
-    }
-}
-
-static Entry * lookup_entry (Playlist * playlist, int entry_num)
-{
-    return (entry_num >= 0 && entry_num < index_count (playlist->entries)) ?
-     index_get (playlist->entries, entry_num) : NULL;
-}
-
-static bool_t update (void * unused)
-{
-    ENTER;
-
-    for (int i = 0; i < index_count (playlists); i ++)
-    {
-        Playlist * p = index_get (playlists, i);
-        memcpy (& p->last_update, & p->next_update, sizeof (Update));
-        memset (& p->next_update, 0, sizeof (Update));
-    }
-
-    int level = update_level;
-    update_level = 0;
-
-    if (update_source)
-    {
-        g_source_remove (update_source);
-        update_source = 0;
-    }
-
-    LEAVE;
-
-    hook_call ("playlist update", GINT_TO_POINTER (level));
-    return FALSE;
-}
-
-static void queue_update (int level, int list, int at, int count)
-{
-    Playlist * p = lookup_playlist (list);
-
-    if (p)
-    {
-        if (level >= PLAYLIST_UPDATE_METADATA)
-        {
-            p->modified = TRUE;
-
-            if (! get_bool (NULL, "metadata_on_play"))
-            {
-                p->scanning = TRUE;
-                p->scan_ending = FALSE;
-                scan_restart ();
-            }
-        }
-
-        if (p->next_update.level)
-        {
-            p->next_update.level = MAX (p->next_update.level, level);
-            p->next_update.before = MIN (p->next_update.before, at);
-            p->next_update.after = MIN (p->next_update.after,
-             index_count (p->entries) - at - count);
-        }
-        else
-        {
-            p->next_update.level = level;
-            p->next_update.before = at;
-            p->next_update.after = index_count (p->entries) - at - count;
-        }
-    }
-
-    update_level = MAX (update_level, level);
-
-    if (! update_source)
-        update_source = g_idle_add_full (G_PRIORITY_HIGH, update, NULL, NULL);
-}
-
-bool_t playlist_update_pending (void)
-{
-    ENTER;
-    bool_t pending = update_level ? TRUE : FALSE;
-    RETURN (pending);
-}
-
-int playlist_updated_range (int playlist_num, int * at, int * count)
-{
-    ENTER_GET_PLAYLIST (0);
-
-    Update * u = & playlist->last_update;
-
-    int level = u->level;
-    * at = u->before;
-    * count = index_count (playlist->entries) - u->before - u->after;
-
-    RETURN (level);
-}
-
-bool_t playlist_scan_in_progress (int playlist_num)
-{
-    if (playlist_num >= 0)
-    {
-        ENTER_GET_PLAYLIST (FALSE);
-        bool_t scanning = playlist->scanning || playlist->scan_ending;
-        RETURN (scanning);
-    }
-    else
-    {
-        ENTER;
-
-        bool_t scanning = FALSE;
-        for (playlist_num = 0; playlist_num < index_count (playlists); playlist_num ++)
-        {
-            Playlist * playlist = index_get (playlists, playlist_num);
-            if (playlist->scanning || playlist->scan_ending)
-                scanning = TRUE;
-        }
-
-        RETURN (scanning);
-    }
-}
-
-static GList * scan_list_find_playlist (Playlist * playlist)
-{
-    for (GList * node = scan_list; node; node = node->next)
-    {
-        ScanItem * item = node->data;
-        if (item->playlist == playlist)
-            return node;
-    }
-
-    return NULL;
-}
-
-static GList * scan_list_find_entry (Entry * entry)
-{
-    for (GList * node = scan_list; node; node = node->next)
-    {
-        ScanItem * item = node->data;
-        if (item->entry == entry)
-            return node;
-    }
-
-    return NULL;
-}
-
-static GList * scan_list_find_request (ScanRequest * request)
-{
-    for (GList * node = scan_list; node; node = node->next)
-    {
-        ScanItem * item = node->data;
-        if (item->request == request)
-            return node;
-    }
-
-    return NULL;
-}
-
-static void scan_queue_entry (Playlist * playlist, Entry * entry)
-{
-    int flags = 0;
-    if (! entry->tuple)
-        flags |= SCAN_TUPLE;
-
-    ScanItem * item = g_slice_new (ScanItem);
-    item->playlist = playlist;
-    item->entry = entry;
-    item->request = scan_request (entry->filename, flags, entry->decoder, scan_finish);
-    scan_list = g_list_prepend (scan_list, item);
-}
-
-static void scan_check_complete (Playlist * playlist)
-{
-    if (! playlist->scan_ending || scan_list_find_playlist (playlist))
-        return;
-
-    playlist->scan_ending = FALSE;
-    event_queue_cancel ("playlist scan complete", NULL);
-    event_queue ("playlist scan complete", NULL);
-}
-
-static bool_t scan_queue_next_entry (void)
-{
-    while (scan_playlist < index_count (playlists))
-    {
-        Playlist * playlist = index_get (playlists, scan_playlist);
-
-        if (playlist->scanning)
-        {
-            while (scan_row < index_count (playlist->entries))
-            {
-                Entry * entry = index_get (playlist->entries, scan_row ++);
-
-                if (! entry->tuple && ! scan_list_find_entry (entry))
-                {
-                    scan_queue_entry (playlist, entry);
-                    return TRUE;
-                }
-            }
-
-            playlist->scanning = FALSE;
-            playlist->scan_ending = TRUE;
-            scan_check_complete (playlist);
-        }
-
-        scan_playlist ++;
-        scan_row = 0;
-    }
-
-    return FALSE;
-}
-
-static void scan_schedule (void)
-{
-    while (g_list_length (scan_list) < SCAN_THREADS)
-    {
-        if (! scan_queue_next_entry ())
-            break;
-    }
-}
-
-static void scan_finish (ScanRequest * request)
-{
-    ENTER;
-
-    GList * node = scan_list_find_request (request);
-    if (! node)
-        RETURN ();
-
-    ScanItem * item = node->data;
-    Playlist * playlist = item->playlist;
-    Entry * entry = item->entry;
-    bool_t changed = FALSE;
-
-    scan_list = g_list_delete_link (scan_list, node);
-    g_slice_free (ScanItem, item);
-
-    if (! entry->decoder)
-        entry->decoder = scan_request_get_decoder (request);
-
-    if (! entry->tuple)
-    {
-        Tuple * tuple = scan_request_get_tuple (request);
-        if (tuple)
-        {
-            entry_set_tuple (playlist, entry, tuple);
-            changed = TRUE;
-        }
-    }
-
-    if (! entry->decoder || ! entry->tuple)
-        entry_set_failed (playlist, entry);
-
-    if (changed)
-        queue_update (PLAYLIST_UPDATE_METADATA, playlist->number, entry->number, 1);
-
-    scan_check_complete (playlist);
-    scan_schedule ();
-
-    pthread_cond_broadcast (& cond);
-
-    LEAVE;
-}
-
-static void scan_cancel (Entry * entry)
-{
-    GList * node = scan_list_find_entry (entry);
-    if (! node)
-        return;
-
-    ScanItem * item = node->data;
-    scan_list = g_list_delete_link (scan_list, node);
-    g_slice_free (ScanItem, item);
-}
-
-static void scan_restart (void)
-{
-    scan_playlist = 0;
-    scan_row = 0;
-    scan_schedule ();
-}
-
-/* mutex may be unlocked during the call */
-static Entry * get_entry (int playlist_num, int entry_num,
- bool_t need_decoder, bool_t need_tuple)
-{
-    while (1)
-    {
-        Playlist * playlist = lookup_playlist (playlist_num);
-        Entry * entry = playlist ? lookup_entry (playlist, entry_num) : NULL;
-
-        if (! entry || entry->failed)
-            return entry;
-
-        if ((need_decoder && ! entry->decoder) || (need_tuple && ! entry->tuple))
-        {
-            if (! scan_list_find_entry (entry))
-                scan_queue_entry (playlist, entry);
-
-            pthread_cond_wait (& cond, & mutex);
-            continue;
-        }
-
-        return entry;
-    }
-}
-
-/* mutex may be unlocked during the call */
-static Entry * get_playback_entry (bool_t need_decoder, bool_t need_tuple)
-{
-    while (1)
-    {
-        Entry * entry = playing_playlist ? playing_playlist->position : NULL;
-
-        if (! entry || entry->failed)
-            return entry;
-
-        if ((need_decoder && ! entry->decoder) || (need_tuple && ! entry->tuple))
-        {
-            if (! scan_list_find_entry (entry))
-                scan_queue_entry (playing_playlist, entry);
-
-            pthread_cond_wait (& cond, & mutex);
-            continue;
-        }
-
-        return entry;
-    }
-}
-
-void playlist_init (void)
-{
-    srand (time (NULL));
-
-    ENTER;
-
-    unique_id_table = g_hash_table_new (g_direct_hash, g_direct_equal);
-    playlists = index_new ();
-
-    update_level = 0;
-    scan_playlist = scan_row = 0;
-
-    LEAVE;
-
-    /* initialize title formatter */
-    playlist_reformat_titles ();
-}
-
-void playlist_end (void)
-{
-    ENTER;
-
-    if (update_source)
-    {
-        g_source_remove (update_source);
-        update_source = 0;
-    }
-
-    active_playlist = playing_playlist = NULL;
-    resume_playlist = -1;
-
-    index_free_full (playlists, (IndexFreeFunc) playlist_free);
-    playlists = NULL;
-
-    g_hash_table_destroy (unique_id_table);
-    unique_id_table = NULL;
-
-    tuple_formatter_free (title_formatter);
-    title_formatter = NULL;
-
-    LEAVE;
-}
-
-int playlist_count (void)
-{
-    ENTER;
-    int count = index_count (playlists);
-    RETURN (count);
-}
-
-void playlist_insert_with_id (int at, int id)
-{
-    ENTER;
-
-    if (at < 0 || at > index_count (playlists))
-        at = index_count (playlists);
-
-    index_insert (playlists, at, playlist_new (id));
-    number_playlists (at, index_count (playlists) - at);
-
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, -1, 0, 0);
-    LEAVE;
-}
-
-void playlist_insert (int at)
-{
-    playlist_insert_with_id (at, -1);
-}
-
-void playlist_reorder (int from, int to, int count)
-{
-    ENTER;
-
-    if (from < 0 || from + count > index_count (playlists) || to < 0 || to +
-     count > index_count (playlists) || count < 0)
-        RETURN ();
-
-    Index * displaced = index_new ();
-
-    if (to < from)
-        index_copy_insert (playlists, to, displaced, -1, from - to);
-    else
-        index_copy_insert (playlists, from + count, displaced, -1, to - from);
-
-    index_copy_set (playlists, from, playlists, to, count);
-
-    if (to < from)
-    {
-        index_copy_set (displaced, 0, playlists, to + count, from - to);
-        number_playlists (to, from + count - to);
-    }
-    else
-    {
-        index_copy_set (displaced, 0, playlists, from, to - from);
-        number_playlists (from, to + count - from);
-    }
-
-    index_free (displaced);
-
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, -1, 0, 0);
-    LEAVE;
-}
-
-void playlist_delete (int playlist_num)
-{
-    ENTER_GET_PLAYLIST ();
-
-    bool_t was_playing = (playlist == playing_playlist);
-
-    index_delete_full (playlists, playlist_num, 1, (IndexFreeFunc) playlist_free);
-
-    if (! index_count (playlists))
-        index_insert (playlists, 0, playlist_new (-1));
-
-    number_playlists (playlist_num, index_count (playlists) - playlist_num);
-
-    if (playlist == active_playlist)
-        active_playlist = index_get (playlists, MIN (playlist_num, index_count (playlists) - 1));
-    if (playlist == playing_playlist)
-        playing_playlist = NULL;
-
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, -1, 0, 0);
-    LEAVE;
-
-    if (was_playing)
-        playback_stop ();
-}
-
-int playlist_get_unique_id (int playlist_num)
-{
-    ENTER_GET_PLAYLIST (-1);
-    int unique_id = playlist->unique_id;
-    RETURN (unique_id);
-}
-
-int playlist_by_unique_id (int id)
-{
-    ENTER;
-
-    Playlist * p = g_hash_table_lookup (unique_id_table, GINT_TO_POINTER (id));
-    int num = p ? p->number : -1;
-
-    RETURN (num);
-}
-
-void playlist_set_filename (int playlist_num, const char * filename)
-{
-    ENTER_GET_PLAYLIST ();
-
-    str_unref (playlist->filename);
-    playlist->filename = str_get (filename);
-    playlist->modified = TRUE;
-
-    queue_update (PLAYLIST_UPDATE_METADATA, -1, 0, 0);
-    LEAVE;
-}
-
-char * playlist_get_filename (int playlist_num)
-{
-    ENTER_GET_PLAYLIST (NULL);
-    char * filename = str_ref (playlist->filename);
-    RETURN (filename);
-}
-
-void playlist_set_title (int playlist_num, const char * title)
-{
-    ENTER_GET_PLAYLIST ();
-
-    str_unref (playlist->title);
-    playlist->title = str_get (title);
-    playlist->modified = TRUE;
-
-    queue_update (PLAYLIST_UPDATE_METADATA, -1, 0, 0);
-    LEAVE;
-}
-
-char * playlist_get_title (int playlist_num)
-{
-    ENTER_GET_PLAYLIST (NULL);
-    char * title = str_ref (playlist->title);
-    RETURN (title);
-}
-
-void playlist_set_modified (int playlist_num, bool_t modified)
-{
-    ENTER_GET_PLAYLIST ();
-    playlist->modified = modified;
-    LEAVE;
-}
-
-bool_t playlist_get_modified (int playlist_num)
-{
-    ENTER_GET_PLAYLIST (FALSE);
-    bool_t modified = playlist->modified;
-    RETURN (modified);
-}
-
-void playlist_set_active (int playlist_num)
-{
-    ENTER_GET_PLAYLIST ();
-
-    bool_t changed = FALSE;
-
-    if (playlist != active_playlist)
-    {
-        changed = TRUE;
-        active_playlist = playlist;
-    }
-
-    LEAVE;
-
-    if (changed)
-        hook_call ("playlist activate", NULL);
-}
-
-int playlist_get_active (void)
-{
-    ENTER;
-    int list = active_playlist ? active_playlist->number : -1;
-    RETURN (list);
-}
-
-void playlist_set_playing (int playlist_num)
-{
-    /* get playback state before locking playlists */
-    bool_t paused = drct_get_paused ();
-    int time = drct_get_time ();
-
-    ENTER;
-
-    Playlist * playlist = lookup_playlist (playlist_num);
-    bool_t can_play = FALSE;
-    bool_t position_changed = FALSE;
-
-    if (playlist == playing_playlist)
-        RETURN ();
-
-    if (playing_playlist)
-    {
-        playing_playlist->resume_paused = paused;
-        playing_playlist->resume_time = time;
-    }
-
-    /* is there anything to play? */
-    if (playlist && ! playlist->position)
-    {
-        if (next_song_locked (playlist, TRUE, 0))
-            position_changed = TRUE;
-        else
-            playlist = NULL;
-    }
-
-    if (playlist)
-    {
-        can_play = TRUE;
-        paused = playlist->resume_paused;
-        time = playlist->resume_time;
-    }
-
-    playing_playlist = playlist;
-
-    LEAVE;
-
-    if (position_changed)
-        hook_call ("playlist position", GINT_TO_POINTER (playlist_num));
-
-    hook_call ("playlist set playing", NULL);
-
-    /* start playback after unlocking playlists */
-    if (can_play)
-        playback_play (time, paused);
-    else
-        playback_stop ();
-}
-
-int playlist_get_playing (void)
-{
-    ENTER;
-    int list = playing_playlist ? playing_playlist->number: -1;
-    RETURN (list);
-}
-
-int playlist_get_blank (void)
-{
-    int list = playlist_get_active ();
-    char * title = playlist_get_title (list);
-
-    if (strcmp (title, _(default_title)) || playlist_entry_count (list) > 0)
-    {
-        list = playlist_count ();
-        playlist_insert (list);
-    }
-
-    str_unref (title);
-    return list;
-}
-
-int playlist_get_temporary (void)
-{
-    int list, count = playlist_count ();
-    bool_t found = FALSE;
-
-    for (list = 0; list < count; list ++)
-    {
-        char * title = playlist_get_title (list);
-        found = ! strcmp (title, _(temp_title));
-        str_unref (title);
-
-        if (found)
-            break;
-    }
-
-    if (! found)
-    {
-        list = playlist_get_blank ();
-        playlist_set_title (list, _(temp_title));
-    }
-
-    return list;
-}
-
-static void set_position (Playlist * playlist, Entry * entry, bool_t update_shuffle)
-{
-    playlist->position = entry;
-    playlist->resume_time = 0;
-
-    /* move entry to top of shuffle list */
-    if (entry && update_shuffle)
-        entry->shuffle_num = ++ playlist->last_shuffle_num;
-}
-
-/* unlocked */
-static void change_playback (bool_t can_play)
-{
-    if (can_play && drct_get_playing ())
-        playback_play (0, drct_get_paused ());
-    else
-        playlist_set_playing (-1);
-}
-
-int playlist_entry_count (int playlist_num)
-{
-    ENTER_GET_PLAYLIST (0);
-    int count = index_count (playlist->entries);
-    RETURN (count);
-}
-
-void playlist_entry_insert_batch_raw (int playlist_num, int at,
- Index * filenames, Index * tuples, Index * decoders)
-{
-    ENTER_GET_PLAYLIST ();
-
-    int entries = index_count (playlist->entries);
-
-    if (at < 0 || at > entries)
-        at = entries;
-
-    int number = index_count (filenames);
-
-    Index * add = index_new ();
-    index_allocate (add, number);
-
-    for (int i = 0; i < number; i ++)
-    {
-        char * filename = index_get (filenames, i);
-        Tuple * tuple = tuples ? index_get (tuples, i) : NULL;
-        PluginHandle * decoder = decoders ? index_get (decoders, i) : NULL;
-        index_insert (add, -1, entry_new (filename, tuple, decoder));
-    }
-
-    index_free (filenames);
-    if (decoders)
-        index_free (decoders);
-    if (tuples)
-        index_free (tuples);
-
-    number = index_count (add);
-    index_copy_insert (add, 0, playlist->entries, at, -1);
-    index_free (add);
-
-    number_entries (playlist, at, entries + number - at);
-
-    for (int count = 0; count < number; count ++)
-    {
-        Entry * entry = index_get (playlist->entries, at + count);
-        playlist->total_length += entry->length;
-    }
-
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, playlist->number, at, number);
-    LEAVE;
-}
-
-void playlist_entry_delete (int playlist_num, int at, int number)
-{
-    ENTER_GET_PLAYLIST ();
-
-    int entries = index_count (playlist->entries);
-    bool_t position_changed = FALSE;
-    bool_t was_playing = FALSE;
-    bool_t can_play = FALSE;
-
-    if (at < 0 || at > entries)
-        at = entries;
-    if (number < 0 || number > entries - at)
-        number = entries - at;
-
-    if (playlist->position && playlist->position->number >= at &&
-     playlist->position->number < at + number)
-    {
-        position_changed = TRUE;
-        was_playing = (playlist == playing_playlist);
-
-        set_position (playlist, NULL, FALSE);
-    }
-
-    if (playlist->focus && playlist->focus->number >= at &&
-     playlist->focus->number < at + number)
-    {
-        if (at + number < entries)
-            playlist->focus = index_get (playlist->entries, at + number);
-        else if (at > 0)
-            playlist->focus = index_get (playlist->entries, at - 1);
-        else
-            playlist->focus = NULL;
-    }
-
-    for (int count = 0; count < number; count ++)
-    {
-        Entry * entry = index_get (playlist->entries, at + count);
-
-        if (entry->queued)
-            playlist->queued = g_list_remove (playlist->queued, entry);
-
-        if (entry->selected)
-        {
-            playlist->selected_count --;
-            playlist->selected_length -= entry->length;
-        }
-
-        playlist->total_length -= entry->length;
-    }
-
-    index_delete_full (playlist->entries, at, number, (IndexFreeFunc) entry_free);
-    number_entries (playlist, at, entries - at - number);
-
-    if (position_changed && get_bool (NULL, "advance_on_delete"))
-        can_play = next_song_locked (playlist, get_bool (NULL, "repeat"), at);
-
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, playlist->number, at, 0);
-    LEAVE;
-
-    if (position_changed)
-        hook_call ("playlist position", GINT_TO_POINTER (playlist_num));
-    if (was_playing)
-        change_playback (can_play);
-}
-
-char * playlist_entry_get_filename (int playlist_num, int entry_num)
-{
-    ENTER_GET_ENTRY (NULL);
-    char * filename = str_ref (entry->filename);
-    RETURN (filename);
-}
-
-PluginHandle * playlist_entry_get_decoder (int playlist_num, int entry_num, bool_t fast)
-{
-    ENTER;
-
-    Entry * entry = get_entry (playlist_num, entry_num, ! fast, FALSE);
-    PluginHandle * decoder = entry ? entry->decoder : NULL;
-
-    RETURN (decoder);
-}
-
-Tuple * playlist_entry_get_tuple (int playlist_num, int entry_num, bool_t fast)
-{
-    ENTER;
-
-    Entry * entry = get_entry (playlist_num, entry_num, FALSE, ! fast);
-    Tuple * tuple = entry ? entry->tuple : NULL;
-
-    if (tuple)
-        tuple_ref (tuple);
-
-    RETURN (tuple);
-}
-
-char * playlist_entry_get_title (int playlist_num, int entry_num, bool_t fast)
-{
-    ENTER;
-
-    Entry * entry = get_entry (playlist_num, entry_num, FALSE, ! fast);
-    char * title = entry ? str_ref (entry->formatted ? entry->formatted : entry->title) : NULL;
-
-    RETURN (title);
-}
-
-void playlist_entry_describe (int playlist_num, int entry_num,
- char * * title, char * * artist, char * * album, bool_t fast)
-{
-    ENTER;
-
-    Entry * entry = get_entry (playlist_num, entry_num, FALSE, ! fast);
-
-    if (title)
-        * title = (entry && entry->title) ? str_ref (entry->title) : NULL;
-    if (artist)
-        * artist = (entry && entry->artist) ? str_ref (entry->artist) : NULL;
-    if (album)
-        * album = (entry && entry->album) ? str_ref (entry->album) : NULL;
-
-    LEAVE;
-}
-
-int playlist_entry_get_length (int playlist_num, int entry_num, bool_t fast)
-{
-    ENTER;
-
-    Entry * entry = get_entry (playlist_num, entry_num, FALSE, ! fast);
-    int length = entry ? entry->length : 0;
-
-    RETURN (length);
-}
-
-void playlist_set_position (int playlist_num, int entry_num)
-{
-    ENTER_GET_PLAYLIST ();
-
-    Entry * entry = lookup_entry (playlist, entry_num);
-    bool_t was_playing = (playlist == playing_playlist);
-    bool_t can_play = !! entry;
-
-    set_position (playlist, entry, TRUE);
-
-    LEAVE;
-
-    hook_call ("playlist position", GINT_TO_POINTER (playlist_num));
-    if (was_playing)
-        change_playback (can_play);
-}
-
-int playlist_get_position (int playlist_num)
-{
-    ENTER_GET_PLAYLIST (-1);
-    int position = playlist->position ? playlist->position->number : -1;
-    RETURN (position);
-}
-
-void playlist_set_focus (int playlist_num, int entry_num)
-{
-    ENTER_GET_PLAYLIST ();
-
-    int first = INT_MAX;
-    int last = -1;
-
-    if (playlist->focus)
-    {
-        first = MIN (first, playlist->focus->number);
-        last = MAX (last, playlist->focus->number);
-    }
-
-    playlist->focus = lookup_entry (playlist, entry_num);
-
-    if (playlist->focus)
-    {
-        first = MIN (first, playlist->focus->number);
-        last = MAX (last, playlist->focus->number);
-    }
-
-    if (first <= last)
-        queue_update (PLAYLIST_UPDATE_SELECTION, playlist_num, first, last + 1 - first);
-
-    LEAVE;
-}
-
-int playlist_get_focus (int playlist_num)
-{
-    ENTER_GET_PLAYLIST (-1);
-    int focus = playlist->focus ? playlist->focus->number : -1;
-    RETURN (focus);
-}
-
-void playlist_entry_set_selected (int playlist_num, int entry_num,
- bool_t selected)
-{
-    ENTER_GET_ENTRY ();
-
-    if (entry->selected == selected)
-        RETURN ();
-
-    entry->selected = selected;
-
-    if (selected)
-    {
-        playlist->selected_count++;
-        playlist->selected_length += entry->length;
-    }
-    else
-    {
-        playlist->selected_count--;
-        playlist->selected_length -= entry->length;
-    }
-
-    queue_update (PLAYLIST_UPDATE_SELECTION, playlist->number, entry_num, 1);
-    LEAVE;
-}
-
-bool_t playlist_entry_get_selected (int playlist_num, int entry_num)
-{
-    ENTER_GET_ENTRY (FALSE);
-    bool_t selected = entry->selected;
-    RETURN (selected);
-}
-
-int playlist_selected_count (int playlist_num)
-{
-    ENTER_GET_PLAYLIST (0);
-    int selected_count = playlist->selected_count;
-    RETURN (selected_count);
-}
-
-void playlist_select_all (int playlist_num, bool_t selected)
-{
-    ENTER_GET_PLAYLIST ();
-
-    int entries = index_count (playlist->entries);
-    int first = entries, last = 0;
-
-    for (int count = 0; count < entries; count ++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-
-        if ((selected && ! entry->selected) || (entry->selected && ! selected))
-        {
-            entry->selected = selected;
-            first = MIN (first, entry->number);
-            last = entry->number;
-        }
-    }
-
-    if (selected)
-    {
-        playlist->selected_count = entries;
-        playlist->selected_length = playlist->total_length;
-    }
-    else
-    {
-        playlist->selected_count = 0;
-        playlist->selected_length = 0;
-    }
-
-    if (first < entries)
-        queue_update (PLAYLIST_UPDATE_SELECTION, playlist->number, first, last + 1 - first);
-
-    LEAVE;
-}
-
-int playlist_shift (int playlist_num, int entry_num, int distance)
-{
-    ENTER_GET_ENTRY (0);
-
-    if (! entry->selected || ! distance)
-        RETURN (0);
-
-    int entries = index_count (playlist->entries);
-    int shift = 0, center, top, bottom;
-
-    if (distance < 0)
-    {
-        for (center = entry_num; center > 0 && shift > distance; )
-        {
-            entry = index_get (playlist->entries, -- center);
-            if (! entry->selected)
-                shift --;
-        }
-    }
-    else
-    {
-        for (center = entry_num + 1; center < entries && shift < distance; )
-        {
-            entry = index_get (playlist->entries, center ++);
-            if (! entry->selected)
-                shift ++;
-        }
-    }
-
-    top = bottom = center;
-
-    for (int i = 0; i < top; i ++)
-    {
-        entry = index_get (playlist->entries, i);
-        if (entry->selected)
-            top = i;
-    }
-
-    for (int i = entries; i > bottom; i --)
-    {
-        entry = index_get (playlist->entries, i - 1);
-        if (entry->selected)
-            bottom = i;
-    }
-
-    Index * temp = index_new ();
-
-    for (int i = top; i < center; i ++)
-    {
-        entry = index_get (playlist->entries, i);
-        if (! entry->selected)
-            index_insert (temp, -1, entry);
-    }
-
-    for (int i = top; i < bottom; i ++)
-    {
-        entry = index_get (playlist->entries, i);
-        if (entry->selected)
-            index_insert (temp, -1, entry);
-    }
-
-    for (int i = center; i < bottom; i ++)
-    {
-        entry = index_get (playlist->entries, i);
-        if (! entry->selected)
-            index_insert (temp, -1, entry);
-    }
-
-    index_copy_set (temp, 0, playlist->entries, top, bottom - top);
-
-    number_entries (playlist, top, bottom - top);
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, playlist->number, top, bottom - top);
-
-    RETURN (shift);
-}
-
-static Entry * find_unselected_focus (Playlist * playlist)
-{
-    if (! playlist->focus || ! playlist->focus->selected)
-        return playlist->focus;
-
-    int entries = index_count (playlist->entries);
-
-    for (int search = playlist->focus->number + 1; search < entries; search ++)
-    {
-        Entry * entry = index_get (playlist->entries, search);
-        if (! entry->selected)
-            return entry;
-    }
-
-    for (int search = playlist->focus->number; search --;)
-    {
-        Entry * entry = index_get (playlist->entries, search);
-        if (! entry->selected)
-            return entry;
-    }
-
-    return NULL;
-}
-
-void playlist_delete_selected (int playlist_num)
-{
-    ENTER_GET_PLAYLIST ();
-
-    if (! playlist->selected_count)
-        RETURN ();
-
-    int entries = index_count (playlist->entries);
-    bool_t position_changed = FALSE;
-    bool_t was_playing = FALSE;
-    bool_t can_play = FALSE;
-
-    Index * others = index_new ();
-    index_allocate (others, entries - playlist->selected_count);
-
-    if (playlist->position && playlist->position->selected)
-    {
-        position_changed = TRUE;
-        was_playing = (playlist == playing_playlist);
-
-        set_position (playlist, NULL, FALSE);
-    }
-
-    playlist->focus = find_unselected_focus (playlist);
-
-    int before = 0, after = 0;
-    bool_t found = FALSE;
-
-    for (int count = 0; count < entries; count++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-
-        if (entry->selected)
-        {
-            if (entry->queued)
-                playlist->queued = g_list_remove (playlist->queued, entry);
-
-            playlist->total_length -= entry->length;
-            entry_free (entry);
-
-            found = TRUE;
-            after = 0;
-        }
-        else
-        {
-            index_insert (others, -1, entry);
-
-            if (found)
-                after ++;
-            else
-                before ++;
-        }
-    }
-
-    index_free (playlist->entries);
-    playlist->entries = others;
-
-    playlist->selected_count = 0;
-    playlist->selected_length = 0;
-
-    entries = index_count (playlist->entries);
-    number_entries (playlist, before, entries - before);
-
-    if (position_changed && get_bool (NULL, "advance_on_delete"))
-        can_play = next_song_locked (playlist, get_bool (NULL, "repeat"), entries - after);
-
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, playlist->number, before, entries - after - before);
-    LEAVE;
-
-    if (position_changed)
-        hook_call ("playlist position", GINT_TO_POINTER (playlist_num));
-    if (was_playing)
-        change_playback (can_play);
-}
-
-void playlist_reverse (int playlist_num)
-{
-    ENTER_GET_PLAYLIST ();
-
-    int entries = index_count (playlist->entries);
-
-    Index * reversed = index_new ();
-    index_allocate (reversed, entries);
-
-    for (int count = entries; count --; )
-        index_insert (reversed, -1, index_get (playlist->entries, count));
-
-    index_free (playlist->entries);
-    playlist->entries = reversed;
-
-    number_entries (playlist, 0, entries);
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, playlist->number, 0, entries);
-    LEAVE;
-}
-
-void playlist_reverse_selected (int playlist_num)
-{
-    ENTER_GET_PLAYLIST ();
-
-    int entries = index_count (playlist->entries);
-
-    Index * reversed = index_new ();
-    index_allocate (reversed, playlist->selected_count);
-
-    for (int count = entries; count --; )
-    {
-        Entry * entry = index_get (playlist->entries, count);
-        if (entry->selected)
-            index_insert (reversed, -1, index_get (playlist->entries, count));
-    }
-
-    int count2 = 0;
-    for (int count = 0; count < entries; count++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-        if (entry->selected)
-            index_set (playlist->entries, count, index_get (reversed, count2 ++));
-    }
-
-    index_free (reversed);
-
-    number_entries (playlist, 0, entries);
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, playlist->number, 0, entries);
-    LEAVE;
-}
-
-void playlist_randomize (int playlist_num)
-{
-    ENTER_GET_PLAYLIST ();
-
-    int entries = index_count (playlist->entries);
-
-    for (int i = 0; i < entries; i ++)
-    {
-        int j = i + rand () % (entries - i);
-
-        Entry * entry = index_get (playlist->entries, j);
-        index_set (playlist->entries, j, index_get (playlist->entries, i));
-        index_set (playlist->entries, i, entry);
-    }
-
-    number_entries (playlist, 0, entries);
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, playlist->number, 0, entries);
-    LEAVE;
-}
-
-void playlist_randomize_selected (int playlist_num)
-{
-    ENTER_GET_PLAYLIST ();
-
-    int entries = index_count (playlist->entries);
-
-    Index * selected = index_new ();
-    index_allocate (selected, playlist->selected_count);
-
-    for (int count = 0; count < entries; count++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-        if (entry->selected)
-            index_insert (selected, -1, entry);
-    }
-
-    for (int i = 0; i < playlist->selected_count; i ++)
-    {
-        int j = i + rand () % (playlist->selected_count - i);
-
-        Entry * entry = index_get (selected, j);
-        index_set (selected, j, index_get (selected, i));
-        index_set (selected, i, entry);
-    }
-
-    int count2 = 0;
-    for (int count = 0; count < entries; count++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-        if (entry->selected)
-            index_set (playlist->entries, count, index_get (selected, count2 ++));
-    }
-
-    index_free (selected);
-
-    number_entries (playlist, 0, entries);
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, playlist->number, 0, entries);
-    LEAVE;
-}
-
-enum {COMPARE_TYPE_FILENAME, COMPARE_TYPE_TUPLE, COMPARE_TYPE_TITLE};
-
-typedef int (* CompareFunc) (const void * a, const void * b);
-
-typedef struct {
-    int type;
-    CompareFunc func;
-} CompareData;
-
-static int compare_cb (const void * _a, const void * _b, void * _data)
-{
-    const Entry * a = _a, * b = _b;
-    CompareData * data = _data;
-
-    int diff = 0;
-
-    if (data->type == COMPARE_TYPE_FILENAME)
-        diff = data->func (a->filename, b->filename);
-    else if (data->type == COMPARE_TYPE_TUPLE)
-        diff = data->func (a->tuple, b->tuple);
-    else if (data->type == COMPARE_TYPE_TITLE)
-        diff = data->func (a->formatted ? a->formatted : a->filename,
-         b->formatted ? b->formatted : b->filename);
-
-    if (diff)
-        return diff;
-
-    /* preserve order of "equal" entries */
-    return a->number - b->number;
-}
-
-static void sort (Playlist * playlist, CompareData * data)
-{
-    index_sort_with_data (playlist->entries, compare_cb, data);
-    number_entries (playlist, 0, index_count (playlist->entries));
-
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, playlist->number, 0, index_count (playlist->entries));
-}
-
-static void sort_selected (Playlist * playlist, CompareData * data)
-{
-    int entries = index_count (playlist->entries);
-
-    Index * selected = index_new ();
-    index_allocate (selected, playlist->selected_count);
-
-    for (int count = 0; count < entries; count++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-        if (entry->selected)
-            index_insert (selected, -1, entry);
-    }
-
-    index_sort_with_data (selected, compare_cb, data);
-
-    int count2 = 0;
-    for (int count = 0; count < entries; count++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-        if (entry->selected)
-            index_set (playlist->entries, count, index_get (selected, count2 ++));
-    }
-
-    index_free (selected);
-
-    number_entries (playlist, 0, entries);
-    queue_update (PLAYLIST_UPDATE_STRUCTURE, playlist->number, 0, entries);
-}
-
-static bool_t entries_are_scanned (Playlist * playlist, bool_t selected)
-{
-    int entries = index_count (playlist->entries);
-    for (int count = 0; count < entries; count ++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-        if (selected && ! entry->selected)
-            continue;
-
-        if (! entry->tuple)
-        {
-            interface_show_error (_("The playlist cannot be sorted because "
-             "metadata scanning is still in progress (or has been disabled)."));
-            return FALSE;
-        }
-    }
-
-    return TRUE;
-}
-
-void playlist_sort_by_filename (int playlist_num, int (* compare)
- (const char * a, const char * b))
-{
-    ENTER_GET_PLAYLIST ();
-
-    CompareData data = {COMPARE_TYPE_FILENAME, (CompareFunc) compare};
-    sort (playlist, & data);
-
-    LEAVE;
-}
-
-void playlist_sort_by_tuple (int playlist_num, int (* compare)
- (const Tuple * a, const Tuple * b))
-{
-    ENTER_GET_PLAYLIST ();
-
-    CompareData data = {COMPARE_TYPE_TUPLE, (CompareFunc) compare};
-    if (entries_are_scanned (playlist, FALSE))
-        sort (playlist, & data);
-
-    LEAVE;
-}
-
-void playlist_sort_by_title (int playlist_num, int (* compare) (const char *
- a, const char * b))
-{
-    ENTER_GET_PLAYLIST ();
-
-    CompareData data = {COMPARE_TYPE_TITLE, (CompareFunc) compare};
-    if (entries_are_scanned (playlist, FALSE))
-        sort (playlist, & data);
-
-    LEAVE;
-}
-
-void playlist_sort_selected_by_filename (int playlist_num, int (* compare)
- (const char * a, const char * b))
-{
-    ENTER_GET_PLAYLIST ();
-
-    CompareData data = {COMPARE_TYPE_FILENAME, (CompareFunc) compare};
-    sort_selected (playlist, & data);
-
-    LEAVE;
-}
-
-void playlist_sort_selected_by_tuple (int playlist_num, int (* compare)
- (const Tuple * a, const Tuple * b))
-{
-    ENTER_GET_PLAYLIST ();
-
-    CompareData data = {COMPARE_TYPE_TUPLE, (CompareFunc) compare};
-    if (entries_are_scanned (playlist, TRUE))
-        sort_selected (playlist, & data);
-
-    LEAVE;
-}
-
-void playlist_sort_selected_by_title (int playlist_num, int (* compare)
- (const char * a, const char * b))
-{
-    ENTER_GET_PLAYLIST ();
-
-    CompareData data = {COMPARE_TYPE_TITLE, (CompareFunc) compare};
-    if (entries_are_scanned (playlist, TRUE))
-        sort_selected (playlist, & data);
-
-    LEAVE;
-}
-
-void playlist_reformat_titles (void)
-{
-    ENTER;
-
-    if (title_formatter)
-        tuple_formatter_free (title_formatter);
-
-    char * format = get_str (NULL, "generic_title_format");
-    title_formatter = tuple_formatter_new (format);
-    str_unref (format);
-
-    for (int playlist_num = 0; playlist_num < index_count (playlists); playlist_num ++)
-    {
-        Playlist * playlist = index_get (playlists, playlist_num);
-        int entries = index_count (playlist->entries);
-
-        for (int count = 0; count < entries; count++)
-        {
-            Entry * entry = index_get (playlist->entries, count);
-            str_unref (entry->formatted);
-
-            if (entry->tuple)
-                entry->formatted = tuple_format_title (title_formatter, entry->tuple);
-            else
-                entry->formatted = NULL;
-        }
-
-        queue_update (PLAYLIST_UPDATE_METADATA, playlist_num, 0, entries);
-    }
-
-    LEAVE;
-}
-
-void playlist_trigger_scan (void)
-{
-    ENTER;
-
-    for (int i = 0; i < index_count (playlists); i ++)
-    {
-        Playlist * p = index_get (playlists, i);
-        p->scanning = TRUE;
-    }
-
-    scan_restart ();
-
-    LEAVE;
-}
-
-static void playlist_rescan_real (int playlist_num, bool_t selected)
-{
-    ENTER_GET_PLAYLIST ();
-
-    int entries = index_count (playlist->entries);
-
-    for (int count = 0; count < entries; count ++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-        if (! selected || entry->selected)
-            entry_set_tuple (playlist, entry, NULL);
-    }
-
-    queue_update (PLAYLIST_UPDATE_METADATA, playlist->number, 0, entries);
-    LEAVE;
-}
-
-void playlist_rescan (int playlist_num)
-{
-    playlist_rescan_real (playlist_num, FALSE);
-}
-
-void playlist_rescan_selected (int playlist_num)
-{
-    playlist_rescan_real (playlist_num, TRUE);
-}
-
-void playlist_rescan_file (const char * filename)
-{
-    ENTER;
-
-    int num_playlists = index_count (playlists);
-
-    for (int playlist_num = 0; playlist_num < num_playlists; playlist_num ++)
-    {
-        Playlist * playlist = index_get (playlists, playlist_num);
-        int num_entries = index_count (playlist->entries);
-
-        for (int entry_num = 0; entry_num < num_entries; entry_num ++)
-        {
-            Entry * entry = index_get (playlist->entries, entry_num);
-
-            if (! strcmp (entry->filename, filename))
-            {
-                entry_set_tuple (playlist, entry, NULL);
-                queue_update (PLAYLIST_UPDATE_METADATA, playlist_num, entry_num, 1);
-            }
-        }
-    }
-
-    LEAVE;
-}
-
-int64_t playlist_get_total_length (int playlist_num)
-{
-    ENTER_GET_PLAYLIST (0);
-    int64_t length = playlist->total_length;
-    RETURN (length);
-}
-
-int64_t playlist_get_selected_length (int playlist_num)
-{
-    ENTER_GET_PLAYLIST (0);
-    int64_t length = playlist->selected_length;
-    RETURN (length);
-}
-
-int playlist_queue_count (int playlist_num)
-{
-    ENTER_GET_PLAYLIST (0);
-    int count = g_list_length (playlist->queued);
-    RETURN (count);
-}
-
-void playlist_queue_insert (int playlist_num, int at, int entry_num)
-{
-    ENTER_GET_ENTRY ();
-
-    if (entry->queued)
-        RETURN ();
-
-    if (at < 0)
-        playlist->queued = g_list_append (playlist->queued, entry);
-    else
-        playlist->queued = g_list_insert (playlist->queued, entry, at);
-
-    entry->queued = TRUE;
-
-    queue_update (PLAYLIST_UPDATE_SELECTION, playlist->number, entry_num, 1);
-    LEAVE;
-}
-
-void playlist_queue_insert_selected (int playlist_num, int at)
-{
-    ENTER_GET_PLAYLIST ();
-
-    int entries = index_count(playlist->entries);
-    int first = entries, last = 0;
-
-    for (int count = 0; count < entries; count++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-
-        if (! entry->selected || entry->queued)
-            continue;
-
-        if (at < 0)
-            playlist->queued = g_list_append (playlist->queued, entry);
-        else
-            playlist->queued = g_list_insert (playlist->queued, entry, at++);
-
-        entry->queued = TRUE;
-        first = MIN (first, entry->number);
-        last = entry->number;
-    }
-
-    if (first < entries)
-        queue_update (PLAYLIST_UPDATE_SELECTION, playlist->number, first, last + 1 - first);
-
-    LEAVE;
-}
-
-int playlist_queue_get_entry (int playlist_num, int at)
-{
-    ENTER_GET_PLAYLIST (-1);
-
-    GList * node = g_list_nth (playlist->queued, at);
-    int entry_num = node ? ((Entry *) node->data)->number : -1;
-
-    RETURN (entry_num);
-}
-
-int playlist_queue_find_entry (int playlist_num, int entry_num)
-{
-    ENTER_GET_ENTRY (-1);
-    int pos = entry->queued ? g_list_index (playlist->queued, entry) : -1;
-    RETURN (pos);
-}
-
-void playlist_queue_delete (int playlist_num, int at, int number)
-{
-    ENTER_GET_PLAYLIST ();
-
-    int entries = index_count (playlist->entries);
-    int first = entries, last = 0;
-
-    if (at == 0)
-    {
-        while (playlist->queued && number --)
-        {
-            Entry * entry = playlist->queued->data;
-            entry->queued = FALSE;
-            first = MIN (first, entry->number);
-            last = entry->number;
-
-            playlist->queued = g_list_delete_link (playlist->queued, playlist->queued);
-        }
-    }
-    else
-    {
-        GList * anchor = g_list_nth (playlist->queued, at - 1);
-        if (! anchor)
-            goto DONE;
-
-        while (anchor->next && number --)
-        {
-            Entry * entry = anchor->next->data;
-            entry->queued = FALSE;
-            first = MIN (first, entry->number);
-            last = entry->number;
-
-            playlist->queued = g_list_delete_link (playlist->queued, anchor->next);
-        }
-    }
-
-DONE:
-    if (first < entries)
-        queue_update (PLAYLIST_UPDATE_SELECTION, playlist->number, first, last + 1 - first);
-
-    LEAVE;
-}
-
-void playlist_queue_delete_selected (int playlist_num)
-{
-    ENTER_GET_PLAYLIST ();
-
-    int entries = index_count (playlist->entries);
-    int first = entries, last = 0;
-
-    for (GList * node = playlist->queued; node; )
-    {
-        GList * next = node->next;
-        Entry * entry = node->data;
-
-        if (entry->selected)
-        {
-            entry->queued = FALSE;
-            playlist->queued = g_list_delete_link (playlist->queued, node);
-            first = MIN (first, entry->number);
-            last = entry->number;
-        }
-
-        node = next;
-    }
-
-    if (first < entries)
-        queue_update (PLAYLIST_UPDATE_SELECTION, playlist->number, first, last + 1 - first);
-
-    LEAVE;
-}
-
-static bool_t shuffle_prev (Playlist * playlist)
-{
-    int entries = index_count (playlist->entries);
-    Entry * found = NULL;
-
-    for (int count = 0; count < entries; count ++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-
-        if (entry->shuffle_num && (! playlist->position ||
-         entry->shuffle_num < playlist->position->shuffle_num) && (! found
-         || entry->shuffle_num > found->shuffle_num))
-            found = entry;
-    }
-
-    if (! found)
-        return FALSE;
-
-    set_position (playlist, found, FALSE);
-    return TRUE;
-}
-
-bool_t playlist_prev_song (int playlist_num)
-{
-    ENTER_GET_PLAYLIST (FALSE);
-
-    bool_t was_playing = (playlist == playing_playlist);
-
-    if (get_bool (NULL, "shuffle"))
-    {
-        if (! shuffle_prev (playlist))
-            RETURN (FALSE);
-    }
-    else
-    {
-        if (! playlist->position || playlist->position->number == 0)
-            RETURN (FALSE);
-
-        set_position (playlist, index_get (playlist->entries,
-         playlist->position->number - 1), TRUE);
-    }
-
-    LEAVE;
-
-    hook_call ("playlist position", GINT_TO_POINTER (playlist_num));
-    if (was_playing)
-        change_playback (TRUE);
-
-    return TRUE;
-}
-
-static bool_t shuffle_next (Playlist * playlist)
-{
-    int entries = index_count (playlist->entries), choice = 0, count;
-    Entry * found = NULL;
-
-    for (count = 0; count < entries; count ++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-
-        if (! entry->shuffle_num)
-            choice ++;
-        else if (playlist->position && entry->shuffle_num >
-         playlist->position->shuffle_num && (! found || entry->shuffle_num
-         < found->shuffle_num))
-            found = entry;
-    }
-
-    if (found)
-    {
-        set_position (playlist, found, FALSE);
-        return TRUE;
-    }
-
-    if (! choice)
-        return FALSE;
-
-    choice = rand () % choice;
-
-    for (count = 0; ; count ++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-
-        if (! entry->shuffle_num)
-        {
-            if (! choice)
-            {
-                set_position (playlist, entry, TRUE);
-                return TRUE;
-            }
-
-            choice --;
-        }
-    }
-}
-
-static void shuffle_reset (Playlist * playlist)
-{
-    int entries = index_count (playlist->entries);
-
-    playlist->last_shuffle_num = 0;
-
-    for (int count = 0; count < entries; count ++)
-    {
-        Entry * entry = index_get (playlist->entries, count);
-        entry->shuffle_num = 0;
-    }
-}
-
-static bool_t next_song_locked (Playlist * playlist, bool_t repeat, int hint)
-{
-    int entries = index_count (playlist->entries);
-    if (! entries)
-        return FALSE;
-
-    if (playlist->queued)
-    {
-        set_position (playlist, playlist->queued->data, TRUE);
-        playlist->queued = g_list_remove (playlist->queued, playlist->position);
-        playlist->position->queued = FALSE;
-    }
-    else if (get_bool (NULL, "shuffle"))
-    {
-        if (! shuffle_next (playlist))
-        {
-            if (! repeat)
-                return FALSE;
-
-            shuffle_reset (playlist);
-
-            if (! shuffle_next (playlist))
-                return FALSE;
-        }
-    }
-    else
-    {
-        if (hint >= entries)
-        {
-            if (! repeat)
-                return FALSE;
-
-            hint = 0;
-        }
-
-        set_position (playlist, index_get (playlist->entries, hint), TRUE);
-    }
-
-    return TRUE;
-}
-
-bool_t playlist_next_song (int playlist_num, bool_t repeat)
-{
-    ENTER_GET_PLAYLIST (FALSE);
-
-    int hint = playlist->position ? playlist->position->number + 1 : 0;
-    bool_t was_playing = (playlist == playing_playlist);
-
-    if (! next_song_locked (playlist, repeat, hint))
-        RETURN (FALSE);
-
-    LEAVE;
-
-    hook_call ("playlist position", GINT_TO_POINTER (playlist_num));
-    if (was_playing)
-        change_playback (TRUE);
-
-    return TRUE;
-}
-
-int playback_entry_get_position (void)
-{
-    ENTER;
-
-    Entry * entry = get_playback_entry (FALSE, FALSE);
-    int entry_num = entry ? entry->number : -1;
-
-    RETURN (entry_num);
-}
-
-char * playback_entry_get_filename (void)
-{
-    ENTER;
-
-    Entry * entry = get_playback_entry (FALSE, FALSE);
-    char * filename = entry ? str_ref (entry->filename) : NULL;
-
-    RETURN (filename);
-}
-
-PluginHandle * playback_entry_get_decoder (void)
-{
-    ENTER;
-
-    Entry * entry = get_playback_entry (TRUE, FALSE);
-    PluginHandle * decoder = entry ? entry->decoder : NULL;
-
-    RETURN (decoder);
-}
-
-Tuple * playback_entry_get_tuple (void)
-{
-    ENTER;
-
-    Entry * entry = get_playback_entry (FALSE, TRUE);
-    Tuple * tuple = entry ? entry->tuple : NULL;
-
-    if (tuple)
-        tuple_ref (tuple);
-
-    RETURN (tuple);
-}
-
-char * playback_entry_get_title (void)
-{
-    ENTER;
-
-    Entry * entry = get_playback_entry (FALSE, TRUE);
-    char * title = entry ? str_ref (entry->formatted ? entry->formatted : entry->title) : NULL;
-
-    RETURN (title);
-}
-
-int playback_entry_get_length (void)
-{
-    ENTER;
-
-    Entry * entry = get_playback_entry (FALSE, TRUE);
-    int length = entry ? entry->length : 0;
-
-    RETURN (length);
-}
-
-void playback_entry_set_tuple (Tuple * tuple)
-{
-    ENTER;
-    if (! playing_playlist || ! playing_playlist->position)
-        RETURN ();
-
-    Entry * entry = playing_playlist->position;
-    entry_set_tuple (playing_playlist, entry, tuple);
-
-    queue_update (PLAYLIST_UPDATE_METADATA, playing_playlist->number, entry->number, 1);
-    LEAVE;
-}
-
-void playlist_save_state (void)
-{
-    /* get playback state before locking playlists */
-    bool_t paused = drct_get_paused ();
-    int time = drct_get_time ();
-
-    ENTER;
-
-    const char * user_dir = get_path (AUD_PATH_USER_DIR);
-    SCONCAT2 (path, user_dir, "/" STATE_FILE);
-
-    FILE * handle = g_fopen (path, "w");
-    if (! handle)
-        RETURN ();
-
-    fprintf (handle, "active %d\n", active_playlist ? active_playlist->number : -1);
-    fprintf (handle, "playing %d\n", playing_playlist ? playing_playlist->number : -1);
-
-    for (int playlist_num = 0; playlist_num < index_count (playlists);
-     playlist_num ++)
-    {
-        Playlist * playlist = index_get (playlists, playlist_num);
-
-        fprintf (handle, "playlist %d\n", playlist_num);
-
-        if (playlist->filename)
-            fprintf (handle, "filename %s\n", playlist->filename);
-
-        fprintf (handle, "position %d\n", playlist->position ? playlist->position->number : -1);
-
-        if (playlist == playing_playlist)
-        {
-            playlist->resume_paused = paused;
-            playlist->resume_time = time;
-        }
-
-        fprintf (handle, "resume-state %d\n", paused ? RESUME_PAUSE : RESUME_PLAY);
-        fprintf (handle, "resume-time %d\n", playlist->resume_time);
-    }
-
-    fclose (handle);
-    LEAVE;
-}
-
-static char parse_key[512];
-static char * parse_value;
-
-static void parse_next (FILE * handle)
-{
-    parse_value = NULL;
-
-    if (! fgets (parse_key, sizeof parse_key, handle))
-        return;
-
-    char * space = strchr (parse_key, ' ');
-    if (! space)
-        return;
-
-    * space = 0;
-    parse_value = space + 1;
-
-    char * newline = strchr (parse_value, '\n');
-    if (newline)
-        * newline = 0;
-}
-
-static bool_t parse_integer (const char * key, int * value)
-{
-    return (parse_value && ! strcmp (parse_key, key) && sscanf (parse_value, "%d", value) == 1);
-}
-
-static char * parse_string (const char * key)
-{
-    return (parse_value && ! strcmp (parse_key, key)) ? str_get (parse_value) : NULL;
-}
-
-void playlist_load_state (void)
-{
-    ENTER;
-    int playlist_num;
-
-    const char * user_dir = get_path (AUD_PATH_USER_DIR);
-    SCONCAT2 (path, user_dir, "/" STATE_FILE);
-
-    FILE * handle = g_fopen (path, "r");
-    if (! handle)
-        RETURN ();
-
-    parse_next (handle);
-
-    if (parse_integer ("active", & playlist_num))
-    {
-        if (! (active_playlist = lookup_playlist (playlist_num)))
-            active_playlist = index_get (playlists, 0);
-        parse_next (handle);
-    }
-
-    if (parse_integer ("playing", & resume_playlist))
-        parse_next (handle);
-
-    while (parse_integer ("playlist", & playlist_num) && playlist_num >= 0 &&
-     playlist_num < index_count (playlists))
-    {
-        Playlist * playlist = index_get (playlists, playlist_num);
-        int entries = index_count (playlist->entries);
-
-        parse_next (handle);
-
-        char * s;
-        if ((s = parse_string ("filename")))
-        {
-            str_unref (playlist->filename);
-            playlist->filename = s;
-            parse_next (handle);
-        }
-
-        int position = -1;
-        if (parse_integer ("position", & position))
-            parse_next (handle);
-
-        if (position >= 0 && position < entries)
-            set_position (playlist, index_get (playlist->entries, position), TRUE);
-
-        int resume_state = RESUME_PLAY;
-        if (parse_integer ("resume-state", & resume_state))
-            parse_next (handle);
-
-        playlist->resume_paused = (resume_state == RESUME_PAUSE);
-
-        if (parse_integer ("resume-time", & playlist->resume_time))
-            parse_next (handle);
-
-        /* compatibility with Audacious 3.3 */
-        if (playlist_num == resume_playlist && resume_state == RESUME_STOP)
-            resume_playlist = -1;
-    }
-
-    fclose (handle);
-
-    /* clear updates queued during init sequence */
-
-    for (int i = 0; i < index_count (playlists); i ++)
-    {
-        Playlist * p = index_get (playlists, i);
-        memset (& p->last_update, 0, sizeof (Update));
-        memset (& p->next_update, 0, sizeof (Update));
-    }
-
-    update_level = 0;
-
-    if (update_source)
-    {
-        g_source_remove (update_source);
-        update_source = 0;
-    }
-
-    LEAVE;
-}
-
-void playlist_resume (void)
-{
-    playlist_set_playing (resume_playlist);
-}
diff --git a/src/audacious/playlist-utils.c b/src/audacious/playlist-utils.c
deleted file mode 100644
index c51dfa23e18d..000000000000
--- a/src/audacious/playlist-utils.c
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- * playlist-utils.c
- * Copyright 2009-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-#include <glib/gstdio.h>
-
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-
-#include "misc.h"
-#include "playlist.h"
-
-static const char * get_basename (const char * filename)
-{
-    const char * slash = strrchr (filename, '/');
-
-    return (slash == NULL) ? filename : slash + 1;
-}
-
-static int filename_compare_basename (const char * a, const char * b)
-{
-    return str_compare_encoded (get_basename (a), get_basename (b));
-}
-
-static int tuple_compare_string (const Tuple * a, const Tuple * b, int field)
-{
-    char * string_a = tuple_get_str (a, field);
-    char * string_b = tuple_get_str (b, field);
-    int ret;
-
-    if (string_a == NULL)
-        ret = (string_b == NULL) ? 0 : -1;
-    else if (string_b == NULL)
-        ret = 1;
-    else
-        ret = str_compare (string_a, string_b);
-
-    str_unref (string_a);
-    str_unref (string_b);
-    return ret;
-}
-
-static int tuple_compare_int (const Tuple * a, const Tuple * b, int field)
-{
-    if (tuple_get_value_type (a, field) != TUPLE_INT)
-        return (tuple_get_value_type (b, field) != TUPLE_INT) ? 0 : -1;
-    if (tuple_get_value_type (b, field) != TUPLE_INT)
-        return 1;
-
-    int int_a = tuple_get_int (a, field);
-    int int_b = tuple_get_int (b, field);
-
-    return (int_a < int_b) ? -1 : (int_a > int_b);
-}
-
-static int tuple_compare_title (const Tuple * a, const Tuple * b)
-{
-    return tuple_compare_string (a, b, FIELD_TITLE);
-}
-
-static int tuple_compare_album (const Tuple * a, const Tuple * b)
-{
-    return tuple_compare_string (a, b, FIELD_ALBUM);
-}
-
-static int tuple_compare_artist (const Tuple * a, const Tuple * b)
-{
-    return tuple_compare_string (a, b, FIELD_ARTIST);
-}
-
-static int tuple_compare_date (const Tuple * a, const Tuple * b)
-{
-    return tuple_compare_int (a, b, FIELD_YEAR);
-}
-
-static int tuple_compare_track (const Tuple * a, const Tuple * b)
-{
-    return tuple_compare_int (a, b, FIELD_TRACK_NUMBER);
-}
-
-static int tuple_compare_length (const Tuple * a, const Tuple * b)
-{
-    return tuple_compare_int (a, b, FIELD_LENGTH);
-}
-
-static const PlaylistStringCompareFunc filename_comparisons[] = {
- [PLAYLIST_SORT_PATH] = str_compare_encoded,
- [PLAYLIST_SORT_FILENAME] = filename_compare_basename,
- [PLAYLIST_SORT_TITLE] = NULL,
- [PLAYLIST_SORT_ALBUM] = NULL,
- [PLAYLIST_SORT_ARTIST] = NULL,
- [PLAYLIST_SORT_DATE] = NULL,
- [PLAYLIST_SORT_TRACK] = NULL,
- [PLAYLIST_SORT_FORMATTED_TITLE] = NULL,
- [PLAYLIST_SORT_LENGTH] = NULL};
-
-static const PlaylistTupleCompareFunc tuple_comparisons[] = {
- [PLAYLIST_SORT_PATH] = NULL,
- [PLAYLIST_SORT_FILENAME] = NULL,
- [PLAYLIST_SORT_TITLE] = tuple_compare_title,
- [PLAYLIST_SORT_ALBUM] = tuple_compare_album,
- [PLAYLIST_SORT_ARTIST] = tuple_compare_artist,
- [PLAYLIST_SORT_DATE] = tuple_compare_date,
- [PLAYLIST_SORT_TRACK] = tuple_compare_track,
- [PLAYLIST_SORT_FORMATTED_TITLE] = NULL,
- [PLAYLIST_SORT_LENGTH] = tuple_compare_length};
-
-static const PlaylistStringCompareFunc title_comparisons[] = {
- [PLAYLIST_SORT_PATH] = NULL,
- [PLAYLIST_SORT_FILENAME] = NULL,
- [PLAYLIST_SORT_TITLE] = NULL,
- [PLAYLIST_SORT_ALBUM] = NULL,
- [PLAYLIST_SORT_ARTIST] = NULL,
- [PLAYLIST_SORT_DATE] = NULL,
- [PLAYLIST_SORT_TRACK] = NULL,
- [PLAYLIST_SORT_FORMATTED_TITLE] = str_compare,
- [PLAYLIST_SORT_LENGTH] = NULL};
-
-void playlist_sort_by_scheme (int playlist, int scheme)
-{
-    if (filename_comparisons[scheme] != NULL)
-        playlist_sort_by_filename (playlist, filename_comparisons[scheme]);
-    else if (tuple_comparisons[scheme] != NULL)
-        playlist_sort_by_tuple (playlist, tuple_comparisons[scheme]);
-    else if (title_comparisons[scheme] != NULL)
-        playlist_sort_by_title (playlist, title_comparisons[scheme]);
-}
-
-void playlist_sort_selected_by_scheme (int playlist, int scheme)
-{
-    if (filename_comparisons[scheme] != NULL)
-        playlist_sort_selected_by_filename (playlist,
-         filename_comparisons[scheme]);
-    else if (tuple_comparisons[scheme] != NULL)
-        playlist_sort_selected_by_tuple (playlist, tuple_comparisons[scheme]);
-    else if (title_comparisons[scheme] != NULL)
-        playlist_sort_selected_by_title (playlist, title_comparisons[scheme]);
-}
-
-/* Fix me:  This considers empty fields as duplicates. */
-void playlist_remove_duplicates_by_scheme (int playlist, int scheme)
-{
-    int entries = playlist_entry_count (playlist);
-    int count;
-
-    if (entries < 1)
-        return;
-
-    playlist_select_all (playlist, FALSE);
-
-    if (filename_comparisons[scheme] != NULL)
-    {
-        int (* compare) (const char * a, const char * b) =
-         filename_comparisons[scheme];
-
-        playlist_sort_by_filename (playlist, compare);
-        char * last = playlist_entry_get_filename (playlist, 0);
-
-        for (count = 1; count < entries; count ++)
-        {
-            char * current = playlist_entry_get_filename (playlist, count);
-
-            if (compare (last, current) == 0)
-                playlist_entry_set_selected (playlist, count, TRUE);
-
-            str_unref (last);
-            last = current;
-        }
-
-        str_unref (last);
-    }
-    else if (tuple_comparisons[scheme] != NULL)
-    {
-        int (* compare) (const Tuple * a, const Tuple * b) =
-         tuple_comparisons[scheme];
-
-        playlist_sort_by_tuple (playlist, compare);
-        Tuple * last = playlist_entry_get_tuple (playlist, 0, FALSE);
-
-        for (count = 1; count < entries; count ++)
-        {
-            Tuple * current = playlist_entry_get_tuple (playlist, count, FALSE);
-
-            if (last != NULL && current != NULL && compare (last, current) == 0)
-                playlist_entry_set_selected (playlist, count, TRUE);
-
-            if (last)
-                tuple_unref (last);
-            last = current;
-        }
-
-        if (last)
-            tuple_unref (last);
-    }
-
-    playlist_delete_selected (playlist);
-}
-
-void playlist_remove_failed (int playlist)
-{
-    int entries = playlist_entry_count (playlist);
-    int count;
-
-    playlist_select_all (playlist, FALSE);
-
-    for (count = 0; count < entries; count ++)
-    {
-        char * filename = playlist_entry_get_filename (playlist, count);
-
-        /* vfs_file_test() only works for file:// URIs currently */
-        if (! strncmp (filename, "file://", 7) && ! vfs_file_test (filename,
-         G_FILE_TEST_EXISTS))
-            playlist_entry_set_selected (playlist, count, TRUE);
-
-        str_unref (filename);
-    }
-
-    playlist_delete_selected (playlist);
-}
-
-void playlist_select_by_patterns (int playlist, const Tuple * patterns)
-{
-    const int fields[] = {FIELD_TITLE, FIELD_ALBUM, FIELD_ARTIST,
-     FIELD_FILE_NAME};
-
-    int entries = playlist_entry_count (playlist);
-    int field, entry;
-
-    playlist_select_all (playlist, TRUE);
-
-    for (field = 0; field < ARRAY_LEN (fields); field ++)
-    {
-        char * pattern = tuple_get_str (patterns, fields[field]);
-        GRegex * regex;
-
-        if (! pattern || ! pattern[0] || ! (regex = g_regex_new (pattern,
-         G_REGEX_CASELESS, 0, NULL)))
-        {
-            str_unref (pattern);
-            continue;
-        }
-
-        for (entry = 0; entry < entries; entry ++)
-        {
-            if (! playlist_entry_get_selected (playlist, entry))
-                continue;
-
-            Tuple * tuple = playlist_entry_get_tuple (playlist, entry, FALSE);
-            char * string = tuple ? tuple_get_str (tuple, fields[field]) : NULL;
-
-            if (! string || ! g_regex_match (regex, string, 0, NULL))
-                playlist_entry_set_selected (playlist, entry, FALSE);
-
-            str_unref (string);
-            if (tuple)
-                tuple_unref (tuple);
-        }
-
-        g_regex_unref (regex);
-        str_unref (pattern);
-    }
-}
-
-static char * make_playlist_path (int playlist)
-{
-    if (! playlist)
-        return filename_build (get_path (AUD_PATH_USER_DIR), "playlist.xspf");
-
-    SPRINTF (name, "playlist_%02d.xspf", 1 + playlist);
-    return filename_build (get_path (AUD_PATH_PLAYLISTS_DIR), name);
-}
-
-static void load_playlists_real (void)
-{
-    const char * folder = get_path (AUD_PATH_PLAYLISTS_DIR);
-
-    /* old (v3.1 and earlier) naming scheme */
-
-    int count;
-    for (count = 0; ; count ++)
-    {
-        char * path = make_playlist_path (count);
-
-        if (! g_file_test (path, G_FILE_TEST_EXISTS))
-        {
-            str_unref (path);
-            break;
-        }
-
-        char * uri = filename_to_uri (path);
-
-        playlist_insert (count);
-        playlist_insert_playlist_raw (count, 0, uri);
-        playlist_set_modified (count, TRUE);
-
-        str_unref (path);
-        str_unref (uri);
-    }
-
-    /* unique ID-based naming scheme */
-
-    char * order_path = filename_build (folder, "order");
-    char * order_string;
-    g_file_get_contents (order_path, & order_string, NULL, NULL);
-    str_unref (order_path);
-
-    if (! order_string)
-        goto DONE;
-
-    Index * order = str_list_to_index (order_string, " ");
-    g_free (order_string);
-
-    for (int i = 0; i < index_count (order); i ++)
-    {
-        char * number = index_get (order, i);
-
-        SCONCAT2 (name, number, ".audpl");
-        char * path = filename_build (folder, name);
-
-        if (! g_file_test (path, G_FILE_TEST_EXISTS))
-        {
-            str_unref (path);
-
-            SCONCAT2 (name2, number, ".xspf");
-            path = filename_build (folder, name2);
-        }
-
-        char * uri = filename_to_uri (path);
-
-        playlist_insert_with_id (count + i, atoi (number));
-        playlist_insert_playlist_raw (count + i, 0, uri);
-        playlist_set_modified (count + i, FALSE);
-
-        if (g_str_has_suffix (path, ".xspf"))
-            playlist_set_modified (count + i, TRUE);
-
-        str_unref (path);
-        str_unref (uri);
-    }
-
-    index_free_full (order, (IndexFreeFunc) str_unref);
-
-DONE:
-    if (! playlist_count ())
-        playlist_insert (0);
-
-    playlist_set_active (0);
-}
-
-static void save_playlists_real (void)
-{
-    int lists = playlist_count ();
-    const char * folder = get_path (AUD_PATH_PLAYLISTS_DIR);
-
-    /* save playlists */
-
-    Index * order = index_new ();
-    GHashTable * saved = g_hash_table_new_full (g_str_hash, g_str_equal,
-     (GDestroyNotify) str_unref, NULL);
-
-    for (int i = 0; i < lists; i ++)
-    {
-        int id = playlist_get_unique_id (i);
-        char * number = int_to_str (id);
-
-        SCONCAT2 (name, number, ".audpl");
-
-        if (playlist_get_modified (i))
-        {
-            char * path = filename_build (folder, name);
-            char * uri = filename_to_uri (path);
-
-            playlist_save (i, uri);
-            playlist_set_modified (i, FALSE);
-
-            str_unref (path);
-            str_unref (uri);
-        }
-
-        index_insert (order, -1, number);
-        g_hash_table_insert (saved, str_get (name), NULL);
-    }
-
-    char * order_string = index_to_str_list (order, " ");
-    index_free_full (order, (IndexFreeFunc) str_unref);
-
-    GError * error = NULL;
-    char * order_path = filename_build (folder, "order");
-
-    char * old_order_string;
-    g_file_get_contents (order_path, & old_order_string, NULL, NULL);
-
-    if (! old_order_string || strcmp (old_order_string, order_string))
-    {
-        if (! g_file_set_contents (order_path, order_string, -1, & error))
-        {
-            fprintf (stderr, "Cannot write to %s: %s\n", order_path, error->message);
-            g_error_free (error);
-        }
-    }
-
-    str_unref (order_string);
-    str_unref (order_path);
-    g_free (old_order_string);
-
-    /* clean up deleted playlists and files from old naming scheme */
-
-    char * path = make_playlist_path (0);
-    g_unlink (path);
-    str_unref (path);
-
-    GDir * dir = g_dir_open (folder, 0, NULL);
-    if (! dir)
-        goto DONE;
-
-    const char * name;
-    while ((name = g_dir_read_name (dir)))
-    {
-        if (! g_str_has_suffix (name, ".audpl") && ! g_str_has_suffix (name, ".xspf"))
-            continue;
-
-        if (! g_hash_table_contains (saved, name))
-        {
-            char * path = filename_build (folder, name);
-            g_unlink (path);
-            str_unref (path);
-        }
-    }
-
-    g_dir_close (dir);
-
-DONE:
-    g_hash_table_destroy (saved);
-}
-
-static bool_t hooks_added, state_changed;
-
-static void update_cb (void * data, void * user)
-{
-    if (GPOINTER_TO_INT (data) < PLAYLIST_UPDATE_METADATA)
-        return;
-
-    state_changed = TRUE;
-}
-
-static void state_cb (void * data, void * user)
-{
-    state_changed = TRUE;
-}
-
-void load_playlists (void)
-{
-    load_playlists_real ();
-    playlist_load_state ();
-
-    state_changed = FALSE;
-
-    if (! hooks_added)
-    {
-        hook_associate ("playlist update", update_cb, NULL);
-        hook_associate ("playlist activate", state_cb, NULL);
-        hook_associate ("playlist position", state_cb, NULL);
-
-        hooks_added = TRUE;
-    }
-}
-
-void save_playlists (bool_t exiting)
-{
-    save_playlists_real ();
-
-    /* on exit, save resume states */
-    if (state_changed || exiting)
-    {
-        playlist_save_state ();
-        state_changed = FALSE;
-    }
-
-    if (exiting && hooks_added)
-    {
-        hook_dissociate ("playlist update", update_cb);
-        hook_dissociate ("playlist activate", state_cb);
-        hook_dissociate ("playlist position", state_cb);
-
-        hooks_added = FALSE;
-    }
-}
diff --git a/src/audacious/playlist.h b/src/audacious/playlist.h
deleted file mode 100644
index d457ea025dbf..000000000000
--- a/src/audacious/playlist.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * playlist.h
- * Copyright 2010-2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_PLAYLIST_H
-#define AUDACIOUS_PLAYLIST_H
-
-#include <stdint.h>
-
-#include <audacious/api.h>
-#include <audacious/types.h>
-#include <libaudcore/index.h>
-#include <libaudcore/tuple.h>
-
-/* The values which can be passed (packed into a pointer) to the "playlist
- * update" hook.  PLAYLIST_UPDATE_SELECTION means that entries have been
- * selected or unselected, or that entries have been added to or removed from
- * the queue.  PLAYLIST_UPDATE_METADATA means that new metadata has been read
- * for some entries, or that the title or filename of a playlist has changed,
- * and implies PLAYLIST_UPDATE_SELECTION.  PLAYLIST_UPDATE_STRUCTURE covers any
- * change not listed under the other types, and implies both
- * PLAYLIST_UPDATE_SELECTION and PLAYLIST_UPDATE_METADATA. */
-enum {
- PLAYLIST_UPDATE_SELECTION = 1,
- PLAYLIST_UPDATE_METADATA,
- PLAYLIST_UPDATE_STRUCTURE};
-
-/* The values which can be passed to playlist_sort_by_scheme(),
- * playlist_sort_selected_by_scheme(), and
- * playlist_remove_duplicates_by_scheme().  PLAYLIST_SORT_PATH means the entire
- * URI of a song file; PLAYLIST_SORT_FILENAME means the portion after the last
- * "/" (forward slash).  PLAYLIST_SORT_DATE means the song's release date (not
- * the file's modification time). */
-enum {
- PLAYLIST_SORT_PATH,
- PLAYLIST_SORT_FILENAME,
- PLAYLIST_SORT_TITLE,
- PLAYLIST_SORT_ALBUM,
- PLAYLIST_SORT_ARTIST,
- PLAYLIST_SORT_DATE,
- PLAYLIST_SORT_TRACK,
- PLAYLIST_SORT_FORMATTED_TITLE,
- PLAYLIST_SORT_LENGTH,
- PLAYLIST_SORT_SCHEMES};
-
-typedef bool_t (* PlaylistFilterFunc) (const char * filename, void * user);
-typedef int (* PlaylistStringCompareFunc) (const char * a, const char * b);
-typedef int (* PlaylistTupleCompareFunc) (const Tuple * a, const Tuple * b);
-
-#define AUD_API_NAME PlaylistAPI
-#define AUD_API_SYMBOL playlist_api
-
-#ifdef _AUDACIOUS_CORE
-
-#include "api-local-begin.h"
-#include "playlist-api.h"
-#include "api-local-end.h"
-
-/* playlist-files.c */
-bool_t playlist_load (const char * filename, char * * title,
- Index * * filenames, Index * * tuples);
-bool_t playlist_insert_playlist_raw (int list, int at,
- const char * filename);
-
-/* playlist-new.c */
-void playlist_init (void);
-void playlist_end (void);
-
-void playlist_insert_with_id (int at, int id);
-void playlist_set_modified (int playlist, bool_t modified);
-bool_t playlist_get_modified (int playlist);
-
-void playlist_load_state (void);
-void playlist_save_state (void);
-void playlist_resume (void);
-
-void playlist_reformat_titles (void);
-void playlist_trigger_scan (void);
-
-void playlist_entry_insert_batch_raw (int playlist, int at,
- Index * filenames, Index * tuples, Index * decoders);
-
-bool_t playlist_prev_song (int playlist);
-bool_t playlist_next_song (int playlist, bool_t repeat);
-
-int playback_entry_get_position (void);
-char * playback_entry_get_filename (void);
-PluginHandle * playback_entry_get_decoder (void);
-Tuple * playback_entry_get_tuple (void);
-char * playback_entry_get_title (void);
-int playback_entry_get_length (void);
-
-void playback_entry_set_tuple (Tuple * tuple);
-
-/* playlist-utils.c */
-void load_playlists (void);
-void save_playlists (bool_t exiting);
-
-#else
-
-#include <audacious/api-define-begin.h>
-#include <audacious/playlist-api.h>
-#include <audacious/api-define-end.h>
-
-#include <audacious/api-alias-begin.h>
-#include <audacious/playlist-api.h>
-#include <audacious/api-alias-end.h>
-
-#endif
-
-#undef AUD_API_NAME
-#undef AUD_API_SYMBOL
-
-#endif
-
-#ifdef AUD_API_DECLARE
-
-#define AUD_API_NAME PlaylistAPI
-#define AUD_API_SYMBOL playlist_api
-
-#include "api-define-begin.h"
-#include "playlist-api.h"
-#include "api-define-end.h"
-
-#include "api-declare-begin.h"
-#include "playlist-api.h"
-#include "api-declare-end.h"
-
-#undef AUD_API_NAME
-#undef AUD_API_SYMBOL
-
-#endif
diff --git a/src/audacious/plugin-init.c b/src/audacious/plugin-init.c
deleted file mode 100644
index b7690e33dc5d..000000000000
--- a/src/audacious/plugin-init.c
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * plugin-init.c
- * Copyright 2010-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <glib.h>
-
-#include "debug.h"
-#include "effect.h"
-#include "general.h"
-#include "interface.h"
-#include "misc.h"
-#include "output.h"
-#include "plugin.h"
-#include "plugins.h"
-#include "ui_preferences.h"
-#include "visualization.h"
-
-static const struct {
-    const char * name;
-    bool_t is_single;
-
-    union {
-        struct {
-            bool_t (* start) (PluginHandle * plugin);
-            void (* stop) (PluginHandle * plugin);
-        } m;
-
-        struct {
-            PluginHandle * (* probe) (void);
-            PluginHandle * (* get_current) (void);
-            bool_t (* set_current) (PluginHandle * plugin);
-        } s;
-    } u;
-} table[PLUGIN_TYPES] = {
- [PLUGIN_TYPE_TRANSPORT] = {"transport",  FALSE, .u.m = {NULL, NULL}},
- [PLUGIN_TYPE_PLAYLIST] = {"playlist",  FALSE, .u.m = {NULL, NULL}},
- [PLUGIN_TYPE_INPUT] = {"input", FALSE, .u.m = {NULL, NULL}},
- [PLUGIN_TYPE_EFFECT] = {"effect", FALSE, .u.m = {effect_plugin_start, effect_plugin_stop}},
- [PLUGIN_TYPE_OUTPUT] = {"output", TRUE, .u.s = {output_plugin_probe,
-  output_plugin_get_current, output_plugin_set_current}},
- [PLUGIN_TYPE_VIS] = {"visualization", FALSE, .u.m = {vis_plugin_start, vis_plugin_stop}},
- [PLUGIN_TYPE_GENERAL] = {"general", FALSE, .u.m = {general_plugin_start, general_plugin_stop}},
- [PLUGIN_TYPE_IFACE] = {"interface", TRUE, .u.s = {iface_plugin_probe,
-  iface_plugin_get_current, iface_plugin_set_current}}};
-
-static bool_t find_enabled_cb (PluginHandle * p, void * pp)
-{
-    * (PluginHandle * *) pp = p;
-    return FALSE;
-}
-
-static PluginHandle * find_enabled (int type)
-{
-    PluginHandle * p = NULL;
-    plugin_for_enabled (type, find_enabled_cb, & p);
-    return p;
-}
-
-static void start_single (int type)
-{
-    PluginHandle * p;
-
-    if ((p = find_enabled (type)) != NULL)
-    {
-        AUDDBG ("Starting selected %s plugin %s.\n", table[type].name,
-         plugin_get_name (p));
-
-        if (table[type].u.s.set_current (p))
-            return;
-
-        AUDDBG ("%s failed to start.\n", plugin_get_name (p));
-        plugin_set_enabled (p, FALSE);
-    }
-
-    AUDDBG ("Probing for %s plugin.\n", table[type].name);
-
-    if ((p = table[type].u.s.probe ()) == NULL)
-    {
-        fprintf (stderr, "FATAL: No %s plugin found.\n"
-         "(Did you forget to install audacious-plugins?)\n", table[type].name);
-        abort ();
-    }
-
-    AUDDBG ("Starting %s.\n", plugin_get_name (p));
-    plugin_set_enabled (p, TRUE);
-
-    if (! table[type].u.s.set_current (p))
-    {
-        fprintf (stderr, "FATAL: %s failed to start.\n", plugin_get_name (p));
-        abort ();
-    }
-}
-
-static bool_t start_multi_cb (PluginHandle * p, void * type)
-{
-    AUDDBG ("Starting %s.\n", plugin_get_name (p));
-
-    if (! table[GPOINTER_TO_INT (type)].u.m.start (p))
-    {
-        AUDDBG ("%s failed to start; disabling.\n", plugin_get_name (p));
-        plugin_set_enabled (p, FALSE);
-    }
-
-    return TRUE;
-}
-
-static void start_plugins (int type)
-{
-    if (type == PLUGIN_TYPE_IFACE && headless_mode ())
-        return;
-
-    if (table[type].is_single)
-        start_single (type);
-    else
-    {
-        if (table[type].u.m.start)
-            plugin_for_enabled (type, start_multi_cb, GINT_TO_POINTER (type));
-    }
-}
-
-static VFSConstructor * lookup_transport (const char * scheme)
-{
-    PluginHandle * plugin = transport_plugin_for_scheme (scheme);
-    if (! plugin)
-        return NULL;
-
-    TransportPlugin * tp = plugin_get_header (plugin);
-    return tp ? tp->vtable : NULL;
-}
-
-void start_plugins_one (void)
-{
-    plugin_system_init ();
-    vfs_set_lookup_func (lookup_transport);
-
-    for (int i = 0; i < PLUGIN_TYPE_GENERAL; i ++)
-        start_plugins (i);
-}
-
-void start_plugins_two (void)
-{
-    for (int i = PLUGIN_TYPE_GENERAL; i < PLUGIN_TYPES; i ++)
-        start_plugins (i);
-}
-
-static bool_t misc_cleanup_cb (PluginHandle * p, void * unused)
-{
-    plugin_misc_cleanup (p);
-    return TRUE;
-}
-
-static bool_t stop_multi_cb (PluginHandle * p, void * type)
-{
-    AUDDBG ("Shutting down %s.\n", plugin_get_name (p));
-    table[GPOINTER_TO_INT (type)].u.m.stop (p);
-    return TRUE;
-}
-
-static void stop_plugins (int type)
-{
-    if (type == PLUGIN_TYPE_IFACE && headless_mode ())
-        return;
-
-    plugin_for_enabled (type, misc_cleanup_cb, GINT_TO_POINTER (type));
-
-    if (table[type].is_single)
-    {
-        AUDDBG ("Shutting down %s.\n", plugin_get_name
-         (table[type].u.s.get_current ()));
-        table[type].u.s.set_current (NULL);
-    }
-    else
-    {
-        if (table[type].u.m.stop)
-            plugin_for_enabled (type, stop_multi_cb, GINT_TO_POINTER (type));
-    }
-}
-
-void stop_plugins_two (void)
-{
-    for (int i = PLUGIN_TYPES - 1; i >= PLUGIN_TYPE_GENERAL; i --)
-        stop_plugins (i);
-}
-
-void stop_plugins_one (void)
-{
-    for (int i = PLUGIN_TYPE_GENERAL - 1; i >= 0; i --)
-        stop_plugins (i);
-
-    vfs_set_lookup_func (NULL);
-    plugin_system_cleanup ();
-}
-
-PluginHandle * plugin_get_current (int type)
-{
-    g_return_val_if_fail (table[type].is_single, NULL);
-    return table[type].u.s.get_current ();
-}
-
-static bool_t enable_single (int type, PluginHandle * p)
-{
-    PluginHandle * old = table[type].u.s.get_current ();
-
-    plugin_misc_cleanup (old);
-
-    AUDDBG ("Switching from %s to %s.\n", plugin_get_name (old),
-     plugin_get_name (p));
-    plugin_set_enabled (old, FALSE);
-    plugin_set_enabled (p, TRUE);
-
-    if (table[type].u.s.set_current (p))
-        return TRUE;
-
-    fprintf (stderr, "%s failed to start; falling back to %s.\n",
-     plugin_get_name (p), plugin_get_name (old));
-    plugin_set_enabled (p, FALSE);
-    plugin_set_enabled (old, TRUE);
-
-    if (table[type].u.s.set_current (old))
-        return FALSE;
-
-    fprintf (stderr, "FATAL: %s failed to start.\n", plugin_get_name (old));
-    abort ();
-}
-
-static bool_t enable_multi (int type, PluginHandle * p, bool_t enable)
-{
-    if (! enable)
-        plugin_misc_cleanup (p);
-
-    AUDDBG ("%sabling %s.\n", enable ? "En" : "Dis", plugin_get_name (p));
-    plugin_set_enabled (p, enable);
-
-    if (enable)
-    {
-        if (table[type].u.m.start && ! table[type].u.m.start (p))
-        {
-            fprintf (stderr, "%s failed to start.\n", plugin_get_name (p));
-            plugin_set_enabled (p, FALSE);
-            return FALSE;
-        }
-    }
-    else
-    {
-        if (table[type].u.m.stop)
-            table[type].u.m.stop (p);
-    }
-
-    return TRUE;
-}
-
-bool_t plugin_enable (PluginHandle * plugin, bool_t enable)
-{
-    if (! enable == ! plugin_get_enabled (plugin))
-        return TRUE;
-
-    int type = plugin_get_type (plugin);
-
-    if (table[type].is_single)
-    {
-        g_return_val_if_fail (enable, FALSE);
-        return enable_single (type, plugin);
-    }
-
-    return enable_multi (type, plugin, enable);
-}
-
-/* Miscellaneous plugin-related functions ... */
-
-PluginHandle * plugin_by_widget (/* GtkWidget * */ void * widget)
-{
-    PluginHandle * p;
-    if ((p = vis_plugin_by_widget (widget)))
-        return p;
-    if ((p = general_plugin_by_widget (widget)))
-        return p;
-    return NULL;
-}
-
-int plugin_send_message (PluginHandle * plugin, const char * code, const void * data, int size)
-{
-    if (! plugin_get_enabled (plugin))
-        return ENOSYS;
-
-    Plugin * header = plugin_get_header (plugin);
-    if (! header || ! PLUGIN_HAS_FUNC (header, take_message))
-        return ENOSYS;
-
-    return header->take_message (code, data, size);
-}
-
-void plugin_do_about (PluginHandle * plugin)
-{
-    g_return_if_fail (plugin_get_enabled (plugin));
-    Plugin * header = plugin_get_header (plugin);
-    g_return_if_fail (header);
-
-    if (PLUGIN_HAS_FUNC (header, about))
-        header->about ();
-    else if (PLUGIN_HAS_FUNC (header, about_text))
-        plugin_make_about_window (plugin);
-}
-
-void plugin_do_configure (PluginHandle * plugin)
-{
-    g_return_if_fail (plugin_get_enabled (plugin));
-    Plugin * header = plugin_get_header (plugin);
-    g_return_if_fail (header);
-
-    if (PLUGIN_HAS_FUNC (header, configure))
-        header->configure ();
-    else if (PLUGIN_HAS_FUNC (header, prefs))
-        plugin_make_config_window (plugin);
-}
diff --git a/src/audacious/plugin-preferences.c b/src/audacious/plugin-preferences.c
deleted file mode 100644
index 8a0bf8117afe..000000000000
--- a/src/audacious/plugin-preferences.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * plugin-preferences.c
- * Copyright 2012-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <libaudcore/audstrings.h>
-#include <libaudgui/libaudgui-gtk.h>
-
-#include "i18n.h"
-#include "misc.h"
-#include "plugin.h"
-#include "plugins.h"
-#include "preferences.h"
-#include "ui_preferences.h"
-
-typedef struct {
-    GtkWidget * about_window;
-    GtkWidget * config_window;
-} PluginMiscData;
-
-void plugin_make_about_window (PluginHandle * plugin)
-{
-    PluginMiscData * misc = plugin_get_misc_data (plugin, sizeof (PluginMiscData));
-    Plugin * header = plugin_get_header (plugin);
-
-    if (misc->about_window)
-    {
-        gtk_window_present ((GtkWindow *) misc->about_window);
-        return;
-    }
-
-    const char * name = header->name;
-    const char * text = header->about_text;
-
-    if (PLUGIN_HAS_FUNC (header, domain))
-    {
-        name = dgettext (header->domain, name);
-        text = dgettext (header->domain, text);
-    }
-
-    SCONCAT3 (title, _("About"), " ", name);
-    audgui_simple_message (& misc->about_window, GTK_MESSAGE_INFO, title, text);
-}
-
-static void response_cb (GtkWidget * window, int response, const PluginPreferences * p)
-{
-    if (response == GTK_RESPONSE_OK && p->apply)
-        p->apply ();
-
-    gtk_widget_destroy (window);
-}
-
-static void destroy_cb (GtkWidget * window, const PluginPreferences * p)
-{
-    if (p->cleanup)
-        p->cleanup ();
-}
-
-void plugin_make_config_window (PluginHandle * plugin)
-{
-    PluginMiscData * misc = plugin_get_misc_data (plugin, sizeof (PluginMiscData));
-    Plugin * header = plugin_get_header (plugin);
-    const PluginPreferences * p = header->prefs;
-
-    if (misc->config_window)
-    {
-        gtk_window_present ((GtkWindow *) misc->config_window);
-        return;
-    }
-
-    if (p->init)
-        p->init ();
-
-    const char * name = header->name;
-    if (PLUGIN_HAS_FUNC (header, domain))
-        name = dgettext (header->domain, header->name);
-
-    GtkWidget * window = gtk_dialog_new ();
-
-    SCONCAT3 (title, name, " ", _("Settings"));
-    gtk_window_set_title ((GtkWindow *) window, title);
-
-    if (p->apply)
-    {
-        GtkWidget * button1 = audgui_button_new (_("_Set"), "system-run", NULL, NULL);
-        GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop", NULL, NULL);
-        gtk_dialog_add_action_widget ((GtkDialog *) window, button2, GTK_RESPONSE_CANCEL);
-        gtk_dialog_add_action_widget ((GtkDialog *) window, button1, GTK_RESPONSE_OK);
-    }
-    else
-    {
-        GtkWidget * button = audgui_button_new (_("_Close"), "window-close", NULL, NULL);
-        gtk_dialog_add_action_widget ((GtkDialog *) window, button, GTK_RESPONSE_CLOSE);
-    }
-
-    GtkWidget * content = gtk_dialog_get_content_area ((GtkDialog *) window);
-    GtkWidget * box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-    create_widgets_with_domain (box, p->widgets, p->n_widgets, header->domain);
-    gtk_box_pack_start ((GtkBox *) content, box, TRUE, TRUE, 0);
-
-    g_signal_connect (window, "response", (GCallback) response_cb, (void *) p);
-    g_signal_connect (window, "destroy", (GCallback) destroy_cb, (void *) p);
-
-    misc->config_window = window;
-    g_signal_connect (window, "destroy", (GCallback) gtk_widget_destroyed, & misc->config_window);
-
-    gtk_widget_show_all (window);
-}
-
-void plugin_misc_cleanup (PluginHandle * plugin)
-{
-    PluginMiscData * misc = plugin_get_misc_data (plugin, sizeof (PluginMiscData));
-
-    if (misc->about_window)
-        gtk_widget_destroy (misc->about_window);
-    if (misc->config_window)
-        gtk_widget_destroy (misc->config_window);
-}
diff --git a/src/audacious/plugin-registry.c b/src/audacious/plugin-registry.c
deleted file mode 100644
index bc0d4416b44e..000000000000
--- a/src/audacious/plugin-registry.c
+++ /dev/null
@@ -1,871 +0,0 @@
-/*
- * plugin-registry.c
- * Copyright 2009-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-/* While the registry is being built (during early startup) or destroyed (during
- * late shutdown), the registry_locked flag will be set.  Once this flag is
- * cleared, the registry will not be modified and can be read by concurrent
- * threads.  The one change that can happen during this time is that a plugin is
- * loaded; hence the mutex must be locked before checking that a plugin is
- * loaded and while loading it. */
-
-#include <pthread.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <glib.h>
-#include <glib/gstdio.h>
-
-#include <libaudcore/audstrings.h>
-
-#include "debug.h"
-#include "i18n.h"
-#include "interface.h"
-#include "misc.h"
-#include "plugin.h"
-#include "plugins.h"
-
-#define FILENAME "plugin-registry"
-#define FORMAT 8
-
-typedef struct {
-    GList * schemes;
-} TransportPluginData;
-
-typedef struct {
-    GList * exts;
-} PlaylistPluginData;
-
-typedef struct {
-    GList * keys[INPUT_KEYS];
-    bool_t has_images, has_subtunes, can_write_tuple, has_infowin;
-} InputPluginData;
-
-struct PluginHandle {
-    char * path;
-    bool_t confirmed, loaded;
-    int timestamp, type;
-    Plugin * header;
-    char * name, * domain;
-    int priority;
-    bool_t has_about, has_configure, enabled;
-    GList * watches;
-    void * misc;
-
-    union {
-        TransportPluginData t;
-        PlaylistPluginData p;
-        InputPluginData i;
-    } u;
-};
-
-typedef struct {
-    PluginForEachFunc func;
-    void * data;
-} PluginWatch;
-
-static const char * plugin_type_names[] = {
- [PLUGIN_TYPE_TRANSPORT] = "transport",
- [PLUGIN_TYPE_PLAYLIST] = "playlist",
- [PLUGIN_TYPE_INPUT] = "input",
- [PLUGIN_TYPE_EFFECT] = "effect",
- [PLUGIN_TYPE_OUTPUT] = "output",
- [PLUGIN_TYPE_VIS] = "vis",
- [PLUGIN_TYPE_GENERAL] = "general",
- [PLUGIN_TYPE_IFACE] = "iface"};
-
-static const char * input_key_names[] = {
- [INPUT_KEY_SCHEME] = "scheme",
- [INPUT_KEY_EXTENSION] = "ext",
- [INPUT_KEY_MIME] = "mime"};
-
-static GList * plugin_list = NULL;
-static bool_t registry_locked = TRUE;
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-
-static PluginHandle * plugin_new (char * path, bool_t confirmed, bool_t
- loaded, int timestamp, int type, Plugin * header)
-{
-    PluginHandle * plugin = g_slice_new (PluginHandle);
-
-    plugin->path = path;
-    plugin->confirmed = confirmed;
-    plugin->loaded = loaded;
-    plugin->timestamp = timestamp;
-    plugin->type = type;
-    plugin->header = header;
-    plugin->name = NULL;
-    plugin->domain = NULL;
-    plugin->priority = 0;
-    plugin->has_about = FALSE;
-    plugin->has_configure = FALSE;
-    plugin->enabled = FALSE;
-    plugin->watches = NULL;
-    plugin->misc = NULL;
-
-    if (type == PLUGIN_TYPE_TRANSPORT)
-    {
-        plugin->enabled = TRUE;
-        plugin->u.t.schemes = NULL;
-    }
-    else if (type == PLUGIN_TYPE_PLAYLIST)
-    {
-        plugin->enabled = TRUE;
-        plugin->u.p.exts = NULL;
-    }
-    else if (type == PLUGIN_TYPE_INPUT)
-    {
-        plugin->enabled = TRUE;
-        memset (plugin->u.i.keys, 0, sizeof plugin->u.i.keys);
-        plugin->u.i.has_images = FALSE;
-        plugin->u.i.has_subtunes = FALSE;
-        plugin->u.i.can_write_tuple = FALSE;
-        plugin->u.i.has_infowin = FALSE;
-    }
-
-    plugin_list = g_list_prepend (plugin_list, plugin);
-    return plugin;
-}
-
-static void plugin_free (PluginHandle * plugin)
-{
-    plugin_list = g_list_remove (plugin_list, plugin);
-
-    for (GList * node = plugin->watches; node; node = node->next)
-        g_slice_free (PluginWatch, node->data);
-
-    if (plugin->type == PLUGIN_TYPE_TRANSPORT)
-        g_list_free_full (plugin->u.t.schemes, (GDestroyNotify) str_unref);
-    else if (plugin->type == PLUGIN_TYPE_PLAYLIST)
-        g_list_free_full (plugin->u.p.exts, (GDestroyNotify) str_unref);
-    else if (plugin->type == PLUGIN_TYPE_INPUT)
-    {
-        for (int key = 0; key < INPUT_KEYS; key ++)
-            g_list_free_full (plugin->u.i.keys[key], (GDestroyNotify) str_unref);
-    }
-
-    str_unref (plugin->path);
-    str_unref (plugin->name);
-    str_unref (plugin->domain);
-    g_free (plugin->misc);
-    g_slice_free (PluginHandle, plugin);
-}
-
-static FILE * open_registry_file (const char * mode)
-{
-    const char * user_dir = get_path (AUD_PATH_USER_DIR);
-    SCONCAT2 (path, user_dir, "/" FILENAME);
-    return g_fopen (path, mode);
-}
-
-static void transport_plugin_save (PluginHandle * plugin, FILE * handle)
-{
-    for (GList * node = plugin->u.t.schemes; node; node = node->next)
-        fprintf (handle, "scheme %s\n", (const char *) node->data);
-}
-
-static void playlist_plugin_save (PluginHandle * plugin, FILE * handle)
-{
-    for (GList * node = plugin->u.p.exts; node; node = node->next)
-        fprintf (handle, "ext %s\n", (const char *) node->data);
-}
-
-static void input_plugin_save (PluginHandle * plugin, FILE * handle)
-{
-    for (int key = 0; key < INPUT_KEYS; key ++)
-    {
-        for (GList * node = plugin->u.i.keys[key]; node; node = node->next)
-            fprintf (handle, "%s %s\n", input_key_names[key], (const char *)
-             node->data);
-    }
-
-    fprintf (handle, "images %d\n", plugin->u.i.has_images);
-    fprintf (handle, "subtunes %d\n", plugin->u.i.has_subtunes);
-    fprintf (handle, "writes %d\n", plugin->u.i.can_write_tuple);
-    fprintf (handle, "infowin %d\n", plugin->u.i.has_infowin);
-}
-
-static void plugin_save (PluginHandle * plugin, FILE * handle)
-{
-    fprintf (handle, "%s %s\n", plugin_type_names[plugin->type], plugin->path);
-    fprintf (handle, "stamp %d\n", plugin->timestamp);
-    fprintf (handle, "name %s\n", plugin->name);
-
-    if (plugin->domain)
-        fprintf (handle, "domain %s\n", plugin->domain);
-
-    fprintf (handle, "priority %d\n", plugin->priority);
-    fprintf (handle, "about %d\n", plugin->has_about);
-    fprintf (handle, "config %d\n", plugin->has_configure);
-    fprintf (handle, "enabled %d\n", plugin->enabled);
-
-    if (plugin->type == PLUGIN_TYPE_TRANSPORT)
-        transport_plugin_save (plugin, handle);
-    else if (plugin->type == PLUGIN_TYPE_PLAYLIST)
-        playlist_plugin_save (plugin, handle);
-    else if (plugin->type == PLUGIN_TYPE_INPUT)
-        input_plugin_save (plugin, handle);
-}
-
-void plugin_registry_save (void)
-{
-    FILE * handle = open_registry_file ("w");
-    g_return_if_fail (handle);
-
-    fprintf (handle, "format %d\n", FORMAT);
-
-    g_list_foreach (plugin_list, (GFunc) plugin_save, handle);
-    fclose (handle);
-
-    g_list_foreach (plugin_list, (GFunc) plugin_free, NULL);
-    registry_locked = TRUE;
-}
-
-static char parse_key[512];
-static char * parse_value;
-
-static void parse_next (FILE * handle)
-{
-    parse_value = NULL;
-
-    if (! fgets (parse_key, sizeof parse_key, handle))
-        return;
-
-    char * space = strchr (parse_key, ' ');
-    if (! space)
-        return;
-
-    * space = 0;
-    parse_value = space + 1;
-
-    char * newline = strchr (parse_value, '\n');
-    if (newline)
-        * newline = 0;
-}
-
-static bool_t parse_integer (const char * key, int * value)
-{
-    return (parse_value && ! strcmp (parse_key, key) && sscanf (parse_value,
-     "%d", value) == 1);
-}
-
-static char * parse_string (const char * key)
-{
-    return (parse_value && ! strcmp (parse_key, key)) ? str_get (parse_value) : NULL;
-}
-
-static void transport_plugin_parse (PluginHandle * plugin, FILE * handle)
-{
-    char * value;
-    while ((value = parse_string ("scheme")))
-    {
-        plugin->u.t.schemes = g_list_prepend (plugin->u.t.schemes, value);
-        parse_next (handle);
-    }
-}
-
-static void playlist_plugin_parse (PluginHandle * plugin, FILE * handle)
-{
-    char * value;
-    while ((value = parse_string ("ext")))
-    {
-        plugin->u.p.exts = g_list_prepend (plugin->u.p.exts, value);
-        parse_next (handle);
-    }
-}
-
-static void input_plugin_parse (PluginHandle * plugin, FILE * handle)
-{
-    for (int key = 0; key < INPUT_KEYS; key ++)
-    {
-        char * value;
-        while ((value = parse_string (input_key_names[key])))
-        {
-            plugin->u.i.keys[key] = g_list_prepend (plugin->u.i.keys[key],
-             value);
-            parse_next (handle);
-        }
-    }
-
-    if (parse_integer ("images", & plugin->u.i.has_images))
-        parse_next (handle);
-    if (parse_integer ("subtunes", & plugin->u.i.has_subtunes))
-        parse_next (handle);
-    if (parse_integer ("writes", & plugin->u.i.can_write_tuple))
-        parse_next (handle);
-    if (parse_integer ("infowin", & plugin->u.i.has_infowin))
-        parse_next (handle);
-}
-
-static bool_t plugin_parse (FILE * handle)
-{
-    char * path = NULL;
-
-    int type;
-    for (type = 0; type < PLUGIN_TYPES; type ++)
-    {
-        if ((path = parse_string (plugin_type_names[type])))
-            goto FOUND;
-    }
-
-    return FALSE;
-
-FOUND:
-    parse_next (handle);
-
-    int timestamp;
-    if (! parse_integer ("stamp", & timestamp))
-    {
-        str_unref (path);
-        return FALSE;
-    }
-
-    PluginHandle * plugin = plugin_new (path, FALSE, FALSE, timestamp, type,
-     NULL);
-    parse_next (handle);
-
-    if ((plugin->name = parse_string ("name")))
-        parse_next (handle);
-    if ((plugin->domain = parse_string ("domain")))
-        parse_next (handle);
-    if (parse_integer ("priority", & plugin->priority))
-        parse_next (handle);
-    if (parse_integer ("about", & plugin->has_about))
-        parse_next (handle);
-    if (parse_integer ("config", & plugin->has_configure))
-        parse_next (handle);
-    if (parse_integer ("enabled", & plugin->enabled))
-        parse_next (handle);
-
-    if (type == PLUGIN_TYPE_TRANSPORT)
-        transport_plugin_parse (plugin, handle);
-    else if (type == PLUGIN_TYPE_PLAYLIST)
-        playlist_plugin_parse (plugin, handle);
-    else if (type == PLUGIN_TYPE_INPUT)
-        input_plugin_parse (plugin, handle);
-
-    return TRUE;
-}
-
-void plugin_registry_load (void)
-{
-    FILE * handle = open_registry_file ("r");
-    if (! handle)
-        goto UNLOCK;
-
-    parse_next (handle);
-
-    int format;
-    if (! parse_integer ("format", & format) || format != FORMAT)
-        goto ERR;
-
-    parse_next (handle);
-
-    while (plugin_parse (handle))
-        ;
-
-ERR:
-    fclose (handle);
-UNLOCK:
-    registry_locked = FALSE;
-}
-
-static void plugin_prune (PluginHandle * plugin)
-{
-    if (plugin->confirmed)
-        return;
-
-    AUDDBG ("Plugin not found: %s\n", plugin->path);
-    plugin_free (plugin);
-}
-
-int plugin_compare (PluginHandle * a, PluginHandle * b)
-{
-    if (a->type < b->type)
-        return -1;
-    if (a->type > b->type)
-        return 1;
-    if (a->priority < b->priority)
-        return -1;
-    if (a->priority > b->priority)
-        return 1;
-
-    int diff;
-    if ((diff = str_compare (dgettext (a->domain, a->name), dgettext (b->domain, b->name))))
-        return diff;
-
-    return str_compare (a->path, b->path);
-}
-
-void plugin_registry_prune (void)
-{
-    g_list_foreach (plugin_list, (GFunc) plugin_prune, NULL);
-    plugin_list = g_list_sort (plugin_list, (GCompareFunc) plugin_compare);
-    registry_locked = TRUE;
-}
-
-static int plugin_lookup_cb (PluginHandle * plugin, const char * path)
-{
-    return strcmp (plugin->path, path);
-}
-
-PluginHandle * plugin_lookup (const char * path)
-{
-    GList * node = g_list_find_custom (plugin_list, path, (GCompareFunc)
-     plugin_lookup_cb);
-    return node ? node->data : NULL;
-}
-
-static int plugin_lookup_basename_cb (PluginHandle * plugin, const char * basename)
-{
-    const char * slash = strrchr (plugin->path, G_DIR_SEPARATOR);
-    if (! slash)
-        return TRUE;
-
-    const char * dot = strrchr (slash + 1, '.');
-    if (! dot)
-        return TRUE;
-
-    return strncmp (slash + 1, basename, dot - (slash + 1));
-}
-
-/* Note: If there are multiple plugins with the same basename, this returns only
- * one of them. So give different plugins different basenames. --jlindgren */
-PluginHandle * plugin_lookup_basename (const char * basename)
-{
-    GList * node = g_list_find_custom (plugin_list, basename, (GCompareFunc)
-     plugin_lookup_basename_cb);
-    return node ? node->data : NULL;
-}
-
-static void plugin_get_info (PluginHandle * plugin, bool_t new)
-{
-    Plugin * header = plugin->header;
-
-    str_unref (plugin->name);
-    str_unref (plugin->domain);
-    plugin->name = str_get (header->name);
-    plugin->domain = PLUGIN_HAS_FUNC (header, domain) ? str_get (header->domain) : NULL;
-    plugin->has_about = PLUGIN_HAS_FUNC (header, about) || PLUGIN_HAS_FUNC (header, about_text);
-    plugin->has_configure = PLUGIN_HAS_FUNC (header, configure) || PLUGIN_HAS_FUNC (header, prefs);
-
-    if (header->type == PLUGIN_TYPE_TRANSPORT)
-    {
-        TransportPlugin * tp = (TransportPlugin *) header;
-
-        g_list_free_full (plugin->u.t.schemes, (GDestroyNotify) str_unref);
-        plugin->u.t.schemes = NULL;
-
-        for (int i = 0; tp->schemes[i]; i ++)
-            plugin->u.t.schemes = g_list_prepend (plugin->u.t.schemes, str_get (tp->schemes[i]));
-    }
-    else if (header->type == PLUGIN_TYPE_PLAYLIST)
-    {
-        PlaylistPlugin * pp = (PlaylistPlugin *) header;
-
-        g_list_free_full (plugin->u.p.exts, (GDestroyNotify) str_unref);
-        plugin->u.p.exts = NULL;
-
-        for (int i = 0; pp->extensions[i]; i ++)
-            plugin->u.p.exts = g_list_prepend (plugin->u.p.exts, str_get (pp->extensions[i]));
-    }
-    else if (header->type == PLUGIN_TYPE_INPUT)
-    {
-        InputPlugin * ip = (InputPlugin *) header;
-        plugin->priority = ip->priority;
-
-        for (int key = 0; key < INPUT_KEYS; key ++)
-        {
-            g_list_free_full (plugin->u.i.keys[key], (GDestroyNotify) str_unref);
-            plugin->u.i.keys[key] = NULL;
-        }
-
-        if (PLUGIN_HAS_FUNC (ip, extensions))
-        {
-            for (int i = 0; ip->extensions[i]; i ++)
-                plugin->u.i.keys[INPUT_KEY_EXTENSION] = g_list_prepend
-                 (plugin->u.i.keys[INPUT_KEY_EXTENSION],
-                 str_get (ip->extensions[i]));
-        }
-
-        if (PLUGIN_HAS_FUNC (ip, mimes))
-        {
-            for (int i = 0; ip->mimes[i]; i ++)
-                plugin->u.i.keys[INPUT_KEY_MIME] = g_list_prepend
-                 (plugin->u.i.keys[INPUT_KEY_MIME], str_get (ip->mimes[i]));
-        }
-
-        if (PLUGIN_HAS_FUNC (ip, schemes))
-        {
-            for (int i = 0; ip->schemes[i]; i ++)
-                plugin->u.i.keys[INPUT_KEY_SCHEME] = g_list_prepend
-                 (plugin->u.i.keys[INPUT_KEY_SCHEME], str_get (ip->schemes[i]));
-        }
-
-        plugin->u.i.has_images = PLUGIN_HAS_FUNC (ip, get_song_image);
-        plugin->u.i.has_subtunes = ip->have_subtune;
-        plugin->u.i.can_write_tuple = PLUGIN_HAS_FUNC (ip, update_song_tuple);
-        plugin->u.i.has_infowin = PLUGIN_HAS_FUNC (ip, file_info_box);
-    }
-    else if (header->type == PLUGIN_TYPE_OUTPUT)
-    {
-        OutputPlugin * op = (OutputPlugin *) header;
-        plugin->priority = 10 - op->probe_priority;
-    }
-    else if (header->type == PLUGIN_TYPE_EFFECT)
-    {
-        EffectPlugin * ep = (EffectPlugin *) header;
-        plugin->priority = ep->order;
-    }
-    else if (header->type == PLUGIN_TYPE_GENERAL)
-    {
-        GeneralPlugin * gp = (GeneralPlugin *) header;
-        if (new)
-            plugin->enabled = gp->enabled_by_default;
-    }
-}
-
-void plugin_register (const char * path, int timestamp)
-{
-    PluginHandle * plugin = plugin_lookup (path);
-
-    if (plugin)
-    {
-        AUDDBG ("Register plugin: %s\n", path);
-        plugin->confirmed = TRUE;
-
-        if (plugin->timestamp != timestamp)
-        {
-            AUDDBG ("Rescan plugin: %s\n", path);
-            Plugin * header = plugin_load (path);
-            if (! header || header->type != plugin->type)
-                return;
-
-            plugin->loaded = TRUE;
-            plugin->header = header;
-            plugin->timestamp = timestamp;
-
-            plugin_get_info (plugin, FALSE);
-        }
-    }
-    else
-    {
-        AUDDBG ("New plugin: %s\n", path);
-        Plugin * header = plugin_load (path);
-        if (! header)
-            return;
-
-        plugin = plugin_new (str_get (path), TRUE, TRUE, timestamp,
-         header->type, header);
-
-        plugin_get_info (plugin, TRUE);
-    }
-}
-
-int plugin_get_type (PluginHandle * plugin)
-{
-    return plugin->type;
-}
-
-const char * plugin_get_filename (PluginHandle * plugin)
-{
-    return plugin->path;
-}
-
-const void * plugin_get_header (PluginHandle * plugin)
-{
-    pthread_mutex_lock (& mutex);
-
-    if (! plugin->loaded)
-    {
-        Plugin * header = plugin_load (plugin->path);
-        if (! header || header->type != plugin->type)
-            goto DONE;
-
-        plugin->loaded = TRUE;
-        plugin->header = header;
-    }
-
-DONE:
-    pthread_mutex_unlock (& mutex);
-    return plugin->header;
-}
-
-static int plugin_by_header_cb (PluginHandle * plugin, const void * header)
-{
-    return (plugin->header == header) ? 0 : -1;
-}
-
-PluginHandle * plugin_by_header (const void * header)
-{
-    GList * node = g_list_find_custom (plugin_list, header, (GCompareFunc)
-     plugin_by_header_cb);
-    return node ? node->data : NULL;
-}
-
-int plugin_count (int type)
-{
-    int count = 0;
-
-    for (GList * node = plugin_list; node; node = node->next)
-    {
-        PluginHandle * plugin = node->data;
-        if (plugin->type == type)
-            count ++;
-    }
-
-    return count;
-}
-
-int plugin_get_index (PluginHandle * plugin)
-{
-    int index = 0;
-
-    for (GList * node = plugin_list; node; node = node->next)
-    {
-        PluginHandle * plugin2 = node->data;
-        if (plugin2->type == plugin->type)
-        {
-            if (plugin2 == plugin)
-                return index;
-            index ++;
-        }
-    }
-
-    return -1;
-}
-
-PluginHandle * plugin_by_index (int type, int index)
-{
-    for (GList * node = plugin_list; node; node = node->next)
-    {
-        PluginHandle * plugin = node->data;
-        if (plugin->type == type)
-        {
-            if (! index)
-                return plugin;
-            index --;
-        }
-    }
-
-    return NULL;
-}
-
-void plugin_for_each (int type, PluginForEachFunc func, void * data)
-{
-    for (GList * node = plugin_list; node; node = node->next)
-    {
-        if (((PluginHandle *) node->data)->type != type)
-            continue;
-        if (! func (node->data, data))
-            break;
-    }
-}
-
-const char * plugin_get_name (PluginHandle * plugin)
-{
-    return dgettext (plugin->domain, plugin->name);
-}
-
-bool_t plugin_has_about (PluginHandle * plugin)
-{
-    return plugin->has_about;
-}
-
-bool_t plugin_has_configure (PluginHandle * plugin)
-{
-    return plugin->has_configure;
-}
-
-bool_t plugin_get_enabled (PluginHandle * plugin)
-{
-    return plugin->enabled;
-}
-
-static void plugin_call_watches (PluginHandle * plugin)
-{
-    for (GList * node = plugin->watches; node; )
-    {
-        GList * next = node->next;
-        PluginWatch * watch = node->data;
-
-        if (! watch->func (plugin, watch->data))
-        {
-            g_slice_free (PluginWatch, watch);
-            plugin->watches = g_list_delete_link (plugin->watches, node);
-        }
-
-        node = next;
-    }
-}
-
-void plugin_set_enabled (PluginHandle * plugin, bool_t enabled)
-{
-    plugin->enabled = enabled;
-    plugin_call_watches (plugin);
-}
-
-typedef struct {
-    PluginForEachFunc func;
-    void * data;
-} PluginForEnabledState;
-
-static bool_t plugin_for_enabled_cb (PluginHandle * plugin,
- PluginForEnabledState * state)
-{
-    if (! plugin->enabled)
-        return TRUE;
-    return state->func (plugin, state->data);
-}
-
-void plugin_for_enabled (int type, PluginForEachFunc func, void * data)
-{
-    PluginForEnabledState state = {func, data};
-    plugin_for_each (type, (PluginForEachFunc) plugin_for_enabled_cb, & state);
-}
-
-void plugin_add_watch (PluginHandle * plugin, PluginForEachFunc func, void *
- data)
-{
-    PluginWatch * watch = g_slice_new (PluginWatch);
-    watch->func = func;
-    watch->data = data;
-    plugin->watches = g_list_prepend (plugin->watches, watch);
-}
-
-void plugin_remove_watch (PluginHandle * plugin, PluginForEachFunc func, void *
- data)
-{
-    for (GList * node = plugin->watches; node; )
-    {
-        GList * next = node->next;
-        PluginWatch * watch = node->data;
-
-        if (watch->func == func && watch->data == data)
-        {
-            g_slice_free (PluginWatch, watch);
-            plugin->watches = g_list_delete_link (plugin->watches, node);
-        }
-
-        node = next;
-    }
-}
-
-void * plugin_get_misc_data (PluginHandle * plugin, int size)
-{
-    if (! plugin->misc)
-        plugin->misc = g_malloc0 (size);
-
-    return plugin->misc;
-}
-
-typedef struct {
-    const char * scheme;
-    PluginHandle * plugin;
-} TransportPluginForSchemeState;
-
-static bool_t transport_plugin_for_scheme_cb (PluginHandle * plugin,
- TransportPluginForSchemeState * state)
-{
-    if (! g_list_find_custom (plugin->u.t.schemes, state->scheme,
-     (GCompareFunc) g_ascii_strcasecmp))
-        return TRUE;
-
-    state->plugin = plugin;
-    return FALSE;
-}
-
-PluginHandle * transport_plugin_for_scheme (const char * scheme)
-{
-    TransportPluginForSchemeState state = {scheme, NULL};
-    plugin_for_enabled (PLUGIN_TYPE_TRANSPORT, (PluginForEachFunc)
-     transport_plugin_for_scheme_cb, & state);
-    return state.plugin;
-}
-
-typedef struct {
-    const char * ext;
-    PluginForEachFunc func;
-    void * data;
-} PlaylistPluginForExtState;
-
-static bool_t playlist_plugin_for_ext_cb (PluginHandle * plugin,
- PlaylistPluginForExtState * state)
-{
-    if (! g_list_find_custom (plugin->u.p.exts, state->ext,
-     (GCompareFunc) g_ascii_strcasecmp))
-        return TRUE;
-
-    return state->func (plugin, state->data);
-}
-
-void playlist_plugin_for_ext (const char * ext, PluginForEachFunc func, void * data)
-{
-    PlaylistPluginForExtState state = {ext, func, data};
-    plugin_for_enabled (PLUGIN_TYPE_PLAYLIST, (PluginForEachFunc)
-     playlist_plugin_for_ext_cb, & state);
-}
-
-typedef struct {
-    int key;
-    const char * value;
-    PluginForEachFunc func;
-    void * data;
-} InputPluginForKeyState;
-
-static bool_t input_plugin_for_key_cb (PluginHandle * plugin,
- InputPluginForKeyState * state)
-{
-    if (! g_list_find_custom (plugin->u.i.keys[state->key], state->value,
-     (GCompareFunc) g_ascii_strcasecmp))
-        return TRUE;
-
-    return state->func (plugin, state->data);
-}
-
-void input_plugin_for_key (int key, const char * value, PluginForEachFunc
- func, void * data)
-{
-    InputPluginForKeyState state = {key, value, func, data};
-    plugin_for_enabled (PLUGIN_TYPE_INPUT, (PluginForEachFunc)
-     input_plugin_for_key_cb, & state);
-}
-
-bool_t input_plugin_has_images (PluginHandle * plugin)
-{
-    g_return_val_if_fail (plugin->type == PLUGIN_TYPE_INPUT, FALSE);
-    return plugin->u.i.has_images;
-}
-
-bool_t input_plugin_has_subtunes (PluginHandle * plugin)
-{
-    g_return_val_if_fail (plugin->type == PLUGIN_TYPE_INPUT, FALSE);
-    return plugin->u.i.has_subtunes;
-}
-
-bool_t input_plugin_can_write_tuple (PluginHandle * plugin)
-{
-    g_return_val_if_fail (plugin->type == PLUGIN_TYPE_INPUT, FALSE);
-    return plugin->u.i.can_write_tuple;
-}
-
-bool_t input_plugin_has_infowin (PluginHandle * plugin)
-{
-    g_return_val_if_fail (plugin->type == PLUGIN_TYPE_INPUT, FALSE);
-    return plugin->u.i.has_infowin;
-}
diff --git a/src/audacious/plugin-view.c b/src/audacious/plugin-view.c
deleted file mode 100644
index 36959af75a27..000000000000
--- a/src/audacious/plugin-view.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * plugin-view.c
- * Copyright 2010-2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gtk/gtk.h>
-
-#include <libaudgui/libaudgui-gtk.h>
-
-#include "i18n.h"
-#include "plugin.h"
-#include "plugins.h"
-#include "ui_preferences.h"
-
-enum {
- PVIEW_COL_NODE,
- PVIEW_COL_ENABLED,
- PVIEW_COL_NAME,
- PVIEW_COLS
-};
-
-typedef struct {
-    PluginHandle * p;
-    GtkTreeModel * model;
-    GtkTreePath * path;
-} Node;
-
-static PluginHandle * get_selected_plugin (GtkTreeView * tree)
-{
-    Node * n = NULL;
-
-    GtkTreeSelection * sel = gtk_tree_view_get_selection (tree);
-
-    /* the treeview may not have a model yet */
-    if (! sel)
-        return NULL;
-
-    GtkTreeModel * model;
-    GtkTreeIter iter;
-    if (gtk_tree_selection_get_selected (sel, & model, & iter))
-        gtk_tree_model_get (model, & iter, PVIEW_COL_NODE, & n, -1);
-
-    return n == NULL ? NULL : n->p;
-}
-
-static void do_enable (GtkCellRendererToggle * cell, const char * path_str,
- GtkTreeModel * model)
-{
-    GtkTreePath * path = gtk_tree_path_new_from_string (path_str);
-    GtkTreeIter iter;
-    gtk_tree_model_get_iter (model, & iter, path);
-    gtk_tree_path_free (path);
-
-    Node * n = NULL;
-    bool_t enabled;
-    gtk_tree_model_get (model, & iter, PVIEW_COL_NODE, & n,
-     PVIEW_COL_ENABLED, & enabled, -1);
-    g_return_if_fail (n != NULL);
-
-    plugin_enable (n->p, ! enabled);
-}
-
-static bool_t list_watcher (PluginHandle * p, Node * n)
-{
-    GtkTreeIter iter;
-    gtk_tree_model_get_iter (n->model, & iter, n->path);
-    gtk_list_store_set ((GtkListStore *) n->model, & iter, PVIEW_COL_ENABLED,
-     plugin_get_enabled (n->p), -1);
-    return TRUE;
-}
-
-static bool_t fill_cb (PluginHandle * p, GtkTreeModel * model)
-{
-    Node * n = g_slice_new (Node);
-
-    GtkTreeIter iter;
-    gtk_list_store_append ((GtkListStore *) model, & iter);
-    gtk_list_store_set ((GtkListStore *) model, & iter, PVIEW_COL_NODE, n,
-     PVIEW_COL_ENABLED, plugin_get_enabled (p), PVIEW_COL_NAME,
-     plugin_get_name (p), -1);
-
-    n->p = p;
-    n->model = model;
-    n->path = gtk_tree_model_get_path (model, & iter);
-
-    plugin_add_watch (p, (PluginForEachFunc) list_watcher, n);
-
-    return TRUE;
-}
-
-static void list_fill (GtkTreeView * tree, void * type)
-{
-    GtkTreeModel * model = (GtkTreeModel *) gtk_list_store_new (PVIEW_COLS,
-     G_TYPE_POINTER, G_TYPE_BOOLEAN, G_TYPE_STRING);
-    gtk_tree_view_set_model (tree, model);
-
-    GtkTreeViewColumn * col = gtk_tree_view_column_new ();
-    gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
-    gtk_tree_view_column_set_resizable (col, FALSE);
-    gtk_tree_view_append_column (tree, col);
-
-    GtkCellRenderer * rend = gtk_cell_renderer_toggle_new ();
-    g_signal_connect (rend, "toggled", (GCallback) do_enable, model);
-    gtk_tree_view_column_pack_start (col, rend, FALSE);
-    gtk_tree_view_column_set_attributes (col, rend, "active", PVIEW_COL_ENABLED,
-     NULL);
-
-    col = gtk_tree_view_column_new ();
-    gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
-    gtk_tree_view_column_set_expand (col, TRUE);
-    gtk_tree_view_column_set_resizable (col, FALSE);
-    gtk_tree_view_append_column (tree, col);
-
-    rend = gtk_cell_renderer_text_new ();
-    gtk_tree_view_column_pack_start (col, rend, FALSE);
-    gtk_tree_view_column_set_attributes (col, rend, "text", PVIEW_COL_NAME, NULL);
-
-    plugin_for_each (GPOINTER_TO_INT (type), (PluginForEachFunc) fill_cb, model);
-}
-
-static void list_destroy (GtkTreeView * tree)
-{
-    GtkTreeModel * model = gtk_tree_view_get_model (tree);
-    if (model == NULL)
-        return;
-
-    GtkTreeIter iter;
-    if (gtk_tree_model_get_iter_first (model, & iter))
-    {
-        do
-        {
-            Node * n = NULL;
-            gtk_tree_model_get (model, & iter, PVIEW_COL_NODE, & n, -1);
-            g_return_if_fail (n != NULL);
-
-            plugin_remove_watch (n->p, (PluginForEachFunc) list_watcher, n);
-            gtk_tree_path_free (n->path);
-            g_slice_free (Node, n);
-        }
-        while (gtk_tree_model_iter_next (model, & iter));
-    }
-
-    g_object_unref ((GObject *) model);
-}
-
-static bool_t config_watcher (PluginHandle * p, GtkWidget * config)
-{
-    gtk_widget_set_sensitive (config, plugin_has_configure (p) &&
-     plugin_get_enabled (p));
-    return TRUE;
-}
-
-static bool_t about_watcher (PluginHandle * p, GtkWidget * about)
-{
-    gtk_widget_set_sensitive (about, plugin_has_about (p) && plugin_get_enabled
-     (p));
-    return TRUE;
-}
-
-static void button_update (GtkTreeView * tree, GtkWidget * b)
-{
-    PluginForEachFunc watcher = (PluginForEachFunc) g_object_get_data
-     ((GObject *) b, "watcher");
-    g_return_if_fail (watcher != NULL);
-
-    PluginHandle * p = g_object_steal_data ((GObject *) b, "plugin");
-    if (p != NULL)
-        plugin_remove_watch (p, watcher, b);
-
-    p = get_selected_plugin (tree);
-    if (p != NULL)
-    {
-        g_object_set_data ((GObject *) b, "plugin", p);
-        watcher (p, b);
-        plugin_add_watch (p, watcher, b);
-    }
-    else
-        gtk_widget_set_sensitive (b, FALSE);
-}
-
-static void do_config (void * tree)
-{
-    PluginHandle * plugin = get_selected_plugin (tree);
-    g_return_if_fail (plugin != NULL);
-    plugin_do_configure (plugin);
-}
-
-static void do_about (void * tree)
-{
-    PluginHandle * plugin = get_selected_plugin (tree);
-    g_return_if_fail (plugin != NULL);
-    plugin_do_about (plugin);
-}
-
-static void button_destroy (GtkWidget * b)
-{
-    PluginForEachFunc watcher = (PluginForEachFunc) g_object_get_data
-     ((GObject *) b, "watcher");
-    g_return_if_fail (watcher != NULL);
-
-    PluginHandle * p = g_object_steal_data ((GObject *) b, "plugin");
-    if (p != NULL)
-        plugin_remove_watch (p, watcher, b);
-}
-
-GtkWidget * plugin_view_new (int type)
-{
-    GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
-    gtk_container_set_border_width ((GtkContainer *) vbox, 6);
-
-    GtkWidget * scrolled = gtk_scrolled_window_new (NULL, NULL);
-    gtk_box_pack_start ((GtkBox *) vbox, scrolled, TRUE, TRUE, 0);
-    gtk_scrolled_window_set_policy ((GtkScrolledWindow *) scrolled,
-     GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-    gtk_scrolled_window_set_shadow_type ((GtkScrolledWindow *) scrolled,
-     GTK_SHADOW_IN);
-
-    GtkWidget * tree = gtk_tree_view_new ();
-    gtk_container_add ((GtkContainer *) scrolled, tree);
-    gtk_tree_view_set_headers_visible ((GtkTreeView *) tree, FALSE);
-    g_signal_connect (tree, "realize", (GCallback) list_fill, GINT_TO_POINTER
-     (type));
-    g_signal_connect (tree, "destroy", (GCallback) list_destroy, NULL);
-
-    GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,  6);
-    gtk_box_pack_start ((GtkBox *) vbox, hbox, FALSE, FALSE, 0);
-
-    GtkWidget * config = audgui_button_new (_("_Settings"),
-     "preferences-system", do_config, tree);
-    gtk_box_pack_start ((GtkBox *) hbox, config, FALSE, FALSE, 0);
-    gtk_widget_set_sensitive (config, FALSE);
-    g_object_set_data ((GObject *) config, "watcher", (void *) config_watcher);
-    g_signal_connect (tree, "cursor-changed", (GCallback) button_update, config);
-    g_signal_connect (config, "destroy", (GCallback) button_destroy, NULL);
-
-    GtkWidget * about = audgui_button_new (_("_About"), "help-about", do_about, tree);
-    gtk_box_pack_start ((GtkBox *) hbox, about, FALSE, FALSE, 0);
-    gtk_widget_set_sensitive (about, FALSE);
-    g_object_set_data ((GObject *) about, "watcher", (void *) about_watcher);
-    g_signal_connect (tree, "cursor-changed", (GCallback) button_update, about);
-    g_signal_connect (about, "destroy", (GCallback) button_destroy, NULL);
-
-    return vbox;
-}
diff --git a/src/audacious/plugin.h b/src/audacious/plugin.h
deleted file mode 100644
index 49f5f2701612..000000000000
--- a/src/audacious/plugin.h
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * plugin.h
- * Copyright 2005-2013 William Pitcock, Yoshiki Yazawa, Eugene Zagidullin, and
- *                     John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_PLUGIN_H
-#define AUDACIOUS_PLUGIN_H
-
-#include <audacious/api.h>
-#include <audacious/types.h>
-#include <libaudcore/audio.h>
-#include <libaudcore/index.h>
-#include <libaudcore/tuple.h>
-#include <libaudcore/vfs.h>
-
-/* "Magic" bytes identifying an Audacious plugin header. */
-#define _AUD_PLUGIN_MAGIC 0x8EAC8DE2
-
-/* A NOTE ON THREADS
- *
- * How thread-safe a plugin must be depends on the type of plugin.  Note that
- * some parts of the Audacious API are *not* thread-safe and therefore cannot be
- * used in some parts of some plugins; for example, input plugins cannot use
- * GUI-related calls or access the playlist except in about() and configure().
- *
- * Thread-safe plugins: transport, playlist, input, effect, and output.  These
- * must be mostly thread-safe.  init() and cleanup() may be called from
- * secondary threads; however, no other functions provided by the plugin will be
- * called at the same time.  about() and configure() will be called only from
- * the main thread.  All other functions provided by the plugin may be called
- * from any thread and from multiple threads simultaneously.
- *
- * Exceptions:
- * - Because many existing input plugins are not coded to handle simultaneous
- *   calls to play(), play() will only be called from one thread at a time.  New
- *   plugins should not rely on this exception, though.
- * - Some combinations of calls, especially for output and effect plugins, make
- *   no sense; for example, flush() in an output plugin will only be called
- *   after open_audio() and before close_audio().
- *
- * Single-thread plugins: visualization, general, and interface.  Functions
- * provided by these plugins will only be called from the main thread. */
-
-/* CROSS-PLUGIN MESSAGES
- *
- * Since 3.2, Audacious implements a basic messaging system between plugins.
- * Messages are sent using aud_plugin_send_message() and received through the
- * take_message() method specified in the header of the receiving plugin.
- * Plugins that do not need to receive messages can set take_message() to NULL.
- *
- * Each message includes a code indicating the type of message, a pointer to
- * some data, and a value indicating the size of that data. What the message
- * data contains is entirely up to the two plugins involved. For this reason, it
- * is crucial that both plugins agree on the meaning of the message codes used.
- *
- * Once the message is sent, an integer error code is returned. If the receiving
- * plugin does not provide the take_message() method, ENOSYS is returned. If
- * take_message() does not recognize the message code, it should ignore the
- * message and return EINVAL. An error code of zero represents success. Other
- * error codes may be used with more specific meanings.
- *
- * For the time being, aud_plugin_send_message() should only be called from the
- * program's main thread. */
-
-#define PLUGIN_COMMON_FIELDS \
-    int magic; /* checked against _AUD_PLUGIN_MAGIC */ \
-    int version; /* checked against _AUD_PLUGIN_VERSION */ \
-    int type; /* PLUGIN_TYPE_XXX */ \
-    int size; /* size in bytes of the struct */ \
-    const char * name; \
-    const char * domain; /* for gettext */ \
-    const char * about_text; \
-    const PluginPreferences * prefs; \
-    bool_t (* init) (void); \
-    void (* cleanup) (void); \
-    int (* take_message) (const char * code, const void * data, int size); \
-    void (* about) (void); /* use about_text instead if possible */ \
-    void (* configure) (void); /* use prefs instead if possible */ \
-    void * reserved1; \
-    void * reserved2; \
-    void * reserved3; \
-    void * reserved4;
-
-struct _Plugin
-{
-    PLUGIN_COMMON_FIELDS
-};
-
-struct _TransportPlugin
-{
-    PLUGIN_COMMON_FIELDS
-
-    /* supported URI schemes (without "://")
-     *     (array terminated with null pointer) */
-    const char * const * schemes;
-
-    /* file operation implementations
-     *     (struct of function pointers, may contain null pointers) */
-    const VFSConstructor * vtable;
-};
-
-struct _PlaylistPlugin
-{
-    PLUGIN_COMMON_FIELDS
-
-    /* supported file extensions (without periods)
-     *     (array terminated with null pointer) */
-    const char * const * extensions;
-
-    /* path: URI of playlist file (in)
-     * file: VFS handle of playlist file (in, read-only file, not seekable)
-     * title: title of playlist (out, string-pooled)
-     * filenames: container to fill with URIs read from playlist file
-     *     (in-out, list of (char *), string-pooled)
-     * tuples: container to fill with metadata read from playlist
-     *     (in-out, list of (Tuple *), may contain null pointers) */
-    bool_t (* load) (const char * path, VFSFile * file, char * * title,
-     Index * filenames, Index * tuples);
-
-    /* path: URI of playlist file (in)
-     * file: VFS handle of playlist file (in, write-only file, not seekable)
-     * title: title of playlist (in)
-     * filenames: container filled with URIs to be written to playlist
-     *     (in, list of (char *))
-     * tuples: container filled with metadata to be written to playlist
-     *     (in, list of (Tuple *), may contain null pointers) */
-    bool_t (* save) (const char * path, VFSFile * file, const char * title,
-     Index * filenames, Index * tuples);
-};
-
-struct _OutputPlugin
-{
-    PLUGIN_COMMON_FIELDS
-
-    /* During probing, plugins with higher priority (10 to 0) are tried first. */
-    int probe_priority;
-
-    /* Returns current volume for left and right channels (0 to 100). */
-    void (* get_volume) (int * l, int * r);
-
-    /* Changes volume for left and right channels (0 to 100). */
-    void (* set_volume) (int l, int r);
-
-    /* Begins playback of a PCM stream.  <format> is one of the FMT_*
-     * enumeration values defined in libaudcore/audio.h.  Returns nonzero on
-     * success. */
-    bool_t (* open_audio) (int format, int rate, int chans);
-
-    /* Ends playback.  Any buffered audio data is discarded. */
-    void (* close_audio) (void);
-
-    /* Returns how many bytes of data may be passed to a following write_audio()
-     * call.  NULL if the plugin supports only blocking writes (not recommended). */
-    int (* buffer_free) (void);
-
-    /* Waits until buffer_free() will return a size greater than zero.
-     * output_time(), pause(), and flush() may be called meanwhile; if flush()
-     * is called, period_wait() should return immediately.  NULL if the plugin
-     * supports only blocking writes (not recommended). */
-    void (* period_wait) (void);
-
-    /* Buffers <size> bytes of data, in the format given to open_audio(). */
-    void (* write_audio) (void * data, int size);
-
-    /* Waits until all buffered data has been heard by the user. */
-    void (* drain) (void);
-
-    /* Returns time count (in milliseconds) of how much data has been heard by
-     * the user. */
-    int (* output_time) (void);
-
-    /* Pauses the stream if <p> is nonzero; otherwise unpauses it.
-     * write_audio() will not be called while the stream is paused. */
-    void (* pause) (bool_t p);
-
-    /* Discards any buffered audio data and sets the time counter (in
-     * milliseconds) of data written. */
-    void (* flush) (int time);
-
-    /* Whether close_audio() and open_audio() must always be called between
-     * songs, even if the audio format is the same.  Note that this defeats
-     * gapless playback. */
-    bool_t force_reopen;
-};
-
-struct _EffectPlugin
-{
-    PLUGIN_COMMON_FIELDS
-
-    /* All processing is done in floating point.  If the effect plugin wants to
-     * change the channel count or sample rate, it can change the parameters
-     * passed to start().  They cannot be changed in the middle of a song. */
-    void (* start) (int * channels, int * rate);
-
-    /* process() has two options: modify the samples in place and leave the data
-     * pointer unchanged or copy them into a buffer of its own.  If it sets the
-     * pointer to dynamically allocated memory, it is the plugin's job to free
-     * that memory.  process() may return different lengths of audio than it is
-     * passed, even a zero length. */
-    void (* process) (float * * data, int * samples);
-
-    /* Optional.  A seek is taking place; any buffers should be discarded. */
-    void (* flush) (void);
-
-    /* Exactly like process() except that any buffers should be drained (i.e.
-     * the data processed and returned).  finish() will be called a second time
-     * at the end of the last song in the playlist. */
-    void (* finish) (float * * data, int * samples);
-
-    /* Required only for plugins that change the time domain (e.g. a time
-     * stretch) or use read-ahead buffering.  translate_delay() must do two
-     * things: first, translate <delay> (which is in milliseconds) from the
-     * output time domain back to the input time domain; second, increase
-     * <delay> by the size of the read-ahead buffer.  It should return the
-     * adjusted delay. */
-    int (* adjust_delay) (int delay);
-
-    /* Effects with lowest order (0 to 9) are applied first. */
-    int order;
-
-    /* If the effect does not change the number of channels or the sampling
-     * rate, it can be enabled and disabled more smoothly. */
-    bool_t preserves_format;
-};
-
-struct _InputPlugin
-{
-    PLUGIN_COMMON_FIELDS
-
-    /* Nonzero if the files handled by the plugin may contain more than one
-     * song.  When reading the tuple for such a file, the plugin should set the
-     * FIELD_SUBSONG_NUM field to the number of songs in the file.  For all
-     * other files, the field should be left unset.
-     *
-     * Example:
-     * 1. User adds a file named "somefile.xxx" to the playlist.  Having
-     * determined that this plugin can handle the file, Audacious opens the file
-     * and calls probe_for_tuple().  probe_for_tuple() sees that there are 3
-     * songs in the file and sets FIELD_SUBSONG_NUM to 3.
-     * 2. For each song in the file, Audacious opens the file and calls
-     * probe_for_tuple() -- this time, however, a question mark and song number
-     * are appended to the file name passed: "somefile.sid?2" refers to the
-     * second song in the file "somefile.sid".
-     * 3. When one of the songs is played, Audacious opens the file and calls
-     * play() with a file name modified in this way.
-     */
-    bool_t have_subtune;
-
-    /* Pointer to an array (terminated with NULL) of file extensions associated
-     * with file types the plugin can handle. */
-    const char * const * extensions;
-    /* Pointer to an array (terminated with NULL) of MIME types the plugin can
-     * handle. */
-    const char * const * mimes;
-
-    /* Pointer to an array (terminated with NULL) of custom URI schemes the
-     * plugin supports.  Plugins using custom URI schemes are expected to
-     * handle their own I/O.  Hence, any VFSFile pointers passed to play(),
-     * probe_for_tuple(), etc. will be NULL. */
-    const char * const * schemes;
-
-    /* How quickly the plugin should be tried in searching for a plugin to
-     * handle a file which could not be identified from its extension.  Plugins
-     * with priority 0 are tried first, 10 last. */
-    int priority;
-
-    /* Returns TRUE if the plugin can handle the file. */
-    bool_t (* is_our_file_from_vfs) (const char * filename, VFSFile * file);
-
-    /* Reads metadata from the file, returning a reference to the tuple produced. */
-    Tuple * (* probe_for_tuple) (const char * filename, VFSFile * file);
-
-    /* Plays the file.  Returns FALSE on error.  Also see input-api.h. */
-    bool_t (* play) (const char * filename, VFSFile * file);
-
-    /* Optional.  Writes metadata to the file, returning FALSE on error. */
-    bool_t (* update_song_tuple) (const char * filename, VFSFile * file, const Tuple * tuple);
-
-    /* Optional.  Reads an album art image (JPEG or PNG data) from the file.
-     * Returns a pointer to the data along with its size in bytes.  The returned
-     * data will be freed when no longer needed.  Returns FALSE on error. */
-    bool_t (* get_song_image) (const char * filename, VFSFile * file,
-     void * * data, int64_t * size);
-
-    /* Optional.  Displays a window showing info about the file.  In general,
-     * this function should be avoided since Audacious already provides a file
-     * info window. */
-    void (* file_info_box) (const char * filename);
-};
-
-struct _GeneralPlugin
-{
-    PLUGIN_COMMON_FIELDS
-
-    bool_t enabled_by_default;
-
-    /* GtkWidget * (* get_widget) (void); */
-    void * (* get_widget) (void);
-};
-
-struct _VisPlugin
-{
-    PLUGIN_COMMON_FIELDS
-
-    /* reset internal state and clear display */
-    void (* clear) (void);
-
-    /* 512 frames of a single-channel PCM signal */
-    void (* render_mono_pcm) (const float * pcm);
-
-    /* 512 frames of an interleaved multi-channel PCM signal */
-    void (* render_multi_pcm) (const float * pcm, int channels);
-
-    /* intensity of frequencies 1/512, 2/512, ..., 256/512 of sample rate */
-    void (* render_freq) (const float * freq);
-
-    /* GtkWidget * (* get_widget) (void); */
-    void * (* get_widget) (void);
-};
-
-struct _IfacePlugin
-{
-    PLUGIN_COMMON_FIELDS
-
-    void (* show) (bool_t show);
-
-    void (* run_gtk_plugin) (void /* GtkWidget */ * widget, const char * name);
-    void (* stop_gtk_plugin) (void /* GtkWidget */ * widget);
-};
-
-#undef PLUGIN_COMMON_FIELDS
-
-#define AUD_PLUGIN(stype, itype, ...) \
-AudAPITable * _aud_api_table = NULL; \
-stype _aud_plugin_self = { \
- .magic = _AUD_PLUGIN_MAGIC, \
- .version = _AUD_PLUGIN_VERSION, \
- .type = itype, \
- .size = sizeof (stype), \
- __VA_ARGS__}; \
-stype * get_plugin_info (AudAPITable * table) { \
-    _aud_api_table = table; \
-    return & _aud_plugin_self; \
-}
-
-#define AUD_TRANSPORT_PLUGIN(...) AUD_PLUGIN (TransportPlugin, PLUGIN_TYPE_TRANSPORT, __VA_ARGS__)
-#define AUD_PLAYLIST_PLUGIN(...) AUD_PLUGIN (PlaylistPlugin, PLUGIN_TYPE_PLAYLIST, __VA_ARGS__)
-#define AUD_INPUT_PLUGIN(...) AUD_PLUGIN (InputPlugin, PLUGIN_TYPE_INPUT, __VA_ARGS__)
-#define AUD_EFFECT_PLUGIN(...) AUD_PLUGIN (EffectPlugin, PLUGIN_TYPE_EFFECT, __VA_ARGS__)
-#define AUD_OUTPUT_PLUGIN(...) AUD_PLUGIN (OutputPlugin, PLUGIN_TYPE_OUTPUT, __VA_ARGS__)
-#define AUD_VIS_PLUGIN(...) AUD_PLUGIN (VisPlugin, PLUGIN_TYPE_VIS, __VA_ARGS__)
-#define AUD_GENERAL_PLUGIN(...) AUD_PLUGIN (GeneralPlugin, PLUGIN_TYPE_GENERAL, __VA_ARGS__)
-#define AUD_IFACE_PLUGIN(...) AUD_PLUGIN (IfacePlugin, PLUGIN_TYPE_IFACE, __VA_ARGS__)
-
-#define PLUGIN_HAS_FUNC(p, func) \
- ((p)->size > (char *) & (p)->func - (char *) (p) && (p)->func)
-
-#endif /* AUDACIOUS_PLUGIN_H */
diff --git a/src/audacious/pluginenum.c b/src/audacious/pluginenum.c
deleted file mode 100644
index 58216a564293..000000000000
--- a/src/audacious/pluginenum.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * pluginenum.c
- * Copyright 2007-2013 William Pitcock and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <assert.h>
-#include <errno.h>
-#include <pthread.h>
-#include <string.h>
-#include <sys/stat.h>
-
-#include <glib.h>
-#include <glib/gstdio.h>
-#include <gmodule.h>
-
-#include <libaudcore/audstrings.h>
-#include <libaudgui/init.h>
-
-#include "debug.h"
-#include "plugin.h"
-#include "util.h"
-
-#define AUD_API_DECLARE
-#include "drct.h"
-#include "input.h"
-#include "misc.h"
-#include "playlist.h"
-#include "plugins.h"
-#undef AUD_API_DECLARE
-
-static const char * plugin_dir_list[] = {
-    "Transport",
-    "Container",
-    "Input",
-    "Output",
-    "Effect",
-    "General",
-    "Visualization"
-};
-
-char verbose = 0;
-
-AudAPITable api_table = {
- .drct_api = & drct_api,
- .input_api = & input_api,
- .misc_api = & misc_api,
- .playlist_api = & playlist_api,
- .plugins_api = & plugins_api,
- .verbose = & verbose};
-
-typedef struct {
-    Plugin * header;
-    GModule * module;
-} LoadedModule;
-
-static GList * loaded_modules = NULL;
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-
-Plugin * plugin_load (const char * filename)
-{
-    AUDDBG ("Loading plugin: %s.\n", filename);
-
-    GModule * module = g_module_open (filename, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
-    if (! module)
-    {
-        fprintf (stderr, " *** ERROR: %s could not be loaded: %s\n", filename,
-         g_module_error ());
-        return NULL;
-    }
-
-    void * ptr;
-    if (! g_module_symbol (module, "get_plugin_info", & ptr))
-        ptr = NULL;
-
-    Plugin * (* func) (AudAPITable * table) = ptr;
-    Plugin * header;
-
-    if (! func || ! (header = func (& api_table)) || header->magic != _AUD_PLUGIN_MAGIC)
-    {
-        fprintf (stderr, " *** ERROR: %s is not a valid Audacious plugin.\n", filename);
-        g_module_close (module);
-        return NULL;
-    }
-
-    if (header->version < _AUD_PLUGIN_VERSION_MIN ||
-        header->version > _AUD_PLUGIN_VERSION)
-    {
-        fprintf (stderr, " *** ERROR: %s is not compatible with this version "
-         "of Audacious.\n", filename);
-        g_module_close (module);
-        return NULL;
-    }
-
-    if (header->type == PLUGIN_TYPE_TRANSPORT ||
-        header->type == PLUGIN_TYPE_PLAYLIST ||
-        header->type == PLUGIN_TYPE_INPUT ||
-        header->type == PLUGIN_TYPE_EFFECT)
-    {
-        if (PLUGIN_HAS_FUNC (header, init) && ! header->init ())
-        {
-            fprintf (stderr, " *** ERROR: %s failed to initialize.\n", filename);
-            g_module_close (module);
-            return NULL;
-        }
-    }
-
-    pthread_mutex_lock (& mutex);
-    LoadedModule * loaded = g_slice_new (LoadedModule);
-    loaded->header = header;
-    loaded->module = module;
-    loaded_modules = g_list_prepend (loaded_modules, loaded);
-    pthread_mutex_unlock (& mutex);
-
-    return header;
-}
-
-static void plugin2_unload (LoadedModule * loaded)
-{
-    Plugin * header = loaded->header;
-
-    switch (header->type)
-    {
-    case PLUGIN_TYPE_TRANSPORT:
-    case PLUGIN_TYPE_PLAYLIST:
-    case PLUGIN_TYPE_INPUT:
-    case PLUGIN_TYPE_EFFECT:
-        if (PLUGIN_HAS_FUNC (header, cleanup))
-            header->cleanup ();
-        break;
-    }
-
-    pthread_mutex_lock (& mutex);
-#ifndef VALGRIND_FRIENDLY
-    g_module_close (loaded->module);
-#endif
-    g_slice_free (LoadedModule, loaded);
-    pthread_mutex_unlock (& mutex);
-}
-
-/******************************************************************/
-
-static bool_t scan_plugin_func(const char * path, const char * basename, void * data)
-{
-    if (!str_has_suffix_nocase(basename, PLUGIN_SUFFIX))
-        return FALSE;
-
-    GStatBuf st;
-    if (g_stat (path, & st) < 0)
-    {
-        fprintf (stderr, "Unable to stat %s: %s\n", path, strerror (errno));
-        return FALSE;
-    }
-
-    if (S_ISREG (st.st_mode))
-        plugin_register (path, st.st_mtime);
-
-    return FALSE;
-}
-
-static void scan_plugins(const char * path)
-{
-    dir_foreach (path, scan_plugin_func, NULL);
-}
-
-void plugin_system_init(void)
-{
-    assert (g_module_supported ());
-
-    audgui_init (& api_table, _AUD_PLUGIN_VERSION);
-
-    plugin_registry_load ();
-
-    const char * path = get_path (AUD_PATH_PLUGIN_DIR);
-
-    for (int i = 0; i < ARRAY_LEN (plugin_dir_list); i ++)
-    {
-        char * dir = filename_build (path, plugin_dir_list[i]);
-        scan_plugins (dir);
-        str_unref (dir);
-    }
-
-    plugin_registry_prune ();
-}
-
-void plugin_system_cleanup(void)
-{
-    plugin_registry_save ();
-
-    for (GList * node = loaded_modules; node != NULL; node = node->next)
-        plugin2_unload (node->data);
-
-    g_list_free (loaded_modules);
-    loaded_modules = NULL;
-
-    audgui_cleanup ();
-}
diff --git a/src/audacious/plugins-api.h b/src/audacious/plugins-api.h
deleted file mode 100644
index af4c1b270a96..000000000000
--- a/src/audacious/plugins-api.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * plugins-api.h
- * Copyright 2010-2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-/* Do not include this file directly; use misc.h instead. */
-
-/* CAUTION: These functions are not thread safe. */
-
-/* plugin-init.c */
-AUD_FUNC1 (PluginHandle *, plugin_get_current, int, type)
-AUD_FUNC2 (bool_t, plugin_enable, PluginHandle *, plugin, bool_t, enable)
-AUD_FUNC1 (PluginHandle *, plugin_by_widget, void /* GtkWidget */ *, widget)
-AUD_FUNC4 (int, plugin_send_message, PluginHandle *, plugin,
- const char *, code, const void *, data, int, size)
-
-/* plugin-registry.c */
-AUD_FUNC1 (int, plugin_get_type, PluginHandle *, plugin)
-AUD_FUNC1 (const char *, plugin_get_filename, PluginHandle *, plugin)
-AUD_FUNC1 (PluginHandle *, plugin_lookup, const char *, filename)
-AUD_FUNC1 (PluginHandle *, plugin_lookup_basename, const char *, basename)
-
-AUD_FUNC1 (const void *, plugin_get_header, PluginHandle *, plugin)
-AUD_FUNC1 (PluginHandle *, plugin_by_header, const void *, header)
-
-AUD_FUNC1 (int, plugin_count, int, type)
-AUD_FUNC1 (int, plugin_get_index, PluginHandle *, plugin)
-AUD_FUNC2 (PluginHandle *, plugin_by_index, int, type, int, index)
-
-AUD_FUNC2 (int, plugin_compare, PluginHandle *, a, PluginHandle *, b)
-AUD_VFUNC3 (plugin_for_each, int, type, PluginForEachFunc, func, void *, data)
-
-AUD_FUNC1 (bool_t, plugin_get_enabled, PluginHandle *, plugin)
-AUD_VFUNC3 (plugin_for_enabled, int, type, PluginForEachFunc, func,
- void *, data)
-
-AUD_FUNC1 (const char *, plugin_get_name, PluginHandle *, plugin)
-AUD_FUNC1 (bool_t, plugin_has_about, PluginHandle *, plugin)
-AUD_FUNC1 (bool_t, plugin_has_configure, PluginHandle *, plugin)
-AUD_VFUNC1 (plugin_do_about, PluginHandle *, plugin)
-AUD_VFUNC1 (plugin_do_configure, PluginHandle *, plugin)
-
-AUD_VFUNC3 (plugin_add_watch, PluginHandle *, plugin, PluginForEachFunc,
- func, void *, data)
-AUD_VFUNC3 (plugin_remove_watch, PluginHandle *, plugin, PluginForEachFunc,
- func, void *, data)
diff --git a/src/audacious/plugins.h b/src/audacious/plugins.h
deleted file mode 100644
index ea956ee9df47..000000000000
--- a/src/audacious/plugins.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * plugins.h
- * Copyright 2010-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_PLUGINS_H
-#define AUDACIOUS_PLUGINS_H
-
-#include <audacious/api.h>
-#include <audacious/types.h>
-#include <libaudcore/core.h>
-
-/* returns TRUE to call again for the next plugin, FALSE to stop */
-typedef bool_t (* PluginForEachFunc) (PluginHandle * plugin, void * data);
-
-#define AUD_API_NAME PluginsAPI
-#define AUD_API_SYMBOL plugins_api
-
-#ifdef _AUDACIOUS_CORE
-
-#include "api-local-begin.h"
-#include "plugins-api.h"
-#include "api-local-end.h"
-
-enum {
- INPUT_KEY_SCHEME,
- INPUT_KEY_EXTENSION,
- INPUT_KEY_MIME,
- INPUT_KEYS};
-
-/* plugin-init.c */
-void start_plugins_one (void);
-void start_plugins_two (void);
-void stop_plugins_two (void);
-void stop_plugins_one (void);
-
-/* plugin-registry.c */
-void plugin_registry_load (void);
-void plugin_registry_prune (void);
-void plugin_registry_save (void);
-
-void plugin_register (const char * path, int timestamp);
-
-void plugin_set_enabled (PluginHandle * plugin, bool_t enabled);
-void * plugin_get_misc_data (PluginHandle * plugin, int size);
-
-PluginHandle * transport_plugin_for_scheme (const char * scheme);
-void playlist_plugin_for_ext (const char * ext, PluginForEachFunc func, void * data);
-void input_plugin_for_key (int key, const char * value, PluginForEachFunc func, void * data);
-bool_t input_plugin_has_images (PluginHandle * plugin);
-bool_t input_plugin_has_subtunes (PluginHandle * plugin);
-bool_t input_plugin_can_write_tuple (PluginHandle * plugin);
-bool_t input_plugin_has_infowin (PluginHandle * plugin);
-
-/* pluginenum.c */
-void plugin_system_init (void);
-void plugin_system_cleanup (void);
-Plugin * plugin_load (const char * path);
-
-#else
-
-#include <audacious/api-define-begin.h>
-#include <audacious/plugins-api.h>
-#include <audacious/api-define-end.h>
-
-#include <audacious/api-alias-begin.h>
-#include <audacious/plugins-api.h>
-#include <audacious/api-alias-end.h>
-
-#endif
-
-#undef AUD_API_NAME
-#undef AUD_API_SYMBOL
-
-#endif
-
-#ifdef AUD_API_DECLARE
-
-#define AUD_API_NAME PluginsAPI
-#define AUD_API_SYMBOL plugins_api
-
-#include "api-define-begin.h"
-#include "plugins-api.h"
-#include "api-define-end.h"
-
-#include "api-declare-begin.h"
-#include "plugins-api.h"
-#include "api-declare-end.h"
-
-#undef AUD_API_NAME
-#undef AUD_API_SYMBOL
-
-#endif
diff --git a/src/audacious/preferences.c b/src/audacious/preferences.c
deleted file mode 100644
index eb1b65116a36..000000000000
--- a/src/audacious/preferences.c
+++ /dev/null
@@ -1,641 +0,0 @@
-/*
- * preferences.c
- * Copyright 2007-2012 Tomasz Moń, William Pitcock, and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include "preferences.h"
-
-#include <string.h>
-#include <gtk/gtk.h>
-
-#include "i18n.h"
-#include "misc.h"
-
-/* HELPERS */
-
-static bool_t widget_get_bool (const PreferencesWidget * widget)
-{
-    g_return_val_if_fail (widget->cfg_type == VALUE_BOOLEAN, FALSE);
-
-    if (widget->cfg)
-        return * (bool_t *) widget->cfg;
-    else if (widget->cname)
-        return get_bool (widget->csect, widget->cname);
-    else
-        return FALSE;
-}
-
-static void widget_set_bool (const PreferencesWidget * widget, bool_t value)
-{
-    g_return_if_fail (widget->cfg_type == VALUE_BOOLEAN);
-
-    if (widget->cfg)
-        * (bool_t *) widget->cfg = value;
-    else if (widget->cname)
-        set_bool (widget->csect, widget->cname, value);
-
-    if (widget->callback)
-        widget->callback ();
-}
-
-static int widget_get_int (const PreferencesWidget * widget)
-{
-    g_return_val_if_fail (widget->cfg_type == VALUE_INT, 0);
-
-    if (widget->cfg)
-        return * (int *) widget->cfg;
-    else if (widget->cname)
-        return get_int (widget->csect, widget->cname);
-    else
-        return 0;
-}
-
-static void widget_set_int (const PreferencesWidget * widget, int value)
-{
-    g_return_if_fail (widget->cfg_type == VALUE_INT);
-
-    if (widget->cfg)
-        * (int *) widget->cfg = value;
-    else if (widget->cname)
-        set_int (widget->csect, widget->cname, value);
-
-    if (widget->callback)
-        widget->callback ();
-}
-
-static double widget_get_double (const PreferencesWidget * widget)
-{
-    g_return_val_if_fail (widget->cfg_type == VALUE_FLOAT, 0);
-
-    if (widget->cfg)
-        return * (float *) widget->cfg;
-    else if (widget->cname)
-        return get_double (widget->csect, widget->cname);
-    else
-        return 0;
-}
-
-static void widget_set_double (const PreferencesWidget * widget, double value)
-{
-    g_return_if_fail (widget->cfg_type == VALUE_FLOAT);
-
-    if (widget->cfg)
-        * (float *) widget->cfg = value;
-    else if (widget->cname)
-        set_double (widget->csect, widget->cname, value);
-
-    if (widget->callback)
-        widget->callback ();
-}
-
-static char * widget_get_string (const PreferencesWidget * widget)
-{
-    g_return_val_if_fail (widget->cfg_type == VALUE_STRING, NULL);
-
-    if (widget->cfg)
-        return str_get (* (char * *) widget->cfg);
-    else if (widget->cname)
-        return get_str (widget->csect, widget->cname);
-    else
-        return NULL;
-}
-
-static void widget_set_string (const PreferencesWidget * widget, const char * value)
-{
-    g_return_if_fail (widget->cfg_type == VALUE_STRING);
-
-    if (widget->cfg)
-    {
-        g_free (* (char * *) widget->cfg);
-        * (char * *) widget->cfg = g_strdup (value);
-    }
-    else if (widget->cname)
-        set_str (widget->csect, widget->cname, value);
-
-    if (widget->callback)
-        widget->callback ();
-}
-
-/* WIDGET_CHK_BTN */
-
-static void on_toggle_button_toggled (GtkToggleButton * button, const PreferencesWidget * widget)
-{
-    bool_t active = gtk_toggle_button_get_active (button);
-    widget_set_bool (widget, active);
-
-    GtkWidget * child = g_object_get_data ((GObject *) button, "child");
-    if (child)
-        gtk_widget_set_sensitive (child, active);
-}
-
-static void init_toggle_button (GtkWidget * button, const PreferencesWidget * widget)
-{
-    if (widget->cfg_type != VALUE_BOOLEAN)
-        return;
-
-    gtk_toggle_button_set_active ((GtkToggleButton *) button, widget_get_bool (widget));
-    g_signal_connect (button, "toggled", (GCallback) on_toggle_button_toggled, (void *) widget);
-}
-
-/* WIDGET_LABEL */
-
-static void create_label (const PreferencesWidget * widget, GtkWidget * * label,
- GtkWidget * * icon, const char * domain)
-{
-    if (widget->data.label.stock_id)
-        * icon = gtk_image_new_from_icon_name (widget->data.label.stock_id, GTK_ICON_SIZE_BUTTON);
-
-    * label = gtk_label_new_with_mnemonic (dgettext (domain, widget->label));
-    gtk_label_set_use_markup ((GtkLabel *) * label, TRUE);
-
-    if (widget->data.label.single_line == FALSE)
-        gtk_label_set_line_wrap ((GtkLabel *) * label, TRUE);
-
-    gtk_misc_set_alignment ((GtkMisc *) * label, 0, 0.5);
-}
-
-/* WIDGET_RADIO_BTN */
-
-static void on_radio_button_toggled (GtkWidget * button, const PreferencesWidget * widget)
-{
-    if (gtk_toggle_button_get_active ((GtkToggleButton *) button))
-        widget_set_int (widget, widget->data.radio_btn.value);
-}
-
-static void init_radio_button (GtkWidget * button, const PreferencesWidget * widget)
-{
-    if (widget->cfg_type != VALUE_INT)
-        return;
-
-    if (widget_get_int (widget) == widget->data.radio_btn.value)
-        gtk_toggle_button_set_active ((GtkToggleButton *) button, TRUE);
-
-    g_signal_connect (button, "toggled", (GCallback) on_radio_button_toggled, (void *) widget);
-}
-
-/* WIDGET_SPIN_BTN */
-
-static void on_spin_btn_changed_int (GtkSpinButton * button, const PreferencesWidget * widget)
-{
-    widget_set_int (widget, gtk_spin_button_get_value_as_int (button));
-}
-
-static void on_spin_btn_changed_float (GtkSpinButton * button, const PreferencesWidget * widget)
-{
-    widget_set_double (widget, gtk_spin_button_get_value (button));
-}
-
-static void create_spin_button (const PreferencesWidget * widget,
- GtkWidget * * label_pre, GtkWidget * * spin_btn, GtkWidget * * label_past,
- const char * domain)
-{
-    * label_pre = gtk_label_new (dgettext (domain, widget->label));
-    * spin_btn = gtk_spin_button_new_with_range (widget->data.spin_btn.min,
-     widget->data.spin_btn.max, widget->data.spin_btn.step);
-
-    if (widget->tooltip)
-        gtk_widget_set_tooltip_text (* spin_btn, dgettext (domain, widget->tooltip));
-
-    if (widget->data.spin_btn.right_label)
-        * label_past = gtk_label_new (dgettext (domain, widget->data.spin_btn.right_label));
-
-    switch (widget->cfg_type)
-    {
-    case VALUE_INT:
-        gtk_spin_button_set_value ((GtkSpinButton *) * spin_btn, widget_get_int (widget));
-        g_signal_connect (* spin_btn, "value_changed", (GCallback)
-         on_spin_btn_changed_int, (void *) widget);
-        break;
-
-    case VALUE_FLOAT:
-        gtk_spin_button_set_value ((GtkSpinButton *) * spin_btn, widget_get_double (widget));
-        g_signal_connect (* spin_btn, "value_changed", (GCallback)
-         on_spin_btn_changed_float, (void *) widget);
-        break;
-
-    default:
-        break;
-    }
-}
-
-/* WIDGET_FONT_BTN */
-
-static void on_font_btn_font_set (GtkFontButton * button, const PreferencesWidget * widget)
-{
-    widget_set_string (widget, gtk_font_button_get_font_name (button));
-}
-
-void create_font_btn (const PreferencesWidget * widget, GtkWidget * * label,
- GtkWidget * * font_btn, const char * domain)
-{
-    * font_btn = gtk_font_button_new ();
-    gtk_font_button_set_use_font ((GtkFontButton *) * font_btn, TRUE);
-    gtk_font_button_set_use_size ((GtkFontButton *) * font_btn, TRUE);
-    gtk_widget_set_hexpand (* font_btn, TRUE);
-
-    if (widget->label)
-    {
-        * label = gtk_label_new_with_mnemonic (dgettext (domain, widget->label));
-        gtk_label_set_use_markup ((GtkLabel *) * label, TRUE);
-        gtk_misc_set_alignment ((GtkMisc *) * label, 1, 0.5);
-        gtk_label_set_justify ((GtkLabel *) * label, GTK_JUSTIFY_RIGHT);
-        gtk_label_set_mnemonic_widget ((GtkLabel *) * label, * font_btn);
-    }
-
-    if (widget->data.font_btn.title)
-        gtk_font_button_set_title ((GtkFontButton *) * font_btn,
-         dgettext (domain, widget->data.font_btn.title));
-
-    char * name = widget_get_string (widget);
-    if (name)
-    {
-        gtk_font_button_set_font_name ((GtkFontButton *) * font_btn, name);
-        str_unref (name);
-    }
-
-    g_signal_connect (* font_btn, "font_set", (GCallback) on_font_btn_font_set, (void *) widget);
-}
-
-/* WIDGET_ENTRY */
-
-static void on_entry_changed (GtkEntry * entry, const PreferencesWidget * widget)
-{
-    widget_set_string (widget, gtk_entry_get_text (entry));
-}
-
-static void create_entry (const PreferencesWidget * widget, GtkWidget * * label,
- GtkWidget * * entry, const char * domain)
-{
-    * entry = gtk_entry_new ();
-    gtk_entry_set_visibility ((GtkEntry *) * entry, ! widget->data.entry.password);
-    gtk_widget_set_hexpand (* entry, TRUE);
-
-    if (widget->label)
-        * label = gtk_label_new (dgettext (domain, widget->label));
-
-    if (widget->tooltip)
-        gtk_widget_set_tooltip_text (* entry, dgettext (domain, widget->tooltip));
-
-    if (widget->cfg_type == VALUE_STRING)
-    {
-        char * value = widget_get_string (widget);
-        if (value)
-        {
-            gtk_entry_set_text ((GtkEntry *) * entry, value);
-            str_unref (value);
-        }
-
-        g_signal_connect (* entry, "changed", (GCallback) on_entry_changed, (void *) widget);
-    }
-}
-
-/* WIDGET_COMBO_BOX */
-
-static void on_cbox_changed_int (GtkComboBox * combobox, const PreferencesWidget * widget)
-{
-    int position = gtk_combo_box_get_active (combobox);
-    const ComboBoxElements * elements = g_object_get_data ((GObject *) combobox, "comboboxelements");
-    widget_set_int (widget, GPOINTER_TO_INT (elements[position].value));
-}
-
-static void on_cbox_changed_string (GtkComboBox * combobox, const PreferencesWidget * widget)
-{
-    int position = gtk_combo_box_get_active (combobox);
-    const ComboBoxElements * elements = g_object_get_data ((GObject *) combobox, "comboboxelements");
-    widget_set_string (widget, elements[position].value);
-}
-
-static void fill_cbox (GtkWidget * combobox, const PreferencesWidget * widget, const char * domain)
-{
-    const ComboBoxElements * elements = widget->data.combo.elements;
-    int n_elements = widget->data.combo.n_elements;
-
-    if (widget->data.combo.fill)
-        elements = widget->data.combo.fill (& n_elements);
-
-    g_object_set_data ((GObject *) combobox, "comboboxelements", (void *) elements);
-
-    for (int i = 0; i < n_elements; i ++)
-        gtk_combo_box_text_append_text ((GtkComboBoxText *) combobox,
-         dgettext (domain, elements[i].label));
-
-    switch (widget->cfg_type)
-    {
-    case VALUE_INT:;
-        int ivalue = widget_get_int (widget);
-
-        for (int i = 0; i < n_elements; i++)
-        {
-            if (GPOINTER_TO_INT (elements[i].value) == ivalue)
-            {
-                gtk_combo_box_set_active ((GtkComboBox *) combobox, i);
-                break;
-            }
-        }
-
-        g_signal_connect (combobox, "changed", (GCallback) on_cbox_changed_int, (void *) widget);
-        break;
-
-    case VALUE_STRING:;
-        char * value = widget_get_string (widget);
-
-        for(int i = 0; i < n_elements; i++)
-        {
-            if (value && ! strcmp (elements[i].value, value))
-            {
-                gtk_combo_box_set_active ((GtkComboBox *) combobox, i);
-                break;
-            }
-        }
-
-        str_unref (value);
-
-        g_signal_connect (combobox, "changed", (GCallback) on_cbox_changed_string, (void *) widget);
-        break;
-
-    default:
-        break;
-    }
-}
-
-static void create_cbox (const PreferencesWidget * widget, GtkWidget * * label,
- GtkWidget * * combobox, const char * domain)
-{
-    * combobox = gtk_combo_box_text_new ();
-
-    if (widget->label)
-        * label = gtk_label_new (dgettext (domain, widget->label));
-
-    fill_cbox (* combobox, widget, domain);
-}
-
-/* WIDGET_TABLE */
-
-static void fill_grid (GtkWidget * grid, const PreferencesWidget * elements,
- int n_elements, const char * domain)
-{
-    for (int i = 0; i < n_elements; i ++)
-    {
-        GtkWidget * widget_left = NULL, * widget_middle = NULL, * widget_right = NULL;
-
-        switch (elements[i].type)
-        {
-            case WIDGET_SPIN_BTN:
-                create_spin_button (& elements[i], & widget_left,
-                 & widget_middle, & widget_right, domain);
-                break;
-
-            case WIDGET_LABEL:
-                create_label (& elements[i], & widget_middle, & widget_left, domain);
-                break;
-
-            case WIDGET_FONT_BTN:
-                create_font_btn (& elements[i], & widget_left, & widget_middle, domain);
-                break;
-
-            case WIDGET_ENTRY:
-                create_entry (& elements[i], & widget_left, & widget_middle, domain);
-                break;
-
-            case WIDGET_COMBO_BOX:
-                create_cbox (& elements[i], & widget_left, & widget_middle, domain);
-                break;
-
-            default:
-                break;
-        }
-
-        if (widget_left)
-            gtk_grid_attach ((GtkGrid *) grid, widget_left, 0, i, 1, 1);
-
-        if (widget_middle)
-            gtk_grid_attach ((GtkGrid *) grid, widget_middle, 1, i, 1, 1);
-
-        if (widget_right)
-            gtk_grid_attach ((GtkGrid *) grid, widget_right, 2, i, 1, 1);
-    }
-}
-
-/* ALL WIDGETS */
-
-/* box: a GtkBox */
-void create_widgets_with_domain (void * box, const PreferencesWidget * widgets,
- int n_widgets, const char * domain)
-{
-    GtkWidget * widget = NULL, * child_box = NULL;
-    GSList * radio_btn_group = NULL;
-
-    for (int i = 0; i < n_widgets; i ++)
-    {
-        GtkWidget * label = NULL;
-
-        if (widget && widgets[i].child)
-        {
-            if (! child_box)
-            {
-                child_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-                g_object_set_data ((GObject *) widget, "child", child_box);
-
-                GtkWidget * alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
-                gtk_box_pack_start (box, alignment, FALSE, FALSE, 0);
-                gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 0, 12, 0);
-                gtk_container_add ((GtkContainer *) alignment, child_box);
-
-                if (GTK_IS_TOGGLE_BUTTON (widget))
-                    gtk_widget_set_sensitive (child_box,
-                     gtk_toggle_button_get_active ((GtkToggleButton *) widget));
-            }
-        }
-        else
-            child_box = NULL;
-
-        GtkWidget * alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
-        gtk_alignment_set_padding ((GtkAlignment *) alignment, 6, 0, 12, 0);
-        gtk_box_pack_start (child_box ? (GtkBox *) child_box : box, alignment, FALSE, FALSE, 0);
-
-        widget = NULL;
-
-        if (radio_btn_group && widgets[i].type != WIDGET_RADIO_BTN)
-            radio_btn_group = NULL;
-
-        switch (widgets[i].type)
-        {
-            case WIDGET_CHK_BTN:
-                widget = gtk_check_button_new_with_mnemonic (dgettext (domain, widgets[i].label));
-                init_toggle_button (widget, & widgets[i]);
-                break;
-
-            case WIDGET_LABEL:
-                if (strstr (widgets[i].label, "<b>"))
-                    gtk_alignment_set_padding ((GtkAlignment *) alignment,
-                     (i == 0) ? 0 : 12, 0, 0, 0);
-
-                GtkWidget * icon = NULL;
-                create_label (& widgets[i], & label, & icon, domain);
-
-                if (icon)
-                {
-                    widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-                    gtk_box_pack_start ((GtkBox *) widget, icon, FALSE, FALSE, 0);
-                    gtk_box_pack_start ((GtkBox *) widget, label, FALSE, FALSE, 0);
-                }
-                else
-                    widget = label;
-
-                break;
-
-            case WIDGET_RADIO_BTN:
-                widget = gtk_radio_button_new_with_mnemonic (radio_btn_group,
-                 dgettext (domain, widgets[i].label));
-                radio_btn_group = gtk_radio_button_get_group ((GtkRadioButton *) widget);
-                init_radio_button (widget, & widgets[i]);
-                break;
-
-            case WIDGET_SPIN_BTN:
-                widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-
-                GtkWidget * label_pre = NULL, * spin_btn = NULL, * label_past = NULL;
-                create_spin_button (& widgets[i], & label_pre, & spin_btn, & label_past, domain);
-
-                if (label_pre)
-                    gtk_box_pack_start ((GtkBox *) widget, label_pre, FALSE, FALSE, 0);
-                if (spin_btn)
-                    gtk_box_pack_start ((GtkBox *) widget, spin_btn, FALSE, FALSE, 0);
-                if (label_past)
-                    gtk_box_pack_start ((GtkBox *) widget, label_past, FALSE, FALSE, 0);
-
-                break;
-
-            case WIDGET_CUSTOM:
-                if (widgets[i].data.populate)
-                    widget = widgets[i].data.populate ();
-
-                break;
-
-            case WIDGET_FONT_BTN:
-                widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-
-                GtkWidget * font_btn = NULL;
-                create_font_btn (& widgets[i], & label, & font_btn, domain);
-
-                if (label)
-                    gtk_box_pack_start ((GtkBox *) widget, label, FALSE, FALSE, 0);
-                if (font_btn)
-                    gtk_box_pack_start ((GtkBox *) widget, font_btn, FALSE, FALSE, 0);
-
-                break;
-
-            case WIDGET_TABLE:
-                widget = gtk_grid_new ();
-                gtk_grid_set_column_spacing ((GtkGrid *) widget, 6);
-                gtk_grid_set_row_spacing ((GtkGrid *) widget, 6);
-
-                fill_grid (widget, widgets[i].data.table.elem, widgets[i].data.table.rows, domain);
-
-                break;
-
-            case WIDGET_ENTRY:
-                widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-
-                GtkWidget * entry = NULL;
-                create_entry (& widgets[i], & label, & entry, domain);
-
-                if (label)
-                    gtk_box_pack_start ((GtkBox *) widget, label, FALSE, FALSE, 0);
-                if (entry)
-                    gtk_box_pack_start ((GtkBox *) widget, entry, TRUE, TRUE, 0);
-
-                break;
-
-            case WIDGET_COMBO_BOX:
-                widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-
-                GtkWidget * combo = NULL;
-                create_cbox (& widgets[i], & label, & combo, domain);
-
-                if (label)
-                    gtk_box_pack_start ((GtkBox *) widget, label, FALSE, FALSE, 0);
-                if (combo)
-                    gtk_box_pack_start ((GtkBox *) widget, combo, FALSE, FALSE, 0);
-
-                break;
-
-            case WIDGET_BOX:
-                if (widgets[i].data.box.horizontal)
-                    widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-                else
-                    widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-
-                create_widgets_with_domain ((GtkBox *) widget,
-                 widgets[i].data.box.elem, widgets[i].data.box.n_elem, domain);
-
-                if (widgets[i].data.box.frame)
-                {
-                    GtkWidget * frame = gtk_frame_new (dgettext (domain, widgets[i].label));
-                    gtk_container_add ((GtkContainer *) frame, widget);
-                    widget = frame;
-                }
-
-                break;
-
-            case WIDGET_NOTEBOOK:
-                gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 0, 0, 0);
-
-                widget = gtk_notebook_new ();
-
-                for (int j = 0; j < widgets[i].data.notebook.n_tabs; j ++)
-                {
-                    GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-                    gtk_container_set_border_width ((GtkContainer *) vbox, 6);
-
-                    create_widgets_with_domain ((GtkBox *) vbox,
-                     widgets[i].data.notebook.tabs[j].widgets,
-                     widgets[i].data.notebook.tabs[j].n_widgets, domain);
-
-                    gtk_notebook_append_page ((GtkNotebook *) widget, vbox,
-                     gtk_label_new (dgettext (domain,
-                     widgets[i].data.notebook.tabs[j].name)));
-                }
-
-                break;
-
-            case WIDGET_SEPARATOR:
-                gtk_alignment_set_padding ((GtkAlignment *) alignment, 6, 6, 0, 0);
-
-                widget = gtk_separator_new (widgets[i].data.separator.horizontal
-                 ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL);
-                break;
-
-            default:
-                break;
-        }
-
-        if (widget)
-        {
-            /* use uniform spacing for horizontal boxes */
-            if (gtk_orientable_get_orientation ((GtkOrientable *) box) ==
-             GTK_ORIENTATION_HORIZONTAL)
-                gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 0, 0, 0);
-
-            gtk_container_add ((GtkContainer *) alignment, widget);
-
-            if (widgets[i].tooltip && widgets[i].type != WIDGET_SPIN_BTN)
-                gtk_widget_set_tooltip_text (widget, dgettext (domain,
-                 widgets[i].tooltip));
-        }
-    }
-}
diff --git a/src/audacious/preferences.h b/src/audacious/preferences.h
deleted file mode 100644
index af58567353a9..000000000000
--- a/src/audacious/preferences.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * preferences.h
- * Copyright 2007-2012 Tomasz Moń, William Pitcock, and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_PREFERENCES_H
-#define AUDACIOUS_PREFERENCES_H
-
-#include <audacious/types.h>
-
-typedef enum {
-    WIDGET_NONE,
-    WIDGET_CHK_BTN,
-    WIDGET_LABEL,
-    WIDGET_RADIO_BTN,
-    WIDGET_SPIN_BTN,
-    WIDGET_CUSTOM,           /* 'custom' widget, you hand back the widget you want to add --nenolod */
-    WIDGET_FONT_BTN,
-    WIDGET_TABLE,
-    WIDGET_ENTRY,
-    WIDGET_COMBO_BOX,
-    WIDGET_BOX,
-    WIDGET_NOTEBOOK,
-    WIDGET_SEPARATOR,
-} WidgetType;
-
-typedef enum {
-    VALUE_INT,
-    VALUE_FLOAT,
-    VALUE_BOOLEAN,
-    VALUE_STRING,
-    VALUE_NULL,
-} ValueType;
-
-typedef struct {
-    void * value;
-    const char * label;
-} ComboBoxElements;
-
-struct _NotebookTab;
-
-struct _PreferencesWidget {
-    WidgetType type;          /* widget type */
-    const char * label;       /* widget title (for SPIN_BTN it's text left to widget) */
-    void * cfg;               /* connected config value */
-    void (* callback) (void); /* this func will be called after value change, can be NULL */
-    const char * tooltip;     /* widget tooltip, can be NULL */
-    bool_t child;
-    ValueType cfg_type;       /* connected value type */
-    const char * csect;       /* config file section */
-    const char * cname;       /* config file key name */
-
-    union {
-        struct {
-            int value;
-        } radio_btn;
-
-        struct {
-            double min, max, step;
-            const char * right_label; /* text right to widget */
-        } spin_btn;
-
-        struct {
-            struct _PreferencesWidget *elem;
-            int rows;
-        } table;
-
-        struct {
-            const char * stock_id;
-            bool_t single_line; /* FALSE to enable line wrap */
-        } label;
-
-        struct {
-            const char * title;
-        } font_btn;
-
-        struct {
-            bool_t password;
-        } entry;
-
-        struct {
-            /* static init */
-            const ComboBoxElements * elements;
-            int n_elements;
-
-            /* runtime init */
-            const ComboBoxElements * (* fill) (int * n_elements);
-        } combo;
-
-        struct {
-            const struct _PreferencesWidget * elem;
-            int n_elem;
-
-            bool_t horizontal;  /* FALSE gives vertical, TRUE gives horizontal aligment of child widgets */
-            bool_t frame;       /* whether to draw frame around box */
-        } box;
-
-        struct {
-            const struct _NotebookTab * tabs;
-            int n_tabs;
-        } notebook;
-
-        struct {
-            bool_t horizontal; /* FALSE gives vertical, TRUE gives horizontal separator */
-        } separator;
-
-        /* for WIDGET_CUSTOM --nenolod */
-        /* GtkWidget * (* populate) (void); */
-        void * (* populate) (void);
-    } data;
-};
-
-typedef struct _NotebookTab {
-    const char * name;
-    const PreferencesWidget * widgets;
-    int n_widgets;
-} NotebookTab;
-
-struct _PluginPreferences {
-    const PreferencesWidget * widgets;
-    int n_widgets;
-
-    void (*init)(void);
-    void (*apply)(void);
-    void (*cleanup)(void);
-};
-
-#endif /* AUDACIOUS_PREFERENCES_H */
diff --git a/src/audacious/probe-buffer.c b/src/audacious/probe-buffer.c
deleted file mode 100644
index c27995bcee02..000000000000
--- a/src/audacious/probe-buffer.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * probe-buffer.c
- * Copyright 2010-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <string.h>
-
-#include <glib.h>
-
-#include "debug.h"
-#include "probe-buffer.h"
-
-#define BUFSIZE (256 * 1024)
-
-typedef struct
-{
-    VFSFile * file;
-    int filled, at;
-    unsigned char buffer[BUFSIZE];
-}
-ProbeBuffer;
-
-static int probe_buffer_fclose (VFSFile * file)
-{
-    ProbeBuffer * p = vfs_get_handle (file);
-
-    int ret = vfs_fclose (p->file);
-    g_free (p);
-    return ret;
-}
-
-static void increase_buffer (ProbeBuffer * p, int64_t size)
-{
-    size = (size + 0xFF) & ~0xFF;
-
-    if (size > sizeof p->buffer)
-        size = sizeof p->buffer;
-
-    if (p->filled < size)
-        p->filled += vfs_fread (p->buffer + p->filled, 1, size - p->filled,
-         p->file);
-}
-
-static int64_t probe_buffer_fread (void * buffer, int64_t size, int64_t count,
- VFSFile * file)
-{
-    ProbeBuffer * p = vfs_get_handle (file);
-
-    increase_buffer (p, p->at + size * count);
-    int readed = (size > 0) ? MIN (count, (p->filled - p->at) / size) : 0;
-    memcpy (buffer, p->buffer + p->at, size * readed);
-
-    p->at += size * readed;
-    return readed;
-}
-
-static int64_t probe_buffer_fwrite (const void * data, int64_t size, int64_t count,
- VFSFile * file)
-{
-    return 0; /* not allowed */
-}
-
-static int probe_buffer_fseek (VFSFile * file, int64_t offset, int whence)
-{
-    ProbeBuffer * p = vfs_get_handle (file);
-
-    if (whence == SEEK_END)
-        return -1; /* not allowed */
-
-    if (whence == SEEK_CUR)
-        offset += p->at;
-
-    if (offset < 0 || offset > sizeof p->buffer)
-        return -1;
-
-    increase_buffer (p, offset);
-
-    if (offset > p->filled)
-        return -1;
-
-    p->at = offset;
-    return 0;
-}
-
-static int64_t probe_buffer_ftell (VFSFile * file)
-{
-    return ((ProbeBuffer *) vfs_get_handle (file))->at;
-}
-
-static bool_t probe_buffer_feof (VFSFile * file)
-{
-    ProbeBuffer * p = vfs_get_handle (file);
-
-    if (p->at < p->filled)
-        return FALSE;
-    if (p->at == sizeof p->buffer)
-        return TRUE;
-
-    return vfs_feof (p->file);
-}
-
-static int probe_buffer_ftruncate (VFSFile * file, int64_t size)
-{
-    return -1; /* not allowed */
-}
-
-static int64_t probe_buffer_fsize (VFSFile * file)
-{
-    ProbeBuffer * p = vfs_get_handle (file);
-
-    int64_t size = vfs_fsize (p->file);
-    return MIN (size, sizeof p->buffer);
-}
-
-static char * probe_buffer_get_metadata (VFSFile * file, const char * field)
-{
-    return vfs_get_metadata (((ProbeBuffer *) vfs_get_handle (file))->file, field);
-}
-
-static VFSConstructor probe_buffer_table =
-{
-    .vfs_fopen_impl = NULL,
-    .vfs_fclose_impl = probe_buffer_fclose,
-    .vfs_fread_impl = probe_buffer_fread,
-    .vfs_fwrite_impl = probe_buffer_fwrite,
-    .vfs_fseek_impl = probe_buffer_fseek,
-    .vfs_ftell_impl = probe_buffer_ftell,
-    .vfs_feof_impl = probe_buffer_feof,
-    .vfs_ftruncate_impl = probe_buffer_ftruncate,
-    .vfs_fsize_impl = probe_buffer_fsize,
-    .vfs_get_metadata_impl = probe_buffer_get_metadata,
-};
-
-VFSFile * probe_buffer_new (const char * filename)
-{
-    VFSFile * file = vfs_fopen (filename, "r");
-
-    if (! file)
-        return NULL;
-
-    ProbeBuffer * p = g_new (ProbeBuffer, 1);
-    p->file = file;
-    p->filled = 0;
-    p->at = 0;
-
-    return vfs_new (filename, & probe_buffer_table, p);
-}
diff --git a/src/audacious/probe-buffer.h b/src/audacious/probe-buffer.h
deleted file mode 100644
index d1abf962a531..000000000000
--- a/src/audacious/probe-buffer.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * probe-buffer.h
- * Copyright 2010 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_PROBE_BUFFER_H
-#define AUDACIOUS_PROBE_BUFFER_H
-
-#include <libaudcore/vfs.h>
-
-VFSFile * probe_buffer_new (const char * filename);
-
-#endif
diff --git a/src/audacious/probe.c b/src/audacious/probe.c
deleted file mode 100644
index c627abe9be2d..000000000000
--- a/src/audacious/probe.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * probe.c
- * Copyright 2009-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <libaudcore/audstrings.h>
-
-#include "debug.h"
-#include "misc.h"
-#include "playlist.h"
-#include "plugin.h"
-#include "plugins.h"
-#include "probe-buffer.h"
-
-typedef struct
-{
-    const char * filename;
-    VFSFile * handle;
-    bool_t failed;
-    PluginHandle * plugin;
-}
-ProbeState;
-
-static bool_t check_opened (ProbeState * state)
-{
-    if (state->handle != NULL)
-        return TRUE;
-    if (state->failed)
-        return FALSE;
-
-    AUDDBG ("Opening %s.\n", state->filename);
-    state->handle = probe_buffer_new (state->filename);
-
-    if (state->handle != NULL)
-        return TRUE;
-
-    AUDDBG ("FAILED.\n");
-    state->failed = TRUE;
-    return FALSE;
-}
-
-static bool_t probe_func (PluginHandle * plugin, ProbeState * state)
-{
-    AUDDBG ("Trying %s.\n", plugin_get_name (plugin));
-    InputPlugin * decoder = plugin_get_header (plugin);
-    if (decoder == NULL)
-        return TRUE;
-
-    if (decoder->is_our_file_from_vfs != NULL)
-    {
-        if (! check_opened (state))
-            return FALSE;
-
-        if (decoder->is_our_file_from_vfs (state->filename, state->handle))
-        {
-            state->plugin = plugin;
-            return FALSE;
-        }
-
-        if (vfs_fseek (state->handle, 0, SEEK_SET) < 0)
-            return FALSE;
-    }
-
-    return TRUE;
-}
-
-/* Optimization: If we have found plugins with a key match, assume that at least
- * one of them will succeed.  This means that we need not check the very last
- * plugin.  (If there is only one, we do not need to check it at all.)  This is
- * implemented as follows:
- *
- * 1. On the first call, assume until further notice the plugin passed is the
- *    last one and will therefore succeed.
- * 2. On a subsequent call, think twice and probe the plugin we assumed would
- *    succeed.  If it does in fact succeed, then we are done.  If not, assume
- *    similarly that the plugin passed in this call is the last one.
- */
-
-static bool_t probe_func_fast (PluginHandle * plugin, ProbeState * state)
-{
-    if (state->plugin != NULL)
-    {
-        PluginHandle * prev = state->plugin;
-        state->plugin = NULL;
-
-        if (! probe_func (prev, state))
-            return FALSE;
-    }
-
-    AUDDBG ("Guessing %s.\n", plugin_get_name (plugin));
-    state->plugin = plugin;
-    return TRUE;
-}
-
-static void probe_by_scheme (ProbeState * state)
-{
-    const char * s = strstr (state->filename, "://");
-    if (s == NULL)
-        return;
-
-    AUDDBG ("Probing by scheme.\n");
-    SNCOPY (buf, state->filename, s - state->filename);
-    input_plugin_for_key (INPUT_KEY_SCHEME, buf, (PluginForEachFunc) probe_func_fast, state);
-}
-
-static void probe_by_extension (ProbeState * state)
-{
-    char buf[32];
-    if (! uri_get_extension (state->filename, buf, sizeof buf))
-        return;
-
-    AUDDBG ("Probing by extension.\n");
-    input_plugin_for_key (INPUT_KEY_EXTENSION, buf, (PluginForEachFunc) probe_func_fast, state);
-}
-
-static void probe_by_mime (ProbeState * state)
-{
-    char * mime;
-
-    if (! check_opened (state))
-        return;
-
-    if ((mime = vfs_get_metadata (state->handle, "content-type")) == NULL)
-        return;
-
-    AUDDBG ("Probing by MIME type.\n");
-    input_plugin_for_key (INPUT_KEY_MIME, mime, (PluginForEachFunc)
-     probe_func_fast, state);
-    str_unref (mime);
-}
-
-static void probe_by_content (ProbeState * state)
-{
-    AUDDBG ("Probing by content.\n");
-    plugin_for_enabled (PLUGIN_TYPE_INPUT, (PluginForEachFunc) probe_func, state);
-}
-
-PluginHandle * file_find_decoder (const char * filename, bool_t fast)
-{
-    ProbeState state;
-
-    AUDDBG ("Probing %s.\n", filename);
-    state.plugin = NULL;
-    state.filename = filename;
-    state.handle = NULL;
-    state.failed = FALSE;
-
-    probe_by_scheme (& state);
-
-    if (state.plugin != NULL)
-        goto DONE;
-
-    probe_by_extension (& state);
-
-    if (state.plugin != NULL || fast)
-        goto DONE;
-
-    probe_by_mime (& state);
-
-    if (state.plugin != NULL)
-        goto DONE;
-
-    probe_by_content (& state);
-
-DONE:
-    if (state.handle != NULL)
-        vfs_fclose (state.handle);
-
-    if (state.plugin != NULL)
-        AUDDBG ("Probe succeeded: %s\n", plugin_get_name (state.plugin));
-    else
-        AUDDBG ("Probe failed.\n");
-
-    return state.plugin;
-}
-
-static bool_t open_file (const char * filename, InputPlugin * ip,
- const char * mode, VFSFile * * handle)
-{
-    /* no need to open a handle for custom URI schemes */
-    if (ip->schemes && ip->schemes[0])
-        return TRUE;
-
-    * handle = vfs_fopen (filename, mode);
-    return (* handle != NULL);
-}
-
-Tuple * file_read_tuple (const char * filename, PluginHandle * decoder)
-{
-    InputPlugin * ip = plugin_get_header (decoder);
-    g_return_val_if_fail (ip, NULL);
-    g_return_val_if_fail (ip->probe_for_tuple, NULL);
-
-    VFSFile * handle = NULL;
-    if (! open_file (filename, ip, "r", & handle))
-        return FALSE;
-
-    Tuple * tuple = ip->probe_for_tuple (filename, handle);
-
-    if (handle)
-        vfs_fclose (handle);
-
-    return tuple;
-}
-
-bool_t file_read_image (const char * filename, PluginHandle * decoder,
- void * * data, int64_t * size)
-{
-    * data = NULL;
-    * size = 0;
-
-    if (! input_plugin_has_images (decoder))
-        return FALSE;
-
-    InputPlugin * ip = plugin_get_header (decoder);
-    g_return_val_if_fail (ip, FALSE);
-    g_return_val_if_fail (ip->get_song_image, FALSE);
-
-    VFSFile * handle = NULL;
-    if (! open_file (filename, ip, "r", & handle))
-        return FALSE;
-
-    bool_t success = ip->get_song_image (filename, handle, data, size);
-
-    if (handle)
-        vfs_fclose (handle);
-
-    return success;
-}
-
-bool_t file_can_write_tuple (const char * filename, PluginHandle * decoder)
-{
-    return input_plugin_can_write_tuple (decoder);
-}
-
-bool_t file_write_tuple (const char * filename, PluginHandle * decoder,
- const Tuple * tuple)
-{
-    InputPlugin * ip = plugin_get_header (decoder);
-    g_return_val_if_fail (ip, FALSE);
-    g_return_val_if_fail (ip->update_song_tuple, FALSE);
-
-    VFSFile * handle = NULL;
-    if (! open_file (filename, ip, "r+", & handle))
-        return FALSE;
-
-    bool_t success = ip->update_song_tuple (filename, handle, tuple);
-
-    if (handle)
-        vfs_fclose (handle);
-
-    if (success)
-        playlist_rescan_file (filename);
-
-    return success;
-}
-
-bool_t custom_infowin (const char * filename, PluginHandle * decoder)
-{
-    if (! input_plugin_has_infowin (decoder))
-        return FALSE;
-
-    InputPlugin * ip = plugin_get_header (decoder);
-    g_return_val_if_fail (ip, FALSE);
-    g_return_val_if_fail (ip->file_info_box, FALSE);
-
-    ip->file_info_box (filename);
-    return TRUE;
-}
diff --git a/src/audacious/scanner.c b/src/audacious/scanner.c
deleted file mode 100644
index e3257da351cf..000000000000
--- a/src/audacious/scanner.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * scanner.c
- * Copyright 2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <pthread.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <libaudcore/audstrings.h>
-
-#include "main.h"
-#include "misc.h"
-#include "scanner.h"
-
-struct _ScanRequest {
-    char * filename; /* pooled */
-    int flags;
-    PluginHandle * decoder;
-    ScanCallback callback;
-    Tuple * tuple;
-    void * image_data;
-    int64_t image_len;
-    char * image_file; /* pooled */
-};
-
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
-
-static GQueue requests = G_QUEUE_INIT;
-
-static pthread_t scan_threads[SCAN_THREADS];
-
-static bool_t quit_flag = FALSE;
-
-ScanRequest * scan_request (const char * filename, int flags,
- PluginHandle * decoder, ScanCallback callback)
-{
-    ScanRequest * request = g_slice_new0 (ScanRequest);
-
-    request->filename = str_get (filename);
-    request->flags = flags;
-    request->decoder = decoder;
-    request->callback = callback;
-
-    pthread_mutex_lock (& mutex);
-
-    g_queue_push_tail (& requests, request);
-    pthread_cond_signal (& cond);
-
-    pthread_mutex_unlock (& mutex);
-    return request;
-}
-
-static void scan_request_free (ScanRequest * request)
-{
-    if (request->tuple)
-        tuple_unref (request->tuple);
-
-    str_unref (request->filename);
-    g_free (request->image_data);
-    str_unref (request->image_file);
-    g_slice_free (ScanRequest, request);
-}
-
-static void * scan_worker (void * unused)
-{
-    pthread_mutex_lock (& mutex);
-
-    while (! quit_flag)
-    {
-        ScanRequest * request = g_queue_pop_head (& requests);
-
-        if (! request)
-        {
-            pthread_cond_wait (& cond, & mutex);
-            continue;
-        }
-
-        pthread_mutex_unlock (& mutex);
-
-        if (! request->decoder)
-            request->decoder = file_find_decoder (request->filename, FALSE);
-
-        if (request->decoder && (request->flags & SCAN_TUPLE))
-            request->tuple = file_read_tuple (request->filename, request->decoder);
-
-        if (request->decoder && (request->flags & SCAN_IMAGE))
-        {
-            file_read_image (request->filename, request->decoder,
-             & request->image_data, & request->image_len);
-
-            if (! request->image_data)
-                request->image_file = get_associated_image_file (request->filename);
-        }
-
-        request->callback (request);
-        scan_request_free (request);
-
-        pthread_mutex_lock (& mutex);
-    }
-
-    pthread_mutex_unlock (& mutex);
-    return NULL;
-}
-
-const char * scan_request_get_filename (ScanRequest * request)
-{
-    return request->filename;
-}
-
-PluginHandle * scan_request_get_decoder (ScanRequest * request)
-{
-    return request->decoder;
-}
-
-Tuple * scan_request_get_tuple (ScanRequest * request)
-{
-    Tuple * tuple = request->tuple;
-    request->tuple = NULL;
-    return tuple;
-}
-
-void scan_request_get_image_data (ScanRequest * request, void * * data, int64_t * len)
-{
-    * data = request->image_data;
-    * len = request->image_len;
-    request->image_data = NULL;
-    request->image_len = 0;
-}
-
-const char * scan_request_get_image_file (ScanRequest * request)
-{
-    return request->image_file;
-}
-
-void scanner_init (void)
-{
-    for (int i = 0; i < SCAN_THREADS; i ++)
-        pthread_create (& scan_threads[i], 0, scan_worker, NULL);
-}
-
-void scanner_cleanup (void)
-{
-    pthread_mutex_lock (& mutex);
-
-    quit_flag = TRUE;
-    pthread_cond_broadcast (& cond);
-
-    pthread_mutex_unlock (& mutex);
-
-    for (int i = 0; i < SCAN_THREADS; i ++)
-        pthread_join (scan_threads[i], NULL);
-
-    ScanRequest * request;
-    while ((request = g_queue_pop_head (& requests)))
-        scan_request_free (request);
-
-    quit_flag = FALSE;
-}
diff --git a/src/audacious/scanner.h b/src/audacious/scanner.h
deleted file mode 100644
index 3eee7285aeab..000000000000
--- a/src/audacious/scanner.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * scanner.h
- * Copyright 2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_SCANNER_H
-#define AUDACIOUS_SCANNER_H
-
-#include <audacious/types.h>
-#include <libaudcore/tuple.h>
-
-#define SCAN_TUPLE (1 << 0)
-#define SCAN_IMAGE (1 << 1)
-
-#define SCAN_THREADS 2
-
-struct _ScanRequest;
-typedef struct _ScanRequest ScanRequest;
-
-typedef void (* ScanCallback) (ScanRequest * request);
-
-ScanRequest * scan_request (const char * filename, int flags,
- PluginHandle * decoder, ScanCallback callback);
-
-const char * scan_request_get_filename (ScanRequest * request);
-PluginHandle * scan_request_get_decoder (ScanRequest * request);
-Tuple * scan_request_get_tuple (ScanRequest * request);
-void scan_request_get_image_data (ScanRequest * request, void * * data, int64_t * len);
-const char * scan_request_get_image_file (ScanRequest * request);
-
-void scanner_init (void);
-void scanner_cleanup (void);
-
-#endif
diff --git a/src/audacious/signals.c b/src/audacious/signals.c
deleted file mode 100644
index 2b5515e0cc77..000000000000
--- a/src/audacious/signals.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * signals.c
- * Copyright 2009 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifdef HAVE_SIGWAIT
-
-#include <pthread.h>
-#include <signal.h>
-
-#include "drct.h"
-#include "main.h"
-
-static sigset_t signal_set;
-
-static void * signal_thread (void * data)
-{
-    int signal;
-
-    while (! sigwait (& signal_set, & signal))
-        drct_quit ();
-
-    return NULL;
-}
-
-/* Must be called before any threads are created. */
-void signals_init_one (void)
-{
-    sigemptyset (& signal_set);
-    sigaddset (& signal_set, SIGHUP);
-    sigaddset (& signal_set, SIGINT);
-    sigaddset (& signal_set, SIGQUIT);
-    sigaddset (& signal_set, SIGTERM);
-
-    sigprocmask (SIG_BLOCK, & signal_set, NULL);
-}
-
-void signals_init_two (void)
-{
-    pthread_t thread;
-    pthread_create (& thread, NULL, signal_thread, NULL);
-}
-
-#endif /* HAVE_SIGWAIT */
diff --git a/src/audacious/signals.cc b/src/audacious/signals.cc
new file mode 100644
index 000000000000..0a6f2164bd9b
--- /dev/null
+++ b/src/audacious/signals.cc
@@ -0,0 +1,59 @@
+/*
+ * signals.c
+ * Copyright 2009 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifdef HAVE_SIGWAIT
+
+#include <pthread.h>
+#include <signal.h>
+
+#include <libaudcore/hook.h>
+
+#include "main.h"
+
+static sigset_t signal_set;
+
+static void * signal_thread (void * data)
+{
+    int signal;
+
+    while (! sigwait (& signal_set, & signal))
+        event_queue ("quit", nullptr);
+
+    return nullptr;
+}
+
+/* Must be called before any threads are created. */
+void signals_init_one (void)
+{
+    sigemptyset (& signal_set);
+    sigaddset (& signal_set, SIGHUP);
+    sigaddset (& signal_set, SIGINT);
+    sigaddset (& signal_set, SIGQUIT);
+    sigaddset (& signal_set, SIGTERM);
+
+    sigprocmask (SIG_BLOCK, & signal_set, nullptr);
+}
+
+void signals_init_two (void)
+{
+    pthread_t thread;
+    pthread_create (& thread, nullptr, signal_thread, nullptr);
+}
+
+#endif /* HAVE_SIGWAIT */
diff --git a/src/audacious/types.h b/src/audacious/types.h
deleted file mode 100644
index d160bab59b66..000000000000
--- a/src/audacious/types.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * types.h
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_TYPES_H
-#define AUDACIOUS_TYPES_H
-
-#include <libaudcore/core.h>
-
-#define AUD_EQUALIZER_NBANDS 10
-#define EQUALIZER_MAX_GAIN 12
-
-enum {
- PLUGIN_TYPE_TRANSPORT,
- PLUGIN_TYPE_PLAYLIST,
- PLUGIN_TYPE_INPUT,
- PLUGIN_TYPE_EFFECT,
- PLUGIN_TYPE_OUTPUT,
- PLUGIN_TYPE_VIS,
- PLUGIN_TYPE_GENERAL,
- PLUGIN_TYPE_IFACE,
- PLUGIN_TYPES};
-
-typedef struct PluginHandle PluginHandle;
-
-typedef const struct _Plugin Plugin;
-typedef const struct _TransportPlugin TransportPlugin;
-typedef const struct _PlaylistPlugin PlaylistPlugin;
-typedef const struct _InputPlugin InputPlugin;
-typedef const struct _EffectPlugin EffectPlugin;
-typedef const struct _OutputPlugin OutputPlugin;
-typedef const struct _VisPlugin VisPlugin;
-typedef const struct _GeneralPlugin GeneralPlugin;
-typedef const struct _IfacePlugin IfacePlugin;
-
-typedef struct _PluginPreferences PluginPreferences;
-typedef struct _PreferencesWidget PreferencesWidget;
-
-typedef struct {
-    char * name;
-    float preamp;
-    float bands[AUD_EQUALIZER_NBANDS];
-} EqualizerPreset;
-
-typedef struct {
-    float track_gain; /* dB */
-    float track_peak; /* 0-1 */
-    float album_gain; /* dB */
-    float album_peak; /* 0-1 */
-} ReplayGainInfo;
-
-#endif
diff --git a/src/audacious/ui_albumart.c b/src/audacious/ui_albumart.c
deleted file mode 100644
index a3f14a48e7f3..000000000000
--- a/src/audacious/ui_albumart.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * ui_albumart.c
- * Copyright 2006-2013 Michael Hanselmann, Yoshiki Yazawa, and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <string.h>
-
-#include <libaudcore/audstrings.h>
-
-#include "i18n.h"
-#include "main.h"
-#include "misc.h"
-#include "util.h"
-
-typedef struct {
-    const char * basename;
-    Index * include, * exclude;
-} SearchParams;
-
-static bool_t has_front_cover_extension (const char * name)
-{
-    char * ext = strrchr (name, '.');
-    if (! ext)
-        return FALSE;
-
-    return ! g_ascii_strcasecmp (ext, ".jpg") ||
-     ! g_ascii_strcasecmp (ext, ".jpeg") || ! g_ascii_strcasecmp (ext, ".png");
-}
-
-static bool_t cover_name_filter (const char * name, Index * keywords, bool_t ret_on_empty)
-{
-    int count = index_count (keywords);
-    if (! count)
-        return ret_on_empty;
-
-    for (int i = 0; i < count; i ++)
-    {
-        if (strstr_nocase (name, index_get (keywords, i)))
-            return TRUE;
-    }
-
-    return FALSE;
-}
-
-static bool_t is_file_image (const char * imgfile, const char * file_name)
-{
-    char * imgfile_ext = strrchr (imgfile, '.');
-    if (! imgfile_ext)
-        return FALSE;
-
-    char * file_name_ext = strrchr (file_name, '.');
-    if (! file_name_ext)
-        return FALSE;
-
-    size_t imgfile_len = imgfile_ext - imgfile;
-    size_t file_name_len = file_name_ext - file_name;
-
-    return imgfile_len == file_name_len && ! g_ascii_strncasecmp (imgfile, file_name, imgfile_len);
-}
-
-static char * fileinfo_recursive_get_image (const char * path,
- const SearchParams * params, int depth)
-{
-    GDir * d = g_dir_open (path, 0, NULL);
-    if (! d)
-        return NULL;
-
-    const char * name;
-
-    if (get_bool (NULL, "use_file_cover") && ! depth)
-    {
-        /* Look for images matching file name */
-        while ((name = g_dir_read_name (d)))
-        {
-            char * newpath = filename_build (path, name);
-
-            if (! g_file_test (newpath, G_FILE_TEST_IS_DIR) &&
-             has_front_cover_extension (name) &&
-             is_file_image (name, params->basename))
-            {
-                g_dir_close (d);
-                return newpath;
-            }
-
-            str_unref (newpath);
-        }
-
-        g_dir_rewind (d);
-    }
-
-    /* Search for files using filter */
-    while ((name = g_dir_read_name (d)))
-    {
-        char * newpath = filename_build (path, name);
-
-        if (! g_file_test (newpath, G_FILE_TEST_IS_DIR) &&
-         has_front_cover_extension (name) &&
-         cover_name_filter (name, params->include, TRUE) &&
-         ! cover_name_filter (name, params->exclude, FALSE))
-        {
-            g_dir_close (d);
-            return newpath;
-        }
-
-        str_unref (newpath);
-    }
-
-    g_dir_rewind (d);
-
-    if (get_bool (NULL, "recurse_for_cover") && depth < get_int (NULL, "recurse_for_cover_depth"))
-    {
-        /* Descend into directories recursively. */
-        while ((name = g_dir_read_name (d)))
-        {
-            char * newpath = filename_build (path, name);
-
-            if (g_file_test (newpath, G_FILE_TEST_IS_DIR))
-            {
-                char * tmp = fileinfo_recursive_get_image (newpath, params, depth + 1);
-
-                if (tmp)
-                {
-                    str_unref (newpath);
-                    g_dir_close (d);
-                    return tmp;
-                }
-            }
-
-            str_unref (newpath);
-        }
-    }
-
-    g_dir_close (d);
-    return NULL;
-}
-
-char * get_associated_image_file (const char * filename)
-{
-    char * image_uri = NULL;
-
-    char * local = uri_to_filename (filename);
-    char * base = local ? last_path_element (local) : NULL;
-
-    if (local && base)
-    {
-        char * include = get_str (NULL, "cover_name_include");
-        char * exclude = get_str (NULL, "cover_name_exclude");
-
-        SearchParams params = {
-            .basename = base,
-            .include = str_list_to_index (include, ", "),
-            .exclude = str_list_to_index (exclude, ", ")
-        };
-
-        str_unref (include);
-        str_unref (exclude);
-
-        SNCOPY (path, local, base - 1 - local);
-
-        char * image_local = fileinfo_recursive_get_image (path, & params, 0);
-        if (image_local)
-            image_uri = filename_to_uri (image_local);
-
-        str_unref (image_local);
-
-        index_free_full (params.include, (IndexFreeFunc) str_unref);
-        index_free_full (params.exclude, (IndexFreeFunc) str_unref);
-    }
-
-    str_unref (local);
-
-    return image_uri;
-}
diff --git a/src/audacious/ui_plugin_menu.c b/src/audacious/ui_plugin_menu.c
deleted file mode 100644
index 9d81b65467fc..000000000000
--- a/src/audacious/ui_plugin_menu.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * ui_plugin_menu.c
- * Copyright 2009-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <gtk/gtk.h>
-
-#include <libaudgui/menu.h>
-
-#include "i18n.h"
-#include "misc.h"
-
-static GList * items[AUD_MENU_COUNT]; /* of AudguiMenuItem */
-static GtkWidget * menus[AUD_MENU_COUNT];
-
-static void configure_plugins (void)
-{
-    show_prefs_for_plugin_type (PLUGIN_TYPE_GENERAL);
-}
-
-static const AudguiMenuItem main_items[] = {
-    {N_("_Plugins ..."), .func = configure_plugins},
-    {.sep = TRUE}
-};
-
-static void add_to_menu (GtkWidget * menu, const AudguiMenuItem * item)
-{
-    GtkWidget * widget = audgui_menu_item_new_with_domain (item, NULL, NULL);
-    g_object_set_data ((GObject *) widget, "func", (void *) item->func);
-    gtk_widget_show (widget);
-    gtk_menu_shell_append ((GtkMenuShell *) menu, widget);
-}
-
-/* GtkWidget * get_plugin_menu (int id) */
-void * get_plugin_menu (int id)
-{
-    if (! menus[id])
-    {
-        menus[id] = gtk_menu_new ();
-        g_signal_connect (menus[id], "destroy", (GCallback)
-         gtk_widget_destroyed, & menus[id]);
-
-        if (id == AUD_MENU_MAIN)
-            audgui_menu_init (menus[id], main_items, ARRAY_LEN (main_items), NULL);
-
-        for (GList * node = items[id]; node; node = node->next)
-            add_to_menu (menus[id], node->data);
-    }
-
-    return menus[id];
-}
-
-void plugin_menu_add (int id, MenuFunc func, const char * name,
- const char * icon)
-{
-    AudguiMenuItem * item = g_slice_new0 (AudguiMenuItem);
-    item->name = name;
-    item->icon = icon;
-    item->func = func;
-
-    items[id] = g_list_append (items[id], item);
-
-    if (menus[id])
-        add_to_menu (menus[id], item);
-}
-
-static void remove_cb (GtkWidget * widget, MenuFunc func)
-{
-    if ((MenuFunc) g_object_get_data ((GObject *) widget, "func") == func)
-        gtk_widget_destroy (widget);
-}
-
-void plugin_menu_remove (int id, MenuFunc func)
-{
-    if (menus[id])
-        gtk_container_foreach ((GtkContainer *) menus[id], (GtkCallback)
-         remove_cb, (void *) func);
-
-    GList * next;
-    for (GList * node = items[id]; node; node = next)
-    {
-        next = node->next;
-
-        if (((AudguiMenuItem *) node->data)->func == func)
-        {
-            g_slice_free (AudguiMenuItem, node->data);
-            items[id] = g_list_delete_link (items[id], node);
-        }
-    }
-}
diff --git a/src/audacious/ui_preferences.c b/src/audacious/ui_preferences.c
deleted file mode 100644
index 2949fdcbccc5..000000000000
--- a/src/audacious/ui_preferences.c
+++ /dev/null
@@ -1,814 +0,0 @@
-/*
- * ui_preferences.c
- * Copyright 2006-2012 William Pitcock, Tomasz Moń, Michael Färber, and
- *                     John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <string.h>
-
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-#include <libaudgui/libaudgui-gtk.h>
-
-#include "debug.h"
-#include "i18n.h"
-#include "misc.h"
-#include "output.h"
-#include "playlist.h"
-#include "plugin.h"
-#include "plugins.h"
-#include "preferences.h"
-#include "ui_preferences.h"
-
-#ifdef USE_CHARDET
-#include <libguess.h>
-#endif
-
-enum CategoryViewCols {
-    CATEGORY_VIEW_COL_ICON,
-    CATEGORY_VIEW_COL_NAME,
-    CATEGORY_VIEW_N_COLS
-};
-
-typedef struct {
-    const char * icon_path;
-    const char * name;
-} Category;
-
-typedef struct {
-    int type;
-    const char * name;
-} PluginCategory;
-
-typedef struct {
-    const char * name;
-    const char * tag;
-} TitleFieldTag;
-
-static const char aud_version_string[] =
- "<span size='small'>Audacious " VERSION " (" BUILDSTAMP ")</span>";
-
-static GtkWidget * prefswin;
-static GtkWidget * category_treeview, * category_notebook, * plugin_notebook;
-static GtkWidget * titlestring_entry;
-
-enum {
-    CATEGORY_APPEARANCE = 0,
-    CATEGORY_AUDIO,
-    CATEGORY_NETWORK,
-    CATEGORY_PLAYLIST,
-    CATEGORY_SONG_INFO,
-    CATEGORY_PLUGINS
-};
-
-static const Category categories[] = {
-    { "appearance.png", N_("Appearance") },
-    { "audio.png", N_("Audio") },
-    { "connectivity.png", N_("Network") },
-    { "playlist.png", N_("Playlist")} ,
-    { "info.png", N_("Song Info") },
-    { "plugins.png", N_("Plugins") }
-};
-
-static const PluginCategory plugin_categories[] = {
-    { PLUGIN_TYPE_GENERAL, N_("General") },
-    { PLUGIN_TYPE_EFFECT, N_("Effect") },
-    { PLUGIN_TYPE_VIS, N_("Visualization") },
-    { PLUGIN_TYPE_INPUT, N_("Input") },
-    { PLUGIN_TYPE_PLAYLIST, N_("Playlist") },
-    { PLUGIN_TYPE_TRANSPORT, N_("Transport") }
-};
-
-static TitleFieldTag title_field_tags[] = {
-    { N_("Artist")     , "${artist}" },
-    { N_("Album")      , "${album}" },
-    { N_("Title")      , "${title}" },
-    { N_("Tracknumber"), "${track-number}" },
-    { N_("Genre")      , "${genre}" },
-    { N_("Filename")   , "${file-name}" },
-    { N_("Filepath")   , "${file-path}" },
-    { N_("Date")       , "${date}" },
-    { N_("Year")       , "${year}" },
-    { N_("Comment")    , "${comment}" },
-    { N_("Codec")      , "${codec}" },
-    { N_("Quality")    , "${quality}" }
-};
-
-#ifdef USE_CHARDET
-static ComboBoxElements chardet_detector_presets[] = {
-    { "", N_("None")},
-    { GUESS_REGION_AR, N_("Arabic") },
-    { GUESS_REGION_BL, N_("Baltic") },
-    { GUESS_REGION_CN, N_("Chinese") },
-    { GUESS_REGION_GR, N_("Greek") },
-    { GUESS_REGION_HW, N_("Hebrew") },
-    { GUESS_REGION_JP, N_("Japanese") },
-    { GUESS_REGION_KR, N_("Korean") },
-    { GUESS_REGION_PL, N_("Polish") },
-    { GUESS_REGION_RU, N_("Russian") },
-    { GUESS_REGION_TW, N_("Taiwanese") },
-    { GUESS_REGION_TR, N_("Turkish") }
-};
-#endif
-
-static ComboBoxElements bitdepth_elements[] = {
-    { GINT_TO_POINTER (16), "16" },
-    { GINT_TO_POINTER (24), "24" },
-    { GINT_TO_POINTER (32), "32" },
-    { GINT_TO_POINTER  (0), N_("Floating point") }
-};
-
-static GArray * iface_combo_elements;
-static int iface_combo_selected;
-static GtkWidget * iface_prefs_box;
-
-static const ComboBoxElements * iface_combo_fill (int * n_elements);
-static void iface_combo_changed (void);
-static void * iface_create_prefs_box (void);
-
-static PreferencesWidget appearance_page_widgets[] = {
- {WIDGET_LABEL, N_("<b>Interface Settings</b>")},
- {WIDGET_COMBO_BOX, N_("Interface plugin:"),
-  .cfg_type = VALUE_INT, .cfg = & iface_combo_selected,
-  .data.combo.fill = iface_combo_fill, .callback = iface_combo_changed},
- {WIDGET_CUSTOM, .data.populate = iface_create_prefs_box}};
-
-static GArray * output_combo_elements;
-static int output_combo_selected;
-static GtkWidget * output_config_button;
-static GtkWidget * output_about_button;
-
-static const ComboBoxElements * output_combo_fill (int * n_elements);
-static void output_combo_changed (void);
-static void * output_create_config_button (void);
-static void * output_create_about_button (void);
-static void output_bit_depth_changed (void);
-
-static PreferencesWidget output_combo_widgets[] = {
- {WIDGET_COMBO_BOX, N_("Output plugin:"),
-  .cfg_type = VALUE_INT, .cfg = & output_combo_selected,
-  .data.combo.fill = output_combo_fill, .callback = output_combo_changed},
- {WIDGET_CUSTOM, .data.populate = output_create_config_button},
- {WIDGET_CUSTOM, .data.populate = output_create_about_button}};
-
-static PreferencesWidget audio_page_widgets[] = {
- {WIDGET_LABEL, N_("<b>Output Settings</b>")},
- {WIDGET_BOX, .data.box = {.elem = output_combo_widgets,
-  .n_elem = ARRAY_LEN (output_combo_widgets), .horizontal = TRUE}},
- {WIDGET_COMBO_BOX, N_("Bit depth:"),
-  .cfg_type = VALUE_INT, .cname = "output_bit_depth", .callback = output_bit_depth_changed,
-  .data.combo = {bitdepth_elements, ARRAY_LEN (bitdepth_elements)}},
- {WIDGET_SPIN_BTN, N_("Buffer size:"),
-  .cfg_type = VALUE_INT, .cname = "output_buffer_size",
-  .data.spin_btn = {100, 10000, 1000, N_("ms")}},
- {WIDGET_CHK_BTN, N_("Soft clipping"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "soft_clipping"},
- {WIDGET_CHK_BTN, N_("Use software volume control (not recommended)"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "software_volume_control"},
- {WIDGET_LABEL, N_("<b>Replay Gain</b>")},
- {WIDGET_CHK_BTN, N_("Enable Replay Gain"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "enable_replay_gain"},
- {WIDGET_CHK_BTN, N_("Album mode"), .child = TRUE,
-  .cfg_type = VALUE_BOOLEAN, .cname = "replay_gain_album"},
- {WIDGET_CHK_BTN, N_("Prevent clipping (recommended)"), .child = TRUE,
-  .cfg_type = VALUE_BOOLEAN, .cname = "enable_clipping_prevention"},
- {WIDGET_LABEL, N_("<b>Adjust Levels</b>"), .child = TRUE},
- {WIDGET_SPIN_BTN, N_("Amplify all files:"), .child = TRUE,
-  .cfg_type = VALUE_FLOAT, .cname = "replay_gain_preamp",
-  .data.spin_btn = {-15, 15, 0.1, N_("dB")}},
- {WIDGET_SPIN_BTN, N_("Amplify untagged files:"), .child = TRUE,
-  .cfg_type = VALUE_FLOAT, .cname = "default_gain",
-  .data.spin_btn = {-15, 15, 0.1, N_("dB")}}};
-
-static PreferencesWidget proxy_host_port_elements[] = {
- {WIDGET_ENTRY, N_("Proxy hostname:"), .cfg_type = VALUE_STRING, .cname = "proxy_host"},
- {WIDGET_ENTRY, N_("Proxy port:"), .cfg_type = VALUE_STRING, .cname = "proxy_port"}};
-
-static PreferencesWidget proxy_auth_elements[] = {
- {WIDGET_ENTRY, N_("Proxy username:"), .cfg_type = VALUE_STRING, .cname = "proxy_user"},
- {WIDGET_ENTRY, N_("Proxy password:"), .cfg_type = VALUE_STRING, .cname = "proxy_pass",
-  .data.entry.password = TRUE}};
-
-static PreferencesWidget connectivity_page_widgets[] = {
- {WIDGET_LABEL, N_("<b>Proxy Configuration</b>"), NULL, NULL, NULL, FALSE},
- {WIDGET_CHK_BTN, N_("Enable proxy usage"), .cfg_type = VALUE_BOOLEAN, .cname = "use_proxy"},
- {WIDGET_TABLE, .child = TRUE, .data.table = {proxy_host_port_elements,
-  ARRAY_LEN (proxy_host_port_elements)}},
- {WIDGET_CHK_BTN, N_("Use authentication with proxy"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "use_proxy_auth"},
- {WIDGET_TABLE, .child = TRUE, .data.table = {proxy_auth_elements,
-  ARRAY_LEN (proxy_auth_elements)}}};
-
-static PreferencesWidget chardet_elements[] = {
-#ifdef USE_CHARDET
- {WIDGET_COMBO_BOX, N_("Auto character encoding detector for:"),
-  .cfg_type = VALUE_STRING, .cname = "chardet_detector", .child = TRUE,
-  .data.combo = {chardet_detector_presets, ARRAY_LEN (chardet_detector_presets)}},
-#endif
- {WIDGET_ENTRY, N_("Fallback character encodings:"), .cfg_type = VALUE_STRING,
-  .cname = "chardet_fallback", .child = TRUE}};
-
-static PreferencesWidget playlist_page_widgets[] = {
- {WIDGET_LABEL, N_("<b>Behavior</b>"), NULL, NULL, NULL, FALSE},
- {WIDGET_CHK_BTN, N_("Continue playback on startup"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "resume_playback_on_startup"},
- {WIDGET_CHK_BTN, N_("Advance when the current song is deleted"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "advance_on_delete"},
- {WIDGET_CHK_BTN, N_("Clear the playlist when opening files"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "clear_playlist"},
- {WIDGET_CHK_BTN, N_("Open files in a temporary playlist"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "open_to_temporary"},
- {WIDGET_CHK_BTN, N_("Do not load metadata for songs until played"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "metadata_on_play",
-  .callback = playlist_trigger_scan},
- {WIDGET_LABEL, N_("<b>Compatibility</b>"), NULL, NULL, NULL, FALSE},
- {WIDGET_CHK_BTN, N_("Interpret \\ (backward slash) as a folder delimiter"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "convert_backslash"},
- {WIDGET_TABLE, .data.table = {chardet_elements, ARRAY_LEN (chardet_elements)}}};
-
-static PreferencesWidget song_info_page_widgets[] = {
- {WIDGET_LABEL, N_("<b>Album Art</b>")},
- {WIDGET_LABEL, N_("Search for images matching these words (comma-separated):")},
- {WIDGET_ENTRY, .cfg_type = VALUE_STRING, .cname = "cover_name_include"},
- {WIDGET_LABEL, N_("Exclude images matching these words (comma-separated):")},
- {WIDGET_ENTRY, .cfg_type = VALUE_STRING, .cname = "cover_name_exclude"},
- {WIDGET_CHK_BTN, N_("Search for images matching song file name"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "use_file_cover"},
- {WIDGET_CHK_BTN, N_("Search recursively"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "recurse_for_cover"},
- {WIDGET_SPIN_BTN, N_("Search depth:"), .child = TRUE,
-  .cfg_type = VALUE_INT, .cname = "recurse_for_cover_depth",
-  .data.spin_btn = {0, 100, 1}},
- {WIDGET_LABEL, N_("<b>Popup Information</b>")},
- {WIDGET_CHK_BTN, N_("Show popup information"),
-  .cfg_type = VALUE_BOOLEAN, .cname = "show_filepopup_for_tuple"},
- {WIDGET_SPIN_BTN, N_("Popup delay (tenths of a second):"), .child = TRUE,
-  .cfg_type = VALUE_INT, .cname = "filepopup_delay",
-  .data.spin_btn = {0, 100, 1}},
- {WIDGET_CHK_BTN, N_("Show time scale for current song"), .child = TRUE,
-  .cfg_type = VALUE_BOOLEAN, .cname = "filepopup_showprogressbar"}};
-
-#define TITLESTRING_NPRESETS 6
-
-static const char * const titlestring_presets[TITLESTRING_NPRESETS] = {
-    "${title}",
-    "${?artist:${artist} - }${title}",
-    "${?artist:${artist} - }${?album:${album} - }${title}",
-    "${?artist:${artist} - }${?album:${album} - }${?track-number:${track-number}. }${title}",
-    "${?artist:${artist} }${?album:[ ${album} ] }${?artist:- }${?track-number:${track-number}. }${title}",
-    "${?album:${album} - }${title}"
-};
-
-static const char * const titlestring_preset_names[TITLESTRING_NPRESETS] = {
-    N_("TITLE"),
-    N_("ARTIST - TITLE"),
-    N_("ARTIST - ALBUM - TITLE"),
-    N_("ARTIST - ALBUM - TRACK. TITLE"),
-    N_("ARTIST [ ALBUM ] - TRACK. TITLE"),
-    N_("ALBUM - TITLE")
-};
-
-static GArray * fill_plugin_combo (int type)
-{
-    GArray * array = g_array_new (FALSE, FALSE, sizeof (ComboBoxElements));
-    g_array_set_size (array, plugin_count (type));
-
-    for (int i = 0; i < array->len; i ++)
-    {
-        ComboBoxElements * elem = & g_array_index (array, ComboBoxElements, i);
-        elem->label = plugin_get_name (plugin_by_index (type, i));
-        elem->value = GINT_TO_POINTER (i);
-    }
-
-    return array;
-}
-
-static void change_category (int category)
-{
-    GtkTreeSelection * selection = gtk_tree_view_get_selection ((GtkTreeView *) category_treeview);
-    GtkTreePath * path = gtk_tree_path_new_from_indices (category, -1);
-    gtk_tree_selection_select_path (selection, path);
-    gtk_tree_path_free (path);
-}
-
-static void category_changed (GtkTreeSelection * selection)
-{
-    GtkTreeModel * model;
-    GtkTreeIter iter;
-
-    if (gtk_tree_selection_get_selected (selection, & model, & iter))
-    {
-        GtkTreePath * path = gtk_tree_model_get_path (model, & iter);
-        int category = gtk_tree_path_get_indices (path)[0];
-        gtk_notebook_set_current_page ((GtkNotebook *) category_notebook, category);
-        gtk_tree_path_free (path);
-    }
-}
-
-static void titlestring_tag_menu_cb (GtkMenuItem * menuitem, void * data)
-{
-    const char * separator = " - ";
-    int item = GPOINTER_TO_INT (data);
-    int pos = gtk_editable_get_position ((GtkEditable *) titlestring_entry);
-
-    /* insert separator as needed */
-    if (gtk_entry_get_text ((GtkEntry *) titlestring_entry)[0])
-        gtk_editable_insert_text ((GtkEditable *) titlestring_entry, separator, -1, & pos);
-
-    gtk_editable_insert_text ((GtkEditable *) titlestring_entry, _(title_field_tags[item].tag), -1, & pos);
-    gtk_editable_set_position ((GtkEditable *) titlestring_entry, pos);
-}
-
-static void on_titlestring_help_button_clicked (GtkButton * button, void * menu)
-{
-    gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 0, GDK_CURRENT_TIME);
-}
-
-static void update_titlestring_cbox (GtkComboBox * cbox, const char * format)
-{
-    int preset;
-    for (preset = 0; preset < TITLESTRING_NPRESETS; preset ++)
-    {
-        if (! strcmp (titlestring_presets[preset], format))
-            break;
-    }
-
-    if (gtk_combo_box_get_active (cbox) != preset)
-        gtk_combo_box_set_active (cbox, preset);
-}
-
-static void on_titlestring_entry_changed (GtkEntry * entry, GtkComboBox * cbox)
-{
-    const char * format = gtk_entry_get_text (entry);
-    set_str (NULL, "generic_title_format", format);
-    update_titlestring_cbox (cbox, format);
-    playlist_reformat_titles ();
-}
-
-static void on_titlestring_cbox_changed (GtkComboBox * cbox, GtkEntry * entry)
-{
-    int preset = gtk_combo_box_get_active (cbox);
-    if (preset < TITLESTRING_NPRESETS)
-        gtk_entry_set_text (entry, titlestring_presets[preset]);
-}
-
-static void fill_category_list (GtkTreeView * treeview, GtkNotebook * notebook)
-{
-    GtkTreeViewColumn * column = gtk_tree_view_column_new ();
-    gtk_tree_view_column_set_title (column, _("Category"));
-    gtk_tree_view_append_column (treeview, column);
-    gtk_tree_view_column_set_spacing (column, 2);
-
-    GtkCellRenderer * renderer = gtk_cell_renderer_pixbuf_new ();
-    gtk_tree_view_column_pack_start (column, renderer, FALSE);
-    gtk_tree_view_column_set_attributes (column, renderer, "pixbuf", 0, NULL);
-
-    renderer = gtk_cell_renderer_text_new ();
-    gtk_tree_view_column_pack_start (column, renderer, FALSE);
-    gtk_tree_view_column_set_attributes (column, renderer, "text", 1, NULL);
-
-    g_object_set ((GObject *) renderer, "wrap-width", 96, "wrap-mode",
-     PANGO_WRAP_WORD_CHAR, NULL);
-
-    GtkListStore * store = gtk_list_store_new (CATEGORY_VIEW_N_COLS,
-     GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT);
-    gtk_tree_view_set_model (treeview, (GtkTreeModel *) store);
-
-    const char * data_dir = get_path (AUD_PATH_DATA_DIR);
-
-    for (int i = 0; i < ARRAY_LEN (categories); i ++)
-    {
-        SCONCAT3 (path, data_dir, "/images/", categories[i].icon_path);
-
-        GtkTreeIter iter;
-
-        gtk_list_store_append (store, & iter);
-        gtk_list_store_set (store, & iter, CATEGORY_VIEW_COL_NAME,
-         gettext (categories[i].name), -1);
-
-        GdkPixbuf * img = gdk_pixbuf_new_from_file (path, NULL);
-
-        if (img)
-        {
-            gtk_list_store_set (store, & iter, CATEGORY_VIEW_COL_ICON, img, -1);
-            g_object_unref (img);
-        }
-    }
-
-    g_object_unref (store);
-
-    GtkTreeSelection * selection = gtk_tree_view_get_selection (treeview);
-    g_signal_connect (selection, "changed", (GCallback) category_changed, NULL);
-}
-
-static GtkWidget * create_titlestring_tag_menu (void)
-{
-    GtkWidget * titlestring_tag_menu = gtk_menu_new ();
-
-    for (int i = 0; i < ARRAY_LEN (title_field_tags); i ++)
-    {
-        GtkWidget * menu_item = gtk_menu_item_new_with_label (_(title_field_tags[i].name));
-        gtk_menu_shell_append ((GtkMenuShell *) titlestring_tag_menu, menu_item);
-        g_signal_connect(menu_item, "activate",
-         (GCallback) titlestring_tag_menu_cb, GINT_TO_POINTER (i));
-    };
-
-    gtk_widget_show_all (titlestring_tag_menu);
-
-    return titlestring_tag_menu;
-}
-
-static void show_numbers_cb (GtkToggleButton * numbers, void * unused)
-{
-    set_bool (NULL, "show_numbers_in_pl", gtk_toggle_button_get_active (numbers));
-    playlist_reformat_titles ();
-    hook_call ("title change", NULL);
-}
-
-static void leading_zero_cb (GtkToggleButton * leading)
-{
-    set_bool (NULL, "leading_zero", gtk_toggle_button_get_active (leading));
-    playlist_reformat_titles ();
-    hook_call ("title change", NULL);
-}
-
-static void create_titlestring_widgets (GtkWidget * * cbox, GtkWidget * * entry)
-{
-    * cbox = gtk_combo_box_text_new ();
-    for (int i = 0; i < TITLESTRING_NPRESETS; i ++)
-        gtk_combo_box_text_append_text ((GtkComboBoxText *) * cbox, _(titlestring_preset_names[i]));
-    gtk_combo_box_text_append_text ((GtkComboBoxText *) * cbox, _("Custom"));
-
-    * entry = gtk_entry_new ();
-
-    char * format = get_str (NULL, "generic_title_format");
-    update_titlestring_cbox ((GtkComboBox *) * cbox, format);
-    gtk_entry_set_text ((GtkEntry *) * entry, format);
-    str_unref (format);
-
-    g_signal_connect (* cbox, "changed", (GCallback) on_titlestring_cbox_changed, * entry);
-    g_signal_connect (* entry, "changed", (GCallback) on_titlestring_entry_changed, * cbox);
-}
-
-static void create_playlist_category (void)
-{
-    GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-    gtk_container_add ((GtkContainer *) category_notebook, vbox);
-
-    create_widgets ((GtkBox *) vbox, playlist_page_widgets, ARRAY_LEN (playlist_page_widgets));
-
-    GtkWidget * alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
-    gtk_box_pack_start ((GtkBox *) vbox, alignment, FALSE, FALSE, 0);
-    gtk_alignment_set_padding ((GtkAlignment *) alignment, 12, 3, 0, 0);
-
-    GtkWidget * label = gtk_label_new (_("<b>Song Display</b>"));
-    gtk_container_add ((GtkContainer *) alignment, label);
-    gtk_label_set_use_markup ((GtkLabel *) label, TRUE);
-    gtk_misc_set_alignment ((GtkMisc *) label, 0, 0.5);
-
-    GtkWidget * numbers_alignment = gtk_alignment_new (0, 0, 0, 0);
-    gtk_alignment_set_padding ((GtkAlignment *) numbers_alignment, 0, 0, 12, 0);
-    gtk_box_pack_start ((GtkBox *) vbox, numbers_alignment, 0, 0, 3);
-
-    GtkWidget * numbers = gtk_check_button_new_with_label (_("Show song numbers"));
-    gtk_toggle_button_set_active ((GtkToggleButton *) numbers,
-     get_bool (NULL, "show_numbers_in_pl"));
-    g_signal_connect (numbers, "toggled", (GCallback) show_numbers_cb, 0);
-    gtk_container_add ((GtkContainer *) numbers_alignment, numbers);
-
-    numbers_alignment = gtk_alignment_new (0, 0, 0, 0);
-    gtk_alignment_set_padding ((GtkAlignment *) numbers_alignment, 0, 0, 12, 0);
-    gtk_box_pack_start ((GtkBox *) vbox, numbers_alignment, 0, 0, 3);
-
-    numbers = gtk_check_button_new_with_label (
-     _("Show leading zeroes (02:00 instead of 2:00)"));
-    gtk_toggle_button_set_active ((GtkToggleButton *) numbers, get_bool (NULL, "leading_zero"));
-    g_signal_connect (numbers, "toggled", (GCallback) leading_zero_cb, 0);
-    gtk_container_add ((GtkContainer *) numbers_alignment, numbers);
-
-    alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
-    gtk_box_pack_start ((GtkBox *) vbox, alignment, FALSE, FALSE, 0);
-    gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 0, 12, 0);
-
-    GtkWidget * grid = gtk_grid_new ();
-    gtk_container_add ((GtkContainer *) alignment, grid);
-    gtk_grid_set_row_spacing ((GtkGrid *) grid, 4);
-    gtk_grid_set_column_spacing ((GtkGrid *) grid, 12);
-
-    label = gtk_label_new (_("Title format:"));
-    gtk_grid_attach ((GtkGrid *) grid, label, 0, 0, 1, 1);
-    gtk_label_set_justify ((GtkLabel *) label, GTK_JUSTIFY_RIGHT);
-    gtk_misc_set_alignment ((GtkMisc *) label, 1, 0.5);
-
-    label = gtk_label_new (_("Custom string:"));
-    gtk_grid_attach ((GtkGrid *) grid, label, 0, 1, 1, 1);
-    gtk_label_set_justify ((GtkLabel *) label, GTK_JUSTIFY_RIGHT);
-    gtk_misc_set_alignment ((GtkMisc *) label, 1, 0.5);
-
-    GtkWidget * titlestring_cbox;
-    create_titlestring_widgets (& titlestring_cbox, & titlestring_entry);
-    gtk_widget_set_hexpand (titlestring_cbox, TRUE);
-    gtk_widget_set_hexpand (titlestring_entry, TRUE);
-    gtk_grid_attach ((GtkGrid *) grid, titlestring_cbox, 1, 0, 1, 1);
-    gtk_grid_attach ((GtkGrid *) grid, titlestring_entry, 1, 1, 1, 1);
-
-    GtkWidget * titlestring_help_button = gtk_button_new ();
-    gtk_widget_set_can_focus (titlestring_help_button, FALSE);
-    gtk_button_set_focus_on_click ((GtkButton *) titlestring_help_button, FALSE);
-    gtk_button_set_relief ((GtkButton *) titlestring_help_button, GTK_RELIEF_HALF);
-    gtk_grid_attach ((GtkGrid *) grid, titlestring_help_button, 2, 1, 1, 1);
-
-    GtkWidget * titlestring_tag_menu = create_titlestring_tag_menu ();
-
-    g_signal_connect (titlestring_help_button, "clicked",
-     (GCallback) on_titlestring_help_button_clicked, titlestring_tag_menu);
-
-    GtkWidget * image = gtk_image_new_from_icon_name ("list-add", GTK_ICON_SIZE_BUTTON);
-    gtk_container_add ((GtkContainer *) titlestring_help_button, image);
-}
-
-static void create_song_info_category (void)
-{
-    GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-    gtk_container_add ((GtkContainer *) category_notebook, vbox);
-    create_widgets ((GtkBox *) vbox, song_info_page_widgets,
-     ARRAY_LEN (song_info_page_widgets));
-}
-
-static void iface_fill_prefs_box (void)
-{
-    Plugin * header = plugin_get_header (plugin_get_current (PLUGIN_TYPE_IFACE));
-    if (header && header->prefs)
-        create_widgets_with_domain (iface_prefs_box, header->prefs->widgets,
-         header->prefs->n_widgets, header->domain);
-}
-
-static void iface_combo_changed (void)
-{
-    gtk_container_foreach ((GtkContainer *) iface_prefs_box, (GtkCallback) gtk_widget_destroy, NULL);
-
-    plugin_enable (plugin_by_index (PLUGIN_TYPE_IFACE, iface_combo_selected), TRUE);
-
-    iface_fill_prefs_box ();
-    gtk_widget_show_all (iface_prefs_box);
-}
-
-static const ComboBoxElements * iface_combo_fill (int * n_elements)
-{
-    if (! iface_combo_elements)
-    {
-        iface_combo_elements = fill_plugin_combo (PLUGIN_TYPE_IFACE);
-        iface_combo_selected = plugin_get_index (plugin_get_current (PLUGIN_TYPE_IFACE));
-    }
-
-    * n_elements = iface_combo_elements->len;
-    return (const ComboBoxElements *) iface_combo_elements->data;
-}
-
-static void * iface_create_prefs_box (void)
-{
-    iface_prefs_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-    iface_fill_prefs_box ();
-    return iface_prefs_box;
-}
-
-static void create_appearance_category (void)
-{
-    GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-    gtk_container_add ((GtkContainer *) category_notebook, vbox);
-    create_widgets ((GtkBox *) vbox, appearance_page_widgets, ARRAY_LEN (appearance_page_widgets));
-}
-
-static void output_combo_changed (void)
-{
-    PluginHandle * plugin = plugin_by_index (PLUGIN_TYPE_OUTPUT, output_combo_selected);
-
-    if (plugin_enable (plugin, TRUE))
-    {
-        gtk_widget_set_sensitive (output_config_button, plugin_has_configure (plugin));
-        gtk_widget_set_sensitive (output_about_button, plugin_has_about (plugin));
-    }
-}
-
-static const ComboBoxElements * output_combo_fill (int * n_elements)
-{
-    if (! output_combo_elements)
-    {
-        output_combo_elements = fill_plugin_combo (PLUGIN_TYPE_OUTPUT);
-        output_combo_selected = plugin_get_index (output_plugin_get_current ());
-    }
-
-    * n_elements = output_combo_elements->len;
-    return (const ComboBoxElements *) output_combo_elements->data;
-}
-
-static void output_bit_depth_changed (void)
-{
-    output_reset (OUTPUT_RESET_SOFT);
-}
-
-static void output_do_config (void * unused)
-{
-    plugin_do_configure (output_plugin_get_current ());
-}
-
-static void output_do_about (void * unused)
-{
-    plugin_do_about (output_plugin_get_current ());
-}
-
-static void * output_create_config_button (void)
-{
-    bool_t enabled = plugin_has_configure (output_plugin_get_current ());
-
-    output_config_button = audgui_button_new (_("_Settings"),
-     "preferences-system", output_do_config, NULL);
-    gtk_widget_set_sensitive (output_config_button, enabled);
-
-    return output_config_button;
-}
-
-static void * output_create_about_button (void)
-{
-    bool_t enabled = plugin_has_about (output_plugin_get_current ());
-
-    output_about_button = audgui_button_new (_("_About"), "help-about", output_do_about, NULL);
-    gtk_widget_set_sensitive (output_about_button, enabled);
-
-    return output_about_button;
-}
-
-static void create_audio_category (void)
-{
-    GtkWidget * audio_page_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-    create_widgets ((GtkBox *) audio_page_vbox, audio_page_widgets, ARRAY_LEN (audio_page_widgets));
-    gtk_container_add ((GtkContainer *) category_notebook, audio_page_vbox);
-}
-
-static void create_connectivity_category (void)
-{
-    GtkWidget * connectivity_page_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-    gtk_container_add ((GtkContainer *) category_notebook, connectivity_page_vbox);
-
-    GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-    gtk_box_pack_start ((GtkBox *) connectivity_page_vbox, vbox, TRUE, TRUE, 0);
-
-    create_widgets ((GtkBox *) vbox, connectivity_page_widgets, ARRAY_LEN (connectivity_page_widgets));
-}
-
-static void create_plugin_category (void)
-{
-    plugin_notebook = gtk_notebook_new ();
-    gtk_container_add ((GtkContainer *) category_notebook, plugin_notebook);
-
-    for (int i = 0; i < ARRAY_LEN (plugin_categories); i ++)
-    {
-        const PluginCategory * cat = & plugin_categories[i];
-        gtk_notebook_append_page ((GtkNotebook *) plugin_notebook,
-         plugin_view_new (cat->type), gtk_label_new (_(cat->name)));
-    }
-}
-
-static void destroy_cb (void)
-{
-    prefswin = NULL;
-    category_treeview = NULL;
-    category_notebook = NULL;
-    titlestring_entry = NULL;
-
-    if (iface_combo_elements)
-    {
-        g_array_free (iface_combo_elements, TRUE);
-        iface_combo_elements = NULL;
-    }
-
-    if (output_combo_elements)
-    {
-        g_array_free (output_combo_elements, TRUE);
-        output_combo_elements = NULL;
-    }
-}
-
-static void create_prefs_window (void)
-{
-    prefswin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-    gtk_window_set_type_hint ((GtkWindow *) prefswin, GDK_WINDOW_TYPE_HINT_DIALOG);
-    gtk_container_set_border_width ((GtkContainer *) prefswin, 12);
-    gtk_window_set_title ((GtkWindow *) prefswin, _("Audacious Settings"));
-    gtk_window_set_default_size ((GtkWindow *) prefswin, 680, 400);
-
-    GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-    gtk_container_add ((GtkContainer *) prefswin, vbox);
-
-    GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,  8);
-    gtk_box_pack_start ((GtkBox *) vbox, hbox, TRUE, TRUE, 0);
-
-    GtkWidget * scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
-    gtk_box_pack_start ((GtkBox *) hbox, scrolledwindow, FALSE, FALSE, 0);
-    gtk_scrolled_window_set_policy ((GtkScrolledWindow *) scrolledwindow,
-     GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-    gtk_scrolled_window_set_shadow_type ((GtkScrolledWindow *) scrolledwindow, GTK_SHADOW_IN);
-
-    category_treeview = gtk_tree_view_new ();
-    gtk_container_add ((GtkContainer *) scrolledwindow, category_treeview);
-    gtk_widget_set_size_request (scrolledwindow, 168, -1);
-    gtk_tree_view_set_headers_visible ((GtkTreeView *) category_treeview, FALSE);
-
-    category_notebook = gtk_notebook_new ();
-    gtk_box_pack_start ((GtkBox *) hbox, category_notebook, TRUE, TRUE, 0);
-
-    gtk_widget_set_can_focus (category_notebook, FALSE);
-    gtk_notebook_set_show_tabs ((GtkNotebook *) category_notebook, FALSE);
-    gtk_notebook_set_show_border ((GtkNotebook *) category_notebook, FALSE);
-
-    create_appearance_category ();
-    create_audio_category ();
-    create_connectivity_category ();
-    create_playlist_category ();
-    create_song_info_category ();
-    create_plugin_category ();
-
-    GtkWidget * hseparator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
-    gtk_box_pack_start ((GtkBox *) vbox, hseparator, FALSE, FALSE, 6);
-
-    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,  0);
-    gtk_box_pack_start ((GtkBox *) vbox, hbox, FALSE, FALSE, 0);
-
-    GtkWidget * audversionlabel = gtk_label_new (aud_version_string);
-    gtk_box_pack_start ((GtkBox *) hbox, audversionlabel, FALSE, FALSE, 0);
-    gtk_label_set_use_markup ((GtkLabel *) audversionlabel, TRUE);
-
-    GtkWidget * prefswin_button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
-    gtk_box_pack_start ((GtkBox *) hbox, prefswin_button_box, TRUE, TRUE, 0);
-    gtk_button_box_set_layout ((GtkButtonBox *) prefswin_button_box, GTK_BUTTONBOX_END);
-    gtk_box_set_spacing ((GtkBox *) prefswin_button_box, 6);
-
-    GtkWidget * close = audgui_button_new (_("_Close"), "window-close",
-     (AudguiCallback) gtk_widget_destroy, prefswin);
-    gtk_container_add ((GtkContainer *) prefswin_button_box, close);
-    gtk_widget_set_can_default (close, TRUE);
-
-    fill_category_list ((GtkTreeView *) category_treeview, (GtkNotebook *) category_notebook);
-
-    gtk_widget_show_all (vbox);
-
-    g_signal_connect (prefswin, "destroy", (GCallback) destroy_cb, NULL);
-
-    audgui_destroy_on_escape (prefswin);
-}
-
-void show_prefs_window (void)
-{
-    if (! prefswin)
-        create_prefs_window ();
-
-    change_category (CATEGORY_APPEARANCE);
-
-    gtk_window_present ((GtkWindow *) prefswin);
-}
-
-void show_prefs_for_plugin_type (int type)
-{
-    if (! prefswin)
-        create_prefs_window ();
-
-    if (type == PLUGIN_TYPE_IFACE)
-        change_category (CATEGORY_APPEARANCE);
-    else if (type == PLUGIN_TYPE_OUTPUT)
-        change_category (CATEGORY_AUDIO);
-    else
-    {
-        change_category (CATEGORY_PLUGINS);
-
-        for (int i = 0; i < ARRAY_LEN (plugin_categories); i ++)
-        {
-            if (plugin_categories[i].type == type)
-                gtk_notebook_set_current_page ((GtkNotebook *) plugin_notebook, i);
-        }
-    }
-
-    gtk_window_present ((GtkWindow *) prefswin);
-}
-
-void hide_prefs_window (void)
-{
-    if (prefswin)
-        gtk_widget_destroy (prefswin);
-}
diff --git a/src/audacious/ui_preferences.h b/src/audacious/ui_preferences.h
deleted file mode 100644
index b9b270799d8e..000000000000
--- a/src/audacious/ui_preferences.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * ui_preferences.h
- * Copyright 2006-2012 William Pitcock, Tomasz Moń, and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_UI_PREFERENCES_H
-#define AUDACIOUS_UI_PREFERENCES_H
-
-#include <gtk/gtk.h>
-
-#include "types.h"
-
-void show_prefs_window(void);
-void hide_prefs_window(void);
-
-/* plugin-preferences.c */
-void plugin_make_about_window (PluginHandle * plugin);
-void plugin_make_config_window (PluginHandle * plugin);
-void plugin_misc_cleanup (PluginHandle * plugin);
-
-/* plugin-view.c */
-GtkWidget * plugin_view_new (int type);
-
-#endif /* AUDACIOUS_UI_PREFERENCES_H */
diff --git a/src/audacious/util.c b/src/audacious/util.c
deleted file mode 100644
index 3556e6845fb5..000000000000
--- a/src/audacious/util.c
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- * util.c
- * Copyright 2009-2013 John Lindgren and Michał Lipski
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <ctype.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef _WIN32
-#include <windows.h>
-#endif
-
-#ifdef __APPLE__
-#include <mach-o/dyld.h>
-#endif
-
-#include <glib.h>
-
-#include <libaudcore/audstrings.h>
-
-#include "debug.h"
-#include "i18n.h"
-#include "misc.h"
-#include "plugins.h"
-#include "util.h"
-
-bool_t dir_foreach (const char * path, DirForeachFunc func, void * user)
-{
-    GDir * dir = g_dir_open (path, 0, NULL);
-    if (! dir)
-        return FALSE;
-
-    const char * name;
-    while ((name = g_dir_read_name (dir)))
-    {
-        char * full = filename_build (path, name);
-        bool_t stop = func (full, name, user);
-        str_unref (full);
-
-        if (stop)
-            break;
-    }
-
-    g_dir_close (dir);
-    return TRUE;
-}
-
-char * construct_uri (const char * path, const char * reference)
-{
-    /* URI */
-    if (strstr (path, "://"))
-        return str_get (path);
-
-    /* absolute filename */
-#ifdef _WIN32
-    if (path[0] && path[1] == ':' && path[2] == '\\')
-#else
-    if (path[0] == '/')
-#endif
-        return filename_to_uri (path);
-
-    /* relative path */
-    const char * slash = strrchr (reference, '/');
-    if (! slash)
-        return NULL;
-
-    char * utf8 = str_to_utf8 (path, -1);
-    if (! utf8)
-        return NULL;
-
-    int pathlen = slash + 1 - reference;
-
-    char buf[pathlen + 3 * strlen (utf8) + 1];
-    memcpy (buf, reference, pathlen);
-
-    if (get_bool (NULL, "convert_backslash"))
-    {
-        SCOPY (tmp, utf8);
-        str_replace_char (tmp, '\\', '/');
-        str_encode_percent (tmp, -1, buf + pathlen);
-    }
-    else
-        str_encode_percent (utf8, -1, buf + pathlen);
-
-    str_unref (utf8);
-    return str_get (buf);
-}
-
-void
-make_directory(const char * path, mode_t mode)
-{
-    if (g_mkdir_with_parents(path, mode) == 0)
-        return;
-
-    g_printerr(_("Could not create directory (%s): %s\n"), path,
-               g_strerror(errno));
-}
-
-char * write_temp_file (void * data, int64_t len)
-{
-    char * temp = filename_build (g_get_tmp_dir (), "audacious-temp-XXXXXX");
-    SCOPY (name, temp);
-    str_unref (temp);
-
-    int handle = g_mkstemp (name);
-    if (handle < 0)
-    {
-        fprintf (stderr, "Error creating temporary file: %s\n", strerror (errno));
-        return NULL;
-    }
-
-    while (len)
-    {
-        int64_t written = write (handle, data, len);
-        if (written < 0)
-        {
-            fprintf (stderr, "Error writing %s: %s\n", name, strerror (errno));
-            close (handle);
-            return NULL;
-        }
-
-        data = (char *) data + written;
-        len -= written;
-    }
-
-    if (close (handle) < 0)
-    {
-        fprintf (stderr, "Error closing %s: %s\n", name, strerror (errno));
-        return NULL;
-    }
-
-    return str_get (name);
-}
-
-char * get_path_to_self (void)
-{
-#ifdef HAVE_PROC_SELF_EXE
-    int size = 256;
-
-    while (1)
-    {
-        char buf[size];
-        int len;
-
-        if ((len = readlink ("/proc/self/exe", buf, size)) < 0)
-        {
-            fprintf (stderr, "Cannot access /proc/self/exe: %s.\n", strerror (errno));
-            return NULL;
-        }
-
-        if (len < size)
-        {
-            buf[len] = 0;
-            return str_get (buf);
-        }
-
-        size += size;
-    }
-#elif defined _WIN32
-    int size = 256;
-
-    while (1)
-    {
-        wchar_t buf[size];
-        int len;
-
-        if (! (len = GetModuleFileNameW (NULL, buf, size)))
-        {
-            fprintf (stderr, "GetModuleFileName failed.\n");
-            return NULL;
-        }
-
-        if (len < size)
-        {
-            char * temp = g_utf16_to_utf8 (buf, len, NULL, NULL, NULL);
-            char * path = str_get (temp);
-            g_free (temp);
-            return path;
-        }
-
-        size += size;
-    }
-#elif defined __APPLE__
-    unsigned int size = 256;
-
-    while (1)
-    {
-        char buf[size];
-        int res;
-
-        if (! (res = _NSGetExecutablePath (buf, &size)))
-            return str_get (buf);
-
-        if (res != -1)
-            return NULL;
-    }
-#else
-    return NULL;
-#endif
-}
-
-#ifdef _WIN32
-void get_argv_utf8 (int * argc, char * * * argv)
-{
-    wchar_t * combined = GetCommandLineW ();
-    wchar_t * * split = CommandLineToArgvW (combined, argc);
-
-    * argv = g_new (char *, argc + 1);
-
-    for (int i = 0; i < * argc; i ++)
-        (* argv)[i] = g_utf16_to_utf8 (split[i], -1, NULL, NULL, NULL);
-
-    (* argv)[* argc] = 0;
-
-    LocalFree (split);
-}
-
-void free_argv_utf8 (int * argc, char * * * argv)
-{
-    g_strfreev (* argv);
-    * argc = 0;
-    * argv = NULL;
-}
-#endif
-
-/* Strips various common top-level folders from a filename.  The string passed
- * will not be modified, but the string returned will share the same memory.
- * Examples:
- *     "/home/john/folder/file.mp3" -> "folder/file.mp3"
- *     "/folder/file.mp3"           -> "folder/file.mp3" */
-
-static char * skip_top_folders (char * name)
-{
-    static const char * home;
-    static int len;
-
-    if (! home)
-    {
-        home = g_get_home_dir ();
-        len = strlen (home);
-
-        if (len > 0 && home[len - 1] == G_DIR_SEPARATOR)
-            len --;
-    }
-
-#ifdef _WIN32
-    if (! g_ascii_strncasecmp (name, home, len) && name[len] == '\\')
-#else
-    if (! strncmp (name, home, len) && name[len] == '/')
-#endif
-        return name + len + 1;
-
-#ifdef _WIN32
-    if (g_ascii_isalpha (name[0]) && name[1] == ':' && name[2] == '\\')
-        return name + 3;
-#else
-    if (name[0] == '/')
-        return name + 1;
-#endif
-
-    return name;
-}
-
-/* Divides a filename into the base name, the lowest folder, and the
- * second lowest folder.  The string passed will be modified, and the strings
- * returned will use the same memory.  May return NULL for <first> and <second>.
- * Examples:
- *     "a/b/c/d/e.mp3" -> "e", "d",  "c"
- *     "d/e.mp3"       -> "e", "d",  NULL
- *     "e.mp3"         -> "e", NULL, NULL */
-
-static void split_filename (char * name, char * * base, char * * first,
- char * * second)
-{
-    * first = * second = NULL;
-
-    char * c;
-
-    if ((c = strrchr (name, G_DIR_SEPARATOR)))
-    {
-        * base = c + 1;
-        * c = 0;
-    }
-    else
-    {
-        * base = name;
-        goto DONE;
-    }
-
-    if ((c = strrchr (name, G_DIR_SEPARATOR)))
-    {
-        * first = c + 1;
-        * c = 0;
-    }
-    else
-    {
-        * first = name;
-        goto DONE;
-    }
-
-    if ((c = strrchr (name, G_DIR_SEPARATOR)))
-        * second = c + 1;
-    else
-        * second = name;
-
-DONE:
-    if ((c = strrchr (* base, '.')))
-        * c = 0;
-}
-
-/* Separates the domain name from an internet URI.  The string passed will be
- * modified, and the string returned will share the same memory.  May return
- * NULL.  Examples:
- *     "http://some.domain.org/folder/file.mp3" -> "some.domain.org"
- *     "http://some.stream.fm:8000"             -> "some.stream.fm" */
-
-static char * stream_name (char * name)
-{
-    if (! strncmp (name, "http://", 7))
-        name += 7;
-    else if (! strncmp (name, "https://", 8))
-        name += 8;
-    else if (! strncmp (name, "mms://", 6))
-        name += 6;
-    else
-        return NULL;
-
-    char * c;
-
-    if ((c = strchr (name, '/')))
-        * c = 0;
-    if ((c = strchr (name, ':')))
-        * c = 0;
-    if ((c = strchr (name, '?')))
-        * c = 0;
-
-    return name;
-}
-
-static char * get_nonblank_field (const Tuple * tuple, int field)
-{
-    char * str = tuple ? tuple_get_str (tuple, field) : NULL;
-
-    if (str && ! str[0])
-    {
-        str_unref (str);
-        str = NULL;
-    }
-
-    return str;
-}
-
-static char * str_get_decoded (char * str)
-{
-    if (! str)
-        return NULL;
-
-    str_decode_percent (str, -1, str);
-    return str_get (str);
-}
-
-/* Derives best guesses of title, artist, and album from a file name (URI) and
- * tuple (which may be NULL).  The returned strings are stringpooled or NULL. */
-
-void describe_song (const char * name, const Tuple * tuple, char * * _title,
- char * * _artist, char * * _album)
-{
-    /* Common folder names to skip */
-    static const char * const skip[] = {"music"};
-
-    char * title = get_nonblank_field (tuple, FIELD_TITLE);
-    char * artist = get_nonblank_field (tuple, FIELD_ARTIST);
-    char * album = get_nonblank_field (tuple, FIELD_ALBUM);
-
-    if (title && artist && album)
-    {
-DONE:
-        * _title = title;
-        * _artist = artist;
-        * _album = album;
-        return;
-    }
-
-    if (! strncmp (name, "file:///", 8))
-    {
-        char * filename = uri_to_display (name);
-        if (! filename)
-            goto DONE;
-
-        SCOPY (buf, filename);
-
-        char * base, * first, * second;
-        split_filename (skip_top_folders (buf), & base, & first, & second);
-
-        if (! title)
-            title = str_get (base);
-
-        for (int i = 0; i < ARRAY_LEN (skip); i ++)
-        {
-            if (first && ! g_ascii_strcasecmp (first, skip[i]))
-                first = NULL;
-            if (second && ! g_ascii_strcasecmp (second, skip[i]))
-                second = NULL;
-        }
-
-        if (first)
-        {
-            if (second && ! artist && ! album)
-            {
-                artist = str_get (second);
-                album = str_get (first);
-            }
-            else if (! artist)
-                artist = str_get (first);
-            else if (! album)
-                album = str_get (first);
-        }
-
-        str_unref (filename);
-    }
-    else
-    {
-        SCOPY (buf, name);
-
-        if (! title)
-        {
-            title = str_get_decoded (stream_name (buf));
-
-            if (! title)
-                title = str_get_decoded (buf);
-        }
-        else if (! artist)
-            artist = str_get_decoded (stream_name (buf));
-        else if (! album)
-            album = str_get_decoded (stream_name (buf));
-    }
-
-    goto DONE;
-}
-
-char * last_path_element (char * path)
-{
-    char * slash = strrchr (path, G_DIR_SEPARATOR);
-    return (slash && slash[1]) ? slash + 1 : NULL;
-}
-
-void cut_path_element (char * path, char * elem)
-{
-#ifdef _WIN32
-    if (elem > path + 3)
-#else
-    if (elem > path + 1)
-#endif
-        elem[-1] = 0; /* overwrite slash */
-    else
-        elem[0] = 0; /* leave [drive letter and] leading slash */
-}
diff --git a/src/audacious/util.cc b/src/audacious/util.cc
new file mode 100644
index 000000000000..c4449deb4a22
--- /dev/null
+++ b/src/audacious/util.cc
@@ -0,0 +1,48 @@
+/*
+ * util.c
+ * Copyright 2009-2013 John Lindgren and Michał Lipski
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "util.h"
+
+#ifdef _WIN32
+#include <windows.h>
+
+#ifdef WORDS_BIGENDIAN
+#define UTF16_NATIVE "UTF-16BE"
+#else
+#define UTF16_NATIVE "UTF-16LE"
+#endif
+
+Index<String> get_argv_utf8 ()
+{
+    int argc;
+    wchar_t * combined = GetCommandLineW ();
+    wchar_t * * split = CommandLineToArgvW (combined, & argc);
+
+    Index<String> argv;
+    argv.insert (0, argc);
+
+    for (int i = 0; i < argc; i ++)
+        argv[i] = String (str_convert ((char *) split[i],
+         wcslen (split[i]) * sizeof (wchar_t), UTF16_NATIVE, "UTF-8"));
+
+    LocalFree (split);
+    return argv;
+}
+
+#endif
diff --git a/src/audacious/util.h b/src/audacious/util.h
index 7f92cb3815fd..55bfd6ba9962 100644
--- a/src/audacious/util.h
+++ b/src/audacious/util.h
@@ -1,6 +1,6 @@
 /*
  * util.h
- * Copyright 2009-2013 John Lindgren
+ * Copyright 2014 John Lindgren
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -20,29 +20,10 @@
 #ifndef AUDACIOUS_UTIL_H
 #define AUDACIOUS_UTIL_H
 
-#include <sys/types.h>
-#include <libaudcore/core.h>
-
-typedef bool_t(*DirForeachFunc) (const char * path,
-                                   const char * basename,
-                                   void * user_data);
-
-bool_t dir_foreach (const char * path, DirForeachFunc func, void * user_data);
-
-void make_directory(const char * path, mode_t mode);
-char * write_temp_file (void * data, int64_t len); /* pooled */
-
-char * get_path_to_self (void); /* pooled */
+#include <libaudcore/audstrings.h>
 
 #ifdef _WIN32
-void get_argv_utf8 (int * argc, char * * * argv);
-void free_argv_utf8 (int * argc, char * * * argv);
+Index<String> get_argv_utf8 ();
 #endif
 
-void describe_song (const char * filename, const Tuple * tuple,
- char * * title, char * * artist, char * * album);
-
-char * last_path_element (char * path);
-void cut_path_element (char * path, char * elem);
-
 #endif /* AUDACIOUS_UTIL_H */
diff --git a/src/audacious/vis_runner.c b/src/audacious/vis_runner.c
deleted file mode 100644
index ba8390c4a7c0..000000000000
--- a/src/audacious/vis_runner.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * vis_runner.c
- * Copyright 2009-2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <assert.h>
-#include <pthread.h>
-#include <stdint.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include "output.h"
-#include "vis_runner.h"
-#include "visualization.h"
-
-#define INTERVAL 30 /* milliseconds */
-#define FRAMES_PER_NODE 512
-
-struct _VisNode {
-    struct _VisNode * next;
-    int channels;
-    int time;
-    float data[];
-};
-
-typedef struct _VisNode VisNode;
-
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-static bool_t enabled = FALSE;
-static bool_t playing = FALSE, paused = FALSE, active = FALSE;
-static VisNode * current_node = NULL;
-static int current_frames;
-static VisNode * vis_list = NULL;
-static VisNode * vis_list_tail = NULL;
-static VisNode * vis_pool = NULL;
-static int send_source = 0, clear_source = 0;
-
-static VisNode * alloc_node_locked (int channels)
-{
-    VisNode * node;
-
-    if (vis_pool)
-    {
-        node = vis_pool;
-        assert (node->channels == channels);
-        vis_pool = node->next;
-    }
-    else
-    {
-        node = g_malloc (offsetof (VisNode, data) + sizeof (float) * channels * FRAMES_PER_NODE);
-        node->channels = channels;
-    }
-
-    node->next = NULL;
-    return node;
-}
-
-static void free_node_locked (VisNode * node)
-{
-    node->next = vis_pool;
-    vis_pool = node;
-}
-
-static void push_node_locked (VisNode * node)
-{
-    if (vis_list)
-        vis_list_tail->next = node;
-    else
-        vis_list = node;
-
-    vis_list_tail = node;
-}
-
-static VisNode * pop_node_locked (void)
-{
-    VisNode * node = vis_list;
-    vis_list = node->next;
-    node->next = NULL;
-
-    if (vis_list_tail == node)
-        vis_list_tail = NULL;
-
-    return node;
-}
-
-static bool_t send_audio (void * unused)
-{
-    /* call before locking mutex to avoid deadlock */
-    int outputted = output_get_raw_time ();
-
-    pthread_mutex_lock (& mutex);
-
-    if (! send_source)
-    {
-        pthread_mutex_unlock (& mutex);
-        return FALSE;
-    }
-
-    VisNode * vis_node = NULL;
-
-    while (vis_list)
-    {
-        /* If we are considering a node, stop searching and use it if it is the
-         * most recent (that is, the next one is in the future).  Otherwise,
-         * consider the next node if it is not in the future by more than the
-         * length of an interval. */
-        if (vis_list->time > outputted + (vis_node ? 0 : INTERVAL))
-            break;
-
-        if (vis_node)
-            free_node_locked (vis_node);
-
-        vis_node = pop_node_locked ();
-    }
-
-    pthread_mutex_unlock (& mutex);
-
-    if (! vis_node)
-        return TRUE;
-
-    vis_send_audio (vis_node->data, vis_node->channels);
-
-    pthread_mutex_lock (& mutex);
-    free_node_locked (vis_node);
-    pthread_mutex_unlock (& mutex);
-
-    return TRUE;
-}
-
-static bool_t send_clear (void * unused)
-{
-    pthread_mutex_lock (& mutex);
-    clear_source = 0;
-    pthread_mutex_unlock (& mutex);
-
-    vis_send_clear ();
-
-    return FALSE;
-}
-
-static void flush_locked (void)
-{
-    g_free (current_node);
-    current_node = NULL;
-
-    while (vis_list)
-    {
-        VisNode * node = vis_list;
-        vis_list = node->next;
-        g_free (node);
-    }
-
-    vis_list_tail = NULL;
-
-    while (vis_pool)
-    {
-        VisNode * node = vis_pool;
-        vis_pool = node->next;
-        g_free (node);
-    }
-
-    if (! clear_source)
-        clear_source = g_timeout_add (0, send_clear, NULL);
-}
-
-void vis_runner_flush (void)
-{
-    pthread_mutex_lock (& mutex);
-    flush_locked ();
-    pthread_mutex_unlock (& mutex);
-}
-
-static void start_stop_locked (bool_t new_playing, bool_t new_paused)
-{
-    playing = new_playing;
-    paused = new_paused;
-    active = playing && enabled;
-
-    if (send_source)
-    {
-        g_source_remove (send_source);
-        send_source = 0;
-    }
-
-    if (clear_source)
-    {
-        g_source_remove (clear_source);
-        clear_source = 0;
-    }
-
-    if (! active)
-        flush_locked ();
-    else if (! paused)
-        send_source = g_timeout_add (INTERVAL, send_audio, NULL);
-}
-
-void vis_runner_start_stop (bool_t new_playing, bool_t new_paused)
-{
-    pthread_mutex_lock (& mutex);
-    start_stop_locked (new_playing, new_paused);
-    pthread_mutex_unlock (& mutex);
-}
-
-void vis_runner_pass_audio (int time, float * data, int samples, int
- channels, int rate)
-{
-    pthread_mutex_lock (& mutex);
-
-    if (! active)
-        goto UNLOCK;
-
-    /* We can build a single node from multiple calls; we can also build
-     * multiple nodes from the same call.  If current_node is present, it was
-     * partly built in the last call and needs to be finished. */
-
-    int at = 0;
-
-    while (1)
-    {
-        if (current_node)
-            assert (current_node->channels == channels);
-        else
-        {
-            int node_time = time;
-
-            /* There is no partly-built node, so start a new one.  Normally
-             * there will be nodes in the queue already; if so, we want to copy
-             * audio data from the signal starting at 30 milliseconds after the
-             * beginning of the most recent node.  If there are no nodes in the
-             * queue, we are at the beginning of the song or had an underrun,
-             * and we want to copy the earliest audio data we have. */
-
-            if (vis_list_tail)
-                node_time = vis_list_tail->time + INTERVAL;
-
-            at = channels * (int) ((int64_t) (node_time - time) * rate / 1000);
-
-            if (at < 0)
-                at = 0;
-            if (at >= samples)
-                break;
-
-            current_node = alloc_node_locked (channels);
-            current_node->time = node_time;
-            current_frames = 0;
-        }
-
-        /* Copy as much data as we can, limited by how much we have and how much
-         * space is left in the node.  If we cannot fill the node, we return and
-         * wait for more data to be passed in the next call.  If we do fill the
-         * node, we loop and start building a new one. */
-
-        int copy = MIN (samples - at, channels * (FRAMES_PER_NODE - current_frames));
-        memcpy (current_node->data + channels * current_frames, data + at, sizeof (float) * copy);
-        current_frames += copy / channels;
-
-        if (current_frames < FRAMES_PER_NODE)
-            break;
-
-        push_node_locked (current_node);
-        current_node = NULL;
-    }
-
-UNLOCK:
-    pthread_mutex_unlock (& mutex);
-}
-
-void vis_runner_enable (bool_t enable)
-{
-    pthread_mutex_lock (& mutex);
-    enabled = enable;
-    start_stop_locked (playing, paused);
-    pthread_mutex_unlock (& mutex);
-}
diff --git a/src/audacious/vis_runner.h b/src/audacious/vis_runner.h
deleted file mode 100644
index 4b08c5bef45b..000000000000
--- a/src/audacious/vis_runner.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * vis_runner.h
- * Copyright 2009-2010 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUD_VIS_RUNNER_H
-#define AUD_VIS_RUNNER_H
-
-#include <libaudcore/core.h>
-
-void vis_runner_start_stop (bool_t playing, bool_t paused);
-void vis_runner_pass_audio (int time, float * data, int samples, int channels, int rate);
-void vis_runner_flush (void);
-void vis_runner_enable (bool_t enable);
-
-#endif
diff --git a/src/audacious/visualization.c b/src/audacious/visualization.c
deleted file mode 100644
index 85ef43031bf6..000000000000
--- a/src/audacious/visualization.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * visualization.c
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <gtk/gtk.h>
-#include <string.h>
-
-#include "debug.h"
-#include "fft.h"
-#include "interface.h"
-#include "misc.h"
-#include "plugin.h"
-#include "plugins.h"
-#include "ui_preferences.h"
-#include "visualization.h"
-#include "vis_runner.h"
-
-static GList * vis_funcs[AUD_VIS_TYPES];
-
-typedef struct {
-    PluginHandle * plugin;
-    VisPlugin * header;
-    GtkWidget * widget;
-} LoadedVis;
-
-static int running = FALSE;
-static GList * loaded_vis_plugins = NULL;
-
-void vis_func_add (int type, GCallback func)
-{
-    g_return_if_fail (type >= 0 && type < AUD_VIS_TYPES);
-    vis_funcs[type] = g_list_prepend (vis_funcs[type], (void *) func);
-
-    vis_runner_enable (TRUE);
-}
-
-void vis_func_remove (GCallback func)
-{
-    bool_t disable = TRUE;
-
-    for (int i = 0; i < AUD_VIS_TYPES; i ++)
-    {
-        vis_funcs[i] = g_list_remove_all (vis_funcs[i], (void *) func);
-        if (vis_funcs[i])
-            disable = FALSE;
-    }
-
-    if (disable)
-        vis_runner_enable (FALSE);
-}
-
-void vis_send_clear (void)
-{
-    for (GList * node = vis_funcs[AUD_VIS_TYPE_CLEAR]; node; node = node->next)
-    {
-        void (* func) (void) = (void (*) (void)) node->data;
-        func ();
-    }
-}
-
-static void pcm_to_mono (const float * data, float * mono, int channels)
-{
-    if (channels == 1)
-        memcpy (mono, data, sizeof (float) * 512);
-    else
-    {
-        float * set = mono;
-        while (set < & mono[512])
-        {
-            * set ++ = (data[0] + data[1]) / 2;
-            data += channels;
-        }
-    }
-}
-
-void vis_send_audio (const float * data, int channels)
-{
-    float mono[512];
-    float freq[256];
-
-    if (vis_funcs[AUD_VIS_TYPE_MONO_PCM] || vis_funcs[AUD_VIS_TYPE_FREQ])
-        pcm_to_mono (data, mono, channels);
-    if (vis_funcs[AUD_VIS_TYPE_FREQ])
-        calc_freq (mono, freq);
-
-    for (GList * node = vis_funcs[AUD_VIS_TYPE_MONO_PCM]; node; node = node->next)
-    {
-        void (* func) (const float *) = (void (*) (const float *)) node->data;
-        func (mono);
-    }
-
-    for (GList * node = vis_funcs[AUD_VIS_TYPE_MULTI_PCM]; node; node = node->next)
-    {
-        void (* func) (const float *, int) = (void (*) (const float *, int)) node->data;
-        func (data, channels);
-    }
-
-    for (GList * node = vis_funcs[AUD_VIS_TYPE_FREQ]; node; node = node->next)
-    {
-        void (* func) (const float *) = (void (*) (const float *)) node->data;
-        func (freq);
-    }
-}
-
-static int vis_find_cb (LoadedVis * vis, PluginHandle * plugin)
-{
-    return (vis->plugin == plugin) ? 0 : -1;
-}
-
-static void vis_load (PluginHandle * plugin)
-{
-    GList * node = g_list_find_custom (loaded_vis_plugins, plugin,
-     (GCompareFunc) vis_find_cb);
-    if (node != NULL)
-        return;
-
-    AUDDBG ("Loading %s.\n", plugin_get_name (plugin));
-    VisPlugin * header = plugin_get_header (plugin);
-    g_return_if_fail (header != NULL);
-
-    LoadedVis * vis = g_slice_new (LoadedVis);
-    vis->plugin = plugin;
-    vis->header = header;
-    vis->widget = NULL;
-
-    if (header->get_widget != NULL)
-        vis->widget = header->get_widget ();
-
-    if (vis->widget != NULL)
-    {
-        AUDDBG ("Adding %s to interface.\n", plugin_get_name (plugin));
-        g_signal_connect (vis->widget, "destroy", (GCallback)
-         gtk_widget_destroyed, & vis->widget);
-        interface_add_plugin_widget (plugin, vis->widget);
-    }
-
-    if (PLUGIN_HAS_FUNC (header, clear))
-        vis_func_add (AUD_VIS_TYPE_CLEAR, (GCallback) header->clear);
-    if (PLUGIN_HAS_FUNC (header, render_mono_pcm))
-        vis_func_add (AUD_VIS_TYPE_MONO_PCM, (GCallback) header->render_mono_pcm);
-    if (PLUGIN_HAS_FUNC (header, render_multi_pcm))
-        vis_func_add (AUD_VIS_TYPE_MULTI_PCM, (GCallback) header->render_multi_pcm);
-    if (PLUGIN_HAS_FUNC (header, render_freq))
-        vis_func_add (AUD_VIS_TYPE_FREQ, (GCallback) header->render_freq);
-
-    loaded_vis_plugins = g_list_prepend (loaded_vis_plugins, vis);
-}
-
-static void vis_unload (PluginHandle * plugin)
-{
-    GList * node = g_list_find_custom (loaded_vis_plugins, plugin,
-     (GCompareFunc) vis_find_cb);
-    if (node == NULL)
-        return;
-
-    AUDDBG ("Unloading %s.\n", plugin_get_name (plugin));
-    LoadedVis * vis = node->data;
-    loaded_vis_plugins = g_list_delete_link (loaded_vis_plugins, node);
-
-    VisPlugin * header = vis->header;
-    if (PLUGIN_HAS_FUNC (header, clear))
-        vis_func_remove ((GCallback) header->clear);
-    if (PLUGIN_HAS_FUNC (header, render_mono_pcm))
-        vis_func_remove ((GCallback) header->render_mono_pcm);
-    if (PLUGIN_HAS_FUNC (header, render_multi_pcm))
-        vis_func_remove ((GCallback) header->render_multi_pcm);
-    if (PLUGIN_HAS_FUNC (header, render_freq))
-        vis_func_remove ((GCallback) header->render_freq);
-
-    if (vis->widget != NULL)
-    {
-        AUDDBG ("Removing %s from interface.\n", plugin_get_name (plugin));
-        interface_remove_plugin_widget (plugin, vis->widget);
-        g_return_if_fail (vis->widget == NULL); /* not destroyed? */
-    }
-
-    g_slice_free (LoadedVis, vis);
-}
-
-static bool_t vis_init_cb (PluginHandle * plugin)
-{
-    vis_load (plugin);
-    return TRUE;
-}
-
-void vis_init (void)
-{
-    g_return_if_fail (! running);
-    running = TRUE;
-
-    plugin_for_enabled (PLUGIN_TYPE_VIS, (PluginForEachFunc) vis_init_cb, NULL);
-}
-
-static void vis_cleanup_cb (LoadedVis * vis)
-{
-    vis_unload (vis->plugin);
-}
-
-void vis_cleanup (void)
-{
-    g_return_if_fail (running);
-    running = FALSE;
-
-    g_list_foreach (loaded_vis_plugins, (GFunc) vis_cleanup_cb, NULL);
-}
-
-bool_t vis_plugin_start (PluginHandle * plugin)
-{
-    VisPlugin * vp = plugin_get_header (plugin);
-    g_return_val_if_fail (vp != NULL, FALSE);
-
-    if (vp->init != NULL && ! vp->init ())
-        return FALSE;
-
-    if (running)
-        vis_load (plugin);
-
-    return TRUE;
-}
-
-void vis_plugin_stop (PluginHandle * plugin)
-{
-    VisPlugin * vp = plugin_get_header (plugin);
-    g_return_if_fail (vp != NULL);
-
-    if (running)
-        vis_unload (plugin);
-
-    if (vp->cleanup != NULL)
-        vp->cleanup ();
-}
-
-PluginHandle * vis_plugin_by_widget (/* GtkWidget * */ void * widget)
-{
-    g_return_val_if_fail (widget, NULL);
-
-    for (GList * node = loaded_vis_plugins; node; node = node->next)
-    {
-        LoadedVis * vis = node->data;
-        if (vis->widget == widget)
-            return vis->plugin;
-    }
-
-    return NULL;
-}
diff --git a/src/audacious/visualization.h b/src/audacious/visualization.h
deleted file mode 100644
index f57e86efffdb..000000000000
--- a/src/audacious/visualization.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * visualization.h
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDACIOUS_VISUALIZATION_H
-#define AUDACIOUS_VISUALIZATION_H
-
-#include "plugins.h"
-
-void vis_send_clear (void);
-void vis_send_audio (const float * data, int channels);
-
-void vis_init (void);
-void vis_cleanup (void);
-
-bool_t vis_plugin_start (PluginHandle * plugin);
-void vis_plugin_stop (PluginHandle * plugin);
-
-PluginHandle * vis_plugin_by_widget (/* GtkWidget * */ void * widget);
-
-#endif
diff --git a/src/libaudcore/Makefile b/src/libaudcore/Makefile
index 8f380f7966bb..3771eedaeae9 100644
--- a/src/libaudcore/Makefile
+++ b/src/libaudcore/Makefile
@@ -1,34 +1,79 @@
 SHARED_LIB = ${LIB_PREFIX}audcore${LIB_SUFFIX}
-LIB_MAJOR = 2
+LIB_MAJOR = 3
 LIB_MINOR = 0
 
-SRCS = audio.c \
-       audstrings.c \
-       charset.c \
-       eventqueue.c \
-       hook.c \
-       index.c \
-       inifile.c \
-       multihash.c \
-       strpool.c \
-       tinylock.c \
-       tuple.c \
-       tuple_compiler.c \
-       tuple_formatter.c \
-       vfs.c \
-       vfs_async.c \
-       vfs_common.c \
-       vfs_local.c
+SRCS = adder.cc \
+       art.cc \
+       art-search.cc \
+       audio.cc \
+       audstrings.cc \
+       charset.cc \
+       config.cc \
+       drct.cc \
+       effect.cc \
+       equalizer.cc \
+       equalizer-preset.cc \
+       eventqueue.cc \
+       fft.cc \
+       history.cc \
+       hook.cc \
+       index.cc \
+       inifile.cc \
+       interface.cc \
+       list.cc \
+       logger.cc \
+       mainloop.cc \
+       multihash.cc \
+       output.cc \
+       playback.cc \
+       playlist.cc \
+       playlist-files.cc \
+       playlist-utils.cc \
+       plugin-init.cc \
+       plugin-load.cc \
+       plugin-registry.cc \
+       preferences.cc \
+       probe.cc \
+       probe-buffer.cc \
+       ringbuf.cc \
+       runtime.cc \
+       scanner.cc \
+       stringbuf.cc \
+       strpool.cc \
+       tinylock.cc \
+       tuple.cc \
+       tuple-compiler.cc \
+       util.cc \
+       vfs.cc \
+       vfs_async.cc \
+       vfs_local.cc \
+       vis-runner.cc \
+       visualization.cc
 
 INCLUDES = audio.h \
            audstrings.h \
-           core.h \
+           drct.h \
+           equalizer.h \
            hook.h \
+           i18n.h \
            index.h \
            inifile.h \
+           interface.h \
+           list.h \
+           mainloop.h \
            multihash.h \
+           objects.h \
+           playlist.h \
+           plugin.h \
+           plugins.h \
+           preferences.h \
+           probe.h \
+           ringbuf.h \
+           runtime.h \
+           templates.h \
            tinylock.h \
            tuple.h \
+           visualizer.h \
            vfs.h \
            vfs_async.h
 
@@ -37,13 +82,25 @@ include ../../extra.mk
 
 includesubdir = libaudcore
 
+LD = ${CXX}
+
 CPPFLAGS := -I.. -I../.. \
             ${CPPFLAGS} \
             ${GLIB_CFLAGS} \
-            ${LIBGUESS_CFLAGS}
+            ${GMODULE_CFLAGS} \
+            ${LIBGUESS_CFLAGS} \
+            ${QT_CFLAGS} \
+            -DHARDCODE_BINDIR=\"${bindir}\" \
+            -DHARDCODE_DATADIR=\"${datadir}/audacious\" \
+            -DHARDCODE_PLUGINDIR=\"${plugindir}\" \
+            -DHARDCODE_LOCALEDIR=\"${localedir}\" \
+            -DHARDCODE_DESKTOPFILE=\"${datarootdir}/applications/audacious.desktop\" \
+            -DHARDCODE_ICONFILE=\"${datarootdir}/icons/hicolor/48x48/apps/audacious.png\"
 
 CFLAGS += ${LIB_CFLAGS}
 
 LIBS += -lm \
         ${GLIB_LIBS} \
-        ${LIBGUESS_LIBS}
+        ${GMODULE_LIBS} \
+        ${LIBGUESS_LIBS} \
+        ${QT_LIBS}
diff --git a/src/libaudcore/adder.cc b/src/libaudcore/adder.cc
new file mode 100644
index 000000000000..f56143a35eb2
--- /dev/null
+++ b/src/libaudcore/adder.cc
@@ -0,0 +1,475 @@
+/*
+ * adder.c
+ * Copyright 2011-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "playlist-internal.h"
+#include "internal.h"
+
+#include <pthread.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include <glib/gstdio.h>
+
+#include "audstrings.h"
+#include "hook.h"
+#include "i18n.h"
+#include "list.h"
+#include "mainloop.h"
+#include "plugins-internal.h"
+#include "probe.h"
+#include "runtime.h"
+#include "tuple.h"
+#include "vfs.h"
+
+struct AddTask : public ListNode
+{
+    int playlist_id, at;
+    bool play;
+    Index<PlaylistAddItem> items;
+    PlaylistFilterFunc filter;
+    void * user;
+};
+
+struct AddResult : public ListNode
+{
+    int playlist_id, at;
+    bool play;
+    String title;
+    Index<PlaylistAddItem> items;
+};
+
+static void * add_worker (void * unused);
+
+static List<AddTask> add_tasks;
+static List<AddResult> add_results;
+static int current_playlist_id = -1;
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static bool add_thread_started = false;
+static bool add_thread_exited = false;
+static pthread_t add_thread;
+static QueuedFunc queued_add;
+static QueuedFunc status_timer;
+static char status_path[512];
+static int status_count;
+
+static void status_cb (void * unused)
+{
+    pthread_mutex_lock (& mutex);
+
+    char scratch[128];
+    snprintf (scratch, sizeof scratch, dngettext (PACKAGE, "%d file found",
+     "%d files found", status_count), status_count);
+
+    if (aud_get_headless_mode ())
+    {
+        printf ("Searching, %s ...\r", scratch);
+        fflush (stdout);
+    }
+    else
+    {
+        hook_call ("ui show progress", status_path);
+        hook_call ("ui show progress 2", scratch);
+    }
+
+    pthread_mutex_unlock (& mutex);
+}
+
+static void status_update (const char * filename, int found)
+{
+    pthread_mutex_lock (& mutex);
+
+    snprintf (status_path, sizeof status_path, "%s", filename);
+    status_count = found;
+
+    if (! status_timer.running ())
+        status_timer.start (250, status_cb, nullptr);
+
+    pthread_mutex_unlock (& mutex);
+}
+
+static void status_done_locked (void)
+{
+    status_timer.stop ();
+
+    if (aud_get_headless_mode ())
+        printf ("\n");
+    else
+        hook_call ("ui hide progress", nullptr);
+}
+
+static void add_file (const char * filename, Tuple && tuple,
+ PluginHandle * decoder, PlaylistFilterFunc filter, void * user,
+ AddResult * result, bool validate)
+{
+    if (filter && ! filter (filename, user))
+        return;
+
+    AUDINFO ("Adding file: %s\n", filename);
+    status_update (filename, result->items.len ());
+
+    if (! tuple && ! decoder)
+    {
+        decoder = aud_file_find_decoder (filename, ! aud_get_bool (nullptr, "slow_probe"));
+        if (validate && ! decoder)
+            return;
+    }
+
+    if (! tuple && decoder && input_plugin_has_subtunes (decoder) && ! strchr (filename, '?'))
+        tuple = aud_file_read_tuple (filename, decoder);
+
+    int n_subtunes = tuple.get_n_subtunes ();
+
+    if (n_subtunes)
+    {
+        for (int sub = 0; sub < n_subtunes; sub ++)
+        {
+            StringBuf subname = str_printf ("%s?%d", filename, tuple.get_nth_subtune (sub));
+            add_file (subname, Tuple (), decoder, filter, user, result, false);
+        }
+    }
+    else
+        result->items.append (String (filename), std::move (tuple), decoder);
+}
+
+static void add_playlist (const char * filename, PlaylistFilterFunc filter,
+ void * user, AddResult * result, bool is_single)
+{
+    if (filter && ! filter (filename, user))
+        return;
+
+    AUDINFO ("Adding playlist: %s\n", filename);
+    status_update (filename, result->items.len ());
+
+    String title;
+    Index<PlaylistAddItem> items;
+
+    if (! playlist_load (filename, title, items))
+        return;
+
+    if (is_single)
+        result->title = title;
+
+    for (auto & item : items)
+        add_file (item.filename, std::move (item.tuple), nullptr, filter, user, result, false);
+}
+
+static void add_folder (const char * filename, PlaylistFilterFunc filter,
+ void * user, AddResult * result, bool is_single)
+{
+    Index<String> cuesheets, files;
+    GDir * folder;
+
+    if (filter && ! filter (filename, user))
+        return;
+
+    AUDINFO ("Adding folder: %s\n", filename);
+    status_update (filename, result->items.len ());
+
+    StringBuf path = uri_to_filename (filename);
+    if (! path)
+        return;
+
+    if (! (folder = g_dir_open (path, 0, nullptr)))
+        return;
+
+    const char * name;
+    while ((name = g_dir_read_name (folder)))
+    {
+        if (str_has_suffix_nocase (name, ".cue"))
+            cuesheets.append (name);
+        else
+            files.append (name);
+    }
+
+    g_dir_close (folder);
+
+    for (const char * cuesheet : cuesheets)
+    {
+        AUDINFO ("Found cuesheet: %s\n", cuesheet);
+
+        auto is_match = [=] (const char * name)
+            { return same_basename (name, cuesheet); };
+
+        files.remove_if (is_match);
+    }
+
+    files.move_from (cuesheets, 0, -1, -1, true, true);
+
+    if (! files.len ())
+        return;
+
+    if (is_single)
+    {
+        const char * last = last_path_element (path);
+        result->title = String (last ? last : path);
+    }
+
+    auto compare_wrapper = [] (const String & a, const String & b, void *)
+        { return str_compare (a, b); };
+
+    files.sort (compare_wrapper, nullptr);
+
+    for (const char * name : files)
+    {
+        StringBuf filepath = filename_build ({path, name});
+        StringBuf uri = filename_to_uri (filepath);
+        if (! uri)
+            continue;
+
+        GStatBuf info;
+        if (g_lstat (filepath, & info) < 0)
+            continue;
+
+        if (S_ISREG (info.st_mode))
+        {
+            if (str_has_suffix_nocase (name, ".cue"))
+                add_playlist (uri, filter, user, result, false);
+            else
+                add_file (uri, Tuple (), nullptr, filter, user, result, true);
+        }
+        else if (S_ISDIR (info.st_mode))
+            add_folder (uri, filter, user, result, false);
+    }
+}
+
+static void add_generic (const char * filename, Tuple && tuple,
+ PlaylistFilterFunc filter, void * user, AddResult * result, bool is_single)
+{
+    if (tuple)
+        add_file (filename, std::move (tuple), nullptr, filter, user, result, false);
+    else if (VFSFile::test_file (filename, VFS_IS_DIR))
+        add_folder (filename, filter, user, result, is_single);
+    else if (aud_filename_is_playlist (filename))
+        add_playlist (filename, filter, user, result, is_single);
+    else
+        add_file (filename, Tuple (), nullptr, filter, user, result, false);
+}
+
+static void start_thread_locked (void)
+{
+    if (add_thread_exited)
+    {
+        pthread_mutex_unlock (& mutex);
+        pthread_join (add_thread, nullptr);
+        pthread_mutex_lock (& mutex);
+    }
+
+    if (! add_thread_started || add_thread_exited)
+    {
+        pthread_create (& add_thread, nullptr, add_worker, nullptr);
+        add_thread_started = true;
+        add_thread_exited = false;
+    }
+}
+
+static void stop_thread_locked (void)
+{
+    if (add_thread_started)
+    {
+        pthread_mutex_unlock (& mutex);
+        pthread_join (add_thread, nullptr);
+        pthread_mutex_lock (& mutex);
+        add_thread_started = false;
+        add_thread_exited = false;
+    }
+}
+
+static void add_finish (void * unused)
+{
+    pthread_mutex_lock (& mutex);
+
+    AddResult * result;
+    while ((result = add_results.head ()))
+    {
+        add_results.remove (result);
+
+        int playlist, count;
+
+        playlist = aud_playlist_by_unique_id (result->playlist_id);
+        if (playlist < 0) /* playlist deleted */
+            goto FREE;
+
+        count = aud_playlist_entry_count (playlist);
+        if (result->at < 0 || result->at > count)
+            result->at = count;
+
+        if (result->title && ! count)
+        {
+            String old_title = aud_playlist_get_title (playlist);
+
+            if (! strcmp (old_title, N_("New Playlist")))
+                aud_playlist_set_title (playlist, result->title);
+        }
+
+        playlist_entry_insert_batch_raw (playlist, result->at, std::move (result->items));
+
+        if (result->play && aud_playlist_entry_count (playlist) > count)
+        {
+            if (! aud_get_bool (0, "shuffle"))
+                aud_playlist_set_position (playlist, result->at);
+
+            aud_playlist_play (playlist);
+        }
+
+    FREE:
+        delete result;
+    }
+
+    if (add_thread_exited)
+    {
+        stop_thread_locked ();
+        status_done_locked ();
+    }
+
+    pthread_mutex_unlock (& mutex);
+
+    hook_call ("playlist add complete", nullptr);
+}
+
+static void * add_worker (void * unused)
+{
+    pthread_mutex_lock (& mutex);
+
+    AddTask * task;
+    while ((task = add_tasks.head ()))
+    {
+        add_tasks.remove (task);
+
+        current_playlist_id = task->playlist_id;
+        pthread_mutex_unlock (& mutex);
+
+        AddResult * result = new AddResult ();
+
+        result->playlist_id = task->playlist_id;
+        result->at = task->at;
+        result->play = task->play;
+
+        bool is_single = (task->items.len () == 1);
+
+        for (auto & item : task->items)
+            add_generic (item.filename, std::move (item.tuple), task->filter,
+             task->user, result, is_single);
+
+        delete task;
+
+        pthread_mutex_lock (& mutex);
+        current_playlist_id = -1;
+
+        if (! add_results.head ())
+            queued_add.queue (add_finish, nullptr);
+
+        add_results.append (result);
+    }
+
+    add_thread_exited = true;
+    pthread_mutex_unlock (& mutex);
+    return nullptr;
+}
+
+void adder_cleanup (void)
+{
+    pthread_mutex_lock (& mutex);
+
+    add_tasks.clear ();
+
+    stop_thread_locked ();
+    status_done_locked ();
+
+    add_results.clear ();
+
+    queued_add.stop ();
+
+    pthread_mutex_unlock (& mutex);
+}
+
+EXPORT void aud_playlist_entry_insert (int playlist, int at,
+ const char * filename, Tuple && tuple, bool play)
+{
+    Index<PlaylistAddItem> items;
+    items.append (String (filename), std::move (tuple));
+
+    aud_playlist_entry_insert_batch (playlist, at, std::move (items), play);
+}
+
+EXPORT void aud_playlist_entry_insert_batch (int playlist, int at,
+ Index<PlaylistAddItem> && items, bool play)
+{
+    aud_playlist_entry_insert_filtered (playlist, at, std::move (items), nullptr, nullptr, play);
+}
+
+EXPORT void aud_playlist_entry_insert_filtered (int playlist, int at,
+ Index<PlaylistAddItem> && items, PlaylistFilterFunc filter, void * user,
+ bool play)
+{
+    int playlist_id = aud_playlist_get_unique_id (playlist);
+
+    pthread_mutex_lock (& mutex);
+
+    AddTask * task = new AddTask ();
+
+    task->playlist_id = playlist_id;
+    task->at = at;
+    task->play = play;
+    task->items = std::move (items);
+    task->filter = filter;
+    task->user = user;
+
+    add_tasks.append (task);
+    start_thread_locked ();
+
+    pthread_mutex_unlock (& mutex);
+}
+
+EXPORT bool aud_playlist_add_in_progress (int playlist)
+{
+    pthread_mutex_lock (& mutex);
+
+    if (playlist >= 0)
+    {
+        int playlist_id = aud_playlist_get_unique_id (playlist);
+
+        for (AddTask * task = add_tasks.head (); task; task = add_tasks.next (task))
+        {
+            if (task->playlist_id == playlist_id)
+                goto YES;
+        }
+
+        if (current_playlist_id == playlist_id)
+            goto YES;
+
+        for (AddResult * result = add_results.head (); result; result = add_results.next (result))
+        {
+            if (result->playlist_id == playlist_id)
+                goto YES;
+        }
+    }
+    else
+    {
+        if (add_tasks.head () || current_playlist_id >= 0 || add_results.head ())
+            goto YES;
+    }
+
+    pthread_mutex_unlock (& mutex);
+    return false;
+
+YES:
+    pthread_mutex_unlock (& mutex);
+    return true;
+}
diff --git a/src/libaudcore/art-search.cc b/src/libaudcore/art-search.cc
new file mode 100644
index 000000000000..5188d8259323
--- /dev/null
+++ b/src/libaudcore/art-search.cc
@@ -0,0 +1,155 @@
+/*
+ * art-search.c
+ * Copyright 2006-2013 Michael Hanselmann, Yoshiki Yazawa, and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "internal.h"
+
+#include <string.h>
+
+#include <glib.h>  /* for g_dir_open, g_file_test */
+
+#include "audstrings.h"
+#include "index.h"
+#include "runtime.h"
+
+struct SearchParams {
+    String filename;
+    Index<String> include, exclude;
+};
+
+static bool has_front_cover_extension (const char * name)
+{
+    const char * ext = strrchr (name, '.');
+    if (! ext)
+        return false;
+
+    return ! strcmp_nocase (ext, ".jpg") || ! strcmp_nocase (ext, ".jpeg") ||
+     ! strcmp_nocase (ext, ".png");
+}
+
+static bool cover_name_filter (const char * name,
+ const Index<String> & keywords, bool ret_on_empty)
+{
+    if (! keywords.len ())
+        return ret_on_empty;
+
+    for (const String & keyword : keywords)
+    {
+        if (strstr_nocase (name, keyword))
+            return true;
+    }
+
+    return false;
+}
+
+static String fileinfo_recursive_get_image (const char * path,
+ const SearchParams * params, int depth)
+{
+    GDir * d = g_dir_open (path, 0, nullptr);
+    if (! d)
+        return String ();
+
+    const char * name;
+
+    if (aud_get_bool (nullptr, "use_file_cover") && ! depth)
+    {
+        /* Look for images matching file name */
+        while ((name = g_dir_read_name (d)))
+        {
+            StringBuf newpath = filename_build ({path, name});
+
+            if (! g_file_test (newpath, G_FILE_TEST_IS_DIR) &&
+             has_front_cover_extension (name) &&
+             same_basename (name, params->filename))
+            {
+                g_dir_close (d);
+                return String (newpath);
+            }
+        }
+
+        g_dir_rewind (d);
+    }
+
+    /* Search for files using filter */
+    while ((name = g_dir_read_name (d)))
+    {
+        StringBuf newpath = filename_build ({path, name});
+
+        if (! g_file_test (newpath, G_FILE_TEST_IS_DIR) &&
+         has_front_cover_extension (name) &&
+         cover_name_filter (name, params->include, true) &&
+         ! cover_name_filter (name, params->exclude, false))
+        {
+            g_dir_close (d);
+            return String (newpath);
+        }
+    }
+
+    g_dir_rewind (d);
+
+    if (aud_get_bool (nullptr, "recurse_for_cover") && depth < aud_get_int (nullptr, "recurse_for_cover_depth"))
+    {
+        /* Descend into directories recursively. */
+        while ((name = g_dir_read_name (d)))
+        {
+            StringBuf newpath = filename_build ({path, name});
+
+            if (g_file_test (newpath, G_FILE_TEST_IS_DIR))
+            {
+                String tmp = fileinfo_recursive_get_image (newpath, params, depth + 1);
+
+                if (tmp)
+                {
+                    g_dir_close (d);
+                    return tmp;
+                }
+            }
+        }
+    }
+
+    g_dir_close (d);
+    return String ();
+}
+
+String art_search (const char * filename)
+{
+    StringBuf local = uri_to_filename (filename);
+    if (! local)
+        return String ();
+
+    const char * elem = last_path_element (local);
+    if (! elem)
+        return String ();
+
+    String include = aud_get_str (nullptr, "cover_name_include");
+    String exclude = aud_get_str (nullptr, "cover_name_exclude");
+
+    SearchParams params = {
+        String (elem),
+        str_list_to_index (include, ", "),
+        str_list_to_index (exclude, ", ")
+    };
+
+    cut_path_element (local, elem - local);
+
+    String image_local = fileinfo_recursive_get_image (local, & params, 0);
+    if (! image_local)
+        return String ();
+
+    return String (filename_to_uri (image_local));
+}
diff --git a/src/libaudcore/art.cc b/src/libaudcore/art.cc
new file mode 100644
index 000000000000..e37b017413ac
--- /dev/null
+++ b/src/libaudcore/art.cc
@@ -0,0 +1,271 @@
+/*
+ * art.c
+ * Copyright 2011-2012 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "probe.h"
+#include "internal.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <glib/gstdio.h>
+
+#include "audstrings.h"
+#include "hook.h"
+#include "mainloop.h"
+#include "multihash.h"
+#include "playlist.h"
+#include "runtime.h"
+#include "scanner.h"
+#include "vfs.h"
+
+#define FLAG_DONE 1
+#define FLAG_SENT 2
+
+struct ArtItem {
+    int refcount;
+    int flag;
+
+    /* album art as JPEG or PNG data */
+    Index<char> data;
+
+    /* album art as (possibly a temporary) file */
+    String art_file;
+    bool is_temp;
+};
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static SimpleHash<String, ArtItem> art_items;
+static String current_ref;
+static QueuedFunc queued_requests;
+
+static void get_queued_cb (const String & key, ArtItem & item, void * list)
+{
+    if (item.flag == FLAG_DONE)
+    {
+        ((Index<String> *) list)->append (key);
+        item.flag = FLAG_SENT;
+    }
+}
+
+static Index<String> get_queued ()
+{
+    Index<String> queued;
+    pthread_mutex_lock (& mutex);
+
+    art_items.iterate (get_queued_cb, & queued);
+
+    queued_requests.stop ();
+
+    pthread_mutex_unlock (& mutex);
+    return queued;
+}
+
+static void send_requests (void *)
+{
+    Index<String> queued = get_queued ();
+
+    String current_wanted;
+    if (! current_ref)
+    {
+        int playlist = aud_playlist_get_playing ();
+        int entry = aud_playlist_get_position (playlist);
+        current_wanted = aud_playlist_entry_get_filename (playlist, entry);
+    }
+
+    for (const String & file : queued)
+    {
+        hook_call ("art ready", (void *) (const char *) file);
+
+        if (file == current_wanted)
+        {
+            hook_call ("current art ready", (void *) (const char *) file);
+            current_ref = file;
+        }
+        else
+            aud_art_unref (file); /* release temporary reference */
+    }
+}
+
+static void request_callback (ScanRequest * request)
+{
+    pthread_mutex_lock (& mutex);
+
+    ArtItem * item = art_items.lookup (request->filename);
+    assert (item && ! item->flag);
+
+    item->data = std::move (request->image_data);
+    item->art_file = std::move (request->image_file);
+    item->flag = FLAG_DONE;
+
+    queued_requests.queue (send_requests, nullptr);
+
+    pthread_mutex_unlock (& mutex);
+}
+
+static ArtItem * art_item_get (const String & file)
+{
+    ArtItem * item = art_items.lookup (file);
+
+    if (item && item->flag)
+    {
+        item->refcount ++;
+        return item;
+    }
+
+    if (! item)
+    {
+        item = art_items.add (file, ArtItem ());
+        item->refcount = 1; /* temporary reference */
+
+        scanner_request (new ScanRequest (file, SCAN_IMAGE, request_callback));
+    }
+
+    return nullptr;
+}
+
+static void art_item_unref (const String & file, ArtItem * item)
+{
+    if (! -- item->refcount)
+    {
+        /* delete temporary file */
+        if (item->art_file && item->is_temp)
+        {
+            StringBuf local = uri_to_filename (item->art_file);
+            if (local)
+                g_unlink (local);
+        }
+
+        art_items.remove (file);
+    }
+}
+
+static void release_current (void)
+{
+    if (current_ref)
+    {
+        aud_art_unref (current_ref);
+        current_ref = String ();
+    }
+}
+
+void art_init (void)
+{
+    hook_associate ("playlist position", (HookFunction) release_current, nullptr);
+    hook_associate ("playlist set playing", (HookFunction) release_current, nullptr);
+}
+
+void art_cleanup (void)
+{
+    hook_dissociate ("playlist position", (HookFunction) release_current);
+    hook_dissociate ("playlist set playing", (HookFunction) release_current);
+
+    Index<String> queued = get_queued ();
+    for (const String & file : queued)
+        aud_art_unref (file); /* release temporary reference */
+
+    release_current ();
+
+    if (art_items.n_items ())
+        AUDWARN ("Album art reference count not zero at exit!\n");
+}
+
+EXPORT const Index<char> * aud_art_request_data (const char * file, bool * queued)
+{
+    const Index<char> * data = nullptr;
+    pthread_mutex_lock (& mutex);
+
+    String key (file);
+    ArtItem * item = art_item_get (key);
+
+    if (queued)
+        * queued = ! item;
+
+    if (! item)
+        goto UNLOCK;
+
+    /* load data from external image file */
+    if (! item->data.len () && item->art_file)
+    {
+        VFSFile file (item->art_file, "r");
+        if (file)
+            item->data = file.read_all ();
+    }
+
+    if (item->data.len ())
+        data = & item->data;
+    else
+        art_item_unref (key, item);
+
+UNLOCK:
+    pthread_mutex_unlock (& mutex);
+    return data;
+}
+
+EXPORT const char * aud_art_request_file (const char * file, bool * queued)
+{
+    const char * art_file = nullptr;
+    pthread_mutex_lock (& mutex);
+
+    String key (file);
+    ArtItem * item = art_item_get (key);
+
+    if (queued)
+        * queued = ! item;
+
+    if (! item)
+        goto UNLOCK;
+
+    /* save data to temporary file */
+    if (item->data.len () && ! item->art_file)
+    {
+        String local = write_temp_file (item->data.begin (), item->data.len ());
+        if (local)
+        {
+            item->art_file = String (filename_to_uri (local));
+            item->is_temp = true;
+        }
+    }
+
+    if (item->art_file)
+        art_file = item->art_file;
+    else
+        art_item_unref (key, item);
+
+UNLOCK:
+    pthread_mutex_unlock (& mutex);
+    return art_file;
+}
+
+EXPORT void aud_art_unref (const char * file)
+{
+    pthread_mutex_lock (& mutex);
+
+    String key (file);
+    ArtItem * item = art_items.lookup (key);
+    assert (item);
+
+    art_item_unref (key, item);
+
+    pthread_mutex_unlock (& mutex);
+}
diff --git a/src/libaudcore/audio.c b/src/libaudcore/audio.c
deleted file mode 100644
index 25246be9dc0b..000000000000
--- a/src/libaudcore/audio.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * audio.c
- * Copyright 2009-2013 John Lindgren, Michał Lipski, and Anders Johansson
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <stdint.h>
-#include <math.h>
-
-#include "audio.h"
-#include "core.h"
-
-#define INTERLACE_LOOP(TYPE) \
-for (int c = 0; c < channels; c ++) \
-{ \
-    const TYPE * get = in[c]; \
-    const TYPE * end = get + frames; \
-    TYPE * set = (TYPE *) out + c; \
-    while (get < end) \
-    { \
-        * set = * get ++; \
-        set += channels; \
-    } \
-}
-
-EXPORT void audio_interlace (const void * const * in, int format, int channels,
- void * out, int frames)
-{
-    switch (format)
-    {
-    case FMT_FLOAT:
-        INTERLACE_LOOP (float);
-        break;
-
-    case FMT_S8:
-    case FMT_U8:
-        INTERLACE_LOOP (int8_t);
-        break;
-
-    case FMT_S16_LE:
-    case FMT_S16_BE:
-    case FMT_U16_LE:
-    case FMT_U16_BE:
-        INTERLACE_LOOP (int16_t);
-        break;
-
-    case FMT_S24_LE:
-    case FMT_S24_BE:
-    case FMT_U24_LE:
-    case FMT_U24_BE:
-    case FMT_S32_LE:
-    case FMT_S32_BE:
-    case FMT_U32_LE:
-    case FMT_U32_BE:
-        INTERLACE_LOOP (int32_t);
-        break;
-    }
-}
-
-#define FROM_INT_LOOP(NAME, TYPE, SWAP, OFFSET, RANGE) \
-static void NAME (const TYPE * in, float * out, int samples) \
-{ \
-    const TYPE * end = in + samples; \
-    while (in < end) \
-        * out ++ = (TYPE) (SWAP (* in ++) - OFFSET) * (1.0 / (RANGE + 1.0)); \
-}
-
-#define TO_INT_LOOP(NAME, TYPE, SWAP, OFFSET, RANGE) \
-static void NAME (const float * in, TYPE * out, int samples) \
-{ \
-    const float * end = in + samples; \
-    while (in < end) \
-    { \
-        double f = (* in ++) * (RANGE + 1.0); \
-        * out ++ = SWAP (OFFSET + (TYPE) round (CLAMP (f, -RANGE - 1, RANGE))); \
-    } \
-}
-
-FROM_INT_LOOP (from_s8, int8_t, , 0x00, 0x7f)
-FROM_INT_LOOP (from_u8, int8_t, , 0x80, 0x7f)
-FROM_INT_LOOP (from_s16, int16_t, , 0x0000, 0x7fff)
-FROM_INT_LOOP (from_u16, int16_t, , 0x8000, 0x7fff)
-FROM_INT_LOOP (from_s24, int32_t, , 0x000000, 0x7fffff)
-FROM_INT_LOOP (from_u24, int32_t, , 0x800000, 0x7fffff)
-FROM_INT_LOOP (from_s32, int32_t, , 0x00000000, 0x7fffffff)
-FROM_INT_LOOP (from_u32, int32_t, , 0x80000000, 0x7fffffff)
-
-TO_INT_LOOP (to_s8, int8_t, , 0x00, 0x7f)
-TO_INT_LOOP (to_u8, int8_t, , 0x80, 0x7f)
-TO_INT_LOOP (to_s16, int16_t, , 0x0000, 0x7fff)
-TO_INT_LOOP (to_u16, int16_t, , 0x8000, 0x7fff)
-TO_INT_LOOP (to_s24, int32_t, , 0x000000, 0x7fffff)
-TO_INT_LOOP (to_u24, int32_t, , 0x800000, 0x7fffff)
-TO_INT_LOOP (to_s32, int32_t, , 0x00000000, 0x7fffffff)
-TO_INT_LOOP (to_u32, int32_t, , 0x80000000, 0x7fffffff)
-
-static inline int16_t SWAP16 (int16_t i) {return GUINT16_SWAP_LE_BE (i);}
-static inline int32_t SWAP32 (int32_t i) {return GUINT32_SWAP_LE_BE (i);}
-
-FROM_INT_LOOP (from_s16_swap, int16_t, SWAP16, 0x0000, 0x7fff)
-FROM_INT_LOOP (from_u16_swap, int16_t, SWAP16, 0x8000, 0x7fff)
-FROM_INT_LOOP (from_s24_swap, int32_t, SWAP32, 0x000000, 0x7fffff)
-FROM_INT_LOOP (from_u24_swap, int32_t, SWAP32, 0x800000, 0x7fffff)
-FROM_INT_LOOP (from_s32_swap, int32_t, SWAP32, 0x00000000, 0x7fffffff)
-FROM_INT_LOOP (from_u32_swap, int32_t, SWAP32, 0x80000000, 0x7fffffff)
-
-TO_INT_LOOP (to_s16_swap, int16_t, SWAP16, 0x0000, 0x7fff)
-TO_INT_LOOP (to_u16_swap, int16_t, SWAP16, 0x8000, 0x7fff)
-TO_INT_LOOP (to_s24_swap, int32_t, SWAP32, 0x000000, 0x7fffff)
-TO_INT_LOOP (to_u24_swap, int32_t, SWAP32, 0x800000, 0x7fffff)
-TO_INT_LOOP (to_s32_swap, int32_t, SWAP32, 0x00000000, 0x7fffffff)
-TO_INT_LOOP (to_u32_swap, int32_t, SWAP32, 0x80000000, 0x7fffffff)
-
-typedef void (* FromFunc) (const void * in, float * out, int samples);
-typedef void (* ToFunc) (const float * in, void * out, int samples);
-
-struct
-{
-    int format;
-    FromFunc from;
-    ToFunc to;
-}
-convert_table [] =
-{
-    {FMT_S8, (FromFunc) from_s8, (ToFunc) to_s8},
-    {FMT_U8, (FromFunc) from_u8, (ToFunc) to_u8},
-
-#if G_BYTE_ORDER == G_LITTLE_ENDIAN
-    {FMT_S16_LE, (FromFunc) from_s16, (ToFunc) to_s16},
-    {FMT_U16_LE, (FromFunc) from_u16, (ToFunc) to_u16},
-    {FMT_S24_LE, (FromFunc) from_s24, (ToFunc) to_s24},
-    {FMT_U24_LE, (FromFunc) from_u24, (ToFunc) to_u24},
-    {FMT_S32_LE, (FromFunc) from_s32, (ToFunc) to_s32},
-    {FMT_U32_LE, (FromFunc) from_u32, (ToFunc) to_u32},
-
-    {FMT_S16_BE, (FromFunc) from_s16_swap, (ToFunc) to_s16_swap},
-    {FMT_U16_BE, (FromFunc) from_u16_swap, (ToFunc) to_u16_swap},
-    {FMT_S24_BE, (FromFunc) from_s24_swap, (ToFunc) to_s24_swap},
-    {FMT_U24_BE, (FromFunc) from_u24_swap, (ToFunc) to_u24_swap},
-    {FMT_S32_BE, (FromFunc) from_s32_swap, (ToFunc) to_s32_swap},
-    {FMT_U32_BE, (FromFunc) from_u32_swap, (ToFunc) to_u32_swap},
-#else
-    {FMT_S16_BE, (FromFunc) from_s16, (ToFunc) to_s16},
-    {FMT_U16_BE, (FromFunc) from_u16, (ToFunc) to_u16},
-    {FMT_S24_BE, (FromFunc) from_s24, (ToFunc) to_s24},
-    {FMT_U24_BE, (FromFunc) from_u24, (ToFunc) to_u24},
-    {FMT_S32_BE, (FromFunc) from_s32, (ToFunc) to_s32},
-    {FMT_U32_BE, (FromFunc) from_u32, (ToFunc) to_u32},
-
-    {FMT_S16_LE, (FromFunc) from_s16_swap, (ToFunc) to_s16_swap},
-    {FMT_U16_LE, (FromFunc) from_u16_swap, (ToFunc) to_u16_swap},
-    {FMT_S24_LE, (FromFunc) from_s24_swap, (ToFunc) to_s24_swap},
-    {FMT_U24_LE, (FromFunc) from_u24_swap, (ToFunc) to_u24_swap},
-    {FMT_S32_LE, (FromFunc) from_s32_swap, (ToFunc) to_s32_swap},
-    {FMT_U32_LE, (FromFunc) from_u32_swap, (ToFunc) to_u32_swap},
-#endif
-};
-
-EXPORT void audio_from_int (const void * in, int format, float * out, int samples)
-{
-    int entry;
-
-    for (entry = 0; entry < ARRAY_LEN (convert_table); entry ++)
-    {
-        if (convert_table[entry].format == format)
-        {
-            convert_table[entry].from (in, out, samples);
-            return;
-        }
-    }
-}
-
-EXPORT void audio_to_int (const float * in, void * out, int format, int samples)
-{
-    int entry;
-
-    for (entry = 0; entry < ARRAY_LEN (convert_table); entry ++)
-    {
-        if (convert_table[entry].format == format)
-        {
-            convert_table[entry].to (in, out, samples);
-            return;
-        }
-    }
-}
-
-EXPORT void audio_amplify (float * data, int channels, int frames, float * factors)
-{
-    float * end = data + channels * frames;
-    int channel;
-
-    while (data < end)
-    {
-        for (channel = 0; channel < channels; channel ++)
-        {
-            * data = * data * factors[channel];
-            data ++;
-        }
-    }
-}
-
-/* linear approximation of y = sin(x) */
-/* contributed by Anders Johansson */
-EXPORT void audio_soft_clip (float * data, int samples)
-{
-    float * end = data + samples;
-
-    while (data < end)
-    {
-        float x = * data;
-        float y = fabsf (x);
-
-        if (y <= 0.4)
-            ;                      /* (0, 0.4) -> (0, 0.4) */
-        else if (y <= 0.7)
-            y = 0.8 * y + 0.08;    /* (0.4, 0.7) -> (0.4, 0.64) */
-        else if (y <= 1.0)
-            y = 0.7 * y + 0.15;    /* (0.7, 1) -> (0.64, 0.85) */
-        else if (y <= 1.3)
-            y = 0.4 * y + 0.45;    /* (1, 1.3) -> (0.85, 0.97) */
-        else if (y <= 1.5)
-            y = 0.15 * y + 0.775;  /* (1.3, 1.5) -> (0.97, 1) */
-        else
-            y = 1.0;               /* (1.5, inf) -> 1 */
-
-        * data ++ = (x > 0) ? y : -y;
-    }
-}
diff --git a/src/libaudcore/audio.cc b/src/libaudcore/audio.cc
new file mode 100644
index 000000000000..9f92403da7a1
--- /dev/null
+++ b/src/libaudcore/audio.cc
@@ -0,0 +1,300 @@
+/*
+ * audio.c
+ * Copyright 2009-2013 John Lindgren, Michał Lipski, and Anders Johansson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <math.h>
+#include <stdint.h>
+
+#define WANT_AUD_BSWAP
+#include "audio.h"
+#include "objects.h"
+
+#define SW_VOLUME_RANGE 40 /* decibels */
+
+#define INTERLACE_LOOP(TYPE) \
+for (int c = 0; c < channels; c ++) \
+{ \
+    const TYPE * get = (const TYPE *) in[c]; \
+    const TYPE * end = get + frames; \
+    TYPE * set = (TYPE *) out + c; \
+    while (get < end) \
+    { \
+        * set = * get ++; \
+        set += channels; \
+    } \
+}
+
+EXPORT void audio_interlace (const void * const * in, int format, int channels,
+ void * out, int frames)
+{
+    switch (format)
+    {
+    case FMT_FLOAT:
+        INTERLACE_LOOP (float);
+        break;
+
+    case FMT_S8:
+    case FMT_U8:
+        INTERLACE_LOOP (int8_t);
+        break;
+
+    case FMT_S16_LE:
+    case FMT_S16_BE:
+    case FMT_U16_LE:
+    case FMT_U16_BE:
+        INTERLACE_LOOP (int16_t);
+        break;
+
+    case FMT_S24_LE:
+    case FMT_S24_BE:
+    case FMT_U24_LE:
+    case FMT_U24_BE:
+    case FMT_S32_LE:
+    case FMT_S32_BE:
+    case FMT_U32_LE:
+    case FMT_U32_BE:
+        INTERLACE_LOOP (int32_t);
+        break;
+    }
+}
+
+#define DEINTERLACE_LOOP(TYPE) \
+for (int c = 0; c < channels; c ++) \
+{ \
+    const TYPE * get = (const TYPE *) in + c; \
+    TYPE * set = (TYPE *) out[c]; \
+    TYPE * end = set + frames; \
+    while (set < end) \
+    { \
+        * set ++ = * get; \
+        get += channels; \
+    } \
+}
+
+EXPORT void audio_deinterlace (const void * in, int format, int channels,
+ void * const * out, int frames)
+{
+    switch (format)
+    {
+    case FMT_FLOAT:
+        DEINTERLACE_LOOP (float);
+        break;
+
+    case FMT_S8:
+    case FMT_U8:
+        DEINTERLACE_LOOP (int8_t);
+        break;
+
+    case FMT_S16_LE:
+    case FMT_S16_BE:
+    case FMT_U16_LE:
+    case FMT_U16_BE:
+        DEINTERLACE_LOOP (int16_t);
+        break;
+
+    case FMT_S24_LE:
+    case FMT_S24_BE:
+    case FMT_U24_LE:
+    case FMT_U24_BE:
+    case FMT_S32_LE:
+    case FMT_S32_BE:
+    case FMT_U32_LE:
+    case FMT_U32_BE:
+        DEINTERLACE_LOOP (int32_t);
+        break;
+    }
+}
+
+#define FROM_INT_LOOP(NAME, TYPE, SWAP, OFFSET, RANGE) \
+static void NAME (const TYPE * in, float * out, int samples) \
+{ \
+    const TYPE * end = in + samples; \
+    while (in < end) \
+        * out ++ = (TYPE) (SWAP (* in ++) - OFFSET) * (1.0 / (RANGE + 1.0)); \
+}
+
+#define TO_INT_LOOP(NAME, TYPE, SWAP, OFFSET, RANGE) \
+static void NAME (const float * in, TYPE * out, int samples) \
+{ \
+    const float * end = in + samples; \
+    while (in < end) \
+    { \
+        double f = (* in ++) * (RANGE + 1.0); \
+        * out ++ = SWAP (OFFSET + (TYPE) round (aud::clamp<double> (f, -RANGE - 1, RANGE))); \
+    } \
+}
+
+FROM_INT_LOOP (from_s8, int8_t, , 0x00, 0x7f)
+FROM_INT_LOOP (from_u8, int8_t, , 0x80, 0x7f)
+
+TO_INT_LOOP (to_s8, int8_t, , 0x00, 0x7f)
+TO_INT_LOOP (to_u8, int8_t, , 0x80, 0x7f)
+
+FROM_INT_LOOP (from_s16le, int16_t, FROM_LE16, 0x0000, 0x7fff)
+FROM_INT_LOOP (from_u16le, int16_t, FROM_LE16, 0x8000, 0x7fff)
+FROM_INT_LOOP (from_s24le, int32_t, FROM_LE32, 0x000000, 0x7fffff)
+FROM_INT_LOOP (from_u24le, int32_t, FROM_LE32, 0x800000, 0x7fffff)
+FROM_INT_LOOP (from_s32le, int32_t, FROM_LE32, 0x00000000, 0x7fffffff)
+FROM_INT_LOOP (from_u32le, int32_t, FROM_LE32, 0x80000000, 0x7fffffff)
+
+TO_INT_LOOP (to_s16le, int16_t, TO_LE16, 0x0000, 0x7fff)
+TO_INT_LOOP (to_u16le, int16_t, TO_LE16, 0x8000, 0x7fff)
+TO_INT_LOOP (to_s24le, int32_t, TO_LE32, 0x000000, 0x7fffff)
+TO_INT_LOOP (to_u24le, int32_t, TO_LE32, 0x800000, 0x7fffff)
+TO_INT_LOOP (to_s32le, int32_t, TO_LE32, 0x00000000, 0x7fffffff)
+TO_INT_LOOP (to_u32le, int32_t, TO_LE32, 0x80000000, 0x7fffffff)
+
+FROM_INT_LOOP (from_s16be, int16_t, FROM_BE16, 0x0000, 0x7fff)
+FROM_INT_LOOP (from_u16be, int16_t, FROM_BE16, 0x8000, 0x7fff)
+FROM_INT_LOOP (from_s24be, int32_t, FROM_BE32, 0x000000, 0x7fffff)
+FROM_INT_LOOP (from_u24be, int32_t, FROM_BE32, 0x800000, 0x7fffff)
+FROM_INT_LOOP (from_s32be, int32_t, FROM_BE32, 0x00000000, 0x7fffffff)
+FROM_INT_LOOP (from_u32be, int32_t, FROM_BE32, 0x80000000, 0x7fffffff)
+
+TO_INT_LOOP (to_s16be, int16_t, TO_BE16, 0x0000, 0x7fff)
+TO_INT_LOOP (to_u16be, int16_t, TO_BE16, 0x8000, 0x7fff)
+TO_INT_LOOP (to_s24be, int32_t, TO_BE32, 0x000000, 0x7fffff)
+TO_INT_LOOP (to_u24be, int32_t, TO_BE32, 0x800000, 0x7fffff)
+TO_INT_LOOP (to_s32be, int32_t, TO_BE32, 0x00000000, 0x7fffffff)
+TO_INT_LOOP (to_u32be, int32_t, TO_BE32, 0x80000000, 0x7fffffff)
+
+typedef void (* FromFunc) (const void * in, float * out, int samples);
+typedef void (* ToFunc) (const float * in, void * out, int samples);
+
+static const struct
+{
+    int format;
+    FromFunc from;
+    ToFunc to;
+}
+convert_table [] =
+{
+    {FMT_S8, (FromFunc) from_s8, (ToFunc) to_s8},
+    {FMT_U8, (FromFunc) from_u8, (ToFunc) to_u8},
+
+    {FMT_S16_LE, (FromFunc) from_s16le, (ToFunc) to_s16le},
+    {FMT_U16_LE, (FromFunc) from_u16le, (ToFunc) to_u16le},
+    {FMT_S24_LE, (FromFunc) from_s24le, (ToFunc) to_s24le},
+    {FMT_U24_LE, (FromFunc) from_u24le, (ToFunc) to_u24le},
+    {FMT_S32_LE, (FromFunc) from_s32le, (ToFunc) to_s32le},
+    {FMT_U32_LE, (FromFunc) from_u32le, (ToFunc) to_u32le},
+
+    {FMT_S16_BE, (FromFunc) from_s16be, (ToFunc) to_s16be},
+    {FMT_U16_BE, (FromFunc) from_u16be, (ToFunc) to_u16be},
+    {FMT_S24_BE, (FromFunc) from_s24be, (ToFunc) to_s24be},
+    {FMT_U24_BE, (FromFunc) from_u24be, (ToFunc) to_u24be},
+    {FMT_S32_BE, (FromFunc) from_s32be, (ToFunc) to_s32be},
+    {FMT_U32_BE, (FromFunc) from_u32be, (ToFunc) to_u32be},
+};
+
+EXPORT void audio_from_int (const void * in, int format, float * out, int samples)
+{
+    for (auto & conv : convert_table)
+    {
+        if (conv.format == format)
+        {
+            conv.from (in, out, samples);
+            return;
+        }
+    }
+}
+
+EXPORT void audio_to_int (const float * in, void * out, int format, int samples)
+{
+    for (auto & conv : convert_table)
+    {
+        if (conv.format == format)
+        {
+            conv.to (in, out, samples);
+            return;
+        }
+    }
+}
+
+EXPORT void audio_amplify (float * data, int channels, int frames, const float * factors)
+{
+    float * end = data + channels * frames;
+    int channel;
+
+    while (data < end)
+    {
+        for (channel = 0; channel < channels; channel ++)
+        {
+            * data = * data * factors[channel];
+            data ++;
+        }
+    }
+}
+
+EXPORT void audio_amplify (float * data, int channels, int frames, StereoVolume volume)
+{
+    if (channels < 1 || channels > AUD_MAX_CHANNELS)
+        return;
+
+    if (volume.left == 100 && volume.right == 100)
+        return;
+
+    float lfactor = 0, rfactor = 0;
+    float factors[AUD_MAX_CHANNELS];
+
+    if (volume.left > 0)
+        lfactor = powf (10, (float) SW_VOLUME_RANGE * (volume.left - 100) / 100 / 20);
+    if (volume.right > 0)
+        rfactor = powf (10, (float) SW_VOLUME_RANGE * (volume.right - 100) / 100 / 20);
+
+    if (channels == 2)
+    {
+        factors[0] = lfactor;
+        factors[1] = rfactor;
+    }
+    else
+    {
+        for (int c = 0; c < channels; c ++)
+            factors[c] = aud::max (lfactor, rfactor);
+    }
+
+    audio_amplify (data, channels, frames, factors);
+}
+
+/* linear approximation of y = sin(x) */
+/* contributed by Anders Johansson */
+EXPORT void audio_soft_clip (float * data, int samples)
+{
+    float * end = data + samples;
+
+    while (data < end)
+    {
+        float x = * data;
+        float y = fabsf (x);
+
+        if (y <= 0.4)
+            ;                      /* (0, 0.4) -> (0, 0.4) */
+        else if (y <= 0.7)
+            y = 0.8 * y + 0.08;    /* (0.4, 0.7) -> (0.4, 0.64) */
+        else if (y <= 1.0)
+            y = 0.7 * y + 0.15;    /* (0.7, 1) -> (0.64, 0.85) */
+        else if (y <= 1.3)
+            y = 0.4 * y + 0.45;    /* (1, 1.3) -> (0.85, 0.97) */
+        else if (y <= 1.5)
+            y = 0.15 * y + 0.775;  /* (1.3, 1.5) -> (0.97, 1) */
+        else
+            y = 1.0;               /* (1.5, inf) -> 1 */
+
+        * data ++ = (x > 0) ? y : -y;
+    }
+}
diff --git a/src/libaudcore/audio.h.in b/src/libaudcore/audio.h.in
index 2e9dd5a03ea3..e49302f7f887 100644
--- a/src/libaudcore/audio.h.in
+++ b/src/libaudcore/audio.h.in
@@ -20,6 +20,8 @@
 #ifndef LIBAUDCORE_AUDIO_H
 #define LIBAUDCORE_AUDIO_H
 
+#define AUD_MAX_CHANNELS 10
+
 /* 24-bit integer samples are padded to 32-bit; high byte is always 0 */
 enum {
  FMT_FLOAT,
@@ -28,28 +30,103 @@ enum {
  FMT_S24_LE, FMT_S24_BE, FMT_U24_LE, FMT_U24_BE,
  FMT_S32_LE, FMT_S32_BE, FMT_U32_LE, FMT_U32_BE};
 
+struct ReplayGainInfo {
+    float track_gain; /* dB */
+    float track_peak; /* 0-1 */
+    float album_gain; /* dB */
+    float album_peak; /* 0-1 */
+};
+
+struct StereoVolume {
+    int left, right;
+};
+
+#ifdef WANT_AUD_BSWAP
+
+#include <stdint.h>
+
+#undef bswap16
+#undef bswap32
+#undef bswap64
+
+/* GCC will optimize these to appropriate bswap instructions */
+constexpr uint16_t bswap16 (uint16_t x)
+    { return ((x & 0xff00) >> 8) | ((x & 0x00ff) << 8); }
+
+constexpr uint32_t bswap32 (uint32_t x)
+{
+    return ((x & 0xff000000) >> 24) | ((x & 0x00ff0000) >> 8) |
+           ((x & 0x0000ff00) << 8) | ((x & 0x000000ff) << 24);
+}
+
+constexpr uint64_t bswap64 (uint64_t x)
+{
+    return ((x & 0xff00000000000000) >> 56) | ((x & 0x00ff000000000000) >> 40) |
+           ((x & 0x0000ff0000000000) >> 24) | ((x & 0x000000ff00000000) >> 8) |
+           ((x & 0x00000000ff000000) << 8) | ((x & 0x0000000000ff0000) << 24) |
+           ((x & 0x000000000000ff00) << 40) | ((x & 0x00000000000000ff) << 56);
+}
+
+#endif // WANT_AUD_BSWAP
+
 #if @BIGENDIAN@
+
 #define FMT_S16_NE FMT_S16_BE
 #define FMT_U16_NE FMT_U16_BE
 #define FMT_S24_NE FMT_S24_BE
 #define FMT_U24_NE FMT_U24_BE
 #define FMT_S32_NE FMT_S32_BE
 #define FMT_U32_NE FMT_U32_BE
-#else
+
+#ifdef WANT_AUD_BSWAP
+#define FROM_BE16(x) (x)
+#define FROM_BE32(x) (x)
+#define FROM_BE64(x) (x)
+#define FROM_LE16(x) (bswap16 (x))
+#define FROM_LE32(x) (bswap32 (x))
+#define FROM_LE64(x) (bswap64 (x))
+#define TO_BE16(x) (x)
+#define TO_BE32(x) (x)
+#define TO_BE64(x) (x)
+#define TO_LE16(x) (bswap16 (x))
+#define TO_LE32(x) (bswap32 (x))
+#define TO_LE64(x) (bswap64 (x))
+#endif
+
+#else  // ! BIGENDIAN
+
 #define FMT_S16_NE FMT_S16_LE
 #define FMT_U16_NE FMT_U16_LE
 #define FMT_S24_NE FMT_S24_LE
 #define FMT_U24_NE FMT_U24_LE
 #define FMT_S32_NE FMT_S32_LE
 #define FMT_U32_NE FMT_U32_LE
+
+#ifdef WANT_AUD_BSWAP
+#define FROM_BE16(x) (bswap16 (x))
+#define FROM_BE32(x) (bswap32 (x))
+#define FROM_BE64(x) (bswap64 (x))
+#define FROM_LE16(x) (x)
+#define FROM_LE32(x) (x)
+#define FROM_LE64(x) (x)
+#define TO_BE16(x) (bswap16 (x))
+#define TO_BE32(x) (bswap32 (x))
+#define TO_BE64(x) (bswap64 (x))
+#define TO_LE16(x) (x)
+#define TO_LE32(x) (x)
+#define TO_LE64(x) (x)
+#endif
+
 #endif
 
 #define FMT_SIZEOF(f) ((f) == FMT_FLOAT ? sizeof (float) : (f) <= FMT_U8 ? 1 : (f) <= FMT_U16_BE ? 2 : 4)
 
 void audio_interlace (const void * const * in, int format, int channels, void * out, int frames);
+void audio_deinterlace (const void * in, int format, int channels, void * const * out, int frames);
 void audio_from_int (const void * in, int format, float * out, int samples);
 void audio_to_int (const float * in, void * out, int format, int samples);
-void audio_amplify (float * data, int channels, int frames, float * factors);
+void audio_amplify (float * data, int channels, int frames, const float * factors);
+void audio_amplify (float * data, int channels, int frames, StereoVolume volume);
 void audio_soft_clip (float * data, int samples);
 
 #endif /* LIBAUDCORE_AUDIO_H */
diff --git a/src/libaudcore/audstrings.c b/src/libaudcore/audstrings.c
deleted file mode 100644
index c1d878b1c541..000000000000
--- a/src/libaudcore/audstrings.c
+++ /dev/null
@@ -1,784 +0,0 @@
-/*
- * audstrings.c
- * Copyright 2009-2012 John Lindgren and William Pitcock
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <limits.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include <audacious/i18n.h>
-
-#include "audstrings.h"
-#include "index.h"
-
-static const char ascii_to_hex[256] = {
-    ['0'] = 0x0, ['1'] = 0x1, ['2'] = 0x2, ['3'] = 0x3, ['4'] = 0x4,
-    ['5'] = 0x5, ['6'] = 0x6, ['7'] = 0x7, ['8'] = 0x8, ['9'] = 0x9,
-    ['a'] = 0xa, ['b'] = 0xb, ['c'] = 0xc, ['d'] = 0xd, ['e'] = 0xe, ['f'] = 0xf,
-    ['A'] = 0xa, ['B'] = 0xb, ['C'] = 0xc, ['D'] = 0xd, ['E'] = 0xe, ['F'] = 0xf
-};
-
-static const char hex_to_ascii[16] = {
-    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
-};
-
-static const char uri_legal_table[256] = {
-    ['0'] = 1, ['1'] = 1, ['2'] = 1, ['3'] = 1, ['4'] = 1,
-    ['5'] = 1, ['6'] = 1, ['7'] = 1, ['8'] = 1, ['9'] = 1,
-    ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1, ['g'] = 1,
-    ['h'] = 1, ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1, ['m'] = 1, ['n'] = 1,
-    ['o'] = 1, ['p'] = 1, ['q'] = 1, ['r'] = 1, ['s'] = 1, ['t'] = 1, ['u'] = 1,
-    ['v'] = 1, ['w'] = 1, ['x'] = 1, ['y'] = 1, ['z'] = 1,
-    ['A'] = 1, ['B'] = 1, ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1, ['G'] = 1,
-    ['H'] = 1, ['I'] = 1, ['J'] = 1, ['K'] = 1, ['L'] = 1, ['M'] = 1, ['N'] = 1,
-    ['O'] = 1, ['P'] = 1, ['Q'] = 1, ['R'] = 1, ['S'] = 1, ['T'] = 1, ['U'] = 1,
-    ['V'] = 1, ['W'] = 1, ['X'] = 1, ['Y'] = 1, ['Z'] = 1,
-    ['-'] = 1, ['_'] = 1, ['.'] = 1, ['~'] = 1, ['/'] = 1
-};
-
-static const char swap_case[256] =
-    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-    "\0abcdefghijklmnopqrstuvwxyz\0\0\0\0\0"
-    "\0ABCDEFGHIJKLMNOPQRSTUVWXYZ\0\0\0\0\0";
-
-#define FROM_HEX(c)  (ascii_to_hex[(unsigned char) (c)])
-#define TO_HEX(i)    (hex_to_ascii[(i) & 15])
-#define IS_LEGAL(c)  (uri_legal_table[(unsigned char) (c)])
-#define SWAP_CASE(c) (swap_case[(unsigned char) (c)])
-
-EXPORT char * str_printf (const char * format, ...)
-{
-    va_list args;
-    va_start (args, format);
-
-    char * str = str_vprintf (format, args);
-
-    va_end (args);
-    return str;
-}
-
-EXPORT char * str_vprintf (const char * format, va_list args)
-{
-    VSPRINTF (buf, format, args);
-    return str_get (buf);
-}
-
-EXPORT bool_t str_has_prefix_nocase (const char * str, const char * prefix)
-{
-    return ! g_ascii_strncasecmp (str, prefix, strlen (prefix));
-}
-
-EXPORT bool_t str_has_suffix_nocase (const char * str, const char * suffix)
-{
-    int len1 = strlen (str);
-    int len2 = strlen (suffix);
-
-    if (len2 > len1)
-        return FALSE;
-
-    return ! g_ascii_strcasecmp (str + len1 - len2, suffix);
-}
-
-EXPORT char * strstr_nocase (const char * haystack, const char * needle)
-{
-    while (1)
-    {
-        const char * ap = haystack;
-        const char * bp = needle;
-
-        while (1)
-        {
-            char a = * ap ++;
-            char b = * bp ++;
-
-            if (! b) /* all of needle matched */
-                return (char *) haystack;
-            if (! a) /* end of haystack reached */
-                return NULL;
-
-            if (a != b && a != SWAP_CASE (b))
-                break;
-        }
-
-        haystack ++;
-    }
-}
-
-EXPORT char * strstr_nocase_utf8 (const char * haystack, const char * needle)
-{
-    while (1)
-    {
-        const char * ap = haystack;
-        const char * bp = needle;
-
-        while (1)
-        {
-            gunichar a = g_utf8_get_char (ap);
-            gunichar b = g_utf8_get_char (bp);
-
-            if (! b) /* all of needle matched */
-                return (char *) haystack;
-            if (! a) /* end of haystack reached */
-                return NULL;
-
-            if (a != b && (a < 128 ? SWAP_CASE (a) != b :
-             g_unichar_tolower (a) != g_unichar_tolower (b)))
-                break;
-
-            ap = g_utf8_next_char (ap);
-            bp = g_utf8_next_char (bp);
-        }
-
-        haystack = g_utf8_next_char (haystack);
-    }
-}
-
-EXPORT char * str_tolower_utf8 (const char * str)
-{
-    char buf[6 * strlen (str) + 1];
-    const char * get = str;
-    char * set = buf;
-    gunichar c;
-
-    while ((c = g_utf8_get_char (get)))
-    {
-        if (c < 128)
-            * set ++ = g_ascii_tolower (c);
-        else
-            set += g_unichar_to_utf8 (g_unichar_tolower (c), set);
-
-        get = g_utf8_next_char (get);
-    }
-
-    * set = 0;
-
-    return str_get (buf);
-}
-
-EXPORT void str_replace_char (char * string, char old_c, char new_c)
-{
-    while ((string = strchr (string, old_c)))
-        * string ++ = new_c;
-}
-
-EXPORT void str_itoa (int x, char * buf, int bufsize)
-{
-    if (! bufsize)
-        return;
-
-    if (x < 0)
-    {
-        if (bufsize > 1)
-        {
-            * buf ++ = '-';
-            bufsize --;
-        }
-
-        x = -x;
-    }
-
-    char * rev = buf + bufsize - 1;
-    * rev = 0;
-
-    while (rev > buf)
-    {
-        * (-- rev) = '0' + x % 10;
-        if (! (x /= 10))
-            break;
-    }
-
-    while ((* buf ++ = * rev ++));
-}
-
-/* Percent-decodes up to <len> bytes of <str> to <out>, which must be large
- * enough to hold the decoded string (i.e., (len + 1) bytes).  If <len> is
- * negative, decodes all of <str>. */
-
-EXPORT void str_decode_percent (const char * str, int len, char * out)
-{
-    const char * nul;
-
-    if (len < 0)
-        len = strlen (str);
-    else if ((nul = memchr (str, 0, len)))
-        len = nul - str;
-
-    while (1)
-    {
-        const char * p = memchr (str, '%', len);
-        if (! p)
-            break;
-
-        int block = p - str;
-        memmove (out, str, block);
-
-        str += block;
-        out += block;
-        len -= block;
-
-        if (len < 3)
-            break;
-
-        * out ++ = (FROM_HEX (str[1]) << 4) | FROM_HEX (str[2]);
-
-        str += 3;
-        len -= 3;
-    }
-
-    memmove (out, str, len);
-    out[len] = 0;
-}
-
-/* Percent-encodes up to <len> bytes of <str> to <out>, which must be large
- * enough to hold the encoded string (i.e., (3 * len + 1) bytes).  If <len> is
- * negative, decodes all of <str>. */
-
-EXPORT void str_encode_percent (const char * str, int len, char * out)
-{
-    const char * nul;
-
-    if (len < 0)
-        len = strlen (str);
-    else if ((nul = memchr (str, 0, len)))
-        len = nul - str;
-
-    while (len --)
-    {
-        char c = * str ++;
-
-        if (IS_LEGAL (c))
-            * out ++ = c;
-        else
-        {
-            * out ++ = '%';
-            * out ++ = TO_HEX ((unsigned char) c >> 4);
-            * out ++ = TO_HEX (c & 0xF);
-        }
-    }
-
-    * out = 0;
-}
-
-EXPORT void filename_normalize (char * filename)
-{
-#ifdef _WIN32
-    /* convert slash to backslash on Windows */
-    str_replace_char (filename, '/', '\\');
-#endif
-
-    /* remove trailing slash */
-    int len = strlen (filename);
-#ifdef _WIN32
-    if (len > 3 && filename[len - 1] == '\\') /* leave "C:\" */
-#else
-    if (len > 1 && filename[len - 1] == '/') /* leave leading "/" */
-#endif
-        filename[len - 1] = 0;
-}
-
-EXPORT char * filename_build (const char * path, const char * name)
-{
-    int len = strlen (path);
-
-#ifdef _WIN32
-    if (! len || path[len - 1] == '/' || path[len - 1] == '\\')
-    {
-        SCONCAT2 (filename, path, name);
-        return str_get (filename);
-    }
-
-    SCONCAT3 (filename, path, "\\", name);
-    return str_get (filename);
-#else
-    if (! len || path[len - 1] == '/')
-    {
-        SCONCAT2 (filename, path, name);
-        return str_get (filename);
-    }
-
-    SCONCAT3 (filename, path, "/", name);
-    return str_get (filename);
-#endif
-}
-
-#ifdef _WIN32
-#define URI_PREFIX "file:///"
-#define URI_PREFIX_LEN 8
-#else
-#define URI_PREFIX "file://"
-#define URI_PREFIX_LEN 7
-#endif
-
-/* Like g_filename_to_uri, but converts the filename from the system locale to
- * UTF-8 before percent-encoding (except on Windows, where filenames are assumed
- * to be UTF-8).  On Windows, replaces '\' with '/' and adds a leading '/'. */
-
-EXPORT char * filename_to_uri (const char * name)
-{
-#ifdef _WIN32
-    SCOPY (utf8, name);
-    str_replace_char (utf8, '\\', '/');
-#else
-    char * utf8 = str_from_locale (name, -1);
-    if (! utf8)
-        return NULL;
-#endif
-
-    char enc[URI_PREFIX_LEN + 3 * strlen (utf8) + 1];
-    strcpy (enc, URI_PREFIX);
-    str_encode_percent (utf8, -1, enc + URI_PREFIX_LEN);
-
-#ifndef _WIN32
-    str_unref (utf8);
-#endif
-
-    return str_get (enc);
-}
-
-/* Like g_filename_from_uri, but converts the filename from UTF-8 to the system
- * locale after percent-decoding (except on Windows, where filenames are assumed
- * to be UTF-8).  On Windows, strips the leading '/' and replaces '/' with '\'. */
-
-EXPORT char * uri_to_filename (const char * uri)
-{
-    if (strncmp (uri, URI_PREFIX, URI_PREFIX_LEN))
-        return NULL;
-
-    char buf[strlen (uri + URI_PREFIX_LEN) + 1];
-    str_decode_percent (uri + URI_PREFIX_LEN, -1, buf);
-
-    filename_normalize (buf);
-
-#ifdef _WIN32
-    return str_get (buf);
-#else
-    return str_to_locale (buf, -1);
-#endif
-}
-
-/* Formats a URI for human-readable display.  Percent-decodes and, for file://
- * URI's, converts to filename format, but in UTF-8. */
-
-EXPORT char * uri_to_display (const char * uri)
-{
-    if (! strncmp (uri, "cdda://?", 8))
-        return str_printf (_("Audio CD, track %s"), uri + 8);
-
-    char buf[strlen (uri) + 1];
-
-    if (! strncmp (uri, URI_PREFIX, URI_PREFIX_LEN))
-    {
-        str_decode_percent (uri + URI_PREFIX_LEN, -1, buf);
-#ifdef _WIN32
-        str_replace_char (buf, '/', '\\');
-#endif
-    }
-    else
-        str_decode_percent (uri, -1, buf);
-
-    return str_get (buf);
-}
-
-#undef URI_PREFIX
-#undef URI_PREFIX_LEN
-
-EXPORT void uri_parse (const char * uri, const char * * base_p, const char * * ext_p,
- const char * * sub_p, int * isub_p)
-{
-    const char * end = uri + strlen (uri);
-    const char * base, * ext, * sub, * c;
-    int isub = 0;
-    char junk;
-
-    if ((c = strrchr (uri, '/')))
-        base = c + 1;
-    else
-        base = end;
-
-    if ((c = strrchr (base, '?')) && sscanf (c + 1, "%d%c", & isub, & junk) == 1)
-        sub = c;
-    else
-        sub = end;
-
-    SNCOPY (buf, base, sub - base);
-
-    if ((c = strrchr (buf, '.')))
-        ext = base + (c - buf);
-    else
-        ext = sub;
-
-    if (base_p)
-        * base_p = base;
-    if (ext_p)
-        * ext_p = ext;
-    if (sub_p)
-        * sub_p = sub;
-    if (isub_p)
-        * isub_p = isub;
-}
-
-EXPORT bool_t uri_get_extension (const char * uri, char * buf, int buflen)
-{
-    const char * ext;
-    uri_parse (uri, NULL, & ext, NULL, NULL);
-
-    if (ext[0] != '.')
-        return FALSE;
-
-    strncpy (buf, ext + 1, buflen - 1);
-    buf[buflen - 1] = 0;
-
-    /* remove subtunes and HTTP query strings */
-    char * qmark;
-    if ((qmark = strchr (buf, '?')))
-        * qmark = 0;
-
-    return (buf[0] != 0);
-}
-
-/* Like strcasecmp, but orders numbers correctly (2 before 10). */
-/* Non-ASCII characters are treated exactly as is. */
-/* Handles NULL gracefully. */
-
-EXPORT int str_compare (const char * ap, const char * bp)
-{
-    if (ap == NULL)
-        return (bp == NULL) ? 0 : -1;
-    if (bp == NULL)
-        return 1;
-
-    unsigned char a = * ap ++, b = * bp ++;
-    for (; a || b; a = * ap ++, b = * bp ++)
-    {
-        if (a > '9' || b > '9' || a < '0' || b < '0')
-        {
-            if (a <= 'Z' && a >= 'A')
-                a += 'a' - 'A';
-            if (b <= 'Z' && b >= 'A')
-                b += 'a' - 'A';
-
-            if (a > b)
-                return 1;
-            if (a < b)
-                return -1;
-        }
-        else
-        {
-            int x = a - '0';
-            for (; (a = * ap) <= '9' && a >= '0'; ap ++)
-                x = 10 * x + (a - '0');
-
-            int y = b - '0';
-            for (; (b = * bp) >= '0' && b <= '9'; bp ++)
-                y = 10 * y + (b - '0');
-
-            if (x > y)
-                return 1;
-            if (x < y)
-                return -1;
-        }
-    }
-
-    return 0;
-}
-
-/* Decodes percent-encoded strings, then compares then with str_compare. */
-
-EXPORT int str_compare_encoded (const char * ap, const char * bp)
-{
-    if (ap == NULL)
-        return (bp == NULL) ? 0 : -1;
-    if (bp == NULL)
-        return 1;
-
-    unsigned char a = * ap ++, b = * bp ++;
-    for (; a || b; a = * ap ++, b = * bp ++)
-    {
-        if (a == '%' && ap[0] && ap[1])
-        {
-            a = (FROM_HEX (ap[0]) << 4) | FROM_HEX (ap[1]);
-            ap += 2;
-        }
-        if (b == '%' && bp[0] && bp[1])
-        {
-            b = (FROM_HEX (bp[0]) << 4) | FROM_HEX (bp[1]);
-            bp += 2;
-        }
-
-        if (a > '9' || b > '9' || a < '0' || b < '0')
-        {
-            if (a <= 'Z' && a >= 'A')
-                a += 'a' - 'A';
-            if (b <= 'Z' && b >= 'A')
-                b += 'a' - 'A';
-
-            if (a > b)
-                return 1;
-            if (a < b)
-                return -1;
-        }
-        else
-        {
-            int x = a - '0';
-            for (; (a = * ap) <= '9' && a >= '0'; ap ++)
-                x = 10 * x + (a - '0');
-
-            int y = b - '0';
-            for (; (b = * bp) >= '0' && b <= '9'; bp ++)
-                y = 10 * y + (b - '0');
-
-            if (x > y)
-                return 1;
-            if (x < y)
-                return -1;
-        }
-    }
-
-    return 0;
-}
-
-EXPORT Index * str_list_to_index (const char * list, const char * delims)
-{
-    char dmap[256] = {0};
-
-    for (; * delims; delims ++)
-        dmap[(unsigned char) (* delims)] = 1;
-
-    Index * index = index_new ();
-    const char * word = NULL;
-
-    for (; * list; list ++)
-    {
-        if (dmap[(unsigned char) (* list)])
-        {
-            if (word)
-            {
-                index_insert (index, -1, str_nget (word, list - word));
-                word = NULL;
-            }
-        }
-        else
-        {
-            if (! word)
-            {
-                word = list;
-            }
-        }
-    }
-
-    if (word)
-        index_insert (index, -1, str_get (word));
-
-    return index;
-}
-
-EXPORT char * index_to_str_list (Index * index, const char * sep)
-{
-    int count = index_count (index);
-    int seplen = strlen (sep);
-    int total = count ? seplen * (count - 1) : 0;
-    int lengths[count];
-
-    for (int i = 0; i < count; i ++)
-    {
-        lengths[i] = strlen (index_get (index, i));
-        total += lengths[i];
-    }
-
-    char buf[total + 1];
-    int pos = 0;
-
-    for (int i = 0; i < count; i ++)
-    {
-        if (i)
-        {
-            strcpy (buf + pos, sep);
-            pos += seplen;
-        }
-
-        strcpy (buf + pos, index_get (index, i));
-        pos += lengths[i];
-    }
-
-    buf[pos] = 0;
-
-    return str_get (buf);
-}
-
-/*
- * Routines to convert numbers between string and binary representations.
- *
- * Goals:
- *
- *  - Accuracy, meaning that we can convert back and forth between string and
- *    binary without the number changing slightly each time.
- *  - Consistency, meaning that we get the same results no matter what
- *    architecture or locale we have to deal with.
- *  - Readability, meaning that the number one is rendered "1", not "1.000".
- *
- * Values between -1,000,000,000 and 1,000,000,000 (inclusive) are guaranteed to
- * have an accuracy of 6 decimal places.
- */
-
-EXPORT int str_to_int (const char * string)
-{
-    bool_t neg = (string[0] == '-');
-    if (neg)
-        string ++;
-
-    int val = 0;
-    char c;
-
-    while ((c = * string ++) && c >= '0' && c <= '9')
-        val = val * 10 + (c - '0');
-
-    return neg ? -val : val;
-}
-
-EXPORT double str_to_double (const char * string)
-{
-    bool_t neg = (string[0] == '-');
-    if (neg)
-        string ++;
-
-    double val = str_to_int (string);
-    const char * p = strchr (string, '.');
-
-    if (p)
-    {
-        char buf[7] = "000000";
-        const char * nul = memchr (p + 1, 0, 6);
-        memcpy (buf, p + 1, nul ? nul - (p + 1) : 6);
-        val += (double) str_to_int (buf) / 1000000;
-    }
-
-    return neg ? -val : val;
-}
-
-EXPORT char * int_to_str (int val)
-{
-    char buf[16];
-    str_itoa (val, buf, sizeof buf);
-    return str_get (buf);
-}
-
-EXPORT char * double_to_str (double val)
-{
-    bool_t neg = (val < 0);
-    if (neg)
-        val = -val;
-
-    int i = floor (val);
-    int f = round ((val - i) * 1000000);
-
-    if (f == 1000000)
-    {
-        i ++;
-        f = 0;
-    }
-
-    SPRINTF (buf, "%s%d.%06d", neg ? "-" : "", i, f);
-
-    char * c = buf + strlen (buf);
-    while (* (c - 1) == '0')
-        c --;
-    if (* (c - 1) == '.')
-        c --;
-    * c = 0;
-
-    return str_get (buf);
-}
-
-EXPORT bool_t str_to_int_array (const char * string, int * array, int count)
-{
-    Index * index = str_list_to_index (string, ", ");
-    bool_t okay = (index_count (index) == count);
-
-    if (okay)
-    {
-        for (int i = 0; i < count; i ++)
-            array[i] = str_to_int (index_get (index, i));
-    }
-
-    index_free_full (index, (IndexFreeFunc) str_unref);
-    return okay;
-}
-
-EXPORT char * int_array_to_str (const int * array, int count)
-{
-    Index * index = index_new ();
-
-    for (int i = 0; i < count; i ++)
-    {
-        char * value = int_to_str (array[i]);
-        if (! value)
-            goto ERR;
-
-        index_insert (index, -1, value);
-    }
-
-    char * string = index_to_str_list (index, ",");
-    index_free_full (index, (IndexFreeFunc) str_unref);
-    return string;
-
-ERR:
-    index_free_full (index, (IndexFreeFunc) str_unref);
-    return NULL;
-}
-
-EXPORT bool_t str_to_double_array (const char * string, double * array, int count)
-{
-    Index * index = str_list_to_index (string, ", ");
-    bool_t okay = (index_count (index) == count);
-
-    if (okay)
-    {
-        for (int i = 0; i < count; i ++)
-            array[i] = str_to_double (index_get (index, i));
-    }
-
-    index_free_full (index, (IndexFreeFunc) str_unref);
-    return okay;
-}
-
-EXPORT char * double_array_to_str (const double * array, int count)
-{
-    Index * index = index_new ();
-
-    for (int i = 0; i < count; i ++)
-    {
-        char * value = double_to_str (array[i]);
-        if (! value)
-            goto ERR;
-
-        index_insert (index, -1, value);
-    }
-
-    char * string = index_to_str_list (index, ",");
-    index_free_full (index, (IndexFreeFunc) str_unref);
-    return string;
-
-ERR:
-    index_free_full (index, (IndexFreeFunc) str_unref);
-    return NULL;
-}
diff --git a/src/libaudcore/audstrings.cc b/src/libaudcore/audstrings.cc
new file mode 100644
index 000000000000..04309d41ca61
--- /dev/null
+++ b/src/libaudcore/audstrings.cc
@@ -0,0 +1,974 @@
+/*
+ * audstrings.c
+ * Copyright 2009-2012 John Lindgren and William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "audstrings.h"
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <new>
+
+#include <glib.h>
+
+#include "i18n.h"
+#include "index.h"
+#include "internal.h"
+#include "runtime.h"
+
+static const char ascii_to_hex[256] =
+    "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0"
+    "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0"
+    "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0"
+    "\x0\x1\x2\x3\x4\x5\x6\x7\x8\x9\x0\x0\x0\x0\x0\x0"
+    "\x0\xa\xb\xc\xd\xe\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0"
+    "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0"
+    "\x0\xa\xb\xc\xd\xe\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0"
+    "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0";
+
+static const char hex_to_ascii[16] = {
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
+};
+
+static const char uri_legal_table[256] =
+    "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0"
+    "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0"
+    "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x1\x1"  // '-' '.' '/'
+    "\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x0\x0\x0\x0\x0\x0"  // 0-9
+    "\x0\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1"  // A-O
+    "\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x0\x0\x0\x0\x1"  // P-Z '_'
+    "\x0\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1"  // a-o
+    "\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x0\x0\x0\x1\x0"; // p-z '~'
+
+static const char swap_case[256] =
+    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+    "\0abcdefghijklmnopqrstuvwxyz\0\0\0\0\0"
+    "\0ABCDEFGHIJKLMNOPQRSTUVWXYZ\0\0\0\0\0";
+
+#define FROM_HEX(c)  (ascii_to_hex[(unsigned char) (c)])
+#define TO_HEX(i)    (hex_to_ascii[(i) & 15])
+#define IS_LEGAL(c)  (uri_legal_table[(unsigned char) (c)])
+#define SWAP_CASE(c) (swap_case[(unsigned char) (c)])
+
+/* strcmp() that handles nullptr safely */
+EXPORT int strcmp_safe (const char * a, const char * b, int len)
+{
+    if (! a)
+        return b ? -1 : 0;
+    if (! b)
+        return 1;
+
+    return len < 0 ? strcmp (a, b) : strncmp (a, b, len);
+}
+
+/* ASCII version of strcasecmp, also handles nullptr safely */
+EXPORT int strcmp_nocase (const char * a, const char * b, int len)
+{
+    if (! a)
+        return b ? -1 : 0;
+    if (! b)
+        return 1;
+
+    return len < 0 ? g_ascii_strcasecmp (a, b) : g_ascii_strncasecmp (a, b, len);
+}
+
+/* strlen() if <len> is negative, otherwise strnlen() */
+EXPORT int strlen_bounded (const char * s, int len)
+{
+    if (len < 0)
+        return strlen (s);
+
+    const char * nul = (const char *) memchr (s, 0, len);
+    if (nul)
+        return nul - s;
+
+    return len;
+}
+
+EXPORT StringBuf str_copy (const char * s, int len)
+{
+    if (len < 0)
+        len = strlen (s);
+
+    StringBuf str (len);
+    memcpy (str, s, len);
+    return str;
+}
+
+EXPORT StringBuf str_concat (const std::initializer_list<const char *> & strings)
+{
+    StringBuf str (-1);
+    char * set = str;
+    int left = str.len ();
+
+    for (const char * s : strings)
+    {
+        int len = strlen (s);
+        if (len > left)
+            throw std::bad_alloc ();
+
+        memcpy (set, s, len);
+
+        set += len;
+        left -= len;
+    }
+
+    str.resize (set - str);
+    return str;
+}
+
+EXPORT StringBuf str_printf (const char * format, ...)
+{
+    va_list args;
+    va_start (args, format);
+    StringBuf str = str_vprintf (format, args);
+    va_end (args);
+    return str;
+}
+
+EXPORT StringBuf str_vprintf (const char * format, va_list args)
+{
+    StringBuf str (-1);
+    int len = vsnprintf (str, str.len (), format, args);
+    str.resize (len);
+    return str;
+}
+
+EXPORT bool str_has_prefix_nocase (const char * str, const char * prefix)
+{
+    return ! g_ascii_strncasecmp (str, prefix, strlen (prefix));
+}
+
+EXPORT bool str_has_suffix_nocase (const char * str, const char * suffix)
+{
+    int len1 = strlen (str);
+    int len2 = strlen (suffix);
+
+    if (len2 > len1)
+        return false;
+
+    return ! g_ascii_strcasecmp (str + len1 - len2, suffix);
+}
+
+/* Bernstein's hash function (unrolled version):
+ *    h(0) = 5381
+ *    h(n) = 33 * h(n-1) + c
+ *
+ * This function is more than twice as fast as g_str_hash (a simpler version of
+ * Bernstein's hash) and even slightly faster than Murmur 3. */
+
+EXPORT unsigned str_calc_hash (const char * s)
+{
+    unsigned h = 5381;
+
+    int len = strlen (s);
+
+    while (len >= 8)
+    {
+        h = h * 1954312449 +
+            s[0] * 3963737313 +
+            s[1] * 1291467969 +
+            s[2] * 39135393 +
+            s[3] * 1185921 +
+            s[4] * 35937 +
+            s[5] * 1089 +
+            s[6] * 33 +
+            s[7];
+
+        s += 8;
+        len -= 8;
+    }
+
+    if (len >= 4)
+    {
+        h = h * 1185921 +
+            s[0] * 35937 +
+            s[1] * 1089 +
+            s[2] * 33 +
+            s[3];
+
+        s += 4;
+        len -= 4;
+    }
+
+    switch (len)
+    {
+        case 3: h = h * 33 + (* s ++);
+        case 2: h = h * 33 + (* s ++);
+        case 1: h = h * 33 + (* s ++);
+    }
+
+    return h;
+}
+
+EXPORT const char * strstr_nocase (const char * haystack, const char * needle)
+{
+    while (1)
+    {
+        const char * ap = haystack;
+        const char * bp = needle;
+
+        while (1)
+        {
+            char a = * ap ++;
+            char b = * bp ++;
+
+            if (! b) /* all of needle matched */
+                return (char *) haystack;
+            if (! a) /* end of haystack reached */
+                return nullptr;
+
+            if (a != b && a != SWAP_CASE (b))
+                break;
+        }
+
+        haystack ++;
+    }
+}
+
+EXPORT const char * strstr_nocase_utf8 (const char * haystack, const char * needle)
+{
+    while (1)
+    {
+        const char * ap = haystack;
+        const char * bp = needle;
+
+        while (1)
+        {
+            gunichar a = g_utf8_get_char (ap);
+            gunichar b = g_utf8_get_char (bp);
+
+            if (! b) /* all of needle matched */
+                return (char *) haystack;
+            if (! a) /* end of haystack reached */
+                return nullptr;
+
+            if (a != b && (a < 128 ? (gunichar) SWAP_CASE (a) != b :
+             g_unichar_tolower (a) != g_unichar_tolower (b)))
+                break;
+
+            ap = g_utf8_next_char (ap);
+            bp = g_utf8_next_char (bp);
+        }
+
+        haystack = g_utf8_next_char (haystack);
+    }
+}
+
+EXPORT StringBuf str_tolower (const char * str)
+{
+    StringBuf buf (strlen (str));
+    char * set = buf;
+
+    while (* str)
+        * set ++ = g_ascii_tolower (* str ++);
+
+    return buf;
+}
+
+EXPORT StringBuf str_tolower_utf8 (const char * str)
+{
+    StringBuf buf (6 * strlen (str));
+    char * set = buf;
+    gunichar c;
+
+    while ((c = g_utf8_get_char (str)))
+    {
+        if (c < 128)
+            * set ++ = g_ascii_tolower (c);
+        else
+            set += g_unichar_to_utf8 (g_unichar_tolower (c), set);
+
+        str = g_utf8_next_char (str);
+    }
+
+    buf.resize (set - buf);
+    return buf;
+}
+
+EXPORT void str_replace_char (char * string, char old_c, char new_c)
+{
+    while ((string = strchr (string, old_c)))
+        * string ++ = new_c;
+}
+
+/* Percent-decodes <len> bytes of <str>.  If <len> is negative, decodes all of <str>. */
+
+EXPORT StringBuf str_decode_percent (const char * str, int len)
+{
+    if (len < 0)
+        len = strlen (str);
+
+    StringBuf buf (len);
+    char * out = buf;
+
+    while (1)
+    {
+        const char * p = (const char *) memchr (str, '%', len);
+        if (! p)
+            break;
+
+        int block = p - str;
+        memcpy (out, str, block);
+
+        str += block;
+        out += block;
+        len -= block;
+
+        if (len < 3)
+            break;
+
+        * out ++ = (FROM_HEX (str[1]) << 4) | FROM_HEX (str[2]);
+
+        str += 3;
+        len -= 3;
+    }
+
+    memcpy (out, str, len);
+    buf.resize (out + len - buf);
+    return buf;
+}
+
+/* Percent-encodes <len> bytes of <str>.  If <len> is negative, decodes all of <str>. */
+
+EXPORT StringBuf str_encode_percent (const char * str, int len)
+{
+    if (len < 0)
+        len = strlen (str);
+
+    StringBuf buf (3 * len);
+    char * out = buf;
+
+    while (len --)
+    {
+        char c = * str ++;
+
+        if (IS_LEGAL (c))
+            * out ++ = c;
+        else
+        {
+            * out ++ = '%';
+            * out ++ = TO_HEX ((unsigned char) c >> 4);
+            * out ++ = TO_HEX (c & 0xF);
+        }
+    }
+
+    buf.resize (out - buf);
+    return buf;
+}
+
+EXPORT StringBuf filename_normalize (StringBuf && filename)
+{
+    int len;
+    char * s;
+
+#ifdef _WIN32
+    /* convert slash to backslash on Windows */
+    str_replace_char (filename, '/', '\\');
+#endif
+
+    /* remove current directory (".") elements */
+    while ((len = filename.len ()) >= 2 &&
+     (! strcmp ((s = filename + len - 2), G_DIR_SEPARATOR_S ".") ||
+     (s = strstr (filename, G_DIR_SEPARATOR_S "." G_DIR_SEPARATOR_S))))
+        filename.remove (s + 1 - filename, aud::min (s + 3, filename + len) - (s + 1));
+
+    /* remove parent directory ("..") elements */
+    while ((len = filename.len ()) >= 3 &&
+     (! strcmp ((s = filename + len - 3), G_DIR_SEPARATOR_S "..") ||
+     (s = strstr (filename, G_DIR_SEPARATOR_S ".." G_DIR_SEPARATOR_S))))
+    {
+        * s = 0;
+        char * s2 = strrchr (filename, G_DIR_SEPARATOR);
+        if (! s2)
+            * (s2 = s) = G_DIR_SEPARATOR;
+
+        filename.remove (s2 + 1 - filename, aud::min (s + 4, filename + len) - (s2 + 1));
+    }
+
+    /* remove trailing slash */
+#ifdef _WIN32
+    if ((len = filename.len ()) > 3 && filename[len - 1] == '\\') /* leave "C:\" */
+#else
+    if ((len = filename.len ()) > 1 && filename[len - 1] == '/') /* leave leading "/" */
+#endif
+        filename.resize (len - 1);
+
+    return std::move (filename);
+}
+
+EXPORT StringBuf filename_build (const std::initializer_list<const char *> & elems)
+{
+    StringBuf str (-1);
+    char * set = str;
+    int left = str.len ();
+
+    for (const char * s : elems)
+    {
+#ifdef _WIN32
+        if (set > str && set[-1] != '/' && set[-1] != '\\')
+        {
+            if (! left)
+                throw std::bad_alloc ();
+
+            * set ++ = '\\';
+            left --;
+        }
+#else
+        if (set > str && set[-1] != '/')
+        {
+            if (! left)
+                throw std::bad_alloc ();
+
+            * set ++ = '/';
+            left --;
+        }
+#endif
+
+        int len = strlen (s);
+        if (len > left)
+            throw std::bad_alloc ();
+
+        memcpy (set, s, len);
+
+        set += len;
+        left -= len;
+    }
+
+    str.resize (set - str);
+    return str;
+}
+
+#ifdef _WIN32
+#define URI_PREFIX "file:///"
+#define URI_PREFIX_LEN 8
+#else
+#define URI_PREFIX "file://"
+#define URI_PREFIX_LEN 7
+#endif
+
+/* Like g_filename_to_uri, but converts the filename from the system locale to
+ * UTF-8 before percent-encoding (except on Windows, where filenames are assumed
+ * to be UTF-8).  On Windows, replaces '\' with '/' and adds a leading '/'. */
+
+EXPORT StringBuf filename_to_uri (const char * name)
+{
+#ifdef _WIN32
+    StringBuf buf = str_copy (name);
+    str_replace_char (buf, '\\', '/');
+#else
+    StringBuf buf;
+
+    /* convert from locale if:
+     * 1) system locale is not UTF-8, and
+     * 2) filename is not already valid UTF-8 */
+    if (! g_get_charset (nullptr) && ! g_utf8_validate (name, -1, nullptr))
+        buf.steal (str_from_locale (name));
+
+    if (! buf)
+        buf.steal (str_copy (name));
+#endif
+
+    buf.steal (str_encode_percent (buf));
+    buf.insert (0, URI_PREFIX);
+    return buf;
+}
+
+/* Like g_filename_from_uri, but converts the filename from UTF-8 to the system
+ * locale after percent-decoding (except on Windows, where filenames are assumed
+ * to be UTF-8).  On Windows, strips the leading '/' and replaces '/' with '\'. */
+
+EXPORT StringBuf uri_to_filename (const char * uri, bool use_locale)
+{
+    if (strncmp (uri, URI_PREFIX, URI_PREFIX_LEN))
+        return StringBuf ();
+
+    StringBuf buf = str_decode_percent (uri + URI_PREFIX_LEN);
+
+#ifndef _WIN32
+    /* convert to locale if:
+     * 1) use_locale flag was not set to false, and
+     * 2) system locale is not UTF-8, and
+     * 3) decoded URI is valid UTF-8 */
+    if (use_locale && ! g_get_charset (nullptr) && g_utf8_validate (buf, buf.len (), nullptr))
+    {
+        StringBuf locale = str_to_locale (buf);
+        if (locale)
+            buf.steal (std::move (locale));
+    }
+#endif
+
+    return filename_normalize (std::move (buf));
+}
+
+/* Formats a URI for human-readable display.  Percent-decodes and, for file://
+ * URI's, converts to filename format, but in UTF-8. */
+
+EXPORT StringBuf uri_to_display (const char * uri)
+{
+    if (! strncmp (uri, "cdda://?", 8))
+        return str_printf (_("Audio CD, track %s"), uri + 8);
+
+    StringBuf buf = str_to_utf8 (str_decode_percent (uri));
+    if (! buf)
+        return str_copy (_("(character encoding error)"));
+
+    if (strncmp (buf, URI_PREFIX, URI_PREFIX_LEN))
+        return buf;
+
+    buf.remove (0, URI_PREFIX_LEN);
+    buf.steal (filename_normalize (std::move (buf)));
+
+    const char * home = get_home_utf8 ();
+    int homelen = home ? strlen (home) : 0;
+
+    if (homelen && ! strncmp (buf, home, homelen) && buf[homelen] == G_DIR_SEPARATOR)
+    {
+        buf[0] = '~';
+        buf.remove (1, homelen - 1);
+    }
+
+    return buf;
+}
+
+#undef URI_PREFIX
+#undef URI_PREFIX_LEN
+
+EXPORT void uri_parse (const char * uri, const char * * base_p, const char * * ext_p,
+ const char * * sub_p, int * isub_p)
+{
+    const char * end = uri + strlen (uri);
+    const char * base, * ext, * sub, * c;
+    int isub = 0;
+    char junk;
+
+    if ((c = strrchr (uri, '/')))
+        base = c + 1;
+    else
+        base = end;
+
+    if ((c = strrchr (base, '?')) && sscanf (c + 1, "%d%c", & isub, & junk) == 1)
+        sub = c;
+    else
+        sub = end;
+
+    if ((c = strrchr (base, '.')) && c < sub)
+        ext = c;
+    else
+        ext = sub;
+
+    if (base_p)
+        * base_p = base;
+    if (ext_p)
+        * ext_p = ext;
+    if (sub_p)
+        * sub_p = sub;
+    if (isub_p)
+        * isub_p = isub;
+}
+
+EXPORT StringBuf uri_get_scheme (const char * uri)
+{
+    const char * delim = strstr (uri, "://");
+    return delim ? str_copy (uri, delim - uri) : StringBuf ();
+}
+
+EXPORT StringBuf uri_get_extension (const char * uri)
+{
+    const char * ext;
+    uri_parse (uri, nullptr, & ext, nullptr, nullptr);
+
+    if (ext[0] != '.')
+        return StringBuf ();
+
+    ext ++;  // skip period
+
+    // remove subtunes and HTTP query strings
+    const char * qmark = strchr (ext, '?');
+    return str_copy (ext, qmark ? qmark - ext : -1);
+}
+
+/* Constructs a full URI given:
+ *   1. path: one of the following:
+ *     a. a full URI (returned unchanged)
+ *     b. an absolute filename (in the system locale)
+ *     c. a relative path (character set detected according to user settings)
+ *   2. reference: the full URI of the playlist containing <path> */
+
+EXPORT StringBuf uri_construct (const char * path, const char * reference)
+{
+    /* URI */
+    if (strstr (path, "://"))
+        return str_copy (path);
+
+    /* absolute filename */
+#ifdef _WIN32
+    if (path[0] && path[1] == ':' && path[2] == '\\')
+#else
+    if (path[0] == '/')
+#endif
+        return filename_to_uri (path);
+
+    /* relative path */
+    const char * slash = strrchr (reference, '/');
+    if (! slash)
+        return StringBuf ();
+
+    StringBuf buf = str_to_utf8 (path, -1);
+    if (! buf)
+        return buf;
+
+    if (aud_get_bool (nullptr, "convert_backslash"))
+        str_replace_char (buf, '\\', '/');
+
+    buf.steal (str_encode_percent (buf));
+    buf.insert (0, reference, slash + 1 - reference);
+    return buf;
+}
+
+/* Like strcasecmp, but orders numbers correctly (2 before 10). */
+/* Non-ASCII characters are treated exactly as is. */
+/* Handles nullptr gracefully. */
+
+EXPORT int str_compare (const char * ap, const char * bp)
+{
+    if (! ap)
+        return bp ? -1 : 0;
+    if (! bp)
+        return 1;
+
+    unsigned char a = * ap ++, b = * bp ++;
+    for (; a || b; a = * ap ++, b = * bp ++)
+    {
+        if (a > '9' || b > '9' || a < '0' || b < '0')
+        {
+            if (a <= 'Z' && a >= 'A')
+                a += 'a' - 'A';
+            if (b <= 'Z' && b >= 'A')
+                b += 'a' - 'A';
+
+            if (a > b)
+                return 1;
+            if (a < b)
+                return -1;
+        }
+        else
+        {
+            int x = a - '0';
+            for (; (a = * ap) <= '9' && a >= '0'; ap ++)
+                x = 10 * x + (a - '0');
+
+            int y = b - '0';
+            for (; (b = * bp) >= '0' && b <= '9'; bp ++)
+                y = 10 * y + (b - '0');
+
+            if (x > y)
+                return 1;
+            if (x < y)
+                return -1;
+        }
+    }
+
+    return 0;
+}
+
+/* Decodes percent-encoded strings, then compares then with str_compare. */
+
+EXPORT int str_compare_encoded (const char * ap, const char * bp)
+{
+    if (! ap)
+        return bp ? -1 : 0;
+    if (! bp)
+        return 1;
+
+    unsigned char a = * ap ++, b = * bp ++;
+    for (; a || b; a = * ap ++, b = * bp ++)
+    {
+        if (a == '%' && ap[0] && ap[1])
+        {
+            a = (FROM_HEX (ap[0]) << 4) | FROM_HEX (ap[1]);
+            ap += 2;
+        }
+        if (b == '%' && bp[0] && bp[1])
+        {
+            b = (FROM_HEX (bp[0]) << 4) | FROM_HEX (bp[1]);
+            bp += 2;
+        }
+
+        if (a > '9' || b > '9' || a < '0' || b < '0')
+        {
+            if (a <= 'Z' && a >= 'A')
+                a += 'a' - 'A';
+            if (b <= 'Z' && b >= 'A')
+                b += 'a' - 'A';
+
+            if (a > b)
+                return 1;
+            if (a < b)
+                return -1;
+        }
+        else
+        {
+            int x = a - '0';
+            for (; (a = * ap) <= '9' && a >= '0'; ap ++)
+                x = 10 * x + (a - '0');
+
+            int y = b - '0';
+            for (; (b = * bp) >= '0' && b <= '9'; bp ++)
+                y = 10 * y + (b - '0');
+
+            if (x > y)
+                return 1;
+            if (x < y)
+                return -1;
+        }
+    }
+
+    return 0;
+}
+
+EXPORT Index<String> str_list_to_index (const char * list, const char * delims)
+{
+    char dmap[256] = {0};
+
+    for (; * delims; delims ++)
+        dmap[(unsigned char) (* delims)] = 1;
+
+    Index<String> index;
+    const char * word = nullptr;
+
+    for (; * list; list ++)
+    {
+        if (dmap[(unsigned char) (* list)])
+        {
+            if (word)
+            {
+                index.append (String (str_copy (word, list - word)));
+                word = nullptr;
+            }
+        }
+        else
+        {
+            if (! word)
+            {
+                word = list;
+            }
+        }
+    }
+
+    if (word)
+        index.append (String (word));
+
+    return index;
+}
+
+EXPORT StringBuf index_to_str_list (const Index<String> & index, const char * sep)
+{
+    StringBuf str (-1);
+    char * set = str;
+    int left = str.len ();
+    int seplen = strlen (sep);
+
+    for (const String & s : index)
+    {
+        int len = strlen (s);
+        if (len + seplen > left)
+            throw std::bad_alloc ();
+
+        if (set > str)
+        {
+            memcpy (set, sep, seplen);
+
+            set += seplen;
+            left -= seplen;
+        }
+
+        memcpy (set, s, len);
+
+        set += len;
+        left -= len;
+    }
+
+    str.resize (set - str);
+    return str;
+}
+
+/*
+ * Routines to convert numbers between string and binary representations.
+ *
+ * Goals:
+ *
+ *  - Accuracy, meaning that we can convert back and forth between string and
+ *    binary without the number changing slightly each time.
+ *  - Consistency, meaning that we get the same results no matter what
+ *    architecture or locale we have to deal with.
+ *  - Readability, meaning that the number one is rendered "1", not "1.000".
+ *
+ * Values between -1,000,000,000 and 1,000,000,000 (inclusive) are guaranteed to
+ * have an accuracy of 6 decimal places.
+ */
+
+EXPORT int str_to_int (const char * string)
+{
+    bool neg = (string[0] == '-');
+    if (neg)
+        string ++;
+
+    int val = 0;
+    char c;
+
+    while ((c = * string ++) && c >= '0' && c <= '9')
+        val = val * 10 + (c - '0');
+
+    return neg ? -val : val;
+}
+
+EXPORT double str_to_double (const char * string)
+{
+    bool neg = (string[0] == '-');
+    if (neg)
+        string ++;
+
+    double val = str_to_int (string);
+    const char * p = strchr (string, '.');
+
+    if (p)
+    {
+        char buf[7] = "000000";
+        memcpy (buf, p + 1, strlen_bounded (p + 1, 6));
+        val += (double) str_to_int (buf) / 1000000;
+    }
+
+    return neg ? -val : val;
+}
+
+EXPORT StringBuf int_to_str (int val)
+{
+    bool neg = (val < 0);
+    if (neg)
+        val = -val;
+
+    char buf[16];
+    char * rev = buf + sizeof buf;
+
+    while (rev > buf)
+    {
+        * (-- rev) = '0' + val % 10;
+        if (! (val /= 10))
+            break;
+    }
+
+    if (neg && rev > buf)
+        * (-- rev) = '-';
+
+    int len = buf + sizeof buf - rev;
+    StringBuf buf2 (len);
+    memcpy (buf2, rev, len);
+    return buf2;
+}
+
+EXPORT StringBuf double_to_str (double val)
+{
+    bool neg = (val < 0);
+    if (neg)
+        val = -val;
+
+    int i = floor (val);
+    int f = round ((val - i) * 1000000);
+
+    if (f == 1000000)
+    {
+        i ++;
+        f = 0;
+    }
+
+    StringBuf buf = str_printf ("%s%d.%06d", neg ? "-" : "", i, f);
+
+    char * c = buf + buf.len ();
+    while (c[-1] == '0')
+        c --;
+    if (c[-1] == '.')
+        c --;
+
+    buf.resize (c - buf);
+    return buf;
+}
+
+EXPORT bool str_to_int_array (const char * string, int * array, int count)
+{
+    Index<String> index = str_list_to_index (string, ", ");
+
+    if (index.len () != count)
+        return false;
+
+    for (int i = 0; i < count; i ++)
+        array[i] = str_to_int (index[i]);
+
+    return true;
+}
+
+EXPORT StringBuf int_array_to_str (const int * array, int count)
+{
+    Index<String> index;
+
+    for (int i = 0; i < count; i ++)
+        index.append (String (int_to_str (array[i])));
+
+    return index_to_str_list (index, ",");
+}
+
+EXPORT bool str_to_double_array (const char * string, double * array, int count)
+{
+    Index<String> index = str_list_to_index (string, ", ");
+
+    if (index.len () != count)
+        return false;
+
+    for (int i = 0; i < count; i ++)
+        array[i] = str_to_double (index[i]);
+
+    return true;
+}
+
+EXPORT StringBuf double_array_to_str (const double * array, int count)
+{
+    Index<String> index;
+
+    for (int i = 0; i < count; i ++)
+        index.append (String (double_to_str (array[i])));
+
+    return index_to_str_list (index, ",");
+}
+
+EXPORT StringBuf str_format_time (int64_t milliseconds)
+{
+    int hours = milliseconds / 3600000;
+    int minutes = (milliseconds / 60000) % 60;
+    int seconds = (milliseconds / 1000) % 60;
+
+    if (hours)
+        return str_printf ("%d:%02d:%02d", hours, minutes, seconds);
+    else
+    {
+        bool zero = aud_get_bool (nullptr, "leading_zero");
+        return str_printf (zero ? "%02d:%02d" : "%d:%02d", minutes, seconds);
+    }
+}
diff --git a/src/libaudcore/audstrings.h b/src/libaudcore/audstrings.h
index 9f6cae727477..5da5b4054ad5 100644
--- a/src/libaudcore/audstrings.h
+++ b/src/libaudcore/audstrings.h
@@ -21,107 +21,84 @@
 #define LIBAUDCORE_STRINGS_H
 
 #include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
+#include <stdint.h>
 
-#include <libaudcore/core.h>
+#include <initializer_list>
 
-#define SPRINTF(s, ...) \
- char s[snprintf (NULL, 0, __VA_ARGS__) + 1]; \
- snprintf (s, sizeof s, __VA_ARGS__)
+#include <libaudcore/index.h>
+#include <libaudcore/objects.h>
 
-#define VSPRINTF(s, f, v) \
- va_list v##2; \
- va_copy (v##2, v); \
- char s[vsnprintf (NULL, 0, f, v##2) + 1]; \
- va_end (v##2); \
- vsnprintf (s, sizeof s, f, v)
+int strcmp_safe (const char * a, const char * b, int len = -1);
+int strcmp_nocase (const char * a, const char * b, int len = -1);
+int strlen_bounded (const char * s, int len = -1);
 
-#define SCOPY(s, a) \
- char s[strlen (a) + 1]; \
- strcpy (s, a)
+StringBuf str_copy (const char * s, int len = -1);
+StringBuf str_concat (const std::initializer_list<const char *> & strings);
+StringBuf str_printf (const char * format, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
+StringBuf str_vprintf (const char * format, va_list args);
 
-#define SNCOPY(s, a, x) \
- char s[(x) + 1]; \
- strncpy (s, a, sizeof s - 1); \
- s[sizeof s - 1] = 0
+bool str_has_prefix_nocase (const char * str, const char * prefix);
+bool str_has_suffix_nocase (const char * str, const char * suffix);
 
-#define SCONCAT2(s, a, b) \
- int s##_1 = strlen (a), s##_2 = strlen (b); \
- char s[s##_1 + s##_2 + 1]; \
- memcpy (s, (a), s##_1); \
- strcpy (s + s##_1, (b))
+unsigned str_calc_hash (const char * str);
 
-#define SCONCAT3(s, a, b, c) \
- int s##_1 = strlen (a), s##_2 = strlen (b), s##_3 = strlen (c); \
- char s[s##_1 + s##_2 + s##_3 + 1]; \
- memcpy (s, (a), s##_1); \
- memcpy (s + s##_1, (b), s##_2); \
- strcpy (s + s##_1 + s##_2, (c))
+const char * strstr_nocase (const char * haystack, const char * needle);
+const char * strstr_nocase_utf8 (const char * haystack, const char * needle);
 
-#define SCONCAT4(s, a, b, c, d) \
- int s##_1 = strlen (a), s##_2 = strlen (b), s##_3 = strlen (c), s##_4 = strlen (d); \
- char s[s##_1 + s##_2 + s##_3 + s##_4 + 1]; \
- memcpy (s, (a), s##_1); \
- memcpy (s + s##_1, (b), s##_2); \
- memcpy (s + s##_1 + s##_2, (c), s##_3); \
- strcpy (s + s##_1 + s##_2 + s##_3, (d))
+static inline char * strstr_nocase (char * haystack, const char * needle)
+    { return (char *) strstr_nocase ((const char *) haystack, needle); }
+static inline char * strstr_nocase_utf8 (char * haystack, const char * needle)
+    { return (char *) strstr_nocase_utf8 ((const char *) haystack, needle); }
 
-struct _Index;
-
-/* all (char *) return values must be freed with str_unref() */
-
-char * str_printf (const char * format, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
-char * str_vprintf (const char * format, va_list args);
-
-bool_t str_has_prefix_nocase(const char * str, const char * prefix);
-bool_t str_has_suffix_nocase(const char * str, const char * suffix);
-
-char * strstr_nocase (const char * haystack, const char * needle);
-char * strstr_nocase_utf8 (const char * haystack, const char * needle);
-
-char * str_tolower_utf8 (const char * str);
+StringBuf str_tolower (const char * str);
+StringBuf str_tolower_utf8 (const char * str);
 
 void str_replace_char (char * string, char old_c, char new_c);
 
-void str_itoa (int x, char * buf, int bufsize);
+StringBuf str_decode_percent (const char * str, int len = -1);
+StringBuf str_encode_percent (const char * str, int len = -1);
 
-void str_decode_percent (const char * str, int len, char * out);
-void str_encode_percent (const char * str, int len, char * out);
+StringBuf str_convert (const char * str, int len, const char * from_charset, const char * to_charset);
+StringBuf str_from_locale (const char * str, int len = -1);
+StringBuf str_to_locale (const char * str, int len = -1);
 
-char * str_convert (const char * str, int len, const char * from_charset, const char * to_charset);
-char * str_from_locale (const char * str, int len);
-char * str_to_locale (const char * str, int len);
-char * str_to_utf8 (const char * str, int len);
+/* Requires: aud_init() */
+StringBuf str_to_utf8 (const char * str, int len); // no "len = -1" to avoid ambiguity
+StringBuf str_to_utf8 (StringBuf && str);
 
-/* takes ownership of <fallbacks> and the pooled strings in it */
-void str_set_charsets (const char * region, struct _Index * fallbacks);
+StringBuf filename_normalize (StringBuf && filename);
 
-void filename_normalize (char * filename);
-
-char * filename_build (const char * path, const char * name);
-char * filename_to_uri (const char * filename);
-char * uri_to_filename (const char * uri);
-char * uri_to_display (const char * uri);
+StringBuf filename_build (const std::initializer_list<const char *> & elems);
+StringBuf filename_to_uri (const char * filename);
+StringBuf uri_to_filename (const char * uri, bool use_locale = true);
+StringBuf uri_to_display (const char * uri);
 
 void uri_parse (const char * uri, const char * * base_p, const char * * ext_p,
  const char * * sub_p, int * isub_p);
-bool_t uri_get_extension (const char * uri, char * buf, int buflen);
+
+StringBuf uri_get_scheme (const char * uri);
+StringBuf uri_get_extension (const char * uri);
+
+/* Requires: aud_init() */
+StringBuf uri_construct (const char * path, const char * reference);
 
 int str_compare (const char * a, const char * b);
 int str_compare_encoded (const char * a, const char * b);
 
-struct _Index * str_list_to_index (const char * list, const char * delims);
-char * index_to_str_list (struct _Index * index, const char * sep);
+Index<String> str_list_to_index (const char * list, const char * delims);
+StringBuf index_to_str_list (const Index<String> & index, const char * sep);
 
 int str_to_int (const char * string);
 double str_to_double (const char * string);
-char * int_to_str (int val);
-char * double_to_str (double val);
+StringBuf int_to_str (int val);
+StringBuf double_to_str (double val);
+
+bool str_to_int_array (const char * string, int * array, int count);
+StringBuf int_array_to_str (const int * array, int count);
+bool str_to_double_array (const char * string, double * array, int count);
+StringBuf double_array_to_str (const double * array, int count);
 
-bool_t str_to_int_array (const char * string, int * array, int count);
-char * int_array_to_str (const int * array, int count);
-bool_t str_to_double_array (const char * string, double * array, int count);
-char * double_array_to_str (const double * array, int count);
+/* Requires: aud_init() */
+StringBuf str_format_time (int64_t milliseconds);
 
 #endif /* LIBAUDCORE_STRINGS_H */
diff --git a/src/libaudcore/charset.c b/src/libaudcore/charset.c
deleted file mode 100644
index 231b756b29c0..000000000000
--- a/src/libaudcore/charset.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * charset.c
- * Copyright 2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <iconv.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <glib.h>
-
-#ifdef USE_CHARDET
-#include <libguess/libguess.h>
-#endif
-
-#include "audstrings.h"
-#include "index.h"
-#include "tinylock.h"
-
-EXPORT char * str_convert (const char * str, int len, const char * from_charset,
- const char * to_charset)
-{
-    iconv_t conv = iconv_open (to_charset, from_charset);
-    if (conv == (iconv_t) -1)
-        return NULL;
-
-    if (len < 0)
-        len = strlen (str);
-
-    // liberal estimate of how much space we will need
-    // are there obscure cases that require even more?
-    int maxlen = 4 * len;
-
-    char buf[maxlen + 1];
-    char * result = NULL;
-
-    size_t inbytes = len;
-    size_t outbytes = maxlen;
-    ICONV_CONST char * in = (ICONV_CONST char *) str;
-    char * out = buf;
-
-    if (iconv (conv, & in, & inbytes, & out, & outbytes) != (size_t) -1 && ! inbytes)
-    {
-        buf[maxlen - outbytes] = 0;
-        result = str_get (buf);
-    }
-
-    iconv_close (conv);
-    return result;
-}
-
-static void whine_locale (const char * str, int len, const char * dir, const char * charset)
-{
-    if (len < 0)
-        fprintf (stderr, "Cannot convert %s locale (%s): %s\n", dir, charset, str);
-    else
-        fprintf (stderr, "Cannot convert %s locale (%s): %.*s\n", dir, charset, len, str);
-}
-
-EXPORT char * str_from_locale (const char * str, int len)
-{
-    const char * charset;
-
-    if (g_get_charset (& charset))
-    {
-        /* locale is UTF-8 */
-        if (! g_utf8_validate (str, len, NULL))
-        {
-            whine_locale (str, len, "from", "UTF-8");
-            return NULL;
-        }
-
-        return (len < 0) ? str_get (str) : str_nget (str, len);
-    }
-    else
-    {
-        char * utf8 = str_convert (str, len, charset, "UTF-8");
-        if (! utf8)
-            whine_locale (str, len, "from", charset);
-
-        return utf8;
-    }
-}
-
-EXPORT char * str_to_locale (const char * str, int len)
-{
-    const char * charset;
-
-    if (g_get_charset (& charset))
-    {
-        /* locale is UTF-8 */
-        return (len < 0) ? str_get (str) : str_nget (str, len);
-    }
-    else
-    {
-        char * local = str_convert (str, len, "UTF-8", charset);
-        if (! local)
-            whine_locale (str, len, "to", charset);
-
-        return local;
-    }
-}
-
-static TinyRWLock settings_lock;
-static char * detect_region;
-static Index * fallback_charsets;
-
-EXPORT void str_set_charsets (const char * region, Index * fallbacks)
-{
-    tiny_lock_write (& settings_lock);
-
-    str_unref (detect_region);
-    detect_region = str_get (region);
-
-#ifdef USE_CHARDET
-    if (detect_region)
-        libguess_init ();
-#endif
-
-    if (fallback_charsets)
-        index_free_full (fallback_charsets, (IndexFreeFunc) str_unref);
-
-    fallback_charsets = fallbacks;
-
-    tiny_unlock_write (& settings_lock);
-}
-
-EXPORT char * str_to_utf8 (const char * str, int len)
-{
-    /* check whether already UTF-8 */
-    if (g_utf8_validate (str, len, NULL))
-        return (len < 0) ? str_get (str) : str_nget (str, len);
-
-    if (len < 0)
-        len = strlen (str);
-
-    char * utf8 = NULL;
-    tiny_lock_read (& settings_lock);
-
-#ifdef USE_CHARDET
-    if (detect_region)
-    {
-        /* prefer libguess-detected charset */
-        const char * detected = libguess_determine_encoding (str, len, detect_region);
-        if (detected && (utf8 = str_convert (str, len, detected, "UTF-8")))
-            goto DONE;
-    }
-#endif
-
-    if (fallback_charsets)
-    {
-        /* try user-configured fallbacks */
-        for (int i = 0; i < index_count (fallback_charsets); i ++)
-        {
-            if ((utf8 = str_convert (str, len, index_get (fallback_charsets, i), "UTF-8")))
-                goto DONE;
-        }
-    }
-
-    /* try system locale last (this one will print a warning if it fails) */
-    utf8 = str_from_locale (str, len);
-
-DONE:
-    tiny_unlock_read (& settings_lock);
-    return utf8;
-}
diff --git a/src/libaudcore/charset.cc b/src/libaudcore/charset.cc
new file mode 100644
index 000000000000..af2671a34bdd
--- /dev/null
+++ b/src/libaudcore/charset.cc
@@ -0,0 +1,226 @@
+/*
+ * charset.c
+ * Copyright 2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "audstrings.h"
+#include "internal.h"
+
+#include <errno.h>
+#include <iconv.h>
+#include <string.h>
+
+#include <new>
+
+#include <glib.h>
+
+#ifdef USE_CHARDET
+extern "C" {
+#include <libguess/libguess.h>
+}
+#endif
+
+#include "hook.h"
+#include "index.h"
+#include "runtime.h"
+#include "tinylock.h"
+
+EXPORT StringBuf str_convert (const char * str, int len, const char * from_charset,
+ const char * to_charset)
+{
+    iconv_t conv = iconv_open (to_charset, from_charset);
+    if (conv == (iconv_t) -1)
+        return StringBuf ();
+
+    if (len < 0)
+        len = strlen (str);
+
+    StringBuf buf (-1);
+
+    size_t inbytesleft = len;
+    size_t outbytesleft = buf.len ();
+    ICONV_CONST char * in = (ICONV_CONST char *) str;
+    char * out = buf;
+
+    errno = 0;
+    size_t ret = iconv (conv, & in, & inbytesleft, & out, & outbytesleft);
+
+    if (ret == (size_t) -1 && errno == E2BIG)
+        throw std::bad_alloc ();
+
+    iconv_close (conv);
+
+    if (ret == (size_t) -1 || inbytesleft)
+        return StringBuf ();
+
+    buf.resize (buf.len () - outbytesleft);
+    return buf;
+}
+
+static void whine_locale (const char * str, int len, const char * dir, const char * charset)
+{
+    if (len < 0)
+        AUDWARN ("Cannot convert %s locale (%s): %s\n", dir, charset, str);
+    else
+        AUDWARN ("Cannot convert %s locale (%s): %.*s\n", dir, charset, len, str);
+}
+
+EXPORT StringBuf str_from_locale (const char * str, int len)
+{
+    const char * charset;
+
+    if (g_get_charset (& charset))
+    {
+        /* locale is UTF-8 */
+        if (! g_utf8_validate (str, len, nullptr))
+        {
+            whine_locale (str, len, "from", "UTF-8");
+            return StringBuf ();
+        }
+
+        return str_copy (str, len);
+    }
+    else
+    {
+        StringBuf utf8 = str_convert (str, len, charset, "UTF-8");
+        if (! utf8)
+            whine_locale (str, len, "from", charset);
+
+        return utf8;
+    }
+}
+
+EXPORT StringBuf str_to_locale (const char * str, int len)
+{
+    const char * charset;
+
+    if (g_get_charset (& charset))
+    {
+        /* locale is UTF-8 */
+        return str_copy (str, len);
+    }
+    else
+    {
+        StringBuf local = str_convert (str, len, "UTF-8", charset);
+        if (! local)
+            whine_locale (str, len, "to", charset);
+
+        return local;
+    }
+}
+
+static TinyRWLock settings_lock;
+static String detect_region;
+static Index<String> fallback_charsets;
+
+static void set_charsets (const char * region, const char * fallbacks)
+{
+    tiny_lock_write (& settings_lock);
+
+    detect_region = String (region);
+
+#ifdef USE_CHARDET
+    if (detect_region)
+        libguess_init ();
+#endif
+
+    if (fallbacks)
+        fallback_charsets = str_list_to_index (fallbacks, ", ");
+    else
+        fallback_charsets.clear ();
+
+    tiny_unlock_write (& settings_lock);
+}
+
+static StringBuf convert_to_utf8_locked (const char * str, int len)
+{
+    if (len < 0)
+        len = strlen (str);
+
+#ifdef USE_CHARDET
+    if (detect_region)
+    {
+        /* prefer libguess-detected charset */
+        const char * detected = libguess_determine_encoding (str, len, detect_region);
+        if (detected)
+        {
+            StringBuf utf8 = str_convert (str, len, detected, "UTF-8");
+            if (utf8)
+                return utf8;
+        }
+    }
+#endif
+
+    /* try user-configured fallbacks */
+    for (const String & fallback : fallback_charsets)
+    {
+        StringBuf utf8 = str_convert (str, len, fallback, "UTF-8");
+        if (utf8)
+            return utf8;
+    }
+
+    /* try system locale last (this one will print a warning if it fails) */
+    return str_from_locale (str, len);
+}
+
+EXPORT StringBuf str_to_utf8 (const char * str, int len)
+{
+    /* check whether already UTF-8 */
+    if (g_utf8_validate (str, len, nullptr))
+        return str_copy (str, len);
+
+    tiny_lock_read (& settings_lock);
+    StringBuf utf8 = convert_to_utf8_locked (str, len);
+    tiny_unlock_read (& settings_lock);
+    return utf8;
+}
+
+EXPORT StringBuf str_to_utf8 (StringBuf && str)
+{
+    /* check whether already UTF-8 */
+    if (g_utf8_validate (str, str.len (), nullptr))
+        return std::move (str);
+
+    tiny_lock_read (& settings_lock);
+    str.steal (convert_to_utf8_locked (str, str.len ()));
+    tiny_unlock_read (& settings_lock);
+    return std::move (str);
+}
+
+static void chardet_update (void)
+{
+    String region = aud_get_str (nullptr, "chardet_detector");
+    String fallbacks = aud_get_str (nullptr, "chardet_fallback");
+
+    set_charsets (region[0] ? (const char *) region : nullptr, fallbacks);
+}
+
+void chardet_init (void)
+{
+    chardet_update ();
+
+    hook_associate ("set chardet_detector", (HookFunction) chardet_update, nullptr);
+    hook_associate ("set chardet_fallback", (HookFunction) chardet_update, nullptr);
+}
+
+void chardet_cleanup (void)
+{
+    hook_dissociate ("set chardet_detector", (HookFunction) chardet_update);
+    hook_dissociate ("set chardet_fallback", (HookFunction) chardet_update);
+
+    set_charsets (nullptr, nullptr);
+}
diff --git a/src/libaudcore/config.cc b/src/libaudcore/config.cc
new file mode 100644
index 000000000000..de69e3c855c8
--- /dev/null
+++ b/src/libaudcore/config.cc
@@ -0,0 +1,397 @@
+/*
+ * config.c
+ * Copyright 2011-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "runtime.h"
+#include "internal.h"
+
+#include <assert.h>
+#include <string.h>
+
+#include "audstrings.h"
+#include "hook.h"
+#include "inifile.h"
+#include "multihash.h"
+#include "runtime.h"
+#include "vfs.h"
+
+#define DEFAULT_SECTION "audacious"
+
+static const char * const core_defaults[] = {
+
+ /* general */
+ "advance_on_delete", "FALSE",
+ "always_resume_paused", "TRUE",
+ "clear_playlist", "TRUE",
+ "open_to_temporary", "TRUE",
+ "resume_playback_on_startup", "TRUE",
+ "show_interface", "TRUE",
+
+ /* equalizer */
+ "eqpreset_default_file", "",
+ "eqpreset_extension", "",
+ "equalizer_active", "FALSE",
+ "equalizer_autoload", "FALSE",
+ "equalizer_bands", "0,0,0,0,0,0,0,0,0,0",
+ "equalizer_preamp", "0",
+
+ /* info popup / info window */
+ "cover_name_exclude", "back",
+ "cover_name_include", "album,cover,front,folder",
+ "filepopup_delay", "5",
+ "filepopup_showprogressbar", "FALSE",
+ "recurse_for_cover", "FALSE",
+ "recurse_for_cover_depth", "0",
+ "show_filepopup_for_tuple", "TRUE",
+ "use_file_cover", "FALSE",
+
+ /* network */
+ "net_buffer_kb", "128",
+ "use_proxy", "FALSE",
+ "use_proxy_auth", "FALSE",
+
+ /* output */
+ "default_gain", "0",
+ "enable_replay_gain", "TRUE",
+ "enable_clipping_prevention", "TRUE",
+ "output_bit_depth", "16",
+ "output_buffer_size", "500",
+ "replay_gain_album", "FALSE",
+ "replay_gain_preamp", "0",
+ "soft_clipping", "FALSE",
+ "software_volume_control", "FALSE",
+ "sw_volume_left", "100",
+ "sw_volume_right", "100",
+
+ /* playback */
+ "no_playlist_advance", "FALSE",
+ "repeat", "FALSE",
+ "shuffle", "FALSE",
+ "stop_after_current_song", "FALSE",
+
+ /* playlist */
+ "chardet_fallback", "ISO-8859-1",
+#ifdef _WIN32
+ "convert_backslash", "TRUE",
+#else
+ "convert_backslash", "FALSE",
+#endif
+ "generic_title_format", "${?artist:${artist} - }${?album:${album} - }${title}",
+ "leading_zero", "FALSE",
+ "metadata_on_play", "FALSE",
+ "show_numbers_in_pl", "FALSE",
+ "slow_probe", "FALSE",
+
+ nullptr};
+
+enum OpType {
+    OP_IS_DEFAULT,
+    OP_GET,
+    OP_SET,
+    OP_SET_NO_FLAG,
+    OP_CLEAR,
+    OP_CLEAR_NO_FLAG
+};
+
+struct ConfigItem {
+    String section;
+    String key;
+    String value;
+};
+
+struct ConfigNode {
+    MultiHash::Node node;
+    ConfigItem item;
+};
+
+struct ConfigOp {
+    OpType type;
+    const char * section;
+    const char * key;
+    String value;
+    unsigned hash;
+    bool result;
+};
+
+struct SaveState {
+    Index<ConfigItem> list;
+};
+
+static int item_compare (const ConfigItem & a, const ConfigItem & b, void *)
+{
+    if (a.section == b.section)
+        return strcmp (a.key, b.key);
+    else
+        return strcmp (a.section, b.section);
+}
+
+static bool config_node_match (const MultiHash::Node * node0, const void * data)
+{
+    const ConfigNode * node = (const ConfigNode *) node0;
+    const ConfigOp * op = (const ConfigOp *) data;
+
+    return ! strcmp (node->item.section, op->section) && ! strcmp (node->item.key, op->key);
+}
+
+static MultiHash defaults (config_node_match);
+static MultiHash config (config_node_match);
+
+static volatile bool modified;
+
+static MultiHash::Node * add_cb (const void * data, void * state)
+{
+    ConfigOp * op = (ConfigOp *) state;
+
+    switch (op->type)
+    {
+    case OP_IS_DEFAULT:
+        op->result = ! op->value[0]; /* empty string is default */
+        return nullptr;
+
+    case OP_SET:
+        op->result = true;
+        modified = true;
+
+    case OP_SET_NO_FLAG:
+    {
+        ConfigNode * node = new ConfigNode;
+        node->item.section = String (op->section);
+        node->item.key = String (op->key);
+        node->item.value = op->value;
+        return (MultiHash::Node *) node;
+    }
+
+    default:
+        return nullptr;
+    }
+}
+
+static bool action_cb (MultiHash::Node * node0, void * state)
+{
+    ConfigNode * node = (ConfigNode *) node0;
+    ConfigOp * op = (ConfigOp *) state;
+
+    switch (op->type)
+    {
+    case OP_IS_DEFAULT:
+        op->result = ! strcmp (node->item.value, op->value);
+        return false;
+
+    case OP_GET:
+        op->value = node->item.value;
+        return false;
+
+    case OP_SET:
+        op->result = !! strcmp (node->item.value, op->value);
+        if (op->result)
+            modified = true;
+
+    case OP_SET_NO_FLAG:
+        node->item.value = op->value;
+        return false;
+
+    case OP_CLEAR:
+        op->result = true;
+        modified = true;
+
+    case OP_CLEAR_NO_FLAG:
+        delete node;
+        return true;
+
+    default:
+        return false;
+    }
+}
+
+static bool config_op_run (ConfigOp * op, MultiHash * table)
+{
+    if (! op->hash)
+        op->hash = str_calc_hash (op->section) + str_calc_hash (op->key);
+
+    op->result = false;
+    table->lookup (op, op->hash, add_cb, action_cb, op);
+    return op->result;
+}
+
+class ConfigParser : public IniParser
+{
+private:
+    String section;
+
+    void handle_heading (const char * heading)
+        { section = String (heading); }
+
+    void handle_entry (const char * key, const char * value)
+    {
+        if (! section)
+            return;
+
+        ConfigOp op = {OP_SET_NO_FLAG, section, key, String (value)};
+        config_op_run (& op, & config);
+    }
+};
+
+void config_load (void)
+{
+    StringBuf path = filename_to_uri (aud_get_path (AudPath::UserDir));
+    path.insert (-1, "/config");
+
+    if (VFSFile::test_file (path, VFS_EXISTS))
+    {
+        VFSFile file (path, "r");
+        if (file)
+            ConfigParser ().parse (file);
+    }
+
+    aud_config_set_defaults (nullptr, core_defaults);
+}
+
+static bool add_to_save_list (MultiHash::Node * node0, void * state0)
+{
+    ConfigNode * node = (ConfigNode *) node0;
+    SaveState * state = (SaveState *) state0;
+
+    state->list.append (node->item);
+
+    modified = false;
+
+    return false;
+}
+
+void config_save (void)
+{
+    if (! modified)
+        return;
+
+    SaveState state = SaveState ();
+
+    config.iterate (add_to_save_list, & state);
+    state.list.sort (item_compare, nullptr);
+
+    StringBuf path = filename_to_uri (aud_get_path (AudPath::UserDir));
+    path.insert (-1, "/config");
+
+    String current_heading;
+
+    VFSFile file (path, "w");
+    if (! file)
+        goto FAILED;
+
+    for (const ConfigItem & item : state.list)
+    {
+        if (item.section != current_heading)
+        {
+            if (! inifile_write_heading (file, item.section))
+                goto FAILED;
+
+            current_heading = item.section;
+        }
+
+        if (! inifile_write_entry (file, item.key, item.value))
+            goto FAILED;
+    }
+
+    if (file.fflush () < 0)
+        goto FAILED;
+
+    return;
+
+FAILED:
+    AUDWARN ("Error saving configuration.\n");
+}
+
+EXPORT void aud_config_set_defaults (const char * section, const char * const * entries)
+{
+    if (! section)
+        section = DEFAULT_SECTION;
+
+    while (1)
+    {
+        const char * name = * entries ++;
+        const char * value = * entries ++;
+        if (! name || ! value)
+            break;
+
+        ConfigOp op = {OP_SET_NO_FLAG, section, name, String (value)};
+        config_op_run (& op, & defaults);
+    }
+}
+
+void config_cleanup (void)
+{
+    ConfigOp op = {OP_CLEAR_NO_FLAG};
+    config.iterate (action_cb, & op);
+    defaults.iterate (action_cb, & op);
+}
+
+EXPORT void aud_set_str (const char * section, const char * name, const char * value)
+{
+    assert (name && value);
+
+    ConfigOp op = {OP_IS_DEFAULT, section ? section : DEFAULT_SECTION, name, String (value)};
+    bool is_default = config_op_run (& op, & defaults);
+
+    op.type = is_default ? OP_CLEAR : OP_SET;
+    bool changed = config_op_run (& op, & config);
+
+    if (changed && ! section)
+        event_queue (str_concat ({"set ", name}), nullptr);
+}
+
+EXPORT String aud_get_str (const char * section, const char * name)
+{
+    assert (name);
+
+    ConfigOp op = {OP_GET, section ? section : DEFAULT_SECTION, name};
+    config_op_run (& op, & config);
+
+    if (! op.value)
+        config_op_run (& op, & defaults);
+
+    return op.value ? op.value : String ("");
+}
+
+EXPORT void aud_set_bool (const char * section, const char * name, bool value)
+{
+    aud_set_str (section, name, value ? "TRUE" : "FALSE");
+}
+
+EXPORT bool aud_get_bool (const char * section, const char * name)
+{
+    return ! strcmp (aud_get_str (section, name), "TRUE");
+}
+
+EXPORT void aud_set_int (const char * section, const char * name, int value)
+{
+    aud_set_str (section, name, int_to_str (value));
+}
+
+EXPORT int aud_get_int (const char * section, const char * name)
+{
+    return str_to_int (aud_get_str (section, name));
+}
+
+EXPORT void aud_set_double (const char * section, const char * name, double value)
+{
+    aud_set_str (section, name, double_to_str (value));
+}
+
+EXPORT double aud_get_double (const char * section, const char * name)
+{
+    return str_to_double (aud_get_str (section, name));
+}
diff --git a/src/libaudcore/core.h b/src/libaudcore/core.h
deleted file mode 100644
index f3c261589a81..000000000000
--- a/src/libaudcore/core.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * core.h
- * Copyright 2011-2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef LIBAUDCORE_CORE_H
-#define LIBAUDCORE_CORE_H
-
-#undef NULL
-#ifdef __cplusplus /* *sigh* */
-#define NULL 0
-#else
-#define NULL ((void *) 0)
-#endif
-
-/* "bool_t" means "int" for compatibility with GLib */
-#undef bool_t
-#define bool_t int
-
-#undef FALSE
-#define FALSE ((bool_t) 0)
-#undef TRUE
-#define TRUE ((bool_t) 1)
-
-#undef MIN
-#define MIN(a,b) ((a) < (b) ? (a) : (b))
-#undef MAX
-#define MAX(a,b) ((a) > (b) ? (a) : (b))
-#undef CLAMP
-#define CLAMP(a,min,max) ((a) < (min) ? (min) : (a) > (max) ? (max) : (a))
-
-#define ARRAY_LEN(a) (sizeof (a) / sizeof (a)[0])
-
-/* If the pool contains a copy of <str>, increments its reference count.
- * Otherwise, adds a copy of <str> to the pool with a reference count of one.
- * In either case, returns the copy.  Because this copy may be shared by other
- * parts of the code, it should not be modified.  If <str> is NULL, simply
- * returns NULL with no side effects. */
-char * str_get (const char * str);
-
-/* Increments the reference count of <str>, where <str> is the address of a
- * string already in the pool.  Faster than calling str_get() a second time.
- * Returns <str> for convenience.  If <str> is NULL, simply returns NULL with no
- * side effects. */
-char * str_ref (const char * str);
-
-/* Decrements the reference count of <str>, where <str> is the address of a
- * string in the pool.  If the reference count drops to zero, releases the
- * memory used by <str>.   If <str> is NULL, simply returns NULL with no side
- * effects. */
-void str_unref (char * str);
-
-/* Returns the cached hash value of a pooled string (or 0 for NULL). */
-unsigned str_hash (const char * str);
-
-/* Checks whether two pooled strings are equal.  Since the pool never contains
- * duplicate strings, this is a simple pointer comparison and thus much faster
- * than strcmp().  NULL is considered equal to NULL but not equal to any string. */
-bool_t str_equal (const char * str1, const char * str2);
-
-/* Calls str_get() on the first <len> characters of <str>.  If <str> has less
- * than or equal to <len> characters, equivalent to str_get(). */
-char * str_nget (const char * str, int len);
-
-/* Releases all memory used by the string pool.  If strings remain in the pool,
- * a warning may be printed to stderr in order to reveal memory leaks. */
-void strpool_shutdown (void);
-
-#endif /* LIBAUDCORE_CORE_H */
diff --git a/src/libaudcore/drct.cc b/src/libaudcore/drct.cc
new file mode 100644
index 000000000000..712119265d21
--- /dev/null
+++ b/src/libaudcore/drct.cc
@@ -0,0 +1,195 @@
+/*
+ * drct.c
+ * Copyright 2009-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "drct.h"
+
+#include "i18n.h"
+#include "internal.h"
+#include "playlist-internal.h"
+#include "runtime.h"
+#include "tuple.h"
+
+/* --- PLAYBACK CONTROL --- */
+
+EXPORT void aud_drct_play ()
+{
+    if (aud_drct_get_playing ())
+    {
+        if (aud_drct_get_paused ())
+            aud_drct_pause ();
+        else
+        {
+            int a, b;
+            aud_drct_get_ab_repeat (a, b);
+            aud_drct_seek (aud::max (a, 0));
+        }
+    }
+    else
+    {
+        int playlist = aud_playlist_get_active ();
+        aud_playlist_set_position (playlist, aud_playlist_get_position (playlist));
+        aud_playlist_play (playlist);
+    }
+}
+
+EXPORT void aud_drct_play_pause ()
+{
+    if (aud_drct_get_playing ())
+        aud_drct_pause ();
+    else
+        aud_drct_play ();
+}
+
+EXPORT void aud_drct_stop ()
+{
+    aud_playlist_play (-1);
+}
+
+EXPORT int aud_drct_get_position ()
+{
+    int playlist = aud_playlist_get_playing ();
+    return aud_playlist_get_position (playlist);
+}
+
+EXPORT String aud_drct_get_filename ()
+{
+    int playlist = aud_playlist_get_playing ();
+    int position = aud_playlist_get_position (playlist);
+    return aud_playlist_entry_get_filename (playlist, position);
+}
+
+/* --- VOLUME CONTROL --- */
+
+EXPORT int aud_drct_get_volume_main ()
+{
+    StereoVolume volume = aud_drct_get_volume ();
+    return aud::max (volume.left, volume.right);
+}
+
+EXPORT void aud_drct_set_volume_main (int volume)
+{
+    StereoVolume old = aud_drct_get_volume ();
+    int main = aud::max (old.left, old.right);
+
+    if (main > 0)
+        aud_drct_set_volume ({
+            aud::rescale (old.left, main, volume),
+            aud::rescale (old.right, main, volume)
+        });
+    else
+        aud_drct_set_volume ({volume, volume});
+}
+
+EXPORT int aud_drct_get_volume_balance ()
+{
+    StereoVolume volume = aud_drct_get_volume ();
+
+    if (volume.left == volume.right)
+        return 0;
+    else if (volume.left > volume.right)
+        return -100 + aud::rescale (volume.right, volume.left, 100);
+    else
+        return 100 - aud::rescale (volume.left, volume.right, 100);
+}
+
+EXPORT void aud_drct_set_volume_balance (int balance)
+{
+    int main = aud_drct_get_volume_main ();
+
+    if (balance < 0)
+        aud_drct_set_volume ({main, aud::rescale (main, 100, 100 + balance)});
+    else
+        aud_drct_set_volume ({aud::rescale (main, 100, 100 - balance), main});
+}
+
+/* --- PLAYLIST CONTROL --- */
+
+EXPORT void aud_drct_pl_next ()
+{
+    int playlist = aud_playlist_get_playing ();
+    if (playlist < 0)
+        playlist = aud_playlist_get_active ();
+
+    playlist_next_song (playlist, aud_get_bool (nullptr, "repeat"));
+}
+
+EXPORT void aud_drct_pl_prev ()
+{
+    int playlist = aud_playlist_get_playing ();
+    if (playlist < 0)
+        playlist = aud_playlist_get_active ();
+
+    playlist_prev_song (playlist);
+}
+
+static void add_list (Index<PlaylistAddItem> && items, int at, bool to_temp, bool play)
+{
+    if (to_temp)
+        aud_playlist_set_active (aud_playlist_get_temporary ());
+
+    int playlist = aud_playlist_get_active ();
+
+    /* queue the new entries before deleting the old ones */
+    /* this is to avoid triggering the --quit-after-play condition */
+    aud_playlist_entry_insert_batch (playlist, at, std::move (items), play);
+
+    if (play)
+    {
+        if (aud_get_bool (nullptr, "clear_playlist"))
+            aud_playlist_entry_delete (playlist, 0, aud_playlist_entry_count (playlist));
+        else
+            aud_playlist_queue_delete (playlist, 0, aud_playlist_queue_count (playlist));
+    }
+}
+
+EXPORT void aud_drct_pl_add (const char * filename, int at)
+{
+    Index<PlaylistAddItem> items;
+    items.append (String (filename));
+    add_list (std::move (items), at, false, false);
+}
+
+EXPORT void aud_drct_pl_add_list (Index<PlaylistAddItem> && items, int at)
+{
+    add_list (std::move (items), at, false, false);
+}
+
+EXPORT void aud_drct_pl_open (const char * filename)
+{
+    Index<PlaylistAddItem> items;
+    items.append (String (filename));
+    add_list (std::move (items), -1, aud_get_bool (nullptr, "open_to_temporary"), true);
+}
+
+EXPORT void aud_drct_pl_open_list (Index<PlaylistAddItem> && items)
+{
+    add_list (std::move (items), -1, aud_get_bool (nullptr, "open_to_temporary"), true);
+}
+
+EXPORT void aud_drct_pl_open_temp (const char * filename)
+{
+    Index<PlaylistAddItem> items;
+    items.append (String (filename));
+    add_list (std::move (items), -1, true, true);
+}
+
+EXPORT void aud_drct_pl_open_temp_list (Index<PlaylistAddItem> && items)
+{
+    add_list (std::move (items), -1, true, true);
+}
diff --git a/src/libaudcore/drct.h b/src/libaudcore/drct.h
new file mode 100644
index 000000000000..45d2667cf24e
--- /dev/null
+++ b/src/libaudcore/drct.h
@@ -0,0 +1,89 @@
+/*
+ * drct.h
+ * Copyright 2010-2012 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_DRCT_H
+#define LIBAUDCORE_DRCT_H
+
+#include <libaudcore/audio.h>
+#include <libaudcore/index.h>
+#include <libaudcore/tuple.h>
+
+/* CAUTION: These functions are not thread safe. */
+
+/* --- PLAYBACK CONTROL --- */
+
+void aud_drct_play ();
+void aud_drct_play_pause ();
+void aud_drct_pause ();
+void aud_drct_stop ();
+bool aud_drct_get_playing ();
+bool aud_drct_get_ready ();
+bool aud_drct_get_paused ();
+
+// returns entry number of playing song (zero-based)
+int aud_drct_get_position ();
+
+// returns filename of playing song
+String aud_drct_get_filename ();
+
+// returns formatted title of playing song
+// connect to the "title change" hook to be notified of changes
+String aud_drct_get_title ();
+
+// returns metadata of playing song
+// connect to the "tuple change" hook to be notified of changes
+Tuple aud_drct_get_tuple ();
+
+// returns some statistics of playing song
+// connect to the "info change" hook to be notified of changes
+void aud_drct_get_info (int & bitrate, int & samplerate, int & channels);
+
+int aud_drct_get_time ();
+int aud_drct_get_length ();
+void aud_drct_seek (int time);
+
+/* "A-B repeat": when playback reaches point B, it returns to point A (where A
+ * and B are in milliseconds).  The value -1 is interpreted as the beginning of
+ * the song (for A) or the end of the song (for B).  A-B repeat is disabled
+ * entirely by setting both A and B to -1. */
+void aud_drct_set_ab_repeat (int a, int b);
+void aud_drct_get_ab_repeat (int & a, int & b);
+
+/* --- VOLUME CONTROL --- */
+
+StereoVolume aud_drct_get_volume ();
+void aud_drct_set_volume (StereoVolume volume);
+int aud_drct_get_volume_main ();
+void aud_drct_set_volume_main (int volume);
+int aud_drct_get_volume_balance ();
+void aud_drct_set_volume_balance (int balance);
+
+/* --- PLAYLIST CONTROL --- */
+
+void aud_drct_pl_next ();
+void aud_drct_pl_prev ();
+
+void aud_drct_pl_add (const char * filename, int at);
+void aud_drct_pl_add_list (Index<PlaylistAddItem> && items, int at);
+void aud_drct_pl_open (const char * filename);
+void aud_drct_pl_open_list (Index<PlaylistAddItem> && items);
+void aud_drct_pl_open_temp (const char * filename);
+void aud_drct_pl_open_temp_list (Index<PlaylistAddItem> && items);
+
+#endif
diff --git a/src/libaudcore/effect.cc b/src/libaudcore/effect.cc
new file mode 100644
index 000000000000..b0538d0a8ec6
--- /dev/null
+++ b/src/libaudcore/effect.cc
@@ -0,0 +1,268 @@
+/*
+ * effect.c
+ * Copyright 2010-2012 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "internal.h"
+
+#include <pthread.h>
+
+#include "drct.h"
+#include "list.h"
+#include "plugin.h"
+#include "plugins.h"
+#include "runtime.h"
+
+struct Effect : public ListNode
+{
+    PluginHandle * plugin;
+    int position;
+    EffectPlugin * header;
+    int channels_returned, rate_returned;
+    bool remove_flag;
+};
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static List<Effect> effects;
+static int input_channels, input_rate;
+
+void effect_start (int & channels, int & rate)
+{
+    pthread_mutex_lock (& mutex);
+
+    AUDDBG ("Starting effects.\n");
+
+    effects.clear ();
+
+    input_channels = channels;
+    input_rate = rate;
+
+    auto & list = aud_plugin_list (PluginType::Effect);
+
+    for (int i = 0; i < list.len (); i ++)
+    {
+        PluginHandle * plugin = list[i];
+        if (! aud_plugin_get_enabled (plugin))
+            continue;
+
+        AUDINFO ("Starting %s at %d channels, %d Hz.\n",
+         aud_plugin_get_name (plugin), channels, rate);
+
+        EffectPlugin * header = (EffectPlugin *) aud_plugin_get_header (plugin);
+        if (! header)
+            continue;
+
+        header->start (channels, rate);
+
+        Effect * effect = new Effect ();
+        effect->plugin = plugin;
+        effect->position = i;
+        effect->header = header;
+        effect->channels_returned = channels;
+        effect->rate_returned = rate;
+
+        effects.append (effect);
+    }
+
+    pthread_mutex_unlock (& mutex);
+}
+
+Index<float> & effect_process (Index<float> & data)
+{
+    Index<float> * cur = & data;
+    pthread_mutex_lock (& mutex);
+
+    Effect * e = effects.head ();
+    while (e)
+    {
+        Effect * next = effects.next (e);
+
+        if (e->remove_flag)
+        {
+            cur = & e->header->finish (* cur, false);
+
+            // simulate end-of-playlist call
+            // first save the current data
+            Index<float> save = std::move (* cur);
+            cur = & e->header->finish (* cur, true);
+
+            // combine the saved and new data
+            save.move_from (* cur, 0, -1, -1, true, true);
+            * cur = std::move (save);
+
+            effects.remove (e);
+            delete e;
+        }
+        else
+            cur = & e->header->process (* cur);
+
+        e = next;
+    }
+
+    pthread_mutex_unlock (& mutex);
+    return * cur;
+}
+
+bool effect_flush (bool force)
+{
+    bool flushed = true;
+    pthread_mutex_lock (& mutex);
+
+    for (Effect * e = effects.head (); e; e = effects.next (e))
+    {
+        if (! e->header->flush (force) && ! force)
+        {
+            flushed = false;
+            break;
+        }
+    }
+
+    pthread_mutex_unlock (& mutex);
+    return flushed;
+}
+
+Index<float> & effect_finish (Index<float> & data, bool end_of_playlist)
+{
+    Index<float> * cur = & data;
+    pthread_mutex_lock (& mutex);
+
+    for (Effect * e = effects.head (); e; e = effects.next (e))
+        cur = & e->header->finish (* cur, end_of_playlist);
+
+    pthread_mutex_unlock (& mutex);
+    return * cur;
+}
+
+int effect_adjust_delay (int delay)
+{
+    pthread_mutex_lock (& mutex);
+
+    for (Effect * e = effects.tail (); e; e = effects.prev (e))
+        delay = e->header->adjust_delay (delay);
+
+    pthread_mutex_unlock (& mutex);
+    return delay;
+}
+
+static void effect_insert (PluginHandle * plugin, EffectPlugin * header)
+{
+    int position = aud_plugin_list (PluginType::Effect).find (plugin);
+
+    Effect * prev = nullptr;
+
+    for (Effect * e = effects.head (); e; e = effects.next (e))
+    {
+        if (e->plugin == plugin)
+        {
+            e->remove_flag = false;
+            return;
+        }
+
+        if (e->position > position)
+            break;
+
+        prev = e;
+    }
+
+    AUDDBG ("Adding %s without reset.\n", aud_plugin_get_name (plugin));
+
+    int channels, rate;
+    if (prev)
+    {
+        AUDDBG ("Adding %s after %s.\n", aud_plugin_get_name (plugin),
+         aud_plugin_get_name (prev->plugin));
+        channels = prev->channels_returned;
+        rate = prev->rate_returned;
+    }
+    else
+    {
+        AUDDBG ("Adding %s as first effect.\n", aud_plugin_get_name (plugin));
+        channels = input_channels;
+        rate = input_rate;
+    }
+
+    AUDINFO ("Starting %s at %d channels, %d Hz.\n", aud_plugin_get_name (plugin), channels, rate);
+    header->start (channels, rate);
+
+    Effect * effect = new Effect ();
+    effect->plugin = plugin;
+    effect->position = position;
+    effect->header = header;
+    effect->channels_returned = channels;
+    effect->rate_returned = rate;
+
+    effects.insert_after (prev, effect);
+}
+
+static void effect_remove (PluginHandle * plugin)
+{
+    for (Effect * e = effects.head (); e; e = effects.next (e))
+    {
+        if (e->plugin == plugin)
+        {
+            AUDDBG ("Removing %s without reset.\n", aud_plugin_get_name (plugin));
+            e->remove_flag = true;
+            return;
+        }
+    }
+}
+
+static void effect_enable (PluginHandle * plugin, EffectPlugin * ep, bool enable)
+{
+    if (ep->preserves_format)
+    {
+        pthread_mutex_lock (& mutex);
+
+        if (enable)
+            effect_insert (plugin, ep);
+        else
+            effect_remove (plugin);
+
+        pthread_mutex_unlock (& mutex);
+    }
+    else
+    {
+        AUDDBG ("Reset to add/remove %s.\n", aud_plugin_get_name (plugin));
+        aud_output_reset (OutputReset::EffectsOnly);
+    }
+}
+
+bool effect_plugin_start (PluginHandle * plugin)
+{
+    if (aud_drct_get_playing ())
+    {
+        EffectPlugin * ep = (EffectPlugin *) aud_plugin_get_header (plugin);
+        if (! ep)
+            return false;
+
+        effect_enable (plugin, ep, true);
+    }
+
+    return true;
+}
+
+void effect_plugin_stop (PluginHandle * plugin)
+{
+    if (aud_drct_get_playing ())
+    {
+        EffectPlugin * ep = (EffectPlugin *) aud_plugin_get_header (plugin);
+        if (! ep)
+            return;
+
+        effect_enable (plugin, ep, false);
+    }
+}
diff --git a/src/libaudcore/equalizer-preset.cc b/src/libaudcore/equalizer-preset.cc
new file mode 100644
index 000000000000..699d0fb738b6
--- /dev/null
+++ b/src/libaudcore/equalizer-preset.cc
@@ -0,0 +1,202 @@
+/*
+ * equalizer_preset.c
+ * Copyright 2003-2013 Eugene Zagidullin, William Pitcock, John Lindgren, and
+ *                     Thomas Lange
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "equalizer.h"
+
+#include <math.h>
+#include <string.h>
+
+#include <glib.h>  /* for GKeyFile */
+
+#include "audstrings.h"
+#include "runtime.h"
+#include "vfs.h"
+
+EXPORT Index<EqualizerPreset> aud_eq_read_presets (const char * basename)
+{
+    Index<EqualizerPreset> list;
+
+    GKeyFile * rcfile = g_key_file_new ();
+    StringBuf filename = filename_build ({aud_get_path (AudPath::UserDir), basename});
+
+    if (! g_key_file_load_from_file (rcfile, filename, G_KEY_FILE_NONE, nullptr))
+    {
+        StringBuf filename2 = filename_build ({aud_get_path (AudPath::DataDir), basename});
+
+        if (! g_key_file_load_from_file (rcfile, filename2, G_KEY_FILE_NONE, nullptr))
+        {
+            g_key_file_free (rcfile);
+            return list;
+        }
+    }
+
+    for (int p = 0;; p ++)
+    {
+        char * name = g_key_file_get_string (rcfile, "Presets", str_printf ("Preset%d", p), nullptr);
+        if (! name)
+            break;
+
+        EqualizerPreset & preset = list.append (String (name));
+        preset.preamp = g_key_file_get_double (rcfile, name, "Preamp", nullptr);
+
+        for (int i = 0; i < AUD_EQ_NBANDS; i++)
+            preset.bands[i] = g_key_file_get_double (rcfile, name, str_printf ("Band%d", i), nullptr);
+
+        g_free (name);
+    }
+
+    g_key_file_free (rcfile);
+
+    return list;
+}
+
+EXPORT bool aud_eq_write_presets (const Index<EqualizerPreset> & list, const char * basename)
+{
+    GKeyFile * rcfile = g_key_file_new ();
+
+    for (int p = 0; p < list.len (); p ++)
+    {
+        const EqualizerPreset & preset = list[p];
+
+        g_key_file_set_string (rcfile, "Presets", str_printf ("Preset%d", p), preset.name);
+        g_key_file_set_double (rcfile, preset.name, "Preamp", preset.preamp);
+
+        for (int i = 0; i < AUD_EQ_NBANDS; i ++)
+            g_key_file_set_double (rcfile, preset.name, str_printf ("Band%d", i), preset.bands[i]);
+    }
+
+    size_t len;
+    char * data = g_key_file_to_data (rcfile, & len, nullptr);
+
+    StringBuf filename = filename_build ({aud_get_path (AudPath::UserDir), basename});
+    bool success = g_file_set_contents (filename, data, len, nullptr);
+
+    g_key_file_free (rcfile);
+    g_free (data);
+
+    return success;
+}
+
+/* Note: Winamp 2.x had a +/- 20 dB range.
+ *       Winamp 5.x had a +/- 12 dB range, which we use here. */
+#define FROM_WINAMP_VAL(x)  ((31.5 - (x)) * (12.0 / 31.5))
+#define TO_WINAMP_VAL(x)  (round (31.5 - (x) * (31.5 / 12.0)))
+
+EXPORT Index<EqualizerPreset> aud_import_winamp_presets (VFSFile & file)
+{
+    char header[31];
+    char bands[11];
+    char preset_name[181];
+
+    Index<EqualizerPreset> list;
+
+    if (file.fread (header, 1, sizeof header) != sizeof header ||
+     strncmp (header, "Winamp EQ library file v1.1", 27))
+        return list;
+
+    while (file.fread (preset_name, 1, 180) == 180)
+    {
+        preset_name[180] = 0; /* protect against buffer overflow */
+
+        if (file.fseek (77, VFS_SEEK_CUR)) /* unknown crap --asphyx */
+            break;
+
+        if (file.fread (bands, 1, 11) != 11)
+            break;
+
+        EqualizerPreset & preset = list.append (String (preset_name));
+        preset.preamp = FROM_WINAMP_VAL (bands[10]);
+
+        for (int i = 0; i < AUD_EQ_NBANDS; i ++)
+            preset.bands[i] = FROM_WINAMP_VAL (bands[i]);
+    }
+
+    return list;
+}
+
+EXPORT bool aud_export_winamp_preset (const EqualizerPreset & preset, VFSFile & file)
+{
+    char name[257];
+    char bands[11];
+
+    if (file.fwrite ("Winamp EQ library file v1.1\x1a!--", 1, 31) != 31)
+        return false;
+
+    strncpy (name, preset.name, 257);
+
+    if (file.fwrite (name, 1, 257) != 257)
+        return false;
+
+    for (int i = 0; i < AUD_EQ_NBANDS; i ++)
+        bands[i] = TO_WINAMP_VAL (preset.bands[i]);
+
+    bands[10] = TO_WINAMP_VAL (preset.preamp);
+
+    if (file.fwrite (bands, 1, 11) != 11)
+        return false;
+
+    return true;
+}
+
+EXPORT bool aud_save_preset_file (const EqualizerPreset & preset, VFSFile & file)
+{
+    GKeyFile * rcfile = g_key_file_new ();
+
+    g_key_file_set_double (rcfile, "Equalizer preset", "Preamp", preset.preamp);
+
+    for (int i = 0; i < AUD_EQ_NBANDS; i ++)
+        g_key_file_set_double (rcfile, "Equalizer preset",
+         str_printf ("Band%d", i), preset.bands[i]);
+
+    size_t len;
+    char * data = g_key_file_to_data (rcfile, & len, nullptr);
+
+    bool success = (file.fwrite (data, 1, len) == (int64_t) len);
+
+    g_key_file_free (rcfile);
+    g_free (data);
+
+    return success;
+}
+
+EXPORT bool aud_load_preset_file (EqualizerPreset & preset, VFSFile & file)
+{
+    GKeyFile * rcfile = g_key_file_new ();
+
+    Index<char> data = file.read_all ();
+
+    if (! data.len () || ! g_key_file_load_from_data (rcfile, data.begin (),
+     data.len (), G_KEY_FILE_NONE, nullptr))
+    {
+        g_key_file_free (rcfile);
+        return false;
+    }
+
+    preset.name = String ("");
+    preset.preamp = g_key_file_get_double (rcfile, "Equalizer preset", "Preamp", nullptr);
+
+    for (int i = 0; i < AUD_EQ_NBANDS; i ++)
+        preset.bands[i] = g_key_file_get_double (rcfile, "Equalizer preset",
+         str_printf ("Band%d", i), nullptr);
+
+    g_key_file_free (rcfile);
+
+    return true;
+}
diff --git a/src/libaudcore/equalizer.cc b/src/libaudcore/equalizer.cc
new file mode 100644
index 000000000000..b1aeea984ade
--- /dev/null
+++ b/src/libaudcore/equalizer.cc
@@ -0,0 +1,212 @@
+/*
+ * equalizer.c
+ * Copyright 2001 Anders Johansson
+ * Copyright 2010-2011 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+/*
+ * Anders Johansson prefers float *ptr; formatting. Please keep it that way.
+ *    - tallica
+ */
+
+#include "equalizer.h"
+#include "internal.h"
+
+#include <assert.h>
+#include <math.h>
+#include <pthread.h>
+#include <string.h>
+
+#include "audio.h"
+#include "audstrings.h"
+#include "hook.h"
+#include "runtime.h"
+
+/* Q value for band-pass filters 1.2247 = (3/2)^(1/2)
+ * Gives 4 dB suppression at Fc*2 and Fc/2 */
+#define Q 1.2247449
+
+/* Center frequencies for band-pass filters (Hz) */
+/* These are not the historical WinAmp frequencies, because the IIR filters used
+ * here are designed for each frequency to be twice the previous.  Using WinAmp
+ * frequencies leads to too much gain in some bands and too little in others. */
+static const float CF[AUD_EQ_NBANDS] = {31.25, 62.5, 125, 250, 500, 1000, 2000,
+ 4000, 8000, 16000};
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static bool active;
+static int channels, rate;
+static float a[AUD_EQ_NBANDS][2]; /* A weights */
+static float b[AUD_EQ_NBANDS][2]; /* B weights */
+static float wqv[AUD_MAX_CHANNELS][AUD_EQ_NBANDS][2]; /* Circular buffer for W data */
+static float gv[AUD_MAX_CHANNELS][AUD_EQ_NBANDS]; /* Gain factor for each channel and band */
+static int K; /* Number of used EQ bands */
+
+/* 2nd order band-pass filter design */
+static void bp2 (float *a, float *b, float fc, float q)
+{
+    float th = 2 * M_PI * fc;
+    float C = (1 - tanf (th * q / 2)) / (1 + tanf (th * q / 2));
+
+    a[0] = (1 + C) * cosf (th);
+    a[1] = -C;
+    b[0] = (1 - C) / 2;
+    b[1] = -1.005;
+}
+
+void eq_set_format (int new_channels, int new_rate)
+{
+    pthread_mutex_lock (& mutex);
+
+    channels = new_channels;
+    rate = new_rate;
+
+    /* Calculate number of active filters */
+    K = AUD_EQ_NBANDS;
+
+    while (CF[K - 1] > (float) rate / 2.2)
+        K --;
+
+    /* Generate filter taps */
+    for (int k = 0; k < K; k ++)
+        bp2 (a[k], b[k], CF[k] / (float) rate, Q);
+
+    /* Reset state */
+    memset (wqv[0][0], 0, sizeof wqv);
+
+    pthread_mutex_unlock (& mutex);
+}
+
+static void eq_set_bands_real (double preamp, double *values)
+{
+    float adj[AUD_EQ_NBANDS];
+
+    for (int i = 0; i < AUD_EQ_NBANDS; i ++)
+        adj[i] = preamp + values[i];
+
+    for (int c = 0; c < AUD_MAX_CHANNELS; c ++)
+    {
+        for (int i = 0; i < AUD_EQ_NBANDS; i ++)
+            gv[c][i] = pow (10, adj[i] / 20) - 1;
+    }
+}
+
+void eq_filter (float *data, int samples)
+{
+    int channel;
+
+    pthread_mutex_lock (& mutex);
+
+    if (! active)
+    {
+        pthread_mutex_unlock (& mutex);
+        return;
+    }
+
+    for (channel = 0; channel < channels; channel ++)
+    {
+        float *g = gv[channel]; /* Gain factor */
+        float *end = data + samples;
+        float *f;
+
+        for (f = data + channel; f < end; f += channels)
+        {
+            int k; /* Frequency band index */
+            float yt = *f; /* Current input sample */
+
+            for (k = 0; k < K; k ++)
+            {
+                /* Pointer to circular buffer wq */
+                float *wq = wqv[channel][k];
+                /* Calculate output from AR part of current filter */
+                float w = yt * b[k][0] + wq[0] * a[k][0] + wq[1] * a[k][1];
+
+                /* Calculate output from MA part of current filter */
+                yt += (w + wq[1] * b[k][1]) * g[k];
+
+                /* Update circular buffer */
+                wq[1] = wq[0];
+                wq[0] = w;
+            }
+
+            /* Calculate output */
+            *f = yt;
+        }
+    }
+
+    pthread_mutex_unlock (& mutex);
+}
+
+static void eq_update (void *data, void *user)
+{
+    pthread_mutex_lock (& mutex);
+
+    active = aud_get_bool (nullptr, "equalizer_active");
+
+    double values[AUD_EQ_NBANDS];
+    aud_eq_get_bands (values);
+    eq_set_bands_real (aud_get_double (nullptr, "equalizer_preamp"), values);
+
+    pthread_mutex_unlock (& mutex);
+}
+
+void eq_init (void)
+{
+    eq_update (nullptr, nullptr);
+    hook_associate ("set equalizer_active", eq_update, nullptr);
+    hook_associate ("set equalizer_preamp", eq_update, nullptr);
+    hook_associate ("set equalizer_bands", eq_update, nullptr);
+}
+
+void eq_cleanup (void)
+{
+    hook_dissociate ("set equalizer_active", eq_update);
+    hook_dissociate ("set equalizer_preamp", eq_update);
+    hook_dissociate ("set equalizer_bands", eq_update);
+}
+
+EXPORT void aud_eq_set_bands (const double values[AUD_EQ_NBANDS])
+{
+    StringBuf string = double_array_to_str (values, AUD_EQ_NBANDS);
+    aud_set_str (nullptr, "equalizer_bands", string);
+}
+
+EXPORT void aud_eq_get_bands (double values[AUD_EQ_NBANDS])
+{
+    memset (values, 0, sizeof (double) * AUD_EQ_NBANDS);
+    String string = aud_get_str (nullptr, "equalizer_bands");
+    str_to_double_array (string, values, AUD_EQ_NBANDS);
+}
+
+EXPORT void aud_eq_set_band (int band, double value)
+{
+    assert (band >= 0 && band < AUD_EQ_NBANDS);
+
+    double values[AUD_EQ_NBANDS];
+    aud_eq_get_bands (values);
+    values[band] = value;
+    aud_eq_set_bands (values);
+}
+
+EXPORT double aud_eq_get_band (int band)
+{
+    assert (band >= 0 && band < AUD_EQ_NBANDS);
+
+    double values[AUD_EQ_NBANDS];
+    aud_eq_get_bands (values);
+    return values[band];
+}
diff --git a/src/libaudcore/equalizer.h b/src/libaudcore/equalizer.h
new file mode 100644
index 000000000000..30b28c6d821c
--- /dev/null
+++ b/src/libaudcore/equalizer.h
@@ -0,0 +1,51 @@
+/*
+ * equalizer.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_EQUALIZER_H
+#define LIBAUDCORE_EQUALIZER_H
+
+#include <libaudcore/index.h>
+#include <libaudcore/objects.h>
+
+class VFSFile;
+
+#define AUD_EQ_NBANDS 10
+#define AUD_EQ_MAX_GAIN 12
+
+struct EqualizerPreset {
+    String name;
+    float preamp;
+    float bands[AUD_EQ_NBANDS];
+};
+
+void aud_eq_set_bands (const double values[AUD_EQ_NBANDS]);
+void aud_eq_get_bands (double values[AUD_EQ_NBANDS]);
+void aud_eq_set_band (int band, double value);
+double aud_eq_get_band (int band);
+
+Index<EqualizerPreset> aud_eq_read_presets (const char * basename);
+bool aud_eq_write_presets (const Index<EqualizerPreset> & list, const char * basename);
+
+bool aud_load_preset_file (EqualizerPreset & preset, VFSFile & file);
+bool aud_save_preset_file (const EqualizerPreset & preset, VFSFile & file);
+
+Index<EqualizerPreset> aud_import_winamp_presets (VFSFile & file);
+bool aud_export_winamp_preset (const EqualizerPreset & preset, VFSFile & file);
+
+#endif /* LIBAUDCORE_EQUALIZER_H */
diff --git a/src/libaudcore/eventqueue.c b/src/libaudcore/eventqueue.c
deleted file mode 100644
index ee92c03fd38b..000000000000
--- a/src/libaudcore/eventqueue.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * eventqueue.c
- * Copyright 2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <pthread.h>
-#include <string.h>
-
-#include "core.h"
-#include "hook.h"
-
-typedef struct {
-    char * name;
-    void * data;
-    void (* destroy) (void *);
-    int source;
-} Event;
-
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-static GList * events;
-
-static bool_t event_execute (Event * event)
-{
-    pthread_mutex_lock (& mutex);
-
-    g_source_remove (event->source);
-    events = g_list_remove (events, event);
-
-    pthread_mutex_unlock (& mutex);
-
-    hook_call (event->name, event->data);
-
-    str_unref (event->name);
-    if (event->destroy)
-        event->destroy (event->data);
-
-    g_slice_free (Event, event);
-    return FALSE;
-}
-
-EXPORT void event_queue_full (int time, const char * name, void * data, void (* destroy) (void *))
-{
-    Event * event = g_slice_new (Event);
-    event->name = str_get (name);
-    event->data = data;
-    event->destroy = destroy;
-
-    pthread_mutex_lock (& mutex);
-
-    event->source = g_timeout_add (time, (GSourceFunc) event_execute, event);
-    events = g_list_prepend (events, event);
-
-    pthread_mutex_unlock (& mutex);
-}
-
-EXPORT void event_queue_cancel (const char * name, void * data)
-{
-    pthread_mutex_lock (& mutex);
-
-    GList * node = events;
-    while (node)
-    {
-        Event * event = node->data;
-        GList * next = node->next;
-
-        if (! strcmp (event->name, name) && (! data || event->data == data))
-        {
-            g_source_remove (event->source);
-            events = g_list_delete_link (events, node);
-
-            str_unref (event->name);
-            if (event->destroy)
-                event->destroy (event->data);
-
-            g_slice_free (Event, event);
-        }
-
-        node = next;
-    }
-
-    pthread_mutex_unlock (& mutex);
-}
-
-EXPORT void event_queue_cancel_all (void)
-{
-    pthread_mutex_lock (& mutex);
-
-    GList * node = events;
-    while (node)
-    {
-        Event * event = node->data;
-        GList * next = node->next;
-
-        g_source_remove (event->source);
-        events = g_list_delete_link (events, node);
-
-        str_unref (event->name);
-        if (event->destroy)
-            event->destroy (event->data);
-
-        g_slice_free (Event, event);
-
-        node = next;
-    }
-
-    pthread_mutex_unlock (& mutex);
-}
diff --git a/src/libaudcore/eventqueue.cc b/src/libaudcore/eventqueue.cc
new file mode 100644
index 000000000000..c65a4390e382
--- /dev/null
+++ b/src/libaudcore/eventqueue.cc
@@ -0,0 +1,110 @@
+/*
+ * eventqueue.cc
+ * Copyright 2011-2014 John Lindgren, Michał Lipski
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "hook.h"
+
+#include <pthread.h>
+#include <string.h>
+
+#include "internal.h"
+#include "list.h"
+#include "mainloop.h"
+#include "objects.h"
+
+struct Event : public ListNode
+{
+    String name;
+    void * data;
+    void (* destroy) (void *);
+
+    Event (const char * name, void * data, EventDestroyFunc destroy) :
+        name (name),
+        data (data),
+        destroy (destroy) {}
+
+    ~Event ()
+    {
+        if (destroy)
+            destroy (data);
+    }
+};
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static List<Event> events;
+static QueuedFunc queued_events;
+
+static void events_execute (void *)
+{
+    pthread_mutex_lock (& mutex);
+
+    Event * event;
+    while ((event = events.head ()))
+    {
+        events.remove (event);
+
+        pthread_mutex_unlock (& mutex);
+
+        hook_call (event->name, event->data);
+        delete event;
+
+        pthread_mutex_lock (& mutex);
+    }
+
+    pthread_mutex_unlock (& mutex);
+}
+
+EXPORT void event_queue (const char * name, void * data, EventDestroyFunc destroy)
+{
+    pthread_mutex_lock (& mutex);
+
+    if (! events.head ())
+        queued_events.queue (events_execute, nullptr);
+
+    events.append (new Event (name, data, destroy));
+
+    pthread_mutex_unlock (& mutex);
+}
+
+EXPORT void event_queue_cancel (const char * name, void * data)
+{
+    pthread_mutex_lock (& mutex);
+
+    Event * event = events.head ();
+    while (event)
+    {
+        Event * next = events.next (event);
+
+        if (! strcmp (event->name, name) && (! data || event->data == data))
+        {
+            events.remove (event);
+            delete event;
+        }
+
+        event = next;
+    }
+
+    pthread_mutex_unlock (& mutex);
+}
+
+void event_queue_cancel_all ()
+{
+    pthread_mutex_lock (& mutex);
+    events.clear ();
+    pthread_mutex_unlock (& mutex);
+}
diff --git a/src/libaudcore/fft.cc b/src/libaudcore/fft.cc
new file mode 100644
index 000000000000..071e23d6eb57
--- /dev/null
+++ b/src/libaudcore/fft.cc
@@ -0,0 +1,120 @@
+/*
+ * fft.c
+ * Copyright 2011 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "internal.h"
+
+#include <complex>
+#include <math.h>
+
+#define N 512                         /* size of the DFT */
+#define LOGN 9                        /* log N (base 2) */
+
+typedef std::complex<float> Complex;
+
+static float hamming[N];              /* hamming window, scaled to sum to 1 */
+static int reversed[N];               /* bit-reversal table */
+static Complex roots[N / 2];    /* N-th roots of unity */
+static char generated = 0;            /* set if tables have been generated */
+
+/* Reverse the order of the lowest LOGN bits in an integer. */
+
+static int bit_reverse (int x)
+{
+    int y = 0;
+
+    for (int n = LOGN; n --; )
+    {
+        y = (y << 1) | (x & 1);
+        x >>= 1;
+    }
+
+    return y;
+}
+
+/* Generate lookup tables. */
+
+static void generate_tables (void)
+{
+    if (generated)
+        return;
+
+    for (int n = 0; n < N; n ++)
+        hamming[n] = 1 - 0.85 * cosf (2 * M_PI * n / N);
+    for (int n = 0; n < N; n ++)
+        reversed[n] = bit_reverse (n);
+    for (int n = 0; n < N / 2; n ++)
+        roots[n] = exp (Complex (0, 2 * M_PI * n / N));
+
+    generated = 1;
+}
+
+/* Perform the DFT using the Cooley-Tukey algorithm.  At each step s, where
+ * s=1..log N (base 2), there are N/(2^s) groups of intertwined butterfly
+ * operations.  Each group contains (2^s)/2 butterflies, and each butterfly has
+ * a span of (2^s)/2.  The twiddle factors are nth roots of unity where n = 2^s. */
+
+static void do_fft (Complex a[N])
+{
+    int half = 1;       /* (2^s)/2 */
+    int inv = N / 2;    /* N/(2^s) */
+
+    /* loop through steps */
+    while (inv)
+    {
+        /* loop through groups */
+        for (int g = 0; g < N; g += half << 1)
+        {
+            /* loop through butterflies */
+            for (int b = 0, r = 0; b < half; b ++, r += inv)
+            {
+                Complex even = a[g + b];
+                Complex odd = roots[r] * a[g + half + b];
+                a[g + b] = even + odd;
+                a[g + half + b] = even - odd;
+            }
+        }
+
+        half <<= 1;
+        inv >>= 1;
+    }
+}
+
+/* Input is N=512 PCM samples.
+ * Output is intensity of frequencies from 1 to N/2=256. */
+
+void calc_freq (const float data[N], float freq[N / 2])
+{
+    generate_tables ();
+
+    /* input is filtered by a Hamming window */
+    /* input values are in bit-reversed order */
+    Complex a[N];
+    for (int n = 0; n < N; n ++)
+        a[reversed[n]] = data[n] * hamming[n];
+
+    do_fft (a);
+
+    /* output values are divided by N */
+    /* frequencies from 1 to N/2-1 are doubled */
+    for (int n = 0; n < N / 2 - 1; n ++)
+        freq[n] = 2 * abs (a[1 + n]) / N;
+
+    /* frequency N/2 is not doubled */
+    freq[N / 2 - 1] = abs (a[N / 2]) / N;
+}
diff --git a/src/libaudcore/history.cc b/src/libaudcore/history.cc
new file mode 100644
index 000000000000..4dab9162b381
--- /dev/null
+++ b/src/libaudcore/history.cc
@@ -0,0 +1,49 @@
+/*
+ * history.c
+ * Copyright 2011 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "audstrings.h"
+#include "runtime.h"
+
+#include <string.h>
+
+#define MAX_ENTRIES 30
+
+EXPORT String aud_history_get (int entry)
+{
+    StringBuf name = str_printf ("entry%d", entry);
+    String path = aud_get_str ("history", name);
+    return (path[0] ? path : String ());
+}
+
+EXPORT void aud_history_add (const char * path)
+{
+    String add = String (path);
+
+    for (int i = 0; i < MAX_ENTRIES; i ++)
+    {
+        StringBuf name = str_printf ("entry%d", i);
+        String old = aud_get_str ("history", name);
+        aud_set_str ("history", name, add);
+
+        if (! strcmp (old, path))
+            break;
+
+        add = old;
+    }
+}
diff --git a/src/libaudcore/hook.c b/src/libaudcore/hook.c
deleted file mode 100644
index e9f4e39e0e49..000000000000
--- a/src/libaudcore/hook.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * hook.c
- * Copyright 2011-2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <pthread.h>
-
-#include "core.h"
-#include "hook.h"
-
-typedef struct {
-    HookFunction func;
-    void * user;
-    int lock_count;
-    bool_t remove_flag;
-} HookItem;
-
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-static GHashTable * hooks; /* of (GQueue of (HookItem *) *)  */
-
-EXPORT void hook_associate (const char * name, HookFunction func, void * user)
-{
-    pthread_mutex_lock (& mutex);
-
-    if (! hooks)
-        hooks = g_hash_table_new_full (g_str_hash, g_str_equal,
-         (GDestroyNotify) str_unref, (GDestroyNotify) g_queue_free);
-
-    GQueue * list = g_hash_table_lookup (hooks, name);
-
-    if (! list)
-        g_hash_table_insert (hooks, str_get (name), list = g_queue_new ());
-
-    HookItem * item = g_slice_new (HookItem);
-    item->func = func;
-    item->user = user;
-    item->lock_count = 0;
-    item->remove_flag = FALSE;
-
-    g_queue_push_tail (list, item);
-
-    pthread_mutex_unlock (& mutex);
-}
-
-EXPORT void hook_dissociate_full (const char * name, HookFunction func, void * user)
-{
-    pthread_mutex_lock (& mutex);
-
-    if (! hooks)
-        goto DONE;
-
-    GQueue * list = g_hash_table_lookup (hooks, name);
-
-    if (! list)
-        goto DONE;
-
-    for (GList * node = list->head; node;)
-    {
-        HookItem * item = node->data;
-        GList * next = node->next;
-
-        if (item->func == func && (! user || item->user == user))
-        {
-            if (item->lock_count)
-                item->remove_flag = TRUE;
-            else
-            {
-                g_queue_delete_link (list, node);
-                g_slice_free (HookItem, item);
-            }
-        }
-
-        node = next;
-    }
-
-    if (! list->head)
-        g_hash_table_remove (hooks, name);
-
-DONE:
-    pthread_mutex_unlock (& mutex);
-}
-
-EXPORT void hook_call (const char * name, void * data)
-{
-    pthread_mutex_lock (& mutex);
-
-    if (! hooks)
-        goto DONE;
-
-    GQueue * list = g_hash_table_lookup (hooks, name);
-
-    if (! list)
-        goto DONE;
-
-    for (GList * node = list->head; node;)
-    {
-        HookItem * item = node->data;
-
-        if (! item->remove_flag)
-        {
-            item->lock_count ++;
-            pthread_mutex_unlock (& mutex);
-
-            item->func (data, item->user);
-
-            pthread_mutex_lock (& mutex);
-            item->lock_count --;
-        }
-
-        GList * next = node->next;
-
-        if (item->remove_flag && ! item->lock_count)
-        {
-            g_queue_delete_link (list, node);
-            g_slice_free (HookItem, item);
-        }
-
-        node = next;
-    }
-
-    if (! list->head)
-        g_hash_table_remove (hooks, name);
-
-DONE:
-    pthread_mutex_unlock (& mutex);
-}
diff --git a/src/libaudcore/hook.cc b/src/libaudcore/hook.cc
new file mode 100644
index 000000000000..3b8b80e7dc7c
--- /dev/null
+++ b/src/libaudcore/hook.cc
@@ -0,0 +1,141 @@
+/*
+ * hook.c
+ * Copyright 2011-2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "hook.h"
+
+#include <pthread.h>
+
+#include "index.h"
+#include "internal.h"
+#include "multihash.h"
+#include "objects.h"
+#include "runtime.h"
+
+struct HookItem {
+    HookFunction func;
+    void * user;
+};
+
+struct HookList
+{
+    Index<HookItem> items;
+    int use_count;
+
+    void compact ()
+    {
+        auto is_empty = [] (const HookItem & item)
+            { return ! item.func; };
+
+        items.remove_if (is_empty);
+    }
+};
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static SimpleHash<String, HookList> hooks;
+
+EXPORT void hook_associate (const char * name, HookFunction func, void * user)
+{
+    pthread_mutex_lock (& mutex);
+
+    String key (name);
+    HookList * list = hooks.lookup (key);
+    if (! list)
+        list = hooks.add (key, HookList ());
+
+    list->items.append (func, user);
+
+    pthread_mutex_unlock (& mutex);
+}
+
+EXPORT void hook_dissociate (const char * name, HookFunction func, void * user)
+{
+    pthread_mutex_lock (& mutex);
+
+    String key (name);
+    HookList * list = hooks.lookup (key);
+    if (! list)
+        goto DONE;
+
+    for (HookItem & item : list->items)
+    {
+        if (item.func == func && (! user || item.user == user))
+            item.func = nullptr;
+    }
+
+    if (! list->use_count)
+    {
+        list->compact ();
+        if (! list->items.len ())
+            hooks.remove (key);
+    }
+
+DONE:
+    pthread_mutex_unlock (& mutex);
+}
+
+EXPORT void hook_call (const char * name, void * data)
+{
+    pthread_mutex_lock (& mutex);
+
+    String key (name);
+    HookList * list = hooks.lookup (key);
+    if (! list)
+        goto DONE;
+
+    list->use_count ++;
+
+    /* note: the list may grow (but not shrink) during the hook call */
+    for (int i = 0; i < list->items.len (); i ++)
+    {
+        /* copy locally to prevent race condition */
+        HookItem item = list->items[i];
+
+        if (item.func)
+        {
+            pthread_mutex_unlock (& mutex);
+            item.func (data, item.user);
+            pthread_mutex_lock (& mutex);
+        }
+    }
+
+    list->use_count --;
+
+    if (! list->use_count)
+    {
+        list->compact ();
+        if (! list->items.len ())
+            hooks.remove (key);
+    }
+
+DONE:
+    pthread_mutex_unlock (& mutex);
+}
+
+void leak_cb (const String & name, HookList & list, void *)
+{
+    AUDWARN ("Hook not disconnected: %s (%d)\n", (const char *) name, list.items.len ());
+}
+
+void hook_cleanup ()
+{
+    pthread_mutex_lock (& mutex);
+    hooks.iterate (leak_cb, nullptr);
+    hooks.clear ();
+    pthread_mutex_unlock (& mutex);
+}
diff --git a/src/libaudcore/hook.h b/src/libaudcore/hook.h
index 646359b6c767..bdca358c08f7 100644
--- a/src/libaudcore/hook.h
+++ b/src/libaudcore/hook.h
@@ -1,6 +1,6 @@
 /*
  * hook.h
- * Copyright 2011 John Lindgren
+ * Copyright 2011-2014 John Lindgren
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -20,6 +20,8 @@
 #ifndef LIBAUDCORE_HOOK_H
 #define LIBAUDCORE_HOOK_H
 
+#include <libaudcore/templates.h>
+
 typedef void (* HookFunction) (void * data, void * user);
 
 /* Adds <func> to the list of functions to be called when the hook <name> is
@@ -27,27 +29,87 @@ typedef void (* HookFunction) (void * data, void * user);
 void hook_associate (const char * name, HookFunction func, void * user);
 
 /* Removes all instances matching <func> and <user> from the list of functions
- * to be called when the hook <name> is triggered.  If <user> is NULL, all
+ * to be called when the hook <name> is triggered.  If <user> is nullptr, all
  * instances matching <func> are removed. */
-void hook_dissociate_full (const char * name, HookFunction func, void * user);
-
-#define hook_dissociate(n, f) hook_dissociate_full (n, f, NULL)
+void hook_dissociate (const char * name, HookFunction func, void * user = nullptr);
 
 /* Triggers the hook <name>. */
 void hook_call (const char * name, void * data);
 
+typedef void (* EventDestroyFunc) (void * data);
+
 /* Schedules a call of the hook <name> from the program's main loop, to be
- * executed in <time> milliseconds.  If <destroy> is not NULL, it will be called
+ * executed in <time> milliseconds.  If <destroy> is not nullptr, it will be called
  * on <data> after the hook is called. */
-void event_queue_full (int time, const char * name, void * data, void (* destroy) (void *));
-
-#define event_queue(n, d) event_queue_full (0, n, d, NULL)
+void event_queue (const char * name, void * data, EventDestroyFunc destroy = nullptr);
 
-/* Cancels pending hook calls matching <name> and <data>.  If <data> is NULL,
+/* Cancels pending hook calls matching <name> and <data>.  If <data> is nullptr,
  * all hook calls matching <name> are canceled. */
 void event_queue_cancel (const char * name, void * data);
 
-/* Cancels all pending hook calls. */
-void event_queue_cancel_all (void);
+/* Convenience wrapper for C++ classes.  Allows non-static member functions to
+ * be used as hook callbacks.  The HookReceiver should be made a member of the
+ * class in question so that hook_dissociate() is called automatically from the
+ * destructor. */
+template<class T, class D = void>
+class HookReceiver
+{
+public:
+    HookReceiver (const char * hook, T * target, void (T::* func) (D)) :
+        hook (hook),
+        target (target),
+        func (func)
+    {
+        hook_associate (hook, run, this);
+    }
+
+    ~HookReceiver ()
+        { hook_dissociate (hook, run, this); }
+
+    HookReceiver (const HookReceiver &) = delete;
+    void operator= (const HookReceiver &) = delete;
+
+private:
+    const char * const hook;
+    T * const target;
+    void (T::* const func) (D);
+
+    static void run (void * d, void * recv_)
+    {
+        auto recv = (HookReceiver *) recv_;
+        (recv->target->* recv->func) (aud::from_ptr<D> (d));
+    }
+};
+
+/* Partial specialization for data-less hooks. */
+template<class T>
+class HookReceiver<T, void>
+{
+public:
+    HookReceiver (const char * hook, T * target, void (T::* func) ()) :
+        hook (hook),
+        target (target),
+        func (func)
+    {
+        hook_associate (hook, run, this);
+    }
+
+    ~HookReceiver ()
+        { hook_dissociate (hook, run, this); }
+
+    HookReceiver (const HookReceiver &) = delete;
+    void operator= (const HookReceiver &) = delete;
+
+private:
+    const char * const hook;
+    T * const target;
+    void (T::* const func) ();
+
+    static void run (void *, void * recv_)
+    {
+        auto recv = (HookReceiver *) recv_;
+        (recv->target->* recv->func) ();
+    }
+};
 
 #endif /* LIBAUDCORE_HOOK_H */
diff --git a/src/libaudcore/i18n.h b/src/libaudcore/i18n.h
new file mode 100644
index 000000000000..5b5205c26dd9
--- /dev/null
+++ b/src/libaudcore/i18n.h
@@ -0,0 +1,32 @@
+/*
+ * i18n.h
+ * Copyright 2007 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef AUDACIOUS_I18N_H
+#define AUDACIOUS_I18N_H
+
+#include <libintl.h>
+
+#define _(String) dgettext (PACKAGE, String)
+#ifdef gettext_noop
+#define N_(String) gettext_noop (String)
+#else
+#define N_(String) (String)
+#endif
+
+#endif /* AUDACIOUS_I18N_H */
diff --git a/src/libaudcore/index.c b/src/libaudcore/index.c
deleted file mode 100644
index c2f7f39d8074..000000000000
--- a/src/libaudcore/index.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * index.c
- * Copyright 2009-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include "core.h"
-#include "index.h"
-
-struct _Index {
-    void * * data;
-    int count, size;
-    void * sdata[16];
-};
-
-typedef struct {
-    int (* compare) (const void * a, const void * b);
-} CompareWrapper;
-
-typedef struct {
-    int (* compare) (const void * a, const void * b, void * data);
-    void * data;
-} CompareWrapper2;
-
-EXPORT Index * index_new (void)
-{
-    Index * index = g_new0 (Index, 1);
-    index->data = index->sdata;
-    index->size = ARRAY_LEN (index->sdata);
-    return index;
-}
-
-EXPORT void index_free (Index * index)
-{
-    if (index->data != index->sdata)
-        g_free (index->data);
-
-    g_free (index);
-}
-
-EXPORT void index_free_full (Index * index, IndexFreeFunc func)
-{
-    for (int i = 0; i < index->count; i ++)
-        func (index->data[i]);
-
-    index_free (index);
-}
-
-EXPORT int index_count (Index * index)
-{
-    return index->count;
-}
-
-EXPORT void index_allocate (Index * index, int size)
-{
-    assert (size >= 0);
-
-    if (index->size >= size)
-        return;
-
-    if (index->size < 64)
-        index->size = 64;
-
-    while (index->size < size)
-        index->size <<= 1;
-
-    if (index->data == index->sdata)
-    {
-        index->data = g_new (void *, index->size);
-        memcpy (index->data, index->sdata, sizeof index->sdata);
-    }
-    else
-        index->data = g_renew (void *, index->data, index->size);
-}
-
-EXPORT void * index_get (Index * index, int at)
-{
-    assert (at >= 0 && at < index->count);
-
-    return index->data[at];
-}
-
-EXPORT void index_set (Index * index, int at, void * value)
-{
-    assert (at >= 0 && at < index->count);
-
-    index->data[at] = value;
-}
-
-static void make_room (Index * index, int at, int count)
-{
-    index_allocate (index, index->count + count);
-
-    if (at < index->count)
-        memmove (index->data + at + count, index->data + at, sizeof (void *) * (index->count - at));
-
-    index->count += count;
-}
-
-EXPORT void index_insert (Index * index, int at, void * value)
-{
-    if (at == -1)
-        at = index->count;
-
-    assert (at >= 0 && at <= index->count);
-
-    make_room (index, at, 1);
-    index->data[at] = value;
-}
-
-EXPORT void index_copy_set (Index * source, int from, Index * target, int to, int count)
-{
-    assert (count >= 0);
-    assert (from >= 0 && from + count <= source->count);
-    assert (to >= 0 && to + count <= target->count);
-
-    memmove (target->data + to, source->data + from, sizeof (void *) * count);
-}
-
-EXPORT void index_copy_insert (Index * source, int from, Index * target, int to, int count)
-{
-    if (to == -1)
-        to = target->count;
-    if (count == -1)
-        count = source->count - from;
-
-    assert (count >= 0);
-    assert (from >= 0 && from + count <= source->count);
-    assert (to >= 0 && to <= target->count);
-
-    make_room (target, to, count);
-
-    if (source == target && to <= from)
-        index_copy_set (source, from + count, target, to, count);
-    else if (source == target && to <= from + count)
-    {
-        index_copy_set (source, from, target, to, to - from);
-        index_copy_set (source, to + count, target, to + (to - from), count - (to - from));
-    }
-    else
-        index_copy_set (source, from, target, to, count);
-}
-
-EXPORT void index_delete (Index * index, int at, int count)
-{
-    if (count == -1)
-        count = index->count - at;
-
-    assert (count >= 0);
-    assert (at >= 0 && at + count <= index->count);
-
-    index_copy_set (index, at + count, index, at, index->count - (at + count));
-
-    index->count -= count;
-}
-
-EXPORT void index_delete_full (Index * index, int at, int count, IndexFreeFunc func)
-{
-    if (count == -1)
-        count = index->count - at;
-
-    assert (count >= 0);
-    assert (at >= 0 && at + count <= index->count);
-
-    for (int i = at; i < at + count; i ++)
-        func (index->data[i]);
-
-    index_delete (index, at, count);
-}
-
-static int index_compare (const void * ap, const void * bp, void * _wrapper)
-{
-    CompareWrapper * wrapper = _wrapper;
-    return wrapper->compare (* (const void * *) ap, * (const void * *) bp);
-}
-
-EXPORT void index_sort (Index * index, int (* compare) (const void *, const void *))
-{
-    CompareWrapper wrapper = {compare};
-    g_qsort_with_data (index->data, index->count, sizeof (void *), index_compare, & wrapper);
-}
-
-static int index_compare2 (const void * ap, const void * bp, void * _wrapper)
-{
-    CompareWrapper2 * wrapper = _wrapper;
-    return wrapper->compare (* (const void * *) ap, * (const void * *) bp, wrapper->data);
-}
-
-EXPORT void index_sort_with_data (Index * index, int (* compare)
- (const void * a, const void * b, void * data), void * data)
-{
-    CompareWrapper2 wrapper = {compare, data};
-    g_qsort_with_data (index->data, index->count, sizeof (void *), index_compare2, & wrapper);
-}
diff --git a/src/libaudcore/index.cc b/src/libaudcore/index.cc
new file mode 100644
index 000000000000..75aa559c465f
--- /dev/null
+++ b/src/libaudcore/index.cc
@@ -0,0 +1,196 @@
+/*
+ * index.cc
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "index.h"
+#include "internal.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>  /* for g_qsort_with_data */
+
+static void do_fill (void * data, int len, aud::FillFunc fill_func)
+{
+    if (fill_func)
+        fill_func (data, len);
+    else
+        memset (data, 0, len);
+}
+
+static void do_erase (void * data, int len, aud::EraseFunc erase_func)
+{
+    if (erase_func)
+        erase_func (data, len);
+}
+
+EXPORT void IndexBase::clear (aud::EraseFunc erase_func)
+{
+    __sync_sub_and_fetch (& misc_bytes_allocated, m_size);
+
+    do_erase (m_data, m_len, erase_func);
+    free (m_data);
+
+    m_data = nullptr;
+    m_len = 0;
+    m_size = 0;
+}
+
+EXPORT void * IndexBase::insert (int pos, int len)
+{
+    assert (pos <= m_len);
+    assert (len >= 0);
+
+    if (pos < 0)
+        pos = m_len;  /* insert at end */
+
+    if (m_size < m_len + len)
+    {
+        /* never allocate less than 16 bytes */
+        int new_size = aud::max (m_size, 16);
+
+        /* next try 4/3 current size, biased toward multiples of 4 */
+        if (new_size < m_len + len)
+            new_size = (new_size + 2) / 3 * 4;
+
+        /* use requested size if still too small */
+        if (new_size < m_len + len)
+            new_size = m_len + len;
+
+        void * new_data = realloc (m_data, new_size);
+        if (! new_data)
+            throw std::bad_alloc ();  /* nothing changed yet */
+
+        __sync_add_and_fetch (& misc_bytes_allocated, new_size - m_size);
+
+        m_data = new_data;
+        m_size = new_size;
+    }
+
+    memmove ((char *) m_data + pos + len, (char *) m_data + pos, m_len - pos);
+    m_len += len;
+
+    return (char *) m_data + pos;
+}
+
+EXPORT void IndexBase::insert (int pos, int len, aud::FillFunc fill_func)
+{
+    void * to = insert (pos, len);
+
+    if (fill_func)
+        fill_func (to, len);
+    else
+        memset (to, 0, len);
+}
+
+EXPORT void IndexBase::insert (const void * from, int pos, int len, aud::CopyFunc copy_func)
+{
+    void * to = insert (pos, len);
+
+    if (copy_func)
+        copy_func (from, to, len);
+    else
+        memcpy (to, from, len);
+}
+
+EXPORT void IndexBase::remove (int pos, int len, aud::EraseFunc erase_func)
+{
+    assert (pos >= 0 && pos <= m_len);
+    assert (len <= m_len - pos);
+
+    if (len < 0)
+        len = m_len - pos;  /* remove all following */
+
+    do_erase ((char *) m_data + pos, len, erase_func);
+    memmove ((char *) m_data + pos, (char *) m_data + pos + len, m_len - pos - len);
+    m_len -= len;
+}
+
+EXPORT void IndexBase::erase (int pos, int len, aud::FillFunc fill_func, aud::EraseFunc erase_func)
+{
+    assert (pos >= 0 && pos <= m_len);
+    assert (len <= m_len - pos);
+
+    if (len < 0)
+        len = m_len - pos;  /* erase all following */
+
+    do_erase ((char *) m_data + pos, len, erase_func);
+    do_fill ((char *) m_data + pos, len, fill_func);
+}
+
+EXPORT void IndexBase::shift (int from, int to, int len, aud::FillFunc fill_func, aud::EraseFunc erase_func)
+{
+    assert (len >= 0 && len <= m_len);
+    assert (from >= 0 && from + len <= m_len);
+    assert (to >= 0 && to + len <= m_len);
+
+    int erase_len = aud::min (len, abs (to - from));
+
+    if (to < from)
+        do_erase ((char *) m_data + to, erase_len, erase_func);
+    else
+        do_erase ((char *) m_data + to + len - erase_len, erase_len, erase_func);
+
+    memmove ((char *) m_data + to, (char *) m_data + from, len);
+
+    if (to < from)
+        do_fill ((char *) m_data + from + len - erase_len, erase_len, fill_func);
+    else
+        do_fill ((char *) m_data + from, erase_len, fill_func);
+}
+
+EXPORT void IndexBase::move_from (IndexBase & b, int from, int to, int len,
+ bool expand, bool collapse, aud::FillFunc fill_func, aud::EraseFunc erase_func)
+{
+    assert (this != & b);
+    assert (from >= 0 && from <= b.m_len);
+    assert (len <= b.m_len - from);
+
+    if (len < 0)
+        len = b.m_len - from;  /* copy all following */
+
+    if (expand)
+    {
+        assert (to <= m_len);
+        if (to < 0)
+            to = m_len;  /* insert at end */
+
+        insert (to, len);
+    }
+    else
+    {
+        assert (to >= 0 && to <= m_len - len);
+        do_erase ((char *) m_data + to, len, erase_func);
+    }
+
+    memcpy ((char *) m_data + to, (char *) b.m_data + from, len);
+
+    if (collapse)
+    {
+        memmove ((char *) b.m_data + from, (char *) b.m_data + from + len, b.m_len - from - len);
+        b.m_len -= len;
+    }
+    else
+        do_fill ((char *) b.m_data + from, len, fill_func);
+}
+
+EXPORT void IndexBase::sort (CompareFunc compare, int elemsize, void * userdata)
+{
+    g_qsort_with_data (m_data, m_len / elemsize, elemsize, compare, userdata);
+}
diff --git a/src/libaudcore/index.h b/src/libaudcore/index.h
index 3990ff8bb4ff..56dbdc51191c 100644
--- a/src/libaudcore/index.h
+++ b/src/libaudcore/index.h
@@ -1,6 +1,6 @@
 /*
  * index.h
- * Copyright 2009-2013 John Lindgren
+ * Copyright 2014 John Lindgren
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -20,78 +20,200 @@
 #ifndef LIBAUDCORE_INDEX_H
 #define LIBAUDCORE_INDEX_H
 
-/* An "index" is an opaque structure representing a list of pointers.  It is
- * used primarily to store Audacious playlists, but can be useful for other
- * purposes as well. */
-
-struct _Index;
-typedef struct _Index Index;
-
-typedef void (* IndexFreeFunc) (void * value);
-
-/* Returns a new, empty index. */
-Index * index_new (void);
-
-/* Destroys <index>. */
-void index_free (Index * index);
-
-/* Destroys <index>, first calling <func> on each pointer stored in it. */
-void index_free_full (Index * index, IndexFreeFunc func);
-
-/* Returns the number of pointers stored in <index>. */
-int index_count (Index * index);
-
-/* Preallocates space to store <size> pointers in <index>.  This can be used to
- * avoid repeated memory allocations when adding pointers to <index> one by one.
- * The value returned by index_count() does not changed until the pointers are
- * actually added. */
-void index_allocate (Index * index, int size);
-
-/* Returns the value stored in <index> at position <at>. */
-void * index_get (Index * index, int at);
-
-/* Stores <value> in <index> at position <at>, overwriting the previous value. */
-void index_set (Index * index, int at, void * value);
-
-/* Stores <value> in <index> at position <at>, shifting the previous value (if
- * any) and those following it forward to make room.  If <at> is -1, <value> is
- * added to the end of <index>. */
-void index_insert (Index * index, int at, void * value);
-
-/* Copies <count> pointers from <source>, starting at position <from>, to
- * <target>, starting at position <to>.  Existing pointers in <target> are
- * overwritten.  Overlapping regions are handled correctly if <source> and
- * <target> are the same index. */
-void index_copy_set (Index * source, int from, Index * target, int to, int count);
-
-/* Copies <count> pointers from <source>, starting at position <from>, to
- * <target>, starting at position <to>.  Existing pointers in <target> are
- * shifted forward to make room.  All cases are handled correctly if <source>
- * and <target> are the same index, including the case where <to> is between
- * <from> and <from + count>.  If <to> is -1, the pointers are added to the end
- * of <target>.  If <count> is -1, copying continues until the end of <source>
- * is reached. */
-void index_copy_insert (Index * source, int from, Index * target, int to, int count);
-
-/* Removes <count> pointers from <index>, start at position <at>.  Any following
- * pointers are shifted backward to close the gap.  If <count> is -1, all
- * pointers from <at> to the end of <index> are removed. */
-void index_delete (Index * index, int at, int count);
-
-/* Like index_delete(), but first calls <func> on any pointer that is being
- * removed. */
-void index_delete_full (Index * index, int at, int count, IndexFreeFunc func);
-
-/* Sort the entries in <index> using the quick-sort algorithm with the given
- * comparison function.  The return value of <compare> should follow the
- * convention used by strcmp(): negative if (a < b), zero if (a = b), positive
- * if (a > b). */
-void index_sort (Index * index, int (* compare) (const void * a, const void * b));
-
-/* Exactly like index_sort() except that <data> is forwarded to the comparison
- * function.  This allows comparison functions whose behavior changes depending
- * on context. */
-void index_sort_with_data (Index * index, int (* compare) (const void * a,
- const void * b, void * data), void * data);
-
-#endif /* LIBAUDCORE_INDEX_H */
+#include <libaudcore/templates.h>
+
+/*
+ * Index is a lightweight list class similar to std::vector, but with the
+ * following differences:
+ *  - The base implementation is type-agnostic, so it only needs to be compiled
+ *    once.  Type-safety is provided by a thin template subclass.
+ *  - Objects are moved in memory without calling any assignment operator.
+ *    Be careful to use only objects that can handle this.
+ */
+
+class IndexBase
+{
+public:
+    typedef int (* CompareFunc) (const void * a, const void * b, void * userdata);
+
+    constexpr IndexBase () :
+        m_data (nullptr),
+        m_len (0),
+        m_size (0) {}
+
+    void clear (aud::EraseFunc erase_func);  // use as destructor
+
+    IndexBase (IndexBase && b) :
+        m_data (b.m_data),
+        m_len (b.m_len),
+        m_size (b.m_size)
+    {
+        b.m_data = nullptr;
+        b.m_len = 0;
+        b.m_size = 0;
+    }
+
+    void steal (IndexBase && b, aud::EraseFunc erase_func)
+    {
+        if (this != & b)
+        {
+            clear (erase_func);
+            new (this) IndexBase (std::move (b));
+        }
+    }
+
+    void * begin ()
+        { return m_data; }
+    const void * begin () const
+        { return m_data; }
+    void * end ()
+        { return (char *) m_data + m_len; }
+    const void * end () const
+        { return (char *) m_data + m_len; }
+
+    int len () const
+        { return m_len; }
+
+    void * insert (int pos, int len);  // no fill
+    void insert (int pos, int len, aud::FillFunc fill_func);
+    void insert (const void * from, int pos, int len, aud::CopyFunc copy_func);
+    void remove (int pos, int len, aud::EraseFunc erase_func);
+    void erase (int pos, int len, aud::FillFunc fill_func, aud::EraseFunc erase_func);
+    void shift (int from, int to, int len, aud::FillFunc fill_func, aud::EraseFunc erase_func);
+
+    void move_from (IndexBase & b, int from, int to, int len, bool expand,
+     bool collapse, aud::FillFunc fill_func, aud::EraseFunc erase_func);
+
+    void sort (CompareFunc compare, int elemsize, void * userdata);
+
+private:
+    void * m_data;
+    int m_len, m_size;
+};
+
+template<class T>
+class Index : private IndexBase
+{
+public:
+    typedef int (* CompareFunc) (const T & a, const T & b, void * userdata);
+
+    constexpr Index () :
+        IndexBase () {}
+
+    // use with care!
+    IndexBase & base ()
+        { return * this; }
+
+    void clear ()
+        { IndexBase::clear (aud::erase_func<T> ()); }
+    ~Index ()
+        { clear (); }
+
+    Index (Index && b) :
+        IndexBase (std::move (b)) {}
+    void operator= (Index && b)
+        { steal (std::move (b), aud::erase_func<T> ()); }
+
+    T * begin ()
+        { return (T *) IndexBase::begin (); }
+    const T * begin () const
+        { return (const T *) IndexBase::begin (); }
+    T * end ()
+        { return (T *) IndexBase::end (); }
+    const T * end () const
+        { return (const T *) IndexBase::end (); }
+
+    int len () const
+        { return cooked (IndexBase::len ()); }
+
+    T & operator[] (int i)
+        { return begin ()[i]; }
+    const T & operator[] (int i) const
+        { return begin ()[i]; }
+
+    void insert (int pos, int len)
+        { IndexBase::insert (raw (pos), raw (len), aud::fill_func<T> ()); }
+    void insert (const T * from, int pos, int len)
+        { IndexBase::insert (from, raw (pos), raw (len), aud::copy_func<T> ()); }
+    void remove (int pos, int len)
+        { IndexBase::remove (raw (pos), raw (len), aud::erase_func<T> ()); }
+    void erase (int pos, int len)
+        { IndexBase::erase (raw (pos), raw (len), aud::fill_func<T> (), aud::erase_func<T> ()); }
+    void shift (int from, int to, int len)
+        { IndexBase::shift (raw (from), raw (to), raw (len), aud::fill_func<T> (), aud::erase_func<T> ()); }
+
+    void move_from (Index<T> & b, int from, int to, int len, bool expand, bool collapse)
+        { IndexBase::move_from (b, raw (from), raw (to), raw (len), expand,
+           collapse, aud::fill_func<T> (), aud::erase_func<T> ()); }
+
+    template<class ... Args>
+    T & append (Args && ... args)
+    {
+        return * aud::construct<T>::make (IndexBase::insert (-1, sizeof (T)),
+         std::forward<Args> (args) ...);
+    }
+
+    int find (const T & val) const
+    {
+        for (const T * iter = begin (); iter != end (); iter ++)
+        {
+            if (* iter == val)
+                return iter - begin ();
+        }
+
+        return -1;
+    }
+
+    template<class F>
+    void remove_if (F func, bool clear_if_empty = false)
+    {
+        T * iter = begin ();
+        while (iter != end ())
+        {
+            if (func (* iter))
+                remove (iter - begin (), 1);
+            else
+                iter ++;
+        }
+
+        if (clear_if_empty && ! len ())
+            clear ();
+    }
+
+    void sort (CompareFunc compare, void * userdata)
+    {
+        struct state_t {
+            CompareFunc compare;
+            void * userdata;
+        };
+
+        auto wrapper = [] (const void * a, const void * b, void * userdata) -> int
+        {
+            auto state = (const state_t *) userdata;
+            return state->compare (* (const T *) a, * (const T *) b, state->userdata);
+        };
+
+        const state_t state = {compare, userdata};
+        IndexBase::sort (wrapper, sizeof (T), (void *) & state);
+    }
+
+    // for use of Index as a raw data buffer
+    // unlike insert(), does not zero-fill any added space
+    void resize (int size)
+    {
+        static_assert (std::is_trivial<T>::value, "for basic types only");
+        int diff = size - len ();
+        if (diff > 0)
+            IndexBase::insert (-1, raw (diff));
+        else if (diff < 0)
+            IndexBase::remove (raw (size), -1, nullptr);
+    }
+
+private:
+    static constexpr int raw (int len)
+        { return len * sizeof (T); }
+    static constexpr int cooked (int len)
+        { return len / sizeof (T); }
+};
+
+#endif // LIBAUDCORE_INDEX_H
diff --git a/src/libaudcore/inifile.c b/src/libaudcore/inifile.c
deleted file mode 100644
index 6e13a48f29f9..000000000000
--- a/src/libaudcore/inifile.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * inifile.c
- * Copyright 2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include "audstrings.h"
-#include "inifile.h"
-
-#include <glib.h>
-
-#include <string.h>
-
-static char * strskip (char * str)
-{
-    while (g_ascii_isspace (* str))
-        str ++;
-
-    return str;
-}
-
-static char * strtrim (char * str)
-{
-    int len = strlen (str);
-
-    while (len && g_ascii_isspace(str[len - 1]))
-        str[-- len] = 0;
-
-    return str;
-}
-
-EXPORT void inifile_parse (VFSFile * file,
- void (* handle_heading) (const char * heading, void * data),
- void (* handle_entry) (const char * key, const char * value, void * data),
- void * data)
-{
-    int size = 512;
-    char * buf = g_new (char, size);
-
-    char * pos = buf;
-    int len = 0;
-    bool_t eof = FALSE;
-
-    while (1)
-    {
-        char * newline = memchr (pos, '\n', len);
-
-        while (! newline && ! eof)
-        {
-            memmove (buf, pos, len);
-            pos = buf;
-
-            if (len >= size - 1)
-            {
-                size <<= 1;
-                buf = g_renew (char, buf, size);
-                pos = buf;
-            }
-
-            len += vfs_fread (buf + len, 1, size - 1 - len, file);
-
-            if (len < size - 1)
-                eof = TRUE;
-
-            newline = memchr (pos, '\n', len);
-        }
-
-        if (newline)
-            * newline = 0;
-        else
-            pos[len] = 0;
-
-        char * start = strskip (pos);
-
-        switch (* start)
-        {
-        case 0:
-        case '#':
-        case ';':
-            break;
-
-        case '[':;
-            char * end = strchr (start + 1, ']');
-            if (! end)
-                break;
-
-            * end = 0;
-            handle_heading (strtrim (strskip (start + 1)), data);
-            break;
-
-        default:;
-            char * sep = strchr (start, '=');
-            if (! sep)
-                break;
-
-            * sep = 0;
-            handle_entry (strtrim (start), strtrim (strskip (sep + 1)), data);
-            break;
-        }
-
-        if (! newline)
-            break;
-
-        len -= newline + 1 - pos;
-        pos = newline + 1;
-    }
-
-    g_free (buf);
-}
-
-EXPORT bool_t inifile_write_heading (VFSFile * file, const char * heading)
-{
-    SCONCAT3 (buf, "\n[", heading, "]\n");
-    return (vfs_fwrite (buf, 1, sizeof buf - 1, file) == sizeof buf - 1);
-}
-
-EXPORT bool_t inifile_write_entry (VFSFile * file, const char * key, const char * value)
-{
-    SCONCAT4 (buf, key, "=", value, "\n");
-    return (vfs_fwrite (buf, 1, sizeof buf - 1, file) == sizeof buf - 1);
-}
diff --git a/src/libaudcore/inifile.cc b/src/libaudcore/inifile.cc
new file mode 100644
index 000000000000..046c14a72564
--- /dev/null
+++ b/src/libaudcore/inifile.cc
@@ -0,0 +1,123 @@
+/*
+ * inifile.c
+ * Copyright 2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "inifile.h"
+
+#include <string.h>
+
+#include <glib.h>  /* for g_ascii_isspace */
+
+#include "audstrings.h"
+#include "vfs.h"
+
+static char * strskip (char * str, char * end)
+{
+    while (str < end && g_ascii_isspace (* str))
+        str ++;
+
+    return str;
+}
+
+static char * strtrim (char * str, char * end)
+{
+    while (end > str && g_ascii_isspace (end[-1]))
+        end --;
+
+    * end = 0;
+    return str;
+}
+
+EXPORT void IniParser::parse (VFSFile & file)
+{
+    int size = 512;
+    StringBuf buf (size);
+
+    char * pos = buf;
+    int len = 0;
+    bool eof = false;
+
+    while (1)
+    {
+        char * newline = (char *) memchr (pos, '\n', len);
+
+        while (! newline && ! eof)
+        {
+            memmove (buf, pos, len);
+            pos = buf;
+
+            if (len >= size - 1)
+            {
+                size <<= 1;
+                buf.resize (size);
+                pos = buf;
+            }
+
+            len += file.fread (buf + len, 1, size - 1 - len);
+
+            if (len < size - 1)
+                eof = true;
+
+            newline = (char *) memchr (pos, '\n', len);
+        }
+
+        char * end = newline ? newline : pos + len;
+        char * start = strskip (pos, end);
+        char * sep;
+
+        if (start < end)
+        {
+            switch (* start)
+            {
+            case '#':
+            case ';':
+                break;
+
+            case '[':
+                if ((end = (char *) memchr (start, ']', end - start)))
+                    handle_heading (strtrim (strskip (start + 1, end), end));
+
+                break;
+
+            default:
+                if ((sep = (char *) memchr (start, '=', end - start)))
+                    handle_entry (strtrim (start, sep), strtrim (strskip (sep + 1, end), end));
+
+                break;
+            }
+        }
+
+        if (! newline)
+            break;
+
+        len -= newline + 1 - pos;
+        pos = newline + 1;
+    }
+}
+
+EXPORT bool inifile_write_heading (VFSFile & file, const char * heading)
+{
+    StringBuf line = str_concat ({"\n[", heading, "]\n"});
+    return (file.fwrite (line, 1, line.len ()) == line.len ());
+}
+
+EXPORT bool inifile_write_entry (VFSFile & file, const char * key, const char * value)
+{
+    StringBuf line = str_concat ({key, "=", value, "\n"});
+    return (file.fwrite (line, 1, line.len ()) == line.len ());
+}
diff --git a/src/libaudcore/inifile.h b/src/libaudcore/inifile.h
index 87189c2fc8f3..f9ee049480d6 100644
--- a/src/libaudcore/inifile.h
+++ b/src/libaudcore/inifile.h
@@ -20,14 +20,23 @@
 #ifndef LIBAUDCORE_INIFILE_H
 #define LIBAUDCORE_INIFILE_H
 
-#include "vfs.h"
+class VFSFile;
 
-void inifile_parse (VFSFile * file,
- void (* handle_heading) (const char * heading, void * data),
- void (* handle_entry) (const char * key, const char * value, void * data),
- void * data);
+class IniParser
+{
+public:
+    virtual ~IniParser () {}
 
-bool_t inifile_write_heading (VFSFile * file, const char * heading);
-bool_t inifile_write_entry (VFSFile * file, const char * key, const char * value);
+    void parse (VFSFile & file);
+
+protected:
+    virtual void handle_heading (const char * heading) = 0;
+    virtual void handle_entry (const char * key, const char * value) = 0;
+};
+
+bool inifile_write_heading (VFSFile & file, const char * heading)
+ __attribute__ ((warn_unused_result));
+bool inifile_write_entry (VFSFile & file, const char * key, const char * value)
+ __attribute__ ((warn_unused_result));
 
 #endif /* LIBAUDCORE_INIFILE_H */
diff --git a/src/libaudcore/interface.cc b/src/libaudcore/interface.cc
new file mode 100644
index 000000000000..403f64d0bcfa
--- /dev/null
+++ b/src/libaudcore/interface.cc
@@ -0,0 +1,256 @@
+/*
+ * interface.c
+ * Copyright 2010-2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "interface.h"
+#include "internal.h"
+
+#include <assert.h>
+
+#include "drct.h"
+#include "hook.h"
+#include "mainloop.h"
+#include "plugin.h"
+#include "plugins.h"
+#include "runtime.h"
+
+struct MenuItem {
+    const char * name;
+    const char * icon;
+    void (* func) ();
+};
+
+static PluginHandle * current_plugin;
+static PluginHandle * next_plugin;
+
+static IfacePlugin * current_interface;
+
+static aud::array<AudMenuID, Index<MenuItem>> menu_items;
+
+static void add_menu_items ()
+{
+    for (AudMenuID id : aud::range<AudMenuID> ())
+    {
+        for (MenuItem & item : menu_items[id])
+            current_interface->plugin_menu_add (id, item.func, item.name, item.icon);
+    }
+}
+
+static void remove_menu_items ()
+{
+    for (AudMenuID id : aud::range<AudMenuID> ())
+    {
+        for (MenuItem & item : menu_items[id])
+            current_interface->plugin_menu_remove (id, item.func);
+    }
+}
+
+static bool interface_load (PluginHandle * plugin)
+{
+    auto i = (IfacePlugin *) aud_plugin_get_header (plugin);
+    if (! i)
+        return false;
+
+    AUDINFO ("Loading %s.\n", aud_plugin_get_name (plugin));
+
+    if (! i->init ())
+        return false;
+
+    current_interface = i;
+
+    add_menu_items ();
+
+    if (aud_get_bool (0, "show_interface"))
+        current_interface->show (true);
+
+    return true;
+}
+
+static void interface_unload ()
+{
+    AUDINFO ("Unloading %s.\n", aud_plugin_get_name (current_plugin));
+
+    if (aud_get_bool (0, "show_interface"))
+        current_interface->show (false);
+
+    remove_menu_items ();
+
+    current_interface->cleanup ();
+    current_interface = nullptr;
+}
+
+EXPORT void aud_ui_show (bool show)
+{
+    if (! current_interface)
+        return;
+
+    aud_set_bool (0, "show_interface", show);
+
+    current_interface->show (show);
+
+    vis_activate (show);
+}
+
+EXPORT bool aud_ui_is_shown ()
+{
+    if (! current_interface)
+        return false;
+
+    return aud_get_bool (0, "show_interface");
+}
+
+EXPORT void aud_ui_show_error (const char * message)
+{
+    if (aud_get_headless_mode ())
+        AUDERR ("%s\n", message);
+    else
+        event_queue ("ui show error", String::raw_get (message),
+         (EventDestroyFunc) String::raw_unref);
+}
+
+PluginHandle * iface_plugin_get_current ()
+{
+    return current_plugin;
+}
+
+bool iface_plugin_set_current (PluginHandle * plugin)
+{
+    if (current_interface)
+    {
+        // queue up interface switch
+        next_plugin = plugin;
+
+        // restart main loop
+        aud_quit ();
+
+        return true;
+    }
+
+    if (! interface_load (plugin))
+        return false;
+
+    current_plugin = plugin;
+    return true;
+}
+
+void interface_run ()
+{
+    if (aud_get_headless_mode ())
+    {
+        mainloop_run ();
+
+        // call before shutting down
+        hook_call ("config save", nullptr);
+    }
+    else
+    {
+        vis_activate (aud_get_bool (0, "show_interface"));
+
+        while (current_interface)
+        {
+            current_interface->run ();
+
+            // call before unloading interface
+            hook_call ("config save", nullptr);
+
+            interface_unload ();
+
+            if (next_plugin)
+            {
+                // handle queued interface switch
+                aud_plugin_enable (next_plugin, true);
+                next_plugin = nullptr;
+            }
+        }
+    }
+}
+
+EXPORT void aud_quit ()
+{
+    if (current_interface)
+        current_interface->quit ();
+    else
+        mainloop_quit ();
+}
+
+EXPORT void aud_plugin_menu_add (AudMenuID id, void (* func) (), const char * name, const char * icon)
+{
+    menu_items[id].append (name, icon, func);
+
+    if (current_interface)
+        current_interface->plugin_menu_add (id, func, name, icon);
+}
+
+EXPORT void aud_plugin_menu_remove (AudMenuID id, void (* func) ())
+{
+    if (current_interface)
+        current_interface->plugin_menu_remove (id, func);
+
+    auto is_match = [=] (const MenuItem & item)
+        { return item.func == func; };
+
+    menu_items[id].remove_if (is_match, true);
+}
+
+EXPORT void aud_ui_show_about_window ()
+{
+    if (current_interface)
+        current_interface->show_about_window ();
+}
+
+EXPORT void aud_ui_hide_about_window ()
+{
+    if (current_interface)
+        current_interface->hide_about_window ();
+}
+
+EXPORT void aud_ui_show_filebrowser (bool open)
+{
+    if (current_interface)
+        current_interface->show_filebrowser (open);
+}
+
+EXPORT void aud_ui_hide_filebrowser ()
+{
+    if (current_interface)
+        current_interface->hide_filebrowser ();
+}
+
+EXPORT void aud_ui_show_jump_to_song ()
+{
+    if (current_interface)
+        current_interface->show_jump_to_song ();
+}
+
+EXPORT void aud_ui_hide_jump_to_song ()
+{
+    if (current_interface)
+        current_interface->hide_jump_to_song ();
+}
+
+EXPORT void aud_ui_show_prefs_window ()
+{
+    if (current_interface)
+        current_interface->show_prefs_window ();
+}
+
+EXPORT void aud_ui_hide_prefs_window ()
+{
+    if (current_interface)
+        current_interface->hide_prefs_window ();
+}
diff --git a/src/libaudcore/interface.h b/src/libaudcore/interface.h
new file mode 100644
index 000000000000..43ccb385db05
--- /dev/null
+++ b/src/libaudcore/interface.h
@@ -0,0 +1,53 @@
+/*
+ * interface.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_INTERFACE_H
+#define LIBAUDCORE_INTERFACE_H
+
+#include <libaudcore/visualizer.h>
+
+enum class AudMenuID {
+    Main,
+    Playlist,
+    PlaylistAdd,
+    PlaylistRemove,
+    count
+};
+
+void aud_ui_show (bool show);
+bool aud_ui_is_shown ();
+
+void aud_ui_show_error (const char * message);  /* thread-safe */
+
+void aud_ui_show_about_window ();
+void aud_ui_hide_about_window ();
+void aud_ui_show_filebrowser (bool open);
+void aud_ui_hide_filebrowser ();
+void aud_ui_show_jump_to_song ();
+void aud_ui_hide_jump_to_song ();
+void aud_ui_show_prefs_window ();
+void aud_ui_hide_prefs_window ();
+
+void aud_plugin_menu_add (AudMenuID id, void (* func) (), const char * name, const char * icon);
+void aud_plugin_menu_remove (AudMenuID id, void (* func) ());
+
+void aud_visualizer_add (Visualizer * vis);
+void aud_visualizer_remove (Visualizer * vis);
+
+#endif
diff --git a/src/libaudcore/internal.h b/src/libaudcore/internal.h
new file mode 100644
index 000000000000..aa93cfff7d93
--- /dev/null
+++ b/src/libaudcore/internal.h
@@ -0,0 +1,130 @@
+/*
+ * internal.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_INTERNAL_H
+#define LIBAUDCORE_INTERNAL_H
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include "index.h"
+#include "objects.h"
+
+class Plugin;
+class PluginHandle;
+class VFSFile;
+class Tuple;
+
+typedef bool (* DirForeachFunc) (const char * path, const char * basename, void * user);
+
+/* adder.cc */
+void adder_cleanup ();
+
+/* art.cc */
+void art_init ();
+void art_cleanup ();
+
+/* art-search.cc */
+String art_search (const char * filename);
+
+/* charset.cc */
+void chardet_init ();
+void chardet_cleanup ();
+
+/* config.cc */
+void config_load ();
+void config_save ();
+void config_cleanup ();
+
+/* effect.cc */
+void effect_start (int & channels, int & rate);
+Index<float> & effect_process (Index<float> & data);
+bool effect_flush (bool force);
+Index<float> & effect_finish (Index<float> & data, bool end_of_playlist);
+int effect_adjust_delay (int delay);
+
+bool effect_plugin_start (PluginHandle * plugin);
+void effect_plugin_stop (PluginHandle * plugin);
+
+/* equalizer.cc */
+void eq_init ();
+void eq_cleanup ();
+void eq_set_format (int new_channels, int new_rate);
+void eq_filter (float * data, int samples);
+
+/* eventqueue.cc */
+void event_queue_cancel_all ();
+
+/* fft.cc */
+void calc_freq (const float data[512], float freq[256]);
+
+/* hook.cc */
+void hook_cleanup ();
+
+/* interface.cc */
+PluginHandle * iface_plugin_probe ();
+PluginHandle * iface_plugin_get_current ();
+bool iface_plugin_set_current (PluginHandle * plugin);
+
+void interface_run ();
+
+/* playback.cc */
+/* do not call these; use aud_drct_play/stop() instead */
+void playback_play (int seek_time, bool pause);
+void playback_stop (bool exiting = false);
+
+bool playback_check_serial (int serial);
+bool playback_set_info (int entry, const String & filename,
+ PluginHandle * decoder, Tuple && tuple);
+
+/* probe-buffer.cc */
+VFSFile probe_buffer_new (const char * filename);
+
+/* runtime.cc */
+extern size_t misc_bytes_allocated;
+
+/* strpool.cc */
+void string_leak_check ();
+
+/* util.cc */
+const char * get_home_utf8 ();
+bool dir_foreach (const char * path, DirForeachFunc func, void * user_data);
+String write_temp_file (const void * data, int64_t len);
+
+bool same_basename (const char * a, const char * b);
+const char * last_path_element (const char * path);
+void cut_path_element (char * path, int pos);
+
+unsigned int32_hash (unsigned val);
+
+/* vis-runner.cc */
+void vis_runner_start_stop (bool playing, bool paused);
+void vis_runner_pass_audio (int time, const Index<float> & data, int channels, int rate);
+void vis_runner_flush ();
+void vis_runner_enable (bool enable);
+
+/* visualization.cc */
+void vis_activate (bool activate);
+void vis_send_clear ();
+void vis_send_audio (const float * data, int channels);
+
+bool vis_plugin_start (PluginHandle * plugin);
+void vis_plugin_stop (PluginHandle * plugin);
+
+#endif
diff --git a/src/libaudcore/list.cc b/src/libaudcore/list.cc
new file mode 100644
index 000000000000..f2b7a5e6136e
--- /dev/null
+++ b/src/libaudcore/list.cc
@@ -0,0 +1,77 @@
+/*
+ * list.cpp
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "list.h"
+
+EXPORT void ListBase::insert_after (ListNode * prev, ListNode * node)
+{
+    ListNode * next;
+
+    if (prev)
+    {
+        next = prev->next;
+        prev->next = node;
+    }
+    else
+    {
+        next = head;
+        head = node;
+    }
+
+    node->prev = prev;
+    node->next = next;
+
+    if (next)
+        next->prev = node;
+    else
+        tail = node;
+}
+
+EXPORT void ListBase::remove (ListNode * node)
+{
+    ListNode * prev = node->prev;
+    ListNode * next = node->next;
+
+    node->prev = nullptr;
+    node->next = nullptr;
+
+    if (prev)
+        prev->next = next;
+    else
+        head = next;
+
+    if (next)
+        next->prev = prev;
+    else
+        tail = prev;
+}
+
+EXPORT void ListBase::clear (DestroyFunc destroy)
+{
+    ListNode * node = head;
+    while (node)
+    {
+        ListNode * next = node->next;
+        destroy (node);
+        node = next;
+    }
+
+    head = nullptr;
+    tail = nullptr;
+}
diff --git a/src/libaudcore/list.h b/src/libaudcore/list.h
new file mode 100644
index 000000000000..623603d20fae
--- /dev/null
+++ b/src/libaudcore/list.h
@@ -0,0 +1,82 @@
+/*
+ * list.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_LIST_H
+#define LIBAUDCORE_LIST_H
+
+struct ListNode
+{
+    friend class ListBase;
+
+private:
+    ListNode * prev = nullptr;
+    ListNode * next = nullptr;
+};
+
+class ListBase
+{
+protected:
+    typedef void (* DestroyFunc) (ListNode *);
+
+    ListNode * head = nullptr;
+    ListNode * tail = nullptr;
+
+    void insert_after (ListNode * prev, ListNode * node);
+    void remove (ListNode * node);
+    void clear (DestroyFunc destroy);
+
+    static ListNode * prev (ListNode * node)
+        { return node->prev; }
+    static ListNode * next (ListNode * node)
+        { return node->next; }
+};
+
+template<class C>
+class List : private ListBase
+{
+public:
+    C * head () const
+        { return (C *) ListBase::head; }
+    C * tail () const
+        { return (C *) ListBase::tail; }
+
+    static C * prev (C * node)
+        { return (C *) ListBase::prev (node); }
+    static C * next (C * node)
+        { return (C *) ListBase::next (node); }
+
+    void insert_after (C * prev, C * node)
+        { ListBase::insert_after (prev, node); }
+    void remove (C * node)
+        { ListBase::remove (node); }
+
+    void prepend (C * node)
+        { insert_after (nullptr, node); }
+    void append (C * node)
+        { insert_after (tail (), node); }
+
+    void clear ()
+        { ListBase::clear (destroy); }
+
+private:
+    static void destroy (ListNode * node)
+        { delete (C *) node; }
+};
+
+#endif // LIBAUDCORE_LIST_H
diff --git a/src/libaudcore/logger.cc b/src/libaudcore/logger.cc
new file mode 100644
index 000000000000..5fa300b35d5f
--- /dev/null
+++ b/src/libaudcore/logger.cc
@@ -0,0 +1,125 @@
+/*
+ * logger.cc
+ * Copyright 2014 John Lindgren and William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "audstrings.h"
+#include "index.h"
+#include "runtime.h"
+#include "tinylock.h"
+
+#include <stdio.h>
+
+namespace audlog {
+
+struct HandlerData {
+    Handler handler;
+    Level level;
+};
+
+static TinyRWLock lock;
+static Index<HandlerData> handlers;
+static Level stderr_level = Warning;
+static Level min_level = Warning;
+
+EXPORT void set_stderr_level (Level level)
+{
+    tiny_lock_write (& lock);
+
+    min_level = stderr_level = level;
+
+    for (const HandlerData & h : handlers)
+    {
+        if (h.level < min_level)
+            min_level = h.level;
+    }
+
+    tiny_unlock_write (& lock);
+}
+
+EXPORT void subscribe (Handler handler, Level level)
+{
+    tiny_lock_write (& lock);
+
+    handlers.append (handler, level);
+
+    if (level < min_level)
+        min_level = level;
+
+    tiny_unlock_write (& lock);
+}
+
+EXPORT void unsubscribe (Handler handler)
+{
+    tiny_lock_write (& lock);
+
+    auto is_match = [=] (const HandlerData & data)
+        { return data.handler == handler; };
+
+    handlers.remove_if (is_match, true);
+
+    min_level = stderr_level;
+
+    for (const HandlerData & h : handlers)
+    {
+        if (h.level < min_level)
+            min_level = h.level;
+    }
+
+    tiny_unlock_write (& lock);
+}
+
+EXPORT const char * get_level_name (Level level)
+{
+    switch (level)
+    {
+        case Debug: return "DEBUG";
+        case Info: return "INFO";
+        case Warning: return "WARNING";
+        case Error: return "ERROR";
+    };
+
+    return nullptr;
+}
+
+EXPORT void log (Level level, const char * file, int line, const char * func,
+ const char * format, ...)
+{
+    tiny_lock_read (& lock);
+
+    if (level >= min_level)
+    {
+        va_list args;
+        va_start (args, format);
+        StringBuf message = str_vprintf (format, args);
+        va_end (args);
+
+        if (level >= stderr_level)
+            fprintf (stderr, "%s %s:%d [%s]: %s", get_level_name (level), file,
+             line, func, (const char *) message);
+
+        for (const HandlerData & h : handlers)
+        {
+            if (level >= h.level)
+                h.handler (level, file, line, func, message);
+        }
+    }
+
+    tiny_unlock_read (& lock);
+}
+
+} // namespace audlog
diff --git a/src/libaudcore/mainloop.cc b/src/libaudcore/mainloop.cc
new file mode 100644
index 000000000000..e97977042c9c
--- /dev/null
+++ b/src/libaudcore/mainloop.cc
@@ -0,0 +1,218 @@
+/*
+ * mainloop.cc
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "mainloop.h"
+
+#include <pthread.h>
+#include <glib.h>
+
+#include "runtime.h"
+
+struct QueuedFuncRunner
+{
+    QueuedFunc * queued;
+    QueuedFunc::Func func;
+    void * data;
+    int serial;
+
+    bool run ()
+    {
+        if (__sync_add_and_fetch (& queued->serial, 0) != serial)
+            return false;
+
+        func (data);
+        return true;
+    }
+};
+
+#ifdef USE_QT
+
+#include <QCoreApplication>
+
+class QueuedFuncEvent : public QEvent
+{
+public:
+    QueuedFuncEvent (const QueuedFuncRunner & runner) :
+        QEvent (User),
+        runner (runner) {}
+
+    void run ()
+        { runner.run (); }
+
+private:
+    QueuedFuncRunner runner;
+};
+
+class QueuedFuncRouter : public QObject
+{
+protected:
+    void customEvent (QEvent * event)
+        { dynamic_cast<QueuedFuncEvent *> (event)->run (); }
+};
+
+static QueuedFuncRouter router;
+
+class QueuedFuncTimer : public QObject
+{
+public:
+    QueuedFuncTimer (int interval_ms, const QueuedFuncRunner & runner) :
+        interval_ms (interval_ms),
+        runner (runner)
+    {
+        moveToThread (router.thread ());  // main thread
+
+        // The timer cannot be started until QCoreApplication is instantiated.
+        // Send ourselves an event and wait till it comes back, then start the timer.
+        QCoreApplication::postEvent (this, new QEvent (QEvent::User), Qt::HighEventPriority);
+    }
+
+protected:
+    void customEvent (QEvent * event)
+        { startTimer (interval_ms); }
+
+    void timerEvent (QTimerEvent * event)
+    {
+        if (! runner.run ())
+            deleteLater ();
+    }
+
+private:
+    int interval_ms;
+    QueuedFuncRunner runner;
+};
+
+static QCoreApplication * qt_mainloop;
+
+#endif // USE_QT
+
+static int queued_wrapper (void * ptr)
+{
+    auto runner = (QueuedFuncRunner *) ptr;
+    runner->run ();
+    delete runner;
+    return false;
+}
+
+static int timed_wrapper (void * ptr)
+{
+    auto runner = (QueuedFuncRunner *) ptr;
+    if (runner->run ())
+        return true;
+
+    delete runner;
+    return false;
+}
+
+static GMainLoop * glib_mainloop;
+
+EXPORT void QueuedFunc::queue (Func func, void * data)
+{
+    int new_serial = __sync_add_and_fetch (& serial, 1);
+
+#ifdef USE_QT
+    if (aud_get_mainloop_type () == MainloopType::Qt)
+        QCoreApplication::postEvent (& router,
+         new QueuedFuncEvent ({this, func, data, new_serial}),
+         Qt::HighEventPriority);
+    else
+#endif
+        g_idle_add_full (G_PRIORITY_HIGH, queued_wrapper,
+         new QueuedFuncRunner ({this, func, data, new_serial}), nullptr);
+}
+
+EXPORT void QueuedFunc::start (int interval_ms, Func func, void * data)
+{
+    _running = true;
+    int new_serial = __sync_add_and_fetch (& serial, 1);
+
+#ifdef USE_QT
+    if (aud_get_mainloop_type () == MainloopType::Qt)
+        new QueuedFuncTimer (interval_ms, {this, func, data, new_serial});
+    else
+#endif
+        g_timeout_add (interval_ms, timed_wrapper,
+         new QueuedFuncRunner ({this, func, data, new_serial}));
+}
+
+EXPORT void QueuedFunc::stop ()
+{
+    __sync_add_and_fetch (& serial, 1);
+    _running = false;
+}
+
+static pthread_mutex_t mainloop_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+EXPORT void mainloop_run ()
+{
+    pthread_mutex_lock (& mainloop_mutex);
+
+#ifdef USE_QT
+    if (aud_get_mainloop_type () == MainloopType::Qt)
+    {
+        if (! qt_mainloop)
+        {
+            int dummy_argc = 0;
+            qt_mainloop = new QCoreApplication (dummy_argc, nullptr);
+            pthread_mutex_unlock (& mainloop_mutex);
+
+            qt_mainloop->exec ();
+
+            pthread_mutex_lock (& mainloop_mutex);
+            delete qt_mainloop;
+            qt_mainloop = nullptr;
+        }
+    }
+    else
+#endif
+    {
+        if (! glib_mainloop)
+        {
+            glib_mainloop = g_main_loop_new (nullptr, true);
+            pthread_mutex_unlock (& mainloop_mutex);
+
+            g_main_loop_run (glib_mainloop);
+
+            pthread_mutex_lock (& mainloop_mutex);
+            g_main_loop_unref (glib_mainloop);
+            glib_mainloop = nullptr;
+        }
+    }
+
+    pthread_mutex_unlock (& mainloop_mutex);
+}
+
+EXPORT void mainloop_quit ()
+{
+    pthread_mutex_lock (& mainloop_mutex);
+
+#ifdef USE_QT
+    if (aud_get_mainloop_type () == MainloopType::Qt)
+    {
+        if (qt_mainloop)
+            qt_mainloop->quit ();
+    }
+    else
+#endif
+    {
+        if (glib_mainloop)
+            g_main_loop_quit (glib_mainloop);
+    }
+
+    pthread_mutex_unlock (& mainloop_mutex);
+}
diff --git a/src/libaudcore/mainloop.h b/src/libaudcore/mainloop.h
new file mode 100644
index 000000000000..7c7d615ac340
--- /dev/null
+++ b/src/libaudcore/mainloop.h
@@ -0,0 +1,50 @@
+/*
+ * mainloop.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+/* Main loop abstraction layer which can use either GLib or Qt as a backend.
+ * The API is completely thread-safe and can thus be used as a means to call
+ * back into the main thread from a worker thread. */
+
+#ifndef LIBAUDCORE_MAINLOOP_H
+#define LIBAUDCORE_MAINLOOP_H
+
+// all instances must be declared static
+class QueuedFunc
+{
+    friend struct QueuedFuncRunner;
+
+public:
+    typedef void (* Func) (void * data);
+
+    void queue (Func func, void * data);
+    void start (int interval_ms, Func func, void * data);
+    void stop ();
+
+    bool running ()
+        { return _running; }
+
+private:
+    int serial;
+    bool _running;
+};
+
+void mainloop_run ();
+void mainloop_quit ();
+
+#endif // LIBAUDCORE_MAINLOOP_H
diff --git a/src/libaudcore/multihash.c b/src/libaudcore/multihash.c
deleted file mode 100644
index 2be883915a4b..000000000000
--- a/src/libaudcore/multihash.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * multihash.c
- * Copyright 2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include "multihash.h"
-
-#include <glib.h>
-
-#define INITIAL_SIZE 256  /* must be a power of two */
-
-static void resize_channel (MultihashTable * table, MultihashChannel * channel, unsigned size)
-{
-    MultihashNode * * buckets = g_new0 (MultihashNode *, size);
-
-    for (int b1 = 0; b1 < channel->size; b1 ++)
-    {
-        MultihashNode * node = channel->buckets[b1];
-
-        while (node)
-        {
-            MultihashNode * next = node->next;
-
-            unsigned hash = table->hash_func (node);
-            unsigned b2 = (hash >> MULTIHASH_SHIFT) & (size - 1);
-            MultihashNode * * node_ptr = & buckets[b2];
-
-            node->next = * node_ptr;
-            * node_ptr = node;
-
-            node = next;
-        }
-    }
-
-    g_free (channel->buckets);
-    channel->buckets = buckets;
-    channel->size = size;
-}
-
-EXPORT int multihash_lookup (MultihashTable * table, const void * data,
- unsigned hash, MultihashAddFunc add, MultihashActionFunc action, void * state)
-{
-    unsigned c = hash & (MULTIHASH_CHANNELS - 1);
-    MultihashChannel * channel = & table->channels[c];
-
-    int status = 0;
-    tiny_lock (& channel->lock);
-
-    if (! channel->buckets)
-    {
-        if (! add)
-            goto DONE;
-
-        channel->buckets = g_new0 (MultihashNode *, INITIAL_SIZE);
-        channel->size = INITIAL_SIZE;
-        channel->used = 0;
-    }
-
-    unsigned b = (hash >> MULTIHASH_SHIFT) & (channel->size - 1);
-    MultihashNode * * node_ptr = & channel->buckets[b];
-    MultihashNode * node = * node_ptr;
-
-    while (node && ! table->match_func (node, data, hash))
-    {
-        node_ptr = & node->next;
-        node = * node_ptr;
-    }
-
-    if (node)
-    {
-        status |= MULTIHASH_FOUND;
-
-        MultihashNode * next = node->next;
-
-        if (action && action (node, state))
-        {
-            status |= MULTIHASH_REMOVED;
-
-            * node_ptr = next;
-
-            channel->used --;
-            if (channel->used < channel->size >> 2 && channel->size > INITIAL_SIZE)
-                resize_channel (table, channel, channel->size >> 1);
-        }
-    }
-    else if (add && (node = add (data, hash, state)))
-    {
-        status |= MULTIHASH_ADDED;
-
-        * node_ptr = node;
-        node->next = NULL;
-
-        channel->used ++;
-        if (channel->used > channel->size)
-            resize_channel (table, channel, channel->size << 1);
-    }
-
-DONE:
-    tiny_unlock (& channel->lock);
-    return status;
-}
-
-EXPORT void multihash_iterate (MultihashTable * table, MultihashActionFunc action, void * state)
-{
-    for (int c = 0; c < MULTIHASH_CHANNELS; c ++)
-        tiny_lock (& table->channels[c].lock);
-
-    for (int c = 0; c < MULTIHASH_CHANNELS; c ++)
-    {
-        MultihashChannel * channel = & table->channels[c];
-
-        for (int b = 0; b < channel->size; b ++)
-        {
-            MultihashNode * * node_ptr = & channel->buckets[b];
-            MultihashNode * node = * node_ptr;
-
-            while (node)
-            {
-                MultihashNode * next = node->next;
-
-                if (action (node, state))
-                {
-                    * node_ptr = next;
-                    channel->used --;
-                }
-                else
-                    node_ptr = & node->next;
-
-                node = next;
-            }
-        }
-
-        if (channel->used < channel->size >> 2 && channel->size > INITIAL_SIZE)
-            resize_channel (table, channel, channel->size >> 1);
-    }
-
-    for (int c = 0; c < MULTIHASH_CHANNELS; c ++)
-        tiny_unlock (& table->channels[c].lock);
-}
diff --git a/src/libaudcore/multihash.cc b/src/libaudcore/multihash.cc
new file mode 100644
index 000000000000..160239c9a24d
--- /dev/null
+++ b/src/libaudcore/multihash.cc
@@ -0,0 +1,173 @@
+/*
+ * multihash.c
+ * Copyright 2013-2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "multihash.h"
+
+EXPORT void HashBase::add (Node * node, unsigned hash)
+{
+    if (! buckets)
+    {
+        buckets = new Node *[InitialSize]();
+        size = InitialSize;
+    }
+
+    unsigned b = hash & (size - 1);
+    node->next = buckets[b];
+    node->hash = hash;
+    buckets[b] = node;
+
+    used ++;
+    if (used > size)
+        resize (size << 1);
+}
+
+EXPORT HashBase::Node * HashBase::lookup (MatchFunc match, const void * data,
+ unsigned hash, NodeLoc * loc) const
+{
+    if (! buckets)
+        return nullptr;
+
+    unsigned b = hash & (size - 1);
+    Node * * node_ptr = & buckets[b];
+    Node * node = * node_ptr;
+
+    while (1)
+    {
+        if (! node)
+            return nullptr;
+
+        if (node->hash == hash && match (node, data))
+            break;
+
+        node_ptr = & node->next;
+        node = * node_ptr;
+    }
+
+    if (loc)
+    {
+        loc->ptr = node_ptr;
+        loc->next = node->next;
+    }
+
+    return node;
+}
+
+EXPORT void HashBase::remove (const NodeLoc & loc)
+{
+    * loc.ptr = loc.next;
+
+    used --;
+    if (used < size >> 2 && size > InitialSize)
+        resize (size >> 1);
+}
+
+EXPORT void HashBase::iterate (FoundFunc func, void * state)
+{
+    for (unsigned b = 0; b < size; b ++)
+    {
+        Node * * ptr = & buckets[b];
+        Node * node = * ptr;
+
+        while (node)
+        {
+            Node * next = node->next;
+
+            if (func (node, state))
+            {
+                * ptr = next;
+                used --;
+            }
+            else
+                ptr = & node->next;
+
+            node = next;
+        }
+    }
+
+    if (used < size >> 2 && size > InitialSize)
+        resize (size >> 1);
+}
+
+void HashBase::resize (unsigned new_size)
+{
+    Node * * new_buckets = new Node *[new_size]();
+
+    for (unsigned b1 = 0; b1 < size; b1 ++)
+    {
+        Node * node = buckets[b1];
+
+        while (node)
+        {
+            Node * next = node->next;
+
+            unsigned b2 = node->hash & (new_size - 1);
+            node->next = new_buckets[b2];
+            new_buckets[b2] = node;
+
+            node = next;
+        }
+    }
+
+    delete[] buckets;
+    buckets = new_buckets;
+    size = new_size;
+}
+
+EXPORT int MultiHash::lookup (const void * data, unsigned hash, AddFunc add,
+ FoundFunc found, void * state)
+{
+    const unsigned c = (hash >> Shift) & (Channels - 1);
+    HashBase & channel = channels[c];
+
+    int status = 0;
+    tiny_lock (& locks[c]);
+
+    HashBase::NodeLoc loc;
+    Node * node = channel.lookup (match, data, hash, & loc);
+
+    if (node)
+    {
+        status |= Found;
+        if (found && found (node, state))
+        {
+            status |= Removed;
+            channel.remove (loc);
+        }
+    }
+    else if (add && (node = add (data, state)))
+    {
+        status |= Added;
+        channel.add (node, hash);
+    }
+
+    tiny_unlock (& locks[c]);
+    return status;
+}
+
+EXPORT void MultiHash::iterate (FoundFunc func, void * state)
+{
+    for (TinyLock & lock : locks)
+        tiny_lock (& lock);
+
+    for (HashBase & channel : channels)
+        channel.iterate (func, state);
+
+    for (TinyLock & lock : locks)
+        tiny_unlock (& lock);
+}
diff --git a/src/libaudcore/multihash.h b/src/libaudcore/multihash.h
index 1e66b216a676..186e1958eb05 100644
--- a/src/libaudcore/multihash.h
+++ b/src/libaudcore/multihash.h
@@ -1,6 +1,6 @@
 /*
  * multihash.h
- * Copyright 2013 John Lindgren
+ * Copyright 2013-2014 John Lindgren
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -20,76 +20,207 @@
 #ifndef LIBAUDCORE_MULTIHASH_H
 #define LIBAUDCORE_MULTIHASH_H
 
-#include <libaudcore/core.h>
+#include <utility>
 #include <libaudcore/tinylock.h>
 
-/* Multihash is a generic, thread-safe hash table.  It scales well to multiple
+/* HashBase is a low-level hash table implementation.  It is used as a backend
+ * for SimpleHash as well as for a single channel of MultiHash. */
+
+class HashBase
+{
+public:
+    /* Skeleton structure containing internal members of a hash node.  Actual
+     * node structures should be defined with Node as the first member. */
+    struct Node {
+        Node * next;
+        unsigned hash;
+    };
+
+    /* Represents the location of a node within the table. */
+    struct NodeLoc {
+        Node * * ptr;
+        Node * next;
+    };
+
+    /* Callback.  Returns true if <node> matches <data>, otherwise false. */
+    typedef bool (* MatchFunc) (const Node * node, const void * data);
+
+    /* Callback.  Called when a node is found.  Returns true if <node> is to be
+     * removed, otherwise false. */
+    typedef bool (* FoundFunc) (Node * node, void * state);
+
+    constexpr HashBase () :
+        buckets (nullptr),
+        size (0),
+        used (0) {}
+
+    ~HashBase ()
+        { delete[] buckets; }
+
+    int n_items () const
+        { return used; }
+
+    /* Adds a node.  Does not check for duplicates. */
+    void add (Node * node, unsigned hash);
+
+    /* Locates the node matching <data>.  Returns null if no node is found.  If
+     * <loc> is not null, also returns the location of the node, which can be
+     * used to remove it from the table. */
+    Node * lookup (MatchFunc match, const void * data, unsigned hash,
+     NodeLoc * loc = nullptr) const;
+
+    /* Removes a node, given a location returned by lookup_full(). */
+    void remove (const NodeLoc & loc);
+
+    /* Iterates over all nodes in the table, removing them as desired. */
+    void iterate (FoundFunc func, void * state);
+
+private:
+    static constexpr unsigned InitialSize = 16;
+
+    void resize (unsigned new_size);
+
+    Node * * buckets;
+    unsigned size, used;
+};
+
+/* MultiHash is a generic, thread-safe hash table.  It scales well to multiple
  * processors by the use of multiple channels, each with a separate lock.  The
  * hash value of a given node decides what channel it is stored in.  Hence,
  * different processors will tend to hit different channels, keeping lock
- * contention to a minimum.  The data structures are public in order to allow
- * static initialization (setting all bytes to zero gives the initial state).
- * The all-purpose lookup function enables a variety of atomic operations, such
- * as allocating and adding a node only if not already present. */
-
-#define MULTIHASH_CHANNELS 16  /* must be a power of two */
-#define MULTIHASH_SHIFT     4  /* log (base 2) of MULTIHASH_CHANNELS */
-
-#define MULTIHASH_FOUND    (1 << 0)
-#define MULTIHASH_ADDED    (1 << 1)
-#define MULTIHASH_REMOVED  (1 << 2)
-
-/* Skeleton structure containing internal member(s) of a multihash node.  Actual
- * node structures should be defined with MultihashNode as the first member. */
-typedef struct _MultihashNode {
-    struct _MultihashNode * next;
-} MultihashNode;
-
-/* Single channel of a multihash table.  For internal use only. */
-typedef struct {
-    TinyLock lock;
-    MultihashNode * * buckets;
-    unsigned size, used;
-} MultihashChannel;
-
-/* Callback.  Calculates (or retrieves) the hash value of <node>. */
-typedef unsigned (* MultihashFunc) (const MultihashNode * node);
-
-/* Callback.  Returns TRUE if <node> matches <data>, otherwise FALSE. */
-typedef bool_t (* MultihashMatchFunc) (const MultihashNode * node,
- const void * data, unsigned hash);
-
-/* Multihash table.  <hash_func> and <match_func> should be initialized to
- * functions appropriate for the type of data to be stored in the table. */
-typedef struct {
-    MultihashFunc hash_func;
-    MultihashMatchFunc match_func;
-    MultihashChannel channels[MULTIHASH_CHANNELS];
-} MultihashTable;
-
-/* Callback.  May create a new node representing <data> to be added to the
- * table.  Returns the new node or NULL. */
-typedef MultihashNode * (* MultihashAddFunc) (const void * data, unsigned hash, void * state);
-
-/* Callback.  Performs a user-defined action when a matching node is found.
- * Doubles as a node removal function.  Returns TRUE if <node> was freed and is
- * to be removed, otherwise FALSE. */
-typedef bool_t (* MultihashActionFunc) (MultihashNode * node, void * state);
-
-/* All-purpose lookup function.  The caller passes in the data to be looked up
- * along with its hash value.  The two callbacks are optional.  <add> (if not
- * NULL) is called if no matching node is found, and may return a new node to
- * add to the table.  <action> (if not NULL) is called if a matching node is
- * found, and may return TRUE to remove the node from the table.  <state> is
- * forwarded to either callback.  Returns the status of the lookup as a bitmask
- * of MULTIHASH_FOUND, MULTIHASH_ADDED, and MULTIHASH_REMOVED. */
-int multihash_lookup (MultihashTable * table, const void * data, unsigned hash,
- MultihashAddFunc add, MultihashActionFunc action, void * state);
-
-/* All-purpose iteration function.  All channels of the table are locked
- * simultaneously during the iteration to freeze the table in a consistent
- * state.  <action> is called on each node in order, and may return TRUE to
- * remove the node from the table.  <state> is forwarded to <action>. */
-void multihash_iterate (MultihashTable * table, MultihashActionFunc action, void * state);
+ * contention to a minimum.  The all-purpose lookup function enables a variety
+ * of atomic operations, such as allocating and adding a node only if not
+ * already present. */
+
+class MultiHash
+{
+public:
+    static constexpr int Found = 1 << 0;
+    static constexpr int Added = 1 << 1;
+    static constexpr int Removed = 1 << 2;
+
+    typedef HashBase::Node Node;
+    typedef HashBase::MatchFunc MatchFunc;
+    typedef HashBase::FoundFunc FoundFunc;
+
+    /* Callback.  May create a new node representing <data> to be added to the
+     * table.  Returns the new node or null. */
+    typedef Node * (* AddFunc) (const void * data, void * state);
+
+    MultiHash (MatchFunc match) :
+        match (match),
+        locks (),
+        channels () {}
+
+    /* All-purpose lookup function.  The caller passes in the data to be looked
+     * up along with its hash value.  The two callbacks are optional.  <add> is
+     * called if no matching node is found, and may return a new node to add to
+     * the table.  <found> is called if a matching node is found, and may return
+     * true to remove the node from the table.  Returns the status of the lookup
+     * as a bitmask of Found, Added, and Removed. */
+    int lookup (const void * data, unsigned hash, AddFunc add, FoundFunc found, void * state);
+
+    /* All-purpose iteration function.  All channels of the table are locked
+     * simultaneously during the iteration to freeze the table in a consistent
+     * state.  <func> is called on each node in order, and may return true to
+     * remove the node from the table. */
+    void iterate (FoundFunc func, void * state);
+
+private:
+    static constexpr int Channels = 16;  /* must be a power of two */
+    static constexpr int Shift = 24;  /* bit shift for channel selection */
+
+    const MatchFunc match;
+    TinyLock locks[Channels];
+    HashBase channels[Channels];
+};
+
+template<class Key, class Value>
+class SimpleHash : private HashBase
+{
+public:
+    typedef void (* IterFunc) (const Key & key, Value & value, void * state);
+
+    ~SimpleHash ()
+        { clear (); }
+
+    using HashBase::n_items;
+
+    Value * lookup (const Key & key)
+    {
+        Node * node = (Node *) HashBase::lookup (match_cb, & key, key.hash ());
+        return node ? & node->value : nullptr;
+    }
+
+    Value * add (const Key & key, Value && value)
+    {
+        unsigned hash = key.hash ();
+        Node * node = (Node *) HashBase::lookup (match_cb, & key, hash);
+
+        if (node)
+            node->value = std::move (value);
+        else
+        {
+            node = new Node (key, std::move (value));
+            HashBase::add (node, hash);
+        }
+
+        return & node->value;
+    }
+
+    void remove (const Key & key)
+    {
+        NodeLoc loc;
+        Node * node = (Node *) HashBase::lookup (match_cb, & key, key.hash (), & loc);
+
+        if (node)
+        {
+            delete node;
+            HashBase::remove (loc);
+        }
+    }
+
+    void iterate (IterFunc func, void * state)
+    {
+        IterData data = {func, state};
+        HashBase::iterate (iterate_cb, & data);
+    }
+
+    void clear ()
+        { HashBase::iterate (remove_cb, nullptr); }
+
+private:
+    struct Node : public HashBase::Node
+    {
+        Node (const Key & key, Value && value) :
+            key (key),
+            value (std::move (value)) {}
+
+        Key key;
+        Value value;
+    };
+
+    struct IterData {
+        IterFunc func;
+        void * state;
+    };
+
+    static bool match_cb (const HashBase::Node * node, const void * data)
+        { return ((const Node *) node)->key == * (const Key *) data; }
+
+    static bool remove_cb (HashBase::Node * node, void *)
+    {
+        delete (Node *) node;
+        return true;
+    }
+
+    static bool iterate_cb (HashBase::Node * node0, void * data0)
+    {
+        Node * node = (Node *) node0;
+        IterData * data = (IterData *) data0;
+        data->func (node->key, node->value, data->state);
+        return false;
+    }
+};
 
 #endif /* LIBAUDCORE_MULTIHASH_H */
diff --git a/src/libaudcore/objects.h b/src/libaudcore/objects.h
new file mode 100644
index 000000000000..d6bce0f0f8e3
--- /dev/null
+++ b/src/libaudcore/objects.h
@@ -0,0 +1,272 @@
+/*
+ * objects.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_OBJECTS_H
+#define LIBAUDCORE_OBJECTS_H
+
+#include <libaudcore/templates.h>
+
+// Stores array pointer together with deduced array length.
+
+template<class T>
+struct ArrayRef
+{
+    const T * data;
+    int len;
+
+    constexpr ArrayRef (decltype (nullptr) = nullptr) :
+        data (nullptr),
+        len (0) {}
+
+    template<int N>
+    constexpr ArrayRef (const T (& array) [N]) :
+        data (array),
+        len (N) {}
+
+    constexpr ArrayRef (const T * data, int len) :
+        data (data),
+        len (len) {}
+
+    const T * begin () const
+        { return data; }
+    const T * end () const
+        { return data + len; }
+};
+
+// Smart pointer.  Deletes object pointed to when the pointer goes out of scope.
+
+template<class T>
+class SmartPtr
+{
+public:
+    explicit constexpr SmartPtr (T * ptr = nullptr) :
+        ptr (ptr) {}
+
+    ~SmartPtr ()
+        { delete ptr; }
+
+    void capture (T * ptr2)
+    {
+        delete ptr;
+        ptr = ptr2;
+    }
+
+    void clear ()
+        { capture (nullptr); }
+
+    SmartPtr (SmartPtr && b) :
+        ptr (b.ptr)
+    {
+        b.ptr = nullptr;
+    }
+
+    SmartPtr & operator= (SmartPtr && b)
+    {
+        if (this != & b)
+        {
+            capture (b.ptr);
+            b.ptr = nullptr;
+        }
+        return * this;
+    }
+
+    explicit operator bool () const
+        { return (bool) ptr; }
+
+    T * get ()
+        { return ptr; }
+    const T * get () const
+        { return ptr; }
+    T & operator* ()
+        { return (* ptr); }
+    const T & operator* () const
+        { return (* ptr); }
+    T * operator-> ()
+        { return ptr; }
+    const T * operator-> () const
+        { return ptr; }
+
+private:
+    T * ptr;
+};
+
+template<class T, class ... Args>
+SmartPtr<T> SmartNew (Args && ... args)
+{
+    return SmartPtr<T> (aud::construct<T>::make (operator new (sizeof (T)),
+     std::forward<Args> (args) ...));
+}
+
+// Wrapper class for a string stored in the string pool.
+
+class String
+{
+public:
+    constexpr String () :
+        raw (nullptr) {}
+
+    ~String ()
+        { raw_unref (raw); }
+
+    String (const String & b) :
+        raw (raw_ref (b.raw)) {}
+
+    String & operator= (const String & b)
+    {
+        if (this != & b)
+        {
+            raw_unref (raw);
+            raw = raw_ref (b.raw);
+        }
+        return * this;
+    }
+
+    String (String && b) :
+        raw (b.raw)
+    {
+        b.raw = nullptr;
+    }
+
+    String & operator= (String && b)
+    {
+        if (this != & b)
+        {
+            raw_unref (raw);
+            raw = b.raw;
+            b.raw = nullptr;
+        }
+        return * this;
+    }
+
+    bool operator== (const String & b) const
+        { return raw_equal (raw, b.raw); }
+
+    explicit String (const char * str) :
+        raw (raw_get (str)) {}
+
+    String (decltype (nullptr)) = delete;
+
+    operator const char * () const
+        { return raw; }
+
+    unsigned hash () const
+        { return raw_hash (raw); }
+
+    // raw interface
+    // avoid using where possible
+
+    static String from_raw (char * str)
+    {
+        String s;
+        s.raw = str;
+        return s;
+    }
+
+    char * to_raw ()
+    {
+        char * str = raw;
+        raw = nullptr;
+        return str;
+    }
+
+    static char * raw_get (const char * str);
+    static char * raw_ref (const char * str);
+    static void raw_unref (char * str);
+    static unsigned raw_hash (const char * str);
+    static bool raw_equal (const char * str1, const char * str2);
+
+private:
+    char * raw;
+};
+
+struct StringStack;
+
+// Mutable string buffer, allocated on a stack to allow fast allocation.  The
+// price for this speed is that only the top string in the stack (i.e. the one
+// most recently allocated) can be resized or deleted.  The string is always
+// null-terminated (i.e. str[str.len ()] == 0).  Rules for the correct use of
+// StringBuf can be summarized as follows:
+//
+//   1. Always declare StringBufs within function or block scope, never at file
+//      or class scope.  Do not attempt to create a StringBuf with new or
+//      malloc().
+//   2. Only the first StringBuf declared in a function can be used as the
+//      return value.  It is possible to create a second StringBuf and then
+//      transfer its contents to the first with steal(), but doing so carries
+//      a performance penalty.
+//   3. Do not truncate the StringBuf by inserting null characters manually;
+//      instead, use resize().
+
+class StringBuf
+{
+public:
+    constexpr StringBuf () :
+        stack (nullptr),
+        m_data (nullptr),
+        m_len (0) {}
+
+    // A length of -1 means to use all available space.  This can be useful when
+    // the final length of the string is not known in advance, but keep in mind
+    // that you will not be able to create any further StringBufs until you call
+    // resize().  Also, the string will not be null-terminated in this case.
+    explicit StringBuf (int len) :
+        stack (nullptr),
+        m_data (nullptr),
+        m_len (0)
+    {
+        resize (len);
+    }
+
+    StringBuf (StringBuf && other) :
+        stack (other.stack),
+        m_data (other.m_data),
+        m_len (other.m_len)
+    {
+        other.stack = nullptr;
+        other.m_data = nullptr;
+        other.m_len = 0;
+    }
+
+    // only allowed for top (or null) string
+    ~StringBuf ();
+
+    // only allowed for top (or null) string
+    void resize (int size);
+    void insert (int pos, const char * s, int len = -1);
+    void remove (int pos, int len);
+
+    // only allowed for top two strings (or when one string is null)
+    void steal (StringBuf && other);
+
+    // only allowed for top two strings
+    void combine (StringBuf && other);
+
+    int len () const
+        { return m_len; }
+
+    operator char * ()
+        { return m_data; }
+
+private:
+    StringStack * stack;
+    char * m_data;
+    int m_len;
+};
+
+#endif // LIBAUDCORE_OBJECTS_H
diff --git a/src/libaudcore/output.cc b/src/libaudcore/output.cc
new file mode 100644
index 000000000000..972352c450e1
--- /dev/null
+++ b/src/libaudcore/output.cc
@@ -0,0 +1,582 @@
+/*
+ * output.c
+ * Copyright 2009-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "drct.h"
+#include "output.h"
+#include "runtime.h"
+
+#include <math.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "equalizer.h"
+#include "internal.h"
+#include "plugin.h"
+#include "plugins.h"
+
+static pthread_mutex_t mutex_major = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t mutex_minor = PTHREAD_MUTEX_INITIALIZER;
+
+#define LOCK_MAJOR pthread_mutex_lock (& mutex_major)
+#define UNLOCK_MAJOR pthread_mutex_unlock (& mutex_major)
+#define LOCK_MINOR pthread_mutex_lock (& mutex_minor)
+#define UNLOCK_MINOR pthread_mutex_unlock (& mutex_minor)
+#define LOCK_ALL do { LOCK_MAJOR; LOCK_MINOR; } while (0)
+#define UNLOCK_ALL do { UNLOCK_MINOR; UNLOCK_MAJOR; } while (0)
+
+/* State variables.  State changes that are allowed between LOCK_MINOR and
+ * UNLOCK_MINOR (all others must take place between LOCK_ALL and UNLOCK_ALL):
+ * s_paused -> true or false, s_flushed -> true, s_resetting -> true */
+
+static bool s_input; /* input plugin connected */
+static bool s_output; /* output plugin connected */
+static bool s_gain; /* replay gain info set */
+static bool s_paused; /* paused */
+static bool s_flushed; /* flushed, writes ignored until resume */
+static bool s_resetting; /* resetting output system */
+
+/* Condition variable linked to LOCK_MINOR.
+ * The input thread will wait if the following is true:
+ *   ((! s_output || s_resetting) && ! s_flushed)
+ * Hence you must signal if you cause the inverse to be true:
+ *   ((s_output && ! s_resetting) || s_flushed) */
+
+static pthread_cond_t cond_minor = PTHREAD_COND_INITIALIZER;
+
+#define SIGNAL_MINOR pthread_cond_broadcast (& cond_minor)
+#define WAIT_MINOR pthread_cond_wait (& cond_minor, & mutex_minor)
+
+static OutputPlugin * cop;
+static int seek_time;
+static String in_filename;
+static Tuple in_tuple;
+static int in_format, in_channels, in_rate;
+static int out_format, out_channels, out_rate;
+static int out_bytes_per_sec, out_bytes_held;
+static int64_t in_frames, out_bytes_written;
+static ReplayGainInfo gain_info;
+
+static bool change_op;
+static OutputPlugin * new_op;
+
+static Index<float> buffer1;
+static Index<char> buffer2;
+
+static inline int get_format ()
+{
+    switch (aud_get_int (0, "output_bit_depth"))
+    {
+        case 16: return FMT_S16_NE;
+        case 24: return FMT_S24_NE;
+        case 32: return FMT_S32_NE;
+        default: return FMT_FLOAT;
+    }
+}
+
+/* assumes LOCK_ALL, s_output */
+static void cleanup_output ()
+{
+    if (! s_paused && ! s_flushed && ! s_resetting)
+    {
+        UNLOCK_MINOR;
+        cop->drain ();
+        LOCK_MINOR;
+    }
+
+    s_output = false;
+
+    buffer1.clear ();
+    buffer2.clear ();
+
+    effect_flush (true);
+    cop->close_audio ();
+    vis_runner_start_stop (false, false);
+}
+
+/* assumes LOCK_ALL, s_output */
+static void apply_pause ()
+{
+    cop->pause (s_paused);
+    vis_runner_start_stop (true, s_paused);
+}
+
+/* assumes LOCK_ALL, s_input */
+static void setup_output ()
+{
+    int format = get_format ();
+    int channels = in_channels;
+    int rate = in_rate;
+
+    effect_start (channels, rate);
+    eq_set_format (channels, rate);
+
+    if (s_output && format == out_format && channels == out_channels && rate ==
+     out_rate && ! cop->force_reopen)
+    {
+        AUDINFO ("Reusing output stream, format %d, %d channels, %d Hz.\n", format, channels, rate);
+        return;
+    }
+
+    if (s_output)
+        cleanup_output ();
+
+    if (! cop)
+        return;
+
+    cop->set_info (in_filename, in_tuple);
+    if (! cop->open_audio (format, rate, channels))
+        return;
+
+    AUDINFO ("Opened output stream, format %d, %d channels, %d Hz.\n", format, channels, rate);
+
+    s_output = true;
+
+    out_format = format;
+    out_channels = channels;
+    out_rate = rate;
+    out_bytes_per_sec = FMT_SIZEOF (format) * channels * rate;
+    out_bytes_held = 0;
+    out_bytes_written = 0;
+
+    apply_pause ();
+
+    if (! s_flushed && ! s_resetting)
+        SIGNAL_MINOR;
+}
+
+/* assumes LOCK_MINOR, s_output */
+static bool flush_output (bool force)
+{
+    if (! effect_flush (force))
+        return false;
+
+    out_bytes_held = 0;
+    out_bytes_written = 0;
+
+    cop->flush ();
+    vis_runner_flush ();
+    return true;
+}
+
+static void apply_replay_gain (Index<float> & data)
+{
+    if (! aud_get_bool (0, "enable_replay_gain"))
+        return;
+
+    float factor = powf (10, aud_get_double (0, "replay_gain_preamp") / 20);
+
+    if (s_gain)
+    {
+        float peak;
+
+        if (aud_get_bool (0, "replay_gain_album"))
+        {
+            factor *= powf (10, gain_info.album_gain / 20);
+            peak = gain_info.album_peak;
+        }
+        else
+        {
+            factor *= powf (10, gain_info.track_gain / 20);
+            peak = gain_info.track_peak;
+        }
+
+        if (aud_get_bool (0, "enable_clipping_prevention") && peak * factor > 1)
+            factor = 1 / peak;
+    }
+    else
+        factor *= powf (10, aud_get_double (0, "default_gain") / 20);
+
+    if (factor < 0.99 || factor > 1.01)
+        audio_amplify (data.begin (), 1, data.len (), & factor);
+}
+
+/* assumes LOCK_ALL, s_output */
+static void write_output_raw (Index<float> & data)
+{
+    if (! data.len ())
+        return;
+
+    int out_time = aud::rescale<int64_t> (out_bytes_written, out_bytes_per_sec, 1000);
+    vis_runner_pass_audio (out_time, data, out_channels, out_rate);
+
+    eq_filter (data.begin (), data.len ());
+
+    if (aud_get_bool (0, "software_volume_control"))
+    {
+        StereoVolume v = {aud_get_int (0, "sw_volume_left"), aud_get_int (0, "sw_volume_right")};
+        audio_amplify (data.begin (), out_channels, data.len () / out_channels, v);
+    }
+
+    if (aud_get_bool (0, "soft_clipping"))
+        audio_soft_clip (data.begin (), data.len ());
+
+    const void * out_data = data.begin ();
+
+    if (out_format != FMT_FLOAT)
+    {
+        buffer2.resize (FMT_SIZEOF (out_format) * data.len ());
+        audio_to_int (data.begin (), buffer2.begin (), out_format, data.len ());
+        out_data = buffer2.begin ();
+    }
+
+    out_bytes_held = FMT_SIZEOF (out_format) * data.len ();
+
+    while (! s_flushed && ! s_resetting)
+    {
+        int written = cop->write_audio (out_data, out_bytes_held);
+
+        out_data = (char *) out_data + written;
+        out_bytes_held -= written;
+        out_bytes_written += written;
+
+        if (! out_bytes_held)
+            break;
+
+        UNLOCK_MINOR;
+        cop->period_wait ();
+        LOCK_MINOR;
+    }
+}
+
+/* assumes LOCK_ALL, s_input, s_output */
+static bool write_output (const void * data, int size, int stop_time)
+{
+    int samples = size / FMT_SIZEOF (in_format);
+    bool stopped = false;
+
+    if (stop_time != -1)
+    {
+        int64_t frames_left = aud::rescale<int64_t> (stop_time - seek_time, 1000, in_rate) - in_frames;
+        int64_t samples_left = in_channels * aud::max ((int64_t) 0, frames_left);
+
+        if (samples >= samples_left)
+        {
+            samples = samples_left;
+            stopped = true;
+        }
+    }
+
+    in_frames += samples / in_channels;
+
+    buffer1.resize (samples);
+
+    if (in_format == FMT_FLOAT)
+        memcpy (buffer1.begin (), data, sizeof (float) * samples);
+    else
+        audio_from_int (data, in_format, buffer1.begin (), samples);
+
+    apply_replay_gain (buffer1);
+    write_output_raw (effect_process (buffer1));
+
+    return ! stopped;
+}
+
+/* assumes LOCK_ALL, s_output */
+static void finish_effects (bool end_of_playlist)
+{
+    buffer1.resize (0);
+    write_output_raw (effect_finish (buffer1, end_of_playlist));
+}
+
+bool output_open_audio (const String & filename, const Tuple & tuple,
+ int format, int rate, int channels, int start_time)
+{
+    /* prevent division by zero */
+    if (rate < 1 || channels < 1 || channels > AUD_MAX_CHANNELS)
+        return false;
+
+    LOCK_ALL;
+
+    if (s_output && s_paused)
+    {
+        if (! s_flushed && ! s_resetting)
+            flush_output (true);
+
+        s_paused = false;
+        apply_pause ();
+    }
+
+    s_input = true;
+    s_gain = s_paused = s_flushed = false;
+    seek_time = start_time;
+
+    in_filename = filename;
+    in_tuple = tuple.ref ();
+    in_format = format;
+    in_channels = channels;
+    in_rate = rate;
+    in_frames = 0;
+
+    setup_output ();
+
+    UNLOCK_ALL;
+    return true;
+}
+
+void output_set_replay_gain (const ReplayGainInfo & info)
+{
+    LOCK_ALL;
+
+    if (s_input)
+    {
+        gain_info = info;
+        s_gain = true;
+
+        AUDINFO ("Replay Gain info:\n");
+        AUDINFO (" album gain: %f dB\n", info.album_gain);
+        AUDINFO (" album peak: %f\n", info.album_peak);
+        AUDINFO (" track gain: %f dB\n", info.track_gain);
+        AUDINFO (" track peak: %f\n", info.track_peak);
+    }
+
+    UNLOCK_ALL;
+}
+
+/* returns false if stop_time is reached */
+bool output_write_audio (const void * data, int size, int stop_time)
+{
+RETRY:
+    LOCK_ALL;
+    bool good = false;
+
+    if (s_input && ! s_flushed)
+    {
+        if (! s_output || s_resetting)
+        {
+            UNLOCK_MAJOR;
+            WAIT_MINOR;
+            UNLOCK_MINOR;
+            goto RETRY;
+        }
+
+        good = write_output (data, size, stop_time);
+    }
+
+    UNLOCK_ALL;
+    return good;
+}
+
+void output_flush (int time, bool force)
+{
+    LOCK_MINOR;
+
+    if (s_input && ! s_flushed)
+    {
+        if (s_output && ! s_resetting)
+        {
+            // allow effect plugins to prevent the flush, but
+            // always flush if paused to prevent locking up
+            s_flushed = flush_output (s_paused || force);
+        }
+        else
+        {
+            s_flushed = true;
+            SIGNAL_MINOR;
+        }
+    }
+
+    if (s_input)
+    {
+        seek_time = time;
+        in_frames = 0;
+    }
+
+    UNLOCK_MINOR;
+}
+
+void output_resume ()
+{
+    LOCK_ALL;
+
+    if (s_input)
+        s_flushed = false;
+
+    UNLOCK_ALL;
+}
+
+void output_pause (bool pause)
+{
+    LOCK_MINOR;
+
+    if (s_input)
+    {
+        s_paused = pause;
+
+        if (s_output)
+            apply_pause ();
+    }
+
+    UNLOCK_MINOR;
+}
+
+int output_get_time ()
+{
+    LOCK_MINOR;
+    int time = 0, delay = 0;
+
+    if (s_input)
+    {
+        if (s_output)
+        {
+            delay = cop->get_delay ();
+            delay += aud::rescale<int64_t> (out_bytes_held, out_bytes_per_sec, 1000);
+        }
+
+        delay = effect_adjust_delay (delay);
+        time = aud::rescale<int64_t> (in_frames, in_rate, 1000);
+        time = seek_time + aud::max (time - delay, 0);
+    }
+
+    UNLOCK_MINOR;
+    return time;
+}
+
+int output_get_raw_time ()
+{
+    LOCK_MINOR;
+    int time = 0;
+
+    if (s_output)
+    {
+        time = aud::rescale<int64_t> (out_bytes_written, out_bytes_per_sec, 1000);
+        time = aud::max (time - cop->get_delay (), 0);
+    }
+
+    UNLOCK_MINOR;
+    return time;
+}
+
+void output_close_audio ()
+{
+    LOCK_ALL;
+
+    if (s_input)
+    {
+        s_input = false;
+        in_filename = String ();
+        in_tuple = Tuple ();
+
+        if (s_output && ! (s_paused || s_flushed || s_resetting))
+            finish_effects (false); /* first time for end of song */
+    }
+
+    UNLOCK_ALL;
+}
+
+void output_drain ()
+{
+    LOCK_ALL;
+
+    if (! s_input && s_output)
+    {
+        finish_effects (true); /* second time for end of playlist */
+        cleanup_output ();
+    }
+
+    UNLOCK_ALL;
+}
+
+EXPORT void aud_output_reset (OutputReset type)
+{
+    LOCK_MINOR;
+
+    s_resetting = true;
+
+    if (s_output && ! s_flushed)
+        flush_output (true);
+
+    UNLOCK_MINOR;
+    LOCK_ALL;
+
+    if (s_output && type != OutputReset::EffectsOnly)
+        cleanup_output ();
+
+    if (type == OutputReset::ResetPlugin)
+    {
+        if (cop)
+            cop->cleanup ();
+
+        if (change_op)
+            cop = new_op;
+
+        if (cop && ! cop->init ())
+            cop = nullptr;
+    }
+
+    if (s_input)
+        setup_output ();
+
+    s_resetting = false;
+
+    if (s_output && ! s_flushed)
+        SIGNAL_MINOR;
+
+    UNLOCK_ALL;
+}
+
+EXPORT StereoVolume aud_drct_get_volume ()
+{
+    StereoVolume volume = {0, 0};
+    LOCK_MINOR;
+
+    if (aud_get_bool (0, "software_volume_control"))
+        volume = {aud_get_int (0, "sw_volume_left"), aud_get_int (0, "sw_volume_right")};
+    else if (cop)
+        volume = cop->get_volume ();
+
+    UNLOCK_MINOR;
+    return volume;
+}
+
+EXPORT void aud_drct_set_volume (StereoVolume volume)
+{
+    LOCK_MINOR;
+
+    volume.left = aud::clamp (volume.left, 0, 100);
+    volume.right = aud::clamp (volume.right, 0, 100);
+
+    if (aud_get_bool (0, "software_volume_control"))
+    {
+        aud_set_int (0, "sw_volume_left", volume.left);
+        aud_set_int (0, "sw_volume_right", volume.right);
+    }
+    else if (cop)
+        cop->set_volume (volume);
+
+    UNLOCK_MINOR;
+}
+
+PluginHandle * output_plugin_get_current ()
+{
+    return cop ? aud_plugin_by_header (cop) : nullptr;
+}
+
+bool output_plugin_set_current (PluginHandle * plugin)
+{
+    change_op = true;
+    new_op = plugin ? (OutputPlugin *) aud_plugin_get_header (plugin) : nullptr;
+    aud_output_reset (OutputReset::ResetPlugin);
+
+    bool success = (! plugin || (new_op && cop == new_op));
+    change_op = false;
+    new_op = nullptr;
+
+    return success;
+}
diff --git a/src/libaudcore/output.h b/src/libaudcore/output.h
new file mode 100644
index 000000000000..a8e4eea55dba
--- /dev/null
+++ b/src/libaudcore/output.h
@@ -0,0 +1,44 @@
+/*
+ * output.h
+ * Copyright 2010-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_OUTPUT_H
+#define LIBAUDCORE_OUTPUT_H
+
+#include <libaudcore/audio.h>
+#include <libaudcore/objects.h>
+
+class Tuple;
+
+bool output_open_audio (const String & filename, const Tuple & tuple,
+ int format, int rate, int channels, int start_time);
+void output_set_replay_gain (const ReplayGainInfo & info);
+bool output_write_audio (const void * data, int size, int stop_time);
+void output_flush (int time, bool force = false);
+void output_resume ();
+void output_pause (bool pause);
+
+int output_get_time ();
+int output_get_raw_time ();
+void output_close_audio ();
+void output_drain ();
+
+PluginHandle * output_plugin_get_current ();
+bool output_plugin_set_current (PluginHandle * plugin);
+
+#endif
diff --git a/src/libaudcore/playback.cc b/src/libaudcore/playback.cc
new file mode 100644
index 000000000000..d132f294e961
--- /dev/null
+++ b/src/libaudcore/playback.cc
@@ -0,0 +1,749 @@
+/*
+ * playback.cc
+ * Copyright 2009-2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+/*
+ * Since Audacious 3.6, the playback thread is completely asynchronous; that is,
+ * the main thread never blocks waiting for the playback thread to process a
+ * play(), seek(), or stop() command.  As a result, the playback thread can lag
+ * behind the main/playlist thread, and the "current" song from the perspective
+ * of the playback thread may not be the same as the "current" song from the
+ * perspective of the main/playlist thread.  Therefore, some care is necessary
+ * to ensure that information generated in the playback thread is not applied to
+ * the wrong song.  To this end, separate serial numbers are maintained by each
+ * thread and compared when information crosses thread boundaries; if the serial
+ * numbers do not match, the information is generally discarded.
+ *
+ * Note that this file and playlist.cc each have their own mutex.  The one in
+ * playlist.cc is conceptually the "outer" mutex and must be locked first (in
+ * situations where both need to be locked) in order to avoid deadlock.
+ */
+
+#include "drct.h"
+#include "internal.h"
+
+#include <assert.h>
+#include <pthread.h>
+
+#include "audstrings.h"
+#include "hook.h"
+#include "i18n.h"
+#include "interface.h"
+#include "mainloop.h"
+#include "output.h"
+#include "playlist-internal.h"
+#include "plugin.h"
+#include "plugins.h"
+#include "plugins-internal.h"
+#include "runtime.h"
+
+struct PlaybackState {
+    bool playing = false;
+    bool thread_running = false;
+    int control_serial = 0;
+    int playback_serial = 0;
+};
+
+struct PlaybackControl {
+    bool paused = false;
+    int seek = -1;
+    int repeat_a = -1;
+    int repeat_b = -1;
+};
+
+struct PlaybackInfo {
+    // set by playback_set_info
+    String filename;
+    PluginHandle * decoder = nullptr;
+    Tuple tuple;
+
+    int entry = -1;
+    String title;
+
+    // set by playback thread
+    int length = -1;
+    int time_offset = 0;
+    int stop_time = -1;
+
+    ReplayGainInfo gain {};
+
+    int bitrate = 0;
+    int samplerate = 0;
+    int channels = 0;
+
+    bool ready = false;
+    bool ended = false;
+    bool error = false;
+    String error_s;
+};
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+
+static PlaybackState pb_state;
+static PlaybackControl pb_control;
+static PlaybackInfo pb_info;
+
+static QueuedFunc end_queue;
+static bool song_finished = false;
+static int failed_entries = 0;
+
+static void lock ()
+    { pthread_mutex_lock (& mutex); }
+static void unlock ()
+    { pthread_mutex_unlock (& mutex); }
+
+static bool lock_if (bool (* test) ())
+{
+    lock ();
+    if (test ())
+        return true;
+
+    unlock ();
+    return false;
+}
+
+// check that the playback thread is not lagging
+static bool in_sync ()
+    { return pb_state.playing && pb_state.control_serial == pb_state.playback_serial; }
+
+// check that the playback thread is not lagging and playback is "ready"
+static bool is_ready ()
+    { return in_sync () && pb_info.ready; }
+
+// called by playback_entry_set_tuple() to ensure that the tuple still applies
+// to the current song from the perspective of the main/playlist thread; the
+// check is necessary because playback_entry_set_tuple() is itself called from
+// the playback thread
+bool playback_check_serial (int serial)
+{
+    lock ();
+    bool okay = (pb_state.playing && pb_state.control_serial == serial);
+    unlock ();
+    return okay;
+}
+
+// called from the playlist to update the tuple for the current song
+bool playback_set_info (int entry, const String & filename, PluginHandle * decoder, Tuple && tuple)
+{
+    // do nothing if the playback thread is lagging behind;
+    // in that case, playback_set_info() will get called again anyway
+    if (! lock_if (in_sync))
+        return false;
+
+    if (! pb_info.filename)
+        pb_info.filename = filename;
+    if (! pb_info.decoder)
+        pb_info.decoder = decoder;
+
+    if (tuple && tuple != pb_info.tuple)
+    {
+        pb_info.tuple = std::move (tuple);
+
+        // don't call "tuple change" before "playback ready"
+        if (is_ready ())
+            event_queue ("tuple change", nullptr);
+    }
+
+    String title = pb_info.tuple.get_str (Tuple::FormattedTitle);
+    if (entry != pb_info.entry || title != pb_info.title)
+    {
+        pb_info.entry = entry;
+        pb_info.title = title;
+
+        // don't call "title change" before "playback ready"
+        if (is_ready ())
+            event_queue ("title change", nullptr);
+    }
+
+    unlock ();
+    return true;
+}
+
+// cleanup common to both playback_play() and playback_stop()
+static void playback_cleanup_locked ()
+{
+    pb_state.playing = false;
+    pb_control = PlaybackControl ();
+
+    // discard audio buffer if the song did not end on its own
+    if (! song_finished)
+        output_flush (0);
+
+    // miscellaneous cleanup
+    end_queue.stop ();
+    song_finished = false;
+
+    event_queue_cancel ("playback ready", nullptr);
+    event_queue_cancel ("playback pause", nullptr);
+    event_queue_cancel ("playback unpause", nullptr);
+    event_queue_cancel ("playback seek", nullptr);
+    event_queue_cancel ("info change", nullptr);
+    event_queue_cancel ("title change", nullptr);
+    event_queue_cancel ("tuple change", nullptr);
+
+    aud_set_bool (nullptr, "stop_after_current_song", false);
+}
+
+// main thread: stops playback when no more songs are to be played
+void playback_stop (bool exiting)
+{
+    if (! pb_state.playing && ! exiting)
+        return;
+
+    lock ();
+
+    if (pb_state.playing)
+        playback_cleanup_locked ();
+
+    if (pb_state.thread_running)
+    {
+        // discard audio buffer if exiting
+        if (exiting)
+            output_flush (0, true);
+
+        // signal playback thread to drain audio buffer
+        pb_state.control_serial ++;
+        pthread_cond_broadcast (& cond);
+
+        // wait for playback thread to finish if exiting
+        while (exiting && pb_state.thread_running)
+            pthread_cond_wait (& cond, & mutex);
+    }
+
+    unlock ();
+
+    // miscellaneous cleanup
+    failed_entries = 0;
+}
+
+// called from top-level event loop after playback finishes
+static void end_cb (void *)
+{
+    song_finished = true;
+    hook_call ("playback end", nullptr);
+
+    int playlist = aud_playlist_get_playing ();
+
+    auto do_stop = [playlist] ()
+    {
+        aud_playlist_play (-1);
+        aud_playlist_set_position (playlist, aud_playlist_get_position (playlist));
+    };
+
+    auto do_next = [playlist] ()
+    {
+        if (! playlist_next_song (playlist, aud_get_bool (nullptr, "repeat")))
+        {
+            aud_playlist_set_position (playlist, -1);
+            hook_call ("playlist end reached", nullptr);
+        }
+    };
+
+    if (aud_get_bool (nullptr, "no_playlist_advance"))
+    {
+        // we assume here that repeat is not enabled;
+        // single-song repeats are handled in run_playback()
+        do_stop ();
+    }
+    else if (aud_get_bool (nullptr, "stop_after_current_song"))
+    {
+        do_stop ();
+        do_next ();
+    }
+    else
+    {
+        if (failed_entries < 10)
+            do_next ();
+        else
+            do_stop ();
+    }
+}
+
+// helper, can be called from either main or playback thread
+static void request_seek_locked (int time)
+{
+    // set up "seek" command whether ready or not;
+    // if not ready, it will take effect upon open_audio()
+    pb_control.seek = time;
+
+    // trigger seek immediately if ready
+    if (is_ready () && pb_info.length > 0)
+    {
+        output_flush (aud::clamp (time, 0, pb_info.length));
+        event_queue ("playback seek", nullptr);
+    }
+}
+
+// playback thread helper
+static void run_playback ()
+{
+    // due to mutex ordering, we cannot call into the playlist while locked;
+    // instead, playback_entry_read() calls back into playback_set_info()
+    if (! playback_entry_read (pb_state.playback_serial, pb_info.error_s))
+    {
+        pb_info.error = true;
+        return;
+    }
+
+    lock ();
+
+    // playback_set_info() should always set this info
+    assert (pb_info.filename && pb_info.decoder && pb_info.tuple);
+
+    // get various other bits of info from the tuple
+    pb_info.length = pb_info.tuple.get_int (Tuple::Length);
+    pb_info.time_offset = aud::max (0, pb_info.tuple.get_int (Tuple::StartTime));
+    pb_info.stop_time = aud::max (-1, pb_info.tuple.get_int (Tuple::EndTime) - pb_info.time_offset);
+    pb_info.gain = pb_info.tuple.get_replay_gain ();
+
+    // force initial seek if we are playing a segmented track
+    if (pb_info.time_offset > 0 && pb_control.seek < 0)
+        pb_control.seek = 0;
+
+    unlock ();
+
+    InputPlugin * ip;
+    VFSFile file;
+
+    // load input plugin
+    if (! (ip = (InputPlugin *) aud_plugin_get_header (pb_info.decoder)))
+    {
+        pb_info.error = true;
+        pb_info.error_s = String (_("Error loading plugin"));
+        return;
+    }
+
+    // open file (not necessary for custom URI schemes)
+    if (! ip->input_info.keys[InputKey::Scheme] && ! (file = VFSFile (pb_info.filename, "r")))
+    {
+        pb_info.error = true;
+        pb_info.error_s = String (file.error ());
+        return;
+    }
+
+    while (1)
+    {
+        // hand off control to input plugin
+        if (! ip->play (pb_info.filename, file))
+            pb_info.error = true;
+
+        // close audio (no-op if it wasn't opened)
+        output_close_audio ();
+
+        if (pb_info.error || pb_info.length <= 0)
+            break;
+
+        if (! lock_if (in_sync))
+            break;
+
+        // check whether we need to repeat
+        pb_info.ended = (pb_control.repeat_a < 0 && ! (aud_get_bool (nullptr,
+         "repeat") && aud_get_bool (nullptr, "no_playlist_advance")));
+
+        if (! pb_info.ended)
+            request_seek_locked (aud::max (pb_control.repeat_a, 0));
+
+        unlock ();
+
+        if (pb_info.ended)
+            break;
+
+        // rewind file pointer before repeating
+        if (file && file.fseek (0, VFS_SEEK_SET) != 0)
+        {
+            pb_info.error = true;
+            break;
+        }
+    }
+}
+
+// playback thread helper
+static void finish_playback_locked ()
+{
+    // record any playback error that occurred
+    if (pb_info.error)
+    {
+        failed_entries ++;
+        aud_ui_show_error (str_printf (_("Error opening %s:\n%s"),
+         (const char *) pb_info.filename, pb_info.error_s ?
+         (const char *) pb_info.error_s : _("Unknown playback error")));
+    }
+    else
+        failed_entries = 0;
+
+    // queue up function to start next song (or perform cleanup)
+    end_queue.queue (end_cb, nullptr);
+}
+
+// playback thread
+static void * playback_thread (void *)
+{
+    lock ();
+
+    while (1)
+    {
+        // wait for a command
+        while (pb_state.control_serial == pb_state.playback_serial)
+            pthread_cond_wait (& cond, & mutex);
+
+        // fetch the command (either "play" or "drain")
+        bool play = pb_state.playing;
+
+        // update playback thread serial number
+        pb_state.playback_serial = pb_state.control_serial;
+
+        unlock ();
+
+        if (play)
+            run_playback ();
+        else
+            output_drain ();
+
+        lock ();
+
+        if (play)
+        {
+            // don't report errors or queue next song if another command is pending
+            if (in_sync ())
+                finish_playback_locked ();
+
+            pb_info = PlaybackInfo ();
+        }
+        else
+        {
+            // quit if we did not receive a new command after draining
+            if (pb_state.control_serial == pb_state.playback_serial)
+                break;
+        }
+    }
+
+    // signal the main thread that we are quitting
+    pb_state.thread_running = false;
+    pthread_cond_broadcast (& cond);
+    unlock ();
+    return nullptr;
+}
+
+// main thread: starts playback of a new song
+void playback_play (int seek_time, bool pause)
+{
+    lock ();
+
+    if (pb_state.playing)
+        playback_cleanup_locked ();
+
+    // set up "play" command
+    pb_state.playing = true;
+    pb_state.control_serial ++;
+    pb_control.paused = pause;
+    pb_control.seek = (seek_time > 0) ? seek_time : -1;
+
+    // start playback thread (or signal it if it's already running)
+    if (pb_state.thread_running)
+        pthread_cond_broadcast (& cond);
+    else
+    {
+        pthread_t thread;
+        pthread_create (& thread, nullptr, playback_thread, nullptr);
+        pthread_detach (thread);
+        pb_state.thread_running = true;
+    }
+
+    unlock ();
+}
+
+// main thread
+EXPORT void aud_drct_pause ()
+{
+    if (! pb_state.playing)
+        return;
+
+    lock ();
+
+    // set up "pause" command whether ready or not;
+    // if not ready, it will take effect upon open_audio()
+    bool pause = ! pb_control.paused;
+    pb_control.paused = pause;
+
+    // apply pause immediately if ready
+    if (is_ready ())
+        output_pause (pause);
+
+    event_queue (pause ? "playback pause" : "playback unpause", nullptr);
+
+    unlock ();
+}
+
+// main thread
+EXPORT void aud_drct_seek (int time)
+{
+    if (! pb_state.playing)
+        return;
+
+    lock ();
+    request_seek_locked (time);
+    unlock ();
+}
+
+EXPORT void InputPlugin::open_audio (int format, int rate, int channels)
+{
+    // don't open audio if playback thread is lagging
+    if (! lock_if (in_sync))
+        return;
+
+    if (! output_open_audio (pb_info.filename, pb_info.tuple, format, rate,
+     channels, aud::max (0, pb_control.seek)))
+    {
+        pb_info.error = true;
+        pb_info.error_s = String (_("Invalid audio format"));
+        unlock ();
+        return;
+    }
+
+    output_set_replay_gain (pb_info.gain);
+    if (pb_control.paused)
+        output_pause (true);
+
+    pb_info.samplerate = rate;
+    pb_info.channels = channels;
+
+    if (pb_info.ready)
+        event_queue ("info change", nullptr);
+    else
+        event_queue ("playback ready", nullptr);
+
+    pb_info.ready = true;
+
+    unlock ();
+}
+
+EXPORT void InputPlugin::set_replay_gain (const ReplayGainInfo & gain)
+{
+    lock ();
+    pb_info.gain = gain;
+
+    if (is_ready ())
+        output_set_replay_gain (gain);
+
+    unlock ();
+}
+
+EXPORT void InputPlugin::write_audio (const void * data, int length)
+{
+    if (! lock_if (in_sync))
+        return;
+
+    // fetch A-B repeat settings
+    int a = pb_control.repeat_a;
+    int b = pb_control.repeat_b;
+
+    unlock ();
+
+    // it's okay to call output_write_audio() even if we are no longer in sync,
+    // since it will return immediately if output_flush() has been called
+    int stop_time = (b >= 0) ? b : pb_info.stop_time;
+    if (output_write_audio (data, length, stop_time))
+        return;
+
+    if (! lock_if (in_sync))
+        return;
+
+    // if we are still in sync, then one of the following happened:
+    // 1. output_flush() was called due to a seek request
+    // 2. we've reached repeat point B
+    // 3. we've reached the end of a segmented track
+    if (pb_control.seek < 0)
+    {
+        if (b >= 0)
+            request_seek_locked (aud::max (0, a));
+        else
+            pb_info.ended = true;
+    }
+
+    unlock ();
+}
+
+EXPORT Tuple InputPlugin::get_playback_tuple ()
+{
+    lock ();
+    Tuple tuple = pb_info.tuple.ref ();
+    unlock ();
+
+    // tuples passed to us from input plugins do not have fallback fields
+    // generated; for consistency, tuples passed back should not either
+    tuple.delete_fallbacks ();
+    return tuple;
+}
+
+EXPORT void InputPlugin::set_playback_tuple (Tuple && tuple)
+{
+    // due to mutex ordering, we cannot call into the playlist while locked;
+    // instead, playback_entry_set_tuple() calls back into first
+    // playback_check_serial() and then eventually playlist_set_info()
+    playback_entry_set_tuple (pb_state.playback_serial, std::move (tuple));
+}
+
+EXPORT void InputPlugin::set_stream_bitrate (int bitrate)
+{
+    lock ();
+    pb_info.bitrate = bitrate;
+
+    if (is_ready ())
+        event_queue ("info change", nullptr);
+
+    unlock ();
+}
+
+EXPORT bool InputPlugin::check_stop ()
+{
+    lock ();
+    bool stop = ! is_ready () || pb_info.ended || pb_info.error;
+    unlock ();
+    return stop;
+}
+
+EXPORT int InputPlugin::check_seek ()
+{
+    lock ();
+    int seek = -1;
+
+    if (is_ready () && pb_control.seek >= 0 && pb_info.length > 0)
+    {
+        seek = pb_info.time_offset + aud::clamp (pb_control.seek, 0, pb_info.length);
+        pb_control.seek = -1;
+        output_resume ();
+    }
+
+    unlock ();
+    return seek;
+}
+
+// thread-safe
+EXPORT bool aud_drct_get_playing ()
+{
+    lock ();
+    bool playing = pb_state.playing;
+    unlock ();
+    return playing;
+}
+
+// thread-safe
+EXPORT bool aud_drct_get_ready ()
+{
+    lock ();
+    bool ready = is_ready ();
+    unlock ();
+    return ready;
+}
+
+// thread-safe
+EXPORT bool aud_drct_get_paused ()
+{
+    lock ();
+    bool paused = pb_control.paused;
+    unlock ();
+    return paused;
+}
+
+// thread-safe
+EXPORT String aud_drct_get_title ()
+{
+    if (! lock_if (is_ready))
+        return String ();
+
+    String title = pb_info.title;
+    int entry = pb_info.entry;
+    int length = pb_info.length;
+
+    unlock ();
+
+    StringBuf prefix = aud_get_bool (nullptr, "show_numbers_in_pl") ?
+     str_printf ("%d. ", 1 + entry) : StringBuf (0);
+
+    StringBuf time = (length > 0) ? str_format_time (length) : StringBuf ();
+    StringBuf suffix = time ? str_concat ({" (", time, ")"}) : StringBuf (0);
+
+    return String (str_concat ({prefix, title, suffix}));
+}
+
+// thread-safe
+EXPORT Tuple aud_drct_get_tuple ()
+{
+    lock ();
+    Tuple tuple = is_ready () ? pb_info.tuple.ref () : Tuple ();
+    unlock ();
+    return tuple;
+}
+
+// thread-safe
+EXPORT void aud_drct_get_info (int & bitrate, int & samplerate, int & channels)
+{
+    lock ();
+
+    bool ready = is_ready ();
+    bitrate = ready ? pb_info.bitrate : 0;
+    samplerate = ready ? pb_info.samplerate : 0;
+    channels = ready ? pb_info.channels : 0;
+
+    unlock ();
+}
+
+// thread-safe
+EXPORT int aud_drct_get_time ()
+{
+    lock ();
+    int time = is_ready () ? output_get_time () : 0;
+    unlock ();
+    return time;
+}
+
+// thread-safe
+EXPORT int aud_drct_get_length ()
+{
+    lock ();
+    int length = is_ready () ? pb_info.length : -1;
+    unlock ();
+    return length;
+}
+
+// main thread
+EXPORT void aud_drct_set_ab_repeat (int a, int b)
+{
+    if (! pb_state.playing)
+        return;
+
+    lock ();
+
+    pb_control.repeat_a = a;
+    pb_control.repeat_b = b;
+
+    if (b >= 0 && is_ready () && output_get_time () >= b)
+        request_seek_locked (aud::max (a, 0));
+
+    unlock ();
+}
+
+// thread-safe
+EXPORT void aud_drct_get_ab_repeat (int & a, int & b)
+{
+    lock ();
+    a = pb_control.repeat_a;
+    b = pb_control.repeat_b;
+    unlock ();
+}
diff --git a/src/libaudcore/playlist-files.cc b/src/libaudcore/playlist-files.cc
new file mode 100644
index 000000000000..a3dbccd1ebf0
--- /dev/null
+++ b/src/libaudcore/playlist-files.cc
@@ -0,0 +1,139 @@
+/*
+ * playlist-files.c
+ * Copyright 2010-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "playlist-internal.h"
+
+#include "audstrings.h"
+#include "i18n.h"
+#include "interface.h"
+#include "plugin.h"
+#include "plugins-internal.h"
+#include "runtime.h"
+
+EXPORT bool aud_filename_is_playlist (const char * filename)
+{
+    StringBuf ext = uri_get_extension (filename);
+
+    if (ext)
+    {
+        for (PluginHandle * plugin : aud_plugin_list (PluginType::Playlist))
+        {
+            if (aud_plugin_get_enabled (plugin) && playlist_plugin_has_ext (plugin, ext))
+                return true;
+        }
+    }
+
+    return false;
+}
+
+bool playlist_load (const char * filename, String & title, Index<PlaylistAddItem> & items)
+{
+    AUDINFO ("Loading playlist %s.\n", filename);
+
+    StringBuf ext = uri_get_extension (filename);
+
+    if (ext)
+    {
+        for (PluginHandle * plugin : aud_plugin_list (PluginType::Playlist))
+        {
+            if (! aud_plugin_get_enabled (plugin) || ! playlist_plugin_has_ext (plugin, ext))
+                continue;
+
+            AUDINFO ("Trying playlist plugin %s.\n", aud_plugin_get_name (plugin));
+
+            PlaylistPlugin * pp = (PlaylistPlugin *) aud_plugin_get_header (plugin);
+            if (! pp)
+                continue;
+
+            VFSFile file (filename, "r");
+            if (! file)
+                return false;
+
+            if (pp->load (filename, file, title, items))
+                return true;
+
+            title = String ();
+            items.clear ();
+        }
+    }
+
+    aud_ui_show_error (str_printf (_("Cannot load %s: unsupported file name extension."), filename));
+
+    return false;
+}
+
+bool playlist_insert_playlist_raw (int list, int at, const char * filename)
+{
+    String title;
+    Index<PlaylistAddItem> items;
+
+    if (! playlist_load (filename, title, items))
+        return false;
+
+    if (title && ! aud_playlist_entry_count (list))
+        aud_playlist_set_title (list, title);
+
+    playlist_entry_insert_batch_raw (list, at, std::move (items));
+
+    return true;
+}
+
+EXPORT bool aud_playlist_save (int list, const char * filename, Playlist::GetMode mode)
+{
+    String title = aud_playlist_get_title (list);
+
+    Index<PlaylistAddItem> items;
+    items.insert (0, aud_playlist_entry_count (list));
+
+    int i = 0;
+    for (PlaylistAddItem & item : items)
+    {
+        item.filename = aud_playlist_entry_get_filename (list, i);
+        item.tuple = aud_playlist_entry_get_tuple (list, i, mode);
+        item.tuple.delete_fallbacks ();
+        i ++;
+    }
+
+    AUDINFO ("Saving playlist %s.\n", filename);
+
+    StringBuf ext = uri_get_extension (filename);
+
+    if (ext)
+    {
+        for (PluginHandle * plugin : aud_plugin_list (PluginType::Playlist))
+        {
+            if (! aud_plugin_get_enabled (plugin) || ! playlist_plugin_has_ext (plugin, ext))
+                continue;
+
+            PlaylistPlugin * pp = (PlaylistPlugin *) aud_plugin_get_header (plugin);
+            if (! pp || ! pp->can_save)
+                continue;
+
+            VFSFile file (filename, "w");
+            if (! file)
+                return false;
+
+            return pp->save (filename, file, title, items) && file.fflush () == 0;
+        }
+    }
+
+    aud_ui_show_error (str_printf (_("Cannot save %s: unsupported file name extension."), filename));
+
+    return false;
+}
diff --git a/src/libaudcore/playlist-internal.h b/src/libaudcore/playlist-internal.h
new file mode 100644
index 000000000000..ffcb17cd066d
--- /dev/null
+++ b/src/libaudcore/playlist-internal.h
@@ -0,0 +1,53 @@
+/*
+ * playlist-internal.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_PLAYLIST_INTERNAL_H
+#define LIBAUDCORE_PLAYLIST_INTERNAL_H
+
+#include "playlist.h"
+
+/* playlist.c */
+void playlist_init ();
+void playlist_enable_scan (bool enable);
+void playlist_end ();
+
+void playlist_insert_with_id (int at, int id);
+void playlist_set_modified (int playlist, bool modified);
+bool playlist_get_modified (int playlist);
+
+void playlist_load_state ();
+void playlist_save_state ();
+
+void playlist_entry_insert_batch_raw (int playlist, int at, Index<PlaylistAddItem> && items);
+
+bool playlist_prev_song (int playlist);
+bool playlist_next_song (int playlist, bool repeat);
+
+bool playback_entry_read (int serial, String & error);
+void playback_entry_set_tuple (int serial, Tuple && tuple);
+
+/* playlist-files.c */
+bool playlist_load (const char * filename, String & title, Index<PlaylistAddItem> & items);
+bool playlist_insert_playlist_raw (int list, int at, const char * filename);
+
+/* playlist-utils.c */
+void load_playlists ();
+void save_playlists (bool exiting);
+
+#endif
diff --git a/src/libaudcore/playlist-utils.cc b/src/libaudcore/playlist-utils.cc
new file mode 100644
index 000000000000..46e31364a60b
--- /dev/null
+++ b/src/libaudcore/playlist-utils.cc
@@ -0,0 +1,442 @@
+/*
+ * playlist-utils.c
+ * Copyright 2009-2011 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "playlist-internal.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib/gstdio.h>
+
+#include "audstrings.h"
+#include "hook.h"
+#include "multihash.h"
+#include "runtime.h"
+#include "tuple.h"
+#include "vfs.h"
+
+static const char * get_basename (const char * filename)
+{
+    const char * slash = strrchr (filename, '/');
+    return slash ? slash + 1 : filename;
+}
+
+static int filename_compare_basename (const char * a, const char * b)
+{
+    return str_compare_encoded (get_basename (a), get_basename (b));
+}
+
+static int tuple_compare_string (const Tuple & a, const Tuple & b, Tuple::Field field)
+{
+    String string_a = a.get_str (field);
+    String string_b = b.get_str (field);
+
+    if (! string_a)
+        return (! string_b) ? 0 : -1;
+
+    return (! string_b) ? 1 : str_compare (string_a, string_b);
+}
+
+static int tuple_compare_int (const Tuple & a, const Tuple & b, Tuple::Field field)
+{
+    if (a.get_value_type (field) != Tuple::Int)
+        return (b.get_value_type (field) != Tuple::Int) ? 0 : -1;
+    if (b.get_value_type (field) != Tuple::Int)
+        return 1;
+
+    int int_a = a.get_int (field);
+    int int_b = b.get_int (field);
+
+    return (int_a < int_b) ? -1 : (int_a > int_b);
+}
+
+static int tuple_compare_title (const Tuple & a, const Tuple & b)
+{
+    return tuple_compare_string (a, b, Tuple::Title);
+}
+
+static int tuple_compare_album (const Tuple & a, const Tuple & b)
+{
+    return tuple_compare_string (a, b, Tuple::Album);
+}
+
+static int tuple_compare_artist (const Tuple & a, const Tuple & b)
+{
+    return tuple_compare_string (a, b, Tuple::Artist);
+}
+
+static int tuple_compare_album_artist (const Tuple & a, const Tuple & b)
+{
+    return tuple_compare_string (a, b, Tuple::AlbumArtist);
+}
+
+static int tuple_compare_date (const Tuple & a, const Tuple & b)
+{
+    return tuple_compare_int (a, b, Tuple::Year);
+}
+
+static int tuple_compare_genre (const Tuple & a, const Tuple & b)
+{
+    return tuple_compare_string (a, b, Tuple::Genre);
+}
+
+static int tuple_compare_track (const Tuple & a, const Tuple & b)
+{
+    return tuple_compare_int (a, b, Tuple::Track);
+}
+
+static int tuple_compare_formatted_title (const Tuple & a, const Tuple & b)
+{
+    return tuple_compare_string (a, b, Tuple::FormattedTitle);
+}
+
+static int tuple_compare_length (const Tuple & a, const Tuple & b)
+{
+    return tuple_compare_int (a, b, Tuple::Length);
+}
+
+static const PlaylistStringCompareFunc filename_comparisons[] = {
+    str_compare_encoded,  // path
+    filename_compare_basename,  // filename
+    nullptr,  // title
+    nullptr,  // album
+    nullptr,  // artist
+    nullptr,  // album artist
+    nullptr,  // date
+    nullptr,  // genre
+    nullptr,  // track
+    nullptr,  // formatted title
+    nullptr   // length
+};
+
+static const PlaylistTupleCompareFunc tuple_comparisons[] = {
+    nullptr,  // path
+    nullptr,  // filename
+    tuple_compare_title,
+    tuple_compare_album,
+    tuple_compare_artist,
+    tuple_compare_album_artist,
+    tuple_compare_date,
+    tuple_compare_genre,
+    tuple_compare_track,
+    tuple_compare_formatted_title,
+    tuple_compare_length
+};
+
+static_assert (aud::n_elems (filename_comparisons) == Playlist::n_sort_types &&
+ aud::n_elems (tuple_comparisons) == Playlist::n_sort_types,
+ "Update playlist comparison functions");
+
+EXPORT void aud_playlist_sort_by_scheme (int playlist, Playlist::SortType scheme)
+{
+    if (filename_comparisons[scheme])
+        aud_playlist_sort_by_filename (playlist, filename_comparisons[scheme]);
+    else if (tuple_comparisons[scheme])
+        aud_playlist_sort_by_tuple (playlist, tuple_comparisons[scheme]);
+}
+
+EXPORT void aud_playlist_sort_selected_by_scheme (int playlist, Playlist::SortType scheme)
+{
+    if (filename_comparisons[scheme])
+        aud_playlist_sort_selected_by_filename (playlist, filename_comparisons[scheme]);
+    else if (tuple_comparisons[scheme])
+        aud_playlist_sort_selected_by_tuple (playlist, tuple_comparisons[scheme]);
+}
+
+/* FIXME: this considers empty fields as duplicates */
+EXPORT void aud_playlist_remove_duplicates_by_scheme (int playlist, Playlist::SortType scheme)
+{
+    int entries = aud_playlist_entry_count (playlist);
+    if (entries < 1)
+        return;
+
+    aud_playlist_select_all (playlist, false);
+
+    if (filename_comparisons[scheme])
+    {
+        PlaylistStringCompareFunc compare = filename_comparisons[scheme];
+
+        aud_playlist_sort_by_filename (playlist, compare);
+        String last = aud_playlist_entry_get_filename (playlist, 0);
+
+        for (int count = 1; count < entries; count ++)
+        {
+            String current = aud_playlist_entry_get_filename (playlist, count);
+
+            if (compare (last, current) == 0)
+                aud_playlist_entry_set_selected (playlist, count, true);
+
+            last = current;
+        }
+    }
+    else if (tuple_comparisons[scheme])
+    {
+        PlaylistTupleCompareFunc compare = tuple_comparisons[scheme];
+
+        aud_playlist_sort_by_tuple (playlist, compare);
+        Tuple last = aud_playlist_entry_get_tuple (playlist, 0);
+
+        for (int count = 1; count < entries; count ++)
+        {
+            Tuple current = aud_playlist_entry_get_tuple (playlist, count);
+
+            if (last && current && compare (last, current) == 0)
+                aud_playlist_entry_set_selected (playlist, count, true);
+
+            last = std::move (current);
+        }
+    }
+
+    aud_playlist_delete_selected (playlist);
+}
+
+EXPORT void aud_playlist_remove_failed (int playlist)
+{
+    int entries = aud_playlist_entry_count (playlist);
+    int count;
+
+    aud_playlist_select_all (playlist, false);
+
+    for (count = 0; count < entries; count ++)
+    {
+        String filename = aud_playlist_entry_get_filename (playlist, count);
+
+        /* vfs_file_test() only works for file:// URIs currently */
+        if (! strncmp (filename, "file://", 7) && ! VFSFile::test_file (filename, VFS_EXISTS))
+            aud_playlist_entry_set_selected (playlist, count, true);
+    }
+
+    aud_playlist_delete_selected (playlist);
+}
+
+EXPORT void aud_playlist_select_by_patterns (int playlist, const Tuple & patterns)
+{
+    int entries = aud_playlist_entry_count (playlist);
+
+    aud_playlist_select_all (playlist, true);
+
+    for (Tuple::Field field : {Tuple::Title, Tuple::Album, Tuple::Artist, Tuple::Basename})
+    {
+        String pattern = patterns.get_str (field);
+        GRegex * regex;
+
+        if (! pattern || ! pattern[0] || ! (regex = g_regex_new (pattern,
+         G_REGEX_CASELESS, (GRegexMatchFlags) 0, nullptr)))
+            continue;
+
+        for (int entry = 0; entry < entries; entry ++)
+        {
+            if (! aud_playlist_entry_get_selected (playlist, entry))
+                continue;
+
+            Tuple tuple = aud_playlist_entry_get_tuple (playlist, entry);
+            String string = tuple.get_str (field);
+
+            if (! string || ! g_regex_match (regex, string, (GRegexMatchFlags) 0, nullptr))
+                aud_playlist_entry_set_selected (playlist, entry, false);
+        }
+
+        g_regex_unref (regex);
+    }
+}
+
+static StringBuf make_playlist_path (int playlist)
+{
+    if (! playlist)
+        return filename_build ({aud_get_path (AudPath::UserDir), "playlist.xspf"});
+
+    StringBuf name = str_printf ("playlist_%02d.xspf", 1 + playlist);
+    name.steal (filename_build ({aud_get_path (AudPath::UserDir), name}));
+    return name;
+}
+
+static void load_playlists_real (void)
+{
+    const char * folder = aud_get_path (AudPath::PlaylistDir);
+
+    /* old (v3.1 and earlier) naming scheme */
+
+    int count;
+    for (count = 0; ; count ++)
+    {
+        StringBuf path = make_playlist_path (count);
+        if (! g_file_test (path, G_FILE_TEST_EXISTS))
+            break;
+
+        aud_playlist_insert (count);
+        playlist_insert_playlist_raw (count, 0, filename_to_uri (path));
+        playlist_set_modified (count, true);
+    }
+
+    /* unique ID-based naming scheme */
+
+    StringBuf order_path = filename_build ({folder, "order"});
+    char * order_string;
+    Index<String> order;
+
+    g_file_get_contents (order_path, & order_string, nullptr, nullptr);
+    if (! order_string)
+        goto DONE;
+
+    order = str_list_to_index (order_string, " ");
+    g_free (order_string);
+
+    for (int i = 0; i < order.len (); i ++)
+    {
+        const String & number = order[i];
+
+        StringBuf name1 = str_concat ({number, ".audpl"});
+        StringBuf name2 = str_concat ({number, ".xspf"});
+
+        StringBuf path = filename_build ({folder, name1});
+        if (! g_file_test (path, G_FILE_TEST_EXISTS))
+            path.steal (filename_build ({folder, name2}));
+
+        playlist_insert_with_id (count + i, atoi (number));
+        playlist_insert_playlist_raw (count + i, 0, filename_to_uri (path));
+        playlist_set_modified (count + i, false);
+
+        if (g_str_has_suffix (path, ".xspf"))
+            playlist_set_modified (count + i, true);
+    }
+
+DONE:
+    if (! aud_playlist_count ())
+        aud_playlist_insert (0);
+
+    aud_playlist_set_active (0);
+}
+
+static void save_playlists_real (void)
+{
+    int lists = aud_playlist_count ();
+    const char * folder = aud_get_path (AudPath::PlaylistDir);
+
+    /* save playlists */
+
+    Index<String> order;
+    SimpleHash<String, bool> saved;
+
+    for (int i = 0; i < lists; i ++)
+    {
+        int id = aud_playlist_get_unique_id (i);
+        StringBuf number = int_to_str (id);
+        StringBuf name = str_concat ({number, ".audpl"});
+
+        if (playlist_get_modified (i))
+        {
+            StringBuf path = filename_build ({folder, name});
+            aud_playlist_save (i, filename_to_uri (path), Playlist::Nothing);
+            playlist_set_modified (i, false);
+        }
+
+        order.append (String (number));
+        saved.add (String (name), true);
+    }
+
+    StringBuf order_string = index_to_str_list (order, " ");
+    StringBuf order_path = filename_build ({folder, "order"});
+
+    char * old_order_string;
+    g_file_get_contents (order_path, & old_order_string, nullptr, nullptr);
+
+    if (! old_order_string || strcmp (old_order_string, order_string))
+    {
+        GError * error = nullptr;
+        if (! g_file_set_contents (order_path, order_string, -1, & error))
+        {
+            AUDERR ("Cannot write to %s: %s\n", (const char *) order_path, error->message);
+            g_error_free (error);
+        }
+    }
+
+    g_free (old_order_string);
+
+    /* clean up deleted playlists and files from old naming scheme */
+
+    g_unlink (make_playlist_path (0));
+
+    GDir * dir = g_dir_open (folder, 0, nullptr);
+    if (! dir)
+        return;
+
+    const char * name;
+    while ((name = g_dir_read_name (dir)))
+    {
+        if (! g_str_has_suffix (name, ".audpl") && ! g_str_has_suffix (name, ".xspf"))
+            continue;
+
+        if (! saved.lookup (String (name)))
+            g_unlink (filename_build ({folder, name}));
+    }
+
+    g_dir_close (dir);
+}
+
+static bool hooks_added, state_changed;
+
+static void update_cb (void * data, void *)
+{
+    auto level = aud::from_ptr<Playlist::UpdateLevel> (data);
+    if (level >= Playlist::Metadata)
+        state_changed = true;
+}
+
+static void state_cb (void * data, void * user)
+{
+    state_changed = true;
+}
+
+void load_playlists (void)
+{
+    load_playlists_real ();
+    playlist_load_state ();
+
+    state_changed = false;
+
+    if (! hooks_added)
+    {
+        hook_associate ("playlist update", update_cb, nullptr);
+        hook_associate ("playlist activate", state_cb, nullptr);
+        hook_associate ("playlist position", state_cb, nullptr);
+
+        hooks_added = true;
+    }
+}
+
+void save_playlists (bool exiting)
+{
+    save_playlists_real ();
+
+    /* on exit, save resume states */
+    if (state_changed || exiting)
+    {
+        playlist_save_state ();
+        state_changed = false;
+    }
+
+    if (exiting && hooks_added)
+    {
+        hook_dissociate ("playlist update", update_cb);
+        hook_dissociate ("playlist activate", state_cb);
+        hook_dissociate ("playlist position", state_cb);
+
+        hooks_added = false;
+    }
+}
diff --git a/src/libaudcore/playlist.cc b/src/libaudcore/playlist.cc
new file mode 100644
index 000000000000..d3046e580628
--- /dev/null
+++ b/src/libaudcore/playlist.cc
@@ -0,0 +1,2261 @@
+/*
+ * playlist.cc
+ * Copyright 2009-2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+// uncomment to print a backtrace when scanning blocks the main thread
+// #define WARN_BLOCKED
+
+#include "playlist-internal.h"
+#include "runtime.h"
+
+#include <pthread.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include <glib/gstdio.h>
+
+#include "audstrings.h"
+#include "drct.h"
+#include "hook.h"
+#include "i18n.h"
+#include "interface.h"
+#include "internal.h"
+#include "list.h"
+#include "mainloop.h"
+#include "multihash.h"
+#include "objects.h"
+#include "plugins.h"
+#include "scanner.h"
+#include "tuple.h"
+#include "tuple-compiler.h"
+
+#ifdef WARN_BLOCKED
+#include <execinfo.h>
+#include <stdio.h>
+#include <stdlib.h>
+#endif
+
+using namespace Playlist;
+
+enum {
+    ResumeStop,
+    ResumePlay,
+    ResumePause
+};
+
+enum PlaybackChange {
+    NoChange,
+    NextSong,
+    PlaybackStopped
+};
+
+#define STATE_FILE "playlist-state"
+
+#define ENTER pthread_mutex_lock (& mutex)
+#define LEAVE pthread_mutex_unlock (& mutex)
+
+#define RETURN(...) do { \
+    pthread_mutex_unlock (& mutex); \
+    return __VA_ARGS__; \
+} while (0)
+
+#define ENTER_GET_PLAYLIST(...) ENTER; \
+    PlaylistData * playlist = lookup_playlist (playlist_num); \
+    if (! playlist) \
+        RETURN (__VA_ARGS__);
+
+#define ENTER_GET_ENTRY(...) ENTER_GET_PLAYLIST (__VA_ARGS__); \
+    Entry * entry = lookup_entry (playlist, entry_num); \
+    if (! entry) \
+        RETURN (__VA_ARGS__);
+
+struct UniqueID
+{
+    constexpr UniqueID (int val) :
+        val (val) {}
+
+    operator int () const
+        { return val; }
+
+    unsigned hash () const
+        { return int32_hash (val); }
+
+private:
+    int val;
+};
+
+struct Entry {
+    Entry (PlaylistAddItem && item);
+    ~Entry ();
+
+    void set_tuple (Tuple && new_tuple);
+    void set_failed (String && new_error);
+
+    String filename;
+    PluginHandle * decoder;
+    Tuple tuple;
+    String error;
+    int number;
+    int length;
+    int shuffle_num;
+    bool scanned, failed;
+    bool selected, queued;
+};
+
+struct PlaylistData {
+    PlaylistData (int id);
+    ~PlaylistData ();
+
+    void set_entry_tuple (Entry * entry, Tuple && tuple);
+
+    int number, unique_id;
+    String filename, title;
+    bool modified;
+    Index<SmartPtr<Entry>> entries;
+    Entry * position, * focus;
+    int selected_count;
+    int last_shuffle_num;
+    Index<Entry *> queued;
+    int64_t total_length, selected_length;
+    bool scanning, scan_ending;
+    Update next_update, last_update;
+    int resume_time;
+};
+
+static const char * const default_title = N_("New Playlist");
+static const char * const temp_title = N_("Now Playing");
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+
+#ifdef WARN_BLOCKED
+static pthread_t main_thread;
+#endif
+
+/* The unique ID table contains pointers to PlaylistData for ID's in use and nullptr
+ * for "dead" (previously used and therefore unavailable) ID's. */
+static SimpleHash<UniqueID, PlaylistData *> unique_id_table;
+static int next_unique_id = 1000;
+
+static Index<SmartPtr<PlaylistData>> playlists;
+static PlaylistData * active_playlist = nullptr;
+static PlaylistData * playing_playlist = nullptr;
+static int resume_playlist = -1;
+static bool resume_paused = false;
+
+static QueuedFunc queued_update;
+static UpdateLevel update_level;
+
+struct ScanItem : public ListNode
+{
+    ScanItem (PlaylistData * playlist, Entry * entry, ScanRequest * request) :
+        playlist (playlist),
+        entry (entry),
+        request (request) {}
+
+    PlaylistData * playlist;
+    Entry * entry;
+    ScanRequest * request;
+};
+
+static bool scan_enabled;
+static int scan_playlist, scan_row;
+static List<ScanItem> scan_list;
+
+static void scan_finish (ScanRequest * request);
+static void scan_cancel (Entry * entry);
+static void scan_queue_playlist (PlaylistData * playlist);
+static void scan_restart ();
+
+static bool next_song_locked (PlaylistData * playlist, bool repeat, int hint);
+
+static void playlist_reformat_titles ();
+static void playlist_trigger_scan ();
+
+static SmartPtr<TupleCompiler> title_formatter;
+
+void Entry::set_tuple (Tuple && new_tuple)
+{
+    /* Hack: We cannot refresh segmented entries (since their info is read from
+     * the cue sheet when it is first loaded), so leave them alone. -jlindgren */
+    if (tuple.get_value_type (Tuple::StartTime) == Tuple::Int)
+        return;
+
+    scanned = (bool) new_tuple;
+    failed = false;
+    error = String ();
+
+    if (! new_tuple)
+        new_tuple.set_filename (filename);
+
+    new_tuple.generate_fallbacks ();
+    title_formatter->format (new_tuple);
+
+    length = aud::max (0, new_tuple.get_int (Tuple::Length));
+    tuple = std::move (new_tuple);
+}
+
+void PlaylistData::set_entry_tuple (Entry * entry, Tuple && tuple)
+{
+    scan_cancel (entry);
+
+    total_length -= entry->length;
+    if (entry->selected)
+        selected_length -= entry->length;
+
+    entry->set_tuple (std::move (tuple));
+
+    total_length += entry->length;
+    if (entry->selected)
+        selected_length += entry->length;
+}
+
+void Entry::set_failed (String && new_error)
+{
+    scanned = true;
+    failed = true;
+    error = std::move (new_error);
+}
+
+Entry::Entry (PlaylistAddItem && item) :
+    filename (item.filename),
+    decoder (item.decoder),
+    number (-1),
+    length (0),
+    shuffle_num (0),
+    scanned (false),
+    failed (false),
+    selected (false),
+    queued (false)
+{
+    set_tuple (std::move (item.tuple));
+}
+
+Entry::~Entry ()
+{
+    scan_cancel (this);
+}
+
+static int new_unique_id (int preferred)
+{
+    if (preferred >= 0 && ! unique_id_table.lookup (preferred))
+        return preferred;
+
+    while (unique_id_table.lookup (next_unique_id))
+        next_unique_id ++;
+
+    return next_unique_id ++;
+}
+
+PlaylistData::PlaylistData (int id) :
+    number (-1),
+    unique_id (new_unique_id (id)),
+    title (_(default_title)),
+    modified (true),
+    position (nullptr),
+    focus (nullptr),
+    selected_count (0),
+    last_shuffle_num (0),
+    total_length (0),
+    selected_length (0),
+    scanning (false),
+    scan_ending (false),
+    next_update (),
+    last_update (),
+    resume_time (0)
+{
+    unique_id_table.add (unique_id, (PlaylistData *) this);
+}
+
+PlaylistData::~PlaylistData ()
+{
+    unique_id_table.add (unique_id, nullptr);
+}
+
+static void number_playlists (int at, int length)
+{
+    for (int i = at; i < at + length; i ++)
+        playlists[i]->number = i;
+}
+
+static PlaylistData * lookup_playlist (int i)
+{
+    return (i >= 0 && i < playlists.len ()) ? playlists[i].get () : nullptr;
+}
+
+static void number_entries (PlaylistData * p, int at, int length)
+{
+    for (int i = at; i < at + length; i ++)
+        p->entries[i]->number = i;
+}
+
+static Entry * lookup_entry (PlaylistData * p, int i)
+{
+    return (i >= 0 && i < p->entries.len ()) ? p->entries[i].get () : nullptr;
+}
+
+static void update (void *)
+{
+    ENTER;
+
+    for (auto & p : playlists)
+    {
+        p->last_update = p->next_update;
+        p->next_update = Update ();
+    }
+
+    UpdateLevel level = update_level;
+    update_level = NoUpdate;
+
+    LEAVE;
+
+    hook_call ("playlist update", aud::to_ptr (level));
+}
+
+static bool send_playback_info (Entry * entry)
+{
+    // if the entry was not scanned or failed to scan, we must still call
+    // playback_set_info() in order to update the entry number
+    Tuple tuple = (entry->scanned && ! entry->failed) ? entry->tuple.ref () : Tuple ();
+    return playback_set_info (entry->number, entry->filename, entry->decoder, std::move (tuple));
+}
+
+static void queue_update (UpdateLevel level, PlaylistData * p, int at,
+ int count, bool queue_changed = false)
+{
+    if (p)
+    {
+        if (level == Structure)
+            scan_queue_playlist (p);
+
+        if (level >= Metadata)
+        {
+            if (p == playing_playlist && p->position)
+                send_playback_info (p->position);
+
+            p->modified = true;
+        }
+
+        if (p->next_update.level)
+        {
+            p->next_update.level = aud::max (p->next_update.level, level);
+            p->next_update.before = aud::min (p->next_update.before, at);
+            p->next_update.after = aud::min (p->next_update.after, p->entries.len () - at - count);
+        }
+        else
+        {
+            p->next_update.level = level;
+            p->next_update.before = at;
+            p->next_update.after = p->entries.len () - at - count;
+        }
+
+        if (queue_changed)
+            p->next_update.queue_changed = true;
+    }
+
+    if (level == Structure)
+        scan_restart ();
+
+    if (! update_level)
+        queued_update.queue (update, nullptr);
+
+    update_level = aud::max (update_level, level);
+}
+
+EXPORT bool aud_playlist_update_pending (int playlist_num)
+{
+    if (playlist_num >= 0)
+    {
+        ENTER_GET_PLAYLIST (false);
+        bool pending = playlist->next_update.level ? true : false;
+        RETURN (pending);
+    }
+    else
+    {
+        ENTER;
+        bool pending = update_level ? true : false;
+        RETURN (pending);
+    }
+}
+
+EXPORT Update aud_playlist_update_detail (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (Update ());
+    Update update = playlist->last_update;
+    RETURN (update);
+}
+
+EXPORT bool aud_playlist_scan_in_progress (int playlist_num)
+{
+    if (playlist_num >= 0)
+    {
+        ENTER_GET_PLAYLIST (false);
+        bool scanning = playlist->scanning || playlist->scan_ending;
+        RETURN (scanning);
+    }
+    else
+    {
+        ENTER;
+
+        bool scanning = false;
+        for (auto & p : playlists)
+        {
+            if (p->scanning || p->scan_ending)
+                scanning = true;
+        }
+
+        RETURN (scanning);
+    }
+}
+
+static ScanItem * scan_list_find_playlist (PlaylistData * playlist)
+{
+    for (ScanItem * item = scan_list.head (); item; item = scan_list.next (item))
+    {
+        if (item->playlist == playlist)
+            return item;
+    }
+
+    return nullptr;
+}
+
+static ScanItem * scan_list_find_entry (Entry * entry)
+{
+    for (ScanItem * item = scan_list.head (); item; item = scan_list.next (item))
+    {
+        if (item->entry == entry)
+            return item;
+    }
+
+    return nullptr;
+}
+
+static ScanItem * scan_list_find_request (ScanRequest * request)
+{
+    for (ScanItem * item = scan_list.head (); item; item = scan_list.next (item))
+    {
+        if (item->request == request)
+            return item;
+    }
+
+    return nullptr;
+}
+
+static void scan_queue_entry (PlaylistData * playlist, Entry * entry)
+{
+    int flags = entry->scanned ? 0 : SCAN_TUPLE;
+    auto request = new ScanRequest (entry->filename, flags, scan_finish, entry->decoder);
+    scanner_request (request);
+
+    scan_list.append (new ScanItem (playlist, entry, request));
+}
+
+static void scan_check_complete (PlaylistData * playlist)
+{
+    if (! playlist->scan_ending || scan_list_find_playlist (playlist))
+        return;
+
+    playlist->scan_ending = false;
+    event_queue_cancel ("playlist scan complete", nullptr);
+    event_queue ("playlist scan complete", nullptr);
+}
+
+static bool scan_queue_next_entry ()
+{
+    if (! scan_enabled || aud_get_bool (nullptr, "metadata_on_play"))
+        return false;
+
+    while (scan_playlist < playlists.len ())
+    {
+        PlaylistData * playlist = playlists[scan_playlist].get ();
+
+        if (playlist->scanning)
+        {
+            while (scan_row < playlist->entries.len ())
+            {
+                Entry * entry = playlist->entries[scan_row ++].get ();
+
+                if (! entry->scanned && ! scan_list_find_entry (entry))
+                {
+                    scan_queue_entry (playlist, entry);
+                    return true;
+                }
+            }
+
+            playlist->scanning = false;
+            playlist->scan_ending = true;
+            scan_check_complete (playlist);
+        }
+
+        scan_playlist ++;
+        scan_row = 0;
+    }
+
+    return false;
+}
+
+static void scan_schedule ()
+{
+    int scheduled = 0;
+
+    for (ScanItem * item = scan_list.head (); item; item = scan_list.next (item))
+    {
+        if (++ scheduled >= SCAN_THREADS)
+            return;
+    }
+
+    while (scan_queue_next_entry ())
+    {
+        if (++ scheduled >= SCAN_THREADS)
+            return;
+    }
+}
+
+static void scan_finish (ScanRequest * request)
+{
+    ENTER;
+
+    ScanItem * item = scan_list_find_request (request);
+    if (! item)
+        RETURN ();
+
+    PlaylistData * playlist = item->playlist;
+    Entry * entry = item->entry;
+
+    scan_list.remove (item);
+    delete item;
+
+    if (! entry->decoder)
+        entry->decoder = request->decoder;
+
+    if (! entry->scanned && request->tuple)
+    {
+        playlist->set_entry_tuple (entry, std::move (request->tuple));
+        queue_update (Metadata, playlist, entry->number, 1);
+    }
+
+    if (! entry->decoder || ! entry->scanned)
+        entry->set_failed (std::move (request->error));
+
+    scan_check_complete (playlist);
+    scan_schedule ();
+
+    pthread_cond_broadcast (& cond);
+
+    LEAVE;
+}
+
+static void scan_cancel (Entry * entry)
+{
+    ScanItem * item = scan_list_find_entry (entry);
+    if (! item)
+        return;
+
+    scan_list.remove (item);
+    delete (item);
+}
+
+static void scan_queue_playlist (PlaylistData * playlist)
+{
+    playlist->scanning = true;
+    playlist->scan_ending = false;
+}
+
+static void scan_restart ()
+{
+    scan_playlist = 0;
+    scan_row = 0;
+    scan_schedule ();
+}
+
+#ifdef WARN_BLOCKED
+static void warn_main_thread_blocked ()
+{
+    printf ("\nMain thread blocked, backtrace:\n");
+
+    void * syms[100];
+    int n_syms = backtrace (syms, aud::n_elems (syms));
+    char * * names = backtrace_symbols (syms, n_syms);
+
+    for (int i = 0; i < n_syms; i ++)
+        printf ("%d. %s\n", i, names[i]);
+
+    free (names);
+}
+#endif
+
+/* mutex may be unlocked during the call */
+static Entry * get_entry (int playlist_num, int entry_num,
+ bool need_decoder, bool need_tuple)
+{
+#ifdef WARN_BLOCKED
+    if ((need_decoder || need_tuple) && pthread_self () == main_thread)
+        warn_main_thread_blocked ();
+#endif
+
+    while (1)
+    {
+        PlaylistData * playlist = lookup_playlist (playlist_num);
+        Entry * entry = playlist ? lookup_entry (playlist, entry_num) : nullptr;
+
+        if (! entry || entry->failed)
+            return entry;
+
+        if ((need_decoder && ! entry->decoder) || (need_tuple && ! entry->scanned))
+        {
+            if (! scan_list_find_entry (entry))
+                scan_queue_entry (playlist, entry);
+
+            pthread_cond_wait (& cond, & mutex);
+            continue;
+        }
+
+        return entry;
+    }
+}
+
+/* mutex may be unlocked during the call */
+static Entry * get_playback_entry (int serial)
+{
+    while (1)
+    {
+        if (! playback_check_serial (serial))
+            return nullptr;
+
+        Entry * entry = playing_playlist ? playing_playlist->position : nullptr;
+
+        if (! entry || entry->failed)
+            return entry;
+
+        if (! entry->decoder || ! entry->scanned)
+        {
+            if (! scan_list_find_entry (entry))
+                scan_queue_entry (playing_playlist, entry);
+
+            pthread_cond_wait (& cond, & mutex);
+            continue;
+        }
+
+        return entry;
+    }
+}
+
+void playlist_init ()
+{
+    srand (time (nullptr));
+
+#ifdef WARN_BLOCKED
+    main_thread = pthread_self ();
+#endif
+
+    ENTER;
+
+    update_level = NoUpdate;
+    scan_enabled = false;
+    scan_playlist = scan_row = 0;
+
+    title_formatter.capture (new TupleCompiler);
+
+    LEAVE;
+
+    /* initialize title formatter */
+    playlist_reformat_titles ();
+
+    hook_associate ("set metadata_on_play", (HookFunction) playlist_trigger_scan, nullptr);
+    hook_associate ("set generic_title_format", (HookFunction) playlist_reformat_titles, nullptr);
+    hook_associate ("set show_numbers_in_pl", (HookFunction) playlist_reformat_titles, nullptr);
+    hook_associate ("set leading_zero", (HookFunction) playlist_reformat_titles, nullptr);
+}
+
+void playlist_enable_scan (bool enable)
+{
+    ENTER;
+
+    if (! enable)
+        scan_list.clear ();
+
+    scan_enabled = enable;
+
+    LEAVE;
+
+    if (enable)
+        playlist_trigger_scan ();
+}
+
+void playlist_end ()
+{
+    hook_dissociate ("set metadata_on_play", (HookFunction) playlist_trigger_scan);
+    hook_dissociate ("set generic_title_format", (HookFunction) playlist_reformat_titles);
+    hook_dissociate ("set show_numbers_in_pl", (HookFunction) playlist_reformat_titles);
+    hook_dissociate ("set leading_zero", (HookFunction) playlist_reformat_titles);
+
+    ENTER;
+
+    queued_update.stop ();
+
+    active_playlist = playing_playlist = nullptr;
+    resume_playlist = -1;
+
+    playlists.clear ();
+    unique_id_table.clear ();
+
+    title_formatter.clear ();
+
+    LEAVE;
+}
+
+EXPORT int aud_playlist_count ()
+{
+    ENTER;
+    int count = playlists.len ();
+    RETURN (count);
+}
+
+void playlist_insert_with_id (int at, int id)
+{
+    ENTER;
+
+    if (at < 0 || at > playlists.len ())
+        at = playlists.len ();
+
+    auto playlist = new PlaylistData (id);
+    playlists.insert (at, 1);
+    playlists[at].capture (playlist);
+
+    number_playlists (at, playlists.len () - at);
+
+    queue_update (Structure, playlist, 0, 0);
+    LEAVE;
+}
+
+EXPORT void aud_playlist_insert (int at)
+{
+    playlist_insert_with_id (at, -1);
+}
+
+EXPORT void aud_playlist_reorder (int from, int to, int count)
+{
+    ENTER;
+
+    if (from < 0 || from + count > playlists.len () || to < 0 || to +
+     count > playlists.len () || count < 0)
+        RETURN ();
+
+    Index<SmartPtr<PlaylistData>> displaced;
+
+    if (to < from)
+        displaced.move_from (playlists, to, -1, from - to, true, false);
+    else
+        displaced.move_from (playlists, from + count, -1, to - from, true, false);
+
+    playlists.shift (from, to, count);
+
+    if (to < from)
+    {
+        playlists.move_from (displaced, 0, to + count, from - to, false, true);
+        number_playlists (to, from + count - to);
+    }
+    else
+    {
+        playlists.move_from (displaced, 0, from, to - from, false, true);
+        number_playlists (from, to + count - from);
+    }
+
+    queue_update (Structure, nullptr, 0, 0);
+    LEAVE;
+}
+
+EXPORT void aud_playlist_delete (int playlist_num)
+{
+    ENTER_GET_PLAYLIST ();
+
+    bool was_active = false;
+    bool was_playing = false;
+
+    playlists.remove (playlist_num, 1);
+
+    if (! playlists.len ())
+        playlists.append (SmartNew<PlaylistData> (-1));
+
+    number_playlists (playlist_num, playlists.len () - playlist_num);
+
+    if (playlist == active_playlist)
+    {
+        int active_num = aud::min (playlist_num, playlists.len () - 1);
+        active_playlist = playlists[active_num].get ();
+        was_active = true;
+    }
+
+    if (playlist == playing_playlist)
+    {
+        playing_playlist = nullptr;
+        playback_stop ();
+        was_playing = true;
+    }
+
+    queue_update (Structure, nullptr, 0, 0);
+    LEAVE;
+
+    if (was_active)
+        hook_call ("playlist activate", nullptr);
+
+    if (was_playing)
+    {
+        hook_call ("playlist set playing", nullptr);
+        hook_call ("playback stop", nullptr);
+    }
+}
+
+EXPORT int aud_playlist_get_unique_id (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (-1);
+    int unique_id = playlist->unique_id;
+    RETURN (unique_id);
+}
+
+EXPORT int aud_playlist_by_unique_id (int id)
+{
+    ENTER;
+
+    PlaylistData * * ptr = unique_id_table.lookup (id);
+    int num = (ptr && * ptr) ? (* ptr)->number : -1;
+
+    RETURN (num);
+}
+
+EXPORT void aud_playlist_set_filename (int playlist_num, const char * filename)
+{
+    ENTER_GET_PLAYLIST ();
+
+    playlist->filename = String (filename);
+    playlist->modified = true;
+
+    queue_update (Metadata, nullptr, 0, 0);
+    LEAVE;
+}
+
+EXPORT String aud_playlist_get_filename (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (String ());
+    String filename = playlist->filename;
+    RETURN (filename);
+}
+
+EXPORT void aud_playlist_set_title (int playlist_num, const char * title)
+{
+    ENTER_GET_PLAYLIST ();
+
+    playlist->title = String (title);
+    playlist->modified = true;
+
+    queue_update (Metadata, nullptr, 0, 0);
+    LEAVE;
+}
+
+EXPORT String aud_playlist_get_title (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (String ());
+    String title = playlist->title;
+    RETURN (title);
+}
+
+void playlist_set_modified (int playlist_num, bool modified)
+{
+    ENTER_GET_PLAYLIST ();
+    playlist->modified = modified;
+    LEAVE;
+}
+
+bool playlist_get_modified (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (false);
+    bool modified = playlist->modified;
+    RETURN (modified);
+}
+
+EXPORT void aud_playlist_set_active (int playlist_num)
+{
+    ENTER_GET_PLAYLIST ();
+
+    bool changed = false;
+
+    if (playlist != active_playlist)
+    {
+        changed = true;
+        active_playlist = playlist;
+    }
+
+    LEAVE;
+
+    if (changed)
+        hook_call ("playlist activate", nullptr);
+}
+
+EXPORT int aud_playlist_get_active ()
+{
+    ENTER;
+    int list = active_playlist ? active_playlist->number : -1;
+    RETURN (list);
+}
+
+EXPORT void aud_playlist_play (int playlist_num, bool paused)
+{
+    ENTER;
+
+    PlaylistData * playlist = lookup_playlist (playlist_num);
+    bool position_changed = false;
+
+    if (playlist == playing_playlist)
+    {
+        /* already playing, just need to pause/unpause */
+        if (aud_drct_get_paused () != paused)
+            aud_drct_pause ();
+
+        RETURN ();
+    }
+
+    if (playing_playlist)
+        playing_playlist->resume_time = aud_drct_get_time ();
+
+    /* is there anything to play? */
+    if (playlist && ! playlist->position)
+    {
+        if (next_song_locked (playlist, true, 0))
+            position_changed = true;
+        else
+            playlist = nullptr;
+    }
+
+    playing_playlist = playlist;
+
+    if (playlist)
+        playback_play (playlist->resume_time, paused);
+    else
+        playback_stop ();
+
+    LEAVE;
+
+    if (position_changed)
+        hook_call ("playlist position", aud::to_ptr (playlist_num));
+
+    hook_call ("playlist set playing", nullptr);
+
+    if (playlist)
+        hook_call ("playback begin", nullptr);
+    else
+        hook_call ("playback stop", nullptr);
+}
+
+EXPORT int aud_playlist_get_playing ()
+{
+    ENTER;
+    int list = playing_playlist ? playing_playlist->number: -1;
+    RETURN (list);
+}
+
+EXPORT int aud_playlist_get_blank ()
+{
+    int list = aud_playlist_get_active ();
+    String title = aud_playlist_get_title (list);
+
+    if (strcmp (title, _(default_title)) || aud_playlist_entry_count (list) > 0)
+    {
+        list = aud_playlist_count ();
+        aud_playlist_insert (list);
+    }
+
+    return list;
+}
+
+EXPORT int aud_playlist_get_temporary ()
+{
+    int count = aud_playlist_count ();
+
+    for (int list = 0; list < count; list ++)
+    {
+        String title = aud_playlist_get_title (list);
+        if (! strcmp (title, _(temp_title)))
+            return list;
+    }
+
+    int list = aud_playlist_get_blank ();
+    aud_playlist_set_title (list, _(temp_title));
+    return list;
+}
+
+static void set_position (PlaylistData * playlist, Entry * entry, bool update_shuffle)
+{
+    playlist->position = entry;
+    playlist->resume_time = 0;
+
+    /* move entry to top of shuffle list */
+    if (entry && update_shuffle)
+        entry->shuffle_num = ++ playlist->last_shuffle_num;
+}
+
+// updates playback state (while locked) if playlist position was changed
+static PlaybackChange change_playback (PlaylistData * playlist)
+{
+    if (playlist != playing_playlist)
+        return NoChange;
+
+    if (playlist->position)
+    {
+        playback_play (0, aud_drct_get_paused ());
+        return NextSong;
+    }
+    else
+    {
+        playing_playlist = nullptr;
+        playback_stop ();
+        return PlaybackStopped;
+    }
+}
+
+// call hooks (while unlocked) if playback state was changed
+static void call_playback_change_hooks (PlaybackChange change)
+{
+    if (change == NextSong)
+        hook_call ("playback begin", nullptr);
+
+    if (change == PlaybackStopped)
+    {
+        hook_call ("playlist set playing", nullptr);
+        hook_call ("playback stop", nullptr);
+    }
+}
+
+EXPORT int aud_playlist_entry_count (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (0);
+    int count = playlist->entries.len ();
+    RETURN (count);
+}
+
+void playlist_entry_insert_batch_raw (int playlist_num, int at, Index<PlaylistAddItem> && items)
+{
+    ENTER_GET_PLAYLIST ();
+
+    int entries = playlist->entries.len ();
+
+    if (at < 0 || at > entries)
+        at = entries;
+
+    int number = items.len ();
+
+    playlist->entries.insert (at, number);
+
+    int i = at;
+    for (auto & item : items)
+    {
+        Entry * entry = new Entry (std::move (item));
+        playlist->entries[i ++].capture (entry);
+        playlist->total_length += entry->length;
+    }
+
+    items.clear ();
+
+    number_entries (playlist, at, entries + number - at);
+
+    queue_update (Structure, playlist, at, number);
+    LEAVE;
+}
+
+EXPORT void aud_playlist_entry_delete (int playlist_num, int at, int number)
+{
+    ENTER_GET_PLAYLIST ();
+
+    int entries = playlist->entries.len ();
+    bool position_changed = false, queue_changed = false;
+    PlaybackChange change = NoChange;
+
+    if (at < 0 || at > entries)
+        at = entries;
+    if (number < 0 || number > entries - at)
+        number = entries - at;
+
+    if (playlist->position && playlist->position->number >= at &&
+     playlist->position->number < at + number)
+    {
+        set_position (playlist, nullptr, false);
+        position_changed = true;
+    }
+
+    if (playlist->focus && playlist->focus->number >= at &&
+     playlist->focus->number < at + number)
+    {
+        if (at + number < entries)
+            playlist->focus = playlist->entries[at + number].get ();
+        else if (at > 0)
+            playlist->focus = playlist->entries[at - 1].get ();
+        else
+            playlist->focus = nullptr;
+    }
+
+    for (int count = 0; count < number; count ++)
+    {
+        Entry * entry = playlist->entries [at + count].get ();
+
+        if (entry->queued)
+        {
+            playlist->queued.remove (playlist->queued.find (entry), 1);
+            queue_changed = true;
+        }
+
+        if (entry->selected)
+        {
+            playlist->selected_count --;
+            playlist->selected_length -= entry->length;
+        }
+
+        playlist->total_length -= entry->length;
+    }
+
+    playlist->entries.remove (at, number);
+    number_entries (playlist, at, entries - at - number);
+
+    if (position_changed)
+    {
+        if (aud_get_bool (nullptr, "advance_on_delete"))
+            next_song_locked (playlist, aud_get_bool (nullptr, "repeat"), at);
+
+        change = change_playback (playlist);
+    }
+
+    queue_update (Structure, playlist, at, 0, queue_changed);
+    LEAVE;
+
+    if (position_changed)
+        hook_call ("playlist position", aud::to_ptr (playlist_num));
+
+    call_playback_change_hooks (change);
+}
+
+EXPORT String aud_playlist_entry_get_filename (int playlist_num, int entry_num)
+{
+    ENTER_GET_ENTRY (String ());
+    String filename = entry->filename;
+    RETURN (filename);
+}
+
+EXPORT PluginHandle * aud_playlist_entry_get_decoder (int playlist_num,
+ int entry_num, GetMode mode, String * error)
+{
+    ENTER;
+
+    const bool wait = (mode == Wait || mode == WaitGuess);
+
+    Entry * entry = get_entry (playlist_num, entry_num, wait, false);
+    PluginHandle * decoder = entry ? entry->decoder : nullptr;
+
+    if (error)
+        * error = entry ? entry->error : String ();
+
+    RETURN (decoder);
+}
+
+EXPORT Tuple aud_playlist_entry_get_tuple (int playlist_num, int entry_num,
+ GetMode mode, String * error)
+{
+    ENTER;
+
+    const bool wait = (mode == Wait || mode == WaitGuess);
+    const bool guess = (mode == Guess || mode == WaitGuess);
+
+    Entry * entry = get_entry (playlist_num, entry_num, false, wait);
+
+    Tuple tuple;
+    if (entry && ((entry->scanned && ! entry->failed) || guess))
+        tuple = entry->tuple.ref ();
+
+    if (error)
+        * error = entry ? entry->error : String ();
+
+    RETURN (tuple);
+}
+
+EXPORT void aud_playlist_set_position (int playlist_num, int entry_num)
+{
+    ENTER_GET_PLAYLIST ();
+
+    Entry * entry = lookup_entry (playlist, entry_num);
+    set_position (playlist, entry, true);
+
+    PlaybackChange change = change_playback (playlist);
+
+    LEAVE;
+
+    hook_call ("playlist position", aud::to_ptr (playlist_num));
+    call_playback_change_hooks (change);
+}
+
+EXPORT int aud_playlist_get_position (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (-1);
+    int position = playlist->position ? playlist->position->number : -1;
+    RETURN (position);
+}
+
+EXPORT void aud_playlist_set_focus (int playlist_num, int entry_num)
+{
+    ENTER_GET_PLAYLIST ();
+
+    int first = INT_MAX;
+    int last = -1;
+
+    if (playlist->focus)
+    {
+        first = aud::min (first, playlist->focus->number);
+        last = aud::max (last, playlist->focus->number);
+    }
+
+    playlist->focus = lookup_entry (playlist, entry_num);
+
+    if (playlist->focus)
+    {
+        first = aud::min (first, playlist->focus->number);
+        last = aud::max (last, playlist->focus->number);
+    }
+
+    if (first <= last)
+        queue_update (Selection, playlist, first, last + 1 - first);
+
+    LEAVE;
+}
+
+EXPORT int aud_playlist_get_focus (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (-1);
+    int focus = playlist->focus ? playlist->focus->number : -1;
+    RETURN (focus);
+}
+
+EXPORT void aud_playlist_entry_set_selected (int playlist_num, int entry_num,
+ bool selected)
+{
+    ENTER_GET_ENTRY ();
+
+    if (entry->selected == selected)
+        RETURN ();
+
+    entry->selected = selected;
+
+    if (selected)
+    {
+        playlist->selected_count++;
+        playlist->selected_length += entry->length;
+    }
+    else
+    {
+        playlist->selected_count--;
+        playlist->selected_length -= entry->length;
+    }
+
+    queue_update (Selection, playlist, entry_num, 1);
+    LEAVE;
+}
+
+EXPORT bool aud_playlist_entry_get_selected (int playlist_num, int entry_num)
+{
+    ENTER_GET_ENTRY (false);
+    bool selected = entry->selected;
+    RETURN (selected);
+}
+
+EXPORT int aud_playlist_selected_count (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (0);
+    int selected_count = playlist->selected_count;
+    RETURN (selected_count);
+}
+
+EXPORT void aud_playlist_select_all (int playlist_num, bool selected)
+{
+    ENTER_GET_PLAYLIST ();
+
+    int entries = playlist->entries.len ();
+    int first = entries, last = 0;
+
+    for (auto & entry : playlist->entries)
+    {
+        if ((selected && ! entry->selected) || (entry->selected && ! selected))
+        {
+            entry->selected = selected;
+            first = aud::min (first, entry->number);
+            last = entry->number;
+        }
+    }
+
+    if (selected)
+    {
+        playlist->selected_count = entries;
+        playlist->selected_length = playlist->total_length;
+    }
+    else
+    {
+        playlist->selected_count = 0;
+        playlist->selected_length = 0;
+    }
+
+    if (first < entries)
+        queue_update (Selection, playlist, first, last + 1 - first);
+
+    LEAVE;
+}
+
+EXPORT int aud_playlist_shift (int playlist_num, int entry_num, int distance)
+{
+    ENTER_GET_ENTRY (0);
+
+    if (! entry->selected || ! distance)
+        RETURN (0);
+
+    int entries = playlist->entries.len ();
+    int shift = 0, center, top, bottom;
+
+    if (distance < 0)
+    {
+        for (center = entry_num; center > 0 && shift > distance; )
+        {
+            if (! playlist->entries[-- center]->selected)
+                shift --;
+        }
+    }
+    else
+    {
+        for (center = entry_num + 1; center < entries && shift < distance; )
+        {
+            if (! playlist->entries[center ++]->selected)
+                shift ++;
+        }
+    }
+
+    top = bottom = center;
+
+    for (int i = 0; i < top; i ++)
+    {
+        if (playlist->entries[i]->selected)
+            top = i;
+    }
+
+    for (int i = entries; i > bottom; i --)
+    {
+        if (playlist->entries[i - 1]->selected)
+            bottom = i;
+    }
+
+    Index<SmartPtr<Entry>> temp;
+
+    for (int i = top; i < center; i ++)
+    {
+        if (! playlist->entries[i]->selected)
+            temp.append (std::move (playlist->entries[i]));
+    }
+
+    for (int i = top; i < bottom; i ++)
+    {
+        if (playlist->entries[i] && playlist->entries[i]->selected)
+            temp.append (std::move (playlist->entries[i]));
+    }
+
+    for (int i = center; i < bottom; i ++)
+    {
+        if (playlist->entries[i] && ! playlist->entries[i]->selected)
+            temp.append (std::move (playlist->entries[i]));
+    }
+
+    playlist->entries.move_from (temp, 0, top, bottom - top, false, true);
+
+    number_entries (playlist, top, bottom - top);
+    queue_update (Structure, playlist, top, bottom - top);
+
+    RETURN (shift);
+}
+
+static Entry * find_unselected_focus (PlaylistData * playlist)
+{
+    if (! playlist->focus || ! playlist->focus->selected)
+        return playlist->focus;
+
+    int entries = playlist->entries.len ();
+
+    for (int search = playlist->focus->number + 1; search < entries; search ++)
+    {
+        Entry * entry = playlist->entries[search].get ();
+        if (! entry->selected)
+            return entry;
+    }
+
+    for (int search = playlist->focus->number; search --;)
+    {
+        Entry * entry = playlist->entries[search].get ();
+        if (! entry->selected)
+            return entry;
+    }
+
+    return nullptr;
+}
+
+EXPORT void aud_playlist_delete_selected (int playlist_num)
+{
+    ENTER_GET_PLAYLIST ();
+
+    if (! playlist->selected_count)
+        RETURN ();
+
+    int entries = playlist->entries.len ();
+    bool position_changed = false, queue_changed = false;
+    PlaybackChange change = NoChange;
+
+    if (playlist->position && playlist->position->selected)
+    {
+        set_position (playlist, nullptr, false);
+        position_changed = true;
+    }
+
+    playlist->focus = find_unselected_focus (playlist);
+
+    int before = 0;  // number of entries before first selected
+    int after = 0;   // number of entries after last selected
+
+    while (before < entries && ! playlist->entries[before]->selected)
+        before ++;
+
+    int to = before;
+
+    for (int from = before; from < entries; from ++)
+    {
+        Entry * entry = playlist->entries[from].get ();
+
+        if (entry->selected)
+        {
+            if (entry->queued)
+            {
+                playlist->queued.remove (playlist->queued.find (entry), 1);
+                queue_changed = true;
+            }
+
+            playlist->total_length -= entry->length;
+            after = 0;
+        }
+        else
+        {
+            playlist->entries[to ++] = std::move (playlist->entries[from]);
+            after ++;
+        }
+    }
+
+    entries = to;
+    playlist->entries.remove (entries, -1);
+    number_entries (playlist, before, entries - before);
+
+    playlist->selected_count = 0;
+    playlist->selected_length = 0;
+
+    if (position_changed)
+    {
+        if (aud_get_bool (nullptr, "advance_on_delete"))
+            next_song_locked (playlist, aud_get_bool (nullptr, "repeat"), entries - after);
+
+        change = change_playback (playlist);
+    }
+
+    queue_update (Structure, playlist, before, entries - after - before, queue_changed);
+    LEAVE;
+
+    if (position_changed)
+        hook_call ("playlist position", aud::to_ptr (playlist_num));
+
+    call_playback_change_hooks (change);
+}
+
+EXPORT void aud_playlist_reverse (int playlist_num)
+{
+    ENTER_GET_PLAYLIST ();
+
+    int entries = playlist->entries.len ();
+
+    for (int i = 0; i < entries / 2; i ++)
+        std::swap (playlist->entries[i], playlist->entries[entries - 1 - i]);
+
+    number_entries (playlist, 0, entries);
+    queue_update (Structure, playlist, 0, entries);
+    LEAVE;
+}
+
+EXPORT void aud_playlist_reverse_selected (int playlist_num)
+{
+    ENTER_GET_PLAYLIST ();
+
+    int entries = playlist->entries.len ();
+
+    int top = 0;
+    int bottom = entries - 1;
+
+    while (1)
+    {
+        while (top < bottom && ! playlist->entries[top]->selected)
+            top ++;
+        while (top < bottom && ! playlist->entries[bottom]->selected)
+            bottom --;
+
+        if (top >= bottom)
+            break;
+
+        std::swap (playlist->entries[top ++], playlist->entries[bottom --]);
+    }
+
+    number_entries (playlist, 0, entries);
+    queue_update (Structure, playlist, 0, entries);
+    LEAVE;
+}
+
+EXPORT void aud_playlist_randomize (int playlist_num)
+{
+    ENTER_GET_PLAYLIST ();
+
+    int entries = playlist->entries.len ();
+
+    for (int i = 0; i < entries; i ++)
+        std::swap (playlist->entries[i], playlist->entries[rand () % entries]);
+
+    number_entries (playlist, 0, entries);
+    queue_update (Structure, playlist, 0, entries);
+    LEAVE;
+}
+
+EXPORT void aud_playlist_randomize_selected (int playlist_num)
+{
+    ENTER_GET_PLAYLIST ();
+
+    int entries = playlist->entries.len ();
+
+    Index<Entry *> selected;
+
+    for (auto & entry : playlist->entries)
+    {
+        if (entry->selected)
+            selected.append (entry.get ());
+    }
+
+    int n_selected = selected.len ();
+
+    for (int i = 0; i < n_selected; i ++)
+    {
+        int a = selected[i]->number;
+        int b = selected[rand () % n_selected]->number;
+        std::swap (playlist->entries[a], playlist->entries[b]);
+    }
+
+    number_entries (playlist, 0, entries);
+    queue_update (Structure, playlist, 0, entries);
+    LEAVE;
+}
+
+enum {COMPARE_TYPE_FILENAME, COMPARE_TYPE_TUPLE, COMPARE_TYPE_TITLE};
+
+struct CompareData {
+    PlaylistStringCompareFunc filename_compare;
+    PlaylistTupleCompareFunc tuple_compare;
+};
+
+static int compare_cb (const SmartPtr<Entry> & a, const SmartPtr<Entry> & b, void * _data)
+{
+    CompareData * data = (CompareData *) _data;
+
+    int diff = 0;
+
+    if (data->filename_compare)
+        diff = data->filename_compare (a->filename, b->filename);
+    else if (data->tuple_compare)
+        diff = data->tuple_compare (a->tuple, b->tuple);
+
+    if (diff)
+        return diff;
+
+    /* preserve order of "equal" entries */
+    return a->number - b->number;
+}
+
+static void sort (PlaylistData * playlist, CompareData * data)
+{
+    playlist->entries.sort (compare_cb, data);
+    number_entries (playlist, 0, playlist->entries.len ());
+
+    queue_update (Structure, playlist, 0, playlist->entries.len ());
+}
+
+static void sort_selected (PlaylistData * playlist, CompareData * data)
+{
+    int entries = playlist->entries.len ();
+
+    Index<SmartPtr<Entry>> selected;
+
+    for (auto & entry : playlist->entries)
+    {
+        if (entry->selected)
+            selected.append (std::move (entry));
+    }
+
+    selected.sort (compare_cb, data);
+
+    int i = 0;
+    for (auto & entry : playlist->entries)
+    {
+        if (! entry)
+            entry = std::move (selected[i ++]);
+    }
+
+    number_entries (playlist, 0, entries);
+    queue_update (Structure, playlist, 0, entries);
+}
+
+static bool entries_are_scanned (PlaylistData * playlist, bool selected)
+{
+    for (auto & entry : playlist->entries)
+    {
+        if (selected && ! entry->selected)
+            continue;
+
+        if (! entry->scanned)
+        {
+            aud_ui_show_error (_("The playlist cannot be sorted because "
+             "metadata scanning is still in progress (or has been disabled)."));
+            return false;
+        }
+    }
+
+    return true;
+}
+
+EXPORT void aud_playlist_sort_by_filename (int playlist_num, PlaylistStringCompareFunc compare)
+{
+    ENTER_GET_PLAYLIST ();
+
+    CompareData data = {compare};
+    sort (playlist, & data);
+
+    LEAVE;
+}
+
+EXPORT void aud_playlist_sort_by_tuple (int playlist_num, PlaylistTupleCompareFunc compare)
+{
+    ENTER_GET_PLAYLIST ();
+
+    CompareData data = {nullptr, compare};
+    if (entries_are_scanned (playlist, false))
+        sort (playlist, & data);
+
+    LEAVE;
+}
+
+EXPORT void aud_playlist_sort_selected_by_filename (int playlist_num,
+ PlaylistStringCompareFunc compare)
+{
+    ENTER_GET_PLAYLIST ();
+
+    CompareData data = {compare};
+    sort_selected (playlist, & data);
+
+    LEAVE;
+}
+
+EXPORT void aud_playlist_sort_selected_by_tuple (int playlist_num,
+ PlaylistTupleCompareFunc compare)
+{
+    ENTER_GET_PLAYLIST ();
+
+    CompareData data = {nullptr, compare};
+    if (entries_are_scanned (playlist, true))
+        sort_selected (playlist, & data);
+
+    LEAVE;
+}
+
+static void playlist_reformat_titles ()
+{
+    ENTER;
+
+    String format = aud_get_str (nullptr, "generic_title_format");
+    title_formatter->compile (format);
+
+    for (auto & playlist : playlists)
+    {
+        for (auto & entry : playlist->entries)
+            title_formatter->format (entry->tuple);
+
+        queue_update (Metadata, playlist.get (), 0, playlist->entries.len ());
+    }
+
+    LEAVE;
+}
+
+static void playlist_trigger_scan ()
+{
+    ENTER;
+
+    for (auto & playlist : playlists)
+        scan_queue_playlist (playlist.get ());
+
+    scan_restart ();
+
+    LEAVE;
+}
+
+static void playlist_rescan_real (int playlist_num, bool selected)
+{
+    ENTER_GET_PLAYLIST ();
+
+    for (auto & entry : playlist->entries)
+    {
+        if (! selected || entry->selected)
+            playlist->set_entry_tuple (entry.get (), Tuple ());
+    }
+
+    queue_update (Metadata, playlist, 0, playlist->entries.len ());
+    scan_queue_playlist (playlist);
+    scan_restart ();
+    LEAVE;
+}
+
+EXPORT void aud_playlist_rescan (int playlist_num)
+{
+    playlist_rescan_real (playlist_num, false);
+}
+
+EXPORT void aud_playlist_rescan_selected (int playlist_num)
+{
+    playlist_rescan_real (playlist_num, true);
+}
+
+EXPORT void aud_playlist_rescan_file (const char * filename)
+{
+    ENTER;
+
+    bool restart = false;
+
+    for (auto & playlist : playlists)
+    {
+        bool queue = false;
+
+        for (auto & entry : playlist->entries)
+        {
+            if (! strcmp (entry->filename, filename))
+            {
+                playlist->set_entry_tuple (entry.get (), Tuple ());
+                queue_update (Metadata, playlist.get (), entry->number, 1);
+                queue = true;
+            }
+        }
+
+        if (queue)
+        {
+            scan_queue_playlist (playlist.get ());
+            restart = true;
+        }
+    }
+
+    if (restart)
+        scan_restart ();
+
+    LEAVE;
+}
+
+EXPORT int64_t aud_playlist_get_total_length (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (0);
+    int64_t length = playlist->total_length;
+    RETURN (length);
+}
+
+EXPORT int64_t aud_playlist_get_selected_length (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (0);
+    int64_t length = playlist->selected_length;
+    RETURN (length);
+}
+
+EXPORT int aud_playlist_queue_count (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (0);
+    int count = playlist->queued.len ();
+    RETURN (count);
+}
+
+EXPORT void aud_playlist_queue_insert (int playlist_num, int at, int entry_num)
+{
+    ENTER_GET_ENTRY ();
+
+    if (entry->queued || at > playlist->queued.len ())
+        RETURN ();
+
+    if (at < 0)
+        playlist->queued.append (entry);
+    else
+    {
+        playlist->queued.insert (at, 1);
+        playlist->queued[at] = entry;
+    }
+
+    entry->queued = true;
+
+    queue_update (Selection, playlist, entry_num, 1, true);
+    LEAVE;
+}
+
+EXPORT void aud_playlist_queue_insert_selected (int playlist_num, int at)
+{
+    ENTER_GET_PLAYLIST ();
+
+    if (at > playlist->queued.len ())
+        RETURN ();
+
+    Index<Entry *> add;
+    int first = playlist->entries.len ();
+    int last = 0;
+
+    for (auto & entry : playlist->entries)
+    {
+        if (! entry->selected || entry->queued)
+            continue;
+
+        add.append (entry.get ());
+        entry->queued = true;
+        first = aud::min (first, entry->number);
+        last = entry->number;
+    }
+
+    playlist->queued.move_from (add, 0, at, -1, true, true);
+
+    if (first < playlist->entries.len ())
+        queue_update (Selection, playlist, first, last + 1 - first, true);
+
+    LEAVE;
+}
+
+EXPORT int aud_playlist_queue_get_entry (int playlist_num, int at)
+{
+    ENTER_GET_PLAYLIST (-1);
+
+    int entry_num = -1;
+    if (at >= 0 && at < playlist->queued.len ())
+        entry_num = playlist->queued[at]->number;
+
+    RETURN (entry_num);
+}
+
+EXPORT int aud_playlist_queue_find_entry (int playlist_num, int entry_num)
+{
+    ENTER_GET_ENTRY (-1);
+    int pos = entry->queued ? playlist->queued.find (entry) : -1;
+    RETURN (pos);
+}
+
+EXPORT void aud_playlist_queue_delete (int playlist_num, int at, int number)
+{
+    ENTER_GET_PLAYLIST ();
+
+    if (at < 0 || number < 0 || at + number > playlist->queued.len ())
+        RETURN ();
+
+    int entries = playlist->entries.len ();
+    int first = entries, last = 0;
+
+    for (int i = at; i < at + number; i ++)
+    {
+        Entry * entry = playlist->queued[i];
+        entry->queued = false;
+        first = aud::min (first, entry->number);
+        last = entry->number;
+    }
+
+    playlist->queued.remove (at, number);
+
+    if (first < entries)
+        queue_update (Selection, playlist, first, last + 1 - first, true);
+
+    LEAVE;
+}
+
+EXPORT void aud_playlist_queue_delete_selected (int playlist_num)
+{
+    ENTER_GET_PLAYLIST ();
+
+    int entries = playlist->entries.len ();
+    int first = entries, last = 0;
+
+    for (int i = 0; i < playlist->queued.len ();)
+    {
+        Entry * entry = playlist->queued[i];
+
+        if (entry->selected)
+        {
+            playlist->queued.remove (i, 1);
+            entry->queued = false;
+            first = aud::min (first, entry->number);
+            last = entry->number;
+        }
+        else
+            i ++;
+    }
+
+    if (first < entries)
+        queue_update (Selection, playlist, first, last + 1 - first, true);
+
+    LEAVE;
+}
+
+static bool shuffle_prev (PlaylistData * playlist)
+{
+    Entry * found = nullptr;
+
+    for (auto & entry : playlist->entries)
+    {
+        if (entry->shuffle_num && (! playlist->position ||
+         entry->shuffle_num < playlist->position->shuffle_num) && (! found
+         || entry->shuffle_num > found->shuffle_num))
+            found = entry.get ();
+    }
+
+    if (! found)
+        return false;
+
+    set_position (playlist, found, false);
+    return true;
+}
+
+bool playlist_prev_song (int playlist_num)
+{
+    ENTER_GET_PLAYLIST (false);
+
+    if (aud_get_bool (nullptr, "shuffle"))
+    {
+        if (! shuffle_prev (playlist))
+            RETURN (false);
+    }
+    else
+    {
+        if (! playlist->position || playlist->position->number == 0)
+            RETURN (false);
+
+        set_position (playlist, playlist->entries[playlist->position->number - 1].get (), true);
+    }
+
+    PlaybackChange change = change_playback (playlist);
+
+    LEAVE;
+
+    hook_call ("playlist position", aud::to_ptr (playlist_num));
+    call_playback_change_hooks (change);
+    return true;
+}
+
+static bool shuffle_next (PlaylistData * playlist)
+{
+    int choice = 0;
+    Entry * found = nullptr;
+
+    for (auto & entry : playlist->entries)
+    {
+        if (! entry->shuffle_num)
+            choice ++;
+        else if (playlist->position &&
+         entry->shuffle_num > playlist->position->shuffle_num &&
+         (! found || entry->shuffle_num < found->shuffle_num))
+            found = entry.get ();
+    }
+
+    if (found)
+    {
+        set_position (playlist, found, false);
+        return true;
+    }
+
+    if (! choice)
+        return false;
+
+    choice = rand () % choice;
+
+    for (auto & entry : playlist->entries)
+    {
+        if (! entry->shuffle_num)
+        {
+            if (! choice)
+            {
+                set_position (playlist, entry.get (), true);
+                break;
+            }
+
+            choice --;
+        }
+    }
+
+    return true;
+}
+
+static void shuffle_reset (PlaylistData * playlist)
+{
+    playlist->last_shuffle_num = 0;
+
+    for (auto & entry : playlist->entries)
+        entry->shuffle_num = 0;
+}
+
+static bool next_song_locked (PlaylistData * playlist, bool repeat, int hint)
+{
+    int entries = playlist->entries.len ();
+    if (! entries)
+        return false;
+
+    if (playlist->queued.len ())
+    {
+        set_position (playlist, playlist->queued[0], true);
+        playlist->queued.remove (0, 1);
+        playlist->position->queued = false;
+
+        queue_update (Selection, playlist, playlist->position->number, 1, true);
+    }
+    else if (aud_get_bool (nullptr, "shuffle"))
+    {
+        if (! shuffle_next (playlist))
+        {
+            if (! repeat)
+                return false;
+
+            shuffle_reset (playlist);
+
+            if (! shuffle_next (playlist))
+                return false;
+        }
+    }
+    else
+    {
+        if (hint >= entries)
+        {
+            if (! repeat)
+                return false;
+
+            hint = 0;
+        }
+
+        set_position (playlist, playlist->entries[hint].get (), true);
+    }
+
+    return true;
+}
+
+bool playlist_next_song (int playlist_num, bool repeat)
+{
+    ENTER_GET_PLAYLIST (false);
+
+    int hint = playlist->position ? playlist->position->number + 1 : 0;
+
+    if (! next_song_locked (playlist, repeat, hint))
+        RETURN (false);
+
+    PlaybackChange change = change_playback (playlist);
+
+    LEAVE;
+
+    hook_call ("playlist position", aud::to_ptr (playlist_num));
+    call_playback_change_hooks (change);
+    return true;
+}
+
+bool playback_entry_read (int serial, String & error)
+{
+    ENTER;
+    bool success = false;
+    Entry * entry = get_playback_entry (serial);
+
+    if (entry && send_playback_info (entry))
+    {
+        success = ! entry->failed;
+        error = entry->error;
+    }
+
+    RETURN (success);
+}
+
+void playback_entry_set_tuple (int serial, Tuple && tuple)
+{
+    ENTER;
+    PlaylistData * playlist = playing_playlist;
+    if (! playlist || ! playlist->position || ! playback_check_serial (serial))
+        RETURN ();
+
+    Entry * entry = playlist->position;
+    playlist->set_entry_tuple (entry, std::move (tuple));
+
+    queue_update (Metadata, playlist, entry->number, 1);
+    LEAVE;
+}
+
+void playlist_save_state ()
+{
+    /* get playback state before locking playlists */
+    bool paused = aud_drct_get_paused ();
+    int time = aud_drct_get_time ();
+
+    ENTER;
+
+    const char * user_dir = aud_get_path (AudPath::UserDir);
+    StringBuf path = filename_build ({user_dir, STATE_FILE});
+
+    FILE * handle = g_fopen (path, "w");
+    if (! handle)
+        RETURN ();
+
+    fprintf (handle, "active %d\n", active_playlist ? active_playlist->number : -1);
+    fprintf (handle, "playing %d\n", playing_playlist ? playing_playlist->number : -1);
+
+    for (auto & playlist : playlists)
+    {
+        fprintf (handle, "playlist %d\n", playlist->number);
+
+        if (playlist->filename)
+            fprintf (handle, "filename %s\n", (const char *) playlist->filename);
+
+        fprintf (handle, "position %d\n", playlist->position ? playlist->position->number : -1);
+
+        /* resume state is stored per-playlist for historical reasons */
+        bool is_playing = (playlist.get () == playing_playlist);
+        fprintf (handle, "resume-state %d\n", (is_playing && paused) ? ResumePause : ResumePlay);
+        fprintf (handle, "resume-time %d\n", is_playing ? time : playlist->resume_time);
+    }
+
+    fclose (handle);
+    LEAVE;
+}
+
+static char parse_key[512];
+static char * parse_value;
+
+static void parse_next (FILE * handle)
+{
+    parse_value = nullptr;
+
+    if (! fgets (parse_key, sizeof parse_key, handle))
+        return;
+
+    char * space = strchr (parse_key, ' ');
+    if (! space)
+        return;
+
+    * space = 0;
+    parse_value = space + 1;
+
+    char * newline = strchr (parse_value, '\n');
+    if (newline)
+        * newline = 0;
+}
+
+static bool parse_integer (const char * key, int * value)
+{
+    return (parse_value && ! strcmp (parse_key, key) && sscanf (parse_value, "%d", value) == 1);
+}
+
+static String parse_string (const char * key)
+{
+    return (parse_value && ! strcmp (parse_key, key)) ? String (parse_value) : String ();
+}
+
+void playlist_load_state ()
+{
+    ENTER;
+    int playlist_num;
+
+    const char * user_dir = aud_get_path (AudPath::UserDir);
+    StringBuf path = filename_build ({user_dir, STATE_FILE});
+
+    FILE * handle = g_fopen (path, "r");
+    if (! handle)
+        RETURN ();
+
+    parse_next (handle);
+
+    if (parse_integer ("active", & playlist_num))
+    {
+        if (! (active_playlist = lookup_playlist (playlist_num)))
+            active_playlist = playlists[0].get ();
+        parse_next (handle);
+    }
+
+    if (parse_integer ("playing", & resume_playlist))
+        parse_next (handle);
+
+    while (parse_integer ("playlist", & playlist_num) && playlist_num >= 0 &&
+     playlist_num < playlists.len ())
+    {
+        PlaylistData * playlist = playlists[playlist_num].get ();
+        int entries = playlist->entries.len ();
+
+        parse_next (handle);
+
+        playlist->filename = parse_string ("filename");
+        if (playlist->filename)
+            parse_next (handle);
+
+        int position = -1;
+        if (parse_integer ("position", & position))
+            parse_next (handle);
+
+        if (position >= 0 && position < entries)
+            set_position (playlist, playlist->entries [position].get (), true);
+
+        /* resume state is stored per-playlist for historical reasons */
+        int resume_state = ResumePlay;
+        if (parse_integer ("resume-state", & resume_state))
+            parse_next (handle);
+
+        if (playlist_num == resume_playlist)
+        {
+            if (resume_state == ResumeStop)
+                resume_playlist = -1;
+            if (resume_state == ResumePause)
+                resume_paused = true;
+        }
+
+        if (parse_integer ("resume-time", & playlist->resume_time))
+            parse_next (handle);
+    }
+
+    fclose (handle);
+
+    /* clear updates queued during init sequence */
+
+    for (auto & playlist : playlists)
+    {
+        playlist->next_update = Update ();
+        playlist->last_update = Update ();
+    }
+
+    queued_update.stop ();
+    update_level = NoUpdate;
+
+    LEAVE;
+}
+
+EXPORT void aud_resume ()
+{
+    if (aud_get_bool (nullptr, "always_resume_paused"))
+        resume_paused = true;
+
+    aud_playlist_play (resume_playlist, resume_paused);
+}
diff --git a/src/libaudcore/playlist.h b/src/libaudcore/playlist.h
new file mode 100644
index 000000000000..6649a652cec8
--- /dev/null
+++ b/src/libaudcore/playlist.h
@@ -0,0 +1,381 @@
+/*
+ * playlist.h
+ * Copyright 2010-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_PLAYLIST_H
+#define LIBAUDCORE_PLAYLIST_H
+
+#include <stdint.h>
+
+#include <libaudcore/index.h>
+#include <libaudcore/tuple.h>
+
+namespace Playlist {
+
+/* The values which can be passed to the "playlist update" hook.  Selection
+ * means that entries have been selected or unselected, or that entries have
+ * been added to or removed from the queue.  Metadata means that new metadata
+ * has been read for some entries, or that the title or filename of a playlist
+ * has changed, and implies Selection.  Structure covers any other change, and
+ * implies both Selection and Metadata. */
+enum UpdateLevel {
+    NoUpdate = 0,
+    Selection,
+    Metadata,
+    Structure
+};
+
+struct Update {
+    UpdateLevel level;   // type of update
+    int before;          // number of unaffected entries at playlist start
+    int after;           // number of unaffected entries at playlist end
+    bool queue_changed;  // true if entries have been added to/removed from queue
+};
+
+/* The values which can be passed to playlist_sort_by_scheme(),
+ * playlist_sort_selected_by_scheme(), and
+ * playlist_remove_duplicates_by_scheme().  PlaylistSort::Path means the entire
+ * URI of a song file; PlaylistSort::Filename means the portion after the last
+ * "/" (forward slash).  PlaylistSort::Date means the song's release date (not
+ * the file's modification time). */
+enum SortType {
+    Path,
+    Filename,
+    Title,
+    Album,
+    Artist,
+    AlbumArtist,
+    Date,
+    Genre,
+    Track,
+    FormattedTitle,
+    Length,
+    n_sort_types
+};
+
+/* Possible behaviors for playlist_entry_get_{decoder, tuple}. */
+enum GetMode {
+    Nothing,   // immediately return nullptr or Tuple() if not yet scanned
+    Guess,     // immediately return a best guess if not yet scanned
+    Wait,      // wait for the entry to be scanned; return nullptr or Tuple() on failure
+    WaitGuess  // wait for the entry to be scanned; return a best guess on failure
+};
+
+} // namespace Playlist
+
+typedef bool (* PlaylistFilterFunc) (const char * filename, void * user);
+typedef int (* PlaylistStringCompareFunc) (const char * a, const char * b);
+typedef int (* PlaylistTupleCompareFunc) (const Tuple & a, const Tuple & b);
+
+/* --- PLAYLIST CORE API --- */
+
+/* Returns the number of playlists currently open.  There will always be at
+ * least one playlist open.  The playlists are numbered starting from zero. */
+int aud_playlist_count ();
+
+/* Adds a new playlist before the one numbered <at>.  If <at> is -1 or equal to
+ * the number of playlists, adds a new playlist after the last one. */
+void aud_playlist_insert (int at);
+
+/* Moves a contiguous block of <count> playlists starting with the one numbered
+ * <from> such that that playlist ends up at the position <to>. */
+void aud_playlist_reorder (int from, int to, int count);
+
+/* Closes a playlist.  CAUTION: The playlist is not saved, and no confirmation
+ * is presented to the user.  If <playlist> is the only playlist, a new playlist
+ * is added.  If <playlist> is the active playlist, another playlist is marked
+ * active.  If <playlist> is the currently playing playlist, playback is
+ * stopped. */
+void aud_playlist_delete (int playlist);
+
+/* Returns a unique non-negative integer which can be used to identify a given
+ * playlist even if its numbering changes (as when playlists are reordered).
+ * On error, returns -1. */
+int aud_playlist_get_unique_id (int playlist);
+
+/* Returns the number of the playlist identified by a given integer ID as
+ * returned by playlist_get_unique_id().  If the playlist no longer exists,
+ * returns -1. */
+int aud_playlist_by_unique_id (int id);
+
+/* Sets the filename associated with a playlist.  (Audacious currently makes no
+ * use of the filename.) */
+void aud_playlist_set_filename (int playlist, const char * filename);
+
+/* Returns the filename associated with a playlist. */
+String aud_playlist_get_filename (int playlist);
+
+/* Sets the title associated with a playlist. */
+void aud_playlist_set_title (int playlist, const char * title);
+
+/* Returns the title associated with a playlist. */
+String aud_playlist_get_title (int playlist);
+
+/* Sets the active playlist.  This is the playlist that user interfaces will
+ * show to the user. */
+void aud_playlist_set_active (int playlist);
+
+/* Returns the number of the active playlist. */
+int aud_playlist_get_active ();
+
+/* Starts playback of a playlist, resuming from the position last played if
+ * possible.  If <playlist> is -1 or if the requested playlist is empty, stops
+ * playback.  If <paused> is true, starts playback in a paused state. */
+void aud_playlist_play (int playlist, bool paused = false);
+
+/* Returns the number of the currently playing playlist.  If no playlist is
+ * playing, returns -1. */
+int aud_playlist_get_playing ();
+
+/* Returns the number of a "blank" playlist.  The active playlist is returned if
+ * it has the default title and has no entries; otherwise, a new playlist is
+ * added and returned. */
+int aud_playlist_get_blank ();
+
+/* Returns the number of the "temporary" playlist (which is no different from
+ * any other playlist except in name).  If the playlist does not exist, a
+ * "blank" playlist is obtained from playlist_get_blank() and is renamed to
+ * become the temporary playlist. */
+int aud_playlist_get_temporary ();
+
+/* Returns the number of entries in a playlist.  The entries are numbered
+ * starting from zero. */
+int aud_playlist_entry_count (int playlist);
+
+/* Adds a song file, playlist file, or folder to a playlist before the entry
+ * numbered <at>.  If <at> is negative or equal to the number of entries, the
+ * item is added after the last entry.  <tuple> may be nullptr, in which case
+ * Audacious will attempt to read metadata from the song file.  If <play> is
+ * true, Audacious will begin playback of the items once they have been
+ * added.
+ *
+ * Because adding items to the playlist can be a slow process, this function may
+ * return before the process is complete.  Hence, the caller must not assume
+ * that there will be new entries in the playlist immediately. */
+void aud_playlist_entry_insert (int playlist, int at, const char * filename,
+ Tuple && tuple, bool play);
+
+/* Similar to playlist_entry_insert, adds multiple song files, playlist files,
+ * or folders to a playlist. */
+void aud_playlist_entry_insert_batch (int playlist, int at,
+ Index<PlaylistAddItem> && items, bool play);
+
+/* Similar to playlist_entry_insert_batch, but allows the caller to prevent some
+ * items from being added by returning false from the <filter> callback.  Useful
+ * for searching a folder and adding only new files to the playlist.  <user> is
+ * an additional, untyped pointer passed to the callback. */
+void aud_playlist_entry_insert_filtered (int playlist, int at,
+ Index<PlaylistAddItem> && items, PlaylistFilterFunc filter, void * user,
+ bool play);
+
+/* Removes a contiguous block of <number> entries starting from the one numbered
+ * <at> from a playlist.  If necessary, the playback position is moved elsewhere
+ * in the playlist and playback is restarted (or stopped). */
+void aud_playlist_entry_delete (int playlist, int at, int number);
+
+/* Returns the filename of an entry. */
+String aud_playlist_entry_get_filename (int playlist, int entry);
+
+/* Returns a handle to the decoder plugin associated with an entry.  On error,
+ * or if the entry has not yet been scanned, returns nullptr according to
+ * <mode>.  On error, an error message is optionally returned. */
+PluginHandle * aud_playlist_entry_get_decoder (int playlist, int entry,
+ Playlist::GetMode mode = Playlist::WaitGuess, String * error = nullptr);
+
+/* Returns the tuple associated with an entry.  On error, or if the entry has
+ * not yet been scanned, returns either a blank tuple or a tuple filled with
+ * "best guess" values, according to <mode>.  On error, an error message is
+ * optionally returned. */
+Tuple aud_playlist_entry_get_tuple (int playlist, int entry,
+ Playlist::GetMode mode = Playlist::WaitGuess, String * error = nullptr);
+
+/* Moves the playback position to the beginning of the entry at <position>.  If
+ * <position> is -1, unsets the playback position.  If <playlist> is the
+ * currently playing playlist, playback is restarted (or stopped). */
+void aud_playlist_set_position (int playlist, int position);
+
+/* Returns the playback position, or -1 if it is not set.  Note that the
+ * position may be set even if <playlist> is not currently playing. */
+int aud_playlist_get_position (int playlist);
+
+/* Sets the entry which has keyboard focus (-1 means no entry). */
+void aud_playlist_set_focus (int playlist, int entry);
+
+/* Gets the entry which has keyboard focus (-1 means no entry). */
+int aud_playlist_get_focus (int playlist);
+
+/* Sets whether an entry is selected. */
+void aud_playlist_entry_set_selected (int playlist, int entry, bool selected);
+
+/* Returns whether an entry is selected. */
+bool aud_playlist_entry_get_selected (int playlist, int entry);
+
+/* Returns the number of selected entries in a playlist. */
+int aud_playlist_selected_count (int playlist);
+
+/* Selects all (or none) of the entries in a playlist. */
+void aud_playlist_select_all (int playlist, bool selected);
+
+/* Moves a selected entry within a playlist by an offset of <distance> entries.
+ * Other selected entries are gathered around it.  Returns the offset by which
+ * the entry was actually moved, which may be less in absolute value than the
+ * requested offset. */
+int aud_playlist_shift (int playlist, int position, int distance);
+
+/* Removes the selected entries from a playlist.  If necessary, the playback
+ * position is moved elsewhere in the playlist and playback is restarted (or
+ * stopped). */
+void aud_playlist_delete_selected (int playlist);
+
+/* Sorts the entries in a playlist based on filename.  The callback function
+ * should return negative if the first filename comes before the second,
+ * positive if it comes after, or zero if the two are indistinguishable. */
+void aud_playlist_sort_by_filename (int playlist, PlaylistStringCompareFunc compare);
+
+/* Sorts the entries in a playlist based on tuple.  May fail if metadata
+ * scanning is still in progress (or has been disabled). */
+void aud_playlist_sort_by_tuple (int playlist, PlaylistTupleCompareFunc compare);
+
+/* Sorts the entries in a playlist based on formatted title string.  May fail if
+ * metadata scanning is still in progress (or has been disabled). */
+void aud_playlist_sort_by_title (int playlist, PlaylistStringCompareFunc compare);
+
+/* Sorts only the selected entries in a playlist based on filename. */
+void aud_playlist_sort_selected_by_filename (int playlist, PlaylistStringCompareFunc compare);
+
+/* Sorts only the selected entries in a playlist based on tuple.  May fail if
+ * metadata scanning is still in progress (or has been disabled). */
+void aud_playlist_sort_selected_by_tuple (int playlist, PlaylistTupleCompareFunc compare);
+
+/* Sorts only the selected entries in a playlist based on formatted title
+ * string.  May fail if metadata scanning is still in progress (or has been
+ * disabled). */
+void aud_playlist_sort_selected_by_title (int playlist, PlaylistStringCompareFunc compare);
+
+/* Reverses the order of the entries in a playlist. */
+void aud_playlist_reverse (int playlist);
+
+/* Reorders the entries in a playlist randomly. */
+void aud_playlist_randomize (int playlist);
+
+/* Reverses the order of the selected entries in a playlist. */
+void aud_playlist_reverse_selected (int playlist);
+
+/* Reorders the selected entries in a playlist randomly. */
+void aud_playlist_randomize_selected (int playlist);
+
+/* Discards the metadata stored for all the entries in a playlist and starts
+ * reading it afresh from the song files in the background. */
+void aud_playlist_rescan (int playlist);
+
+/* Like playlist_rescan, but applies only to the selected entries in a playlist. */
+void aud_playlist_rescan_selected (int playlist);
+
+/* Discards the metadata stored for all the entries that refer to a particular
+ * song file, in whatever playlist they appear, and starts reading it afresh
+ * from that file in the background. */
+void aud_playlist_rescan_file (const char * filename);
+
+/* Calculates the total length in milliseconds of all the entries in a playlist.
+ * Only takes into account entries for which metadata has already been read. */
+int64_t aud_playlist_get_total_length (int playlist);
+
+/* Calculates the total length in milliseconds of only the selected entries in a
+ * playlist.  Only takes into account entries for which metadata has already
+ * been read. */
+int64_t aud_playlist_get_selected_length (int playlist);
+
+/* Returns the number of entries in a playlist queue.  The entries are numbered
+ * starting from zero, lower numbers being played first. */
+int aud_playlist_queue_count (int playlist);
+
+/* Adds an entry to a playlist's queue before the entry numbered <at> in the
+ * queue.  If <at> is negative or equal to the number of entries in the queue,
+ * adds the entry after the last one in the queue.  The same entry cannot be
+ * added to the queue more than once. */
+void aud_playlist_queue_insert (int playlist, int at, int entry);
+
+/* Adds the selected entries in a playlist to the queue, if they are not already
+ * in it. */
+void aud_playlist_queue_insert_selected (int playlist, int at);
+
+/* Returns the position in the playlist of the entry at a given position in the
+ * queue. */
+int aud_playlist_queue_get_entry (int playlist, int at);
+
+/* Returns the position in the queue of the entry at a given position in the
+ * playlist.  If it is not in the queue, returns -1. */
+int aud_playlist_queue_find_entry (int playlist, int entry);
+
+/* Removes a contiguous block of <number> entries starting with the one numbered
+ * <at> from the queue. */
+void aud_playlist_queue_delete (int playlist, int at, int number);
+
+/* Removes the selected entries in a playlist from the queue, if they are in it. */
+void aud_playlist_queue_delete_selected (int playlist);
+
+/* Returns true if a "playlist update" hook call is pending for the given
+ * playlist (or for any playlist, if <playlist> is -1).  If called from within
+ * the hook, the current hook call is not considered pending. */
+bool aud_playlist_update_pending (int playlist = -1);
+
+/* May be called within the "playlist update" hook to determine the update level
+ * and number of entries changed in a playlist. */
+Playlist::Update aud_playlist_update_detail (int playlist);
+
+/* Returns true if entries are being added to a playlist in the background.
+ * If <playlist> is -1, checks all playlists. */
+bool aud_playlist_add_in_progress (int playlist);
+
+/* Returns true if entries in a playlist are being scanned for metadata in
+ * the background.  If <playlist> is -1, checks all playlists. */
+bool aud_playlist_scan_in_progress (int playlist);
+
+/* --- PLAYLIST UTILITY API --- */
+
+/* Sorts the entries in a playlist according to one of the schemes listed in
+ * playlist.h. */
+void aud_playlist_sort_by_scheme (int playlist, Playlist::SortType scheme);
+
+/* Sorts only the selected entries in a playlist according to one of those
+ * schemes. */
+void aud_playlist_sort_selected_by_scheme (int playlist, Playlist::SortType scheme);
+
+/* Removes duplicate entries in a playlist according to one of those schemes.
+ * As currently implemented, first sorts the playlist. */
+void aud_playlist_remove_duplicates_by_scheme (int playlist, Playlist::SortType scheme);
+
+/* Removes all entries referring to unavailable files in a playlist.  ("Remove
+ * failed" is something of a misnomer for the current behavior.)  As currently
+ * implemented, only works for file:// URIs. */
+void aud_playlist_remove_failed (int playlist);
+
+/* Selects all the entries in a playlist that match regular expressions stored
+ * in the fields of a tuple.  Does not free the memory used by the tuple.
+ * Example: To select all the songs whose title starts with the letter "A",
+ * create a blank tuple and set its title field to "^A". */
+void aud_playlist_select_by_patterns (int playlist, const Tuple & patterns);
+
+/* Returns true if <filename> refers to a playlist file. */
+bool aud_filename_is_playlist (const char * filename);
+
+/* Saves the entries in a playlist to a playlist file.  The format of the file
+ * is determined from the file extension.  Returns true on success. */
+bool aud_playlist_save (int playlist, const char * filename, Playlist::GetMode mode);
+
+#endif
diff --git a/src/libaudcore/plugin-init.cc b/src/libaudcore/plugin-init.cc
new file mode 100644
index 000000000000..4e85f257743c
--- /dev/null
+++ b/src/libaudcore/plugin-init.cc
@@ -0,0 +1,351 @@
+/*
+ * plugin-init.c
+ * Copyright 2010-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "plugins-internal.h"
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include "hook.h"
+#include "interface.h"
+#include "internal.h"
+#include "output.h"
+#include "plugin.h"
+#include "runtime.h"
+
+static bool general_plugin_start (PluginHandle * plugin)
+{
+    auto gp = (GeneralPlugin *) aud_plugin_get_header (plugin);
+    return gp && gp->init ();
+}
+
+void general_plugin_stop (PluginHandle * plugin)
+{
+    GeneralPlugin * gp = (GeneralPlugin *) aud_plugin_get_header (plugin);
+    if (gp)
+        gp->cleanup ();
+}
+
+struct MultiFuncs
+{
+    bool (* start) (PluginHandle * plugin);
+    void (* stop) (PluginHandle * plugin);
+};
+
+struct SingleFuncs
+{
+    PluginHandle * (* get_current) ();
+    bool (* set_current) (PluginHandle * plugin);
+};
+
+union PluginFuncs
+{
+    MultiFuncs m;
+    SingleFuncs s;
+
+    constexpr PluginFuncs (MultiFuncs multi) : m (multi) {}
+    constexpr PluginFuncs (SingleFuncs single) : s (single) {}
+};
+
+struct PluginParams
+{
+    const char * name;
+    bool is_single;
+    PluginFuncs f;
+
+    constexpr PluginParams (const char * name, MultiFuncs multi) :
+        name (name), is_single (false), f (multi) {}
+    constexpr PluginParams (const char * name, SingleFuncs single) :
+        name (name), is_single (true), f (single) {}
+};
+
+static constexpr aud::array<PluginType, PluginParams> table = {
+    PluginParams ("transport", MultiFuncs ({nullptr, nullptr})),
+    PluginParams ("playlist", MultiFuncs ({nullptr, nullptr})),
+    PluginParams ("input", MultiFuncs ({nullptr, nullptr})),
+    PluginParams ("effect", MultiFuncs ({effect_plugin_start, effect_plugin_stop})),
+    PluginParams ("output", SingleFuncs ({output_plugin_get_current, output_plugin_set_current})),
+    PluginParams ("visualization", MultiFuncs ({vis_plugin_start, vis_plugin_stop})),
+    PluginParams ("general", MultiFuncs ({general_plugin_start, general_plugin_stop})),
+    PluginParams ("interface", SingleFuncs ({iface_plugin_get_current, iface_plugin_set_current}))
+};
+
+static void start_single (PluginType type)
+{
+    PluginHandle * skip = nullptr;
+
+    for (PluginHandle * p : aud_plugin_list (type))
+    {
+        if (! aud_plugin_get_enabled (p))
+            continue;
+
+        AUDINFO ("Starting selected %s plugin %s.\n", table[type].name,
+         aud_plugin_get_name (p));
+
+        if (table[type].f.s.set_current (p))
+            return;
+
+        AUDWARN ("%s failed to start.\n", aud_plugin_get_name (p));
+        plugin_set_failed (p);
+        plugin_set_enabled (p, false);
+        skip = p;
+        break;
+    }
+
+    AUDINFO ("Probing for %s plugin.\n", table[type].name);
+
+    for (PluginHandle * p : aud_plugin_list (type))
+    {
+        if (p == skip)
+            continue;
+
+        AUDINFO ("Trying to start %s.\n", aud_plugin_get_name (p));
+
+        if (! table[type].f.s.set_current (p))
+        {
+            AUDWARN ("%s failed to start.\n", aud_plugin_get_name (p));
+            plugin_set_failed (p);
+            continue;
+        }
+
+        plugin_set_enabled (p, true);
+        return;
+    }
+
+    AUDERR ("No %s plugin found.\n"
+     "(Did you forget to install audacious-plugins?)\n", table[type].name);
+    abort ();
+}
+
+static void start_multi (PluginType type)
+{
+    for (PluginHandle * p : aud_plugin_list (type))
+    {
+        if (! aud_plugin_get_enabled (p))
+            continue;
+
+        AUDINFO ("Starting %s.\n", aud_plugin_get_name (p));
+
+        if (! table[type].f.m.start (p))
+        {
+            AUDWARN ("%s failed to start.\n", aud_plugin_get_name (p));
+            plugin_set_failed (p);
+        }
+    }
+}
+
+static void start_plugins (PluginType type)
+{
+    /* no interface plugin in headless mode */
+    if (type == PluginType::Iface && aud_get_headless_mode ())
+        return;
+
+    if (table[type].is_single)
+        start_single (type);
+    else if (table[type].f.m.start)
+        start_multi (type);
+}
+
+void start_plugins_one ()
+{
+    plugin_system_init ();
+
+    start_plugins (PluginType::Transport);
+    start_plugins (PluginType::Playlist);
+    start_plugins (PluginType::Input);
+    start_plugins (PluginType::Effect);
+    start_plugins (PluginType::Output);
+}
+
+void start_plugins_two ()
+{
+    start_plugins (PluginType::Vis);
+    start_plugins (PluginType::General);
+    start_plugins (PluginType::Iface);
+}
+
+static void stop_plugins (PluginType type)
+{
+    if (table[type].is_single)
+    {
+        AUDINFO ("Shutting down %s.\n", aud_plugin_get_name
+         (table[type].f.s.get_current ()));
+        table[type].f.s.set_current (nullptr);
+    }
+    else if (table[type].f.m.stop)
+    {
+        for (PluginHandle * p : aud_plugin_list (type))
+        {
+            if (aud_plugin_get_enabled (p))
+            {
+                AUDINFO ("Shutting down %s.\n", aud_plugin_get_name (p));
+                table[type].f.m.stop (p);
+            }
+        }
+    }
+}
+
+void stop_plugins_two ()
+{
+    /* interface plugin is already shut down */
+    stop_plugins (PluginType::General);
+    stop_plugins (PluginType::Vis);
+}
+
+void stop_plugins_one ()
+{
+    stop_plugins (PluginType::Output);
+    stop_plugins (PluginType::Effect);
+    stop_plugins (PluginType::Input);
+    stop_plugins (PluginType::Playlist);
+    stop_plugins (PluginType::Transport);
+
+    plugin_system_cleanup ();
+}
+
+EXPORT PluginHandle * aud_plugin_get_current (PluginType type)
+{
+    assert (table[type].is_single);
+    return table[type].f.s.get_current ();
+}
+
+static bool enable_single (PluginType type, PluginHandle * p)
+{
+    PluginHandle * old = table[type].f.s.get_current ();
+
+    AUDINFO ("Switching from %s to %s.\n", aud_plugin_get_name (old),
+     aud_plugin_get_name (p));
+
+    plugin_set_enabled (old, false);
+    plugin_set_enabled (p, true);
+
+    if (table[type].f.s.set_current (p))
+    {
+        // check that the switch was not queued for later
+        if (table[type].f.s.get_current () == old)
+        {
+            plugin_set_enabled (p, false);
+            plugin_set_enabled (old, true);
+        }
+
+        return true;
+    }
+
+    AUDERR ("%s failed to start; falling back to %s.\n",
+     aud_plugin_get_name (p), aud_plugin_get_name (old));
+
+    plugin_set_failed (p);
+    plugin_set_enabled (p, false);
+    plugin_set_enabled (old, true);
+
+    if (table[type].f.s.set_current (old))
+        return false;
+
+    AUDERR ("%s failed to start.\n", aud_plugin_get_name (old));
+    abort ();
+}
+
+static bool enable_multi (PluginType type, PluginHandle * p, bool enable)
+{
+    AUDINFO ("%sabling %s.\n", enable ? "En" : "Dis", aud_plugin_get_name (p));
+
+    if (enable)
+    {
+        plugin_set_enabled (p, true);
+
+        if (table[type].f.m.start && ! table[type].f.m.start (p))
+        {
+            AUDERR ("%s failed to start.\n", aud_plugin_get_name (p));
+            plugin_set_failed (p);
+            plugin_set_enabled (p, false);
+            return false;
+        }
+
+        if (type == PluginType::Vis || type == PluginType::General)
+            hook_call ("dock plugin enabled", p);
+    }
+    else
+    {
+        plugin_set_enabled (p, false);
+
+        if (type == PluginType::Vis || type == PluginType::General)
+            hook_call ("dock plugin disabled", p);
+
+        if (table[type].f.m.stop)
+            table[type].f.m.stop (p);
+    }
+
+    return true;
+}
+
+EXPORT bool aud_plugin_enable (PluginHandle * plugin, bool enable)
+{
+    if (! enable == ! aud_plugin_get_enabled (plugin))
+        return true;
+
+    PluginType type = aud_plugin_get_type (plugin);
+
+    if (table[type].is_single)
+    {
+        assert (enable);
+        return enable_single (type, plugin);
+    }
+
+    return enable_multi (type, plugin, enable);
+}
+
+/* Miscellaneous plugin-related functions ... */
+
+EXPORT int aud_plugin_send_message (PluginHandle * plugin, const char * code, const void * data, int size)
+{
+    if (! aud_plugin_get_enabled (plugin))
+        return -1;
+
+    Plugin * header = (Plugin *) aud_plugin_get_header (plugin);
+    if (! header)
+        return -1;
+
+    return header->take_message (code, data, size);
+}
+
+EXPORT void * aud_plugin_get_gtk_widget (PluginHandle * plugin)
+{
+    if (! aud_plugin_get_enabled (plugin))
+        return nullptr;
+
+    PluginType type = aud_plugin_get_type (plugin);
+    if (type != PluginType::General && type != PluginType::Vis)
+        return nullptr;
+
+    auto dp = (DockablePlugin *) aud_plugin_get_header (plugin);
+    return dp ? dp->get_gtk_widget () : nullptr;
+}
+
+EXPORT void * aud_plugin_get_qt_widget (PluginHandle * plugin)
+{
+    if (! aud_plugin_get_enabled (plugin))
+        return nullptr;
+
+    PluginType type = aud_plugin_get_type (plugin);
+    if (type != PluginType::General && type != PluginType::Vis)
+        return nullptr;
+
+    auto dp = (DockablePlugin *) aud_plugin_get_header (plugin);
+    return dp ? dp->get_qt_widget () : nullptr;
+}
diff --git a/src/libaudcore/plugin-load.cc b/src/libaudcore/plugin-load.cc
new file mode 100644
index 000000000000..513cc6d4d596
--- /dev/null
+++ b/src/libaudcore/plugin-load.cc
@@ -0,0 +1,163 @@
+/*
+ * plugin-load.cc
+ * Copyright 2007-2013 William Pitcock and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "plugins-internal.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include <glib/gstdio.h>
+#include <gmodule.h>
+
+#include "audstrings.h"
+#include "internal.h"
+#include "plugin.h"
+#include "runtime.h"
+
+static const char * plugin_dir_list[] = {
+    "Transport",
+    "Container",
+    "Input",
+    "Output",
+    "Effect",
+    "General",
+    "Visualization"
+};
+
+struct LoadedModule {
+    Plugin * header;
+    GModule * module;
+};
+
+static Index<LoadedModule> loaded_modules;
+
+Plugin * plugin_load (const char * filename)
+{
+    AUDINFO ("Loading plugin: %s.\n", filename);
+
+    GModule * module = g_module_open (filename, G_MODULE_BIND_LOCAL);
+
+    if (! module)
+    {
+        AUDERR ("%s could not be loaded: %s\n", filename, g_module_error ());
+        return nullptr;
+    }
+
+    Plugin * header;
+    if (! g_module_symbol (module, "aud_plugin_instance", (void * *) & header))
+        header = nullptr;
+
+    if (! header || header->magic != _AUD_PLUGIN_MAGIC)
+    {
+        AUDERR ("%s is not a valid Audacious plugin.\n", filename);
+        g_module_close (module);
+        return nullptr;
+    }
+
+    if (header->version < _AUD_PLUGIN_VERSION_MIN ||
+        header->version > _AUD_PLUGIN_VERSION)
+    {
+        AUDERR ("%s is not compatible with this version of Audacious.\n", filename);
+        g_module_close (module);
+        return nullptr;
+    }
+
+    if (header->type == PluginType::Transport ||
+        header->type == PluginType::Playlist ||
+        header->type == PluginType::Input ||
+        header->type == PluginType::Effect)
+    {
+        if (! header->init ())
+        {
+            AUDERR ("%s failed to initialize.\n", filename);
+            g_module_close (module);
+            return nullptr;
+        }
+    }
+
+    loaded_modules.append (header, module);
+
+    return header;
+}
+
+static void plugin_unload (LoadedModule & loaded)
+{
+    if (loaded.header->type == PluginType::Transport ||
+        loaded.header->type == PluginType::Playlist ||
+        loaded.header->type == PluginType::Input ||
+        loaded.header->type == PluginType::Effect)
+    {
+        loaded.header->cleanup ();
+    }
+
+#ifndef VALGRIND_FRIENDLY
+    g_module_close (loaded.module);
+#endif
+}
+
+/******************************************************************/
+
+static bool scan_plugin_func (const char * path, const char * basename, void * data)
+{
+    if (! str_has_suffix_nocase (basename, PLUGIN_SUFFIX))
+        return false;
+
+    GStatBuf st;
+    if (g_stat (path, & st) < 0)
+    {
+        AUDERR ("Unable to stat %s: %s\n", path, strerror (errno));
+        return false;
+    }
+
+    if (S_ISREG (st.st_mode))
+        plugin_register (path, st.st_mtime);
+
+    return false;
+}
+
+static void scan_plugins (const char * path)
+{
+    dir_foreach (path, scan_plugin_func, nullptr);
+}
+
+void plugin_system_init ()
+{
+    assert (g_module_supported ());
+
+    plugin_registry_load ();
+
+    const char * path = aud_get_path (AudPath::PluginDir);
+    for (const char * dir : plugin_dir_list)
+        scan_plugins (filename_build ({path, dir}));
+
+    plugin_registry_prune ();
+}
+
+void plugin_system_cleanup ()
+{
+    plugin_registry_save ();
+
+    for (LoadedModule & loaded : loaded_modules)
+        plugin_unload (loaded);
+
+    loaded_modules.clear ();
+}
diff --git a/src/libaudcore/plugin-registry.cc b/src/libaudcore/plugin-registry.cc
new file mode 100644
index 000000000000..eb1b1c47a4e8
--- /dev/null
+++ b/src/libaudcore/plugin-registry.cc
@@ -0,0 +1,705 @@
+/*
+ * plugin-registry.c
+ * Copyright 2009-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "plugins-internal.h"
+
+#include <errno.h>
+#include <pthread.h>
+#include <string.h>
+
+#include <glib/gstdio.h>
+
+#include "audstrings.h"
+#include "i18n.h"
+#include "interface.h"
+#include "plugin.h"
+#include "runtime.h"
+
+#define FILENAME "plugin-registry"
+
+/* Increment this when the format of the plugin-registry file changes.
+ * Add 10 if the format changes in a way that will break parse_plugins_fallback(). */
+#define FORMAT 9
+
+/* Oldest file format supported by parse_plugins_fallback() */
+#define MIN_FORMAT 2  // "enabled" flag was added in Audacious 2.4
+
+struct PluginWatch {
+    PluginWatchFunc func;
+    void * data;
+};
+
+class PluginHandle
+{
+public:
+    String basename, path;
+    bool loaded;
+    int timestamp;
+    PluginType type;
+    Plugin * header;
+    String name, domain;
+    int priority;
+    int has_about, has_configure, enabled;
+    Index<PluginWatch> watches;
+
+    /* for transport plugins */
+    Index<String> schemes;
+
+    /* for playlist plugins */
+    Index<String> exts;
+
+    /* for input plugins */
+    aud::array<InputKey, Index<String>> keys;
+    int has_subtunes, writes_tag;
+
+    PluginHandle (const char * basename, const char * path, bool loaded,
+     int timestamp, PluginType type, Plugin * header) :
+        basename (basename),
+        path (path),
+        loaded (loaded),
+        timestamp (timestamp),
+        type (type),
+        header (header),
+        priority (0),
+        has_about (false),
+        has_configure (false),
+        enabled (type == PluginType::Transport ||
+         type == PluginType::Playlist || type == PluginType::Input),
+        has_subtunes (false),
+        writes_tag (false) {}
+
+    ~PluginHandle ()
+    {
+        if (watches.len ())
+            AUDWARN ("Plugin watch count not zero at exit!\n");
+    }
+};
+
+static constexpr aud::array<PluginType, const char *> plugin_type_names = {
+    "transport",
+    "playlist",
+    "input",
+    "effect",
+    "output",
+    "vis",
+    "general",
+    "iface"
+};
+
+static constexpr aud::array<InputKey, const char *> input_key_names = {
+    "scheme",
+    "ext",
+    "mime"
+};
+
+static aud::array<PluginType, Index<PluginHandle *>> plugins;
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static StringBuf get_basename (const char * path)
+{
+    const char * slash = strrchr (path, G_DIR_SEPARATOR);
+    const char * dot = slash ? strrchr (slash + 1, '.') : nullptr;
+
+    return dot ? str_copy (slash + 1, dot - (slash + 1)) : StringBuf ();
+}
+
+static FILE * open_registry_file (const char * mode)
+{
+    StringBuf path = filename_build ({aud_get_path (AudPath::UserDir), FILENAME});
+    FILE * handle = g_fopen (path, mode);
+
+    if (! handle && errno != ENOENT)
+        AUDWARN ("%s: %s\n", (const char *) path, strerror (errno));
+
+    return handle;
+}
+
+static void transport_plugin_save (PluginHandle * plugin, FILE * handle)
+{
+    for (const String & scheme : plugin->schemes)
+        fprintf (handle, "scheme %s\n", (const char *) scheme);
+}
+
+static void playlist_plugin_save (PluginHandle * plugin, FILE * handle)
+{
+    for (const String & ext : plugin->exts)
+        fprintf (handle, "ext %s\n", (const char *) ext);
+}
+
+static void input_plugin_save (PluginHandle * plugin, FILE * handle)
+{
+    for (auto k : aud::range<InputKey> ())
+    {
+        for (const String & key : plugin->keys[k])
+            fprintf (handle, "%s %s\n", input_key_names[k], (const char *) key);
+    }
+
+    fprintf (handle, "subtunes %d\n", plugin->has_subtunes);
+    fprintf (handle, "writes %d\n", plugin->writes_tag);
+}
+
+static void plugin_save (PluginHandle * plugin, FILE * handle)
+{
+    fprintf (handle, "%s %s\n", plugin_type_names[plugin->type], (const char *) plugin->path);
+    fprintf (handle, "stamp %d\n", plugin->timestamp);
+    fprintf (handle, "name %s\n", (const char *) plugin->name);
+
+    if (plugin->domain)
+        fprintf (handle, "domain %s\n", (const char *) plugin->domain);
+
+    fprintf (handle, "priority %d\n", plugin->priority);
+    fprintf (handle, "about %d\n", plugin->has_about);
+    fprintf (handle, "config %d\n", plugin->has_configure);
+    fprintf (handle, "enabled %d\n", plugin->enabled);
+
+    if (plugin->type == PluginType::Transport)
+        transport_plugin_save (plugin, handle);
+    else if (plugin->type == PluginType::Playlist)
+        playlist_plugin_save (plugin, handle);
+    else if (plugin->type == PluginType::Input)
+        input_plugin_save (plugin, handle);
+}
+
+void plugin_registry_save ()
+{
+    FILE * handle = open_registry_file ("w");
+    if (! handle)
+        return;
+
+    fprintf (handle, "format %d\n", FORMAT);
+
+    for (auto & list : plugins)
+    {
+        for (PluginHandle * plugin : list)
+        {
+            plugin_save (plugin, handle);
+            delete plugin;
+        }
+
+        list.clear ();
+    }
+
+    fclose (handle);
+}
+
+static char parse_key[512];
+static char * parse_value;
+
+static void parse_next (FILE * handle)
+{
+    parse_value = nullptr;
+
+    if (! fgets (parse_key, sizeof parse_key, handle))
+        return;
+
+    char * space = strchr (parse_key, ' ');
+    if (! space)
+        return;
+
+    * space = 0;
+    parse_value = space + 1;
+
+    char * newline = strchr (parse_value, '\n');
+    if (newline)
+        * newline = 0;
+}
+
+static bool parse_integer (const char * key, int * value)
+{
+    return (parse_value && ! strcmp (parse_key, key) && sscanf (parse_value, "%d", value) == 1);
+}
+
+static String parse_string (const char * key)
+{
+    return (parse_value && ! strcmp (parse_key, key)) ? String (parse_value) : String ();
+}
+
+static void transport_plugin_parse (PluginHandle * plugin, FILE * handle)
+{
+    while (1)
+    {
+        String value = parse_string ("scheme");
+        if (! value)
+            break;
+
+        plugin->schemes.append (std::move (value));
+        parse_next (handle);
+    }
+}
+
+static void playlist_plugin_parse (PluginHandle * plugin, FILE * handle)
+{
+    while (1)
+    {
+        String value = parse_string ("ext");
+        if (! value)
+            break;
+
+        plugin->exts.append (std::move (value));
+        parse_next (handle);
+    }
+}
+
+static void input_plugin_parse (PluginHandle * plugin, FILE * handle)
+{
+    for (auto key : aud::range<InputKey> ())
+    {
+        while (1)
+        {
+            String value = parse_string (input_key_names[key]);
+            if (! value)
+                break;
+
+            plugin->keys[key].append (std::move (value));
+            parse_next (handle);
+        }
+    }
+
+    if (parse_integer ("subtunes", & plugin->has_subtunes))
+        parse_next (handle);
+    if (parse_integer ("writes", & plugin->writes_tag))
+        parse_next (handle);
+}
+
+static bool plugin_parse (FILE * handle)
+{
+    PluginType type;
+    String path;
+
+    for (auto type2 : aud::range<PluginType> ())
+    {
+        type = type2;
+        if ((path = parse_string (plugin_type_names[type2])))
+            break;
+    }
+
+    if (! path)
+        return false;
+
+    StringBuf basename = get_basename (path);
+    if (! basename)
+        return false;
+
+    parse_next (handle);
+
+    int timestamp;
+    if (! parse_integer ("stamp", & timestamp))
+        return false;
+
+    auto plugin = new PluginHandle (basename, String (), false, timestamp, type, nullptr);
+    plugins[type].append (plugin);
+
+    parse_next (handle);
+
+    plugin->name = parse_string ("name");
+    if (plugin->name)
+        parse_next (handle);
+
+    plugin->domain = parse_string ("domain");
+    if (plugin->domain)
+        parse_next (handle);
+
+    if (parse_integer ("priority", & plugin->priority))
+        parse_next (handle);
+    if (parse_integer ("about", & plugin->has_about))
+        parse_next (handle);
+    if (parse_integer ("config", & plugin->has_configure))
+        parse_next (handle);
+    if (parse_integer ("enabled", & plugin->enabled))
+        parse_next (handle);
+
+    if (type == PluginType::Transport)
+        transport_plugin_parse (plugin, handle);
+    else if (type == PluginType::Playlist)
+        playlist_plugin_parse (plugin, handle);
+    else if (type == PluginType::Input)
+        input_plugin_parse (plugin, handle);
+
+    return true;
+}
+
+/* try to migrate enabled status from another version */
+static void parse_plugins_fallback (FILE * handle)
+{
+    for (; parse_value; parse_next (handle))
+    {
+        PluginType type;
+        String path;
+        int enabled;
+
+        for (auto type2 : aud::range<PluginType> ())
+        {
+            type = type2;
+            if ((path = parse_string (plugin_type_names[type2])))
+                break;
+        }
+
+        if (! path)
+            continue;
+
+        StringBuf basename = get_basename (path);
+        if (! basename)
+            continue;
+
+        parse_next (handle);
+
+        for (; parse_value; parse_next (handle))
+        {
+            if (parse_integer ("enabled", & enabled))
+                break;
+        }
+
+        if (! parse_value)
+            return;
+
+        // setting timestamp to zero forces a rescan
+        auto plugin = new PluginHandle (basename, String (), false, 0, type, nullptr);
+        plugins[type].append (plugin);
+        plugin->enabled = enabled;
+    }
+}
+
+void plugin_registry_load ()
+{
+    FILE * handle = open_registry_file ("r");
+    if (! handle)
+        return;
+
+    parse_next (handle);
+
+    int format;
+    if (! parse_integer ("format", & format))
+        goto ERR;
+
+    parse_next (handle);
+
+    if (format == FORMAT)
+    {
+        while (plugin_parse (handle))
+            continue;
+    }
+    else if (format >= MIN_FORMAT && format < FORMAT + 10)
+        parse_plugins_fallback (handle);
+
+ERR:
+    fclose (handle);
+}
+
+static int plugin_compare (PluginHandle * const & a, PluginHandle * const & b, void *)
+{
+    if (a->type < b->type)
+        return -1;
+    if (a->type > b->type)
+        return 1;
+    if (a->priority < b->priority)
+        return -1;
+    if (a->priority > b->priority)
+        return 1;
+
+    int diff;
+    if ((diff = str_compare (dgettext (a->domain, a->name), dgettext (b->domain, b->name))))
+        return diff;
+
+    return str_compare (a->path, b->path);
+}
+
+void plugin_registry_prune ()
+{
+    auto check_not_found = [] (PluginHandle * plugin)
+    {
+        if (plugin->path)
+            return false;
+
+        AUDINFO ("Plugin not found: %s\n", (const char *) plugin->basename);
+        delete plugin;
+        return true;
+    };
+
+    for (auto & list : plugins)
+    {
+        list.remove_if (check_not_found);
+        list.sort (plugin_compare, nullptr);
+    }
+}
+
+/* Note: If there are multiple plugins with the same basename, this returns only
+ * one of them.  Different plugins should be given different basenames. */
+EXPORT PluginHandle * aud_plugin_lookup_basename (const char * basename)
+{
+    for (auto & list : plugins)
+    {
+        for (PluginHandle * plugin : list)
+        {
+            if (! strcmp (plugin->basename, basename))
+                return plugin;
+        }
+    }
+
+    return nullptr;
+}
+
+static void plugin_get_info (PluginHandle * plugin, bool is_new)
+{
+    Plugin * header = plugin->header;
+
+    plugin->name = String (header->info.name);
+    plugin->domain = String (header->info.domain);
+    plugin->has_about = (bool) header->info.about;
+    plugin->has_configure = (bool) header->info.prefs;
+
+    if (header->type == PluginType::Transport)
+    {
+        TransportPlugin * tp = (TransportPlugin *) header;
+
+        plugin->schemes.clear ();
+        for (const char * scheme : tp->schemes)
+            plugin->schemes.append (String (scheme));
+    }
+    else if (header->type == PluginType::Playlist)
+    {
+        PlaylistPlugin * pp = (PlaylistPlugin *) header;
+
+        plugin->exts.clear ();
+        for (const char * ext : pp->extensions)
+            plugin->exts.append (String (ext));
+    }
+    else if (header->type == PluginType::Input)
+    {
+        InputPlugin * ip = (InputPlugin *) header;
+        plugin->priority = ip->input_info.priority;
+
+        for (auto k : aud::range<InputKey> ())
+        {
+            plugin->keys[k].clear ();
+            for (auto key = ip->input_info.keys[k]; key && * key; key ++)
+                plugin->keys[k].append (String (* key));
+        }
+
+        plugin->has_subtunes = (ip->input_info.flags & InputPlugin::FlagSubtunes);
+        plugin->writes_tag = (ip->input_info.flags & InputPlugin::FlagWritesTag);
+    }
+    else if (header->type == PluginType::Output)
+    {
+        OutputPlugin * op = (OutputPlugin *) header;
+        plugin->priority = 10 - op->priority;
+    }
+    else if (header->type == PluginType::Effect)
+    {
+        EffectPlugin * ep = (EffectPlugin *) header;
+        plugin->priority = ep->order;
+    }
+    else if (header->type == PluginType::General)
+    {
+        GeneralPlugin * gp = (GeneralPlugin *) header;
+        if (is_new)
+            plugin->enabled = gp->enabled_by_default;
+    }
+}
+
+void plugin_register (const char * path, int timestamp)
+{
+    StringBuf basename = get_basename (path);
+    if (! basename)
+        return;
+
+    PluginHandle * plugin = aud_plugin_lookup_basename (basename);
+
+    if (plugin)
+    {
+        AUDINFO ("Register plugin: %s\n", path);
+        plugin->path = String (path);
+
+        if (plugin->timestamp != timestamp)
+        {
+            AUDINFO ("Rescan plugin: %s\n", path);
+            Plugin * header = plugin_load (path);
+            if (! header || header->type != plugin->type)
+                return;
+
+            plugin->loaded = true;
+            plugin->header = header;
+            plugin->timestamp = timestamp;
+
+            plugin_get_info (plugin, false);
+        }
+    }
+    else
+    {
+        AUDINFO ("New plugin: %s\n", path);
+        Plugin * header = plugin_load (path);
+        if (! header)
+            return;
+
+        plugin = new PluginHandle (basename, path, true, timestamp, header->type, header);
+        plugins[plugin->type].append (plugin);
+
+        plugin_get_info (plugin, true);
+    }
+}
+
+EXPORT PluginType aud_plugin_get_type (PluginHandle * plugin)
+{
+    return plugin->type;
+}
+
+EXPORT const char * aud_plugin_get_basename (PluginHandle * plugin)
+{
+    return plugin->basename;
+}
+
+EXPORT const void * aud_plugin_get_header (PluginHandle * plugin)
+{
+    pthread_mutex_lock (& mutex);
+
+    if (! plugin->loaded)
+    {
+        Plugin * header = plugin_load (plugin->path);
+        if (! header || header->type != plugin->type)
+            goto DONE;
+
+        plugin->loaded = true;
+        plugin->header = header;
+    }
+
+DONE:
+    pthread_mutex_unlock (& mutex);
+    return plugin->header;
+}
+
+EXPORT PluginHandle * aud_plugin_by_header (const void * header)
+{
+    for (auto & list : plugins)
+    {
+        for (PluginHandle * plugin : list)
+        {
+            if (plugin->header == header)
+                return plugin;
+        }
+    }
+
+    return nullptr;
+}
+
+EXPORT const Index<PluginHandle *> & aud_plugin_list (PluginType type)
+{
+    return plugins[type];
+}
+
+EXPORT const char * aud_plugin_get_name (PluginHandle * plugin)
+{
+    return dgettext (plugin->domain, plugin->name);
+}
+
+EXPORT bool aud_plugin_has_about (PluginHandle * plugin)
+{
+    return plugin->has_about;
+}
+
+EXPORT bool aud_plugin_has_configure (PluginHandle * plugin)
+{
+    return plugin->has_configure;
+}
+
+EXPORT bool aud_plugin_get_enabled (PluginHandle * plugin)
+{
+    return plugin->enabled;
+}
+
+static void plugin_call_watches (PluginHandle * plugin)
+{
+    auto call_and_check_remove = [=] (const PluginWatch & watch)
+        { return ! watch.func (plugin, watch.data); };
+
+    plugin->watches.remove_if (call_and_check_remove);
+}
+
+void plugin_set_enabled (PluginHandle * plugin, bool enabled)
+{
+    plugin->enabled = enabled;
+    plugin_call_watches (plugin);
+}
+
+void plugin_set_failed (PluginHandle * plugin)
+{
+    plugin->header = nullptr;
+}
+
+EXPORT void aud_plugin_add_watch (PluginHandle * plugin, PluginWatchFunc func, void * data)
+{
+    plugin->watches.append (func, data);
+}
+
+EXPORT void aud_plugin_remove_watch (PluginHandle * plugin, PluginWatchFunc func, void * data)
+{
+    auto is_match = [=] (const PluginWatch & watch)
+        { return watch.func == func && watch.data == data; };
+
+    plugin->watches.remove_if (is_match);
+}
+
+bool transport_plugin_has_scheme (PluginHandle * plugin, const char * scheme)
+{
+    g_return_val_if_fail (plugin->type == PluginType::Transport, false);
+
+    for (String & s : plugin->schemes)
+    {
+        if (! strcmp (s, scheme))
+            return true;
+    }
+
+    return false;
+}
+
+bool playlist_plugin_has_ext (PluginHandle * plugin, const char * ext)
+{
+    g_return_val_if_fail (plugin->type == PluginType::Playlist, false);
+
+    for (String & e : plugin->exts)
+    {
+        if (! strcmp_nocase (e, ext))
+            return true;
+    }
+
+    return false;
+}
+
+bool input_plugin_has_key (PluginHandle * plugin, InputKey key, const char * value)
+{
+    g_return_val_if_fail (plugin->type == PluginType::Input, false);
+
+    for (String & s : plugin->keys[key])
+    {
+        if (! strcmp_nocase (s, value))
+            return true;
+    }
+
+    return false;
+}
+
+bool input_plugin_has_subtunes (PluginHandle * plugin)
+{
+    g_return_val_if_fail (plugin->type == PluginType::Input, false);
+    return plugin->has_subtunes;
+}
+
+bool input_plugin_can_write_tuple (PluginHandle * plugin)
+{
+    g_return_val_if_fail (plugin->type == PluginType::Input, false);
+    return plugin->writes_tag;
+}
diff --git a/src/libaudcore/plugin.h b/src/libaudcore/plugin.h
new file mode 100644
index 000000000000..8cd207b23fd8
--- /dev/null
+++ b/src/libaudcore/plugin.h
@@ -0,0 +1,473 @@
+/*
+ * plugin.h
+ * Copyright 2005-2013 William Pitcock, Yoshiki Yazawa, Eugene Zagidullin, and
+ *                     John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_PLUGIN_H
+#define LIBAUDCORE_PLUGIN_H
+
+#include <libaudcore/audio.h>
+#include <libaudcore/plugins.h>
+#include <libaudcore/tuple.h>
+#include <libaudcore/visualizer.h>
+#include <libaudcore/vfs.h>
+
+enum class AudMenuID;
+struct PluginPreferences;
+
+/* "Magic" bytes identifying an Audacious plugin header. */
+#define _AUD_PLUGIN_MAGIC ((int) 0x8EAC8DE2)
+
+/* API version.  Plugins are marked with this number at compile time.
+ *
+ * _AUD_PLUGIN_VERSION is the current version; _AUD_PLUGIN_VERSION_MIN is
+ * the oldest one we are backward compatible with.  Plugins marked older than
+ * _AUD_PLUGIN_VERSION_MIN or newer than _AUD_PLUGIN_VERSION are not loaded.
+ *
+ * Before releases that add new pointers to the end of the API tables, increment
+ * _AUD_PLUGIN_VERSION but leave _AUD_PLUGIN_VERSION_MIN the same.
+ *
+ * Before releases that break backward compatibility (e.g. remove pointers from
+ * the API tables), increment _AUD_PLUGIN_VERSION *and* set
+ * _AUD_PLUGIN_VERSION_MIN to the same value. */
+
+#define _AUD_PLUGIN_VERSION_MIN 46 /* 3.6-devel */
+#define _AUD_PLUGIN_VERSION     46 /* 3.6-devel */
+
+/* A NOTE ON THREADS
+ *
+ * How thread-safe a plugin must be depends on the type of plugin.  Note that
+ * some parts of the Audacious API are *not* thread-safe and therefore cannot be
+ * used in some parts of some plugins; for example, input plugins cannot use
+ * GUI-related calls or access the playlist except in about() and configure().
+ *
+ * Thread-safe plugins: transport, playlist, input, effect, and output.  These
+ * must be mostly thread-safe.  init() and cleanup() may be called from
+ * secondary threads; however, no other functions provided by the plugin will be
+ * called at the same time.  about() and configure() will be called only from
+ * the main thread.  All other functions provided by the plugin may be called
+ * from any thread and from multiple threads simultaneously.
+ *
+ * Exceptions:
+ * - Because many existing input plugins are not coded to handle simultaneous
+ *   calls to play(), play() will only be called from one thread at a time.  New
+ *   plugins should not rely on this exception, though.
+ * - Some combinations of calls, especially for output and effect plugins, make
+ *   no sense; for example, flush() in an output plugin will only be called
+ *   after open_audio() and before close_audio().
+ *
+ * Single-thread plugins: visualization, general, and interface.  Functions
+ * provided by these plugins will only be called from the main thread. */
+
+/* CROSS-PLUGIN MESSAGES
+ *
+ * Since 3.2, Audacious implements a basic messaging system between plugins.
+ * Messages are sent using aud_plugin_send_message() and received through the
+ * take_message() method specified in the header of the receiving plugin.
+ * Plugins that do not need to receive messages can set take_message() to nullptr.
+ *
+ * Each message includes a code indicating the type of message, a pointer to
+ * some data, and a value indicating the size of that data. What the message
+ * data contains is entirely up to the two plugins involved. For this reason, it
+ * is crucial that both plugins agree on the meaning of the message codes used.
+ *
+ * Once the message is sent, an integer error code is returned. If the receiving
+ * plugin does not provide the take_message() method, -1 is returned. If
+ * take_message() does not recognize the message code, it should ignore the
+ * message and return -1. An error code of zero represents success. Other error
+ * codes may be used with more specific meanings.
+ *
+ * For the time being, aud_plugin_send_message() should only be called from the
+ * program's main thread. */
+
+struct PluginInfo {
+    const char * name;
+    const char * domain; // for gettext
+    const char * about;
+    const PluginPreferences * prefs;
+};
+
+class Plugin
+{
+public:
+    constexpr Plugin (PluginType type, PluginInfo info) :
+        type (type),
+        info (info) {}
+
+    const int magic = _AUD_PLUGIN_MAGIC;
+    const int version = _AUD_PLUGIN_VERSION;
+
+    const PluginType type;
+    const PluginInfo info;
+
+    virtual bool init () { return true; }
+    virtual void cleanup () {}
+
+    virtual int take_message (const char * code, const void * data, int size) { return -1; }
+};
+
+class TransportPlugin : public Plugin
+{
+public:
+    constexpr TransportPlugin (const PluginInfo info,
+     const ArrayRef<const char *> schemes) :
+        Plugin (PluginType::Transport, info),
+        schemes (schemes) {}
+
+    /* supported URI schemes (without "://") */
+    const ArrayRef<const char *> schemes;
+
+    /* fopen() implementation */
+    virtual VFSImpl * fopen (const char * filename, const char * mode, String & error) = 0;
+};
+
+class PlaylistPlugin : public Plugin
+{
+public:
+    constexpr PlaylistPlugin (const PluginInfo info,
+     const ArrayRef<const char *> extensions, bool can_save) :
+        Plugin (PluginType::Playlist, info),
+        extensions (extensions),
+        can_save (can_save) {}
+
+    /* supported file extensions (without periods) */
+    const ArrayRef<const char *> extensions;
+
+    /* true if the plugin can save playlists */
+    const bool can_save;
+
+    /* path: URI of playlist file (in)
+     * file: VFS handle of playlist file (in, read-only file, not seekable)
+     * title: title of playlist (out)
+     * items: playlist entries (out) */
+    virtual bool load (const char * path, VFSFile & file, String & title,
+     Index<PlaylistAddItem> & items) = 0;
+
+    /* path: URI of playlist file (in)
+     * file: VFS handle of playlist file (in, write-only file, not seekable)
+     * title: title of playlist (in)
+     * items: playlist entries (in) */
+    virtual bool save (const char * path, VFSFile & file, const char * title,
+     const Index<PlaylistAddItem> & items) { return false; }
+};
+
+class OutputPlugin : public Plugin
+{
+public:
+    constexpr OutputPlugin (const PluginInfo info, int priority, bool force_reopen = false) :
+        Plugin (PluginType::Output, info),
+        priority (priority),
+        force_reopen (force_reopen) {}
+
+    /* During probing, plugins with higher priority (10 to 0) are tried first. */
+    const int priority;
+
+    /* Whether close_audio() and open_audio() must always be called between
+     * songs, even if the audio format is the same.  Note that this defeats
+     * gapless playback. */
+    const bool force_reopen;
+
+    /* Returns current volume for left and right channels (0 to 100). */
+    virtual StereoVolume get_volume () = 0;
+
+    /* Changes volume for left and right channels (0 to 100). */
+    virtual void set_volume (StereoVolume volume) = 0;
+
+    /* Sets information about the song being played.  This function will be
+     * called before open_audio(). */
+    virtual void set_info (const char * filename, const Tuple & tuple) {}
+
+    /* Begins playback of a PCM stream.  <format> is one of the FMT_*
+     * enumeration values defined in libaudcore/audio.h.  Returns true on
+     * success. */
+    virtual bool open_audio (int format, int rate, int chans) = 0;
+
+    /* Ends playback.  Any buffered audio data is discarded. */
+    virtual void close_audio () = 0;
+
+    /* Waits until write_audio() will return a size greater than zero.
+     * output_time(), pause(), and flush() may be called meanwhile; if flush()
+     * is called, period_wait() should return immediately. */
+    virtual void period_wait () = 0;
+
+    /* Writes up to <size> bytes of data, in the format given to open_audio().
+     * If there is not enough buffer space for all <size> bytes, writes only as
+     * many bytes as can be written immediately without blocking.  Returns the
+     * number of bytes actually written. */
+    virtual int write_audio (const void * data, int size) = 0;
+
+    /* Waits until all buffered data has been heard by the user. */
+    virtual void drain () = 0;
+
+    /* Returns an estimate of how many milliseconds will pass before all the
+     * data passed to write_audio() has been heard by the user. */
+    virtual int get_delay () = 0;
+
+    /* Pauses the stream if <p> is nonzero; otherwise unpauses it.
+     * write_audio() will not be called while the stream is paused. */
+    virtual void pause (bool pause) = 0;
+
+    /* Discards any buffered audio data. */
+    virtual void flush () = 0;
+};
+
+class EffectPlugin : public Plugin
+{
+public:
+    constexpr EffectPlugin (const PluginInfo info, int order, bool preserves_format) :
+        Plugin (PluginType::Effect, info),
+        order (order),
+        preserves_format (preserves_format) {}
+
+    /* Effects with lowest order (0 to 9) are applied first. */
+    const int order;
+
+    /* If the effect does not change the number of channels or the sampling
+     * rate, it can be enabled and disabled more smoothly. */
+    const bool preserves_format;
+
+    /* All processing is done in floating point.  If the effect plugin wants to
+     * change the channel count or sample rate, it can change the parameters
+     * passed to start().  They cannot be changed in the middle of a song. */
+    virtual void start (int & channels, int & rate) = 0;
+
+    /* Performs effect processing.  process() may modify the audio samples in
+     * place and return a reference to the same buffer, or it may return a
+     * reference to an internal working buffer.  The number of output samples
+     * need not be the same as the number of input samples. */
+    virtual Index<float> & process (Index<float> & data) = 0;
+
+    /* Optional.  A seek is taking place; any buffers should be discarded.
+     * Unless the "force" flag is set, the plugin may choose to override the
+     * normal flush behavior and handle the flush itself (for example, to
+     * perform crossfading).  The flush() function should return false in this
+     * case to prevent flush() from being called in downstream effect plugins. */
+    virtual bool flush (bool force)
+        { return true; }
+
+    /* Exactly like process() except that any buffers should be drained (i.e.
+     * the data processed and returned).  finish() will be called a second time
+     * at the end of the last song in the playlist. */
+    virtual Index<float> & finish (Index<float> & data, bool end_of_playlist)
+        { return process (data); }
+
+    /* Required only for plugins that change the time domain (e.g. a time
+     * stretch) or use read-ahead buffering.  translate_delay() must do two
+     * things: first, translate <delay> (which is in milliseconds) from the
+     * output time domain back to the input time domain; second, increase
+     * <delay> by the size of the read-ahead buffer.  It should return the
+     * adjusted delay. */
+    virtual int adjust_delay (int delay)
+        { return delay; }
+};
+
+enum class InputKey {
+    Ext,
+    MIME,
+    Scheme,
+    count
+};
+
+class InputPlugin : public Plugin
+{
+public:
+    enum {
+        /* Indicates that the plugin can write file tags */
+        FlagWritesTag = (1 << 0),
+
+        /* Indicates that files handled by the plugin may contain more than one
+         * song.  When reading the tuple for such a file, the plugin should set
+         * the FIELD_SUBSONG_NUM field to the number of songs in the file.  For
+         * all other files, the field should be left unset.
+         *
+         * Example:
+         * 1. User adds a file named "somefile.xxx" to the playlist.  Having
+         * determined that this plugin can handle the file, Audacious opens the
+         * file and calls probe_for_tuple().  probe_for_tuple() sees that there
+         * are 3 songs in the file and sets FIELD_SUBSONG_NUM to 3.
+         * 2. For each song in the file, Audacious opens the file and calls
+         * probe_for_tuple(); this time, however, a question mark and song
+         * number are appended to the file name passed: "somefile.sid?2" refers
+         * to the second song in the file "somefile.sid".
+         * 3. When one of the songs is played, Audacious opens the file and
+         * calls play() with a file name modified in this way. */
+        FlagSubtunes = (1 << 1)
+    };
+
+    struct InputInfo
+    {
+        typedef const char * const * List;
+
+        int flags, priority;
+        aud::array<InputKey, List> keys;
+
+        constexpr InputInfo (int flags = 0) :
+            flags (flags), priority (0), keys {} {}
+
+        /* Associates file extensions with the plugin. */
+        constexpr InputInfo with_exts (List exts) const
+            { return InputInfo (flags, priority,
+              exts, keys[InputKey::MIME], keys[InputKey::Scheme]); }
+
+        /* Associates MIME types with the plugin. */
+        constexpr InputInfo with_mimes (List mimes) const
+            { return InputInfo (flags, priority,
+              keys[InputKey::Ext], mimes, keys[InputKey::Scheme]); }
+
+        /* Associates custom URI schemes with the plugin.  Plugins using custom
+         * URI schemes are expected to handle their own I/O.  Hence, any VFSFile
+         * passed to play(), read_tuple(), etc. will be null. */
+        constexpr InputInfo with_schemes (List schemes) const
+            { return InputInfo (flags, priority,
+              keys[InputKey::Ext], keys[InputKey::MIME], schemes); }
+
+        /* Sets how quickly the plugin should be tried in searching for a plugin
+         * to handle a file which could not be identified from its extension.
+         * Plugins with priority 0 are tried first, 10 last. */
+        constexpr InputInfo with_priority (int priority) const
+            { return InputInfo (flags, priority,
+              keys[InputKey::Ext], keys[InputKey::MIME], keys[InputKey::Scheme]); }
+
+    private:
+        constexpr InputInfo (int flags, int priority, List exts, List mimes, List schemes) :
+            flags (flags), priority (priority), keys {exts, mimes, schemes} {}
+    };
+
+    constexpr InputPlugin (PluginInfo info, InputInfo input_info) :
+        Plugin (PluginType::Input, info),
+        input_info (input_info) {}
+
+    const InputInfo input_info;
+
+    /* Returns true if the plugin can handle the file. */
+    virtual bool is_our_file (const char * filename, VFSFile & file) = 0;
+
+    /* Reads metadata from the file. */
+    virtual Tuple read_tuple (const char * filename, VFSFile & file) = 0;
+
+    /* Plays the file.  Returns false on error.  Also see input-api.h. */
+    virtual bool play (const char * filename, VFSFile & file) = 0;
+
+    /* Optional.  Writes metadata to the file, returning false on error. */
+    virtual bool write_tuple (const char * filename, VFSFile & file, const Tuple & tuple)
+        { return false; }
+
+    /* Optional.  Reads an album art image (JPEG or PNG data) from the file.
+     * Returns an empty buffer on error. */
+    virtual Index<char> read_image (const char * filename, VFSFile & file)
+        { return Index<char> (); }
+
+    /* Optional.  Displays a window showing info about the file.  In general,
+     * this function should be avoided since Audacious already provides a file
+     * info window. */
+    virtual bool file_info_box (const char * filename, VFSFile & file)
+        { return false; }
+
+protected:
+    /* Prepares the output system for playback in the specified format.  Also
+     * triggers the "playback ready" hook.  Hence, if you call set_replay_gain,
+     * set_playback_tuple, or set_stream_bitrate, consider doing so before
+     * calling open_audio.  There is no return value.  If the requested audio
+     * format is not supported, write_audio() will do nothing and check_stop()
+     * will immediately return true. */
+    static void open_audio (int format, int rate, int channels);
+
+    /* Informs the output system of replay gain values for the current song so
+     * that volume levels can be adjusted accordingly, if the user so desires.
+     * This may be called at any time during playback should the values change. */
+    static void set_replay_gain (const ReplayGainInfo & gain);
+
+    /* Passes audio data to the output system for playback.  The data must be in
+     * the format passed to open_audio(), and the length (in bytes) must be an
+     * integral number of frames.  This function blocks until all the data has
+     * been written (though it may not yet be heard by the user). */
+    static void write_audio (const void * data, int length);
+
+    /* Returns the current tuple for the stream. */
+    static Tuple get_playback_tuple ();
+
+    /* Updates the tuple for the stream. */
+    static void set_playback_tuple (Tuple && tuple);
+
+    /* Updates the displayed bitrate, in bits per second. */
+    static void set_stream_bitrate (int bitrate);
+
+    /* Checks whether playback is to be stopped.  The play() function should
+     * poll check_stop() periodically and return as soon as check_stop() returns
+     * true. */
+    static bool check_stop ();
+
+    /* Checks whether a seek has been requested.  If so, returns the position to
+     * seek to, in milliseconds.  Otherwise, returns -1. */
+    static int check_seek ();
+};
+
+class DockablePlugin : public Plugin
+{
+public:
+    constexpr DockablePlugin (PluginType type, PluginInfo info) :
+        Plugin (type, info) {}
+
+    /* GtkWidget * get_gtk_widget () */
+    virtual void * get_gtk_widget () { return nullptr; }
+
+    /* QWidget * get_qt_widget () */
+    virtual void * get_qt_widget () { return nullptr; }
+};
+
+class GeneralPlugin : public DockablePlugin
+{
+public:
+    constexpr GeneralPlugin (PluginInfo info, bool enabled_by_default) :
+        DockablePlugin (PluginType::General, info),
+        enabled_by_default (enabled_by_default) {}
+
+    const bool enabled_by_default;
+};
+
+class VisPlugin : public DockablePlugin, public Visualizer
+{
+public:
+    constexpr VisPlugin (PluginInfo info, int type_mask) :
+        DockablePlugin (PluginType::Vis, info),
+        Visualizer (type_mask) {}
+};
+
+class IfacePlugin : public Plugin
+{
+public:
+    constexpr IfacePlugin (PluginInfo info) :
+        Plugin (PluginType::Iface, info) {}
+
+    virtual void show (bool show) = 0;
+    virtual void run () = 0;
+    virtual void quit () = 0;
+
+    virtual void show_about_window () = 0;
+    virtual void hide_about_window () = 0;
+    virtual void show_filebrowser (bool open) = 0;
+    virtual void hide_filebrowser () = 0;
+    virtual void show_jump_to_song () = 0;
+    virtual void hide_jump_to_song () = 0;
+    virtual void show_prefs_window () = 0;
+    virtual void hide_prefs_window () = 0;
+    virtual void plugin_menu_add (AudMenuID id, void func (), const char * name, const char * icon) = 0;
+    virtual void plugin_menu_remove (AudMenuID id, void func ()) = 0;
+};
+
+#endif
diff --git a/src/libaudcore/plugins-internal.h b/src/libaudcore/plugins-internal.h
new file mode 100644
index 000000000000..06bbc1e3df33
--- /dev/null
+++ b/src/libaudcore/plugins-internal.h
@@ -0,0 +1,54 @@
+/*
+ * internal.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_PLUGINS_INTERNAL_H
+#define LIBAUDCORE_PLUGINS_INTERNAL_H
+
+#include "plugins.h"
+
+enum class InputKey;
+class Plugin;
+
+/* plugin-init.c */
+void start_plugins_one ();
+void start_plugins_two ();
+void stop_plugins_two ();
+void stop_plugins_one ();
+
+/* plugin-load.c */
+void plugin_system_init ();
+void plugin_system_cleanup ();
+Plugin * plugin_load (const char * path);
+
+/* plugin-registry.c */
+void plugin_registry_load ();
+void plugin_registry_prune ();
+void plugin_registry_save ();
+
+void plugin_register (const char * path, int timestamp);
+void plugin_set_enabled (PluginHandle * plugin, bool enabled);
+void plugin_set_failed (PluginHandle * plugin);
+
+bool transport_plugin_has_scheme (PluginHandle * plugin, const char * scheme);
+bool playlist_plugin_has_ext (PluginHandle * plugin, const char * ext);
+bool input_plugin_has_key (PluginHandle * plugin, InputKey key, const char * value);
+bool input_plugin_has_subtunes (PluginHandle * plugin);
+bool input_plugin_can_write_tuple (PluginHandle * plugin);
+
+#endif
diff --git a/src/libaudcore/plugins.h b/src/libaudcore/plugins.h
new file mode 100644
index 000000000000..7223560fb8b4
--- /dev/null
+++ b/src/libaudcore/plugins.h
@@ -0,0 +1,68 @@
+/*
+ * plugins.h
+ * Copyright 2010-2012 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_PLUGINS_H
+#define LIBAUDCORE_PLUGINS_H
+
+#include <libaudcore/index.h>
+
+enum class PluginType {
+    Transport,
+    Playlist,
+    Input,
+    Effect,
+    Output,
+    Vis,
+    General,
+    Iface,
+    count
+};
+
+class PluginHandle;
+
+/* CAUTION: These functions are not thread safe. */
+
+PluginHandle * aud_plugin_get_current (PluginType type);
+bool aud_plugin_get_enabled (PluginHandle * plugin);
+bool aud_plugin_enable (PluginHandle * plugin, bool enable);
+
+int aud_plugin_send_message (PluginHandle * plugin, const char * code, const void * data, int size);
+void * aud_plugin_get_gtk_widget (PluginHandle * plugin);  // returns (GtkWidget *)
+void * aud_plugin_get_qt_widget (PluginHandle * plugin);  // return (QWidget *)
+
+PluginType aud_plugin_get_type (PluginHandle * plugin);
+const char * aud_plugin_get_basename (PluginHandle * plugin);
+PluginHandle * aud_plugin_lookup_basename (const char * basename);
+
+const void * aud_plugin_get_header (PluginHandle * plugin);
+PluginHandle * aud_plugin_by_header (const void * header);
+
+const Index<PluginHandle *> & aud_plugin_list (PluginType type);
+
+const char * aud_plugin_get_name (PluginHandle * plugin);
+bool aud_plugin_has_about (PluginHandle * plugin);
+bool aud_plugin_has_configure (PluginHandle * plugin);
+
+/* returns true to continue watching, false to stop */
+typedef bool (* PluginWatchFunc) (PluginHandle * plugin, void * data);
+
+void aud_plugin_add_watch (PluginHandle * plugin, PluginWatchFunc func, void * data);
+void aud_plugin_remove_watch (PluginHandle * plugin, PluginWatchFunc func, void * data);
+
+#endif
diff --git a/src/libaudcore/preferences.cc b/src/libaudcore/preferences.cc
new file mode 100644
index 000000000000..4f14e39399ad
--- /dev/null
+++ b/src/libaudcore/preferences.cc
@@ -0,0 +1,123 @@
+/*
+ * preferences.cc
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "preferences.h"
+#include "runtime.h"
+
+#include <assert.h>
+
+EXPORT bool WidgetConfig::get_bool () const
+{
+    assert (type == Bool);
+
+    if (value)
+        return * (bool *) value;
+    else if (name)
+        return aud_get_bool (section, name);
+    else
+        return false;
+}
+
+EXPORT void WidgetConfig::set_bool (bool val) const
+{
+    assert (type == Bool);
+
+    if (value)
+        * (bool *) value = val;
+    else if (name)
+        aud_set_bool (section, name, val);
+
+    if (callback)
+        callback ();
+}
+
+EXPORT int WidgetConfig::get_int () const
+{
+    assert (type == Int);
+
+    if (value)
+        return * (int *) value;
+    else if (name)
+        return aud_get_int (section, name);
+    else
+        return 0;
+}
+
+EXPORT void WidgetConfig::set_int (int val) const
+{
+    assert (type == Int);
+
+    if (value)
+        * (int *) value = val;
+    else if (name)
+        aud_set_int (section, name, val);
+
+    if (callback)
+        callback ();
+}
+
+EXPORT double WidgetConfig::get_float () const
+{
+    assert (type == Float);
+
+    if (value)
+        return * (double *) value;
+    else if (name)
+        return aud_get_double (section, name);
+    else
+        return 0;
+}
+
+EXPORT void WidgetConfig::set_float (double val) const
+{
+    assert (type == Float);
+
+    if (value)
+        * (double *) value = val;
+    else if (name)
+        aud_set_double (section, name, val);
+
+    if (callback)
+        callback ();
+}
+
+EXPORT String WidgetConfig::get_string () const
+{
+    assert (type == String);
+
+    if (value)
+        return * (::String *) value;
+    else if (name)
+        return aud_get_str (section, name);
+    else
+        return ::String ();
+}
+
+EXPORT void WidgetConfig::set_string (const char * val) const
+{
+    assert (type == String);
+
+    if (value)
+        * (::String *) value = ::String (val);
+    else if (name)
+        aud_set_str (section, name, val);
+
+    if (callback)
+        callback ();
+}
diff --git a/src/libaudcore/preferences.h b/src/libaudcore/preferences.h
new file mode 100644
index 000000000000..6f34ce527fab
--- /dev/null
+++ b/src/libaudcore/preferences.h
@@ -0,0 +1,301 @@
+/*
+ * preferences.h
+ * Copyright 2007-2014 Tomasz Moń, William Pitcock, and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_PREFERENCES_H
+#define LIBAUDCORE_PREFERENCES_H
+
+#include <libaudcore/objects.h>
+
+struct PreferencesWidget;
+
+struct ComboItem {
+    const char * label;
+    const char * str;
+    int num;
+
+    constexpr ComboItem (const char * label, const char * str) :
+        label (label),
+        str (str),
+        num (-1) {}
+
+    constexpr ComboItem (const char * label, int num) :
+        label (label),
+        str (nullptr),
+        num (num) {}
+};
+
+struct WidgetVButton {
+    void (* callback) (void);
+    const char * icon;
+};
+
+struct WidgetVRadio {
+    int value;
+};
+
+struct WidgetVSpin {
+    double min, max, step;
+    const char * right_label; /* text right to widget */
+};
+
+struct WidgetVTable {
+    ArrayRef<PreferencesWidget> widgets;
+};
+
+struct WidgetVFonts {
+    const char * title;
+};
+
+struct WidgetVEntry {
+    bool password;
+};
+
+struct WidgetVCombo {
+    /* static init */
+    ArrayRef<ComboItem> elems;
+
+    /* runtime init */
+    ArrayRef<ComboItem> (* fill) ();
+};
+
+struct WidgetVBox {
+    ArrayRef<PreferencesWidget> widgets;
+
+    bool horizontal;  /* false gives vertical, true gives horizontal alignment of child widgets */
+    bool frame;       /* whether to draw frame around box */
+};
+
+struct NotebookTab {
+    const char * name;
+    ArrayRef<PreferencesWidget> widgets;
+};
+
+struct WidgetVNotebook {
+    ArrayRef<NotebookTab> tabs;
+};
+
+struct WidgetVSeparator {
+    bool horizontal;  /* false gives vertical, true gives horizontal separator */
+};
+
+union WidgetVariant {
+    WidgetVButton button;
+    WidgetVRadio radio_btn;
+    WidgetVSpin spin_btn;
+    WidgetVTable table;
+    WidgetVFonts font_btn;
+    WidgetVEntry entry;
+    WidgetVCombo combo;
+    WidgetVBox box;
+    WidgetVNotebook notebook;
+    WidgetVSeparator separator;
+
+    /* for custom GTK or Qt widgets */
+    /* GtkWidget * (* populate) (void); */
+    /* QWidget * (* populate) (void); */
+    void * (* populate) (void);
+
+    constexpr WidgetVariant (WidgetVButton button) : button (button) {}
+    constexpr WidgetVariant (WidgetVRadio radio) : radio_btn (radio) {}
+    constexpr WidgetVariant (WidgetVSpin spin) : spin_btn (spin) {}
+    constexpr WidgetVariant (WidgetVTable table) : table (table) {}
+    constexpr WidgetVariant (WidgetVFonts fonts) : font_btn (fonts) {}
+    constexpr WidgetVariant (WidgetVEntry entry) : entry (entry) {}
+    constexpr WidgetVariant (WidgetVCombo combo) : combo (combo) {}
+    constexpr WidgetVariant (WidgetVBox box) : box (box) {}
+    constexpr WidgetVariant (WidgetVNotebook notebook) : notebook (notebook) {}
+    constexpr WidgetVariant (WidgetVSeparator separator) : separator (separator) {}
+
+    /* also serves as default constructor */
+    constexpr WidgetVariant (void * (* populate) (void) = 0) : populate (populate) {}
+};
+
+struct WidgetConfig
+{
+    enum Type {
+        None,
+        Bool,
+        Int,
+        Float,
+        String
+    };
+
+    Type type;
+
+    /* pointer to immediate value */
+    void * value;
+    /* identifier for configuration value */
+    const char * section, * name;
+    /* called when value is changed  */
+    void (* callback) (void);
+    /* widget updates when this hook is called */
+    const char * hook;
+
+    constexpr WidgetConfig () :
+        type (None),
+        value (nullptr),
+        section (nullptr),
+        name (nullptr),
+        callback (nullptr),
+        hook (nullptr) {}
+
+    constexpr WidgetConfig (Type type, void * value, const char * section,
+     const char * name, void (* callback) (void), const char * hook) :
+        type (type),
+        value (value),
+        section (section),
+        name (name),
+        callback (callback),
+        hook (hook) {}
+
+    bool get_bool () const;
+    void set_bool (bool val) const;
+    int get_int () const;
+    void set_int (int val) const;
+    double get_float () const;
+    void set_float (double val) const;
+    ::String get_string () const;
+    void set_string (const char * val) const;
+};
+
+constexpr WidgetConfig WidgetBool (bool & value,
+ void (* callback) (void) = nullptr, const char * hook = nullptr)
+    { return WidgetConfig (WidgetConfig::Bool, (void *) & value, 0, 0, callback, hook); }
+constexpr WidgetConfig WidgetInt (int & value,
+ void (* callback) (void) = nullptr, const char * hook = nullptr)
+    { return WidgetConfig (WidgetConfig::Int, (void *) & value, 0, 0, callback, hook); }
+constexpr WidgetConfig WidgetFloat (double & value,
+ void (* callback) (void) = nullptr, const char * hook = nullptr)
+    { return WidgetConfig (WidgetConfig::Float, (void *) & value, 0, 0, callback, hook); }
+constexpr WidgetConfig WidgetString (String & value,
+ void (* callback) (void) = nullptr, const char * hook = nullptr)
+    { return WidgetConfig (WidgetConfig::String, (void *) & value, 0, 0, callback, hook); }
+
+constexpr WidgetConfig WidgetBool (const char * section, const char * name,
+ void (* callback) (void) = nullptr, const char * hook = nullptr)
+    { return WidgetConfig (WidgetConfig::Bool, 0, section, name, callback, hook); }
+constexpr WidgetConfig WidgetInt (const char * section, const char * name,
+ void (* callback) (void) = nullptr, const char * hook = nullptr)
+    { return WidgetConfig (WidgetConfig::Int, 0, section, name, callback, hook); }
+constexpr WidgetConfig WidgetFloat (const char * section, const char * name,
+ void (* callback) (void) = nullptr, const char * hook = nullptr)
+    { return WidgetConfig (WidgetConfig::Float, 0, section, name, callback, hook); }
+constexpr WidgetConfig WidgetString (const char * section, const char * name,
+ void (* callback) (void) = nullptr, const char * hook = nullptr)
+    { return WidgetConfig (WidgetConfig::String, 0, section, name, callback, hook); }
+
+struct PreferencesWidget
+{
+    enum Type {
+        Label,
+        Button,
+        CheckButton,
+        RadioButton,
+        SpinButton,
+        Entry,
+        ComboBox,
+        FontButton,
+        Box,
+        Table,
+        Notebook,
+        Separator,
+        CustomGTK,
+        CustomQt
+    };
+
+    Type type;
+    const char * label;       /* widget title (for SPIN_BTN it's text left to widget) */
+    bool child;
+
+    WidgetConfig cfg;
+    WidgetVariant data;
+};
+
+enum WidgetIsChild {
+    WIDGET_NOT_CHILD,
+    WIDGET_CHILD
+};
+
+constexpr PreferencesWidget WidgetLabel (const char * label,
+ WidgetIsChild child = WIDGET_NOT_CHILD)
+    { return {PreferencesWidget::Label, label, (child == WIDGET_CHILD)}; }
+
+constexpr PreferencesWidget WidgetButton (const char * label,
+ WidgetVButton button, WidgetIsChild child = WIDGET_NOT_CHILD)
+    { return {PreferencesWidget::Button, label, (child == WIDGET_CHILD), {}, button}; }
+
+constexpr PreferencesWidget WidgetCheck (const char * label,
+ WidgetConfig cfg, WidgetIsChild child = WIDGET_NOT_CHILD)
+    { return {PreferencesWidget::CheckButton, label,
+       (child == WIDGET_CHILD), cfg}; }
+
+constexpr PreferencesWidget WidgetRadio (const char * label,
+ WidgetConfig cfg, WidgetVRadio radio, WidgetIsChild child = WIDGET_NOT_CHILD)
+    { return {PreferencesWidget::RadioButton, label,
+       (child == WIDGET_CHILD), cfg, radio}; }
+
+constexpr PreferencesWidget WidgetSpin (const char * label,
+ WidgetConfig cfg, WidgetVSpin spin, WidgetIsChild child = WIDGET_NOT_CHILD)
+    { return {PreferencesWidget::SpinButton, label,
+       (child == WIDGET_CHILD), cfg, spin}; }
+
+constexpr PreferencesWidget WidgetEntry (const char * label,
+ WidgetConfig cfg, WidgetVEntry entry = WidgetVEntry(),
+ WidgetIsChild child = WIDGET_NOT_CHILD)
+    { return {PreferencesWidget::Entry, label,
+       (child == WIDGET_CHILD), cfg, entry}; }
+
+constexpr PreferencesWidget WidgetCombo (const char * label,
+ WidgetConfig cfg, WidgetVCombo combo, WidgetIsChild child = WIDGET_NOT_CHILD)
+    { return {PreferencesWidget::ComboBox, label,
+       (child == WIDGET_CHILD), cfg, combo}; }
+
+constexpr PreferencesWidget WidgetFonts (const char * label,
+ WidgetConfig cfg, WidgetVFonts fonts, WidgetIsChild child = WIDGET_NOT_CHILD)
+    { return {PreferencesWidget::FontButton, label,
+       (child == WIDGET_CHILD), cfg, fonts}; }
+
+constexpr PreferencesWidget WidgetBox (WidgetVBox box, WidgetIsChild child = WIDGET_NOT_CHILD)
+    { return {PreferencesWidget::Box, 0, (child == WIDGET_CHILD), {}, box}; }
+
+constexpr PreferencesWidget WidgetTable (WidgetVTable table,
+ WidgetIsChild child = WIDGET_NOT_CHILD)
+    { return {PreferencesWidget::Table, 0, (child == WIDGET_CHILD), {}, table}; }
+
+constexpr PreferencesWidget WidgetNotebook (WidgetVNotebook notebook)
+    { return {PreferencesWidget::Notebook, 0, 0, {}, notebook}; }
+
+constexpr PreferencesWidget WidgetSeparator (WidgetVSeparator separator = WidgetVSeparator ())
+    { return {PreferencesWidget::Separator, 0, 0, {}, separator}; }
+
+constexpr PreferencesWidget WidgetCustomGTK (void * (* populate) (void))
+    { return {PreferencesWidget::CustomGTK, 0, 0, {}, populate}; }
+
+constexpr PreferencesWidget WidgetCustomQt (void * (* populate) (void))
+    { return {PreferencesWidget::CustomQt, 0, 0, {}, populate}; }
+
+struct PluginPreferences {
+    ArrayRef<PreferencesWidget> widgets;
+
+    void (* init) (void);
+    void (* apply) (void);
+    void (* cleanup) (void);
+};
+
+#endif /* LIBAUDCORE_PREFERENCES_H */
diff --git a/src/libaudcore/probe-buffer.cc b/src/libaudcore/probe-buffer.cc
new file mode 100644
index 000000000000..599f587c1c31
--- /dev/null
+++ b/src/libaudcore/probe-buffer.cc
@@ -0,0 +1,146 @@
+/*
+ * probe-buffer.c
+ * Copyright 2010-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "internal.h"
+
+#include <string.h>
+
+#include "vfs.h"
+
+#define BUFSIZE (256 * 1024)
+
+class ProbeBuffer : public VFSImpl
+{
+public:
+    ProbeBuffer (VFSFile && file) :
+        m_file (std::move (file)),
+        m_filled (0),
+        m_at (0) {}
+
+    int64_t fread (void * ptr, int64_t size, int64_t nmemb);
+    int fseek (int64_t offset, VFSSeekType whence);
+
+    int64_t ftell ();
+    int64_t fsize ();
+    bool feof ();
+
+    int64_t fwrite (const void * ptr, int64_t size, int64_t nmemb);
+    int ftruncate (int64_t length);
+    int fflush ();
+
+    String get_metadata (const char * field);
+
+private:
+    void increase_buffer (int64_t size);
+
+    VFSFile m_file;
+    int m_filled, m_at;
+    unsigned char m_buffer[BUFSIZE];
+};
+
+void ProbeBuffer::increase_buffer (int64_t size)
+{
+    size = (size + 0xFF) & ~0xFF;
+
+    if (size > (int64_t) sizeof m_buffer)
+        size = (int64_t) sizeof m_buffer;
+
+    if (m_filled < size)
+        m_filled += m_file.fread (m_buffer + m_filled, 1, size - m_filled);
+}
+
+int64_t ProbeBuffer::fread (void * buffer, int64_t size, int64_t count)
+{
+    increase_buffer (m_at + size * count);
+    int readed = (size > 0) ? aud::min (count, (m_filled - m_at) / size) : 0;
+    memcpy (buffer, m_buffer + m_at, size * readed);
+
+    m_at += size * readed;
+    return readed;
+}
+
+int64_t ProbeBuffer::fwrite (const void * data, int64_t size, int64_t count)
+{
+    return 0; /* not allowed */
+}
+
+int ProbeBuffer::fseek (int64_t offset, VFSSeekType whence)
+{
+    if (whence == VFS_SEEK_END)
+        return -1; /* not allowed */
+
+    if (whence == VFS_SEEK_CUR)
+        offset += m_at;
+
+    if (offset < 0 || offset > (int64_t) sizeof m_buffer)
+        return -1;
+
+    increase_buffer (offset);
+
+    if (offset > m_filled)
+        return -1;
+
+    m_at = offset;
+    return 0;
+}
+
+int64_t ProbeBuffer::ftell ()
+{
+    return m_at;
+}
+
+bool ProbeBuffer::feof ()
+{
+    if (m_at < m_filled)
+        return false;
+    if (m_at == sizeof m_buffer)
+        return true;
+
+    return m_file.feof ();
+}
+
+int ProbeBuffer::ftruncate (int64_t size)
+{
+    return -1; /* not allowed */
+}
+
+int ProbeBuffer::fflush ()
+{
+    return 0; /* no-op */
+}
+
+int64_t ProbeBuffer::fsize ()
+{
+    int64_t size = m_file.fsize ();
+    return aud::min (size, (int64_t) sizeof m_buffer);
+}
+
+String ProbeBuffer::get_metadata (const char * field)
+{
+    return m_file.get_metadata (field);
+}
+
+VFSFile probe_buffer_new (const char * filename)
+{
+    VFSFile file (filename, "r");
+    if (! file)
+        return file;  // preserve error message
+
+    return VFSFile (filename, new ProbeBuffer (std::move (file)));
+}
diff --git a/src/libaudcore/probe.cc b/src/libaudcore/probe.cc
new file mode 100644
index 000000000000..579f41c39cdc
--- /dev/null
+++ b/src/libaudcore/probe.cc
@@ -0,0 +1,215 @@
+/*
+ * probe.c
+ * Copyright 2009-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "probe.h"
+
+#include <string.h>
+
+#include "audstrings.h"
+#include "i18n.h"
+#include "internal.h"
+#include "playlist.h"
+#include "plugin.h"
+#include "plugins-internal.h"
+#include "runtime.h"
+
+EXPORT PluginHandle * aud_file_find_decoder (const char * filename, bool fast, String * error)
+{
+    AUDINFO ("Probing %s.\n", filename);
+
+    auto & list = aud_plugin_list (PluginType::Input);
+
+    StringBuf scheme = uri_get_scheme (filename);
+    StringBuf ext = uri_get_extension (filename);
+    Index<PluginHandle *> ext_matches;
+
+    for (PluginHandle * plugin : list)
+    {
+        if (! aud_plugin_get_enabled (plugin))
+            continue;
+
+        if (scheme && input_plugin_has_key (plugin, InputKey::Scheme, scheme))
+        {
+            AUDINFO ("Matched %s by URI scheme.\n", aud_plugin_get_name (plugin));
+            return plugin;
+        }
+
+        if (ext && input_plugin_has_key (plugin, InputKey::Ext, ext))
+            ext_matches.append (plugin);
+    }
+
+    if (ext_matches.len () == 1)
+    {
+        AUDINFO ("Matched %s by extension.\n", aud_plugin_get_name (ext_matches[0]));
+        return ext_matches[0];
+    }
+
+    AUDDBG ("Matched %d plugins by extension.\n", ext_matches.len ());
+
+    if (fast && ! ext_matches.len ())
+        return nullptr;
+
+    AUDDBG ("Opening %s.\n", filename);
+
+    VFSFile file (probe_buffer_new (filename));
+
+    if (! file)
+    {
+        if (error)
+            * error = String (file.error ());
+
+        AUDINFO ("Open failed: %s.\n", file.error ());
+        return nullptr;
+    }
+
+    String mime = file.get_metadata ("content-type");
+
+    if (mime)
+    {
+        for (PluginHandle * plugin : (ext_matches.len () ? ext_matches : list))
+        {
+            if (! aud_plugin_get_enabled (plugin))
+                continue;
+
+            if (input_plugin_has_key (plugin, InputKey::MIME, mime))
+            {
+                AUDINFO ("Matched %s by MIME type %s.\n",
+                 aud_plugin_get_name (plugin), (const char *) mime);
+                return plugin;
+            }
+        }
+    }
+
+    for (PluginHandle * plugin : (ext_matches.len () ? ext_matches : list))
+    {
+        if (! aud_plugin_get_enabled (plugin))
+            continue;
+
+        AUDINFO ("Trying %s.\n", aud_plugin_get_name (plugin));
+
+        InputPlugin * ip = (InputPlugin *) aud_plugin_get_header (plugin);
+        if (! ip)
+            continue;
+
+        if (ip->is_our_file (filename, file))
+        {
+            AUDINFO ("Matched %s by content.\n", aud_plugin_get_name (plugin));
+            return plugin;
+        }
+
+        if (file.fseek (0, VFS_SEEK_SET) != 0)
+        {
+            if (error)
+                * error = String (_("Seek error"));
+
+            AUDINFO ("Seek failed.\n");
+            return nullptr;
+        }
+    }
+
+    if (error)
+        * error = String (_("File format not recognized"));
+
+    AUDINFO ("No plugins matched.\n");
+    return nullptr;
+}
+
+static bool open_file (const char * filename, InputPlugin * ip,
+ const char * mode, VFSFile & handle, String * error = nullptr)
+{
+    /* no need to open a handle for custom URI schemes */
+    if (ip->input_info.keys[InputKey::Scheme])
+        return true;
+
+    handle = VFSFile (filename, mode);
+    if (! handle && error)
+        * error = String (handle.error ());
+
+    return (bool) handle;
+}
+
+EXPORT Tuple aud_file_read_tuple (const char * filename, PluginHandle * decoder, String * error)
+{
+    InputPlugin * ip = (InputPlugin *) aud_plugin_get_header (decoder);
+    if (! ip && error)
+        * error = String (_("Error loading plugin"));
+    if (! ip)
+        return Tuple ();
+
+    VFSFile handle;
+    if (! open_file (filename, ip, "r", handle, error))
+        return Tuple ();
+
+    Tuple tuple = ip->read_tuple (filename, handle);
+    if (! tuple && error)
+        * error = String (_("Error reading metadata"));
+
+    return tuple;
+}
+
+EXPORT Index<char> aud_file_read_image (const char * filename, PluginHandle * decoder)
+{
+    InputPlugin * ip = (InputPlugin *) aud_plugin_get_header (decoder);
+    if (! ip)
+        return Index<char> ();
+
+    VFSFile handle;
+    if (! open_file (filename, ip, "r", handle))
+        return Index<char> ();
+
+    return ip->read_image (filename, handle);
+}
+
+EXPORT bool aud_file_can_write_tuple (const char * filename, PluginHandle * decoder)
+{
+    return input_plugin_can_write_tuple (decoder);
+}
+
+EXPORT bool aud_file_write_tuple (const char * filename,
+ PluginHandle * decoder, const Tuple & tuple)
+{
+    InputPlugin * ip = (InputPlugin *) aud_plugin_get_header (decoder);
+    if (! ip)
+        return false;
+
+    VFSFile handle;
+    if (! open_file (filename, ip, "r+", handle))
+        return false;
+
+    bool success = ip->write_tuple (filename, handle, tuple) &&
+     (! handle || handle.fflush () == 0);
+
+    if (success)
+        aud_playlist_rescan_file (filename);
+
+    return success;
+}
+
+EXPORT bool aud_custom_infowin (const char * filename, PluginHandle * decoder)
+{
+    InputPlugin * ip = (InputPlugin *) aud_plugin_get_header (decoder);
+    if (! ip)
+        return false;
+
+    VFSFile handle;
+    if (! open_file (filename, ip, "r", handle))
+        return false;
+
+    return ip->file_info_box (filename, handle);
+}
diff --git a/src/libaudcore/probe.h b/src/libaudcore/probe.h
new file mode 100644
index 000000000000..4010f3fded76
--- /dev/null
+++ b/src/libaudcore/probe.h
@@ -0,0 +1,51 @@
+/*
+ * probe.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_PROBE_H
+#define LIBAUDCORE_PROBE_H
+
+#include <libaudcore/index.h>
+#include <libaudcore/objects.h>
+
+class PluginHandle;
+class Tuple;
+
+/* Gets album art for <file> (the URI of a song file) as JPEG or PNG data.  If
+ * the album art is not yet loaded, sets *queued to true, returns nullptr, and
+ * begins to load the album art in the background.  On completion, the "art
+ * ready" hook is called, with <file> as a parameter.  The "current art ready"
+ * hook is also called if <file> is the currently playing song.  If no album art
+ * could be loaded, sets *queued to false and returns nullptr. */
+const Index<char> * aud_art_request_data (const char * file, bool * queued = nullptr);
+
+/* Similar to art_request_data() but returns the URI of an image file.
+ * (A temporary file will be created if necessary.) */
+const char * aud_art_request_file (const char * file, bool * queued = nullptr);
+
+/* Releases album art returned by art_request_data() or art_request_file(). */
+void aud_art_unref (const char * file);
+
+PluginHandle * aud_file_find_decoder (const char * filename, bool fast, String * error = nullptr);
+Tuple aud_file_read_tuple (const char * filename, PluginHandle * decoder, String * error = nullptr);
+Index<char> aud_file_read_image (const char * filename, PluginHandle * decoder);
+bool aud_file_can_write_tuple (const char * filename, PluginHandle * decoder);
+bool aud_file_write_tuple (const char * filename, PluginHandle * decoder, const Tuple & tuple);
+bool aud_custom_infowin (const char * filename, PluginHandle * decoder);
+
+#endif
diff --git a/src/libaudcore/ringbuf.cc b/src/libaudcore/ringbuf.cc
new file mode 100644
index 000000000000..1a0937f07d0e
--- /dev/null
+++ b/src/libaudcore/ringbuf.cc
@@ -0,0 +1,184 @@
+/*
+ * ringbuf.cc
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "ringbuf.h"
+#include "internal.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+void RingBufBase::get_areas (int pos, int len, Areas & areas)
+{
+    assert (pos >= 0 && len >= 0 && pos + len <= m_len);
+
+    int start = (m_offset + pos) % m_size;
+    int part = aud::min (len, m_size - start);
+
+    areas.area1 = (char *) m_data + start;
+    areas.area2 = m_data;
+    areas.len1 = part;
+    areas.len2 = len - part;
+}
+
+EXPORT void RingBufBase::alloc (int size)
+{
+    assert (size >= m_len);
+
+    if (size <= m_size)
+        return;
+
+    void * mem = realloc (m_data, size);
+    if (! mem)
+        throw std::bad_alloc ();  /* nothing changed yet */
+
+    __sync_add_and_fetch (& misc_bytes_allocated, size - m_size);
+
+    int to_end = m_size - m_offset;
+
+    m_data = mem;
+    m_size = size;
+
+    if (to_end < m_len)
+    {
+        int new_offset = m_size - to_end;
+        memmove ((char *) m_data + new_offset, (char *) m_data + m_offset, to_end);
+        m_offset = new_offset;
+    }
+}
+
+EXPORT void RingBufBase::destroy (aud::EraseFunc erase_func)
+{
+    if (! m_data)
+        return;
+
+    __sync_sub_and_fetch (& misc_bytes_allocated, m_size);
+
+    discard (-1, erase_func);
+
+    free (m_data);
+    m_data = nullptr;
+    m_size = 0;
+}
+
+EXPORT void RingBufBase::add (int len)
+{
+    assert (len >= 0 && m_len + len <= m_size);
+    m_len += len;
+}
+
+EXPORT void RingBufBase::remove (int len)
+{
+    assert (len >= 0 && len <= m_len);
+
+    if (len == m_len)
+        m_offset = m_len = 0;
+    else
+    {
+        m_offset = (m_offset + len) % m_size;
+        m_len -= len;
+    }
+}
+
+EXPORT void RingBufBase::copy_in (const void * from, int len, aud::CopyFunc copy_func)
+{
+    Areas areas;
+    add (len);
+    get_areas (m_len - len, len, areas);
+
+    if (copy_func)
+    {
+        copy_func (from, areas.area1, areas.len1);
+        copy_func ((const char *) from + areas.len1, areas.area2, areas.len2);
+    }
+    else
+    {
+        memcpy (areas.area1, from, areas.len1);
+        memcpy (areas.area2, (const char *) from + areas.len1, areas.len2);
+    }
+}
+
+EXPORT void RingBufBase::move_in (void * from, int len, aud::FillFunc fill_func)
+{
+    Areas areas;
+    add (len);
+    get_areas (m_len - len, len, areas);
+
+    memcpy (areas.area1, from, areas.len1);
+    memcpy (areas.area2, (const char *) from + areas.len1, areas.len2);
+
+    if (fill_func)
+        fill_func (from, len);
+}
+
+EXPORT void RingBufBase::move_out (void * to, int len, aud::EraseFunc erase_func)
+{
+    Areas areas;
+    get_areas (0, len, areas);
+
+    if (erase_func)
+        erase_func (to, len);
+
+    memcpy (to, areas.area1, areas.len1);
+    memcpy ((char *) to + areas.len1, areas.area2, areas.len2);
+
+    remove (len);
+}
+
+EXPORT void RingBufBase::discard (int len, aud::EraseFunc erase_func)
+{
+    if (! m_data)
+        return;
+
+    if (len < 0)
+        len = m_len;
+
+    if (erase_func)
+    {
+        Areas areas;
+        get_areas (0, len, areas);
+        erase_func (areas.area1, areas.len1);
+        erase_func (areas.area2, areas.len2);
+    }
+
+    remove (len);
+}
+
+EXPORT void RingBufBase::move_in (IndexBase & index, int from, int len)
+{
+    assert (from >= 0 && from <= index.len ());
+    assert (len <= index.len () - from);
+
+    if (len < 0)
+        len = index.len () - from;
+
+    move_in ((char *) index.begin () + from, len, nullptr);
+    index.remove (from, len, nullptr);
+}
+
+EXPORT void RingBufBase::move_out (IndexBase & index, int to, int len)
+{
+    assert (len <= m_len);
+
+    if (len < 0)
+        len = m_len;
+
+    void * ptr = index.insert (to, len);
+    move_out (ptr, len, nullptr);
+}
diff --git a/src/libaudcore/ringbuf.h b/src/libaudcore/ringbuf.h
new file mode 100644
index 000000000000..f909b251b831
--- /dev/null
+++ b/src/libaudcore/ringbuf.h
@@ -0,0 +1,180 @@
+/*
+ * ringbuf.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_RINGBUF_H
+#define LIBAUDCORE_RINGBUF_H
+
+#include <libaudcore/index.h>
+
+/*
+ * RingBuf is a lightweight ring buffer class, with the following properties:
+ *  - The base implementation is type-agnostic, so it only needs to be compiled
+ *    once.  Type-safety is provided by a thin template subclass.
+ *  - Objects are moved in memory without calling any assignment operator.
+ *    Be careful to use only objects that can handle this.
+ *  - The head and tail pointers within the ring buffer stay aligned as one
+ *    would expect: that is, if data is only written and read in multiples of n
+ *    bytes, and the size of the ring buffer is also a multiple of n bytes, then
+ *    no n-byte block will ever wrap around the end of the ring buffer.  The
+ *    alignment of the buffer is reset whenever the buffer becomes empty.
+ */
+
+class RingBufBase
+{
+public:
+    constexpr RingBufBase () :
+        m_data (nullptr),
+        m_size (0),
+        m_offset (0),
+        m_len (0) {}
+
+    RingBufBase (RingBufBase && b) :
+        m_data (b.m_data),
+        m_size (b.m_size),
+        m_offset (b.m_offset),
+        m_len (b.m_len)
+    {
+        b.m_data = nullptr;
+        b.m_size = 0;
+        b.m_offset = 0;
+        b.m_len = 0;
+    }
+
+    void steal (RingBufBase && b, aud::EraseFunc erase_func)
+    {
+        if (this != & b)
+        {
+            destroy (erase_func);
+            new (this) RingBufBase (std::move (b));
+        }
+    }
+
+    // allocated size of the buffer
+    int size () const
+        { return m_size; }
+
+    // number of bytes currently used
+    int len () const
+        { return m_len; }
+
+    // number of bytes that can be read linearly
+    int linear () const
+        { return aud::min (m_len, m_size - m_offset); }
+
+    void * at (int pos) const
+        { return (char *) m_data + (m_offset + pos) % m_size; }
+
+    void alloc (int size);
+    void destroy (aud::EraseFunc erase_func);
+
+    void add (int len);  // no fill
+    void remove (int len);  // no erase
+
+    void copy_in (const void * from, int len, aud::CopyFunc copy_func);
+    void move_in (void * from, int len, aud::FillFunc fill_func);
+    void move_out (void * to, int len, aud::EraseFunc erase_func);
+    void discard (int len, aud::EraseFunc erase_func);
+
+    void move_in (IndexBase & index, int from, int len);
+    void move_out (IndexBase & index, int to, int len);
+
+private:
+    struct Areas {
+        void * area1, * area2;
+        int len1, len2;
+    };
+
+    void get_areas (int pos, int len, Areas & areas);
+
+    void * m_data;
+    int m_size, m_offset, m_len;
+};
+
+template<class T>
+class RingBuf : private RingBufBase
+{
+public:
+    constexpr RingBuf () :
+        RingBufBase () {}
+
+    ~RingBuf ()
+        { destroy (); }
+
+    RingBuf (RingBuf && b) :
+        RingBufBase (std::move (b)) {}
+    void operator= (RingBuf && b)
+        { steal (std::move (b), aud::erase_func<T> ()); }
+
+    int size () const
+        { return cooked (RingBufBase::size ()); }
+    int len () const
+        { return cooked (RingBufBase::len ()); }
+    int linear () const
+        { return cooked (RingBufBase::linear ()); }
+    int space () const
+        { return size () - len (); }
+
+    T & operator[] (int i)
+        { return * (T *) RingBufBase::at (raw (i)); }
+    const T & operator[] (int i) const
+        { return * (const T *) RingBufBase::at (raw (i)); }
+
+    void alloc (int size)
+        { RingBufBase::alloc (raw (size)); }
+    void destroy ()
+        { RingBufBase::destroy (aud::erase_func<T> ()); }
+
+    void copy_in (const T * from, int len)
+        { RingBufBase::copy_in (from, raw (len), aud::copy_func<T> ()); }
+    void move_in (T * from, int len)
+        { RingBufBase::move_in (from, raw (len), aud::fill_func<T> ()); }
+    void move_out (T * to, int len)
+        { RingBufBase::move_out (to, raw (len), aud::erase_func<T> ()); }
+    void discard (int len = -1)
+        { RingBufBase::discard (raw (len), aud::erase_func<T> ()); }
+
+    void move_in (Index<T> & index, int from, int len)
+        { RingBufBase::move_in (index.base (), raw (from), raw (len)); }
+    void move_out (Index<T> & index, int to, int len)
+        { RingBufBase::move_out (index.base (), raw (to), raw (len)); }
+
+    template<class ... Args>
+    T & push (Args && ... args)
+    {
+        add (raw (1));
+        return * aud::construct<T>::make (at (raw (len () - 1)), std::forward<Args> (args) ...);
+    }
+
+    T & head ()
+        { return * (T *) at (raw (0)); }
+
+    void pop ()
+    {
+        head ().~T ();
+        remove (raw (1));
+    }
+
+private:
+    static constexpr int raw (int len)
+        { return len * sizeof (T); }
+    static constexpr int cooked (int len)
+        { return len / sizeof (T); }
+};
+
+#endif // LIBAUDCORE_RINGBUF_H
diff --git a/src/libaudcore/runtime.cc b/src/libaudcore/runtime.cc
new file mode 100644
index 000000000000..9479426603d8
--- /dev/null
+++ b/src/libaudcore/runtime.cc
@@ -0,0 +1,358 @@
+/*
+ * runtime.c
+ * Copyright 2010-2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "runtime.h"
+
+#include <errno.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <new>
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#ifdef __APPLE__
+#include <mach-o/dyld.h>
+#endif
+
+#include <glib.h>
+#include <libintl.h>
+
+#include "audstrings.h"
+#include "drct.h"
+#include "hook.h"
+#include "internal.h"
+#include "mainloop.h"
+#include "playlist-internal.h"
+#include "plugins-internal.h"
+#include "scanner.h"
+
+#define AUTOSAVE_INTERVAL 300000 /* milliseconds, autosave every 5 minutes */
+
+#ifdef WORDS_BIGENDIAN
+#define UTF16_NATIVE "UTF-16BE"
+#else
+#define UTF16_NATIVE "UTF-16LE"
+#endif
+
+#ifdef S_IRGRP
+#define DIRMODE (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)
+#else
+#define DIRMODE (S_IRWXU)
+#endif
+
+size_t misc_bytes_allocated;
+
+static bool headless_mode;
+
+#if defined(USE_QT) && ! defined(USE_GTK)
+static MainloopType mainloop_type = MainloopType::Qt;
+#else
+static MainloopType mainloop_type = MainloopType::GLib;
+#endif
+
+static aud::array<AudPath, String> aud_paths;
+
+EXPORT void aud_set_headless_mode (bool headless)
+{
+    headless_mode = headless;
+}
+
+EXPORT bool aud_get_headless_mode ()
+{
+    return headless_mode;
+}
+
+EXPORT void aud_set_mainloop_type (MainloopType type)
+{
+    mainloop_type = type;
+}
+
+EXPORT MainloopType aud_get_mainloop_type ()
+{
+    return mainloop_type;
+}
+
+static StringBuf get_path_to_self ()
+{
+#ifdef HAVE_PROC_SELF_EXE
+
+    StringBuf buf (-1);
+    int len = readlink ("/proc/self/exe", buf, buf.len ());
+
+    if (len < 0)
+    {
+        AUDERR ("Failed to read /proc/self/exe: %s\n", strerror (errno));
+        return StringBuf ();
+    }
+
+    if (len == buf.len ())
+        throw std::bad_alloc ();
+
+    buf.resize (len);
+    return buf;
+
+#elif defined _WIN32
+
+    StringBuf buf (-1);
+    wchar_t * bufw = (wchar_t *) (char *) buf;
+    int sizew = buf.len () / sizeof (wchar_t);
+    int lenw = GetModuleFileNameW (nullptr, bufw, sizew);
+
+    if (! lenw)
+    {
+        AUDERR ("GetModuleFileName failed.\n");
+        return StringBuf ();
+    }
+
+    if (lenw == sizew)
+        throw std::bad_alloc ();
+
+    buf.resize (lenw * sizeof (wchar_t));
+    buf.steal (str_convert (buf, buf.len (), UTF16_NATIVE, "UTF-8"));
+    return buf;
+
+#elif defined __APPLE__
+
+    StringBuf buf (-1);
+    uint32_t size = buf.len ();
+
+    if (_NSGetExecutablePath (buf, & size) < 0)
+        throw std::bad_alloc ();
+
+    buf.resize (strlen (buf));
+    return buf;
+
+#else
+
+    return StringBuf ();
+
+#endif
+}
+
+static String relocate_path (const char * path, const char * from, const char * to)
+{
+    int oldlen = strlen (from);
+    int newlen = strlen (to);
+
+    if (oldlen && from[oldlen - 1] == G_DIR_SEPARATOR)
+        oldlen --;
+    if (newlen && to[newlen - 1] == G_DIR_SEPARATOR)
+        newlen --;
+
+#ifdef _WIN32
+    if (strcmp_nocase (path, from, oldlen) || (path[oldlen] && path[oldlen] != G_DIR_SEPARATOR))
+#else
+    if (strncmp (path, from, oldlen) || (path[oldlen] && path[oldlen] != G_DIR_SEPARATOR))
+#endif
+        return String (path);
+
+    return String (str_printf ("%.*s%s", newlen, to, path + oldlen));
+}
+
+static void set_default_paths ()
+{
+    aud_paths[AudPath::BinDir] = String (HARDCODE_BINDIR);
+    aud_paths[AudPath::DataDir] = String (HARDCODE_DATADIR);
+    aud_paths[AudPath::PluginDir] = String (HARDCODE_PLUGINDIR);
+    aud_paths[AudPath::LocaleDir] = String (HARDCODE_LOCALEDIR);
+    aud_paths[AudPath::DesktopFile] = String (HARDCODE_DESKTOPFILE);
+    aud_paths[AudPath::IconFile] = String (HARDCODE_ICONFILE);
+}
+
+static void relocate_all_paths ()
+{
+    StringBuf bindir = filename_normalize (str_copy (HARDCODE_BINDIR));
+    StringBuf datadir = filename_normalize (str_copy (HARDCODE_DATADIR));
+    StringBuf plugindir = filename_normalize (str_copy (HARDCODE_PLUGINDIR));
+    StringBuf localedir = filename_normalize (str_copy (HARDCODE_LOCALEDIR));
+    StringBuf desktopfile = filename_normalize (str_copy (HARDCODE_DESKTOPFILE));
+    StringBuf iconfile = filename_normalize (str_copy (HARDCODE_ICONFILE));
+
+    StringBuf from = str_copy (bindir);
+
+    /* get path to current executable */
+    StringBuf to = get_path_to_self ();
+
+    if (! to)
+    {
+        set_default_paths ();
+        return;
+    }
+
+    to.steal (filename_normalize (std::move (to)));
+
+    const char * base = last_path_element (to);
+
+    if (! base)
+    {
+        set_default_paths ();
+        return;
+    }
+
+    cut_path_element (to, base - to);
+
+    /* trim trailing path elements common to old and new paths */
+    /* at the end, the old and new installation prefixes are left */
+    const char * a, * b;
+    while ((a = last_path_element (from)) &&
+     (b = last_path_element (to)) &&
+#ifdef _WIN32
+     ! strcmp_nocase (a, b))
+#else
+     ! strcmp (a, b))
+#endif
+    {
+        cut_path_element (from, a - from);
+        cut_path_element (to, b - to);
+    }
+
+    /* replace old prefix with new one in each path */
+    aud_paths[AudPath::BinDir] = relocate_path (bindir, from, to);
+    aud_paths[AudPath::DataDir] = relocate_path (datadir, from, to);
+    aud_paths[AudPath::PluginDir] = relocate_path (plugindir, from, to);
+    aud_paths[AudPath::LocaleDir] = relocate_path (localedir, from, to);
+    aud_paths[AudPath::DesktopFile] = relocate_path (desktopfile, from, to);
+    aud_paths[AudPath::IconFile] = relocate_path (iconfile, from, to);
+}
+
+EXPORT void aud_init_paths ()
+{
+    relocate_all_paths ();
+
+    const char * xdg_config_home = g_get_user_config_dir ();
+
+    aud_paths[AudPath::UserDir] = String (filename_build ({xdg_config_home, "audacious"}));
+    aud_paths[AudPath::PlaylistDir] = String (filename_build
+     ({aud_paths[AudPath::UserDir], "playlists"}));
+
+    /* create ~/.config/audacious/playlists */
+    if (g_mkdir_with_parents (aud_paths[AudPath::PlaylistDir], DIRMODE) < 0)
+        AUDERR ("Failed to create %s: %s\n",
+         (const char *) aud_paths[AudPath::PlaylistDir], strerror (errno));
+
+#ifdef _WIN32
+    /* set some UNIX-style environment variables */
+    g_setenv ("HOME", g_get_home_dir (), true);
+    g_setenv ("XDG_CONFIG_HOME", xdg_config_home, true);
+    g_setenv ("XDG_DATA_HOME", g_get_user_data_dir (), true);
+    g_setenv ("XDG_CACHE_HOME", g_get_user_cache_dir (), true);
+#endif
+}
+
+EXPORT void aud_cleanup_paths ()
+{
+    for (String & path : aud_paths)
+        path = String ();
+}
+
+EXPORT const char * aud_get_path (AudPath id)
+{
+    return aud_paths[id];
+}
+
+EXPORT void aud_init_i18n ()
+{
+    const char * localedir = aud_get_path (AudPath::LocaleDir);
+
+    setlocale (LC_ALL, "");
+    bindtextdomain (PACKAGE, localedir);
+    bind_textdomain_codeset (PACKAGE, "UTF-8");
+    bindtextdomain (PACKAGE "-plugins", localedir);
+    bind_textdomain_codeset (PACKAGE "-plugins", "UTF-8");
+    textdomain (PACKAGE);
+}
+
+EXPORT void aud_init ()
+{
+    g_thread_pool_set_max_idle_time (100);
+
+    config_load ();
+
+    art_init ();
+    chardet_init ();
+    eq_init ();
+    playlist_init ();
+
+    start_plugins_one ();
+
+    scanner_init ();
+    playlist_enable_scan (true);
+
+    load_playlists ();
+}
+
+static void do_autosave (void *)
+{
+    hook_call ("config save", nullptr);
+    save_playlists (false);
+    config_save ();
+}
+
+EXPORT void aud_run ()
+{
+    start_plugins_two ();
+
+    static QueuedFunc autosave;
+    autosave.start (AUTOSAVE_INTERVAL, do_autosave, nullptr);
+
+    /* calls "config save" before returning */
+    interface_run ();
+
+    autosave.stop ();
+
+    stop_plugins_two ();
+}
+
+EXPORT void aud_cleanup ()
+{
+    save_playlists (true);
+
+    aud_playlist_play (-1);
+    playback_stop (true);
+
+    adder_cleanup ();
+    playlist_enable_scan (false);
+    scanner_cleanup ();
+
+    stop_plugins_one ();
+
+    art_cleanup ();
+    chardet_cleanup ();
+    eq_cleanup ();
+    playlist_end ();
+
+    event_queue_cancel_all ();
+    hook_cleanup ();
+
+    config_save ();
+    config_cleanup ();
+}
+
+EXPORT void aud_leak_check ()
+{
+    string_leak_check ();
+
+    if (misc_bytes_allocated)
+        AUDWARN ("Bytes allocated at exit: %zd\n", misc_bytes_allocated);
+}
diff --git a/src/libaudcore/runtime.h b/src/libaudcore/runtime.h
new file mode 100644
index 000000000000..c599e0435f75
--- /dev/null
+++ b/src/libaudcore/runtime.h
@@ -0,0 +1,113 @@
+/*
+ * runtime.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_RUNTIME_H
+#define LIBAUDCORE_RUNTIME_H
+
+#include <libaudcore/objects.h>
+
+enum class AudPath {
+    BinDir,
+    DataDir,
+    PluginDir,
+    LocaleDir,
+    DesktopFile,
+    IconFile,
+    UserDir,
+    PlaylistDir,
+    count
+};
+
+enum class MainloopType {
+    GLib,
+    Qt
+};
+
+enum class OutputReset {
+    EffectsOnly,
+    ReopenStream,
+    ResetPlugin
+};
+
+namespace audlog
+{
+    enum Level {
+        Debug,
+        Info,
+        Warning,
+        Error
+    };
+
+    typedef void (* Handler) (Level level, const char * file, int line,
+     const char * func, const char * message);
+
+    void set_stderr_level (Level level);
+    void subscribe (Handler handler, Level level);
+    void unsubscribe (Handler handler);
+
+    void log (Level level, const char * file, int line, const char * func,
+     const char * format, ...);
+
+    const char * get_level_name (Level level);
+}
+
+#define AUDERR(...) do { audlog::log (audlog::Error, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); } while (0)
+#define AUDWARN(...) do { audlog::log (audlog::Warning, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); } while (0)
+#define AUDINFO(...) do { audlog::log (audlog::Info, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); } while (0)
+#define AUDDBG(...) do { audlog::log (audlog::Debug, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); } while (0)
+
+void aud_init_paths ();
+void aud_cleanup_paths ();
+
+const char * aud_get_path (AudPath id);
+
+void aud_set_headless_mode (bool headless);
+bool aud_get_headless_mode ();
+
+void aud_set_mainloop_type (MainloopType type);
+MainloopType aud_get_mainloop_type ();
+
+/* Requires: aud_init_paths() */
+void aud_init_i18n ();
+
+void aud_config_set_defaults (const char * section, const char * const * entries);
+
+void aud_set_str (const char * section, const char * name, const char * value);
+String aud_get_str (const char * section, const char * name);
+void aud_set_bool (const char * section, const char * name, bool value);
+bool aud_get_bool (const char * section, const char * name);
+void aud_set_int (const char * section, const char * name, int value);
+int aud_get_int (const char * section, const char * name);
+void aud_set_double (const char * section, const char * name, double value);
+double aud_get_double (const char * section, const char * name);
+
+void aud_init ();
+void aud_resume ();
+void aud_run ();
+void aud_quit ();
+void aud_cleanup ();
+
+void aud_leak_check ();
+
+String aud_history_get (int entry);
+void aud_history_add (const char * path);
+
+void aud_output_reset (OutputReset type);
+
+#endif
diff --git a/src/libaudcore/scanner.cc b/src/libaudcore/scanner.cc
new file mode 100644
index 000000000000..54c845d48470
--- /dev/null
+++ b/src/libaudcore/scanner.cc
@@ -0,0 +1,66 @@
+/*
+ * scanner.c
+ * Copyright 2012 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "scanner.h"
+
+#include <glib.h>  /* for GThreadPool */
+
+#include "internal.h"
+#include "probe.h"
+#include "tuple.h"
+
+static GThreadPool * pool;
+
+static void scan_worker (void * data, void *)
+{
+    ScanRequest * request = (ScanRequest *) data;
+
+    if (! request->decoder)
+        request->decoder = aud_file_find_decoder (request->filename, false, & request->error);
+
+    if (request->decoder && (request->flags & SCAN_TUPLE))
+        request->tuple = aud_file_read_tuple (request->filename, request->decoder, & request->error);
+
+    if (request->decoder && (request->flags & SCAN_IMAGE))
+    {
+        request->image_data = aud_file_read_image (request->filename, request->decoder);
+
+        if (! request->image_data.len ())
+            request->image_file = art_search (request->filename);
+    }
+
+    request->callback (request);
+
+    delete request;
+}
+
+void scanner_init ()
+{
+    pool = g_thread_pool_new (scan_worker, nullptr, SCAN_THREADS, false, nullptr);
+}
+
+void scanner_request (ScanRequest * request)
+{
+    g_thread_pool_push (pool, request, nullptr);
+}
+
+void scanner_cleanup ()
+{
+    g_thread_pool_free (pool, false, true);
+}
diff --git a/src/libaudcore/scanner.h b/src/libaudcore/scanner.h
new file mode 100644
index 000000000000..8b2ff6c0189a
--- /dev/null
+++ b/src/libaudcore/scanner.h
@@ -0,0 +1,58 @@
+/*
+ * scanner.h
+ * Copyright 2012 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_SCANNER_H
+#define LIBAUDCORE_SCANNER_H
+
+#include "index.h"
+#include "tuple.h"
+
+#define SCAN_TUPLE (1 << 0)
+#define SCAN_IMAGE (1 << 1)
+
+#define SCAN_THREADS 2
+
+struct ScanRequest
+{
+    typedef void (* Callback) (ScanRequest * request);
+
+    ScanRequest (const char * filename, int flags, Callback callback,
+     PluginHandle * decoder = nullptr) :
+        filename (filename),
+        flags (flags),
+        callback (callback),
+        decoder (decoder) {}
+
+    const String filename;
+    const int flags;
+    const Callback callback;
+
+    PluginHandle * decoder;
+
+    Tuple tuple;
+    Index<char> image_data;
+    String image_file;
+    String error;
+};
+
+void scanner_init ();
+void scanner_request (ScanRequest * request);
+void scanner_cleanup ();
+
+#endif
diff --git a/src/libaudcore/stringbuf.cc b/src/libaudcore/stringbuf.cc
new file mode 100644
index 000000000000..95cc068fb960
--- /dev/null
+++ b/src/libaudcore/stringbuf.cc
@@ -0,0 +1,223 @@
+/*
+ * stringbuf.cc
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <pthread.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <new>
+
+#include "objects.h"
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <sys/mman.h>
+#ifndef MAP_ANONYMOUS
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+#endif
+
+struct StringStack
+{
+    static constexpr int Size = 1048576;  // 1 MB
+
+    char * top;
+    char buf[Size - sizeof top];
+};
+
+// adds one byte for null character and rounds up to word boundary
+static constexpr int align (int len)
+{
+    return (len + sizeof (void *)) & ~(sizeof (void *) - 1);
+}
+
+static pthread_key_t key;
+static pthread_once_t once = PTHREAD_ONCE_INIT;
+
+#ifdef _WIN32
+static HANDLE mapping;
+#endif
+
+static void free_stack (void * stack)
+{
+    if (stack)
+#ifdef _WIN32
+        UnmapViewOfFile (stack);
+#else
+        munmap (stack, sizeof (StringStack));
+#endif
+}
+
+static void make_key ()
+{
+    pthread_key_create (& key, free_stack);
+
+#ifdef _WIN32
+    mapping = CreateFileMappingW (INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE,
+     0, sizeof (StringStack), nullptr);
+
+    if (! mapping)
+        throw std::bad_alloc ();
+#endif
+}
+
+static StringStack * get_stack ()
+{
+    pthread_once (& once, make_key);
+
+    StringStack * stack = (StringStack *) pthread_getspecific (key);
+
+    if (! stack)
+    {
+#ifdef _WIN32
+        stack = (StringStack *) MapViewOfFile (mapping, FILE_MAP_COPY, 0, 0, sizeof (StringStack));
+
+        if (! stack)
+            throw std::bad_alloc ();
+#else
+        stack = (StringStack *) mmap (nullptr, sizeof (StringStack),
+         PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+
+        if (stack == MAP_FAILED)
+            throw std::bad_alloc ();
+#endif
+
+        stack->top = stack->buf;
+        pthread_setspecific (key, stack);
+    }
+
+    return stack;
+}
+
+EXPORT void StringBuf::resize (int len)
+{
+    if (! stack)
+    {
+        stack = get_stack ();
+        m_data = stack->top;
+    }
+    else
+    {
+        if (m_data + align (m_len) != stack->top)
+            throw std::bad_alloc ();
+    }
+
+    if (len < 0)
+    {
+        stack->top = stack->buf + sizeof stack->buf;
+        m_len = stack->top - m_data - 1;
+
+        if (m_len < 0)
+            throw std::bad_alloc ();
+    }
+    else
+    {
+        stack->top = m_data + align (len);
+
+        if (stack->top - stack->buf > (int) sizeof stack->buf)
+            throw std::bad_alloc ();
+
+        m_data[len] = 0;
+        m_len = len;
+    }
+}
+
+EXPORT StringBuf::~StringBuf ()
+{
+    if (m_data)
+    {
+        if (m_data + align (m_len) != stack->top)
+            throw std::bad_alloc ();
+
+        stack->top = m_data;
+    }
+}
+
+EXPORT void StringBuf::steal (StringBuf && other)
+{
+    if (other.m_data)
+    {
+        if (m_data)
+        {
+            if (m_data + align (m_len) != other.m_data ||
+             other.m_data + align (other.m_len) != stack->top)
+                throw std::bad_alloc ();
+
+            m_len = other.m_len;
+            memmove (m_data, other.m_data, m_len + 1);
+            stack->top = m_data + align (m_len);
+        }
+        else
+        {
+            stack = other.stack;
+            m_data = other.m_data;
+            m_len = other.m_len;
+        }
+
+        other.stack = nullptr;
+        other.m_data = nullptr;
+        other.m_len = 0;
+    }
+    else
+    {
+        if (m_data)
+        {
+            this->~StringBuf ();
+            stack = nullptr;
+            m_data = nullptr;
+            m_len = 0;
+        }
+    }
+}
+
+EXPORT void StringBuf::combine (StringBuf && other)
+{
+    if (m_data + align (m_len) != other.m_data || other.m_data + align (other.m_len) != stack->top)
+        throw std::bad_alloc ();
+
+    memmove (m_data + m_len, other.m_data, other.m_len + 1);
+    m_len += other.m_len;
+    stack->top = m_data + align (m_len);
+
+    other.stack = nullptr;
+    other.m_data = nullptr;
+    other.m_len = 0;
+}
+
+EXPORT void StringBuf::insert (int pos, const char * s, int len)
+{
+    int len0 = m_len;
+
+    if (pos < 0)
+        pos = len0;
+    if (len < 0)
+        len = strlen (s);
+
+    resize (len0 + len);
+    memmove (m_data + pos + len, m_data + pos, len0 - pos);
+    memcpy (m_data + pos, s, len);
+}
+
+EXPORT void StringBuf::remove (int pos, int len)
+{
+    int after = m_len - pos - len;
+    memmove (m_data + pos, m_data + pos + len, after);
+    resize (pos + after);
+}
diff --git a/src/libaudcore/strpool.c b/src/libaudcore/strpool.c
deleted file mode 100644
index 4dceeb005363..000000000000
--- a/src/libaudcore/strpool.c
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * strpool.c
- * Copyright 2011-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include "audstrings.h"
-#include "multihash.h"
-
-#ifdef VALGRIND_FRIENDLY
-
-typedef struct {
-    unsigned hash;
-    char magic;
-    char str[];
-} StrNode;
-
-#define NODE_SIZE_FOR(s) (offsetof (StrNode, str) + strlen (s) + 1)
-#define NODE_OF(s) ((StrNode *) ((s) - offsetof (StrNode, str)))
-
-EXPORT char * str_get (const char * str)
-{
-    if (! str)
-        return NULL;
-
-    StrNode * node = g_malloc (NODE_SIZE_FOR (str));
-    node->magic = '@';
-    node->hash = g_str_hash (str);
-
-    strcpy (node->str, str);
-    return node->str;
-}
-
-EXPORT char * str_ref (const char * str)
-{
-    if (! str)
-        return NULL;
-
-    StrNode * node = NODE_OF (str);
-    assert (node->magic == '@');
-    assert (g_str_hash (str) == node->hash);
-
-    return str_get (str);
-}
-
-EXPORT void str_unref (char * str)
-{
-    if (! str)
-        return;
-
-    StrNode * node = NODE_OF (str);
-    assert (node->magic == '@');
-    assert (g_str_hash (str) == node->hash);
-
-    node->magic = 0;
-    g_free (node);
-}
-
-EXPORT unsigned str_hash (const char * str)
-{
-    if (! str)
-        return 0;
-
-    StrNode * node = NODE_OF (str);
-    assert (node->magic == '@');
-
-    return g_str_hash (str);
-}
-
-EXPORT bool_t str_equal (const char * str1, const char * str2)
-{
-    assert (! str1 || NODE_OF (str1)->magic == '@');
-    assert (! str2 || NODE_OF (str2)->magic == '@');
-
-    return ! g_strcmp0 (str1, str2);
-}
-
-EXPORT void strpool_shutdown (void)
-{
-}
-
-#else /* ! VALGRIND_FRIENDLY */
-
-typedef struct {
-    MultihashNode node;
-    unsigned hash, refs;
-    char magic;
-    char str[];
-} StrNode;
-
-#define NODE_SIZE_FOR(s) (offsetof (StrNode, str) + strlen (s) + 1)
-#define NODE_OF(s) ((StrNode *) ((s) - offsetof (StrNode, str)))
-
-static unsigned hash_cb (const MultihashNode * node)
-{
-    return ((const StrNode *) node)->hash;
-}
-
-static bool_t match_cb (const MultihashNode * node_, const void * data, unsigned hash)
-{
-    const StrNode * node = (const StrNode *) node_;
-    return data == node->str || (hash == node->hash && ! strcmp (data, node->str));
-}
-
-static MultihashTable strpool_table = {
-    .hash_func = hash_cb,
-    .match_func = match_cb
-};
-
-static MultihashNode * add_cb (const void * data, unsigned hash, void * state)
-{
-    StrNode * node = g_malloc (NODE_SIZE_FOR (data));
-    node->hash = hash;
-    node->refs = 1;
-    node->magic = '@';
-    strcpy (node->str, data);
-
-    * ((char * *) state) = node->str;
-    return (MultihashNode *) node;
-}
-
-static bool_t ref_cb (MultihashNode * node_, void * state)
-{
-    StrNode * node = (StrNode *) node_;
-
-    __sync_fetch_and_add (& node->refs, 1);
-
-    * ((char * *) state) = node->str;
-    return FALSE;
-}
-
-EXPORT char * str_get (const char * str)
-{
-    if (! str)
-        return NULL;
-
-    char * ret = NULL;
-    multihash_lookup (& strpool_table, str, g_str_hash (str), add_cb, ref_cb, & ret);
-    return ret;
-}
-
-EXPORT char * str_ref (const char * str)
-{
-    if (! str)
-        return NULL;
-
-    StrNode * node = NODE_OF (str);
-    assert (node->magic == '@');
-
-    __sync_fetch_and_add (& node->refs, 1);
-
-    return (char *) str;
-}
-
-static bool_t remove_cb (MultihashNode * node_, void * state)
-{
-    StrNode * node = (StrNode *) node_;
-
-    if (! __sync_bool_compare_and_swap (& node->refs, 1, 0))
-        return FALSE;
-
-    node->magic = 0;
-    g_free (node);
-    return TRUE;
-}
-
-EXPORT void str_unref (char * str)
-{
-    if (! str)
-        return;
-
-    StrNode * node = NODE_OF (str);
-    assert (node->magic == '@');
-
-    while (1)
-    {
-        int refs = __sync_fetch_and_add (& node->refs, 0);
-
-        if (refs > 1)
-        {
-            if (__sync_bool_compare_and_swap (& node->refs, refs, refs - 1))
-                break;
-        }
-        else
-        {
-            int status = multihash_lookup (& strpool_table, node->str,
-             node->hash, NULL, remove_cb, NULL);
-
-            assert (status & MULTIHASH_FOUND);
-            if (status & MULTIHASH_REMOVED)
-                break;
-        }
-    }
-}
-
-static bool_t leak_cb (MultihashNode * node, void * state)
-{
-    fprintf (stderr, "String leaked: %s\n", ((StrNode *) node)->str);
-    return FALSE;
-}
-
-EXPORT void strpool_shutdown (void)
-{
-    multihash_iterate (& strpool_table, leak_cb, NULL);
-}
-
-EXPORT unsigned str_hash (const char * str)
-{
-    if (! str)
-        return 0;
-
-    StrNode * node = NODE_OF (str);
-    assert (node->magic == '@');
-
-    return node->hash;
-}
-
-
-EXPORT bool_t str_equal (const char * str1, const char * str2)
-{
-    assert (! str1 || NODE_OF (str1)->magic == '@');
-    assert (! str2 || NODE_OF (str2)->magic == '@');
-
-    return str1 == str2;
-}
-
-#endif /* ! VALGRIND_FRIENDLY */
-
-EXPORT char * str_nget (const char * str, int len)
-{
-    if (memchr (str, 0, len))
-        return str_get (str);
-
-    SNCOPY (buf, str, len);
-    return str_get (buf);
-}
diff --git a/src/libaudcore/strpool.cc b/src/libaudcore/strpool.cc
new file mode 100644
index 000000000000..8f3679de46b9
--- /dev/null
+++ b/src/libaudcore/strpool.cc
@@ -0,0 +1,266 @@
+/*
+ * strpool.c
+ * Copyright 2011-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <assert.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "audstrings.h"
+#include "internal.h"
+#include "multihash.h"
+#include "objects.h"
+#include "runtime.h"
+
+#ifdef VALGRIND_FRIENDLY
+
+struct StrNode {
+    unsigned hash;
+    char magic;
+    char str[];
+};
+
+#define NODE_SIZE_FOR(s) (offsetof (StrNode, str) + strlen (s) + 1)
+#define NODE_OF(s) ((StrNode *) ((s) - offsetof (StrNode, str)))
+
+EXPORT char * String::raw_get (const char * str)
+{
+    if (! str)
+        return nullptr;
+
+    StrNode * node = (StrNode *) malloc (NODE_SIZE_FOR (str));
+    if (! node)
+        throw std::bad_alloc ();
+
+    node->magic = '@';
+    node->hash = str_calc_hash (str);
+
+    strcpy (node->str, str);
+    return node->str;
+}
+
+EXPORT char * String::raw_ref (const char * str)
+{
+    if (! str)
+        return nullptr;
+
+    StrNode * node = NODE_OF (str);
+    assert (node->magic == '@');
+    assert (str_calc_hash (str) == node->hash);
+
+    return raw_get (str);
+}
+
+EXPORT void String::raw_unref (char * str)
+{
+    if (! str)
+        return;
+
+    StrNode * node = NODE_OF (str);
+    assert (node->magic == '@');
+    assert (str_calc_hash (str) == node->hash);
+
+    node->magic = 0;
+    free (node);
+}
+
+EXPORT unsigned String::raw_hash (const char * str)
+{
+    if (! str)
+        return 0;
+
+    StrNode * node = NODE_OF (str);
+    assert (node->magic == '@');
+
+    return str_calc_hash (str);
+}
+
+EXPORT bool String::raw_equal (const char * str1, const char * str2)
+{
+    assert (! str1 || NODE_OF (str1)->magic == '@');
+    assert (! str2 || NODE_OF (str2)->magic == '@');
+
+    return ! strcmp_safe (str1, str2);
+}
+
+EXPORT void string_leak_check ()
+{
+}
+
+#else /* ! VALGRIND_FRIENDLY */
+
+struct StrNode {
+    MultiHash::Node base;
+    unsigned refs;
+    char magic;
+    char str[1];  // variable size
+};
+
+#define NODE_SIZE_FOR(s) (offsetof (StrNode, str) + strlen (s) + 1)
+#define NODE_OF(s) ((StrNode *) ((s) - offsetof (StrNode, str)))
+
+static bool match_cb (const MultiHash::Node * node_, const void * data_)
+{
+    const StrNode * node = (const StrNode *) node_;
+    const char * data = (const char *) data_;
+
+    return data == node->str || ! strcmp (data, node->str);
+}
+
+static MultiHash strpool_table (match_cb);
+
+static MultiHash::Node * add_cb (const void * data_, void * state)
+{
+    const char * data = (const char *) data_;
+
+    StrNode * node = (StrNode *) malloc (NODE_SIZE_FOR (data));
+    if (! node)
+        throw std::bad_alloc ();
+
+    node->refs = 1;
+    node->magic = '@';
+    strcpy (node->str, data);
+
+    * ((char * *) state) = node->str;
+    return (MultiHash::Node *) node;
+}
+
+static bool ref_cb (MultiHash::Node * node_, void * state)
+{
+    StrNode * node = (StrNode *) node_;
+
+    __sync_fetch_and_add (& node->refs, 1);
+
+    * ((char * *) state) = node->str;
+    return false;
+}
+
+/* If the pool contains a copy of <str>, increments its reference count.
+ * Otherwise, adds a copy of <str> to the pool with a reference count of one.
+ * In either case, returns the copy.  Because this copy may be shared by other
+ * parts of the code, it should not be modified.  If <str> is null, simply
+ * returns null with no side effects. */
+EXPORT char * String::raw_get (const char * str)
+{
+    if (! str)
+        return nullptr;
+
+    char * ret = nullptr;
+    strpool_table.lookup (str, str_calc_hash (str), add_cb, ref_cb, & ret);
+    return ret;
+}
+
+/* Increments the reference count of <str>, where <str> is the address of a
+ * string already in the pool.  Faster than calling raw_get() a second time.
+ * Returns <str> for convenience.  If <str> is null, simply returns null with no
+ * side effects. */
+EXPORT char * String::raw_ref (const char * str)
+{
+    if (! str)
+        return nullptr;
+
+    StrNode * node = NODE_OF (str);
+    assert (node->magic == '@');
+
+    __sync_fetch_and_add (& node->refs, 1);
+
+    return (char *) str;
+}
+
+static bool remove_cb (MultiHash::Node * node_, void * state)
+{
+    StrNode * node = (StrNode *) node_;
+
+    if (! __sync_bool_compare_and_swap (& node->refs, 1, 0))
+        return false;
+
+    node->magic = 0;
+    free (node);
+    return true;
+}
+
+/* Decrements the reference count of <str>, where <str> is the address of a
+ * string in the pool.  If the reference count drops to zero, releases the
+ * memory used by <str>.   If <str> is null, simply returns null with no side
+ * effects. */
+EXPORT void String::raw_unref (char * str)
+{
+    if (! str)
+        return;
+
+    StrNode * node = NODE_OF (str);
+    assert (node->magic == '@');
+
+    while (1)
+    {
+        int refs = __sync_fetch_and_add (& node->refs, 0);
+
+        if (refs > 1)
+        {
+            if (__sync_bool_compare_and_swap (& node->refs, refs, refs - 1))
+                break;
+        }
+        else
+        {
+            int status = strpool_table.lookup (node->str, node->base.hash, nullptr,
+             remove_cb, nullptr);
+
+            assert (status & MultiHash::Found);
+            if (status & MultiHash::Removed)
+                break;
+        }
+    }
+}
+
+static bool leak_cb (MultiHash::Node * node, void * state)
+{
+    AUDWARN ("String leaked: %s\n", ((StrNode *) node)->str);
+    return false;
+}
+
+void string_leak_check ()
+{
+    strpool_table.iterate (leak_cb, nullptr);
+}
+
+/* Returns the cached hash value of a pooled string (or 0 for null). */
+EXPORT unsigned String::raw_hash (const char * str)
+{
+    if (! str)
+        return 0;
+
+    StrNode * node = NODE_OF (str);
+    assert (node->magic == '@');
+
+    return node->base.hash;
+}
+
+
+/* Checks whether two pooled strings are equal.  Since the pool never contains
+ * duplicate strings, this is a simple pointer comparison and thus much faster
+ * than strcmp().  null is considered equal to null but not equal to any string. */
+EXPORT bool String::raw_equal (const char * str1, const char * str2)
+{
+    assert (! str1 || NODE_OF (str1)->magic == '@');
+    assert (! str2 || NODE_OF (str2)->magic == '@');
+
+    return str1 == str2;
+}
+
+#endif /* ! VALGRIND_FRIENDLY */
diff --git a/src/libaudcore/templates.h b/src/libaudcore/templates.h
new file mode 100644
index 000000000000..1a7825176573
--- /dev/null
+++ b/src/libaudcore/templates.h
@@ -0,0 +1,279 @@
+/*
+ * templates.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_TEMPLATES_H
+#define LIBAUDCORE_TEMPLATES_H
+
+#include <new>
+#include <type_traits>
+#include <utility>
+
+#ifdef _WIN32
+#undef min
+#undef max
+#endif
+
+namespace aud {
+
+// Utility functions
+// =================
+
+// minimum of two numbers
+template<class T>
+constexpr T min (T a, T b)
+    { return a < b ? a : b; }
+
+// maximum of two numbers
+template<class T>
+constexpr T max (T a, T b)
+    { return a > b ? a : b; }
+
+// make sure a number is within the given range
+template<class T>
+constexpr T clamp (T x, T low, T high)
+    { return min (max (x, low), high); }
+
+// absolute value
+template<class T>
+constexpr T abs (T x)
+    { return x < 0 ? -x : x; }
+
+// change the sign of x to the sign of s
+template<class T>
+constexpr T chsign (T x, T s)
+    { return (x < 0) ^ (s < 0) ? -x : x; }
+
+// integer division with rounding
+template<class T>
+constexpr T rdiv (T x, T y)
+    { return (x + chsign (y / 2, x)) / y; }
+
+// convert integer from one scale to another, with rounding
+template<class T>
+constexpr T rescale (T x, T old_scale, T new_scale)
+    { return rdiv (x * new_scale, old_scale); }
+
+// number of characters needed to represent an integer (including minus sign)
+template<class T>
+constexpr T n_digits (T x)
+    { return x < 0 ? 1 + n_digits (-x) : x < 10 ? 1 : 1 + n_digits (x / 10); }
+
+// number of elements in an array
+template<class T, int N>
+constexpr int n_elems (const T (&) [N])
+    { return N; }
+
+// Casts for storing various data in a void pointer
+// ================================================
+
+template<class T>
+inline void * to_ptr (T t)
+{
+    union { void * v; T t; } u = {nullptr};
+    static_assert (sizeof u == sizeof (void *), "Type cannot be stored in a pointer");
+    u.t = t; return u.v;
+}
+
+template<class T>
+inline T from_ptr (void * v)
+{
+    union { void * v; T t; } u = {v};
+    static_assert (sizeof u == sizeof (void *), "Type cannot be stored in a pointer");
+    return u.t;
+}
+
+// Wrapper class allowing enumerations to be used as array indexes;
+// the enumeration must begin with zero and have a "count" constant
+// ================================================================
+
+template<class T, class V>
+struct array
+{
+    // cannot use std::forward here; it is not constexpr until C++14
+    template<class ... Args>
+    constexpr array (Args && ... args) :
+        vals { static_cast<Args &&> (args) ...} {}
+
+    constexpr const V & operator[] (T t) const
+        { return vals[(int) t]; }
+    constexpr const V * begin () const
+        { return vals; }
+    constexpr const V * end () const
+        { return vals + (int) T::count; }
+    V & operator[] (T t)
+        { return vals[(int) t]; }
+    V * begin ()
+        { return vals; }
+    V * end ()
+        { return vals + (int) T::count; }
+
+private:
+    V vals[(int) T::count];
+};
+
+// Wrapper class allowing enumerations to be used in range-based for loops
+// =======================================================================
+
+template<class T, T first = (T) 0, T last = (T) ((int) T::count - 1)>
+struct range
+{
+    struct iter {
+        T v;
+        constexpr T operator* () const
+            { return v; }
+        constexpr bool operator!= (iter other) const
+            { return v != other.v; }
+        void operator++ ()
+            { v = (T) ((int) v + 1); }
+    };
+
+    static constexpr iter begin ()
+        { return {first}; }
+    static constexpr iter end ()
+        { return {(T) ((int) last + 1)}; }
+};
+
+// Replacement for std::allocator::construct, which also supports aggregate
+// initialization.  For background, see:
+//     http://cplusplus.github.io/LWG/lwg-active.html#2089
+// ========================================================================
+
+// class constructor proxy
+template<class T, bool aggregate>
+struct construct_base {
+    template<class ... Args>
+    static T * make (void * loc, Args && ... args)
+        { return new (loc) T (std::forward<Args> (args) ...); }
+};
+
+// aggregate constructor proxy
+template<class T>
+struct construct_base<T, true> {
+    template<class ... Args>
+    static T * make (void * loc, Args && ... args)
+        { return new (loc) T {std::forward<Args> (args) ...}; }
+};
+
+// generic constructor proxy
+template<class T>
+struct construct {
+    template<class ... Args>
+    static T * make (void * loc, Args && ... args)
+    {
+        constexpr bool aggregate = ! std::is_constructible<T, Args && ...>::value;
+        return construct_base<T, aggregate>::make (loc, std::forward<Args> (args) ...);
+    }
+};
+
+// Convert an integer constant to a string at compile-time; can be used for
+// #defines, enums, constexpr calculations, etc.
+// ========================================================================
+
+// "metaprogramming" string type: each different string is a unique type
+template<char... args>
+struct metastring {
+    char data[sizeof... (args) + 1] = {args..., '\0'};
+};
+
+// recursive number-printing template, general case (three or more digits)
+template<int size, int x, char... args>
+struct numeric_builder {
+    typedef typename numeric_builder<size - 1, x / 10, '0' + abs (x) % 10, args...>::type type;
+};
+
+// special case for two digits; minus sign is handled here
+template<int x, char... args>
+struct numeric_builder<2, x, args...> {
+    typedef metastring<x < 0 ? '-' : '0' + x / 10, '0' + abs (x) % 10, args...> type;
+};
+
+// special case for one digit (positive numbers only)
+template<int x, char... args>
+struct numeric_builder<1, x, args...> {
+    typedef metastring<'0' + x, args...> type;
+};
+
+// convenience wrapper for numeric_builder
+template<int x>
+class numeric_string
+{
+private:
+    // generate a unique string type representing this number
+    typedef typename numeric_builder<n_digits (x), x>::type type;
+
+    // declare a static string of that type (instantiated later at file scope)
+    static constexpr type value {};
+
+public:
+    // pointer to the instantiated string
+    static constexpr const char * str = value.data;
+};
+
+// instantiate numeric_string::value as needed for different numbers
+template<int x>
+constexpr typename numeric_string<x>::type numeric_string<x>::value;
+
+// Functions for creating/copying/destroying objects en masse;
+// these will be nullptr for basic types (use memset/memcpy instead)
+// =================================================================
+
+typedef void (* FillFunc) (void * data, int len);
+typedef void (* CopyFunc) (const void * from, void * to, int len);
+typedef void (* EraseFunc) (void * data, int len);
+
+template<class T>
+static constexpr FillFunc fill_func ()
+{
+    return std::is_trivial<T>::value ? (FillFunc) nullptr :
+     [] (void * data, int len) {
+        T * iter = (T *) data;
+        T * end = (T *) ((char *) data + len);
+        while (iter < end)
+            new (iter ++) T ();
+    };
+}
+
+template<class T>
+static constexpr CopyFunc copy_func ()
+{
+    return std::is_trivial<T>::value ? (CopyFunc) nullptr :
+     [] (const void * from, void * to, int len) {
+        const T * src = (const T *) from;
+        T * dest = (T *) to;
+        T * end = (T *) ((char *) to + len);
+        while (dest < end)
+            new (dest ++) T (* src ++);
+    };
+}
+
+template<class T>
+static constexpr EraseFunc erase_func ()
+{
+    return std::is_trivial<T>::value ? (EraseFunc) nullptr :
+     [] (void * data, int len) {
+        T * iter = (T *) data;
+        T * end = (T *) ((char *) data + len);
+        while (iter < end)
+            (* iter ++).~T ();
+    };
+}
+
+} // namespace aud
+
+#endif // LIBAUDCORE_TEMPLATES_H
diff --git a/src/libaudcore/tests/Makefile b/src/libaudcore/tests/Makefile
new file mode 100644
index 000000000000..cb56cb1c18c8
--- /dev/null
+++ b/src/libaudcore/tests/Makefile
@@ -0,0 +1,40 @@
+all: test test-mainloop
+
+SRCS = ../audstrings.cc \
+       ../charset.cc \
+       ../hook.cc \
+       ../index.cc \
+       ../logger.cc \
+       ../multihash.cc \
+       ../ringbuf.cc \
+       ../stringbuf.cc \
+       ../strpool.cc \
+       ../tinylock.cc \
+       ../tuple.cc \
+       ../tuple-compiler.cc \
+       test.cc
+
+FLAGS = -I.. -I../.. -DEXPORT= -DPACKAGE=\"audacious\" -DICONV_CONST= \
+        $(shell pkg-config --cflags --libs glib-2.0) \
+        -std=c++11 -Wall -g -O0 -fno-elide-constructors \
+        -fprofile-arcs -ftest-coverage -pthread
+
+MAINLOOP_SRCS = ../mainloop.cc test-mainloop.cc
+
+test: ${SRCS}
+	g++ ${SRCS} ${FLAGS} -o test
+
+test-mainloop: ${MAINLOOP_SRCS}
+	g++ ${MAINLOOP_SRCS} ${FLAGS} -DUSE_QT -fPIC \
+	$(shell pkg-config --cflags --libs Qt5Core) \
+	-o test-mainloop
+
+cov: all
+	rm -f *.gcda
+	./test
+	./test-mainloop
+	./test-mainloop --qt
+	gcov --object-directory . ${SRCS} ${MAINLOOP_SRCS}
+
+clean:
+	rm -f test test-mainloop test-mainloop *.gcno *.gcda *.gcov
diff --git a/src/libaudcore/tests/test-mainloop.cc b/src/libaudcore/tests/test-mainloop.cc
new file mode 100644
index 000000000000..577fbad8a2d5
--- /dev/null
+++ b/src/libaudcore/tests/test-mainloop.cc
@@ -0,0 +1,118 @@
+/*
+ * test-mainloop.cc - Main loop test for libaudcore
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "mainloop.h"
+#include "runtime.h"
+
+#include <assert.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <string.h>
+
+static bool use_qt = false;
+
+MainloopType aud_get_mainloop_type ()
+{
+    return use_qt ? MainloopType::Qt : MainloopType::GLib;
+}
+
+static QueuedFunc counters[70];
+static QueuedFunc fast, slow;
+
+static int count;
+static pthread_t main_thread;
+
+static void count_up (void * data)
+{
+    assert (pthread_self () == main_thread);
+    assert (count == (int) (size_t) data);
+
+    if (! (count % 10))
+        printf ("UP: ");
+
+    count ++;
+
+    printf ("%d%c", count, (count % 10) ? ' ' : '\n');
+}
+
+static void count_down (void * data)
+{
+    assert (pthread_self () == main_thread);
+    assert (data == & count);
+
+    count -= 10;
+
+    printf ("DOWN: %d\n", count);
+
+    if (! count)
+    {
+        fast.stop ();
+        slow.stop ();
+        mainloop_quit ();
+    }
+}
+
+static void check_count (void * data)
+{
+    assert (pthread_self () == main_thread);
+    assert (count == (int) (size_t) data);
+
+    printf ("CHECK: %d\n", count);
+}
+
+static void * worker (void * data)
+{
+    for (int i = 50; i < 70; i ++)
+        counters[i].queue (count_up, (void *) (size_t) (i - 10));
+
+    slow.start (350, check_count, (void *) (size_t) 30);
+
+    return nullptr;
+}
+
+int main (int argc, const char * * argv)
+{
+    if (argc >= 2 && ! strcmp (argv[1], "--qt"))
+        use_qt = true;
+
+    main_thread = pthread_self ();
+
+    for (int j = 0; j < 2; j ++)
+    {
+        for (int i = 0; i < 50; i ++)
+            counters[i].queue (count_up, (void *) (size_t) (i - 30));
+
+        for (int i = 10; i < 30; i ++)
+            counters[i].stop ();
+
+        for (int i = 0; i < 20; i ++)
+            counters[i].queue (count_up, (void *) (size_t) (20 + i));
+
+        fast.start (100, count_down, & count);
+
+        pthread_t thread;
+        pthread_create (& thread, nullptr, worker, nullptr);
+
+        mainloop_run ();
+
+        pthread_join (thread, nullptr);
+    }
+
+    return 0;
+}
diff --git a/src/libaudcore/tests/test.cc b/src/libaudcore/tests/test.cc
new file mode 100644
index 000000000000..a56d18ae4ab9
--- /dev/null
+++ b/src/libaudcore/tests/test.cc
@@ -0,0 +1,276 @@
+/*
+ * test.cc - Various tests for libaudcore
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "audstrings.h"
+#include "internal.h"
+#include "ringbuf.h"
+#include "tuple.h"
+#include "tuple-compiler.h"
+#include "vfs.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* stubs */
+bool aud_get_bool (const char *, const char *)
+    { return false; }
+String aud_get_str (const char *, const char *)
+    { return String (""); }
+String VFSFile::get_metadata (const char *)
+    { return String (); }
+const char * get_home_utf8 ()
+    { return "/home/user"; }
+
+size_t misc_bytes_allocated;
+
+static void test_tuple_format (const char * format, Tuple & tuple, const char * expected)
+{
+    TupleCompiler compiler;
+    compiler.compile (format);
+    compiler.format (tuple);
+
+    String result = tuple.get_str (Tuple::FormattedTitle);
+    if (strcmp (result, expected))
+    {
+        printf ("For format [%s]\n", format);
+        printf ("Expected [%s]\n", expected);
+        printf ("Got [%s]\n", (const char *) result);
+        exit (1);
+    }
+}
+
+static void test_tuple_formats ()
+{
+    Tuple tuple;
+
+    /* fallback tests */
+    test_tuple_format ("", tuple, "");
+    tuple.set_filename ("http://Path%20To/File%20Name");
+    test_tuple_format ("", tuple, "File Name");
+    tuple.set_str (Tuple::Title, "Song Title");
+    test_tuple_format ("", tuple, "Song Title");
+
+    /* basic variable tests */
+    test_tuple_format ("$", tuple, "Song Title");
+    test_tuple_format ("${", tuple, "Song Title");
+    test_tuple_format ("${file-name", tuple, "Song Title");
+    test_tuple_format ("${file-name}", tuple, "File Name");
+    test_tuple_format ("${file-name}}", tuple, "Song Title");
+    test_tuple_format ("${invalid}", tuple, "Song Title");
+    test_tuple_format ("${}", tuple, "Song Title");
+    test_tuple_format ("\\$\\{\\}", tuple, "${}");
+    test_tuple_format ("\\\0" "a", tuple, "Song Title");
+    test_tuple_format ("{}", tuple, "Song Title");
+
+    /* integer variable tests */
+    test_tuple_format ("${year}", tuple, "Song Title");
+    tuple.set_int (Tuple::Year, -1);
+    test_tuple_format ("${year}", tuple, "-1");
+    tuple.set_int (Tuple::Year, 0);
+    test_tuple_format ("${year}", tuple, "0");
+    tuple.set_int (Tuple::Year, 1990);
+    test_tuple_format ("${year}", tuple, "1990");
+
+    /* filename variable tests */
+    test_tuple_format ("${file-path}", tuple, "http://Path To/");
+    test_tuple_format ("${file-ext}", tuple, "Song Title");
+    tuple.set_filename ("http://Path%20To/File%20Name.Ext?3");
+    test_tuple_format ("${file-name}", tuple, "File Name");
+    test_tuple_format ("${file-ext}", tuple, "Ext");
+    test_tuple_format ("${subsong-id}", tuple, "3");
+
+    /* existence tests */
+    test_tuple_format ("x${?invalid:Field Exists}", tuple, "Song Title");
+    test_tuple_format ("x${?subsong-id:Field Exists", tuple, "Song Title");
+    test_tuple_format ("x${?subsong-id:Field Exists}", tuple, "xField Exists");
+    test_tuple_format ("x${?subsong-id:${invalid}}", tuple, "Song Title");
+    test_tuple_format ("x${?subsong-id:(${subsong-id})}", tuple, "x(3)");
+    test_tuple_format ("x${?track-number:Field Exists}", tuple, "x");
+    test_tuple_format ("x${?title:Field Exists}", tuple, "xField Exists");
+    test_tuple_format ("x${?artist:Field Exists}", tuple, "x");
+    test_tuple_format ("x${?artist}", tuple, "Song Title");
+
+    /* equality tests */
+    test_tuple_format ("x${=}", tuple, "Song Title");
+    test_tuple_format ("x${==}", tuple, "Song Title");
+    test_tuple_format ("x${==a,}", tuple, "Song Title");
+    test_tuple_format ("x${==a,a:}", tuple, "Song Title");
+    test_tuple_format ("x${==\"a\",a:}", tuple, "Song Title");
+    test_tuple_format ("x${==\"a\",\"a:Equal}", tuple, "Song Title");
+    test_tuple_format ("x${==\"a\",\"a\":Equal}", tuple, "xEqual");
+    test_tuple_format ("x${==\"a\",\"a\"\":Equal}", tuple, "Song Title");
+    test_tuple_format ("x${==\"a\",\"b\":Equal}", tuple, "x");
+    test_tuple_format ("x${==year,\"a\":Equal}", tuple, "x");
+    test_tuple_format ("x${==\"a\",year:Equal}", tuple, "x");
+    test_tuple_format ("x${==year,1990:Equal}", tuple, "xEqual");
+    test_tuple_format ("x${==1990,year:Equal}", tuple, "xEqual");
+    test_tuple_format ("x${==title,\"a\":Equal}", tuple, "x");
+    test_tuple_format ("x${==\"a\",title:Equal}", tuple, "x");
+    test_tuple_format ("x${==title,\"Song Title\":Equal}", tuple, "xEqual");
+    test_tuple_format ("x${==\"Song Title\",title:Equal}", tuple, "xEqual");
+    tuple.set_str (Tuple::Artist, "{}");
+    test_tuple_format ("x${==artist,\"\\{\\}\":Equal}", tuple, "xEqual");
+
+    /* inequality tests */
+    test_tuple_format ("x${!}", tuple, "Song Title");
+    test_tuple_format ("x${!=}", tuple, "Song Title");
+    test_tuple_format ("x${!=\"a\",\"a\":Unequal}", tuple, "x");
+    test_tuple_format ("x${!=\"a\",\"b\":Unequal}", tuple, "xUnequal");
+    test_tuple_format ("x${!=year,\"a\":Unequal}", tuple, "xUnequal");
+    test_tuple_format ("x${!=\"a\",year:Unequal}", tuple, "xUnequal");
+    test_tuple_format ("x${!=year,1990:Unequal}", tuple, "x");
+    test_tuple_format ("x${!=1990,year:Unequal}", tuple, "x");
+    test_tuple_format ("x${>}", tuple, "Song Title");
+    test_tuple_format ("x${>year,1989:Greater}", tuple, "xGreater");
+    test_tuple_format ("x${>year,1990:Greater}", tuple, "x");
+    test_tuple_format ("x${>=year,1990:NotLess}", tuple, "xNotLess");
+    test_tuple_format ("x${>=year,1991:NotLess}", tuple, "x");
+    test_tuple_format ("x${<}", tuple, "Song Title");
+    test_tuple_format ("x${<year,1991:Less}", tuple, "xLess");
+    test_tuple_format ("x${<year,1990:Less}", tuple, "x");
+    test_tuple_format ("x${<=year,1990:NotGreater}", tuple, "xNotGreater");
+    test_tuple_format ("x${<=year,1989:NotGreater}", tuple, "x");
+
+    /* emptiness tests */
+    tuple.set_int (Tuple::Year, 0);
+    tuple.set_str (Tuple::Artist, "");
+    test_tuple_format ("x${(invalid)}", tuple, "Song Title");
+    test_tuple_format ("x${(empty)?invalid:Empty}", tuple, "Song Title");
+    test_tuple_format ("x${(empty)?subsong-id:Empty}", tuple, "x");
+    test_tuple_format ("x${(empty)?subsong-id:${invalid}}", tuple, "Song Title");
+    test_tuple_format ("x${(empty)?year:Empty}", tuple, "x");
+    test_tuple_format ("x${(empty)?track-number:Empty}", tuple, "xEmpty");
+    test_tuple_format ("x${(empty)?title:Empty}", tuple, "x");
+    test_tuple_format ("x${(empty)?artist:Empty}", tuple, "x");
+    test_tuple_format ("x${(empty)?album:Empty}", tuple, "xEmpty");
+    test_tuple_format ("x${(empty)?\"Literal\":Empty}", tuple, "Song Title");
+}
+
+static void test_ringbuf ()
+{
+    String nums[10];
+    for (int i = 0; i < 10; i ++)
+        nums[i] = String (int_to_str (i));
+
+    RingBuf<String> ring;
+
+    ring.alloc (7);
+
+    for (int i = 0; i < 7; i ++)
+        assert (ring.push (nums[i]) == nums[i]);
+
+    for (int i = 0; i < 5; i ++)
+    {
+        assert (ring.head () == nums[i]);
+        ring.pop ();
+    }
+
+    for (int i = 7; i < 10; i ++)
+        assert (ring.push (nums[i]) == nums[i]);
+
+    assert (ring.size () == 7);
+    assert (ring.len () == 5);
+    assert (ring.linear () == 2);
+
+    ring.alloc (10);
+
+    for (int i = 0; i < 5; i ++)
+        assert (ring[i] == nums[5 + i]);
+
+    assert (ring.size () == 10);
+    assert (ring.len () == 5);
+    assert (ring.linear () == 2);
+
+    for (int i = 0; i < 5; i ++)
+        assert (ring[i] == nums[5 + i]);
+
+    for (int i = 5; i --; )
+        assert (ring.push (nums[i]) == nums[i]);
+
+    for (int i = 0; i < 5; i ++)
+    {
+        assert (ring.head () == nums[5 + i]);
+        ring.pop ();
+    }
+
+    for (int i = 0; i < 5; i ++)
+    {
+        assert (ring.head () == nums[4 - i]);
+        ring.pop ();
+    }
+
+    ring.copy_in (& nums[5], 5);
+    ring.copy_in (& nums[0], 5);
+
+    for (int i = 0; i < 5; i ++)
+    {
+        assert (ring.head () == nums[5 + i]);
+        ring.pop ();
+    }
+
+    for (int i = 0; i < 5; i ++)
+    {
+        assert (ring.head () == nums[i]);
+        ring.pop ();
+    }
+
+    ring.move_in (nums, 10);
+
+    for (int i = 0; i < 10; i ++)
+    {
+        assert (! nums[i]);
+        assert (ring[i] == String (int_to_str (i)));
+    }
+
+    ring.move_out (& nums[5], 5);
+    ring.move_out (& nums[0], 5);
+
+    for (int i = 0; i < 10; i ++)
+        assert (nums[i] == String (int_to_str ((5 + i) % 10)));
+
+    ring.move_in (nums, 10);
+
+    Index<String> index;
+    ring.move_out (index, -1, 5);
+
+    assert (ring.len () == 5);
+    assert (index.len () == 5);
+
+    ring.move_in (index, 0, -1);
+
+    assert (ring.len () == 10);
+    assert (index.len () == 0);
+
+    for (int i = 0; i < 10; i ++)
+        assert (ring[i] == String (int_to_str (i)));
+
+    ring.discard ();
+
+    string_leak_check ();
+}
+
+int main ()
+{
+    test_tuple_formats ();
+    test_ringbuf ();
+
+    return 0;
+}
diff --git a/src/libaudcore/tinylock.c b/src/libaudcore/tinylock.c
deleted file mode 100644
index 873aff11293d..000000000000
--- a/src/libaudcore/tinylock.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * tinylock.c
- * Copyright 2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include "tinylock.h"
-
-#ifndef VALGRIND_FRIENDLY
-
-#include <limits.h>
-#include <sched.h>
-
-#define WRITE_BIT (SHRT_MAX + 1)
-
-EXPORT void tiny_lock (TinyLock * lock)
-{
-    while (__builtin_expect (__sync_lock_test_and_set (lock, 1), 0))
-        sched_yield ();
-}
-
-EXPORT void tiny_unlock (TinyLock * lock)
-{
-    __sync_lock_release (lock);
-}
-
-EXPORT void tiny_lock_read (TinyRWLock * lock)
-{
-    while (__builtin_expect (__sync_fetch_and_add (lock, 1) & WRITE_BIT, 0))
-    {
-        __sync_fetch_and_sub (lock, 1);
-        sched_yield ();
-    }
-}
-
-EXPORT void tiny_unlock_read (TinyRWLock * lock)
-{
-    __sync_fetch_and_sub (lock, 1);
-}
-
-EXPORT void tiny_lock_write (TinyRWLock * lock)
-{
-    while (! __builtin_expect (__sync_bool_compare_and_swap (lock, 0, WRITE_BIT), 1))
-        sched_yield ();
-}
-
-EXPORT void tiny_unlock_write (TinyRWLock * lock)
-{
-    __sync_fetch_and_sub (lock, WRITE_BIT);
-}
-
-#endif /* ! VALGRIND_FRIENDLY */
diff --git a/src/libaudcore/tinylock.cc b/src/libaudcore/tinylock.cc
new file mode 100644
index 000000000000..873aff11293d
--- /dev/null
+++ b/src/libaudcore/tinylock.cc
@@ -0,0 +1,65 @@
+/*
+ * tinylock.c
+ * Copyright 2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "tinylock.h"
+
+#ifndef VALGRIND_FRIENDLY
+
+#include <limits.h>
+#include <sched.h>
+
+#define WRITE_BIT (SHRT_MAX + 1)
+
+EXPORT void tiny_lock (TinyLock * lock)
+{
+    while (__builtin_expect (__sync_lock_test_and_set (lock, 1), 0))
+        sched_yield ();
+}
+
+EXPORT void tiny_unlock (TinyLock * lock)
+{
+    __sync_lock_release (lock);
+}
+
+EXPORT void tiny_lock_read (TinyRWLock * lock)
+{
+    while (__builtin_expect (__sync_fetch_and_add (lock, 1) & WRITE_BIT, 0))
+    {
+        __sync_fetch_and_sub (lock, 1);
+        sched_yield ();
+    }
+}
+
+EXPORT void tiny_unlock_read (TinyRWLock * lock)
+{
+    __sync_fetch_and_sub (lock, 1);
+}
+
+EXPORT void tiny_lock_write (TinyRWLock * lock)
+{
+    while (! __builtin_expect (__sync_bool_compare_and_swap (lock, 0, WRITE_BIT), 1))
+        sched_yield ();
+}
+
+EXPORT void tiny_unlock_write (TinyRWLock * lock)
+{
+    __sync_fetch_and_sub (lock, WRITE_BIT);
+}
+
+#endif /* ! VALGRIND_FRIENDLY */
diff --git a/src/libaudcore/tuple-compiler.cc b/src/libaudcore/tuple-compiler.cc
new file mode 100644
index 000000000000..dc6892090856
--- /dev/null
+++ b/src/libaudcore/tuple-compiler.cc
@@ -0,0 +1,549 @@
+/*
+ * tuple_compiler.c
+ * Copyright (c) 2007 Matti 'ccr' Hämäläinen
+ * Copyright (c) 2011-2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <new>
+#include <glib.h>
+
+#include "audstrings.h"
+#include "runtime.h"
+#include "tuple-compiler.h"
+
+struct Variable
+{
+    enum {
+        Invalid = 0,
+        Text,
+        Integer,
+        Field
+    } type;
+
+    String text;
+    int integer;
+    Tuple::Field field;
+
+    bool set (const char * name, bool literal);
+    bool exists (const Tuple & tuple) const;
+    Tuple::ValueType get (const Tuple & tuple, String & tmps, int & tmpi) const;
+};
+
+enum class Op {
+    Invalid = 0,
+    Var,
+    Exists,
+    Equal,
+    Unequal,
+    Greater,
+    GreaterEqual,
+    Less,
+    LessEqual,
+    Empty
+};
+
+struct TupleCompiler::Node {
+    Op op;
+    Variable var1, var2;
+    Index<Node> children;
+};
+
+typedef TupleCompiler::Node Node;
+
+bool Variable::set (const char * name, bool literal)
+{
+    if (g_ascii_isdigit (name[0]))
+    {
+        type = Integer;
+        integer = atoi (name);
+    }
+    else if (literal)
+    {
+        type = Text;
+        text = String (name);
+    }
+    else
+    {
+        type = Field;
+        field = Tuple::field_by_name (name);
+
+        if (field < 0)
+        {
+            AUDWARN ("Invalid variable '%s'.\n", name);
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool Variable::exists (const Tuple & tuple) const
+{
+    g_return_val_if_fail (type == Field, false);
+    return tuple.get_value_type (field) != Tuple::Empty;
+}
+
+Tuple::ValueType Variable::get (const Tuple & tuple, String & tmps, int & tmpi) const
+{
+    switch (type)
+    {
+    case Text:
+        tmps = text;
+        return Tuple::String;
+
+    case Integer:
+        tmpi = integer;
+        return Tuple::Int;
+
+    case Field:
+        switch (tuple.get_value_type (field))
+        {
+        case Tuple::String:
+            tmps = tuple.get_str (field);
+            return Tuple::String;
+
+        case Tuple::Int:
+            tmpi = tuple.get_int (field);
+            return Tuple::Int;
+
+        default:
+            return Tuple::Empty;
+        }
+
+    default:
+        g_return_val_if_reached (Tuple::Empty);
+    }
+}
+
+TupleCompiler::TupleCompiler () {}
+TupleCompiler::~TupleCompiler () {}
+
+static StringBuf get_item (const char * & str, char endch, bool & literal)
+{
+    const char * s = str;
+
+    StringBuf buf (-1);
+    char * set = buf;
+    char * stop = buf + buf.len ();
+
+    if (* s == '"')
+    {
+        if (! literal)
+        {
+            buf.steal (StringBuf ());
+            AUDWARN ("Unexpected string literal at '%s'.\n", s);
+            return StringBuf ();
+        }
+
+        s ++;
+    }
+    else
+        literal = false;
+
+    if (literal)
+    {
+        while (* s != '"')
+        {
+            if (* s == '\\')
+                s ++;
+
+            if (! * s)
+            {
+                buf.steal (StringBuf ());
+                AUDWARN ("Unterminated string literal.\n");
+                return StringBuf ();
+            }
+
+            if (set == stop)
+                throw std::bad_alloc ();
+
+            * set ++ = * s ++;
+        }
+
+        s ++;
+    }
+    else
+    {
+        while (g_ascii_isalnum (* s) || * s == '-')
+        {
+            if (set == stop)
+                throw std::bad_alloc ();
+
+            * set ++ = * s ++;
+        }
+    }
+
+    if (* s != endch)
+    {
+        buf.steal (StringBuf ());
+        AUDWARN ("Expected '%c' at '%s'.\n", endch, s);
+        return StringBuf ();
+    }
+
+    str = s + 1;
+
+    buf.resize (set - buf);
+    return buf;
+}
+
+static bool compile_expression (Index<Node> & nodes, const char * & expression);
+
+static bool parse_construct (Node & node, const char * & c)
+{
+    bool literal1 = true, literal2 = true;
+
+    StringBuf tmps1 = get_item (c, ',', literal1);
+    if (! tmps1)
+        return false;
+
+    StringBuf tmps2 = get_item (c, ':', literal2);
+    if (! tmps2)
+        return false;
+
+    if (! node.var1.set (tmps1, literal1))
+        return false;
+
+    if (! node.var2.set (tmps2, literal2))
+        return false;
+
+    return compile_expression (node.children, c);
+}
+
+/* Compile format expression into Node tree. */
+static bool compile_expression (Index<Node> & nodes, const char * & expression)
+{
+    const char * c = expression;
+
+    while (* c && * c != '}')
+    {
+        Node & node = nodes.append ();
+
+        if (* c == '$')
+        {
+            /* Expression? */
+            if (c[1] != '{')
+            {
+                AUDWARN ("Expected '${' at '%s'.\n", c);
+                return false;
+            }
+
+            c += 2;
+
+            switch (* c)
+            {
+            case '?':
+            case '(':
+              {
+                if (* c == '?')
+                {
+                    node.op = Op::Exists;
+                    c ++;
+                }
+                else
+                {
+                    if (strncmp (c, "(empty)?", 8))
+                    {
+                        AUDWARN ("Expected '(empty)?' at '%s'.\n", c);
+                        return false;
+                    }
+
+                    node.op = Op::Empty;
+                    c += 8;
+                }
+
+                bool literal = false;
+                StringBuf tmps = get_item (c, ':', literal);
+                if (! tmps)
+                    return false;
+
+                if (! node.var1.set (tmps, false))
+                    return false;
+
+                if (! compile_expression (node.children, c))
+                    return false;
+
+                break;
+              }
+
+            case '=':
+            case '!':
+                node.op = (* c == '=') ? Op::Equal : Op::Unequal;
+
+                if (c[1] != '=')
+                {
+                    AUDWARN ("Expected '%c=' at '%s'.\n", c[0], c);
+                    return false;
+                }
+
+                c += 2;
+
+                if (! parse_construct (node, c))
+                    return false;
+
+                break;
+
+            case '<':
+            case '>':
+                if (c[1] == '=')
+                {
+                    node.op = (* c == '<') ? Op::LessEqual : Op::GreaterEqual;
+                    c += 2;
+                }
+                else
+                {
+                    node.op = (* c == '<') ? Op::Less : Op::Greater;
+                    c ++;
+                }
+
+                if (! parse_construct (node, c))
+                    return false;
+
+                break;
+
+            default:
+              {
+                bool literal = false;
+                StringBuf tmps = get_item (c, '}', literal);
+                if (! tmps)
+                    return false;
+
+                c --;
+
+                node.op = Op::Var;
+
+                if (! node.var1.set (tmps, false))
+                    return false;
+              }
+            }
+
+            if (* c != '}')
+            {
+                AUDWARN ("Expected '}' at '%s'.\n", c);
+                return false;
+            }
+
+            c ++;
+        }
+        else if (* c == '{')
+        {
+            AUDWARN ("Unexpected '%c' at '%s'.\n", * c, c);
+            return false;
+        }
+        else
+        {
+            /* Parse raw/literal text */
+            StringBuf buf (-1);
+            char * set = buf;
+            char * stop = buf + buf.len ();
+
+            while (* c && * c != '$' && * c != '{' && * c != '}')
+            {
+                if (* c == '\\')
+                {
+                    c ++;
+
+                    if (! * c)
+                    {
+                        buf.steal (StringBuf ());
+                        AUDWARN ("Incomplete escaped character.\n");
+                        return false;
+                    }
+                }
+
+                if (set == stop)
+                    throw std::bad_alloc ();
+
+                * set ++ = * c ++;
+            }
+
+            buf.resize (set - buf);
+
+            node.op = Op::Var;
+            node.var1.type = Variable::Text;
+            node.var1.text = String (buf);
+        }
+    }
+
+    expression = c;
+    return true;
+}
+
+bool TupleCompiler::compile (const char * expr)
+{
+    const char * c = expr;
+    Index<Node> nodes;
+
+    if (! compile_expression (nodes, c))
+        return false;
+
+    if (* c)
+    {
+        AUDWARN ("Unexpected '%c' at '%s'.\n", * c, c);
+        return false;
+    }
+
+    root_nodes = std::move (nodes);
+    return true;
+}
+
+/* Evaluate tuple in given TupleEval expression in given
+ * context and return resulting string. */
+static void eval_expression (const Index<Node> & nodes, const Tuple & tuple, StringBuf & out)
+{
+    for (const Node & node : nodes)
+    {
+        switch (node.op)
+        {
+        case Op::Var:
+          {
+            String tmps;
+            int tmpi;
+
+            switch (node.var1.get (tuple, tmps, tmpi))
+            {
+            case Tuple::String:
+                out.insert (-1, tmps);
+                break;
+
+            case Tuple::Int:
+                out.combine (int_to_str (tmpi));
+                break;
+
+            default:
+                break;
+            }
+
+            break;
+          }
+
+        case Op::Equal:
+        case Op::Unequal:
+        case Op::Less:
+        case Op::LessEqual:
+        case Op::Greater:
+        case Op::GreaterEqual:
+          {
+            bool result = false;
+            String tmps1, tmps2;
+            int tmpi1 = 0, tmpi2 = 0;
+
+            Tuple::ValueType type1 = node.var1.get (tuple, tmps1, tmpi1);
+            Tuple::ValueType type2 = node.var2.get (tuple, tmps2, tmpi2);
+
+            if (type1 != Tuple::Empty && type2 != Tuple::Empty)
+            {
+                int resulti;
+
+                if (type1 == type2)
+                {
+                    if (type1 == Tuple::String)
+                        resulti = strcmp (tmps1, tmps2);
+                    else
+                        resulti = tmpi1 - tmpi2;
+                }
+                else
+                {
+                    if (type1 == Tuple::Int)
+                        resulti = tmpi1 - atoi (tmps2);
+                    else
+                        resulti = atoi (tmps1) - tmpi2;
+                }
+
+                switch (node.op)
+                {
+                case Op::Equal:
+                    result = (resulti == 0);
+                    break;
+
+                case Op::Unequal:
+                    result = (resulti != 0);
+                    break;
+
+                case Op::Less:
+                    result = (resulti < 0);
+                    break;
+
+                case Op::LessEqual:
+                    result = (resulti <= 0);
+                    break;
+
+                case Op::Greater:
+                    result = (resulti > 0);
+                    break;
+
+                case Op::GreaterEqual:
+                    result = (resulti >= 0);
+                    break;
+
+                default:
+                    g_warn_if_reached ();
+                }
+            }
+
+            if (result)
+                eval_expression (node.children, tuple, out);
+
+            break;
+          }
+
+        case Op::Exists:
+            if (node.var1.exists (tuple))
+                eval_expression (node.children, tuple, out);
+
+            break;
+
+        case Op::Empty:
+            if (! node.var1.exists (tuple))
+                eval_expression (node.children, tuple, out);
+
+            break;
+
+        default:
+            g_warn_if_reached ();
+        }
+    }
+}
+
+void TupleCompiler::format (Tuple & tuple) const
+{
+    tuple.unset (Tuple::FormattedTitle);  // prevent recursion
+
+    StringBuf buf (0);
+    eval_expression (root_nodes, tuple, buf);
+
+    if (buf[0])
+    {
+        tuple.set_str (Tuple::FormattedTitle, buf);
+        return;
+    }
+
+    /* formatting failed, try fallbacks */
+    for (Tuple::Field fallback : {Tuple::Title, Tuple::Basename})
+    {
+        String title = tuple.get_str (fallback);
+        if (title)
+        {
+            tuple.set_str (Tuple::FormattedTitle, title);
+            return;
+        }
+    }
+
+    tuple.set_str (Tuple::FormattedTitle, "");
+}
diff --git a/src/libaudcore/tuple-compiler.h b/src/libaudcore/tuple-compiler.h
new file mode 100644
index 000000000000..d5297c37dba5
--- /dev/null
+++ b/src/libaudcore/tuple-compiler.h
@@ -0,0 +1,61 @@
+/*
+ * tuple_compiler.h
+ * Copyright (c) 2007 Matti 'ccr' Hämäläinen
+ * Copyright (c) 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+/*
+ * the tuple formatter:
+ *
+ * this is a data-driven meta-language.
+ *
+ * language constructs follow the following basic rules:
+ *   - begin with ${
+ *   - end with }
+ *
+ * language constructs:
+ *   - ${field}: prints a field
+ *   - ${?field:expr}: evaluates expr if field exists
+ *   - ${==field,field:expr}: evaluates expr if both fields are the same
+ *   - ${!=field,field:expr}: evaluates expr if both fields are not the same
+ *   - ${(empty)?field:expr}: evaluates expr if field does not exist
+ *
+ * everything else is treated as raw text.
+ */
+
+#ifndef LIBAUDCORE_TUPLE_COMPILER_H
+#define LIBAUDCORE_TUPLE_COMPILER_H
+
+#include <libaudcore/index.h>
+#include <libaudcore/tuple.h>
+
+class TupleCompiler
+{
+public:
+    struct Node;
+
+    TupleCompiler ();
+    ~TupleCompiler ();
+
+    bool compile (const char * expr);
+    void format (Tuple & tuple) const;
+
+private:
+    Index<Node> root_nodes;
+};
+
+#endif /* LIBAUDCORE_TUPLE_COMPILER_H */
diff --git a/src/libaudcore/tuple.c b/src/libaudcore/tuple.c
deleted file mode 100644
index 7974c8b31cdf..000000000000
--- a/src/libaudcore/tuple.c
+++ /dev/null
@@ -1,496 +0,0 @@
-/*
- * tuple.c
- * Copyright 2007-2013 William Pitcock, Christian Birchinger, Matti Hämäläinen,
- *                     Giacomo Lozito, Eugene Zagidullin, and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <audacious/i18n.h>
-
-#include "audstrings.h"
-#include "tinylock.h"
-#include "tuple.h"
-
-#if TUPLE_FIELDS > 64
-#error The current tuple implementation is limited to 64 fields
-#endif
-
-#define BLOCK_VALS 4
-
-typedef struct {
-    char *name;
-    TupleValueType type;
-} TupleBasicType;
-
-typedef union {
-    char * str;
-    int x;
-} TupleVal;
-
-typedef struct _TupleBlock TupleBlock;
-
-struct _TupleBlock {
-    TupleBlock * next;
-    char fields[BLOCK_VALS];
-    TupleVal vals[BLOCK_VALS];
-};
-
-/**
- * Structure for holding and passing around miscellaneous track
- * metadata. This is not the same as a playlist entry, though.
- */
-struct _Tuple {
-    int64_t setmask;
-    TupleBlock * blocks;
-
-    int *subtunes;                 /**< Array of int containing subtune index numbers.
-                                         Can be NULL if indexing is linear or if
-                                         there are no subtunes. */
-    int nsubtunes;                 /**< Number of subtunes, if any. Values greater than 0
-                                         mean that there are subtunes and #subtunes array
-                                         may be set. */
-
-    int refcount;
-    TinyLock lock;
-};
-
-#define BIT(i) ((int64_t) 1 << (i))
-
-#define LOCK(t) tiny_lock ((TinyLock *) & t->lock)
-#define UNLOCK(t) tiny_unlock ((TinyLock *) & t->lock)
-
-/** Ordered table of basic #Tuple field names and their #TupleValueType.
- */
-static const TupleBasicType tuple_fields[TUPLE_FIELDS] = {
-    { "artist",         TUPLE_STRING },
-    { "title",          TUPLE_STRING },
-    { "album",          TUPLE_STRING },
-    { "comment",        TUPLE_STRING },
-    { "genre",          TUPLE_STRING },
-
-    { "track-number",   TUPLE_INT },
-    { "length",         TUPLE_INT },
-    { "year",           TUPLE_INT },
-    { "quality",        TUPLE_STRING },
-
-    { "codec",          TUPLE_STRING },
-    { "file-name",      TUPLE_STRING },
-    { "file-path",      TUPLE_STRING },
-    { "file-ext",       TUPLE_STRING },
-
-    { "song-artist",    TUPLE_STRING },
-    { "composer",       TUPLE_STRING },
-    { "performer",      TUPLE_STRING },
-    { "copyright",      TUPLE_STRING },
-    { "date",           TUPLE_STRING },
-
-    { "subsong-id",     TUPLE_INT },
-    { "subsong-num",    TUPLE_INT },
-    { "mime-type",      TUPLE_STRING },
-    { "bitrate",        TUPLE_INT },
-
-    { "segment-start",  TUPLE_INT },
-    { "segment-end",    TUPLE_INT },
-
-    { "gain-album-gain", TUPLE_INT },
-    { "gain-album-peak", TUPLE_INT },
-    { "gain-track-gain", TUPLE_INT },
-    { "gain-track-peak", TUPLE_INT },
-    { "gain-gain-unit", TUPLE_INT },
-    { "gain-peak-unit", TUPLE_INT },
-};
-
-typedef struct {
-    const char * name;
-    int field;
-} FieldDictEntry;
-
-/* used for binary search, MUST be in alphabetical order */
-static const FieldDictEntry field_dict[TUPLE_FIELDS] = {
- {"album", FIELD_ALBUM},
- {"artist", FIELD_ARTIST},
- {"bitrate", FIELD_BITRATE},
- {"codec", FIELD_CODEC},
- {"comment", FIELD_COMMENT},
- {"composer", FIELD_COMPOSER},
- {"copyright", FIELD_COPYRIGHT},
- {"date", FIELD_DATE},
- {"file-ext", FIELD_FILE_EXT},
- {"file-name", FIELD_FILE_NAME},
- {"file-path", FIELD_FILE_PATH},
- {"gain-album-gain", FIELD_GAIN_ALBUM_GAIN},
- {"gain-album-peak", FIELD_GAIN_ALBUM_PEAK},
- {"gain-gain-unit", FIELD_GAIN_GAIN_UNIT},
- {"gain-peak-unit", FIELD_GAIN_PEAK_UNIT},
- {"gain-track-gain", FIELD_GAIN_TRACK_GAIN},
- {"gain-track-peak", FIELD_GAIN_TRACK_PEAK},
- {"genre", FIELD_GENRE},
- {"length", FIELD_LENGTH},
- {"mime-type", FIELD_MIMETYPE},
- {"performer", FIELD_PERFORMER},
- {"quality", FIELD_QUALITY},
- {"segment-end", FIELD_SEGMENT_END},
- {"segment-start", FIELD_SEGMENT_START},
- {"song-artist", FIELD_SONG_ARTIST},
- {"subsong-id", FIELD_SUBSONG_ID},
- {"subsong-num", FIELD_SUBSONG_NUM},
- {"title", FIELD_TITLE},
- {"track-number", FIELD_TRACK_NUMBER},
- {"year", FIELD_YEAR}};
-
-#define VALID_FIELD(f) ((f) >= 0 && (f) < TUPLE_FIELDS)
-#define FIELD_TYPE(f) (tuple_fields[f].type)
-
-static int field_dict_compare (const void * a, const void * b)
-{
-    return strcmp (((FieldDictEntry *) a)->name, ((FieldDictEntry *) b)->name);
-}
-
-EXPORT int tuple_field_by_name (const char * name)
-{
-    FieldDictEntry find = {name, -1};
-    FieldDictEntry * found = bsearch (& find, field_dict, TUPLE_FIELDS,
-     sizeof (FieldDictEntry), field_dict_compare);
-
-    return found ? found->field : -1;
-}
-
-EXPORT const char * tuple_field_get_name (int field)
-{
-    g_return_val_if_fail (VALID_FIELD (field), NULL);
-    return tuple_fields[field].name;
-}
-
-EXPORT TupleValueType tuple_field_get_type (int field)
-{
-    g_return_val_if_fail (VALID_FIELD (field), TUPLE_UNKNOWN);
-    return tuple_fields[field].type;
-}
-
-static TupleVal * lookup_val (Tuple * tuple, int field, bool_t add, bool_t remove)
-{
-    if ((tuple->setmask & BIT (field)))
-    {
-        for (TupleBlock * block = tuple->blocks; block; block = block->next)
-        {
-            for (int i = 0; i < BLOCK_VALS; i ++)
-            {
-                if (block->fields[i] == field)
-                {
-                    if (remove)
-                    {
-                        tuple->setmask &= ~BIT (field);
-                        block->fields[i] = -1;
-                    }
-
-                    return & block->vals[i];
-                }
-            }
-        }
-    }
-
-    if (! add)
-        return NULL;
-
-    tuple->setmask |= BIT (field);
-
-    for (TupleBlock * block = tuple->blocks; block; block = block->next)
-    {
-        for (int i = 0; i < BLOCK_VALS; i ++)
-        {
-            if (block->fields[i] < 0)
-            {
-                block->fields[i] = field;
-                return & block->vals[i];
-            }
-        }
-    }
-
-    TupleBlock * block = g_slice_new0 (TupleBlock);
-    memset (block->fields, -1, BLOCK_VALS);
-
-    block->next = tuple->blocks;
-    tuple->blocks = block;
-
-    block->fields[0] = field;
-    return & block->vals[0];
-}
-
-static void tuple_destroy (Tuple * tuple)
-{
-    TupleBlock * next;
-    for (TupleBlock * block = tuple->blocks; block; block = next)
-    {
-        next = block->next;
-
-        for (int i = 0; i < BLOCK_VALS; i ++)
-        {
-            int field = block->fields[i];
-            if (field >= 0 && tuple_fields[field].type == TUPLE_STRING)
-                str_unref (block->vals[i].str);
-        }
-
-        g_slice_free (TupleBlock, block);
-    }
-
-    g_free (tuple->subtunes);
-    g_slice_free (Tuple, tuple);
-}
-
-EXPORT Tuple * tuple_new (void)
-{
-    Tuple * tuple = g_slice_new0 (Tuple);
-    tuple->refcount = 1;
-    return tuple;
-}
-
-EXPORT Tuple * tuple_ref (Tuple * tuple)
-{
-    __sync_fetch_and_add (& tuple->refcount, 1);
-
-    return tuple;
-}
-
-EXPORT void tuple_unref (Tuple * tuple)
-{
-    if (! tuple)
-        return;
-
-    if (! __sync_sub_and_fetch (& tuple->refcount, 1))
-        tuple_destroy (tuple);
-}
-
-EXPORT void tuple_set_filename (Tuple * tuple, const char * filename)
-{
-    const char * base, * ext, * sub;
-    int isub;
-
-    uri_parse (filename, & base, & ext, & sub, & isub);
-
-    char path[base - filename + 1];
-    str_decode_percent (filename, base - filename, path);
-    tuple_set_str (tuple, FIELD_FILE_PATH, path);
-
-    char name[ext - base + 1];
-    str_decode_percent (base, ext - base, name);
-    tuple_set_str (tuple, FIELD_FILE_NAME, name);
-
-    if (ext < sub)
-    {
-        char extbuf[sub - ext];
-        str_decode_percent (ext + 1, sub - ext - 1, extbuf);
-        tuple_set_str (tuple, FIELD_FILE_EXT, extbuf);
-    }
-
-    if (sub[0])
-        tuple_set_int (tuple, FIELD_SUBSONG_ID, isub);
-}
-
-EXPORT Tuple * tuple_copy (const Tuple * old)
-{
-    Tuple * new = tuple_new ();
-    LOCK (old);
-
-    for (int f = 0; f < TUPLE_FIELDS; f ++)
-    {
-        TupleVal * oldval = lookup_val ((Tuple *) old, f, FALSE, FALSE);
-        if (oldval)
-        {
-            TupleVal * newval = lookup_val (new, f, TRUE, FALSE);
-            if (tuple_fields[f].type == TUPLE_STRING)
-                newval->str = str_ref (oldval->str);
-            else
-                newval->x = oldval->x;
-        }
-    }
-
-    new->nsubtunes = old->nsubtunes;
-
-    if (old->subtunes)
-        new->subtunes = g_memdup (old->subtunes, sizeof (int) * old->nsubtunes);
-
-    UNLOCK (old);
-    return new;
-}
-
-EXPORT Tuple * tuple_new_from_filename (const char * filename)
-{
-    Tuple * tuple = tuple_new ();
-    tuple_set_filename (tuple, filename);
-    return tuple;
-}
-
-EXPORT void tuple_set_int (Tuple * tuple, int field, int x)
-{
-    g_return_if_fail (VALID_FIELD (field) && FIELD_TYPE (field) == TUPLE_INT);
-    LOCK (tuple);
-
-    TupleVal * val = lookup_val (tuple, field, TRUE, FALSE);
-    val->x = x;
-
-    UNLOCK (tuple);
-}
-
-EXPORT void tuple_set_str (Tuple * tuple, int field, const char * str)
-{
-    g_return_if_fail (VALID_FIELD (field) && FIELD_TYPE (field) == TUPLE_STRING);
-
-    if (! str)
-    {
-        tuple_unset (tuple, field);
-        return;
-    }
-
-    LOCK (tuple);
-
-    TupleVal * val = lookup_val (tuple, field, TRUE, FALSE);
-    str_unref (val->str);
-    val->str = str_to_utf8 (str, -1);
-
-    UNLOCK (tuple);
-}
-
-EXPORT void tuple_unset (Tuple * tuple, int field)
-{
-    g_return_if_fail (VALID_FIELD (field));
-    LOCK (tuple);
-
-    TupleVal * val = lookup_val (tuple, field, FALSE, TRUE);
-    if (val)
-    {
-        if (tuple_fields[field].type == TUPLE_STRING)
-        {
-            str_unref (val->str);
-            val->str = NULL;
-        }
-        else
-            val->x = 0;
-    }
-
-    UNLOCK (tuple);
-}
-
-EXPORT TupleValueType tuple_get_value_type (const Tuple * tuple, int field)
-{
-    g_return_val_if_fail (VALID_FIELD (field), TUPLE_UNKNOWN);
-    LOCK (tuple);
-
-    TupleVal * val = lookup_val ((Tuple *) tuple, field, FALSE, FALSE);
-    TupleValueType type = val ? FIELD_TYPE (field) : TUPLE_UNKNOWN;
-
-    UNLOCK (tuple);
-    return type;
-}
-
-EXPORT char * tuple_get_str (const Tuple * tuple, int field)
-{
-    g_return_val_if_fail (VALID_FIELD (field) && FIELD_TYPE (field) == TUPLE_STRING, NULL);
-    LOCK (tuple);
-
-    TupleVal * val = lookup_val ((Tuple *) tuple, field, FALSE, FALSE);
-    char * str = val ? str_ref (val->str) : NULL;
-
-    UNLOCK (tuple);
-    return str;
-}
-
-EXPORT int tuple_get_int (const Tuple * tuple, int field)
-{
-    g_return_val_if_fail (VALID_FIELD (field) && FIELD_TYPE (field) == TUPLE_INT, -1);
-    LOCK (tuple);
-
-    TupleVal * val = lookup_val ((Tuple *) tuple, field, FALSE, FALSE);
-    int x = val ? val->x : -1;
-
-    UNLOCK (tuple);
-    return x;
-}
-
-#define APPEND(b, ...) snprintf (b + strlen (b), sizeof b - strlen (b), __VA_ARGS__)
-
-EXPORT void tuple_set_format (Tuple * t, const char * format, int chans, int rate,
- int brate)
-{
-    if (format)
-        tuple_set_str (t, FIELD_CODEC, format);
-
-    char buf[32];
-    buf[0] = 0;
-
-    if (chans > 0)
-    {
-        if (chans == 1)
-            APPEND (buf, _("Mono"));
-        else if (chans == 2)
-            APPEND (buf, _("Stereo"));
-        else
-            APPEND (buf, dngettext (PACKAGE, "%d channel", "%d channels", chans), chans);
-
-        if (rate > 0)
-            APPEND (buf, ", ");
-    }
-
-    if (rate > 0)
-        APPEND (buf, "%d kHz", rate / 1000);
-
-    if (buf[0])
-        tuple_set_str (t, FIELD_QUALITY, buf);
-
-    if (brate > 0)
-        tuple_set_int (t, FIELD_BITRATE, brate);
-}
-
-EXPORT void tuple_set_subtunes (Tuple * tuple, int n_subtunes, const int * subtunes)
-{
-    LOCK (tuple);
-
-    g_free (tuple->subtunes);
-    tuple->subtunes = NULL;
-
-    tuple->nsubtunes = n_subtunes;
-    if (subtunes)
-        tuple->subtunes = g_memdup (subtunes, sizeof (int) * n_subtunes);
-
-    UNLOCK (tuple);
-}
-
-EXPORT int tuple_get_n_subtunes (Tuple * tuple)
-{
-    LOCK (tuple);
-
-    int n_subtunes = tuple->nsubtunes;
-
-    UNLOCK (tuple);
-    return n_subtunes;
-}
-
-EXPORT int tuple_get_nth_subtune (Tuple * tuple, int n)
-{
-    LOCK (tuple);
-
-    int subtune = -1;
-    if (n >= 0 && n < tuple->nsubtunes)
-        subtune = tuple->subtunes ? tuple->subtunes[n] : 1 + n;
-
-    UNLOCK (tuple);
-    return subtune;
-}
diff --git a/src/libaudcore/tuple.cc b/src/libaudcore/tuple.cc
new file mode 100644
index 000000000000..4fe97b5a8f7a
--- /dev/null
+++ b/src/libaudcore/tuple.cc
@@ -0,0 +1,780 @@
+/*
+ * tuple.c
+ * Copyright 2007-2013 William Pitcock, Christian Birchinger, Matti Hämäläinen,
+ *                     Giacomo Lozito, Eugene Zagidullin, and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <assert.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>  /* for g_utf8_validate */
+
+#include "audio.h"
+#include "audstrings.h"
+#include "i18n.h"
+#include "tuple.h"
+#include "vfs.h"
+
+enum {
+    FallbackTitle = Tuple::n_fields,
+    FallbackArtist,
+    FallbackAlbum,
+
+    n_private_fields
+};
+
+static_assert (n_private_fields <= 64,
+ "The current tuple implementation is limited to 64 fields");
+
+union TupleVal
+{
+    String str;
+    int x;
+
+    // dummy constructor and destructor
+    TupleVal () {}
+    ~TupleVal () {}
+};
+
+/**
+ * Structure for holding and passing around miscellaneous track
+ * metadata. This is not the same as a playlist entry, though.
+ */
+struct TupleData
+{
+    uint64_t setmask;      // which fields are present
+    Index<TupleVal> vals;  // ordered list of field values
+
+    int *subtunes;                 /**< Array of int containing subtune index numbers.
+                                         Can be nullptr if indexing is linear or if
+                                         there are no subtunes. */
+    int nsubtunes;                 /**< Number of subtunes, if any. Values greater than 0
+                                         mean that there are subtunes and #subtunes array
+                                         may be set. */
+
+    int refcount;
+
+    TupleData ();
+    ~TupleData ();
+
+    TupleData (const TupleData & other);
+    void operator= (const TupleData & other) = delete;
+
+    bool is_set (int field) const
+        { return (setmask & bitmask (field)); }
+
+    bool is_same (const TupleData & other);
+
+    TupleVal * lookup (int field, bool add, bool remove);
+    void set_int (int field, int x);
+    void set_str (int field, const char * str);
+    void set_subtunes (int nsubs, const int * subs);
+
+    static TupleData * ref (TupleData * tuple);
+    static void unref (TupleData * tuple);
+
+    static TupleData * copy_on_write (TupleData * tuple);
+
+private:
+    static constexpr uint64_t bitmask (int n)
+        { return (uint64_t) 1 << n; }
+};
+
+/** Ordered table of basic #Tuple field names and their #ValueType.
+ */
+static const struct {
+    const char * name;
+    Tuple::ValueType type;
+    int fallback;
+} field_info[] = {
+    {"title", Tuple::String, FallbackTitle},
+    {"artist", Tuple::String, FallbackArtist},
+    {"album", Tuple::String, FallbackAlbum},
+    {"comment", Tuple::String, -1},
+    {"genre", Tuple::String, -1},
+
+    {"track-number", Tuple::Int, -1},
+    {"length", Tuple::Int, -1},
+    {"year", Tuple::Int, -1},
+    {"quality", Tuple::String, -1},
+    {"codec", Tuple::String, -1},
+
+    {"file-name", Tuple::String, -1},
+    {"file-path", Tuple::String, -1},
+    {"file-ext", Tuple::String, -1},
+
+    {"album-artist", Tuple::String, -1},
+    {"composer", Tuple::String, -1},
+    {"performer", Tuple::String, -1},
+    {"copyright", Tuple::String, -1},
+    {"date", Tuple::String, -1},
+    {"mbid", Tuple::String, -1},
+    {"mime-type", Tuple::String, -1},
+    {"bitrate", Tuple::Int, -1},
+
+    {"subsong-id", Tuple::Int, -1},
+    {"subsong-num", Tuple::Int, -1},
+
+    {"segment-start", Tuple::Int, -1},
+    {"segment-end", Tuple::Int, -1},
+
+    {"gain-album-gain", Tuple::Int, -1},
+    {"gain-album-peak", Tuple::Int, -1},
+    {"gain-track-gain", Tuple::Int, -1},
+    {"gain-track-peak", Tuple::Int, -1},
+    {"gain-gain-unit", Tuple::Int, -1},
+    {"gain-peak-unit", Tuple::Int, -1},
+
+    {"formatted-title", Tuple::String, -1},
+
+    /* fallbacks */
+    {nullptr, Tuple::String, -1},
+    {nullptr, Tuple::String, -1},
+    {nullptr, Tuple::String, -1},
+};
+
+static_assert (aud::n_elems (field_info) == n_private_fields, "Update field_data");
+
+struct FieldDictEntry {
+    const char * name;
+    Tuple::Field field;
+};
+
+/* used for binary search, MUST be in alphabetical order */
+static const FieldDictEntry field_dict[] = {
+    {"album", Tuple::Album},
+    {"album-artist", Tuple::AlbumArtist},
+    {"artist", Tuple::Artist},
+    {"bitrate", Tuple::Bitrate},
+    {"codec", Tuple::Codec},
+    {"comment", Tuple::Comment},
+    {"composer", Tuple::Composer},
+    {"copyright", Tuple::Copyright},
+    {"date", Tuple::Date},
+    {"file-ext", Tuple::Suffix},
+    {"file-name", Tuple::Basename},
+    {"file-path", Tuple::Path},
+    {"formatted-title", Tuple::FormattedTitle},
+    {"gain-album-gain", Tuple::AlbumGain},
+    {"gain-album-peak", Tuple::AlbumPeak},
+    {"gain-gain-unit", Tuple::GainDivisor},
+    {"gain-peak-unit", Tuple::PeakDivisor},
+    {"gain-track-gain", Tuple::TrackGain},
+    {"gain-track-peak", Tuple::TrackPeak},
+    {"genre", Tuple::Genre},
+    {"length", Tuple::Length},
+    {"mbid", Tuple::MusicBrainz},
+    {"mime-type", Tuple::MIMEType},
+    {"performer", Tuple::Performer},
+    {"quality", Tuple::Quality},
+    {"segment-end", Tuple::EndTime},
+    {"segment-start", Tuple::StartTime},
+    {"subsong-id", Tuple::Subtune},
+    {"subsong-num", Tuple::NumSubtunes},
+    {"title", Tuple::Title},
+    {"track-number", Tuple::Track},
+    {"year", Tuple::Year}
+};
+
+static_assert (aud::n_elems (field_dict) == Tuple::n_fields, "Update field_dict");
+
+static constexpr bool is_valid_field (int field)
+    { return field > Tuple::Invalid && field < Tuple::n_fields; }
+
+static int bitcount (uint64_t x)
+{
+    /* algorithm from http://en.wikipedia.org/wiki/Hamming_weight */
+    x -= (x >> 1) & 0x5555555555555555;
+    x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333);
+    x = (x + (x >> 4)) & 0x0f0f0f0f0f0f0f0f;
+    return (x * 0x0101010101010101) >> 56;
+}
+
+static int field_dict_compare (const void * a, const void * b)
+{
+    return strcmp (((FieldDictEntry *) a)->name, ((FieldDictEntry *) b)->name);
+}
+
+EXPORT Tuple::Field Tuple::field_by_name (const char * name)
+{
+    FieldDictEntry find = {name, Invalid};
+    FieldDictEntry * found = (FieldDictEntry *) bsearch (& find, field_dict,
+     n_fields, sizeof (FieldDictEntry), field_dict_compare);
+
+    return found ? found->field : Invalid;
+}
+
+EXPORT const char * Tuple::field_get_name (Field field)
+{
+    assert (is_valid_field (field));
+    return field_info[field].name;
+}
+
+EXPORT Tuple::ValueType Tuple::field_get_type (Field field)
+{
+    assert (is_valid_field (field));
+    return field_info[field].type;
+}
+
+TupleVal * TupleData::lookup (int field, bool add, bool remove)
+{
+    /* calculate number of preceding fields */
+    const uint64_t mask = bitmask (field);
+    const int pos = bitcount (setmask & (mask - 1));
+
+    if ((setmask & mask))
+    {
+        if ((add || remove) && field_info[field].type == Tuple::String)
+            vals[pos].str.~String ();
+
+        if (remove)
+        {
+            setmask &= ~mask;
+            vals.remove (pos, 1);
+            return nullptr;
+        }
+
+        return & vals[pos];
+    }
+
+    if (! (add || remove) && field_info[field].fallback >= 0)
+        return lookup (field_info[field].fallback, false, false);
+
+    if (! add)
+        return nullptr;
+
+    setmask |= mask;
+    vals.insert (pos, 1);
+    return & vals[pos];
+}
+
+void TupleData::set_int (int field, int x)
+{
+    TupleVal * val = lookup (field, true, false);
+    val->x = x;
+}
+
+void TupleData::set_str (int field, const char * str)
+{
+    TupleVal * val = lookup (field, true, false);
+    new (& val->str) String (str);
+}
+
+void TupleData::set_subtunes (int nsubs, const int * subs)
+{
+    nsubtunes = nsubs;
+
+    delete subtunes;
+    subtunes = nullptr;
+
+    if (subs)
+    {
+        subtunes = new int[nsubs];
+        memcpy (subtunes, subs, sizeof (int) * nsubs);
+    }
+}
+
+TupleData::TupleData () :
+    setmask (0),
+    subtunes (nullptr),
+    nsubtunes (0),
+    refcount (1) {}
+
+TupleData::TupleData (const TupleData & other) :
+    setmask (other.setmask),
+    subtunes (nullptr),
+    nsubtunes (0),
+    refcount (1)
+{
+    vals.insert (0, other.vals.len ());
+
+    auto get = other.vals.begin ();
+    auto set = vals.begin ();
+
+    for (int f = 0; f < n_private_fields; f ++)
+    {
+        if (other.setmask & bitmask (f))
+        {
+            if (field_info[f].type == Tuple::String)
+                new (& set->str) String (get->str);
+            else
+                set->x = get->x;
+
+            get ++;
+            set ++;
+        }
+    }
+
+    set_subtunes (other.nsubtunes, other.subtunes);
+}
+
+TupleData::~TupleData ()
+{
+    auto iter = vals.begin ();
+
+    for (int f = 0; f < n_private_fields; f ++)
+    {
+        if (setmask & bitmask (f))
+        {
+            if (field_info[f].type == Tuple::String)
+                iter->str.~String ();
+
+            iter ++;
+        }
+    }
+
+    delete[] subtunes;
+}
+
+bool TupleData::is_same (const TupleData & other)
+{
+    if (setmask != other.setmask || nsubtunes != other.nsubtunes ||
+     (! subtunes) != (! other.subtunes))
+        return false;
+
+    auto a = vals.begin ();
+    auto b = other.vals.begin ();
+
+    for (int f = 0; f < n_private_fields; f ++)
+    {
+        if (setmask & bitmask (f))
+        {
+            bool same;
+
+            if (field_info[f].type == Tuple::String)
+                same = (a->str == b->str);
+            else
+                same = (a->x = b->x);
+
+            if (! same)
+                return false;
+
+            a ++;
+            b ++;
+        }
+    }
+
+    if (subtunes && memcmp (subtunes, other.subtunes, sizeof (int) * nsubtunes))
+        return false;
+
+    return true;
+}
+
+TupleData * TupleData::ref (TupleData * tuple)
+{
+    if (tuple)
+        __sync_fetch_and_add (& tuple->refcount, 1);
+
+    return tuple;
+}
+
+void TupleData::unref (TupleData * tuple)
+{
+    if (tuple && ! __sync_sub_and_fetch (& tuple->refcount, 1))
+        delete tuple;
+}
+
+TupleData * TupleData::copy_on_write (TupleData * tuple)
+{
+    if (! tuple)
+        return new TupleData;
+
+    if (__sync_fetch_and_add (& tuple->refcount, 0) == 1)
+        return tuple;
+
+    TupleData * copy = new TupleData (* tuple);
+    unref (tuple);
+    return copy;
+}
+
+EXPORT Tuple::~Tuple ()
+{
+    TupleData::unref (data);
+}
+
+EXPORT bool Tuple::operator== (const Tuple & b) const
+{
+    if (data == b.data)
+        return true;
+
+    if (! data || ! b.data)
+        return false;
+
+    return data->is_same (* b.data);
+}
+
+EXPORT Tuple Tuple::ref () const
+{
+    Tuple tuple;
+    tuple.data = TupleData::ref (data);
+    return tuple;
+}
+
+EXPORT Tuple::ValueType Tuple::get_value_type (Field field) const
+{
+    assert (is_valid_field (field));
+
+    const auto & info = field_info[field];
+    if (data && (data->is_set (field) || (info.fallback >= 0 && data->is_set (info.fallback))))
+        return info.type;
+
+    return Empty;
+}
+
+EXPORT int Tuple::get_int (Field field) const
+{
+    assert (is_valid_field (field) && field_info[field].type == Int);
+
+    TupleVal * val = data ? data->lookup (field, false, false) : nullptr;
+    return val ? val->x : -1;
+}
+
+EXPORT String Tuple::get_str (Field field) const
+{
+    assert (is_valid_field (field) && field_info[field].type == String);
+
+    TupleVal * val = data ? data->lookup (field, false, false) : nullptr;
+    return val ? val->str : ::String ();
+}
+
+EXPORT void Tuple::set_int (Field field, int x)
+{
+    assert (is_valid_field (field) && field_info[field].type == Int);
+
+    data = TupleData::copy_on_write (data);
+    data->set_int (field, x);
+}
+
+EXPORT void Tuple::set_str (Field field, const char * str)
+{
+    assert (is_valid_field (field) && field_info[field].type == String);
+
+    if (! str)
+    {
+        unset (field);
+        return;
+    }
+
+    data = TupleData::copy_on_write (data);
+
+    if (g_utf8_validate (str, -1, nullptr))
+        data->set_str (field, str);
+    else
+    {
+        StringBuf utf8 = str_to_utf8 (str, -1);
+        data->set_str (field, utf8 ? (const char *) utf8 : _("(character encoding error)"));
+    }
+}
+
+EXPORT void Tuple::unset (Field field)
+{
+    assert (is_valid_field (field));
+
+    if (! data)
+        return;
+
+    data = TupleData::copy_on_write (data);
+    data->lookup (field, false, true);
+}
+
+EXPORT void Tuple::set_filename (const char * filename)
+{
+    assert (filename);
+
+    const char * base, * ext, * sub;
+    int isub;
+
+    uri_parse (filename, & base, & ext, & sub, & isub);
+
+    data = TupleData::copy_on_write (data);
+
+    if (base > filename)
+        data->set_str (Path, uri_to_display (str_copy (filename, base - filename)));
+    if (ext > base)
+        data->set_str (Basename, str_to_utf8 (str_decode_percent (base, ext - base)));
+    if (sub > ext + 1)
+        data->set_str (Suffix, str_to_utf8 (str_decode_percent (ext + 1, sub - ext - 1)));
+
+    if (sub[0])
+        data->set_int (Subtune, isub);
+}
+
+EXPORT void Tuple::set_format (const char * format, int chans, int rate, int brate)
+{
+    if (format)
+        set_str (Codec, format);
+
+    StringBuf buf;
+
+    if (chans > 0)
+    {
+        if (chans == 1)
+            buf.insert (-1, _("Mono"));
+        else if (chans == 2)
+            buf.insert (-1, _("Stereo"));
+        else
+            buf.combine (str_printf (dngettext (PACKAGE, "%d channel", "%d channels", chans), chans));
+
+        if (rate > 0)
+            buf.insert (-1, ", ");
+    }
+
+    if (rate > 0)
+        buf.combine (str_printf ("%d kHz", rate / 1000));
+
+    if (buf[0])
+        set_str (Quality, buf);
+
+    if (brate > 0)
+        set_int (Bitrate, brate);
+}
+
+EXPORT void Tuple::set_subtunes (int n_subtunes, const int * subtunes)
+{
+    data = TupleData::copy_on_write (data);
+    data->set_subtunes (n_subtunes, subtunes);
+}
+
+EXPORT int Tuple::get_n_subtunes () const
+{
+    return data ? data->nsubtunes : 0;
+}
+
+EXPORT int Tuple::get_nth_subtune (int n) const
+{
+    if (! data || n < 0 || n >= data->nsubtunes)
+        return -1;
+
+    return data->subtunes ? data->subtunes[n] : 1 + n;
+}
+
+EXPORT ReplayGainInfo Tuple::get_replay_gain () const
+{
+    ReplayGainInfo gain {};
+
+    if (! data)
+        return gain;
+
+    int gain_unit = get_int (GainDivisor);
+    int peak_unit = get_int (PeakDivisor);
+
+    if (gain_unit > 0)
+    {
+        if (data->is_set (AlbumGain))
+            gain.album_gain = get_int (AlbumGain) / (float) gain_unit;
+        if (data->is_set (TrackGain))
+            gain.track_gain = get_int (TrackGain) / (float) gain_unit;
+    }
+
+    if (peak_unit > 0)
+    {
+        if (data->is_set (AlbumPeak))
+            gain.album_peak = get_int (AlbumPeak) / (float) peak_unit;
+        if (data->is_set (TrackPeak))
+            gain.track_peak = get_int (TrackPeak) / (float) peak_unit;
+    }
+
+    return gain;
+}
+
+EXPORT bool Tuple::fetch_stream_info (VFSFile & stream)
+{
+    bool updated = false;
+    int value;
+
+    ::String val = stream.get_metadata ("track-name");
+
+    if (val && val != get_str (Title))
+    {
+        set_str (Title, val);
+        updated = true;
+    }
+
+    val = stream.get_metadata ("stream-name");
+
+    if (val && val != get_str (Artist))
+    {
+        set_str (Artist, val);
+        updated = true;
+    }
+
+    val = stream.get_metadata ("content-bitrate");
+    value = val ? atoi (val) / 1000 : 0;
+
+    if (value && value != get_int (Bitrate))
+    {
+        set_int (Bitrate, value);
+        updated = true;
+    }
+
+    return updated;
+}
+
+/* Separates the lowest-level folder from a file path.  The string passed will
+ * be modified, and the string returned will use the same memory.  May return
+ * nullptr. */
+
+static char * split_folder (char * path)
+{
+    char * c;
+    while ((c = strrchr (path, G_DIR_SEPARATOR)))
+    {
+        * c = 0;
+        if (c[1])
+            return c + 1;
+    }
+
+    return path[0] ? path : nullptr;
+}
+
+/* Separates the domain name from an internet URI.  The string passed will be
+ * modified, and the string returned will share the same memory.  May return
+ * nullptr.  Examples:
+ *     "http://some.domain.org/folder/file.mp3" -> "some.domain.org"
+ *     "http://some.stream.fm:8000"             -> "some.stream.fm" */
+
+static char * domain_name (char * name)
+{
+    if (! strncmp (name, "http://", 7))
+        name += 7;
+    else if (! strncmp (name, "https://", 8))
+        name += 8;
+    else if (! strncmp (name, "mms://", 6))
+        name += 6;
+    else
+        return nullptr;
+
+    char * c;
+
+    if ((c = strchr (name, '/')))
+        * c = 0;
+    if ((c = strchr (name, ':')))
+        * c = 0;
+    if ((c = strchr (name, '?')))
+        * c = 0;
+
+    return name;
+}
+
+EXPORT void Tuple::generate_fallbacks ()
+{
+    if (! data)
+        return;
+
+    ::String title = get_str (Title);
+    ::String artist = get_str (Artist);
+    ::String album = get_str (Album);
+
+    if (title && artist && album)
+        return;
+
+    ::String filename = get_str (Basename);
+    ::String filepath = get_str (Path);
+    int subtune = get_int (Subtune);
+
+    data = TupleData::copy_on_write (data);
+
+    if (filepath && ! strcmp (filepath, "cdda://"))
+    {
+        // audio CD:
+        // use "Track N" as the title and "Audio CD" as the album
+
+        if (! title && subtune >= 0)
+            data->set_str (FallbackTitle, str_printf (_("Track %d"), subtune));
+        if (! album)
+            data->set_str (FallbackAlbum, _("Audio CD"));
+
+        return;
+    }
+
+    if (! title)
+        data->set_str (FallbackTitle, filename ? (const char *) filename : _("(unknown title)"));
+
+    if (! filepath)
+        return;
+
+    if (strstr (filepath, "://"))
+    {
+        // URL:
+        // use the domain name as the album
+
+        if (album)
+            return;
+
+        StringBuf buf = str_copy (filepath);
+        const char * domain = domain_name (buf);
+
+        if (domain)
+            data->set_str (FallbackAlbum, domain);
+    }
+    else
+    {
+        // local file:
+        // use the top two path elements as the artist and album
+
+        if (artist && album)
+            return;
+
+        StringBuf buf;
+#ifdef _WIN32
+        if (filepath[0] && filepath[1] == ':' && filepath[2] == '\\')
+            buf.steal (str_copy (filepath + 3));
+        else
+#endif
+            buf.steal (str_copy (filepath));
+
+        char * first = split_folder (buf);
+        char * second = (first && first > buf) ? split_folder (buf) : nullptr;
+
+        // skip common strings and avoid duplicates
+        for (auto skip : (const char *[]) {"~", "music", artist, album})
+        {
+            if (first && skip && ! strcmp_nocase (first, skip))
+            {
+                first = second;
+                second = nullptr;
+            }
+
+            if (second && skip && ! strcmp_nocase (second, skip))
+                second = nullptr;
+        }
+
+        if (first)
+        {
+            if (second && ! artist && ! album)
+            {
+                data->set_str (FallbackArtist, second);
+                data->set_str (FallbackAlbum, first);
+            }
+            else
+                data->set_str (artist ? FallbackAlbum : FallbackArtist, first);
+        }
+    }
+}
+
+EXPORT void Tuple::delete_fallbacks ()
+{
+    if (! data)
+        return;
+
+    data = TupleData::copy_on_write (data);
+    data->lookup (FallbackTitle, false, true);
+    data->lookup (FallbackArtist, false, true);
+    data->lookup (FallbackAlbum, false, true);
+}
diff --git a/src/libaudcore/tuple.h b/src/libaudcore/tuple.h
index 873f699a618f..b4e2efd6a049 100644
--- a/src/libaudcore/tuple.h
+++ b/src/libaudcore/tuple.h
@@ -26,155 +26,186 @@
 #ifndef LIBAUDCORE_TUPLE_H
 #define LIBAUDCORE_TUPLE_H
 
-#include <libaudcore/core.h>
+#include <libaudcore/objects.h>
+
+struct ReplayGainInfo;
+struct TupleData;
+class VFSFile;
+
+class Tuple
+{
+public:
+    /* Smart pointer to the actual TupleData struct.
+     * Uses create-on-write and copy-on-write. */
+
+    enum Field {
+        Invalid = -1,
+
+        Title = 0,    /* Song title */
+        Artist,       /* Song artist */
+        Album,        /* Album name */
+        Comment,      /* Freeform comment */
+        Genre,        /* Song's genre */
+
+        Track,        /* Track number */
+        Length,       /* Track length in milliseconds */
+        Year,         /* Year of production, performance, etc. */
+        Quality,      /* String representing quality, such as "Stereo, 44 kHz" */
+        Codec,        /* Codec name, such as "Ogg Vorbis" */
+
+        Basename,     /* Base filename, not including the folder path */
+        Path,         /* Folder path, including the trailing "/" */
+        Suffix,       /* Filename extension, not including the "." */
+
+        AlbumArtist,  /* Artist for entire album, if different than song artist */
+        Composer,     /* Composer of song, if different than artist */
+        Performer,
+        Copyright,
+        Date,
+        MusicBrainz,  /* MusicBrainz identifer for the song */
+        MIMEType,
+        Bitrate,      /* Bitrate in kbits/sec */
+
+        Subtune,      /* Index number of subtune */
+        NumSubtunes,  /* Total number of subtunes in the file */
+
+        StartTime,
+        EndTime,
+
+        /* Preserving replay gain information accurately is a challenge since there
+         * are several differents formats around.  We use an integer fraction, with
+         * the denominator stored in the *Divisor fields.  For example, if AlbumGain
+         * is 512 and GainDivisor is 256, then the album gain is +2 dB.  If TrackPeak
+         * is 787 and PeakDivisor is 1000, then the peak volume is 0.787 in a -1.0 to
+         * 1.0 range. */
+        AlbumGain,
+        AlbumPeak,
+        TrackGain,
+        TrackPeak,
+        GainDivisor,
+        PeakDivisor,
+
+        /* Title formatted for display; input plugins do not need to set this field */
+        FormattedTitle,
+
+        n_fields
+    };
+
+    typedef aud::range<Field, Title, FormattedTitle> all_fields;
+
+    enum ValueType {
+        String,
+        Int,
+        Empty
+    };
+
+    static Field field_by_name (const char * name);
+    static const char * field_get_name (Field field);
+    static ValueType field_get_type (Field field);
+
+    constexpr Tuple () :
+        data (nullptr) {}
+
+    ~Tuple ();
+
+    Tuple (Tuple && b) :
+        data (b.data)
+    {
+        b.data = nullptr;
+    }
+
+    Tuple & operator= (Tuple && b)
+    {
+        if (this != & b)
+        {
+            this->~Tuple ();
+            data = b.data;
+            b.data = nullptr;
+        }
+        return * this;
+    }
+
+    explicit operator bool () const
+        { return (bool) data; }
+
+    bool operator== (const Tuple & b) const;
+    bool operator!= (const Tuple & b) const
+        { return ! operator== (b); }
+
+    Tuple ref () const;
+
+    /* Returns the value type of a field if set, otherwise Empty. */
+    ValueType get_value_type (Field field) const;
+
+    /* Returns the integer value of a field if set, otherwise -1.  If you need
+     * to distinguish between a value of -1 and an unset value, use
+     * get_value_type(). */
+    int get_int (Field field) const;
+
+    /* Returns the string value of a field if set, otherwise null. */
+    ::String get_str (Field field) const;
+
+    /* Sets a field to the integer value <x>. */
+    void set_int (Field field, int x);
+
+    /* Sets a field to the string value <str>.  If <str> is not valid UTF-8, it
+     * will be converted according to the user's character set detection rules.
+     * Equivalent to unset() if <str> is null. */
+    void set_str (Field field, const char * str);
+
+    /* Clears any value that a field is currently set to. */
+    void unset (Field field);
+
+    /* Parses the URI <filename> and sets Basename, Path, Suffix, and Subtune accordingly. */
+    void set_filename (const char * filename);
+
+    /* Fills in format-related fields (specifically Codec, Quality,
+     * and Bitrate).  Plugins should use this function instead of setting
+     * these fields individually to allow a consistent style across file
+     * formats.  <format> should be a brief description such as "Ogg Vorbis",
+     * "MPEG-1 layer 3", "Audio CD", and so on.  <samplerate> is in Hertz.
+     * <bitrate> is in (decimal) kbps. */
+    void set_format (const char * format, int channels, int samplerate, int bitrate);
+
+    /* In addition to the normal fields, tuples contain an integer array of
+     * subtune ID numbers.  This function sets that array.  It also sets
+     * NumSubtunes to the value <n_subtunes>. */
+    void set_subtunes (int n_subtunes, const int * subtunes);
+
+    /* Returns the length of the subtune array.  If the array has not been set,
+     * returns zero.  Note that if NumSubtunes is changed after
+     * set_subtunes() is called, this function returns the value <n_subtunes>
+     * passed to set_subtunes(), not the value of NumSubtunes. */
+    int get_n_subtunes () const;
+
+    /* Returns the <n>th member of the subtune array. */
+    int get_nth_subtune (int n) const;
+
+    /* Fills ReplayGainInfo struct from various fields. */
+    ReplayGainInfo get_replay_gain () const;
 
-/** Ordered enum for basic #Tuple fields.
- * @sa TupleBasicType
- */
-enum {
-    FIELD_ARTIST = 0,
-    FIELD_TITLE,        /**< Song title */
-    FIELD_ALBUM,        /**< Album name */
-    FIELD_COMMENT,      /**< Freeform comment */
-    FIELD_GENRE,        /**< Song's genre */
-
-    FIELD_TRACK_NUMBER,
-    FIELD_LENGTH,       /**< Track length in milliseconds */
-    FIELD_YEAR,         /**< Year of production/performance/etc */
-    FIELD_QUALITY,      /**< String representing quality, such as
-                             "lossy", "lossless", "sequenced"  */
-
-    FIELD_CODEC,        /**< Codec name or similar */
-    FIELD_FILE_NAME,    /**< File name part of the location URI */
-    FIELD_FILE_PATH,    /**< Path part of the location URI */
-    FIELD_FILE_EXT,     /**< Filename extension part of the location URI */
-
-    FIELD_SONG_ARTIST,
-    FIELD_COMPOSER,     /**< Composer of song, if different than artist. */
-    FIELD_PERFORMER,
-    FIELD_COPYRIGHT,
-    FIELD_DATE,
-
-    FIELD_SUBSONG_ID,   /**< Index number of subsong/tune */
-    FIELD_SUBSONG_NUM,  /**< Total number of subsongs in the file */
-    FIELD_MIMETYPE,
-    FIELD_BITRATE,      /**< Bitrate in kbps */
-
-    FIELD_SEGMENT_START,
-    FIELD_SEGMENT_END,
-
-    /* Preserving replay gain information accurately is a challenge since there
-     * are several differents formats around.  We use an integer fraction, with
-     * the denominator stored in the *_UNIT fields.  For example, if ALBUM_GAIN
-     * is 512 and GAIN_UNIT is 256, then the album gain is +2 dB.  If TRACK_PEAK
-     * is 787 and PEAK_UNIT is 1000, then the peak volume is 0.787 in a -1.0 to
-     * 1.0 range. */
-    FIELD_GAIN_ALBUM_GAIN,
-    FIELD_GAIN_ALBUM_PEAK,
-    FIELD_GAIN_TRACK_GAIN,
-    FIELD_GAIN_TRACK_PEAK,
-    FIELD_GAIN_GAIN_UNIT,
-    FIELD_GAIN_PEAK_UNIT,
-
-    TUPLE_FIELDS
+    /* Set various fields based on the ICY metadata of <stream>.  Returns true
+     * if any fields were changed. */
+    bool fetch_stream_info (VFSFile & stream);
+
+    /* Guesses the song title, artist, and album, if not already set, from the
+     * filename. */
+    void generate_fallbacks ();
+
+    /* Removes guesses made by generate_fallbacks().  This function should be
+     * called, for example, before writing a song tag from the tuple. */
+    void delete_fallbacks ();
+
+private:
+    TupleData * data;
 };
 
-typedef enum {
-    TUPLE_STRING,
-    TUPLE_INT,
-    TUPLE_UNKNOWN
-} TupleValueType;
-
-int tuple_field_by_name (const char * name);
-const char * tuple_field_get_name (int field);
-TupleValueType tuple_field_get_type (int field);
-
-typedef struct _Tuple Tuple;
-typedef struct _TupleFormatter TupleFormatter;
-
-/* Creates a new, blank tuple with a reference count of one. */
-Tuple * tuple_new (void);
-
-/* Increments the reference count of <tuple> by one. */
-Tuple * tuple_ref (Tuple * tuple);
-
-/* Decrements the reference count of <tuple> by one.  If the reference count
- * drops to zero, releases all memory used by <tuple>.  If <tuple> is NULL, does
- * nothing. */
-void tuple_unref (Tuple * tuple);
-
-/* Makes a copy of <tuple>.  Only use tuple_copy() if you need to modify one
- * copy of the tuple while not modifying the other.  In most cases, tuple_ref()
- * is more appropriate. */
-Tuple * tuple_copy (const Tuple * tuple);
-
-/* Parses the URI <filename> and sets FIELD_FILE_NAME, FIELD_FILE_PATH,
- * FIELD_FILE_EXT, and FIELD_SUBSONG_ID accordingly. */
-void tuple_set_filename (Tuple * tuple, const char * filename);
-
-/* Convenience function, equivalent to calling tuple_new() and then
- * tuple_set_filename(). */
-Tuple * tuple_new_from_filename (const char * filename);
-
-/* Sets a field to the integer value <x>. */
-void tuple_set_int (Tuple * tuple, int field, int x);
-
-/* Sets a field to the string value <str>.  If <str> is not valid UTF-8, it will
- * be converted according to the user's character set detection rules.  As a
- * special case, if <str> is NULL, the result is equivalent to calling
- * tuple_unset(). */
-void tuple_set_str (Tuple * tuple, int field, const char * str);
-
-/* Clears any value that a field is currently set to. */
-void tuple_unset (Tuple * tuple, int field);
-
-/* Returns the value type of a field, or TUPLE_UNKNOWN if the field has not been
- * set to any value. */
-TupleValueType tuple_get_value_type (const Tuple * tuple, int field);
-
-/* Returns the string value of a field.  The returned string is pooled and must
- * be released with str_unref() when no longer needed.  If the field has not
- * been set to any value, returns NULL. */
-char * tuple_get_str (const Tuple * tuple, int field);
-
-/* Returns the integer value of a field.  If the field has not been set to any
- * value, returns -1.  If you need to distinguish between a value of -1 and a
- * field not set to any value, use tuple_get_value_type(). */
-int tuple_get_int (const Tuple * tuple, int field);
-
-/* Fills in format-related fields (specifically FIELD_CODEC, FIELD_QUALITY, and
- * FIELD_BITRATE).  Plugins should use this function instead of setting these
- * fields individually so that the style is consistent across file formats.
- * <format> should be a brief description such as "Microsoft WAV", "MPEG-1 layer
- * 3", "Audio CD", and so on.  <samplerate> is in Hertz.  <bitrate> is in 1000
- * bits per second. */
-void tuple_set_format (Tuple * tuple, const char * format, int channels, int
- samplerate, int bitrate);
-
-/* In addition to the normal fields, tuples contain an integer array of subtune
- * ID numbers.  This function sets that array.  It also sets FIELD_SUBSONG_NUM
- * to the value <n_subtunes>. */
-void tuple_set_subtunes (Tuple * tuple, int n_subtunes, const int * subtunes);
-
-/* Returns the length of the subtune array.  If the array has not been set,
- * returns zero.  Note that if FIELD_SUBSONG_NUM is changed after
- * tuple_set_subtunes() is called, this function returns the value <n_subtunes>
- * passed to tuple_set_subtunes(), not the value of FIELD_SUBSONG_NUM. */
-int tuple_get_n_subtunes (Tuple * tuple);
-
-/* Returns the <n>th member of the subtune array. */
-int tuple_get_nth_subtune (Tuple * tuple, int n);
-
-/* Creates a tuple formatter object for the given format.  The syntax of
- * <format> is documented in tuple_formatter.c. */
-TupleFormatter * tuple_formatter_new (const char * format);
-
-/* Destroys a tuple formatter object. */
-void tuple_formatter_free (TupleFormatter * formatter);
-
-/* Generates a title string for <tuple> using the given formatter object.  The
- * returned string is pooled and must be released with str_unref() when no
- * longer needed.  Never returns NULL, but may return an empty string. */
-char * tuple_format_title (TupleFormatter * formatter, const Tuple * tuple);
+/* somewhat out of place here */
+class PluginHandle;
+struct PlaylistAddItem {
+    String filename;
+    Tuple tuple;
+    PluginHandle * decoder;
+};
 
 #endif /* LIBAUDCORE_TUPLE_H */
diff --git a/src/libaudcore/tuple_compiler.c b/src/libaudcore/tuple_compiler.c
deleted file mode 100644
index 99d53b478b03..000000000000
--- a/src/libaudcore/tuple_compiler.c
+++ /dev/null
@@ -1,708 +0,0 @@
-/*
- * tuple_compiler.c
- * Copyright (c) 2007 Matti 'ccr' Hämäläinen
- * Copyright (c) 2011-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-/*
- * TODO:
- * - Unicode/UTF-8 support in format strings. using any non-ASCII
- *   characters in Tuplez format strings WILL cause things go boom
- *   at the moment!
- *
- * - implement definitions (${=foo,"baz"} ${=foo,1234})
- * - implement functions
- * - implement handling of external expressions
- * - evaluation context: how local variables should REALLY work?
- *   currently there is just a single context, is a "global" context needed?
- */
-
-#include <stdarg.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include "audstrings.h"
-#include "tuple_compiler.h"
-
-#define MAX_STR   (256)
-#define TUPLEZ_MAX_VARS (4)
-
-#define GET_VAR(c, i)  (& g_array_index ((c), TupleEvalVar, (i)))
-
-#define tuple_error(ctx, ...) fprintf (stderr, "Tuple compiler: " __VA_ARGS__)
-
-enum {
-    OP_RAW = 0,   /* plain text */
-    OP_FIELD,   /* a field/variable */
-    OP_EXISTS,
-    OP_EQUALS,
-    OP_NOT_EQUALS,
-    OP_GT,
-    OP_GTEQ,
-    OP_LT,
-    OP_LTEQ,
-    OP_IS_EMPTY
-};
-
-enum {
-    TUPLE_VAR_FIELD = 0,
-    TUPLE_VAR_CONST
-};
-
-struct _TupleEvalNode {
-    int opcode;   /* operator, see OP_ enums */
-    int var[TUPLEZ_MAX_VARS]; /* tuple variable references */
-    char *text;   /* raw text, if any (OP_RAW) */
-    struct _TupleEvalNode *children, *next, *prev; /* children of this struct, and pointer to next node. */
-};
-
-typedef struct {
-    char *name;
-    int type;     /* Type of variable, see VAR_* */
-    int defvali;
-    TupleValueType ctype; /* Type of constant/def value */
-
-    int fieldidx;   /* if >= 0: Index # of "pre-defined" Tuple fields */
-    bool_t fieldread, fieldvalid;
-    char * fieldstr;
-} TupleEvalVar;
-
-/* Initialize an evaluation context
- */
-TupleEvalContext * tuple_evalctx_new(void)
-{
-  return g_array_new (FALSE, TRUE, sizeof (TupleEvalVar));
-}
-
-
-/* "Reset" the evaluation context
- */
-void tuple_evalctx_reset(TupleEvalContext *ctx)
-{
-  for (int i = 0; i < ctx->len; i ++)
-  {
-    TupleEvalVar * var = GET_VAR (ctx, i);
-
-    var->fieldread = FALSE;
-    var->fieldvalid = FALSE;
-    str_unref (var->fieldstr);
-    var->fieldstr = NULL;
-  }
-}
-
-
-/* Free an evaluation context and associated data
- */
-void tuple_evalctx_free(TupleEvalContext *ctx)
-{
-  for (int i = 0; i < ctx->len; i ++)
-  {
-    TupleEvalVar * var = GET_VAR (ctx, i);
-
-    str_unref (var->name);
-    str_unref (var->fieldstr);
-  }
-
-  g_array_free (ctx, TRUE);
-}
-
-
-/* note: may invalidate TupleEvalVar pointers due to reallocation */
-static int tuple_evalctx_add_var (TupleEvalContext * ctx, const char * name,
- const int type, const TupleValueType ctype)
-{
-  int field = -1;
-
-  if (type == TUPLE_VAR_FIELD)
-  {
-    field = tuple_field_by_name (name);
-    if (field < 0)
-      return -1;
-  }
-
-  int i = ctx->len;
-  g_array_set_size (ctx, i + 1);
-
-  TupleEvalVar * var = GET_VAR (ctx, i);
-
-  var->name = str_get (name);
-  var->type = type;
-  var->fieldidx = field;
-  var->ctype = ctype;
-
-  switch (type) {
-    case TUPLE_VAR_FIELD:
-      var->ctype = tuple_field_get_type (field);
-      break;
-
-    case TUPLE_VAR_CONST:
-      if (ctype == TUPLE_INT)
-        var->defvali = atoi (name);
-      break;
-  }
-
-  return i;
-}
-
-
-static void tuple_evalnode_insert(TupleEvalNode **nodes, TupleEvalNode *node)
-{
-  if (*nodes) {
-    node->prev = (*nodes)->prev;
-    (*nodes)->prev->next = node;
-    (*nodes)->prev = node;
-    node->next = NULL;
-  } else {
-    *nodes = node;
-    node->prev = node;
-    node->next = NULL;
-  }
-}
-
-
-void tuple_evalnode_free(TupleEvalNode *expr)
-{
-  TupleEvalNode *curr = expr, *next;
-
-  while (curr) {
-    next = curr->next;
-
-    str_unref (curr->text);
-
-    if (curr->children)
-      tuple_evalnode_free(curr->children);
-
-    g_slice_free (TupleEvalNode, curr);
-
-    curr = next;
-  }
-}
-
-
-static TupleEvalNode *tuple_compiler_pass1(int *level, TupleEvalContext *ctx, const char **expression);
-
-
-static bool_t tc_get_item(TupleEvalContext *ctx,
-    const char **str, char *buf, gssize max,
-    char endch, bool_t *literal, char *errstr, const char *item)
-{
-  gssize i = 0;
-  const char *s = *str;
-  char tmpendch;
-
-  if (*s == '"') {
-    if (*literal == FALSE) {
-      tuple_error(ctx, "Literal string value not allowed in '%s'.\n", item);
-      return FALSE;
-    }
-    s++;
-    *literal = TRUE;
-    tmpendch = '"';
-  } else {
-    *literal = FALSE;
-    tmpendch = endch;
-  }
-
-  if (*literal == FALSE) {
-    while (*s != '\0' && *s != tmpendch && (g_ascii_isalnum(*s) || *s == '-') && i < (max - 1)) {
-      buf[i++] = *(s++);
-    }
-
-    if (*s != tmpendch && *s != '}' && !g_ascii_isalnum(*s) && *s != '-') {
-      tuple_error(ctx, "Invalid field '%s' in '%s'.\n", *str, item);
-      return FALSE;
-    } else if (*s != tmpendch) {
-      tuple_error(ctx, "Expected '%c' in '%s'.\n", tmpendch, item);
-      return FALSE;
-    }
-  } else {
-    while (*s != '\0' && *s != tmpendch && i < (max - 1)) {
-      if (*s == '\\') {
-        s++;
-        if (*s == '\0')
-          break;
-      }
-      buf[i++] = *(s++);
-    }
-  }
-  buf[i] = '\0';
-
-  if (*literal) {
-    if (*s == tmpendch)
-      s++;
-    else {
-      tuple_error(ctx, "Expected literal string end ('%c') in '%s'.\n", tmpendch, item);
-      return FALSE;
-    }
-  }
-
-  if (*s != endch) {
-    tuple_error(ctx, "Expected '%c' after %s in '%s'\n", endch, errstr, item);
-    return FALSE;
-  } else {
-    *str = s;
-    return TRUE;
-  }
-}
-
-
-static int tc_get_variable(TupleEvalContext *ctx, char *name, int type)
-{
-  TupleValueType ctype = TUPLE_UNKNOWN;
-
-  if (g_ascii_isdigit(name[0])) {
-    ctype = TUPLE_INT;
-    type = TUPLE_VAR_CONST;
-  } else
-    ctype = TUPLE_STRING;
-
-  if (type != TUPLE_VAR_CONST) {
-    for (int i = 0; i < ctx->len; i ++)
-    {
-      TupleEvalVar * var = GET_VAR (ctx, i);
-      if (var->type == type && ! strcmp (var->name, name))
-        return i;
-    }
-  }
-
-  return tuple_evalctx_add_var(ctx, name, type, ctype);
-}
-
-
-static bool_t tc_parse_construct(TupleEvalContext *ctx, TupleEvalNode **res,
- const char *item, const char **c, int *level, int opcode)
-{
-  char tmps1[MAX_STR], tmps2[MAX_STR];
-  bool_t literal1 = TRUE, literal2 = TRUE;
-
-  if (tc_get_item(ctx, c, tmps1, MAX_STR, ',', &literal1, "tag1", item)) {
-    (*c)++;
-    if (tc_get_item(ctx, c, tmps2, MAX_STR, ':', &literal2, "tag2", item)) {
-      TupleEvalNode *tmp = g_slice_new0 (TupleEvalNode);
-      (*c)++;
-
-      tmp->opcode = opcode;
-      if ((tmp->var[0] = tc_get_variable(ctx, tmps1, literal1 ? TUPLE_VAR_CONST : TUPLE_VAR_FIELD)) < 0) {
-        tuple_evalnode_free(tmp);
-        tuple_error(ctx, "Invalid variable '%s' in '%s'.\n", tmps1, item);
-        return FALSE;
-      }
-      if ((tmp->var[1] = tc_get_variable(ctx, tmps2, literal2 ? TUPLE_VAR_CONST : TUPLE_VAR_FIELD)) < 0) {
-        tuple_evalnode_free(tmp);
-        tuple_error(ctx, "Invalid variable '%s' in '%s'.\n", tmps2, item);
-        return FALSE;
-      }
-      tmp->children = tuple_compiler_pass1(level, ctx, c);
-      tuple_evalnode_insert(res, tmp);
-    } else
-      return FALSE;
-  } else
-    return FALSE;
-
-  return TRUE;
-}
-
-
-/* Compile format expression into TupleEvalNode tree.
- * A "simple" straight compilation is sufficient in first pass, later
- * passes can perform subexpression removal and other optimizations.
- */
-static TupleEvalNode *tuple_compiler_pass1(int *level, TupleEvalContext *ctx, const char **expression)
-{
-  TupleEvalNode *res = NULL, *tmp = NULL;
-  const char *c = *expression, *item;
-  char tmps1[MAX_STR];
-  bool_t literal, end = FALSE;
-
-  (*level)++;
-
-  while (*c != '\0' && !end) {
-    tmp = NULL;
-    if (*c == '}') {
-      c++;
-      (*level)--;
-      end = TRUE;
-    } else if (*c == '$') {
-      /* Expression? */
-      item = c++;
-      if (*c == '{') {
-        int opcode;
-        const char *expr = ++c;
-
-        switch (*c) {
-          case '?': c++;
-            /* Exists? */
-            literal = FALSE;
-            if (tc_get_item(ctx, &c, tmps1, MAX_STR, ':', &literal, "tag", item)) {
-              c++;
-              tmp = g_slice_new0 (TupleEvalNode);
-              tmp->opcode = OP_EXISTS;
-              if ((tmp->var[0] = tc_get_variable(ctx, tmps1, TUPLE_VAR_FIELD)) < 0) {
-                tuple_error(ctx, "Invalid variable '%s' in '%s'.\n", tmps1, expr);
-                goto ret_error;
-              }
-              tmp->children = tuple_compiler_pass1(level, ctx, &c);
-              tuple_evalnode_insert(&res, tmp);
-            } else
-              goto ret_error;
-            break;
-
-          case '=': c++;
-            if (*c != '=') goto ret_error;
-            c++;
-            /* Equals? */
-            if (!tc_parse_construct(ctx, &res, item, &c, level, OP_EQUALS))
-              goto ret_error;
-            break;
-
-          case '!': c++;
-            if (*c != '=') goto ret_error;
-            c++;
-            if (!tc_parse_construct(ctx, &res, item, &c, level, OP_NOT_EQUALS))
-              goto ret_error;
-            break;
-
-          case '<': c++;
-            if (*c == '=') {
-              opcode = OP_LTEQ;
-              c++;
-            } else
-              opcode = OP_LT;
-
-            if (!tc_parse_construct(ctx, &res, item, &c, level, opcode))
-              goto ret_error;
-            break;
-
-          case '>': c++;
-            if (*c == '=') {
-              opcode = OP_GTEQ;
-              c++;
-            } else
-              opcode = OP_GT;
-
-            if (!tc_parse_construct(ctx, &res, item, &c, level, opcode))
-              goto ret_error;
-            break;
-
-          case '(': c++;
-            if (!strncmp(c, "empty)?", 7)) {
-              c += 7;
-              literal = FALSE;
-              if (tc_get_item(ctx, &c, tmps1, MAX_STR, ':', &literal, "tag", item)) {
-                c++;
-                tmp = g_slice_new0 (TupleEvalNode);
-                tmp->opcode = OP_IS_EMPTY;
-                if ((tmp->var[0] = tc_get_variable(ctx, tmps1, TUPLE_VAR_FIELD)) < 0) {
-                  tuple_error(ctx, "Invalid variable '%s' in '%s'.\n", tmps1, expr);
-                  goto ret_error;
-                }
-                tmp->children = tuple_compiler_pass1(level, ctx, &c);
-                tuple_evalnode_insert(&res, tmp);
-              } else
-                goto ret_error;
-            } else
-              goto ret_error;
-            break;
-
-          default:
-            /* Get expression content */
-            c = expr;
-            literal = FALSE;
-            if (tc_get_item(ctx, &c, tmps1, MAX_STR, '}', &literal, "field", item)) {
-              /* FIXME!! FIX ME! Check for external expressions */
-
-              /* I HAS A FIELD - A field. You has it. */
-              tmp = g_slice_new0 (TupleEvalNode);
-              tmp->opcode = OP_FIELD;
-              if ((tmp->var[0] = tc_get_variable(ctx, tmps1, TUPLE_VAR_FIELD)) < 0) {
-                tuple_error(ctx, "Invalid variable '%s' in '%s'.\n", tmps1, expr);
-                goto ret_error;
-              }
-              tuple_evalnode_insert(&res, tmp);
-              c++;
-
-            } else
-              goto ret_error;
-        }
-      } else {
-        tuple_error(ctx, "Expected '{', got '%c' in '%s'.\n", *c, c);
-        goto ret_error;
-      }
-    } else {
-      /* Parse raw/literal text */
-      gssize i = 0;
-      while (*c != '\0' && *c != '$' && *c != '}' && i < (MAX_STR - 1)) {
-        if (*c == '\\') {
-          c++;
-          if (*c == '\0')
-            break;
-        }
-        tmps1[i++] = *(c++);
-      }
-      tmps1[i] = '\0';
-
-      tmp = g_slice_new0 (TupleEvalNode);
-      tmp->opcode = OP_RAW;
-      tmp->text = str_get (tmps1);
-      tuple_evalnode_insert(&res, tmp);
-    }
-  }
-
-  if (*level <= 0) {
-    tuple_error(ctx, "Syntax error! Uneven/unmatched nesting of elements in '%s'!\n", c);
-    goto ret_error;
-  }
-
-  *expression = c;
-  return res;
-
-ret_error:
-  tuple_evalnode_free(tmp);
-  tuple_evalnode_free(res);
-  return NULL;
-}
-
-
-TupleEvalNode *tuple_formatter_compile(TupleEvalContext *ctx, const char *expr)
-{
-  int level = 0;
-  const char *tmpexpr = expr;
-  TupleEvalNode *res1;
-
-  res1 = tuple_compiler_pass1(&level, ctx, &tmpexpr);
-
-  if (level != 1) {
-    tuple_error(ctx, "Syntax error! Uneven/unmatched nesting of elements! (%d)\n", level);
-    tuple_evalnode_free(res1);
-    return NULL;
-  }
-
-  return res1;
-}
-
-
-/* Fetch a tuple field value.  Return TRUE if found. */
-static bool_t tf_get_fieldval (TupleEvalVar * var, const Tuple * tuple)
-{
-  if (var->type != TUPLE_VAR_FIELD || var->fieldidx < 0)
-    return FALSE;
-
-  if (var->fieldread)
-    return var->fieldvalid;
-
-  if (tuple_get_value_type (tuple, var->fieldidx) != var->ctype) {
-    var->fieldread = TRUE;
-    var->fieldvalid = FALSE;
-    return FALSE;
-  }
-
-  if (var->ctype == TUPLE_INT)
-    var->defvali = tuple_get_int (tuple, var->fieldidx);
-  else if (var->ctype == TUPLE_STRING)
-    var->fieldstr = tuple_get_str (tuple, var->fieldidx);
-
-  var->fieldread = TRUE;
-  var->fieldvalid = TRUE;
-  return TRUE;
-}
-
-
-/* Fetch string or int value of given variable, whatever type it might be.
- * Return VAR_* type for the variable.
- */
-static TupleValueType tf_get_var (char * * tmps, int * tmpi, TupleEvalVar *
- var, const Tuple * tuple)
-{
-  TupleValueType type = TUPLE_UNKNOWN;
-  *tmps = NULL;
-  *tmpi = 0;
-
-  switch (var->type) {
-    case TUPLE_VAR_CONST:
-      switch (var->ctype) {
-        case TUPLE_STRING: *tmps = var->name; break;
-        case TUPLE_INT: *tmpi = var->defvali; break;
-        default: /* Cannot happen */ break;
-      }
-      type = var->ctype;
-      break;
-
-    case TUPLE_VAR_FIELD:
-      if (tf_get_fieldval (var, tuple)) {
-        type = var->ctype;
-        if (type == TUPLE_INT)
-          * tmpi = var->defvali;
-        else if (type == TUPLE_STRING)
-          * tmps = var->fieldstr;
-      }
-      break;
-  }
-
-  return type;
-}
-
-
-/* Evaluate tuple in given TupleEval expression in given
- * context and return resulting string.
- */
-static bool_t tuple_formatter_eval_do (TupleEvalContext * ctx, TupleEvalNode *
- expr, const Tuple * tuple, GString * out)
-{
-  TupleEvalNode *curr = expr;
-  TupleEvalVar *var0, *var1;
-  TupleValueType type0, type1;
-  int tmpi0, tmpi1;
-  char tmps[MAX_STR], *tmps0, *tmps1, *tmps2;
-  bool_t result;
-  int resulti;
-
-  if (!expr) return FALSE;
-
-  while (curr) {
-    const char *str = NULL;
-
-    switch (curr->opcode) {
-      case OP_RAW:
-        str = curr->text;
-        break;
-
-      case OP_FIELD:
-        var0 = GET_VAR (ctx, curr->var[0]);
-
-        switch (var0->type) {
-          case TUPLE_VAR_FIELD:
-            if (tf_get_fieldval (var0, tuple)) {
-              switch (var0->ctype) {
-                case TUPLE_STRING:
-                  str = var0->fieldstr;
-                  break;
-
-                case TUPLE_INT:
-                  str_itoa (var0->defvali, tmps, sizeof (tmps));
-                  str = tmps;
-                  break;
-
-                default:
-                  str = NULL;
-              }
-            }
-            break;
-        }
-        break;
-
-      case OP_EQUALS:
-      case OP_NOT_EQUALS:
-      case OP_LT: case OP_LTEQ:
-      case OP_GT: case OP_GTEQ:
-        var0 = GET_VAR (ctx, curr->var[0]);
-        var1 = GET_VAR (ctx, curr->var[1]);
-
-        type0 = tf_get_var(&tmps0, &tmpi0, var0, tuple);
-        type1 = tf_get_var(&tmps1, &tmpi1, var1, tuple);
-        result = FALSE;
-
-        if (type0 != TUPLE_UNKNOWN && type1 != TUPLE_UNKNOWN) {
-          if (type0 == type1) {
-            if (type0 == TUPLE_STRING)
-              resulti = strcmp(tmps0, tmps1);
-            else
-              resulti = tmpi0 - tmpi1;
-          } else {
-            if (type0 == TUPLE_INT)
-              resulti = tmpi0 - atoi(tmps1);
-            else
-              resulti = atoi(tmps0) - tmpi1;
-          }
-
-          switch (curr->opcode) {
-            case OP_EQUALS:     result = (resulti == 0); break;
-            case OP_NOT_EQUALS: result = (resulti != 0); break;
-            case OP_LT:         result = (resulti <  0); break;
-            case OP_LTEQ:       result = (resulti <= 0); break;
-            case OP_GT:         result = (resulti >  0); break;
-            case OP_GTEQ:       result = (resulti >= 0); break;
-          default:            result = FALSE;
-          }
-        }
-
-        if (result && ! tuple_formatter_eval_do (ctx, curr->children, tuple, out))
-          return FALSE;
-        break;
-
-      case OP_EXISTS:
-        if (tf_get_fieldval (GET_VAR (ctx, curr->var[0]), tuple))
-        {
-          if (! tuple_formatter_eval_do (ctx, curr->children, tuple, out))
-            return FALSE;
-        }
-        break;
-
-      case OP_IS_EMPTY:
-        var0 = GET_VAR (ctx, curr->var[0]);
-
-        if (tf_get_fieldval (var0, tuple)) {
-          switch (var0->ctype) {
-          case TUPLE_INT:
-            result = (var0->defvali == 0);
-            break;
-
-          case TUPLE_STRING:
-            result = TRUE;
-            tmps2 = var0->fieldstr;
-
-            while (result && tmps2 && *tmps2 != '\0') {
-              if (g_ascii_isspace (* tmps2))
-                tmps2 ++;
-              else
-                result = FALSE;
-            }
-            break;
-
-          default:
-            result = TRUE;
-          }
-        } else
-          result = TRUE;
-
-        if (result && ! tuple_formatter_eval_do (ctx, curr->children, tuple, out))
-          return FALSE;
-        break;
-
-      default:
-        tuple_error(ctx, "Unimplemented opcode %d!\n", curr->opcode);
-        return FALSE;
-        break;
-    }
-
-    if (str)
-      g_string_append (out, str);
-
-    curr = curr->next;
-  }
-
-  return TRUE;
-}
-
-void tuple_formatter_eval (TupleEvalContext * ctx, TupleEvalNode * expr,
- const Tuple * tuple, GString * out)
-{
-    g_string_truncate (out, 0);
-    tuple_formatter_eval_do (ctx, expr, tuple, out);
-}
diff --git a/src/libaudcore/tuple_compiler.h b/src/libaudcore/tuple_compiler.h
deleted file mode 100644
index 1a951c19e8e0..000000000000
--- a/src/libaudcore/tuple_compiler.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * tuple_compiler.h
- * Copyright (c) 2007 Matti 'ccr' Hämäläinen
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef LIBAUDCORE_TUPLE_COMPILER_H
-#define LIBAUDCORE_TUPLE_COMPILER_H
-
-#include <glib.h>
-#include <libaudcore/tuple.h>
-
-typedef GArray TupleEvalContext;
-typedef struct _TupleEvalNode TupleEvalNode;
-
-TupleEvalContext * tuple_evalctx_new(void);
-void tuple_evalctx_reset(TupleEvalContext *ctx);
-void tuple_evalctx_free(TupleEvalContext *ctx);
-
-void tuple_evalnode_free(TupleEvalNode *expr);
-
-TupleEvalNode *tuple_formatter_compile(TupleEvalContext *ctx, const char *expr);
-void tuple_formatter_eval (TupleEvalContext * ctx, TupleEvalNode * expr,
- const Tuple * tuple, GString * out);
-
-#endif /* LIBAUDCORE_TUPLE_COMPILER_H */
diff --git a/src/libaudcore/tuple_formatter.c b/src/libaudcore/tuple_formatter.c
deleted file mode 100644
index 44c6e4453e66..000000000000
--- a/src/libaudcore/tuple_formatter.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * tuple_formatter.c
- * Copyright (c) 2007-2013 William Pitcock and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-
-#include "tuple.h"
-#include "tuple_compiler.h"
-
-/*
- * the tuple formatter:
- *
- * this is a data-driven meta-language which eventually hopes to be
- * turing complete.
- *
- * language constructs follow the following basic rules:
- *   - begin with ${
- *   - end with }
- *
- * language constructs:
- *   - ${field}: prints a field
- *   - ${?field:expr}: evaluates expr if field exists
- *   - ${=field,"value"}: defines field in the currently iterated
- *                        tuple as string value of "value"
- *   - ${=field,value}: defines field in the currently iterated
- *                      tuple as integer value of "value"
- *   - ${==field,field:expr}: evaluates expr if both fields are the same
- *   - ${!=field,field:expr}: evaluates expr if both fields are not the same
- *   - ${(empty)?field:expr}: evaluates expr if field is empty or does not exist
- *   - %{function:args,arg2,...}: runs function and inserts the result.
- *
- * everything else is treated as raw text.
- */
-
-struct _TupleFormatter
-{
-    TupleEvalContext * context;
-    TupleEvalNode * node;
-    GString * buf;
-};
-
-EXPORT TupleFormatter * tuple_formatter_new (const char * format)
-{
-    TupleFormatter * formatter = g_slice_new (TupleFormatter);
-
-    formatter->context = tuple_evalctx_new ();
-    formatter->node = tuple_formatter_compile (formatter->context, format);
-    formatter->buf = g_string_sized_new (255);
-
-    return formatter;
-}
-
-EXPORT void tuple_formatter_free (TupleFormatter * formatter)
-{
-    tuple_evalctx_free (formatter->context);
-    tuple_evalnode_free (formatter->node);
-    g_string_free (formatter->buf, TRUE);
-
-    g_slice_free (TupleFormatter, formatter);
-}
-
-EXPORT char * tuple_format_title (TupleFormatter * formatter, const Tuple * tuple)
-{
-    tuple_formatter_eval (formatter->context, formatter->node, tuple, formatter->buf);
-    tuple_evalctx_reset (formatter->context);
-
-    if (formatter->buf->len)
-        return str_get (formatter->buf->str);
-
-    /* formatting failed, try fallbacks */
-    static const int fallbacks[] = {FIELD_TITLE, FIELD_FILE_NAME};
-
-    for (int i = 0; i < ARRAY_LEN (fallbacks); i ++)
-    {
-        char * title = tuple_get_str (tuple, fallbacks[i]);
-        if (title)
-            return title;
-    }
-
-    return str_get ("");
-}
diff --git a/src/libaudcore/util.cc b/src/libaudcore/util.cc
new file mode 100644
index 000000000000..f9689824debd
--- /dev/null
+++ b/src/libaudcore/util.cc
@@ -0,0 +1,135 @@
+/*
+ * util.c
+ * Copyright 2009-2013 John Lindgren and Michał Lipski
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "internal.h"
+
+#include <errno.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <glib/gstdio.h>
+
+#include "audstrings.h"
+#include "runtime.h"
+
+const char * get_home_utf8 ()
+{
+    static pthread_once_t once = PTHREAD_ONCE_INIT;
+    static char * home_utf8;
+
+    auto init = [] ()
+        { home_utf8 = g_filename_to_utf8 (g_get_home_dir (), -1, nullptr, nullptr, nullptr); };
+
+    pthread_once (& once, init);
+    return home_utf8;
+}
+
+bool dir_foreach (const char * path, DirForeachFunc func, void * user)
+{
+    GDir * dir = g_dir_open (path, 0, nullptr);
+    if (! dir)
+        return false;
+
+    const char * name;
+    while ((name = g_dir_read_name (dir)))
+    {
+        if (func (filename_build ({path, name}), name, user))
+            break;
+    }
+
+    g_dir_close (dir);
+    return true;
+}
+
+String write_temp_file (const void * data, int64_t len)
+{
+    StringBuf name = filename_build ({g_get_tmp_dir (), "audacious-temp-XXXXXX"});
+
+    int handle = g_mkstemp (name);
+    if (handle < 0)
+    {
+        AUDERR ("Error creating temporary file: %s\n", strerror (errno));
+        return String ();
+    }
+
+    while (len)
+    {
+        int64_t written = write (handle, data, len);
+        if (written < 0)
+        {
+            AUDERR ("Error writing %s: %s\n", (const char *) name, strerror (errno));
+            close (handle);
+            return String ();
+        }
+
+        data = (char *) data + written;
+        len -= written;
+    }
+
+    if (close (handle) < 0)
+    {
+        AUDERR ("Error closing %s: %s\n", (const char *) name, strerror (errno));
+        return String ();
+    }
+
+    return String (name);
+}
+
+bool same_basename (const char * a, const char * b)
+{
+    const char * dot_a = strrchr (a, '.');
+    const char * dot_b = strrchr (b, '.');
+    int len_a = dot_a ? dot_a - a : strlen (a);
+    int len_b = dot_b ? dot_b - b : strlen (b);
+
+    return len_a == len_b && ! strcmp_nocase (a, b, len_a);
+}
+
+const char * last_path_element (const char * path)
+{
+    const char * slash = strrchr (path, G_DIR_SEPARATOR);
+    return (slash && slash[1]) ? slash + 1 : nullptr;
+}
+
+void cut_path_element (char * path, int pos)
+{
+#ifdef _WIN32
+    if (pos > 3)
+#else
+    if (pos > 1)
+#endif
+        path[pos - 1] = 0; /* overwrite slash */
+    else
+        path[pos] = 0; /* leave [drive letter and] leading slash */
+}
+
+/* Thomas Wang's 32-bit mix function.  See:
+ * http://web.archive.org/web/20070307172248/http://www.concentric.net/~Ttwang/tech/inthash.htm */
+
+unsigned int32_hash (unsigned val)
+{
+    val = ~val + (val << 15);
+    val = val ^ (val >> 12);
+    val = val + (val << 2);
+    val = val ^ (val >> 4);
+    val = val * 2057;
+    val = val ^ (val >> 16);
+    return val;
+}
diff --git a/src/libaudcore/vfs.c b/src/libaudcore/vfs.c
deleted file mode 100644
index 70f4608953f9..000000000000
--- a/src/libaudcore/vfs.c
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * vfs.c
- * Copyright 2006-2013 William Pitcock, Daniel Barkalow, Ralf Ertzinger,
- *                     Yoshiki Yazawa, Matti Hämäläinen, and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include "vfs.h"
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <glib.h>
-#include <glib/gstdio.h>
-
-#include "audstrings.h"
-#include "vfs_local.h"
-
-#define VFS_SIG ('V' | ('F' << 8) | ('S' << 16))
-
-/**
- * @struct _VFSFile
- * #VFSFile objects describe an opened VFS stream, basically being
- * similar in purpose as stdio FILE
- */
-struct _VFSFile {
-    char * uri;               /**< The URI of the stream */
-    VFSConstructor * base;    /**< The base vtable used for VFS functions */
-    void * handle;            /**< Opaque data used by the transport plugins */
-    int sig;                  /**< Used to detect invalid or twice-closed objects */
-};
-
-/* Audacious core provides us with a function that looks up a VFS transport for
- * a given URI scheme.  Since this function will load plugins as needed, it can
- * only be called from the main thread.  When VFS is used from parallel threads,
- * vfs_prepare must be called from the main thread to look up any needed
- * transports beforehand. */
-
-static VFSConstructor * (* lookup_func) (const char * scheme) = NULL;
-
-EXPORT void vfs_set_lookup_func (VFSConstructor * (* func) (const char * scheme))
-{
-    lookup_func = func;
-}
-
-static bool_t verbose = FALSE;
-
-EXPORT void vfs_set_verbose (bool_t set)
-{
-    verbose = set;
-}
-
-static void logger (const char * format, ...)
-{
-    static char last[256] = "";
-    static int repeated = 0;
-
-    char buf[256];
-
-    va_list args;
-    va_start (args, format);
-    vsnprintf (buf, sizeof buf, format, args);
-    va_end (args);
-
-    if (! strcmp (buf, last))
-        repeated ++;
-    else
-    {
-        if (repeated)
-        {
-            printf ("VFS: (last message repeated %d times)\n", repeated);
-            repeated = 0;
-        }
-
-        fputs (buf, stdout);
-        strcpy (last, buf);
-    }
-}
-
-EXPORT VFSFile * vfs_new (const char * path, VFSConstructor * vtable, void * handle)
-{
-    VFSFile * file = g_slice_new (VFSFile);
-    file->uri = str_get (path);
-    file->base = vtable;
-    file->handle = handle;
-    file->sig = VFS_SIG;
-    return file;
-}
-
-EXPORT const char * vfs_get_filename (VFSFile * file)
-{
-    return file->uri;
-}
-
-EXPORT void * vfs_get_handle (VFSFile * file)
-{
-    return file->handle;
-}
-
-/**
- * Opens a stream from a VFS transport using one of the registered
- * #VFSConstructor handlers.
- *
- * @param path The path or URI to open.
- * @param mode The preferred access privileges (not guaranteed).
- * @return On success, a #VFSFile object representing the stream.
- */
-EXPORT VFSFile *
-vfs_fopen(const char * path,
-          const char * mode)
-{
-    g_return_val_if_fail (path && mode, NULL);
-
-    VFSConstructor * vtable = NULL;
-
-    if (! strncmp (path, "file://", 7))
-        vtable = & vfs_local_vtable;
-    else
-    {
-        const char * s = strstr (path, "://");
-
-        if (! s)
-        {
-            fprintf (stderr, "Invalid URI: %s\n", path);
-            return NULL;
-        }
-
-        SNCOPY (scheme, path, s - path);
-
-        if (! (vtable = lookup_func (scheme)))
-            return NULL;
-    }
-
-    const gchar * sub;
-    uri_parse (path, NULL, NULL, & sub, NULL);
-
-    SNCOPY (buf, path, sub - path);
-
-    void * handle = vtable->vfs_fopen_impl (buf, mode);
-    if (! handle)
-        return NULL;
-
-    VFSFile * file = vfs_new (path, vtable, handle);
-
-    if (verbose)
-        logger ("VFS: <%p> open (mode %s) %s\n", file, mode, path);
-
-    return file;
-}
-
-/**
- * Closes a VFS stream and destroys a #VFSFile object.
- *
- * @param file A #VFSFile object to destroy.
- * @return -1 on failure, 0 on success.
- */
-EXPORT int
-vfs_fclose(VFSFile * file)
-{
-    g_return_val_if_fail (file && file->sig == VFS_SIG, -1);
-
-    if (verbose)
-        logger ("VFS: <%p> close\n", file);
-
-    int ret = 0;
-
-    if (file->base->vfs_fclose_impl(file) != 0)
-        ret = -1;
-
-    str_unref (file->uri);
-    g_slice_free (VFSFile, file);
-
-    return ret;
-}
-
-/**
- * Reads from a VFS stream.
- *
- * @param ptr A pointer to the destination buffer.
- * @param size The size of each element to read.
- * @param nmemb The number of elements to read.
- * @param file #VFSFile object that represents the VFS stream.
- * @return The number of elements succesfully read.
- */
-EXPORT int64_t vfs_fread (void * ptr, int64_t size, int64_t nmemb, VFSFile * file)
-{
-    g_return_val_if_fail (file && file->sig == VFS_SIG, 0);
-
-    int64_t readed = file->base->vfs_fread_impl (ptr, size, nmemb, file);
-
-/*    if (verbose)
-        logger ("VFS: <%p> read %"PRId64" elements of size %"PRId64" = "
-         "%"PRId64"\n", file, nmemb, size, readed); */
-
-    return readed;
-}
-
-/**
- * Writes to a VFS stream.
- *
- * @param ptr A const pointer to the source buffer.
- * @param size The size of each element to write.
- * @param nmemb The number of elements to write.
- * @param file #VFSFile object that represents the VFS stream.
- * @return The number of elements succesfully written.
- */
-EXPORT int64_t vfs_fwrite (const void * ptr, int64_t size, int64_t nmemb, VFSFile * file)
-{
-    g_return_val_if_fail (file && file->sig == VFS_SIG, 0);
-
-    int64_t written = file->base->vfs_fwrite_impl (ptr, size, nmemb, file);
-
-    if (verbose)
-        logger ("VFS: <%p> write %"PRId64" elements of size %"PRId64" = "
-         "%"PRId64"\n", file, nmemb, size, written);
-
-    return written;
-}
-
-/**
- * Reads a character from a VFS stream.
- *
- * @param file #VFSFile object that represents the VFS stream.
- * @return On success, a character. Otherwise, EOF.
- */
-EXPORT int
-vfs_getc(VFSFile *file)
-{
-    unsigned char c;
-
-    if (vfs_fread (& c, 1, 1, file) != 1)
-        return EOF;
-
-    return c;
-}
-
-/**
- * Pushes a character back to the VFS stream.
- *
- * @param c The character to push back.
- * @param file #VFSFile object that represents the VFS stream.
- * @return On success, 0. Otherwise, EOF.
- */
-EXPORT int
-vfs_ungetc(int c, VFSFile *file)
-{
-    if (vfs_fseek (file, -1, SEEK_CUR) < 0)
-        return EOF;
-
-    return c;
-}
-
-/**
- * Performs a seek in given VFS stream. Standard C-style values
- * of whence can be used to indicate desired action.
- *
- * - SEEK_CUR seeks relative to current stream position.
- * - SEEK_SET seeks to given absolute position (relative to stream beginning).
- * - SEEK_END sets stream position to current file end.
- *
- * @param file #VFSFile object that represents the VFS stream.
- * @param offset The offset to seek to.
- * @param whence Type of the seek: SEEK_CUR, SEEK_SET or SEEK_END.
- * @return On success, 0. Otherwise, -1.
- */
-EXPORT int
-vfs_fseek(VFSFile * file,
-          int64_t offset,
-          int whence)
-{
-    g_return_val_if_fail (file && file->sig == VFS_SIG, -1);
-
-    if (verbose)
-        logger ("VFS: <%p> seek to %"PRId64" from %s\n", file, offset, whence ==
-         SEEK_CUR ? "current" : whence == SEEK_SET ? "beginning" : whence ==
-         SEEK_END ? "end" : "invalid");
-
-    if (! file->base->vfs_fseek_impl (file, offset, whence))
-        return 0;
-
-    if (verbose)
-        logger ("VFS: <%p> seek failed!\n", file);
-
-    return -1;
-}
-
-/**
- * Returns the current position in the VFS stream's buffer.
- *
- * @param file #VFSFile object that represents the VFS stream.
- * @return On success, the current position. Otherwise, -1.
- */
-EXPORT int64_t
-vfs_ftell(VFSFile * file)
-{
-    g_return_val_if_fail (file && file->sig == VFS_SIG, -1);
-
-    int64_t told = file->base->vfs_ftell_impl (file);
-
-    if (verbose)
-        logger ("VFS: <%p> tell = %"PRId64"\n", file, told);
-
-    return told;
-}
-
-/**
- * Returns whether or not the VFS stream has reached EOF.
- *
- * @param file #VFSFile object that represents the VFS stream.
- * @return On success, whether or not the VFS stream is at EOF. Otherwise, FALSE.
- */
-EXPORT bool_t
-vfs_feof(VFSFile * file)
-{
-    g_return_val_if_fail (file && file->sig == VFS_SIG, TRUE);
-
-    bool_t eof = file->base->vfs_feof_impl (file);
-
-    if (verbose)
-        logger ("VFS: <%p> eof = %s\n", file, eof ? "yes" : "no");
-
-    return eof;
-}
-
-/**
- * Truncates a VFS stream to a certain size.
- *
- * @param file #VFSFile object that represents the VFS stream.
- * @param length The length to truncate at.
- * @return On success, 0. Otherwise, -1.
- */
-EXPORT int vfs_ftruncate (VFSFile * file, int64_t length)
-{
-    g_return_val_if_fail (file && file->sig == VFS_SIG, -1);
-
-    if (verbose)
-        logger ("VFS: <%p> truncate to %"PRId64"\n", file, length);
-
-    return file->base->vfs_ftruncate_impl(file, length);
-}
-
-/**
- * Returns size of the file.
- *
- * @param file #VFSFile object that represents the VFS stream.
- * @return On success, the size of the file in bytes. Otherwise, -1.
- */
-EXPORT int64_t vfs_fsize (VFSFile * file)
-{
-    g_return_val_if_fail (file && file->sig == VFS_SIG, -1);
-
-    int64_t size = file->base->vfs_fsize_impl (file);
-
-    if (verbose)
-        logger ("VFS: <%p> size = %"PRId64"\n", file, size);
-
-    return size;
-}
-
-/**
- * Returns metadata about the stream.
- *
- * @param file #VFSFile object that represents the VFS stream.
- * @param field The string constant field name to get.
- * @return On success, a copy of the value of the field. Otherwise, NULL.
- */
-EXPORT char *
-vfs_get_metadata(VFSFile * file, const char * field)
-{
-    g_return_val_if_fail (file && file->sig == VFS_SIG, NULL);
-
-    if (file->base->vfs_get_metadata_impl)
-        return file->base->vfs_get_metadata_impl(file, field);
-    return NULL;
-}
-
-/**
- * Wrapper for g_file_test().
- *
- * @param path A path to test.
- * @param test A GFileTest to run.
- * @return The result of g_file_test().
- */
-EXPORT bool_t
-vfs_file_test(const char * path, int test)
-{
-    if (strncmp (path, "file://", 7))
-        return FALSE; /* only local files are handled */
-
-    char * path2 = uri_to_filename (path);
-    if (! path2)
-        return FALSE;
-
-#ifdef S_ISLNK
-    if (test & VFS_IS_SYMLINK)
-    {
-        GStatBuf st;
-        if (g_lstat (path2, & st) < 0)
-            goto DONE;
-
-        if (S_ISLNK (st.st_mode))
-            test &= ~VFS_IS_SYMLINK;
-    }
-#endif
-
-    if (test & (VFS_IS_REGULAR | VFS_IS_DIR | VFS_IS_EXECUTABLE | VFS_EXISTS))
-    {
-        GStatBuf st;
-        if (g_stat (path2, & st) < 0)
-            goto DONE;
-
-        if (S_ISREG (st.st_mode))
-            test &= ~VFS_IS_REGULAR;
-        if (S_ISDIR (st.st_mode))
-            test &= ~VFS_IS_DIR;
-        if (st.st_mode & S_IXUSR)
-            test &= ~VFS_IS_EXECUTABLE;
-
-        test &= ~VFS_EXISTS;
-    }
-
-DONE:
-    str_unref (path2);
-    return ! test;
-}
-
-/**
- * Tests if a file is writeable.
- *
- * @param path A path to test.
- * @return TRUE if the file is writeable, otherwise FALSE.
- */
-EXPORT bool_t
-vfs_is_writeable(const char * path)
-{
-    GStatBuf info;
-    char * realfn = uri_to_filename (path);
-
-    if (! realfn || g_stat (realfn, & info) < 0)
-        return FALSE;
-
-    str_unref (realfn);
-    return (info.st_mode & S_IWUSR);
-}
-
-/**
- * Tests if a path is remote uri.
- *
- * @param path A path to test.
- * @return TRUE if the file is remote, otherwise FALSE.
- */
-EXPORT bool_t vfs_is_remote (const char * path)
-{
-    return strncmp (path, "file://", 7) ? TRUE : FALSE;
-}
-
-/**
- * Tests if a file is associated to streaming.
- *
- * @param file A #VFSFile object to test.
- * @return TRUE if the file is streaming, otherwise FALSE.
- */
-EXPORT bool_t vfs_is_streaming (VFSFile * file)
-{
-    return (vfs_fsize (file) < 0);
-}
diff --git a/src/libaudcore/vfs.cc b/src/libaudcore/vfs.cc
new file mode 100644
index 000000000000..900077ba21d5
--- /dev/null
+++ b/src/libaudcore/vfs.cc
@@ -0,0 +1,340 @@
+/*
+ * vfs.c
+ * Copyright 2006-2013 William Pitcock, Daniel Barkalow, Ralf Ertzinger,
+ *                     Yoshiki Yazawa, Matti Hämäläinen, and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "vfs.h"
+
+#define __STDC_FORMAT_MACROS
+#include <inttypes.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <glib/gstdio.h>
+
+#include "audstrings.h"
+#include "i18n.h"
+#include "plugin.h"
+#include "plugins-internal.h"
+#include "runtime.h"
+#include "vfs_local.h"
+
+static TransportPlugin * lookup_transport (const char * scheme)
+{
+    for (PluginHandle * plugin : aud_plugin_list (PluginType::Transport))
+    {
+        if (! aud_plugin_get_enabled (plugin))
+            continue;
+
+        if (transport_plugin_has_scheme (plugin, scheme))
+            return (TransportPlugin *) aud_plugin_get_header (plugin);
+    }
+
+    return nullptr;
+}
+
+/**
+ * Opens a stream from a VFS transport using one of the registered
+ * #VFSConstructor handlers.
+ *
+ * @param path The path or URI to open.
+ * @param mode The preferred access privileges (not guaranteed).
+ * @return On success, a #VFSFile object representing the stream.
+ */
+EXPORT VFSFile::VFSFile (const char * filename, const char * mode)
+{
+    StringBuf scheme = uri_get_scheme (filename);
+    if (! scheme)
+    {
+        AUDERR ("Invalid URI: %s\n", filename);
+        m_error = String (_("Invalid URI"));
+        return;
+    }
+
+    const char * sub;
+    uri_parse (filename, nullptr, nullptr, & sub, nullptr);
+    StringBuf nosub = str_copy (filename, sub - filename);
+
+    if (! strcmp (scheme, "file"))
+        m_impl.capture (vfs_local_fopen (nosub, mode, m_error));
+    else
+    {
+        TransportPlugin * tp = lookup_transport (scheme);
+        if (! tp)
+        {
+            AUDERR ("Unknown URI scheme: %s://", (const char *) scheme);
+            m_error = String (_("Unknown URI scheme"));
+            return;
+        }
+
+        m_impl.capture (tp->fopen (nosub, mode, m_error));
+    }
+
+    if (! m_impl)
+        return;
+
+    AUDINFO ("<%p> open (mode %s) %s\n", m_impl.get (), mode, filename);
+    m_filename = String (filename);
+}
+
+/**
+ * Reads from a VFS stream.
+ *
+ * @param ptr A pointer to the destination buffer.
+ * @param size The size of each element to read.
+ * @param nmemb The number of elements to read.
+ * @param file #VFSFile object that represents the VFS stream.
+ * @return The number of elements succesfully read.
+ */
+EXPORT int64_t VFSFile::fread (void * ptr, int64_t size, int64_t nmemb)
+{
+    int64_t readed = m_impl->fread (ptr, size, nmemb);
+
+    AUDDBG ("<%p> read %" PRId64 " elements of size %" PRId64 " = %" PRId64 "\n",
+     this, nmemb, size, readed);
+
+    return readed;
+}
+
+/**
+ * Writes to a VFS stream.
+ *
+ * @param ptr A const pointer to the source buffer.
+ * @param size The size of each element to write.
+ * @param nmemb The number of elements to write.
+ * @param file #VFSFile object that represents the VFS stream.
+ * @return The number of elements succesfully written.
+ */
+EXPORT int64_t VFSFile::fwrite (const void * ptr, int64_t size, int64_t nmemb)
+{
+    int64_t written = m_impl->fwrite (ptr, size, nmemb);
+
+    AUDDBG ("<%p> write %" PRId64 " elements of size %" PRId64 " = %" PRId64 "\n",
+     m_impl.get (), nmemb, size, written);
+
+    return written;
+}
+
+/**
+ * Performs a seek in given VFS stream. Standard C-style values
+ * of whence can be used to indicate desired action.
+ *
+ * - SEEK_CUR seeks relative to current stream position.
+ * - SEEK_SET seeks to given absolute position (relative to stream beginning).
+ * - SEEK_END sets stream position to current file end.
+ *
+ * @param file #VFSFile object that represents the VFS stream.
+ * @param offset The offset to seek to.
+ * @param whence Type of the seek: SEEK_CUR, SEEK_SET or SEEK_END.
+ * @return On success, 0. Otherwise, -1.
+ */
+EXPORT int VFSFile::fseek (int64_t offset, VFSSeekType whence)
+{
+    AUDDBG ("<%p> seek to %" PRId64 " from %s\n", m_impl.get (), offset,
+         whence == SEEK_CUR ? "current" : whence == SEEK_SET ? "beginning" :
+         whence == SEEK_END ? "end" : "invalid");
+
+    if (! m_impl->fseek (offset, whence))
+        return 0;
+
+    AUDDBG ("<%p> seek failed!\n", m_impl.get ());
+
+    return -1;
+}
+
+/**
+ * Returns the current position in the VFS stream's buffer.
+ *
+ * @param file #VFSFile object that represents the VFS stream.
+ * @return On success, the current position. Otherwise, -1.
+ */
+EXPORT int64_t VFSFile::ftell ()
+{
+    int64_t told = m_impl->ftell ();
+
+    AUDDBG ("<%p> tell = %" PRId64 "\n", m_impl.get (), told);
+
+    return told;
+}
+
+/**
+ * Returns whether or not the VFS stream has reached EOF.
+ *
+ * @param file #VFSFile object that represents the VFS stream.
+ * @return On success, whether or not the VFS stream is at EOF. Otherwise, false.
+ */
+EXPORT bool VFSFile::feof ()
+{
+    bool eof = m_impl->feof ();
+
+    AUDDBG ("<%p> eof = %s\n", m_impl.get (), eof ? "yes" : "no");
+
+    return eof;
+}
+
+/**
+ * Truncates a VFS stream to a certain size.
+ *
+ * @param file #VFSFile object that represents the VFS stream.
+ * @param length The length to truncate at.
+ * @return On success, 0. Otherwise, -1.
+ */
+EXPORT int VFSFile::ftruncate (int64_t length)
+{
+    AUDDBG ("<%p> truncate to %" PRId64 "\n", m_impl.get (), length);
+
+    if (! m_impl->ftruncate (length))
+        return 0;
+
+    AUDDBG ("<%p> truncate failed!\n", m_impl.get ());
+
+    return -1;
+}
+
+EXPORT int VFSFile::fflush ()
+{
+    AUDDBG ("<%p> flush\n", m_impl.get ());
+
+    if (! m_impl->fflush ())
+        return 0;
+
+    AUDDBG ("<%p> flush failed!\n", m_impl.get ());
+
+    return -1;
+}
+
+/**
+ * Returns size of the file.
+ *
+ * @param file #VFSFile object that represents the VFS stream.
+ * @return On success, the size of the file in bytes. Otherwise, -1.
+ */
+EXPORT int64_t VFSFile::fsize ()
+{
+    int64_t size = m_impl->fsize ();
+
+    AUDDBG ("<%p> size = %" PRId64 "\n", m_impl.get (), size);
+
+    return size;
+}
+
+/**
+ * Returns metadata about the stream.
+ *
+ * @param file #VFSFile object that represents the VFS stream.
+ * @param field The string constant field name to get.
+ * @return On success, a copy of the value of the field. Otherwise, nullptr.
+ */
+EXPORT String VFSFile::get_metadata (const char * field)
+{
+    return m_impl->get_metadata (field);
+}
+
+EXPORT Index<char> VFSFile::read_all ()
+{
+    constexpr int maxbuf = 16777216;
+    constexpr int pagesize = 4096;
+
+    Index<char> buf;
+    int64_t size = fsize ();
+    int64_t pos = ftell ();
+
+    if (size >= 0 && pos >= 0 && pos <= size)
+    {
+        buf.insert (0, aud::min (size - pos, (int64_t) maxbuf));
+        size = fread (buf.begin (), 1, buf.len ());
+    }
+    else
+    {
+        size = 0;
+
+        buf.insert (0, pagesize);
+
+        int64_t readsize;
+        while ((readsize = fread (& buf[size], 1, buf.len () - size)))
+        {
+            size += readsize;
+
+            if (size == buf.len ())
+            {
+                if (buf.len () > maxbuf - pagesize)
+                    break;
+
+                buf.insert (-1, pagesize);
+            }
+        }
+    }
+
+    buf.remove (size, -1);
+
+    return buf;
+}
+
+/**
+ * Wrapper for g_file_test().
+ *
+ * @param path A path to test.
+ * @param test A GFileTest to run.
+ * @return The result of g_file_test().
+ */
+EXPORT bool VFSFile::test_file (const char * path, VFSFileTest test)
+{
+    if (strncmp (path, "file://", 7))
+        return false; /* only local files are handled */
+
+    const char * sub;
+    uri_parse (path, nullptr, nullptr, & sub, nullptr);
+
+    StringBuf no_sub = str_copy (path, sub - path);
+
+    StringBuf path2 = uri_to_filename (no_sub);
+    if (! path2)
+        return false;
+
+#ifdef S_ISLNK
+    if (test & VFS_IS_SYMLINK)
+    {
+        GStatBuf st;
+        if (g_lstat (path2, & st) < 0)
+            return false;
+
+        if (S_ISLNK (st.st_mode))
+            test = (VFSFileTest) (test & ~VFS_IS_SYMLINK);
+    }
+#endif
+
+    if (test & (VFS_IS_REGULAR | VFS_IS_DIR | VFS_IS_EXECUTABLE | VFS_EXISTS))
+    {
+        GStatBuf st;
+        if (g_stat (path2, & st) < 0)
+            return false;
+
+        if (S_ISREG (st.st_mode))
+            test = (VFSFileTest) (test & ~VFS_IS_REGULAR);
+        if (S_ISDIR (st.st_mode))
+            test = (VFSFileTest) (test & ~VFS_IS_DIR);
+        if (st.st_mode & S_IXUSR)
+            test = (VFSFileTest) (test & ~VFS_IS_EXECUTABLE);
+
+        test = (VFSFileTest) (test & ~VFS_EXISTS);
+    }
+
+    return ! test;
+}
diff --git a/src/libaudcore/vfs.h b/src/libaudcore/vfs.h
index 8dcbc327cb4e..1a3c90907546 100644
--- a/src/libaudcore/vfs.h
+++ b/src/libaudcore/vfs.h
@@ -29,106 +29,108 @@
 
 #include <stdint.h>
 
-#include <libaudcore/core.h>
+#include <libaudcore/index.h>
+#include <libaudcore/objects.h>
+
+enum VFSFileTest {
+    VFS_IS_REGULAR    = (1 << 0),
+    VFS_IS_SYMLINK    = (1 << 1),
+    VFS_IS_DIR        = (1 << 2),
+    VFS_IS_EXECUTABLE = (1 << 3),
+    VFS_EXISTS        = (1 << 4)
+};
 
-/* equivalent to G_FILE_TEST_XXX */
-#define VFS_IS_REGULAR    (1 << 0)
-#define VFS_IS_SYMLINK    (1 << 1)
-#define VFS_IS_DIR        (1 << 2)
-#define VFS_IS_EXECUTABLE (1 << 3)
-#define VFS_EXISTS        (1 << 4)
+enum VFSSeekType {
+    VFS_SEEK_SET = 0,
+    VFS_SEEK_CUR = 1,
+    VFS_SEEK_END = 2
+};
 
-/** @struct VFSFile */
-typedef struct _VFSFile VFSFile;
-/** @struct VFSConstructor */
-typedef const struct _VFSConstructor VFSConstructor;
+#ifdef WANT_VFS_STDIO_COMPAT
 
-/**
- * @struct _VFSConstructor
- * #VFSConstructor objects contain the base vtables used for extrapolating
- * a VFS stream. #VFSConstructor objects should be considered %virtual in
- * nature. VFS base vtables are registered via vfs_register_transport().
- */
-struct _VFSConstructor {
-    /** A function pointer which points to a fopen implementation. */
-    void * (* vfs_fopen_impl) (const char * filename, const char * mode);
-    /** A function pointer which points to a fclose implementation. */
-    int (* vfs_fclose_impl) (VFSFile * file);
-
-    /** A function pointer which points to a fread implementation. */
-    int64_t (* vfs_fread_impl) (void * ptr, int64_t size, int64_t nmemb, VFSFile *
-     file);
-    /** A function pointer which points to a fwrite implementation. */
-    int64_t (* vfs_fwrite_impl) (const void * ptr, int64_t size, int64_t nmemb,
-     VFSFile * file);
-
-    void (* obs_getc) (void); // obsolete
-    void (* obs_ungetc) (void); // obsolete
-
-    /** A function pointer which points to a fseek implementation. */
-    int (* vfs_fseek_impl) (VFSFile * file, int64_t offset, int whence);
-
-    void (* obs_rewind) (void); // obsolete
-
-    /** A function pointer which points to a ftell implementation. */
-    int64_t (* vfs_ftell_impl) (VFSFile * file);
-    /** A function pointer which points to a feof implementation. */
-    bool_t (* vfs_feof_impl) (VFSFile * file);
-    /** A function pointer which points to a ftruncate implementation. */
-    int (* vfs_ftruncate_impl) (VFSFile * file, int64_t length);
-    /** A function pointer which points to a fsize implementation. */
-    int64_t (* vfs_fsize_impl) (VFSFile * file);
-
-    /** A function pointer which points to a (stream) metadata fetching implementation. */
-    char * (* vfs_get_metadata_impl) (VFSFile * file, const char * field);
+#include <stdio.h>
+
+constexpr int from_vfs_seek_type (VFSSeekType whence)
+{
+    return (whence == VFS_SEEK_SET) ? SEEK_SET :
+           (whence == VFS_SEEK_CUR) ? SEEK_CUR :
+           (whence == VFS_SEEK_END) ? SEEK_END : -1;
+}
+
+constexpr VFSSeekType to_vfs_seek_type (int whence)
+{
+    return (whence == SEEK_SET) ? VFS_SEEK_SET :
+           (whence == SEEK_CUR) ? VFS_SEEK_CUR :
+           (whence == SEEK_END) ? VFS_SEEK_END : (VFSSeekType) -1;
+}
+
+#endif // WANT_VFS_STDIO_COMPAT
+
+class VFSImpl
+{
+public:
+    VFSImpl () {}
+    virtual ~VFSImpl () {}
+
+    VFSImpl (const VFSImpl &) = delete;
+    VFSImpl & operator= (const VFSImpl &) = delete;
+
+    virtual int64_t fread (void * ptr, int64_t size, int64_t nmemb) = 0;
+    virtual int fseek (int64_t offset, VFSSeekType whence) = 0;
+
+    virtual int64_t ftell () = 0;
+    virtual int64_t fsize () = 0;
+    virtual bool feof () = 0;
+
+    virtual int64_t fwrite (const void * ptr, int64_t size, int64_t nmemb) = 0;
+    virtual int ftruncate (int64_t length) = 0;
+    virtual int fflush () = 0;
+
+    virtual String get_metadata (const char * field) { return String (); }
 };
 
-#ifdef __GNUC__
-#define WARN_RETURN __attribute__ ((warn_unused_result))
-#else
-#define WARN_RETURN
-#endif
+class VFSFile
+{
+public:
+    VFSFile () {}
+
+    VFSFile (const char * filename, VFSImpl * impl) :
+        m_filename (filename),
+        m_impl (impl) {}
 
-VFSFile * vfs_new (const char * path, VFSConstructor * vtable, void * handle) WARN_RETURN;
-const char * vfs_get_filename (VFSFile * file) WARN_RETURN;
-void * vfs_get_handle (VFSFile * file) WARN_RETURN;
+    VFSFile (const char * filename, const char * mode);
 
-VFSFile * vfs_fopen (const char * path, const char * mode) WARN_RETURN;
-int vfs_fclose (VFSFile * file);
+    explicit operator bool () const
+        { return (bool) m_impl; }
+    const char * filename () const
+        { return m_filename; }
+    const char * error () const
+        { return m_error; }
 
-int64_t vfs_fread (void * ptr, int64_t size, int64_t nmemb, VFSFile * file)
- WARN_RETURN;
-int64_t vfs_fwrite (const void * ptr, int64_t size, int64_t nmemb, VFSFile * file)
- WARN_RETURN;
+    /* basic operations */
 
-int vfs_getc (VFSFile * stream) WARN_RETURN;
-int vfs_ungetc (int c, VFSFile * stream) WARN_RETURN;
-char * vfs_fgets (char * s, int n, VFSFile * stream) WARN_RETURN;
-int vfs_fputs (const char * s, VFSFile * stream) WARN_RETURN;
-bool_t vfs_feof (VFSFile * file) WARN_RETURN;
-int vfs_fprintf (VFSFile * stream, char const * format, ...) __attribute__
- ((__format__ (__printf__, 2, 3)));
+    int64_t fread (void * ptr, int64_t size, int64_t nmemb) __attribute__ ((warn_unused_result));
+    int fseek (int64_t offset, VFSSeekType whence) __attribute__ ((warn_unused_result));
 
-int vfs_fseek (VFSFile * file, int64_t offset, int whence) WARN_RETURN;
-int64_t vfs_ftell (VFSFile * file) WARN_RETURN;
-int64_t vfs_fsize (VFSFile * file) WARN_RETURN;
-int vfs_ftruncate (VFSFile * file, int64_t length) WARN_RETURN;
+    int64_t ftell ();
+    int64_t fsize ();
+    bool feof ();
 
-bool_t vfs_is_streaming (VFSFile * file) WARN_RETURN;
+    int64_t fwrite (const void * ptr, int64_t size, int64_t nmemb) __attribute__ ((warn_unused_result));
+    int ftruncate (int64_t length) __attribute__ ((warn_unused_result));
+    int fflush () __attribute__ ((warn_unused_result));
 
-/* free returned string with str_unref() */
-char * vfs_get_metadata (VFSFile * file, const char * field) WARN_RETURN;
+    String get_metadata (const char * field);
 
-bool_t vfs_file_test (const char * path, int test) WARN_RETURN;
-bool_t vfs_is_writeable (const char * path) WARN_RETURN;
-bool_t vfs_is_remote (const char * path) WARN_RETURN;
+    /* utility functions */
 
-void vfs_file_read_all (VFSFile * file, void * * buf, int64_t * size);
-void vfs_file_get_contents (const char * filename, void * * buf, int64_t * size);
+    Index<char> read_all ();
 
-void vfs_set_lookup_func (VFSConstructor * (* func) (const char * scheme));
-void vfs_set_verbose (bool_t verbose);
+    static bool test_file (const char * path, VFSFileTest test);
 
-#undef WARN_RETURN
+private:
+    String m_filename, m_error;
+    SmartPtr<VFSImpl> m_impl;
+};
 
 #endif /* LIBAUDCORE_VFS_H */
diff --git a/src/libaudcore/vfs_async.c b/src/libaudcore/vfs_async.c
deleted file mode 100644
index d8864c6d1610..000000000000
--- a/src/libaudcore/vfs_async.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * vfs_async.c
- * Copyright 2010-2012 William Pitcock and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <pthread.h>
-
-#include "vfs_async.h"
-
-typedef struct {
-    char * filename; /* pooled */
-    void *buf;
-    int64_t size;
-    pthread_t thread;
-    void * userdata;
-
-    VFSConsumer cons_f;
-} VFSAsyncTrampoline;
-
-bool_t
-vfs_async_file_get_contents_trampoline(void * data)
-{
-    VFSAsyncTrampoline *tr = data;
-
-    pthread_join (tr->thread, NULL);
-
-    tr->cons_f(tr->buf, tr->size, tr->userdata);
-
-    str_unref (tr->filename);
-    g_slice_free(VFSAsyncTrampoline, tr);
-
-    return FALSE;
-}
-
-void *
-vfs_async_file_get_contents_worker(void * data)
-{
-    VFSAsyncTrampoline *tr = data;
-
-    vfs_file_get_contents(tr->filename, &tr->buf, &tr->size);
-
-    g_idle_add_full(G_PRIORITY_HIGH_IDLE, vfs_async_file_get_contents_trampoline, tr, NULL);
-
-    return NULL;
-}
-
-EXPORT void
-vfs_async_file_get_contents(const char *filename, VFSConsumer cons_f, void * userdata)
-{
-    VFSAsyncTrampoline *tr;
-
-    tr = g_slice_new0(VFSAsyncTrampoline);
-    tr->filename = str_get (filename);
-    tr->cons_f = cons_f;
-    tr->userdata = userdata;
-
-    pthread_create (& tr->thread, NULL, vfs_async_file_get_contents_worker, tr);
-}
diff --git a/src/libaudcore/vfs_async.cc b/src/libaudcore/vfs_async.cc
new file mode 100644
index 000000000000..8939236651f5
--- /dev/null
+++ b/src/libaudcore/vfs_async.cc
@@ -0,0 +1,91 @@
+/*
+ * vfs_async.cc
+ * Copyright 2010-2014 William Pitcock and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <pthread.h>
+
+#include "list.h"
+#include "mainloop.h"
+#include "vfs.h"
+#include "vfs_async.h"
+
+struct QueuedData : public ListNode
+{
+    const String filename;
+    const VFSConsumer cons_f;
+    void * const user;
+
+    pthread_t thread;
+
+    Index<char> buf;
+
+    QueuedData (const char * filename, VFSConsumer cons_f, void * user) :
+        filename (filename),
+        cons_f (cons_f),
+        user (user) {}
+};
+
+static QueuedFunc queued_func;
+static List<QueuedData> queue;
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static void send_data (void *)
+{
+    pthread_mutex_lock (& mutex);
+
+    QueuedData * data;
+    while ((data = queue.head ()))
+    {
+        queue.remove (data);
+
+        pthread_mutex_unlock (& mutex);
+
+        pthread_join (data->thread, nullptr);
+        data->cons_f (data->filename, data->buf, data->user);
+        delete data;
+
+        pthread_mutex_lock (& mutex);
+    }
+
+    pthread_mutex_unlock (& mutex);
+}
+
+static void * read_worker (void * data0)
+{
+    auto data = (QueuedData *) data0;
+
+    VFSFile file (data->filename, "r");
+    if (file)
+        data->buf = file.read_all ();
+
+    pthread_mutex_lock (& mutex);
+
+    if (! queue.head ())
+        queued_func.queue (send_data, nullptr);
+
+    queue.append (data);
+
+    pthread_mutex_unlock (& mutex);
+    return nullptr;
+}
+
+EXPORT void vfs_async_file_get_contents (const char * filename, VFSConsumer cons_f, void * user)
+{
+    auto data = new QueuedData (filename, cons_f, user);
+    pthread_create (& data->thread, nullptr, read_worker, data);
+}
diff --git a/src/libaudcore/vfs_async.h b/src/libaudcore/vfs_async.h
index 950301318ccc..b77f88bd5fc3 100644
--- a/src/libaudcore/vfs_async.h
+++ b/src/libaudcore/vfs_async.h
@@ -20,10 +20,10 @@
 #ifndef LIBAUDCORE_VFS_ASYNC_H
 #define LIBAUDCORE_VFS_ASYNC_H
 
-#include <libaudcore/vfs.h>
+#include <libaudcore/index.h>
 
-typedef bool_t (*VFSConsumer)(void * buf, int64_t size, void * userdata);
+typedef void (* VFSConsumer) (const char * filename, const Index<char> & buf, void * user);
 
-void vfs_async_file_get_contents(const char *filename, VFSConsumer cons_f, void * userdata);
+void vfs_async_file_get_contents (const char * filename, VFSConsumer cons_f, void * user);
 
 #endif
diff --git a/src/libaudcore/vfs_common.c b/src/libaudcore/vfs_common.c
deleted file mode 100644
index 18b05c7fb488..000000000000
--- a/src/libaudcore/vfs_common.c
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- *  vfs_common.c
- *  Copyright 2006-2013 Tony Vroon, William Pitcock, Matti Hämäläinen, and
- *                      John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <stdio.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include "audstrings.h"
-#include "vfs.h"
-
-/**
- * @file vfs_common.c
- * Common code for various VFS-stream related operations.
- * Routines for string reading and writing and functions for
- * reading and writing endianess-dependant integer values.
- */
-
-
-/**
- * Writes a character to a stream.
- *
- * @param c A character to write to the stream.
- * @param stream A #VFSFile object representing the stream.
- * @return The character on success, or EOF.
- */
-EXPORT int vfs_fputc(int c, VFSFile *stream)
-{
-    unsigned char uc = (unsigned char) c;
-
-    if (!vfs_fwrite(&uc, 1, 1, stream)) {
-        return EOF;
-    }
-
-    return uc;
-}
-
-/**
- * Reads a string of characters from a stream, ending in newline or EOF.
- *
- * @param s A buffer to put the string in.
- * @param n The amount of characters to read.
- * @param stream A #VFSFile object representing the stream.
- * @return The string on success, or NULL.
- */
-EXPORT char *vfs_fgets(char *s, int n, VFSFile *stream)
-{
-    int c;
-    register char *p;
-
-    if (n <= 0) return NULL;
-
-    p = s;
-
-    while (--n) {
-        if ((c = vfs_getc(stream))== EOF) {
-            break;
-        }
-        if ((*p++ = c) == '\n') {
-            break;
-        }
-    }
-    if (p > s) {
-        *p = 0;
-        return s;
-    }
-
-    return NULL;
-}
-
-/**
- * Writes a string to a VFS stream.
- *
- * @param s A string to write to the stream.
- * @param stream A #VFSFile object representing the stream.
- * @return The amount of bytes written.
- */
-EXPORT int vfs_fputs(const char *s, VFSFile *stream)
-{
-    int64_t n = strlen(s);
-
-    return ((vfs_fwrite(s, 1, n, stream) == n) ? n : EOF);
-}
-
-/**
- * Writes a formatted string to a VFS stream via a va_list of args.
- *
- * @param stream A #VFSFile object representing the stream.
- * @param format A printf-style format string.
- * @param args A va_list of args to use.
- * @return value The amount of bytes written.
- */
-EXPORT int vfs_vfprintf(VFSFile *stream, char const *format, va_list args)
-{
-    VSPRINTF (buf, format, args);
-    return vfs_fputs (buf, stream);
-}
-
-/**
- * Writes a formatted string to a VFS stream.
- *
- * @param stream A #VFSFile object representing the stream.
- * @param format A printf-style format string.
- * @param ... Optional list of arguments.
- * @return The amount of bytes written.
- */
-EXPORT int vfs_fprintf(VFSFile *stream, char const *format, ...)
-{
-    va_list arg;
-    int rv;
-
-    va_start(arg, format);
-    rv = vfs_vfprintf(stream, format, arg);
-    va_end(arg);
-
-    return rv;
-}
-
-EXPORT void vfs_file_read_all (VFSFile * file, void * * bufp, int64_t * sizep)
-{
-    char * buf = NULL;
-    int64_t size = vfs_fsize (file);
-
-    if (size >= 0)
-    {
-        size = MIN (size, SIZE_MAX - 1);
-        buf = g_malloc (size + 1);
-        size = vfs_fread (buf, 1, size, file);
-    }
-    else
-    {
-        size = 0;
-
-        size_t bufsize = 4096;
-        buf = g_malloc (bufsize);
-
-        size_t readsize;
-        while ((readsize = vfs_fread (buf + size, 1, bufsize - 1 - size, file)))
-        {
-            size += readsize;
-
-            if (size == bufsize - 1)
-            {
-                if (bufsize > SIZE_MAX - 4096)
-                    break;
-
-                bufsize += 4096;
-                buf = g_realloc (buf, bufsize);
-            }
-        }
-    }
-
-    buf[size] = 0; // nul-terminate
-
-    * bufp = buf;
-    if (sizep)
-        * sizep = size;
-}
-
-/**
- * Gets contents of the file into a buffer. Buffer of filesize bytes
- * is allocated by this function as necessary.
- *
- * @param filename URI of the file to read in.
- * @param buf Pointer to a pointer variable of buffer.
- * @param size Pointer to gsize variable that will hold the amount of
- * read data e.g. filesize.
- */
-EXPORT void vfs_file_get_contents (const char * filename, void * * buf, int64_t * size)
-{
-    * buf = NULL;
-    if (size)
-        * size = 0;
-
-    VFSFile * file = vfs_fopen (filename, "r");
-    if (! file)
-        return;
-
-    vfs_file_read_all (file, buf, size);
-    vfs_fclose (file);
-}
diff --git a/src/libaudcore/vfs_local.c b/src/libaudcore/vfs_local.c
deleted file mode 100644
index 196cc32f01dc..000000000000
--- a/src/libaudcore/vfs_local.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * vfs_local.c
- * Copyright 2009-2014 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include "vfs_local.h"
-
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <glib.h>
-#include <glib/gstdio.h>
-
-#include "audstrings.h"
-
-#ifdef _WIN32
-#define fseeko fseeko64
-#define ftello ftello64
-#endif
-
-typedef enum {
-    OP_NONE,
-    OP_READ,
-    OP_WRITE
-} LocalOp;
-
-typedef struct {
-    char * path;
-    FILE * stream;
-    int64_t cached_size;
-    LocalOp last_op;
-} LocalFile;
-
-static void * local_fopen (const char * uri, const char * mode)
-{
-    char * path = uri_to_filename (uri);
-    g_return_val_if_fail (path, NULL);
-
-    const char * suffix = "";
-
-#ifdef _WIN32
-    if (! strchr (mode, 'b'))  /* binary mode (Windows) */
-        suffix = "b";
-#else
-    if (! strchr (mode, 'e'))  /* close on exec (POSIX) */
-        suffix = "e";
-#endif
-
-    SCONCAT2 (mode2, mode, suffix);
-
-    FILE * stream = g_fopen (path, mode2);
-
-    if (! stream)
-    {
-        perror (path);
-        str_unref (path);
-        return NULL;
-    }
-
-    LocalFile * local = g_slice_new (LocalFile);
-
-    local->path = path;
-    local->stream = stream;
-    local->cached_size = -1;
-    local->last_op = OP_NONE;
-
-    return local;
-}
-
-static int local_fclose (VFSFile * file)
-{
-    LocalFile * local = vfs_get_handle (file);
-
-    int result = fclose (local->stream);
-    if (result < 0)
-        perror (local->path);
-
-    str_unref (local->path);
-    g_slice_free (LocalFile, local);
-
-    return result;
-}
-
-static int64_t local_fread (void * ptr, int64_t size, int64_t nitems, VFSFile * file)
-{
-    LocalFile * local = vfs_get_handle (file);
-
-    if (local->last_op == OP_WRITE)
-    {
-        if (fseeko (local->stream, 0, SEEK_CUR) < 0)  /* flush buffers */
-        {
-            perror (local->path);
-            return 0;
-        }
-    }
-
-    local->last_op = OP_READ;
-
-    clearerr (local->stream);
-
-    int64_t result = fread (ptr, size, nitems, local->stream);
-    if (result < nitems && ferror (local->stream))
-        perror (local->path);
-
-    return result;
-}
-
-static int64_t local_fwrite (const void * ptr, int64_t size, int64_t nitems, VFSFile * file)
-{
-    LocalFile * local = vfs_get_handle (file);
-
-    if (local->last_op == OP_READ)
-    {
-        if (fseeko (local->stream, 0, SEEK_CUR) < 0)  /* flush buffers */
-        {
-            perror (local->path);
-            return 0;
-        }
-    }
-
-    local->last_op = OP_WRITE;
-    local->cached_size = -1;
-
-    clearerr (local->stream);
-
-    int64_t result = fwrite (ptr, size, nitems, local->stream);
-    if (result < nitems && ferror (local->stream))
-        perror (local->path);
-
-    return result;
-}
-
-static int local_fseek (VFSFile * file, int64_t offset, int whence)
-{
-    LocalFile * local = vfs_get_handle (file);
-
-    int result = fseeko (local->stream, offset, whence);
-    if (result < 0)
-        perror (local->path);
-
-    if (result == 0)
-        local->last_op = OP_NONE;
-
-    return result;
-}
-
-static int64_t local_ftell (VFSFile * file)
-{
-    LocalFile * local = vfs_get_handle (file);
-    return ftello (local->stream);
-}
-
-static bool_t local_feof (VFSFile * file)
-{
-    LocalFile * local = vfs_get_handle (file);
-    return feof (local->stream);
-}
-
-static int local_ftruncate (VFSFile * file, int64_t length)
-{
-    LocalFile * local = vfs_get_handle (file);
-
-    if (local->last_op != OP_NONE)
-    {
-        if (fseeko (local->stream, 0, SEEK_CUR) < 0)  /* flush buffers */
-        {
-            perror (local->path);
-            return 0;
-        }
-    }
-
-    int result = ftruncate (fileno (local->stream), length);
-    if (result < 0)
-        perror (local->path);
-
-    if (result == 0)
-    {
-        local->last_op = OP_NONE;
-        local->cached_size = length;
-    }
-
-    return result;
-}
-
-static int64_t local_fsize (VFSFile * file)
-{
-    LocalFile * local = vfs_get_handle (file);
-
-    if (local->cached_size < 0)
-    {
-        int64_t saved_pos = ftello (local->stream);
-        if (ftello < 0)
-            goto ERR;
-
-        if (local_fseek (file, 0, SEEK_END) < 0)
-            goto ERR;
-
-        int64_t length = ftello (local->stream);
-        if (length < 0)
-            goto ERR;
-
-        if (local_fseek (file, saved_pos, SEEK_SET) < 0)
-            goto ERR;
-
-        local->cached_size = length;
-    }
-
-    return local->cached_size;
-
-ERR:
-    perror (local->path);
-    return -1;
-}
-
-VFSConstructor vfs_local_vtable = {
-    .vfs_fopen_impl = local_fopen,
-    .vfs_fclose_impl = local_fclose,
-    .vfs_fread_impl = local_fread,
-    .vfs_fwrite_impl = local_fwrite,
-    .vfs_fseek_impl = local_fseek,
-    .vfs_ftell_impl = local_ftell,
-    .vfs_feof_impl = local_feof,
-    .vfs_ftruncate_impl = local_ftruncate,
-    .vfs_fsize_impl = local_fsize
-};
diff --git a/src/libaudcore/vfs_local.cc b/src/libaudcore/vfs_local.cc
new file mode 100644
index 000000000000..feb48d432e33
--- /dev/null
+++ b/src/libaudcore/vfs_local.cc
@@ -0,0 +1,263 @@
+/*
+ * vfs_local.c
+ * Copyright 2009-2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#define WANT_VFS_STDIO_COMPAT
+#include "vfs_local.h"
+
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <glib/gstdio.h>
+
+#include "audstrings.h"
+#include "i18n.h"
+#include "runtime.h"
+
+#ifdef _WIN32
+#define fseeko fseeko64
+#define ftello ftello64
+#endif
+
+#define perror(s) AUDERR ("%s: %s\n", (const char *) (s), strerror (errno))
+
+enum LocalOp {
+    OP_NONE,
+    OP_READ,
+    OP_WRITE
+};
+
+class LocalFile : public VFSImpl
+{
+public:
+    LocalFile (const char * path, FILE * stream) :
+        m_path (path),
+        m_stream (stream),
+        m_cached_size (-1),
+        m_last_op (OP_NONE) {}
+
+    ~LocalFile ();
+
+protected:
+    int64_t fread (void * ptr, int64_t size, int64_t nmemb);
+    int fseek (int64_t offset, VFSSeekType whence);
+
+    int64_t ftell ();
+    int64_t fsize ();
+    bool feof ();
+
+    int64_t fwrite (const void * ptr, int64_t size, int64_t nmemb);
+    int ftruncate (int64_t length);
+    int fflush ();
+
+private:
+    String m_path;
+    FILE * m_stream;
+    int64_t m_cached_size;
+    LocalOp m_last_op;
+};
+
+VFSImpl * vfs_local_fopen (const char * uri, const char * mode, String & error)
+{
+    StringBuf path = uri_to_filename (uri);
+
+    if (! path)
+    {
+        error = String (_("Invalid file name"));
+        return nullptr;
+    }
+
+    const char * suffix = "";
+
+#ifdef _WIN32
+    if (! strchr (mode, 'b'))  /* binary mode (Windows) */
+        suffix = "b";
+#else
+    if (! strchr (mode, 'e'))  /* close on exec (POSIX) */
+        suffix = "e";
+#endif
+
+    StringBuf mode2 = str_concat ({mode, suffix});
+
+    FILE * stream = g_fopen (path, mode2);
+
+    if (! stream)
+    {
+        int errsave = errno;
+
+#ifndef _WIN32
+        if (errsave == ENOENT && ! g_get_charset (nullptr))
+        {
+            /* on a legacy system, try opening as UTF-8 */
+            StringBuf path2 = uri_to_filename (uri, false);
+            if (path2 && strcmp (path, path2))
+                stream = g_fopen (path2, mode2);
+        }
+#endif
+
+        if (! stream)
+        {
+            perror (path);
+            error = String (strerror (errsave));
+            return nullptr;
+        }
+    }
+
+    return new LocalFile (path, stream);
+}
+
+LocalFile::~LocalFile ()
+{
+    if (fclose (m_stream) < 0)
+        perror (m_path);
+}
+
+int64_t LocalFile::fread (void * ptr, int64_t size, int64_t nitems)
+{
+    if (m_last_op == OP_WRITE)
+    {
+        if (::fflush (m_stream) < 0)
+        {
+            perror (m_path);
+            return 0;
+        }
+    }
+
+    m_last_op = OP_READ;
+
+    clearerr (m_stream);
+
+    int64_t result = ::fread (ptr, size, nitems, m_stream);
+    if (result < nitems && ferror (m_stream))
+        perror (m_path);
+
+    return result;
+}
+
+int64_t LocalFile::fwrite (const void * ptr, int64_t size, int64_t nitems)
+{
+    if (m_last_op == OP_READ)
+    {
+        if (::fflush (m_stream) < 0)
+        {
+            perror (m_path);
+            return 0;
+        }
+    }
+
+    m_last_op = OP_WRITE;
+    m_cached_size = -1;
+
+    clearerr (m_stream);
+
+    int64_t result = ::fwrite (ptr, size, nitems, m_stream);
+    if (result < nitems && ferror (m_stream))
+        perror (m_path);
+
+    return result;
+}
+
+int LocalFile::fseek (int64_t offset, VFSSeekType whence)
+{
+    int result = fseeko (m_stream, offset, from_vfs_seek_type (whence));
+    if (result < 0)
+        perror (m_path);
+
+    if (result == 0)
+        m_last_op = OP_NONE;
+
+    return result;
+}
+
+int64_t LocalFile::ftell ()
+{
+    return ftello (m_stream);
+}
+
+bool LocalFile::feof ()
+{
+    return ::feof (m_stream);
+}
+
+int LocalFile::ftruncate (int64_t length)
+{
+    if (m_last_op != OP_NONE)
+    {
+        if (::fflush (m_stream) < 0)
+        {
+            perror (m_path);
+            return -1;
+        }
+    }
+
+    int result = ::ftruncate (fileno (m_stream), length);
+    if (result < 0)
+        perror (m_path);
+
+    if (result == 0)
+    {
+        m_last_op = OP_NONE;
+        m_cached_size = length;
+    }
+
+    return result;
+}
+
+int LocalFile::fflush ()
+{
+    if (m_last_op != OP_WRITE)
+        return 0;
+
+    int result = ::fflush (m_stream);
+    if (result < 0)
+        perror (m_path);
+
+    if (result == 0)
+        m_last_op = OP_NONE;
+
+    return result;
+}
+
+int64_t LocalFile::fsize ()
+{
+    if (m_cached_size < 0)
+    {
+        int64_t saved_pos = ftello (m_stream);
+        if (saved_pos < 0)
+            goto ERR;
+
+        if (fseek (0, VFS_SEEK_END) < 0)
+            goto ERR;
+
+        int64_t length = ftello (m_stream);
+        if (length < 0)
+            goto ERR;
+
+        if (fseek (saved_pos, VFS_SEEK_SET) < 0)
+            goto ERR;
+
+        m_cached_size = length;
+    }
+
+    return m_cached_size;
+
+ERR:
+    perror (m_path);
+    return -1;
+}
diff --git a/src/libaudcore/vfs_local.h b/src/libaudcore/vfs_local.h
index 6fa3686d8671..bdbf1149fa28 100644
--- a/src/libaudcore/vfs_local.h
+++ b/src/libaudcore/vfs_local.h
@@ -22,6 +22,6 @@
 
 #include "vfs.h"
 
-extern VFSConstructor vfs_local_vtable;
+VFSImpl * vfs_local_fopen (const char * uri, const char * mode, String & error);
 
 #endif /* LIBAUDCORE_VFS_LOCAL_H */
diff --git a/src/libaudcore/vis-runner.cc b/src/libaudcore/vis-runner.cc
new file mode 100644
index 000000000000..163c3154c99e
--- /dev/null
+++ b/src/libaudcore/vis-runner.cc
@@ -0,0 +1,228 @@
+/*
+ * vis_runner.c
+ * Copyright 2009-2012 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "internal.h"
+
+#include <assert.h>
+#include <pthread.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "list.h"
+#include "mainloop.h"
+#include "output.h"
+
+#define INTERVAL 30 /* milliseconds */
+#define FRAMES_PER_NODE 512
+
+struct VisNode : public ListNode
+{
+    explicit VisNode (int channels) :
+        channels (channels),
+        data (new float[channels * FRAMES_PER_NODE]) {}
+
+    ~VisNode ()
+        { delete[] data; }
+
+    const int channels;
+    int time;
+    float * data;
+};
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static bool enabled = false;
+static bool playing = false, paused = false, active = false;
+static VisNode * current_node = nullptr;
+static int current_frames;
+static List<VisNode> vis_list;
+static List<VisNode> vis_pool;
+static QueuedFunc queued_clear;
+static QueuedFunc send_timer;
+
+static void send_audio (void * unused)
+{
+    /* call before locking mutex to avoid deadlock */
+    int outputted = output_get_raw_time ();
+
+    pthread_mutex_lock (& mutex);
+
+    if (! send_timer.running ())
+    {
+        pthread_mutex_unlock (& mutex);
+        return;
+    }
+
+    VisNode * node = nullptr;
+    VisNode * next;
+
+    while ((next = vis_list.head ()))
+    {
+        /* If we are considering a node, stop searching and use it if it is the
+         * most recent (that is, the next one is in the future).  Otherwise,
+         * consider the next node if it is not in the future by more than the
+         * length of an interval. */
+        if (next->time > outputted + (node ? 0 : INTERVAL))
+            break;
+
+        if (node)
+            vis_pool.prepend (node);
+
+        node = next;
+        vis_list.remove (node);
+    }
+
+    pthread_mutex_unlock (& mutex);
+
+    if (! node)
+        return;
+
+    vis_send_audio (node->data, node->channels);
+
+    pthread_mutex_lock (& mutex);
+    vis_pool.prepend (node);
+    pthread_mutex_unlock (& mutex);
+}
+
+static void send_clear (void * unused)
+{
+    vis_send_clear ();
+}
+
+static void flush_locked (void)
+{
+    delete current_node;
+    current_node = nullptr;
+
+    vis_list.clear ();
+    vis_pool.clear ();
+
+    queued_clear.queue (send_clear, nullptr);
+}
+
+void vis_runner_flush (void)
+{
+    pthread_mutex_lock (& mutex);
+    flush_locked ();
+    pthread_mutex_unlock (& mutex);
+}
+
+static void start_stop_locked (bool new_playing, bool new_paused)
+{
+    playing = new_playing;
+    paused = new_paused;
+    active = playing && enabled;
+
+    send_timer.stop ();
+    queued_clear.stop ();
+
+    if (! active)
+        flush_locked ();
+    else if (! paused)
+        send_timer.start (INTERVAL, send_audio, nullptr);
+}
+
+void vis_runner_start_stop (bool new_playing, bool new_paused)
+{
+    pthread_mutex_lock (& mutex);
+    start_stop_locked (new_playing, new_paused);
+    pthread_mutex_unlock (& mutex);
+}
+
+void vis_runner_pass_audio (int time, const Index<float> & data, int channels, int rate)
+{
+    pthread_mutex_lock (& mutex);
+
+    if (! active)
+    {
+        pthread_mutex_unlock (& mutex);
+        return;
+    }
+
+    /* We can build a single node from multiple calls; we can also build
+     * multiple nodes from the same call.  If current_node is present, it was
+     * partly built in the last call and needs to be finished. */
+
+    int at = 0;
+
+    while (1)
+    {
+        if (current_node)
+            assert (current_node->channels == channels);
+        else
+        {
+            int node_time = time;
+
+            /* There is no partly-built node, so start a new one.  Normally
+             * there will be nodes in the queue already; if so, we want to copy
+             * audio data from the signal starting at 30 milliseconds after the
+             * beginning of the most recent node.  If there are no nodes in the
+             * queue, we are at the beginning of the song or had an underrun,
+             * and we want to copy the earliest audio data we have. */
+
+            VisNode * tail = vis_list.tail ();
+            if (tail)
+                node_time = tail->time + INTERVAL;
+
+            at = channels * (int) ((int64_t) (node_time - time) * rate / 1000);
+
+            if (at < 0)
+                at = 0;
+            if (at >= data.len ())
+                break;
+
+            current_node = vis_pool.head ();
+
+            if (current_node)
+            {
+                assert (current_node->channels == channels);
+                vis_pool.remove (current_node);
+            }
+            else
+                current_node = new VisNode (channels);
+
+            current_node->time = node_time;
+            current_frames = 0;
+        }
+
+        /* Copy as much data as we can, limited by how much we have and how much
+         * space is left in the node.  If we cannot fill the node, we return and
+         * wait for more data to be passed in the next call.  If we do fill the
+         * node, we loop and start building a new one. */
+
+        int copy = aud::min (data.len () - at, channels * (FRAMES_PER_NODE - current_frames));
+        memcpy (current_node->data + channels * current_frames, & data[at], sizeof (float) * copy);
+        current_frames += copy / channels;
+
+        if (current_frames < FRAMES_PER_NODE)
+            break;
+
+        vis_list.append (current_node);
+        current_node = nullptr;
+    }
+
+    pthread_mutex_unlock (& mutex);
+}
+
+void vis_runner_enable (bool enable)
+{
+    pthread_mutex_lock (& mutex);
+    enabled = enable;
+    start_stop_locked (playing, paused);
+    pthread_mutex_unlock (& mutex);
+}
diff --git a/src/libaudcore/visualization.cc b/src/libaudcore/visualization.cc
new file mode 100644
index 000000000000..2f7a76814486
--- /dev/null
+++ b/src/libaudcore/visualization.cc
@@ -0,0 +1,179 @@
+/*
+ * visualization.c
+ * Copyright 2010-2011 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "interface.h"
+#include "internal.h"
+
+#include <string.h>
+
+#include "plugin.h"
+#include "plugins.h"
+#include "runtime.h"
+
+static Index<Visualizer *> visualizers;
+
+static int running = false;
+static int num_enabled = 0;
+
+EXPORT void aud_visualizer_add (Visualizer * vis)
+{
+    visualizers.append (vis);
+
+    num_enabled ++;
+    if (num_enabled == 1)
+        vis_runner_enable (true);
+}
+
+EXPORT void aud_visualizer_remove (Visualizer * vis)
+{
+    int num_disabled = 0;
+
+    auto is_match = [&] (Visualizer * vis2)
+    {
+        if (vis2 != vis)
+            return false;
+
+        num_disabled ++;
+        return true;
+    };
+
+    visualizers.remove_if (is_match, true);
+
+    num_enabled -= num_disabled;
+    if (! num_enabled)
+        vis_runner_enable (false);
+}
+
+void vis_send_clear ()
+{
+    for (Visualizer * vis : visualizers)
+        vis->clear ();
+}
+
+static void pcm_to_mono (const float * data, float * mono, int channels)
+{
+    if (channels == 1)
+        memcpy (mono, data, sizeof (float) * 512);
+    else
+    {
+        float * set = mono;
+        while (set < & mono[512])
+        {
+            * set ++ = (data[0] + data[1]) / 2;
+            data += channels;
+        }
+    }
+}
+
+void vis_send_audio (const float * data, int channels)
+{
+    auto is_active = [] (int type_mask)
+    {
+        for (Visualizer * vis : visualizers)
+        {
+            if ((vis->type_mask & type_mask))
+                return true;
+        }
+
+        return false;
+    };
+
+    float mono[512];
+    float freq[256];
+
+    if (is_active (Visualizer::MonoPCM | Visualizer::Freq))
+        pcm_to_mono (data, mono, channels);
+    if (is_active (Visualizer::Freq))
+        calc_freq (mono, freq);
+
+    for (Visualizer * vis : visualizers)
+    {
+        if ((vis->type_mask & Visualizer::MonoPCM))
+            vis->render_mono_pcm (mono);
+        if ((vis->type_mask & Visualizer::MultiPCM))
+            vis->render_multi_pcm (data, channels);
+        if ((vis->type_mask & Visualizer::Freq))
+            vis->render_freq (freq);
+    }
+}
+
+static bool vis_load (PluginHandle * plugin)
+{
+    AUDINFO ("Activating %s.\n", aud_plugin_get_name (plugin));
+    VisPlugin * header = (VisPlugin *) aud_plugin_get_header (plugin);
+    if (! header)
+        return false;
+
+    aud_visualizer_add (header);
+    return true;
+}
+
+static void vis_unload (PluginHandle * plugin)
+{
+    AUDINFO ("Deactivating %s.\n", aud_plugin_get_name (plugin));
+    VisPlugin * header = (VisPlugin *) aud_plugin_get_header (plugin);
+    if (! header)
+        return;
+
+    header->clear ();
+    aud_visualizer_remove (header);
+}
+
+void vis_activate (bool activate)
+{
+    if (! activate == ! running)
+        return;
+
+    for (PluginHandle * plugin : aud_plugin_list (PluginType::Vis))
+    {
+        if (! aud_plugin_get_enabled (plugin))
+            continue;
+
+        if (activate)
+            vis_load (plugin);
+        else
+            vis_unload (plugin);
+    }
+
+    running = activate;
+}
+
+bool vis_plugin_start (PluginHandle * plugin)
+{
+    VisPlugin * vp = (VisPlugin *) aud_plugin_get_header (plugin);
+    if (! vp || ! vp->init ())
+        return false;
+
+    if (running)
+        vis_load (plugin);
+
+    return true;
+}
+
+void vis_plugin_stop (PluginHandle * plugin)
+{
+    VisPlugin * vp = (VisPlugin *) aud_plugin_get_header (plugin);
+    if (! vp)
+        return;
+
+    if (running)
+        vis_unload (plugin);
+
+    vp->cleanup ();
+}
diff --git a/src/libaudcore/visualizer.h b/src/libaudcore/visualizer.h
new file mode 100644
index 000000000000..d99eaffd8dff
--- /dev/null
+++ b/src/libaudcore/visualizer.h
@@ -0,0 +1,49 @@
+/*
+ * visualizer.h
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDCORE_VISUALIZER_H
+#define LIBAUDCORE_VISUALIZER_H
+
+class Visualizer
+{
+public:
+    enum {
+        MonoPCM = (1 << 0),
+        MultiPCM = (1 << 1),
+        Freq = (1 << 2)
+    };
+
+    const int type_mask;
+    constexpr Visualizer (int type_mask) :
+        type_mask (type_mask) {}
+
+    /* reset internal state and clear display */
+    virtual void clear () = 0;
+
+    /* 512 frames of a single-channel PCM signal */
+    virtual void render_mono_pcm (const float * pcm) {}
+
+    /* 512 frames of an interleaved multi-channel PCM signal */
+    virtual void render_multi_pcm (const float * pcm, int channels) {}
+
+    /* intensity of frequencies 1/512, 2/512, ..., 256/512 of sample rate */
+    virtual void render_freq (const float * freq) {}
+};
+
+#endif /* LIBAUDCORE_VISUALIZER_H */
diff --git a/src/libaudgui/Makefile b/src/libaudgui/Makefile
index 9da027fafdd7..3a16dac90532 100644
--- a/src/libaudgui/Makefile
+++ b/src/libaudgui/Makefile
@@ -1,27 +1,32 @@
 SHARED_LIB = ${LIB_PREFIX}audgui${LIB_SUFFIX}
-LIB_MAJOR = 2
+LIB_MAJOR = 3
 LIB_MINOR = 0
 
-SRCS = about.c \
-       confirm.c \
-       equalizer.c \
-       infopopup.c \
-       infowin.c \
-       init.c \
-       jump-to-time.c \
-       list.c \
-       menu.c \
-       pixbufs.c \
-       playlists.c \
-       queue-manager.c \
-       scaled-image.c \
-       ui_fileopener.c \
-       ui_jumptotrack.c \
-       ui_jumptotrack_cache.c \
-       ui_playlist_manager.c \
-       urilist.c \
-       url-opener.c \
-       util.c
+SRCS = about.cc \
+       confirm.cc \
+       equalizer.cc \
+       file-opener.cc \
+       infopopup.cc \
+       infowin.cc \
+       init.cc \
+       jump-to-time.cc \
+       jump-to-track.cc \
+       jump-to-track-cache.cc \
+       list.cc \
+       menu.cc \
+       pixbufs.cc \
+       playlists.cc \
+       plugin-menu.cc \
+       plugin-prefs.cc \
+       plugin-view.cc \
+       prefs-widget.cc \
+       prefs-window.cc \
+       queue-manager.cc \
+       scaled-image.cc \
+       status.cc \
+       urilist.cc \
+       url-opener.cc \
+       util.cc
 
 INCLUDES = libaudgui.h \
            libaudgui-gtk.h \
@@ -33,10 +38,13 @@ include ../../extra.mk
 
 includesubdir = libaudgui
 
+LD = ${CXX}
+
 CPPFLAGS := -I.. -I../.. \
             ${CPPFLAGS} \
-            ${GLIB_CFLASG} \
-            ${GTK_CFLAGS}
+            ${GLIB_CFLAGS} \
+            ${GTK_CFLAGS} \
+            ${LIBGUESS_CFLAGS}
 
 CFLAGS += ${LIB_CFLAGS}
 
diff --git a/src/libaudgui/about.c b/src/libaudgui/about.c
deleted file mode 100644
index 56cdbef57038..000000000000
--- a/src/libaudgui/about.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * about.c
- * Copyright 2011-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gtk/gtk.h>
-
-#include <audacious/i18n.h>
-#include <audacious/misc.h>
-#include <libaudcore/audstrings.h>
-
-#include "init.h"
-#include "libaudgui-gtk.h"
-
-static const char about_text[] =
- "<big><b>Audacious " VERSION "</b></big>\n"
- "Copyright © 2001-2014 Audacious developers and others";
-
-static const char website[] = "http://audacious-media-player.org";
-
-static GtkWidget * create_credits_notebook (const char * credits, const char * license)
-{
-    const char * titles[2] = {_("Credits"), _("License")};
-    const char * text[2] = {credits, license};
-
-    GtkWidget * notebook = gtk_notebook_new ();
-
-    for (int i = 0; i < 2; i ++)
-    {
-        GtkWidget * label = gtk_label_new (titles[i]);
-
-        GtkWidget * scrolled = gtk_scrolled_window_new (NULL, NULL);
-        gtk_widget_set_size_request (scrolled, -1, 200);
-
-        GtkTextBuffer * buffer = gtk_text_buffer_new (NULL);
-        gtk_text_buffer_set_text (buffer, text[i], -1);
-        GtkWidget * text = gtk_text_view_new_with_buffer (buffer);
-        gtk_text_view_set_editable ((GtkTextView *) text, FALSE);
-        gtk_text_view_set_cursor_visible ((GtkTextView *) text, FALSE);
-        gtk_text_view_set_left_margin ((GtkTextView *) text, 6);
-        gtk_text_view_set_right_margin ((GtkTextView *) text, 6);
-        gtk_container_add ((GtkContainer *) scrolled, text);
-
-        gtk_notebook_append_page ((GtkNotebook *) notebook, scrolled, label);
-    }
-
-    return notebook;
-}
-
-static GtkWidget * create_about_window (void)
-{
-    const char * data_dir = aud_get_path (AUD_PATH_DATA_DIR);
-
-    GtkWidget * about_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-    gtk_window_set_title ((GtkWindow *) about_window, _("About Audacious"));
-    gtk_window_set_resizable ((GtkWindow *) about_window, FALSE);
-    gtk_container_set_border_width ((GtkContainer *) about_window, 3);
-
-    audgui_destroy_on_escape (about_window);
-
-    GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
-    gtk_container_add ((GtkContainer *) about_window, vbox);
-
-    SCONCAT2 (logo_path, data_dir, "/images/about-logo.png");
-    GtkWidget * image = gtk_image_new_from_file (logo_path);
-    gtk_box_pack_start ((GtkBox *) vbox, image, FALSE, FALSE, 0);
-
-    GtkWidget * label = gtk_label_new (NULL);
-    gtk_label_set_markup ((GtkLabel *) label, about_text);
-    gtk_label_set_justify ((GtkLabel *) label, GTK_JUSTIFY_CENTER);
-    gtk_box_pack_start ((GtkBox *) vbox, label, FALSE, FALSE, 0);
-
-    GtkWidget * button = gtk_link_button_new (website);
-    gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
-    gtk_box_pack_start ((GtkBox *) vbox, button, FALSE, FALSE, 0);
-
-    char * credits, * license;
-
-    SCONCAT2 (credits_path, data_dir, "/AUTHORS");
-    if (! g_file_get_contents (credits_path, & credits, NULL, NULL))
-        credits = g_strdup_printf ("Unable to load %s; check your installation.", credits_path);
-
-    SCONCAT2 (license_path, data_dir, "/COPYING");
-    if (! g_file_get_contents (license_path, & license, NULL, NULL))
-        license = g_strdup_printf ("Unable to load %s; check your installation.", license_path);
-
-    g_strchomp (credits);
-    g_strchomp (license);
-
-    GtkWidget * notebook = create_credits_notebook (credits, license);
-    gtk_widget_set_size_request (notebook, 600, 250);
-    gtk_box_pack_start ((GtkBox *) vbox, notebook, TRUE, TRUE, 0);
-
-    g_free (credits);
-    g_free (license);
-
-    return about_window;
-}
-
-EXPORT void audgui_show_about_window (void)
-{
-    if (! audgui_reshow_unique_window (AUDGUI_ABOUT_WINDOW))
-        audgui_show_unique_window (AUDGUI_ABOUT_WINDOW, create_about_window ());
-}
-
-EXPORT void audgui_hide_about_window (void)
-{
-    audgui_hide_unique_window (AUDGUI_ABOUT_WINDOW);
-}
diff --git a/src/libaudgui/about.cc b/src/libaudgui/about.cc
new file mode 100644
index 000000000000..8b3603d060a5
--- /dev/null
+++ b/src/libaudgui/about.cc
@@ -0,0 +1,125 @@
+/*
+ * about.c
+ * Copyright 2011-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gtk/gtk.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/runtime.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+static const char about_text[] = "<big><b>Audacious " VERSION "</b></big>\n" COPYRIGHT;
+static const char website[] = "http://audacious-media-player.org";
+
+static GtkWidget * create_credits_notebook (const char * credits, const char * license)
+{
+    const char * titles[2] = {_("Credits"), _("License")};
+    const char * text[2] = {credits, license};
+
+    GtkWidget * notebook = gtk_notebook_new ();
+
+    for (int i = 0; i < 2; i ++)
+    {
+        GtkWidget * label = gtk_label_new (titles[i]);
+
+        GtkWidget * scrolled = gtk_scrolled_window_new (nullptr, nullptr);
+        gtk_widget_set_size_request (scrolled, -1, 200);
+        gtk_scrolled_window_set_policy ((GtkScrolledWindow *) scrolled,
+         GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+        GtkTextBuffer * buffer = gtk_text_buffer_new (nullptr);
+        gtk_text_buffer_set_text (buffer, text[i], -1);
+        GtkWidget * text = gtk_text_view_new_with_buffer (buffer);
+        gtk_text_view_set_editable ((GtkTextView *) text, false);
+        gtk_text_view_set_cursor_visible ((GtkTextView *) text, false);
+        gtk_text_view_set_left_margin ((GtkTextView *) text, 6);
+        gtk_text_view_set_right_margin ((GtkTextView *) text, 6);
+        gtk_container_add ((GtkContainer *) scrolled, text);
+
+        gtk_notebook_append_page ((GtkNotebook *) notebook, scrolled, label);
+    }
+
+    return notebook;
+}
+
+static GtkWidget * create_about_window ()
+{
+    const char * data_dir = aud_get_path (AudPath::DataDir);
+
+    GtkWidget * about_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_title ((GtkWindow *) about_window, _("About Audacious"));
+    gtk_window_set_resizable ((GtkWindow *) about_window, false);
+    gtk_container_set_border_width ((GtkContainer *) about_window, 3);
+
+    audgui_destroy_on_escape (about_window);
+
+    GtkWidget * vbox = gtk_vbox_new (false, 6);
+    gtk_container_add ((GtkContainer *) about_window, vbox);
+
+    StringBuf logo_path = filename_build ({data_dir, "images", "about-logo.png"});
+    GtkWidget * image = gtk_image_new_from_file (logo_path);
+    gtk_box_pack_start ((GtkBox *) vbox, image, false, false, 0);
+
+    GtkWidget * label = gtk_label_new (nullptr);
+    gtk_label_set_markup ((GtkLabel *) label, about_text);
+    gtk_label_set_justify ((GtkLabel *) label, GTK_JUSTIFY_CENTER);
+    gtk_box_pack_start ((GtkBox *) vbox, label, false, false, 0);
+
+    GtkWidget * align = gtk_alignment_new (0.5, 0.5, 0, 0);
+    gtk_box_pack_start ((GtkBox *) vbox, align, false, false, 0);
+
+    GtkWidget * button = gtk_link_button_new (website);
+    gtk_container_add ((GtkContainer *) align, button);
+
+    char * credits, * license;
+
+    StringBuf credits_path = filename_build ({data_dir, "AUTHORS"});
+    if (! g_file_get_contents (credits_path, & credits, nullptr, nullptr))
+        credits = g_strdup_printf ("Unable to load %s; check your installation.", (const char *) credits_path);
+
+    StringBuf license_path = filename_build ({data_dir, "COPYING"});
+    if (! g_file_get_contents (license_path, & license, nullptr, nullptr))
+        license = g_strdup_printf ("Unable to load %s; check your installation.", (const char *) license_path);
+
+    g_strchomp (credits);
+    g_strchomp (license);
+
+    GtkWidget * notebook = create_credits_notebook (credits, license);
+    gtk_widget_set_size_request (notebook, 585, 250);
+    gtk_box_pack_start ((GtkBox *) vbox, notebook, true, true, 0);
+
+    g_free (credits);
+    g_free (license);
+
+    return about_window;
+}
+
+EXPORT void audgui_show_about_window ()
+{
+    if (! audgui_reshow_unique_window (AUDGUI_ABOUT_WINDOW))
+        audgui_show_unique_window (AUDGUI_ABOUT_WINDOW, create_about_window ());
+}
+
+EXPORT void audgui_hide_about_window ()
+{
+    audgui_hide_unique_window (AUDGUI_ABOUT_WINDOW);
+}
diff --git a/src/libaudgui/confirm.c b/src/libaudgui/confirm.c
deleted file mode 100644
index fb92da40b5af..000000000000
--- a/src/libaudgui/confirm.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * confirm.c
- * Copyright 2010-2013 John Lindgren and Thomas Lange
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gtk/gtk.h>
-
-#include <audacious/i18n.h>
-#include <audacious/misc.h>
-#include <audacious/playlist.h>
-#include <libaudcore/audstrings.h>
-
-#include "libaudgui-gtk.h"
-
-static void no_confirm_cb (GtkToggleButton * toggle)
-{
-    aud_set_bool ("audgui", "no_confirm_playlist_delete", gtk_toggle_button_get_active (toggle));
-}
-
-static void confirm_delete_cb (void * data)
-{
-    int list = aud_playlist_by_unique_id (GPOINTER_TO_INT (data));
-
-    if (list >= 0)
-        aud_playlist_delete (list);
-}
-
-EXPORT void audgui_confirm_playlist_delete (int playlist)
-{
-    if (aud_get_bool ("audgui", "no_confirm_playlist_delete"))
-    {
-        aud_playlist_delete (playlist);
-        return;
-    }
-
-    char * title = aud_playlist_get_title (playlist);
-    SPRINTF (message, _("Do you want to permanently remove “%s”?"), title);
-    str_unref (title);
-
-    int id = aud_playlist_get_unique_id (playlist);
-    GtkWidget * button1 = audgui_button_new (_("_Remove"), "edit-delete",
-     confirm_delete_cb, GINT_TO_POINTER (id));
-    GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop", NULL, NULL);
-
-    GtkWidget * dialog = audgui_dialog_new (GTK_MESSAGE_QUESTION,
-     _("Remove Playlist"), message, button1, button2);
-
-    GtkWidget * check = gtk_check_button_new_with_mnemonic (_("_Don’t ask again"));
-    g_signal_connect (check, "toggled", (GCallback) no_confirm_cb, NULL);
-    audgui_dialog_add_widget (dialog, check);
-
-    gtk_widget_show_all (dialog);
-}
-
-static void rename_cb (void * entry)
-{
-    void * data = g_object_get_data ((GObject *) entry, "playlist-id");
-    int list = aud_playlist_by_unique_id (GPOINTER_TO_INT (data));
-
-    if (list >= 0)
-        aud_playlist_set_title (list, gtk_entry_get_text ((GtkEntry *) entry));
-}
-
-EXPORT void audgui_show_playlist_rename (int playlist)
-{
-    char * title = aud_playlist_get_title (playlist);
-
-    GtkWidget * entry = gtk_entry_new ();
-    gtk_entry_set_text ((GtkEntry *) entry, title);
-    gtk_entry_set_activates_default ((GtkEntry *) entry, TRUE);
-
-    int id = aud_playlist_get_unique_id (playlist);
-    g_object_set_data ((GObject *) entry, "playlist-id", GINT_TO_POINTER (id));
-
-    GtkWidget * button1 = audgui_button_new (_("_Rename"), "insert-text", rename_cb, entry);
-    GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop", NULL, NULL);
-
-    GtkWidget * dialog = audgui_dialog_new (GTK_MESSAGE_QUESTION,
-     _("Rename Playlist"), _("What would you like to call this playlist?"),
-     button1, button2);
-
-    audgui_dialog_add_widget (dialog, entry);
-
-    gtk_widget_show_all (dialog);
-
-    str_unref (title);
-}
diff --git a/src/libaudgui/confirm.cc b/src/libaudgui/confirm.cc
new file mode 100644
index 000000000000..bfcc176b3081
--- /dev/null
+++ b/src/libaudgui/confirm.cc
@@ -0,0 +1,97 @@
+/*
+ * confirm.c
+ * Copyright 2010-2013 John Lindgren and Thomas Lange
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gtk/gtk.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/runtime.h>
+
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+static void no_confirm_cb (GtkToggleButton * toggle)
+{
+    aud_set_bool ("audgui", "no_confirm_playlist_delete", gtk_toggle_button_get_active (toggle));
+}
+
+static void confirm_delete_cb (void * data)
+{
+    int list = aud_playlist_by_unique_id (GPOINTER_TO_INT (data));
+
+    if (list >= 0)
+        aud_playlist_delete (list);
+}
+
+EXPORT void audgui_confirm_playlist_delete (int playlist)
+{
+    if (aud_get_bool ("audgui", "no_confirm_playlist_delete"))
+    {
+        aud_playlist_delete (playlist);
+        return;
+    }
+
+    StringBuf message = str_printf (_("Do you want to permanently remove “%s”?"),
+     (const char *) aud_playlist_get_title (playlist));
+
+    int id = aud_playlist_get_unique_id (playlist);
+    GtkWidget * button1 = audgui_button_new (_("_Remove"), "edit-delete",
+     confirm_delete_cb, GINT_TO_POINTER (id));
+    GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop", nullptr, nullptr);
+
+    GtkWidget * dialog = audgui_dialog_new (GTK_MESSAGE_QUESTION,
+     _("Remove Playlist"), message, button1, button2);
+
+    GtkWidget * check = gtk_check_button_new_with_mnemonic (_("_Don’t ask again"));
+    g_signal_connect (check, "toggled", (GCallback) no_confirm_cb, nullptr);
+    audgui_dialog_add_widget (dialog, check);
+
+    gtk_widget_show_all (dialog);
+}
+
+static void rename_cb (void * entry)
+{
+    void * data = g_object_get_data ((GObject *) entry, "playlist-id");
+    int list = aud_playlist_by_unique_id (GPOINTER_TO_INT (data));
+
+    if (list >= 0)
+        aud_playlist_set_title (list, gtk_entry_get_text ((GtkEntry *) entry));
+}
+
+EXPORT void audgui_show_playlist_rename (int playlist)
+{
+    GtkWidget * entry = gtk_entry_new ();
+    gtk_entry_set_text ((GtkEntry *) entry, aud_playlist_get_title (playlist));
+    gtk_entry_set_activates_default ((GtkEntry *) entry, true);
+
+    int id = aud_playlist_get_unique_id (playlist);
+    g_object_set_data ((GObject *) entry, "playlist-id", GINT_TO_POINTER (id));
+
+    GtkWidget * button1 = audgui_button_new (_("_Rename"), "insert-text", rename_cb, entry);
+    GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop", nullptr, nullptr);
+
+    GtkWidget * dialog = audgui_dialog_new (GTK_MESSAGE_QUESTION,
+     _("Rename Playlist"), _("What would you like to call this playlist?"),
+     button1, button2);
+
+    audgui_dialog_add_widget (dialog, entry);
+
+    gtk_widget_show_all (dialog);
+}
diff --git a/src/libaudgui/equalizer.c b/src/libaudgui/equalizer.c
deleted file mode 100644
index 1c3a0825712b..000000000000
--- a/src/libaudgui/equalizer.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * equalizer.c
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <math.h>
-
-#include <audacious/i18n.h>
-#include <audacious/misc.h>
-#include <audacious/types.h>
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-
-#include "init.h"
-#include "libaudgui-gtk.h"
-
-static void on_off_cb (GtkToggleButton * on_off, void * unused)
-{
-    aud_set_bool (NULL, "equalizer_active", gtk_toggle_button_get_active (on_off));
-}
-
-static void on_off_update (void * unused, GtkWidget * on_off)
-{
-    gtk_toggle_button_set_active ((GtkToggleButton *) on_off, aud_get_bool
-     (NULL, "equalizer_active"));
-}
-
-static GtkWidget * create_on_off (void)
-{
-    GtkWidget * on_off = gtk_check_button_new_with_mnemonic (_("_Enable"));
-    g_signal_connect ((GObject *) on_off, "toggled", (GCallback) on_off_cb, NULL);
-    hook_associate ("set equalizer_active", (HookFunction) on_off_update, on_off);
-
-    on_off_update (NULL, on_off);
-    return on_off;
-}
-
-static void slider_moved (GtkRange * slider, void * unused)
-{
-    int band = GPOINTER_TO_INT (g_object_get_data ((GObject *) slider, "band"));
-    double value = round (gtk_range_get_value (slider));
-
-    if (band == -1)
-        aud_set_double (NULL, "equalizer_preamp", value);
-    else
-        aud_eq_set_band (band, value);
-}
-
-static GtkWidget * create_slider (const char * name, int band, GtkWidget * hbox)
-{
-    GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
-
-    GtkWidget * label = gtk_label_new (name);
-    gtk_label_set_angle ((GtkLabel *) label, 90);
-    gtk_box_pack_start ((GtkBox *) vbox, label, TRUE, FALSE, 0);
-
-    GtkWidget * slider = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL,
-     -EQUALIZER_MAX_GAIN, EQUALIZER_MAX_GAIN, 1);
-    gtk_scale_set_draw_value ((GtkScale *) slider, TRUE);
-    gtk_scale_set_value_pos ((GtkScale *) slider, GTK_POS_BOTTOM);
-    gtk_range_set_inverted ((GtkRange *) slider, TRUE);
-    gtk_widget_set_size_request (slider, -1, 120);
-
-    g_object_set_data ((GObject *) slider, "band", GINT_TO_POINTER (band));
-    g_signal_connect ((GObject *) slider, "value-changed", (GCallback) slider_moved, NULL);
-
-    gtk_box_pack_start ((GtkBox *) vbox, slider, FALSE, FALSE, 0);
-    gtk_box_pack_start ((GtkBox *) hbox, vbox, FALSE, FALSE, 0);
-
-    return slider;
-}
-
-static void set_slider (GtkWidget * slider, double value)
-{
-    g_signal_handlers_block_by_func (slider, (void *) slider_moved, NULL);
-    gtk_range_set_value ((GtkRange *) slider, round (value));
-    g_signal_handlers_unblock_by_func (slider, (void *) slider_moved, NULL);
-}
-
-static void update_sliders (void * unused, GtkWidget * window)
-{
-    GtkWidget * preamp = g_object_get_data ((GObject *) window, "preamp");
-    set_slider (preamp, aud_get_double (NULL, "equalizer_preamp"));
-
-    double values[AUD_EQUALIZER_NBANDS];
-    aud_eq_get_bands (values);
-
-    for (int i = 0; i < AUD_EQUALIZER_NBANDS; i ++)
-    {
-        SPRINTF (slider_id, "slider%d", i);
-        GtkWidget * slider = g_object_get_data ((GObject *) window, slider_id);
-        set_slider (slider, values[i]);
-    }
-}
-
-static void destroy_cb (void)
-{
-    hook_dissociate ("set equalizer_active", (HookFunction) on_off_update);
-    hook_dissociate ("set equalizer_bands", (HookFunction) update_sliders);
-    hook_dissociate ("set equalizer_preamp", (HookFunction) update_sliders);
-}
-
-static GtkWidget * create_window (void)
-{
-    const char * const names[AUD_EQUALIZER_NBANDS] = {N_("31 Hz"), N_("63 Hz"),
-     N_("125 Hz"), N_("250 Hz"), N_("500 Hz"), N_("1 kHz"), N_("2 kHz"),
-     N_("4 kHz"), N_("8 kHz"), N_("16 kHz")};
-
-    GtkWidget * window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-    gtk_window_set_title ((GtkWindow *) window, _("Equalizer"));
-    gtk_window_set_type_hint ((GtkWindow *) window, GDK_WINDOW_TYPE_HINT_DIALOG);
-    gtk_window_set_resizable ((GtkWindow *) window, FALSE);
-    gtk_container_set_border_width ((GtkContainer *) window, 6);
-    audgui_destroy_on_escape (window);
-
-    GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
-    gtk_container_add ((GtkContainer *) window, vbox);
-
-    gtk_box_pack_start ((GtkBox *) vbox, create_on_off (), FALSE, FALSE, 0);
-
-    GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,  6);
-    gtk_box_pack_start ((GtkBox *) vbox, hbox, FALSE, FALSE, 0);
-
-    GtkWidget * preamp = create_slider (_("Preamp"), -1, hbox);
-    g_object_set_data ((GObject *) window, "preamp", preamp);
-
-    gtk_box_pack_start ((GtkBox *) hbox,
-     gtk_separator_new (GTK_ORIENTATION_VERTICAL), FALSE, FALSE, 0);
-
-    for (int i = 0; i < AUD_EQUALIZER_NBANDS; i ++)
-    {
-        GtkWidget * slider = create_slider (_(names[i]), i, hbox);
-        SPRINTF (slider_id, "slider%d", i);
-        g_object_set_data ((GObject *) window, slider_id, slider);
-    }
-
-    update_sliders (NULL, window);
-
-    hook_associate ("set equalizer_preamp", (HookFunction) update_sliders, window);
-    hook_associate ("set equalizer_bands", (HookFunction) update_sliders, window);
-
-    g_signal_connect (window, "destroy", (GCallback) destroy_cb, NULL);
-
-    return window;
-}
-
-EXPORT void audgui_show_equalizer_window (void)
-{
-    if (! audgui_reshow_unique_window (AUDGUI_EQUALIZER_WINDOW))
-        audgui_show_unique_window (AUDGUI_EQUALIZER_WINDOW, create_window ());
-}
-
-EXPORT void audgui_hide_equalizer_window (void)
-{
-    audgui_hide_unique_window (AUDGUI_EQUALIZER_WINDOW);
-}
diff --git a/src/libaudgui/equalizer.cc b/src/libaudgui/equalizer.cc
new file mode 100644
index 000000000000..d0a8d923ebe4
--- /dev/null
+++ b/src/libaudgui/equalizer.cc
@@ -0,0 +1,169 @@
+/*
+ * equalizer.c
+ * Copyright 2010-2011 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <math.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/equalizer.h>
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/runtime.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+static void on_off_cb (GtkToggleButton * on_off)
+{
+    aud_set_bool (nullptr, "equalizer_active", gtk_toggle_button_get_active (on_off));
+}
+
+static void on_off_update (void *, GtkWidget * on_off)
+{
+    gtk_toggle_button_set_active ((GtkToggleButton *) on_off, aud_get_bool
+     (nullptr, "equalizer_active"));
+}
+
+static GtkWidget * create_on_off ()
+{
+    GtkWidget * on_off = gtk_check_button_new_with_mnemonic (_("_Enable"));
+    g_signal_connect (on_off, "toggled", (GCallback) on_off_cb, nullptr);
+    hook_associate ("set equalizer_active", (HookFunction) on_off_update, on_off);
+
+    on_off_update (nullptr, on_off);
+    return on_off;
+}
+
+static void slider_moved (GtkRange * slider)
+{
+    int band = GPOINTER_TO_INT (g_object_get_data ((GObject *) slider, "band"));
+    double value = round (gtk_range_get_value (slider));
+
+    if (band == -1)
+        aud_set_double (nullptr, "equalizer_preamp", value);
+    else
+        aud_eq_set_band (band, value);
+}
+
+static GtkWidget * create_slider (const char * name, int band, GtkWidget * hbox)
+{
+    GtkWidget * vbox = gtk_vbox_new (false, 6);
+
+    GtkWidget * label = gtk_label_new (name);
+    gtk_label_set_angle ((GtkLabel *) label, 90);
+    gtk_box_pack_start ((GtkBox *) vbox, label, true, false, 0);
+
+    GtkWidget * slider = gtk_vscale_new_with_range (-AUD_EQ_MAX_GAIN, AUD_EQ_MAX_GAIN, 1);
+    gtk_scale_set_draw_value ((GtkScale *) slider, true);
+    gtk_scale_set_value_pos ((GtkScale *) slider, GTK_POS_BOTTOM);
+    gtk_range_set_inverted ((GtkRange *) slider, true);
+    gtk_widget_set_size_request (slider, -1, 120);
+
+    g_object_set_data ((GObject *) slider, "band", GINT_TO_POINTER (band));
+    g_signal_connect (slider, "value-changed", (GCallback) slider_moved, nullptr);
+
+    gtk_box_pack_start ((GtkBox *) vbox, slider, false, false, 0);
+    gtk_box_pack_start ((GtkBox *) hbox, vbox, false, false, 0);
+
+    return slider;
+}
+
+static void set_slider (GtkWidget * slider, double value)
+{
+    g_signal_handlers_block_by_func (slider, (void *) slider_moved, nullptr);
+    gtk_range_set_value ((GtkRange *) slider, round (value));
+    g_signal_handlers_unblock_by_func (slider, (void *) slider_moved, nullptr);
+}
+
+static void update_sliders (void *, GtkWidget * window)
+{
+    GtkWidget * preamp = (GtkWidget *) g_object_get_data ((GObject *) window, "preamp");
+    set_slider (preamp, aud_get_double (nullptr, "equalizer_preamp"));
+
+    double values[AUD_EQ_NBANDS];
+    aud_eq_get_bands (values);
+
+    for (int i = 0; i < AUD_EQ_NBANDS; i ++)
+    {
+        StringBuf slider_id = str_printf ("slider%d", i);
+        GtkWidget * slider = (GtkWidget *) g_object_get_data ((GObject *) window, slider_id);
+        set_slider (slider, values[i]);
+    }
+}
+
+static void destroy_cb ()
+{
+    hook_dissociate ("set equalizer_active", (HookFunction) on_off_update);
+    hook_dissociate ("set equalizer_bands", (HookFunction) update_sliders);
+    hook_dissociate ("set equalizer_preamp", (HookFunction) update_sliders);
+}
+
+static GtkWidget * create_window ()
+{
+    const char * const names[AUD_EQ_NBANDS] = {N_("31 Hz"), N_("63 Hz"),
+     N_("125 Hz"), N_("250 Hz"), N_("500 Hz"), N_("1 kHz"), N_("2 kHz"),
+     N_("4 kHz"), N_("8 kHz"), N_("16 kHz")};
+
+    GtkWidget * window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_title ((GtkWindow *) window, _("Equalizer"));
+    gtk_window_set_type_hint ((GtkWindow *) window, GDK_WINDOW_TYPE_HINT_DIALOG);
+    gtk_window_set_resizable ((GtkWindow *) window, false);
+    gtk_container_set_border_width ((GtkContainer *) window, 6);
+    audgui_destroy_on_escape (window);
+
+    GtkWidget * vbox = gtk_vbox_new (false, 6);
+    gtk_container_add ((GtkContainer *) window, vbox);
+
+    gtk_box_pack_start ((GtkBox *) vbox, create_on_off (), false, false, 0);
+
+    GtkWidget * hbox = gtk_hbox_new (false, 6);
+    gtk_box_pack_start ((GtkBox *) vbox, hbox, false, false, 0);
+
+    GtkWidget * preamp = create_slider (_("Preamp"), -1, hbox);
+    g_object_set_data ((GObject *) window, "preamp", preamp);
+
+    gtk_box_pack_start ((GtkBox *) hbox, gtk_vseparator_new (), false, false, 0);
+
+    for (int i = 0; i < AUD_EQ_NBANDS; i ++)
+    {
+        StringBuf slider_id = str_printf ("slider%d", i);
+        GtkWidget * slider = create_slider (_(names[i]), i, hbox);
+        g_object_set_data ((GObject *) window, slider_id, slider);
+    }
+
+    update_sliders (nullptr, window);
+
+    hook_associate ("set equalizer_preamp", (HookFunction) update_sliders, window);
+    hook_associate ("set equalizer_bands", (HookFunction) update_sliders, window);
+
+    g_signal_connect (window, "destroy", (GCallback) destroy_cb, nullptr);
+
+    return window;
+}
+
+EXPORT void audgui_show_equalizer_window ()
+{
+    if (! audgui_reshow_unique_window (AUDGUI_EQUALIZER_WINDOW))
+        audgui_show_unique_window (AUDGUI_EQUALIZER_WINDOW, create_window ());
+}
+
+EXPORT void audgui_hide_equalizer_window ()
+{
+    audgui_hide_unique_window (AUDGUI_EQUALIZER_WINDOW);
+}
diff --git a/src/libaudgui/file-opener.cc b/src/libaudgui/file-opener.cc
new file mode 100644
index 000000000000..4417f3a5103a
--- /dev/null
+++ b/src/libaudgui/file-opener.cc
@@ -0,0 +1,155 @@
+/*
+ * file-opener.c
+ * Copyright 2007-2013 Michael Färber and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gtk/gtk.h>
+
+#include <libaudcore/drct.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/runtime.h>
+#include <libaudcore/tuple.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+static Index<PlaylistAddItem> get_files (GtkWidget * chooser)
+{
+    Index<PlaylistAddItem> index;
+    GSList * list = gtk_file_chooser_get_uris ((GtkFileChooser *) chooser);
+
+    for (GSList * node = list; node; node = node->next)
+        index.append (String ((const char *) node->data));
+
+    g_slist_free_full (list, g_free);
+    return index;
+}
+
+static void open_cb (void * data)
+{
+    GtkWidget * chooser = (GtkWidget *) data;
+    Index<PlaylistAddItem> files = get_files (chooser);
+    gboolean open = GPOINTER_TO_INT (g_object_get_data ((GObject *) chooser, "do-open"));
+
+    if (open)
+        aud_drct_pl_open_list (std::move (files));
+    else
+        aud_drct_pl_add_list (std::move (files), -1);
+
+    GtkWidget * toggle = (GtkWidget *) g_object_get_data ((GObject *) chooser, "toggle-button");
+    if (gtk_toggle_button_get_active ((GtkToggleButton *) toggle))
+        audgui_hide_filebrowser ();
+}
+
+static void destroy_cb (GtkWidget * chooser)
+{
+    char * path = gtk_file_chooser_get_current_folder ((GtkFileChooser *) chooser);
+    if (path)
+    {
+        aud_set_str ("audgui", "filesel_path", path);
+        g_free (path);
+    }
+}
+
+static void toggled_cb (GtkToggleButton * toggle, void * option)
+{
+    aud_set_bool ("audgui", (const char *) option, gtk_toggle_button_get_active (toggle));
+}
+
+static GtkWidget * create_filebrowser (gboolean open)
+{
+    const char * window_title, * verb, * icon, * toggle_text, * option;
+
+    if (open)
+    {
+        window_title = _("Open Files");
+        verb = _("_Open");
+        icon = "document-open";
+        toggle_text = _("Close _dialog on open");
+        option = "close_dialog_open";
+    }
+    else
+    {
+        window_title = _("Add Files");
+        verb = _("_Add");
+        icon = "list-add";
+        toggle_text = _("Close _dialog on add");
+        option = "close_dialog_add";
+    }
+
+    GtkWidget * window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_type_hint ((GtkWindow *) window, GDK_WINDOW_TYPE_HINT_DIALOG);
+    gtk_window_set_title ((GtkWindow *) window, window_title);
+    gtk_window_set_default_size ((GtkWindow *) window, 700, 450);
+    gtk_container_set_border_width ((GtkContainer *) window, 10);
+
+    GtkWidget * vbox = gtk_vbox_new (false, 0);
+    gtk_container_add ((GtkContainer *) window, vbox);
+
+    GtkWidget * chooser = gtk_file_chooser_widget_new (GTK_FILE_CHOOSER_ACTION_OPEN);
+    gtk_file_chooser_set_select_multiple ((GtkFileChooser *) chooser, true);
+
+    String path = aud_get_str ("audgui", "filesel_path");
+    if (path[0])
+        gtk_file_chooser_set_current_folder ((GtkFileChooser *) chooser, path);
+
+    gtk_box_pack_start ((GtkBox *) vbox, chooser, true, true, 3);
+
+    GtkWidget * hbox = gtk_hbox_new (false, 0);
+    gtk_box_pack_end ((GtkBox *) vbox, hbox, false, false, 3);
+
+    GtkWidget * toggle = gtk_check_button_new_with_mnemonic (toggle_text);
+    gtk_toggle_button_set_active ((GtkToggleButton *) toggle, aud_get_bool ("audgui", option));
+    g_signal_connect (toggle, "toggled", (GCallback) toggled_cb, (void *) option);
+    gtk_box_pack_start ((GtkBox *) hbox, toggle, true, true, 0);
+
+    GtkWidget * bbox = gtk_hbutton_box_new ();
+    gtk_button_box_set_layout ((GtkButtonBox *) bbox, GTK_BUTTONBOX_END);
+    gtk_box_set_spacing ((GtkBox *) bbox, 6);
+    gtk_box_pack_end ((GtkBox *) hbox, bbox, true, true, 0);
+
+    GtkWidget * action_button = audgui_button_new (verb, icon, open_cb, chooser);
+    GtkWidget * close_button = audgui_button_new (_("_Close"), "window-close",
+     (AudguiCallback) audgui_hide_filebrowser, nullptr);
+
+    gtk_container_add ((GtkContainer *) bbox, close_button);
+    gtk_container_add ((GtkContainer *) bbox, action_button);
+
+    gtk_widget_set_can_default (action_button, true);
+    gtk_widget_grab_default (action_button);
+
+    g_object_set_data ((GObject *) chooser, "toggle-button", toggle);
+    g_object_set_data ((GObject *) chooser, "do-open", GINT_TO_POINTER (open));
+
+    g_signal_connect (chooser, "file-activated", (GCallback) open_cb, nullptr);
+    g_signal_connect (chooser, "destroy", (GCallback) destroy_cb, nullptr);
+
+    audgui_destroy_on_escape (window);
+
+    return window;
+}
+
+EXPORT void audgui_run_filebrowser (bool open)
+{
+    audgui_show_unique_window (AUDGUI_FILEBROWSER_WINDOW, create_filebrowser (open));
+}
+
+EXPORT void audgui_hide_filebrowser ()
+{
+    audgui_hide_unique_window (AUDGUI_FILEBROWSER_WINDOW);
+}
diff --git a/src/libaudgui/infopopup.c b/src/libaudgui/infopopup.c
deleted file mode 100644
index d0f6fb0e491e..000000000000
--- a/src/libaudgui/infopopup.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * infopopup.c
- * Copyright 2006-2012 William Pitcock, Giacomo Lozito, John Lindgren, and
- *                     Thomas Lange
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gtk/gtk.h>
-#include <string.h>
-
-#include <audacious/drct.h>
-#include <audacious/i18n.h>
-#include <audacious/misc.h>
-#include <audacious/playlist.h>
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-
-#include "init.h"
-#include "libaudgui.h"
-#include "libaudgui-gtk.h"
-
-#define IMAGE_SIZE 96
-
-static struct {
-    GtkWidget * title_header, * title_label;
-    GtkWidget * artist_header, * artist_label;
-    GtkWidget * album_header, * album_label;
-    GtkWidget * genre_header, * genre_label;
-    GtkWidget * year_header, * year_label;
-    GtkWidget * track_header, * track_label;
-    GtkWidget * length_header, * length_label;
-    GtkWidget * image;
-    GtkWidget * progress;
-} widgets;
-
-static char * current_file = NULL;
-static int progress_source = 0;
-
-static void infopopup_display_image (const char * filename)
-{
-    if (! current_file || strcmp (filename, current_file))
-        return;
-
-    GdkPixbuf * pb = audgui_pixbuf_request (filename);
-    if (! pb)
-        pb = audgui_pixbuf_fallback ();
-
-    audgui_pixbuf_scale_within (& pb, IMAGE_SIZE);
-    gtk_image_set_from_pixbuf ((GtkImage *) widgets.image, pb);
-    g_object_unref (pb);
-}
-
-static bool_t infopopup_progress_cb (void * unused)
-{
-    char * filename = NULL;
-    int length = 0, time = 0;
-
-    if (aud_drct_get_playing ())
-    {
-        filename = aud_drct_get_filename ();
-        length = aud_drct_get_length ();
-        time = aud_drct_get_time ();
-    }
-
-    if (aud_get_bool (NULL, "filepopup_showprogressbar") && filename &&
-     current_file && ! strcmp (filename, current_file) && length > 0)
-    {
-        gtk_progress_bar_set_fraction ((GtkProgressBar *) widgets.progress,
-         time / (float) length);
-
-        char time_str[16];
-        audgui_format_time (time_str, sizeof time_str, time);
-        gtk_progress_bar_set_text ((GtkProgressBar *) widgets.progress, time_str);
-
-        gtk_widget_show (widgets.progress);
-    }
-    else
-        gtk_widget_hide (widgets.progress);
-
-    str_unref (filename);
-    return TRUE;
-}
-
-static void infopopup_add_category (GtkWidget * grid, int position,
- const char * text, GtkWidget * * header, GtkWidget * * label)
-{
-    * header = gtk_label_new (NULL);
-    * label = gtk_label_new (NULL);
-
-    gtk_misc_set_alignment ((GtkMisc *) * header, 0, 0.5);
-    gtk_misc_set_alignment ((GtkMisc *) * label, 0, 0.5);
-    gtk_misc_set_padding ((GtkMisc *) * header, 0, 1);
-    gtk_misc_set_padding ((GtkMisc *) * label, 0, 1);
-
-    char * markup = g_markup_printf_escaped ("<span style=\"italic\">%s</span>", text);
-    gtk_label_set_markup ((GtkLabel *) * header, markup);
-    g_free (markup);
-
-    gtk_grid_attach ((GtkGrid *) grid, * header, 0, position, 1, 1);
-    gtk_grid_attach ((GtkGrid *) grid, * label, 1, position, 1, 1);
-}
-
-static void infopopup_destroyed (void)
-{
-    hook_dissociate ("art ready", (HookFunction) infopopup_display_image);
-
-    if (progress_source)
-    {
-        g_source_remove (progress_source);
-        progress_source = 0;
-    }
-
-    memset (& widgets, 0, sizeof widgets);
-
-    str_unref (current_file);
-    current_file = NULL;
-}
-
-static GtkWidget * infopopup_create (void)
-{
-    GtkWidget * infopopup = gtk_window_new (GTK_WINDOW_POPUP);
-    gtk_window_set_type_hint ((GtkWindow *) infopopup, GDK_WINDOW_TYPE_HINT_TOOLTIP);
-    gtk_window_set_decorated ((GtkWindow *) infopopup, FALSE);
-    gtk_container_set_border_width ((GtkContainer *) infopopup, 4);
-
-    GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,  6);
-    gtk_container_add ((GtkContainer *) infopopup, hbox);
-
-    widgets.image = gtk_image_new ();
-    gtk_widget_set_size_request (widgets.image, IMAGE_SIZE, IMAGE_SIZE);
-    gtk_box_pack_start ((GtkBox *) hbox, widgets.image, FALSE, FALSE, 0);
-
-    GtkWidget * grid = gtk_grid_new ();
-    gtk_grid_set_column_spacing ((GtkGrid *) grid, 6);
-    gtk_box_pack_start ((GtkBox *) hbox, grid, TRUE, TRUE, 0);
-
-    infopopup_add_category (grid, 0, _("Title"), & widgets.title_header, & widgets.title_label);
-    infopopup_add_category (grid, 1, _("Artist"), & widgets.artist_header, & widgets.artist_label);
-    infopopup_add_category (grid, 2, _("Album"), & widgets.album_header, & widgets.album_label);
-    infopopup_add_category (grid, 3, _("Genre"), & widgets.genre_header, & widgets.genre_label);
-    infopopup_add_category (grid, 4, _("Year"), & widgets.year_header, & widgets.year_label);
-    infopopup_add_category (grid, 5, _("Track"), & widgets.track_header, & widgets.track_label);
-    infopopup_add_category (grid, 6, _("Length"), & widgets.length_header, & widgets.length_label);
-
-    /* track progress */
-    widgets.progress = gtk_progress_bar_new ();
-    gtk_widget_set_margin_top (widgets.progress, 6);
-    gtk_progress_bar_set_show_text ((GtkProgressBar *) widgets.progress, TRUE);
-    gtk_progress_bar_set_text ((GtkProgressBar *) widgets.progress, "");
-    gtk_grid_attach ((GtkGrid *) grid, widgets.progress, 0, 7, 2, 1);
-
-    /* do not show the track progress */
-    gtk_widget_set_no_show_all (widgets.progress, TRUE);
-
-    return infopopup;
-}
-
-/* calls str_unref() on <text> */
-static void infopopup_set_field (GtkWidget * header, GtkWidget * label, char * text)
-{
-    if (text)
-    {
-        gtk_label_set_text ((GtkLabel *) label, text);
-        str_unref (text);
-
-        gtk_widget_show (header);
-        gtk_widget_show (label);
-    }
-    else
-    {
-        gtk_widget_hide (header);
-        gtk_widget_hide (label);
-    }
-}
-
-static void infopopup_set_fields (const Tuple * tuple, const char * title)
-{
-    /* use title from tuple if possible */
-    char * title2 = tuple_get_str (tuple, FIELD_TITLE);
-    if (! title2)
-        title2 = str_get (title);
-
-    char * artist = tuple_get_str (tuple, FIELD_ARTIST);
-    char * album = tuple_get_str (tuple, FIELD_ALBUM);
-    char * genre = tuple_get_str (tuple, FIELD_GENRE);
-
-    infopopup_set_field (widgets.title_header, widgets.title_label, title2);
-    infopopup_set_field (widgets.artist_header, widgets.artist_label, artist);
-    infopopup_set_field (widgets.album_header, widgets.album_label, album);
-    infopopup_set_field (widgets.genre_header, widgets.genre_label, genre);
-
-    int value;
-    char * tmp;
-
-    value = tuple_get_int (tuple, FIELD_LENGTH);
-
-    if (value > 0)
-    {
-        char buf[16];
-        audgui_format_time (buf, sizeof buf, value);
-        tmp = str_get (buf);
-    }
-    else
-        tmp = NULL;
-
-    infopopup_set_field (widgets.length_header, widgets.length_label, tmp);
-
-    value = tuple_get_int (tuple, FIELD_YEAR);
-    tmp = (value > 0) ? int_to_str (value) : NULL;
-    infopopup_set_field (widgets.year_header, widgets.year_label, tmp);
-
-    value = tuple_get_int (tuple, FIELD_TRACK_NUMBER);
-    tmp = (value > 0) ? int_to_str (value) : NULL;
-    infopopup_set_field (widgets.track_header, widgets.track_label, tmp);
-}
-
-static void infopopup_move_to_mouse (GtkWidget * infopopup)
-{
-    int x, y, h, w;
-
-    audgui_get_mouse_coords (NULL, & x, & y);
-    gtk_window_get_size ((GtkWindow *) infopopup, & w, & h);
-
-    /* If we show the popup right under the cursor, the underlying window gets
-     * a "leave-notify-event" and immediately hides the popup again.  So, we
-     * offset the popup slightly. */
-    if (x + w > gdk_screen_width ())
-        x -= w + 3;
-    else
-        x += 3;
-
-    if (y + h > gdk_screen_height ())
-        y -= h + 3;
-    else
-        y += 3;
-
-    gtk_window_move ((GtkWindow *) infopopup, x, y);
-}
-
-static void infopopup_show (const char * filename, const Tuple * tuple,
- const char * title)
-{
-    audgui_hide_unique_window (AUDGUI_INFOPOPUP_WINDOW);
-
-    str_unref (current_file);
-    current_file = str_get (filename);
-
-    GtkWidget * infopopup = infopopup_create ();
-    infopopup_set_fields (tuple, title);
-    infopopup_display_image (filename);
-
-    hook_associate ("art ready", (HookFunction) infopopup_display_image, NULL);
-
-    g_signal_connect (infopopup, "destroy", (GCallback) infopopup_destroyed, NULL);
-
-    /* start a timer that updates a progress bar if the tooltip
-       is shown for the song that is being currently played */
-    if (! progress_source)
-        progress_source = g_timeout_add (500, infopopup_progress_cb, NULL);
-
-    /* immediately run the callback once to update progressbar status */
-    infopopup_progress_cb (NULL);
-
-    infopopup_move_to_mouse (infopopup);
-
-    audgui_show_unique_window (AUDGUI_INFOPOPUP_WINDOW, infopopup);
-}
-
-EXPORT void audgui_infopopup_show (int playlist, int entry)
-{
-    char * filename = aud_playlist_entry_get_filename (playlist, entry);
-    char * title = aud_playlist_entry_get_title (playlist, entry, FALSE);
-    Tuple * tuple = aud_playlist_entry_get_tuple (playlist, entry, FALSE);
-
-    if (filename && title && tuple)
-        infopopup_show (filename, tuple, title);
-
-    str_unref (filename);
-    str_unref (title);
-    if (tuple)
-        tuple_unref (tuple);
-}
-
-EXPORT void audgui_infopopup_show_current (void)
-{
-    int playlist = aud_playlist_get_playing ();
-    if (playlist < 0)
-        playlist = aud_playlist_get_active ();
-
-    int position = aud_playlist_get_position (playlist);
-    if (position < 0)
-        return;
-
-    audgui_infopopup_show (playlist, position);
-}
-
-EXPORT void audgui_infopopup_hide (void)
-{
-    audgui_hide_unique_window (AUDGUI_INFOPOPUP_WINDOW);
-}
diff --git a/src/libaudgui/infopopup.cc b/src/libaudgui/infopopup.cc
new file mode 100644
index 000000000000..3051225e54ba
--- /dev/null
+++ b/src/libaudgui/infopopup.cc
@@ -0,0 +1,352 @@
+/*
+ * infopopup.c
+ * Copyright 2006-2012 William Pitcock, Giacomo Lozito, John Lindgren, and
+ *                     Thomas Lange
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gtk/gtk.h>
+#include <string.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/drct.h>
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/runtime.h>
+#include <libaudcore/tuple.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+#define IMAGE_SIZE 96
+
+static void infopopup_move_to_mouse (GtkWidget * infopopup);
+
+static const GdkColor gray = {0, 40960, 40960, 40960};
+static const GdkColor white = {0, 65535, 65535, 65535};
+
+static struct {
+    GtkWidget * title_header, * title_label;
+    GtkWidget * artist_header, * artist_label;
+    GtkWidget * album_header, * album_label;
+    GtkWidget * genre_header, * genre_label;
+    GtkWidget * year_header, * year_label;
+    GtkWidget * track_header, * track_label;
+    GtkWidget * length_header, * length_label;
+    GtkWidget * image;
+    GtkWidget * progress;
+} widgets;
+
+static String current_file;
+static GtkWidget * infopopup_queued;
+static int progress_source = 0;
+
+/* returns false if album art fetch was queued */
+static bool infopopup_display_image (const char * filename)
+{
+    bool queued;
+    GdkPixbuf * pb = audgui_pixbuf_request (filename, & queued);
+    if (! pb)
+        return ! queued;
+
+    audgui_pixbuf_scale_within (& pb, IMAGE_SIZE);
+    gtk_image_set_from_pixbuf ((GtkImage *) widgets.image, pb);
+    gtk_widget_show (widgets.image);
+
+    g_object_unref (pb);
+    return true;
+}
+
+static void infopopup_art_ready (const char * filename)
+{
+    if (! infopopup_queued || strcmp (filename, current_file))
+        return;
+
+    infopopup_display_image (filename);
+    audgui_show_unique_window (AUDGUI_INFOPOPUP_WINDOW, infopopup_queued);
+    infopopup_queued = nullptr;
+}
+
+static gboolean infopopup_progress_cb (void *)
+{
+    String filename;
+    int length = 0, time = 0;
+
+    if (aud_drct_get_playing ())
+    {
+        filename = aud_drct_get_filename ();
+        length = aud_drct_get_length ();
+        time = aud_drct_get_time ();
+    }
+
+    if (aud_get_bool (nullptr, "filepopup_showprogressbar") && filename &&
+     current_file && ! strcmp (filename, current_file) && length > 0)
+    {
+        gtk_progress_bar_set_fraction ((GtkProgressBar *) widgets.progress, time / (float) length);
+        gtk_progress_bar_set_text ((GtkProgressBar *) widgets.progress, str_format_time (time));
+        gtk_widget_show (widgets.progress);
+    }
+    else
+        gtk_widget_hide (widgets.progress);
+
+    return true;
+}
+
+static void infopopup_realized (GtkWidget * widget)
+{
+    GdkWindow * window = gtk_widget_get_window (widget);
+    gdk_window_set_back_pixmap (window, nullptr, false);
+    infopopup_move_to_mouse (widget);
+}
+
+/* borrowed from the gtkui infoarea */
+static gboolean infopopup_draw_bg (GtkWidget * widget)
+{
+    GtkAllocation alloc;
+    gtk_widget_get_allocation (widget, & alloc);
+
+    cairo_t * cr = gdk_cairo_create (gtk_widget_get_window (widget));
+
+    cairo_pattern_t * gradient = cairo_pattern_create_linear (0, 0, 0, alloc.height);
+    cairo_pattern_add_color_stop_rgb (gradient, 0, 0.25, 0.25, 0.25);
+    cairo_pattern_add_color_stop_rgb (gradient, 0.5, 0.15, 0.15, 0.15);
+    cairo_pattern_add_color_stop_rgb (gradient, 0.5, 0.1, 0.1, 0.1);
+    cairo_pattern_add_color_stop_rgb (gradient, 1, 0, 0, 0);
+
+    cairo_set_source (cr, gradient);
+    cairo_rectangle (cr, 0, 0, alloc.width, alloc.height);
+    cairo_fill (cr);
+
+    cairo_pattern_destroy (gradient);
+    cairo_destroy (cr);
+    return false;
+}
+
+static void infopopup_add_category (GtkWidget * grid, int position,
+ const char * text, GtkWidget * * header, GtkWidget * * label)
+{
+    * header = gtk_label_new (nullptr);
+    * label = gtk_label_new (nullptr);
+
+    gtk_misc_set_alignment ((GtkMisc *) * header, 1, 0.5);
+    gtk_misc_set_alignment ((GtkMisc *) * label, 0, 0.5);
+
+    gtk_widget_modify_fg (* header, GTK_STATE_NORMAL, & gray);
+    gtk_widget_modify_fg (* label, GTK_STATE_NORMAL, & white);
+
+    char * markup = g_markup_printf_escaped ("<span style=\"italic\">%s</span>", text);
+    gtk_label_set_markup ((GtkLabel *) * header, markup);
+    g_free (markup);
+
+    gtk_table_attach ((GtkTable *) grid, * header, 0, 1, position, position + 1,
+     GTK_FILL, GTK_FILL, 0, 0);
+    gtk_table_attach ((GtkTable *) grid, * label, 1, 2, position, position + 1,
+     GTK_FILL, GTK_FILL, 0, 0);
+
+    gtk_widget_set_no_show_all (* header, true);
+    gtk_widget_set_no_show_all (* label, true);
+}
+
+static void infopopup_destroyed ()
+{
+    hook_dissociate ("art ready", (HookFunction) infopopup_art_ready);
+
+    if (progress_source)
+    {
+        g_source_remove (progress_source);
+        progress_source = 0;
+    }
+
+    memset (& widgets, 0, sizeof widgets);
+
+    current_file = String ();
+    infopopup_queued = nullptr;
+}
+
+static GtkWidget * infopopup_create ()
+{
+    GtkWidget * infopopup = gtk_window_new (GTK_WINDOW_POPUP);
+    gtk_window_set_type_hint ((GtkWindow *) infopopup, GDK_WINDOW_TYPE_HINT_TOOLTIP);
+    gtk_window_set_decorated ((GtkWindow *) infopopup, false);
+    gtk_container_set_border_width ((GtkContainer *) infopopup, 4);
+
+    GtkWidget * hbox = gtk_hbox_new (false, 6);
+    gtk_container_add ((GtkContainer *) infopopup, hbox);
+
+    widgets.image = gtk_image_new ();
+    gtk_widget_set_size_request (widgets.image, IMAGE_SIZE, IMAGE_SIZE);
+    gtk_box_pack_start ((GtkBox *) hbox, widgets.image, false, false, 0);
+    gtk_widget_set_no_show_all (widgets.image, true);
+
+    GtkWidget * grid = gtk_table_new (0, 0, false);
+    gtk_table_set_col_spacings ((GtkTable *) grid, 6);
+    gtk_box_pack_start ((GtkBox *) hbox, grid, true, true, 0);
+
+    infopopup_add_category (grid, 0, _("Title"), & widgets.title_header, & widgets.title_label);
+    infopopup_add_category (grid, 1, _("Artist"), & widgets.artist_header, & widgets.artist_label);
+    infopopup_add_category (grid, 2, _("Album"), & widgets.album_header, & widgets.album_label);
+    infopopup_add_category (grid, 3, _("Genre"), & widgets.genre_header, & widgets.genre_label);
+    infopopup_add_category (grid, 4, _("Year"), & widgets.year_header, & widgets.year_label);
+    infopopup_add_category (grid, 5, _("Track"), & widgets.track_header, & widgets.track_label);
+    infopopup_add_category (grid, 6, _("Length"), & widgets.length_header, & widgets.length_label);
+
+    /* track progress */
+    widgets.progress = gtk_progress_bar_new ();
+    gtk_progress_bar_set_text ((GtkProgressBar *) widgets.progress, "");
+    gtk_table_set_row_spacing ((GtkTable *) grid, 6, 4);
+    gtk_table_attach ((GtkTable *) grid, widgets.progress, 0, 2, 7, 8,
+     GTK_FILL, GTK_FILL, 0, 0);
+
+    /* do not show the track progress */
+    gtk_widget_set_no_show_all (widgets.progress, true);
+
+    /* override background drawing */
+    gtk_widget_set_app_paintable (infopopup, true);
+
+    GtkStyle * style = gtk_style_new ();
+    gtk_widget_set_style (infopopup, style);
+    g_object_unref (style);
+
+    g_signal_connect (infopopup, "realize", (GCallback) infopopup_realized, nullptr);
+    g_signal_connect (infopopup, "expose-event", (GCallback) infopopup_draw_bg, nullptr);
+
+    return infopopup;
+}
+
+static void infopopup_set_field (GtkWidget * header, GtkWidget * label, const char * text)
+{
+    if (text)
+    {
+        gtk_label_set_text ((GtkLabel *) label, text);
+        gtk_widget_show (header);
+        gtk_widget_show (label);
+    }
+    else
+    {
+        gtk_widget_hide (header);
+        gtk_widget_hide (label);
+    }
+}
+
+static void infopopup_set_fields (const Tuple & tuple)
+{
+    String title = tuple.get_str (Tuple::Title);
+    String artist = tuple.get_str (Tuple::Artist);
+    String album = tuple.get_str (Tuple::Album);
+    String genre = tuple.get_str (Tuple::Genre);
+
+    infopopup_set_field (widgets.title_header, widgets.title_label, title);
+    infopopup_set_field (widgets.artist_header, widgets.artist_label, artist);
+    infopopup_set_field (widgets.album_header, widgets.album_label, album);
+    infopopup_set_field (widgets.genre_header, widgets.genre_label, genre);
+
+    int value = tuple.get_int (Tuple::Length);
+    infopopup_set_field (widgets.length_header, widgets.length_label,
+     (value > 0) ? (const char *) str_format_time (value) : nullptr);
+
+    value = tuple.get_int (Tuple::Year);
+    infopopup_set_field (widgets.year_header, widgets.year_label,
+     (value > 0) ? (const char *) int_to_str (value) : nullptr);
+
+    value = tuple.get_int (Tuple::Track);
+    infopopup_set_field (widgets.track_header, widgets.track_label,
+     (value > 0) ? (const char *) int_to_str (value) : nullptr);
+}
+
+static void infopopup_move_to_mouse (GtkWidget * infopopup)
+{
+    GdkScreen * screen = gtk_widget_get_screen (infopopup);
+    GdkRectangle geom;
+    int x, y, h, w;
+
+    audgui_get_mouse_coords (screen, & x, & y);
+    audgui_get_monitor_geometry (screen, x, y, & geom);
+    gtk_window_get_size ((GtkWindow *) infopopup, & w, & h);
+
+    /* If we show the popup right under the cursor, the underlying window gets
+     * a "leave-notify-event" and immediately hides the popup again.  So, we
+     * offset the popup slightly. */
+    if (x + w > geom.x + geom.width)
+        x -= w + 3;
+    else
+        x += 3;
+
+    if (y + h > geom.y + geom.height)
+        y -= h + 3;
+    else
+        y += 3;
+
+    gtk_window_move ((GtkWindow *) infopopup, x, y);
+}
+
+static void infopopup_show (const char * filename, const Tuple & tuple)
+{
+    audgui_infopopup_hide ();
+
+    current_file = String (filename);
+
+    GtkWidget * infopopup = infopopup_create ();
+    infopopup_set_fields (tuple);
+
+    hook_associate ("art ready", (HookFunction) infopopup_art_ready, nullptr);
+
+    g_signal_connect (infopopup, "destroy", (GCallback) infopopup_destroyed, nullptr);
+
+    /* start a timer that updates a progress bar if the tooltip
+       is shown for the song that is being currently played */
+    if (! progress_source)
+        progress_source = g_timeout_add (500, infopopup_progress_cb, nullptr);
+
+    /* immediately run the callback once to update progressbar status */
+    infopopup_progress_cb (nullptr);
+
+    if (infopopup_display_image (filename))
+        audgui_show_unique_window (AUDGUI_INFOPOPUP_WINDOW, infopopup);
+    else
+        infopopup_queued = infopopup;
+}
+
+EXPORT void audgui_infopopup_show (int playlist, int entry)
+{
+    String filename = aud_playlist_entry_get_filename (playlist, entry);
+    Tuple tuple = aud_playlist_entry_get_tuple (playlist, entry);
+
+    if (filename && tuple)
+        infopopup_show (filename, tuple);
+}
+
+EXPORT void audgui_infopopup_show_current ()
+{
+    int playlist = aud_playlist_get_playing ();
+    if (playlist < 0)
+        playlist = aud_playlist_get_active ();
+
+    int position = aud_playlist_get_position (playlist);
+    if (position < 0)
+        return;
+
+    audgui_infopopup_show (playlist, position);
+}
+
+EXPORT void audgui_infopopup_hide ()
+{
+    audgui_hide_unique_window (AUDGUI_INFOPOPUP_WINDOW);
+
+    if (infopopup_queued)
+        gtk_widget_destroy (infopopup_queued);
+}
diff --git a/src/libaudgui/infowin.c b/src/libaudgui/infowin.c
deleted file mode 100644
index 530a65ef7302..000000000000
--- a/src/libaudgui/infowin.c
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * libaudgui/infowin.c
- * Copyright 2006-2013 William Pitcock, Tomasz Moń, Eugene Zagidullin,
- *                     John Lindgren, and Thomas Lange
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gtk/gtk.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <audacious/i18n.h>
-#include <audacious/misc.h>
-#include <audacious/playlist.h>
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-
-#include "init.h"
-#include "libaudgui.h"
-#include "libaudgui-gtk.h"
-
-#define AUDGUI_STATUS_TIMEOUT 3000
-
-enum {
-    CODEC_FORMAT,
-    CODEC_QUALITY,
-    CODEC_BITRATE,
-    CODEC_ITEMS
-};
-
-static const char * codec_labels[CODEC_ITEMS] = {
-    N_("Format:"),
-    N_("Quality:"),
-    N_("Bitrate:")
-};
-
-static struct {
-    GtkWidget * location;
-    GtkWidget * title;
-    GtkWidget * artist;
-    GtkWidget * album;
-    GtkWidget * comment;
-    GtkWidget * year;
-    GtkWidget * track;
-    GtkWidget * genre;
-    GtkWidget * image;
-    GtkWidget * codec[3];
-    GtkWidget * apply;
-    GtkWidget * ministatus;
-} widgets;
-
-static char * current_file = NULL;
-static PluginHandle * current_decoder = NULL;
-static bool_t can_write = FALSE;
-static int timeout_source = 0;
-
-/* This is by no means intended to be a complete list.  If it is not short, it
- * is useless: scrolling through ten pages of dropdown list is more work than
- * typing out the genre. */
-
-static const char * genre_table[] = {
- N_("Acid Jazz"),
- N_("Acid Rock"),
- N_("Ambient"),
- N_("Bebop"),
- N_("Bluegrass"),
- N_("Blues"),
- N_("Chamber Music"),
- N_("Classical"),
- N_("Country"),
- N_("Death Metal"),
- N_("Disco"),
- N_("Easy Listening"),
- N_("Folk"),
- N_("Funk"),
- N_("Gangsta Rap"),
- N_("Gospel"),
- N_("Grunge"),
- N_("Hard Rock"),
- N_("Heavy Metal"),
- N_("Hip-hop"),
- N_("House"),
- N_("Jazz"),
- N_("Jungle"),
- N_("Metal"),
- N_("New Age"),
- N_("New Wave"),
- N_("Noise"),
- N_("Pop"),
- N_("Punk Rock"),
- N_("Rap"),
- N_("Reggae"),
- N_("Rock"),
- N_("Rock and Roll"),
- N_("Rhythm and Blues"),
- N_("Ska"),
- N_("Soul"),
- N_("Swing"),
- N_("Techno"),
- N_("Trip-hop")};
-
-static GtkWidget * small_label_new (const char * text)
-{
-    static PangoAttrList * attrs = NULL;
-
-    if (! attrs)
-    {
-        attrs = pango_attr_list_new ();
-        pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_SMALL));
-    }
-
-    GtkWidget * label = gtk_label_new (text);
-    gtk_label_set_attributes ((GtkLabel *) label, attrs);
-    gtk_misc_set_alignment ((GtkMisc *) label, 0, 0.5);
-
-    return label;
-}
-
-static void set_entry_str_from_field (GtkWidget * widget, const Tuple * tuple,
- int fieldn, bool_t editable)
-{
-    char * text = tuple_get_str (tuple, fieldn);
-
-    gtk_entry_set_text ((GtkEntry *) widget, text != NULL ? text : "");
-    gtk_editable_set_editable ((GtkEditable *) widget, editable);
-
-    str_unref (text);
-}
-
-static void set_entry_int_from_field (GtkWidget * widget, const Tuple * tuple,
- int fieldn, bool_t editable)
-{
-    char scratch[32];
-
-    if (tuple_get_value_type (tuple, fieldn) == TUPLE_INT)
-        str_itoa (tuple_get_int (tuple, fieldn), scratch, sizeof scratch);
-    else
-        scratch[0] = 0;
-
-    gtk_entry_set_text ((GtkEntry *) widget, scratch);
-    gtk_editable_set_editable ((GtkEditable *) widget, editable);
-}
-
-static void set_field_str_from_entry (Tuple * tuple, int fieldn, GtkWidget *
- widget)
-{
-    const char * text = gtk_entry_get_text ((GtkEntry *) widget);
-
-    if (text[0])
-        tuple_set_str (tuple, fieldn, text);
-    else
-        tuple_unset (tuple, fieldn);
-}
-
-static void set_field_int_from_entry (Tuple * tuple, int fieldn, GtkWidget *
- widget)
-{
-    const char * text = gtk_entry_get_text ((GtkEntry *) widget);
-
-    if (text[0])
-        tuple_set_int (tuple, fieldn, atoi (text));
-    else
-        tuple_unset (tuple, fieldn);
-}
-
-static void entry_changed (GtkEditable * editable, void * unused)
-{
-    if (can_write)
-        gtk_widget_set_sensitive (widgets.apply, TRUE);
-}
-
-static bool_t ministatus_timeout_proc (void)
-{
-    gtk_label_set_text ((GtkLabel *) widgets.ministatus, NULL);
-
-    timeout_source = 0;
-    return FALSE;
-}
-
-static void ministatus_display_message (const char * text)
-{
-    gtk_label_set_text ((GtkLabel *) widgets.ministatus, text);
-
-    if (timeout_source)
-        g_source_remove (timeout_source);
-
-    timeout_source = g_timeout_add (AUDGUI_STATUS_TIMEOUT, (GSourceFunc)
-     ministatus_timeout_proc, NULL);
-}
-
-static void infowin_update_tuple (void * unused)
-{
-    Tuple * tuple = tuple_new_from_filename (current_file);
-
-    set_field_str_from_entry (tuple, FIELD_TITLE, widgets.title);
-    set_field_str_from_entry (tuple, FIELD_ARTIST, widgets.artist);
-    set_field_str_from_entry (tuple, FIELD_ALBUM, widgets.album);
-    set_field_str_from_entry (tuple, FIELD_COMMENT, widgets.comment);
-    set_field_str_from_entry (tuple, FIELD_GENRE, gtk_bin_get_child ((GtkBin *)
-     widgets.genre));
-    set_field_int_from_entry (tuple, FIELD_YEAR, widgets.year);
-    set_field_int_from_entry (tuple, FIELD_TRACK_NUMBER, widgets.track);
-
-    if (aud_file_write_tuple (current_file, current_decoder, tuple))
-    {
-        ministatus_display_message (_("Save successful"));
-        gtk_widget_set_sensitive (widgets.apply, FALSE);
-    }
-    else
-        ministatus_display_message (_("Save error"));
-
-    tuple_unref (tuple);
-}
-
-static bool_t genre_fill (GtkWidget * combo)
-{
-    GList * list = NULL;
-    GList * node;
-    int i;
-
-    for (i = 0; i < ARRAY_LEN (genre_table); i ++)
-        list = g_list_prepend (list, _(genre_table[i]));
-
-    list = g_list_sort (list, (GCompareFunc) strcmp);
-
-    for (node = list; node != NULL; node = node->next)
-        gtk_combo_box_text_append_text ((GtkComboBoxText *) combo, node->data);
-
-    g_list_free (list);
-    return FALSE;
-}
-
-static void infowin_display_image (const char * filename)
-{
-    if (! current_file || strcmp (filename, current_file))
-        return;
-
-    GdkPixbuf * pb = audgui_pixbuf_request (filename);
-    if (! pb)
-        pb = audgui_pixbuf_fallback ();
-
-    if (pb)
-    {
-        audgui_scaled_image_set (widgets.image, pb);
-        g_object_unref (pb);
-    }
-}
-
-static void infowin_destroyed (void)
-{
-    hook_dissociate ("art ready", (HookFunction) infowin_display_image);
-
-    if (timeout_source)
-    {
-        g_source_remove (timeout_source);
-        timeout_source = 0;
-    }
-
-    memset (& widgets, 0, sizeof widgets);
-
-    str_unref (current_file);
-    current_file = NULL;
-    current_decoder = NULL;
-    can_write = FALSE;
-}
-
-static void add_entry (GtkWidget * grid, const char * title, GtkWidget * entry,
- int x, int y, int span)
-{
-    GtkWidget * label = small_label_new (title);
-
-    if (y > 0)
-        gtk_widget_set_margin_top (label, 6);
-
-    gtk_grid_attach ((GtkGrid *) grid, label, x, y, span, 1);
-    gtk_grid_attach ((GtkGrid *) grid, entry, x, y + 1, span, 1);
-
-    g_signal_connect (entry, "changed", (GCallback) entry_changed, NULL);
-}
-
-static GtkWidget * create_infowin (void)
-{
-    GtkWidget * infowin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-    gtk_container_set_border_width ((GtkContainer *) infowin, 6);
-    gtk_window_set_title ((GtkWindow *) infowin, _("Song Info"));
-    gtk_window_set_type_hint ((GtkWindow *) infowin,
-     GDK_WINDOW_TYPE_HINT_DIALOG);
-
-    GtkWidget * main_grid = gtk_grid_new ();
-    gtk_grid_set_column_spacing ((GtkGrid *) main_grid, 6);
-    gtk_grid_set_row_spacing ((GtkGrid *) main_grid, 6);
-    gtk_container_add ((GtkContainer *) infowin, main_grid);
-
-    widgets.image = audgui_scaled_image_new (NULL);
-    gtk_widget_set_hexpand (widgets.image, TRUE);
-    gtk_widget_set_vexpand (widgets.image, TRUE);
-    gtk_grid_attach ((GtkGrid *) main_grid, widgets.image, 0, 0, 1, 1);
-
-    widgets.location = gtk_label_new ("");
-    gtk_label_set_max_width_chars ((GtkLabel *) widgets.location, 40);
-    gtk_label_set_line_wrap ((GtkLabel *) widgets.location, TRUE);
-    gtk_label_set_line_wrap_mode ((GtkLabel *) widgets.location, PANGO_WRAP_WORD_CHAR);
-    gtk_label_set_selectable ((GtkLabel *) widgets.location, TRUE);
-    gtk_grid_attach ((GtkGrid *) main_grid, widgets.location, 0, 1, 1, 1);
-
-    GtkWidget * codec_grid = gtk_grid_new ();
-    gtk_grid_set_row_spacing ((GtkGrid *) codec_grid, 3);
-    gtk_grid_set_column_spacing ((GtkGrid *) codec_grid, 12);
-    gtk_grid_attach ((GtkGrid *) main_grid, codec_grid, 0, 2, 1, 1);
-
-    for (int row = 0; row < CODEC_ITEMS; row ++)
-    {
-        GtkWidget * label = small_label_new (_(codec_labels[row]));
-        gtk_grid_attach ((GtkGrid *) codec_grid, label, 0, row, 1, 1);
-
-        widgets.codec[row] = small_label_new (NULL);
-        gtk_grid_attach ((GtkGrid *) codec_grid, widgets.codec[row], 1, row, 1, 1);
-    }
-
-    GtkWidget * grid = gtk_grid_new ();
-    gtk_grid_set_column_homogeneous ((GtkGrid *) grid, TRUE);
-    gtk_grid_set_column_spacing ((GtkGrid *) grid, 6);
-    gtk_grid_attach ((GtkGrid *) main_grid, grid, 1, 0, 1, 3);
-
-    widgets.title = gtk_entry_new ();
-    add_entry (grid, _("Title"), widgets.title, 0, 0, 2);
-
-    widgets.artist = gtk_entry_new ();
-    add_entry (grid, _("Artist"), widgets.artist, 0, 2, 2);
-
-    widgets.album = gtk_entry_new ();
-    add_entry (grid, _("Album"), widgets.album, 0, 4, 2);
-
-    widgets.comment = gtk_entry_new ();
-    add_entry (grid, _("Comment"), widgets.comment, 0, 6, 2);
-
-    widgets.genre = gtk_combo_box_text_new_with_entry ();
-    add_entry (grid, _("Genre"), widgets.genre, 0, 8, 2);
-    g_idle_add ((GSourceFunc) genre_fill, widgets.genre);
-
-    widgets.year = gtk_entry_new ();
-    add_entry (grid, _("Year"), widgets.year, 0, 10, 1);
-
-    widgets.track = gtk_entry_new ();
-    add_entry (grid, _("Track Number"), widgets.track, 1, 10, 1);
-
-    GtkWidget * bottom_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-    gtk_grid_attach ((GtkGrid *) main_grid, bottom_hbox, 0, 3, 2, 1);
-
-    widgets.ministatus = small_label_new (NULL);
-    gtk_box_pack_start ((GtkBox *) bottom_hbox, widgets.ministatus, TRUE, TRUE, 0);
-
-    widgets.apply = audgui_button_new (_("_Save"), "document-save",
-     (AudguiCallback) infowin_update_tuple, NULL);
-
-    GtkWidget * close_button = audgui_button_new (_("_Close"), "window-close",
-     (AudguiCallback) audgui_infowin_hide, NULL);
-
-    gtk_box_pack_end ((GtkBox *) bottom_hbox, close_button, FALSE, FALSE, 0);
-    gtk_box_pack_end ((GtkBox *) bottom_hbox, widgets.apply, FALSE, FALSE, 0);
-
-    audgui_destroy_on_escape (infowin);
-    g_signal_connect (infowin, "destroy", (GCallback) infowin_destroyed, NULL);
-
-    hook_associate ("art ready", (HookFunction) infowin_display_image, NULL);
-
-    return infowin;
-}
-
-static void infowin_show (int list, int entry, const char * filename,
- const Tuple * tuple, PluginHandle * decoder, bool_t updating_enabled)
-{
-    audgui_hide_unique_window (AUDGUI_INFO_WINDOW);
-
-    GtkWidget * infowin = create_infowin ();
-
-    str_unref (current_file);
-    current_file = str_get (filename);
-    current_decoder = decoder;
-    can_write = updating_enabled;
-
-    set_entry_str_from_field (widgets.title, tuple, FIELD_TITLE, updating_enabled);
-    set_entry_str_from_field (widgets.artist, tuple, FIELD_ARTIST, updating_enabled);
-    set_entry_str_from_field (widgets.album, tuple, FIELD_ALBUM, updating_enabled);
-    set_entry_str_from_field (widgets.comment, tuple, FIELD_COMMENT, updating_enabled);
-    set_entry_str_from_field (gtk_bin_get_child ((GtkBin *) widgets.genre),
-     tuple, FIELD_GENRE, updating_enabled);
-
-    char * tmp = uri_to_display (filename);
-    gtk_label_set_text ((GtkLabel *) widgets.location, tmp);
-    str_unref (tmp);
-
-    set_entry_int_from_field (widgets.year, tuple, FIELD_YEAR, updating_enabled);
-    set_entry_int_from_field (widgets.track, tuple, FIELD_TRACK_NUMBER, updating_enabled);
-
-    char * codec_values[CODEC_ITEMS] = {
-        [CODEC_FORMAT] = tuple_get_str (tuple, FIELD_CODEC),
-        [CODEC_QUALITY] = tuple_get_str (tuple, FIELD_QUALITY)
-    };
-
-    if (tuple_get_value_type (tuple, FIELD_BITRATE) == TUPLE_INT)
-    {
-        int bitrate = tuple_get_int (tuple, FIELD_BITRATE);
-        codec_values[CODEC_BITRATE] = str_printf (_("%d kb/s"), bitrate);
-    }
-
-    for (int row = 0; row < CODEC_ITEMS; row ++)
-    {
-        const char * text = codec_values[row] ? codec_values[row] : _("N/A");
-        gtk_label_set_text ((GtkLabel *) widgets.codec[row], text);
-        str_unref (codec_values[row]);
-    }
-
-    infowin_display_image (filename);
-
-    /* nothing has been changed yet */
-    gtk_widget_set_sensitive (widgets.apply, FALSE);
-
-    audgui_show_unique_window (AUDGUI_INFO_WINDOW, infowin);
-}
-
-EXPORT void audgui_infowin_show (int playlist, int entry)
-{
-    char * filename = aud_playlist_entry_get_filename (playlist, entry);
-    g_return_if_fail (filename != NULL);
-
-    PluginHandle * decoder = aud_playlist_entry_get_decoder (playlist, entry,
-     FALSE);
-    if (decoder == NULL)
-        goto FREE;
-
-    if (aud_custom_infowin (filename, decoder))
-        goto FREE;
-
-    Tuple * tuple = aud_playlist_entry_get_tuple (playlist, entry, FALSE);
-
-    if (tuple == NULL)
-    {
-        SPRINTF (message, _("No info available for %s.\n"), filename);
-        aud_interface_show_error (message);
-        goto FREE;
-    }
-
-    infowin_show (playlist, entry, filename, tuple, decoder,
-     aud_file_can_write_tuple (filename, decoder));
-    tuple_unref (tuple);
-
-FREE:
-    str_unref (filename);
-}
-
-EXPORT void audgui_infowin_show_current (void)
-{
-    int playlist = aud_playlist_get_playing ();
-    int position;
-
-    if (playlist == -1)
-        playlist = aud_playlist_get_active ();
-
-    position = aud_playlist_get_position (playlist);
-
-    if (position == -1)
-        return;
-
-    audgui_infowin_show (playlist, position);
-}
-
-EXPORT void audgui_infowin_hide (void)
-{
-    audgui_hide_unique_window (AUDGUI_INFO_WINDOW);
-}
diff --git a/src/libaudgui/infowin.cc b/src/libaudgui/infowin.cc
new file mode 100644
index 000000000000..1eabdb66f991
--- /dev/null
+++ b/src/libaudgui/infowin.cc
@@ -0,0 +1,519 @@
+/*
+ * infowin.c
+ * Copyright 2006-2013 William Pitcock, Tomasz Moń, Eugene Zagidullin,
+ *                     John Lindgren, and Thomas Lange
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gtk/gtk.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/interface.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/probe.h>
+#include <libaudcore/runtime.h>
+#include <libaudcore/tuple.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+#define AUDGUI_STATUS_TIMEOUT 3000
+
+enum {
+    CODEC_FORMAT,
+    CODEC_QUALITY,
+    CODEC_BITRATE,
+    CODEC_ITEMS
+};
+
+static const char * codec_labels[CODEC_ITEMS] = {
+    N_("Format:"),
+    N_("Quality:"),
+    N_("Bitrate:")
+};
+
+static struct {
+    GtkWidget * location;
+    GtkWidget * title;
+    GtkWidget * artist;
+    GtkWidget * album;
+    GtkWidget * album_artist;
+    GtkWidget * comment;
+    GtkWidget * year;
+    GtkWidget * track;
+    GtkWidget * genre;
+    GtkWidget * image;
+    GtkWidget * codec[3];
+    GtkWidget * apply;
+    GtkWidget * clear;
+    GtkWidget * ministatus;
+} widgets;
+
+static GtkWidget * infowin;
+static int current_playlist_id, current_entry;
+static String current_file;
+static PluginHandle * current_decoder = nullptr;
+static bool can_write = false;
+static int timeout_source = 0;
+
+/* This is by no means intended to be a complete list.  If it is not short, it
+ * is useless: scrolling through ten pages of dropdown list is more work than
+ * typing out the genre. */
+
+static const char * genre_table[] = {
+ N_("Acid Jazz"),
+ N_("Acid Rock"),
+ N_("Ambient"),
+ N_("Bebop"),
+ N_("Bluegrass"),
+ N_("Blues"),
+ N_("Chamber Music"),
+ N_("Classical"),
+ N_("Country"),
+ N_("Death Metal"),
+ N_("Disco"),
+ N_("Easy Listening"),
+ N_("Folk"),
+ N_("Funk"),
+ N_("Gangsta Rap"),
+ N_("Gospel"),
+ N_("Grunge"),
+ N_("Hard Rock"),
+ N_("Heavy Metal"),
+ N_("Hip-hop"),
+ N_("House"),
+ N_("Jazz"),
+ N_("Jungle"),
+ N_("Metal"),
+ N_("New Age"),
+ N_("New Wave"),
+ N_("Noise"),
+ N_("Pop"),
+ N_("Punk Rock"),
+ N_("Rap"),
+ N_("Reggae"),
+ N_("Rock"),
+ N_("Rock and Roll"),
+ N_("Rhythm and Blues"),
+ N_("Ska"),
+ N_("Soul"),
+ N_("Swing"),
+ N_("Techno"),
+ N_("Trip-hop")};
+
+static GtkWidget * small_label_new (const char * text)
+{
+    static PangoAttrList * attrs = nullptr;
+
+    if (! attrs)
+    {
+        attrs = pango_attr_list_new ();
+        pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_SMALL));
+    }
+
+    GtkWidget * label = gtk_label_new (text);
+    gtk_label_set_attributes ((GtkLabel *) label, attrs);
+    gtk_misc_set_alignment ((GtkMisc *) label, 0, 0.5);
+
+    return label;
+}
+
+static void set_entry_str_from_field (GtkWidget * widget, const Tuple & tuple,
+ Tuple::Field field, bool editable, bool clear)
+{
+    String text = tuple.get_str (field);
+    if (! text && ! clear)
+        return;
+
+    gtk_entry_set_text ((GtkEntry *) widget, text ? text : "");
+    gtk_editable_set_editable ((GtkEditable *) widget, editable);
+}
+
+static void set_entry_int_from_field (GtkWidget * widget, const Tuple & tuple,
+ Tuple::Field field, bool editable, bool clear)
+{
+    int value = tuple.get_int (field);
+    if (value <= 0 && ! clear)
+        return;
+
+    gtk_entry_set_text ((GtkEntry *) widget, (value > 0) ? (const char *) int_to_str (value) : "");
+    gtk_editable_set_editable ((GtkEditable *) widget, editable);
+}
+
+static void set_field_str_from_entry (Tuple & tuple, Tuple::Field field, GtkWidget * widget)
+{
+    const char * text = gtk_entry_get_text ((GtkEntry *) widget);
+
+    if (text[0])
+        tuple.set_str (field, text);
+    else
+        tuple.unset (field);
+}
+
+static void set_field_int_from_entry (Tuple & tuple, Tuple::Field field, GtkWidget * widget)
+{
+    const char * text = gtk_entry_get_text ((GtkEntry *) widget);
+
+    if (text[0])
+        tuple.set_int (field, atoi (text));
+    else
+        tuple.unset (field);
+}
+
+static void entry_changed (GtkEditable * editable)
+{
+    if (can_write)
+        gtk_widget_set_sensitive (widgets.apply, true);
+}
+
+static gboolean ministatus_timeout_proc ()
+{
+    gtk_widget_hide (widgets.ministatus);
+    gtk_widget_show (widgets.clear);
+
+    timeout_source = 0;
+    return G_SOURCE_REMOVE;
+}
+
+static void ministatus_display_message (const char * text)
+{
+    gtk_label_set_text ((GtkLabel *) widgets.ministatus, text);
+    gtk_widget_hide (widgets.clear);
+    gtk_widget_show (widgets.ministatus);
+
+    if (timeout_source)
+        g_source_remove (timeout_source);
+
+    timeout_source = g_timeout_add (AUDGUI_STATUS_TIMEOUT, (GSourceFunc)
+     ministatus_timeout_proc, nullptr);
+}
+
+static void infowin_update_tuple ()
+{
+    Tuple tuple;
+    tuple.set_filename (current_file);
+
+    set_field_str_from_entry (tuple, Tuple::Title, widgets.title);
+    set_field_str_from_entry (tuple, Tuple::Artist, widgets.artist);
+    set_field_str_from_entry (tuple, Tuple::Album, widgets.album);
+    set_field_str_from_entry (tuple, Tuple::AlbumArtist, widgets.album_artist);
+    set_field_str_from_entry (tuple, Tuple::Comment, widgets.comment);
+    set_field_str_from_entry (tuple, Tuple::Genre, gtk_bin_get_child ((GtkBin *)
+     widgets.genre));
+    set_field_int_from_entry (tuple, Tuple::Year, widgets.year);
+    set_field_int_from_entry (tuple, Tuple::Track, widgets.track);
+
+    if (aud_file_write_tuple (current_file, current_decoder, tuple))
+    {
+        ministatus_display_message (_("Save successful"));
+        gtk_widget_set_sensitive (widgets.apply, false);
+    }
+    else
+        ministatus_display_message (_("Save error"));
+}
+
+static void infowin_next ()
+{
+    int list = aud_playlist_by_unique_id (current_playlist_id);
+
+    if (list >= 0 && current_entry + 1 < aud_playlist_entry_count (list))
+        audgui_infowin_show (list, current_entry + 1);
+    else
+        audgui_infowin_hide ();
+}
+
+static gboolean genre_fill (GtkWidget * combo)
+{
+    GList * list = nullptr;
+    GList * node;
+
+    for (const char * genre : genre_table)
+        list = g_list_prepend (list, _(genre));
+
+    list = g_list_sort (list, (GCompareFunc) strcmp);
+
+    for (node = list; node != nullptr; node = node->next)
+        gtk_combo_box_text_append_text ((GtkComboBoxText *) combo, (const char *) node->data);
+
+    g_list_free (list);
+    return G_SOURCE_REMOVE;
+}
+
+static void clear_toggled (GtkToggleButton * toggle)
+{
+    aud_set_bool ("audgui", "clear_song_fields", gtk_toggle_button_get_active (toggle));
+}
+
+static void infowin_display_image (const char * filename)
+{
+    if (! current_file || strcmp (filename, current_file))
+        return;
+
+    GdkPixbuf * pb = audgui_pixbuf_request (filename);
+    if (! pb)
+        pb = audgui_pixbuf_fallback ();
+
+    if (pb)
+    {
+        audgui_scaled_image_set (widgets.image, pb);
+        g_object_unref (pb);
+    }
+}
+
+static void infowin_destroyed ()
+{
+    hook_dissociate ("art ready", (HookFunction) infowin_display_image);
+
+    if (timeout_source)
+    {
+        g_source_remove (timeout_source);
+        timeout_source = 0;
+    }
+
+    memset (& widgets, 0, sizeof widgets);
+
+    infowin = nullptr;
+    current_file = String ();
+    current_decoder = nullptr;
+}
+
+static void add_entry (GtkWidget * grid, const char * title, GtkWidget * entry,
+ int x, int y, int span)
+{
+    GtkWidget * label = small_label_new (title);
+
+    gtk_table_attach ((GtkTable *) grid, label, x, x + span, y, y + 1,
+     GTK_FILL, GTK_FILL, 0, 0);
+    gtk_table_attach ((GtkTable *) grid, entry, x, x + span, y + 1, y + 2,
+     GTK_FILL, GTK_FILL, 0, 0);
+
+    g_signal_connect (entry, "changed", (GCallback) entry_changed, nullptr);
+}
+
+static void create_infowin ()
+{
+    infowin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    gtk_container_set_border_width ((GtkContainer *) infowin, 6);
+    gtk_window_set_title ((GtkWindow *) infowin, _("Song Info"));
+    gtk_window_set_type_hint ((GtkWindow *) infowin,
+     GDK_WINDOW_TYPE_HINT_DIALOG);
+
+    GtkWidget * main_grid = gtk_table_new (0, 0, false);
+    gtk_table_set_col_spacings ((GtkTable *) main_grid, 6);
+    gtk_table_set_row_spacings ((GtkTable *) main_grid, 6);
+    gtk_container_add ((GtkContainer *) infowin, main_grid);
+
+    widgets.image = audgui_scaled_image_new (nullptr);
+    gtk_table_attach_defaults ((GtkTable *) main_grid, widgets.image, 0, 1, 0, 1);
+
+    widgets.location = gtk_label_new ("");
+    gtk_widget_set_size_request (widgets.location, 200, -1);
+    gtk_label_set_line_wrap ((GtkLabel *) widgets.location, true);
+    gtk_label_set_line_wrap_mode ((GtkLabel *) widgets.location, PANGO_WRAP_WORD_CHAR);
+    gtk_label_set_selectable ((GtkLabel *) widgets.location, true);
+    gtk_table_attach ((GtkTable *) main_grid, widgets.location, 0, 1, 1, 2,
+     GTK_FILL, GTK_FILL, 0, 0);
+
+    GtkWidget * codec_grid = gtk_table_new (0, 0, false);
+    gtk_table_set_row_spacings ((GtkTable *) codec_grid, 2);
+    gtk_table_set_col_spacings ((GtkTable *) codec_grid, 12);
+    gtk_table_attach ((GtkTable *) main_grid, codec_grid, 0, 1, 2, 3,
+     GTK_FILL, GTK_FILL, 0, 0);
+
+    for (int row = 0; row < CODEC_ITEMS; row ++)
+    {
+        GtkWidget * label = small_label_new (_(codec_labels[row]));
+        gtk_table_attach ((GtkTable *) codec_grid, label, 0, 1, row, row + 1,
+         GTK_FILL, GTK_FILL, 0, 0);
+
+        widgets.codec[row] = small_label_new (nullptr);
+        gtk_table_attach ((GtkTable *) codec_grid, widgets.codec[row], 1, 2, row, row + 1,
+         GTK_FILL, GTK_FILL, 0, 0);
+    }
+
+    GtkWidget * grid = gtk_table_new (0, 0, false);
+    gtk_table_set_row_spacings ((GtkTable *) grid, 2);
+    gtk_table_set_col_spacings ((GtkTable *) grid, 6);
+    gtk_table_attach ((GtkTable *) main_grid, grid, 1, 2, 0, 3,
+     GTK_FILL, GTK_FILL, 0, 0);
+
+    widgets.title = gtk_entry_new ();
+    add_entry (grid, _("Title"), widgets.title, 0, 0, 2);
+
+    widgets.artist = gtk_entry_new ();
+    add_entry (grid, _("Artist"), widgets.artist, 0, 2, 2);
+
+    widgets.album = gtk_entry_new ();
+    add_entry (grid, _("Album"), widgets.album, 0, 4, 2);
+
+    widgets.album_artist = gtk_entry_new ();
+    add_entry (grid, _("Album Artist"), widgets.album_artist, 0, 6, 2);
+
+    widgets.comment = gtk_entry_new ();
+    add_entry (grid, _("Comment"), widgets.comment, 0, 8, 2);
+
+    widgets.genre = gtk_combo_box_text_new_with_entry ();
+    add_entry (grid, _("Genre"), widgets.genre, 0, 10, 2);
+    g_idle_add ((GSourceFunc) genre_fill, widgets.genre);
+
+    widgets.year = gtk_entry_new ();
+    add_entry (grid, _("Year"), widgets.year, 0, 12, 1);
+
+    widgets.track = gtk_entry_new ();
+    add_entry (grid, _("Track Number"), widgets.track, 1, 12, 1);
+
+    GtkWidget * bottom_hbox = gtk_hbox_new (false, 6);
+    gtk_table_attach ((GtkTable *) main_grid, bottom_hbox, 0, 2, 3, 4,
+     GTK_FILL, GTK_FILL, 0, 0);
+
+    widgets.clear = gtk_check_button_new_with_mnemonic
+     (_("Clea_r fields when moving to next song"));
+
+    gtk_toggle_button_set_active ((GtkToggleButton *) widgets.clear,
+     aud_get_bool ("audgui", "clear_song_fields"));
+    g_signal_connect (widgets.clear, "toggled", (GCallback) clear_toggled, nullptr);
+
+    gtk_widget_set_no_show_all (widgets.clear, true);
+    gtk_widget_show (widgets.clear);
+    gtk_box_pack_start ((GtkBox *) bottom_hbox, widgets.clear, false, false, 0);
+
+    widgets.ministatus = small_label_new (nullptr);
+    gtk_widget_set_no_show_all (widgets.ministatus, true);
+    gtk_box_pack_start ((GtkBox *) bottom_hbox, widgets.ministatus, true, true, 0);
+
+    widgets.apply = audgui_button_new (_("_Save"), "document-save",
+     (AudguiCallback) infowin_update_tuple, nullptr);
+
+    GtkWidget * close_button = audgui_button_new (_("_Close"), "window-close",
+     (AudguiCallback) audgui_infowin_hide, nullptr);
+
+    GtkWidget * next_button = audgui_button_new (_("_Next"), "go-next",
+     (AudguiCallback) infowin_next, nullptr);
+
+    gtk_box_pack_end ((GtkBox *) bottom_hbox, close_button, false, false, 0);
+    gtk_box_pack_end ((GtkBox *) bottom_hbox, next_button, false, false, 0);
+    gtk_box_pack_end ((GtkBox *) bottom_hbox, widgets.apply, false, false, 0);
+
+    audgui_destroy_on_escape (infowin);
+    g_signal_connect (infowin, "destroy", (GCallback) infowin_destroyed, nullptr);
+
+    hook_associate ("art ready", (HookFunction) infowin_display_image, nullptr);
+}
+
+static void infowin_show (int list, int entry, const char * filename,
+ const Tuple & tuple, PluginHandle * decoder, bool writable)
+{
+    if (! infowin)
+        create_infowin ();
+
+    current_playlist_id = aud_playlist_get_unique_id (list);
+    current_entry = entry;
+    current_file = String (filename);
+    current_decoder = decoder;
+    can_write = writable;
+
+    bool clear = aud_get_bool ("audgui", "clear_song_fields");
+
+    set_entry_str_from_field (widgets.title, tuple, Tuple::Title, writable, clear);
+    set_entry_str_from_field (widgets.artist, tuple, Tuple::Artist, writable, clear);
+    set_entry_str_from_field (widgets.album, tuple, Tuple::Album, writable, clear);
+    set_entry_str_from_field (widgets.album_artist, tuple, Tuple::AlbumArtist, writable, clear);
+    set_entry_str_from_field (widgets.comment, tuple, Tuple::Comment, writable, clear);
+    set_entry_str_from_field (gtk_bin_get_child ((GtkBin *) widgets.genre),
+     tuple, Tuple::Genre, writable, clear);
+
+    gtk_label_set_text ((GtkLabel *) widgets.location, uri_to_display (filename));
+
+    set_entry_int_from_field (widgets.year, tuple, Tuple::Year, writable, clear);
+    set_entry_int_from_field (widgets.track, tuple, Tuple::Track, writable, clear);
+
+    String codec_values[CODEC_ITEMS];
+
+    codec_values[CODEC_FORMAT] = tuple.get_str (Tuple::Codec);
+    codec_values[CODEC_QUALITY] = tuple.get_str (Tuple::Quality);
+
+    if (tuple.get_value_type (Tuple::Bitrate) == Tuple::Int)
+        codec_values[CODEC_BITRATE] = String (str_printf (_("%d kb/s"),
+         tuple.get_int (Tuple::Bitrate)));
+
+    for (int row = 0; row < CODEC_ITEMS; row ++)
+    {
+        const char * text = codec_values[row] ? (const char *) codec_values[row] : _("N/A");
+        gtk_label_set_text ((GtkLabel *) widgets.codec[row], text);
+    }
+
+    infowin_display_image (filename);
+
+    /* nothing has been changed yet */
+    gtk_widget_set_sensitive (widgets.apply, false);
+
+    gtk_widget_grab_focus (widgets.title);
+
+    if (! audgui_reshow_unique_window (AUDGUI_INFO_WINDOW))
+        audgui_show_unique_window (AUDGUI_INFO_WINDOW, infowin);
+}
+
+EXPORT void audgui_infowin_show (int playlist, int entry)
+{
+    String filename = aud_playlist_entry_get_filename (playlist, entry);
+    g_return_if_fail (filename != nullptr);
+
+    String error;
+    PluginHandle * decoder = aud_playlist_entry_get_decoder (playlist, entry,
+     Playlist::Wait, & error);
+
+    if (decoder && ! aud_custom_infowin (filename, decoder))
+    {
+        Tuple tuple = aud_playlist_entry_get_tuple (playlist, entry, Playlist::Wait, & error);
+        if (tuple)
+        {
+            tuple.delete_fallbacks ();
+            infowin_show (playlist, entry, filename, tuple, decoder,
+             aud_file_can_write_tuple (filename, decoder));
+        }
+    }
+
+    if (error)
+        aud_ui_show_error (str_printf (_("Error opening %s:\n%s"),
+         (const char *) filename, (const char *) error));
+}
+
+EXPORT void audgui_infowin_show_current ()
+{
+    int playlist = aud_playlist_get_playing ();
+    int position;
+
+    if (playlist == -1)
+        playlist = aud_playlist_get_active ();
+
+    position = aud_playlist_get_position (playlist);
+
+    if (position == -1)
+        return;
+
+    audgui_infowin_show (playlist, position);
+}
+
+EXPORT void audgui_infowin_hide ()
+{
+    audgui_hide_unique_window (AUDGUI_INFO_WINDOW);
+}
diff --git a/src/libaudgui/init.c b/src/libaudgui/init.c
deleted file mode 100644
index 3128a5578b44..000000000000
--- a/src/libaudgui/init.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * init.c
- * Copyright 2010-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <audacious/misc.h>
-#include <audacious/playlist.h>
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-
-#include "init.h"
-#include "libaudgui.h"
-#include "libaudgui-gtk.h"
-
-static const char * const audgui_defaults[] = {
- "close_dialog_add", "FALSE",
- "close_dialog_open", "TRUE",
- "close_jtf_dialog", "TRUE",
- "playlist_manager_close_on_activate", "FALSE",
- "remember_jtf_entry", "TRUE",
- NULL};
-
-static const char * const window_names[AUDGUI_NUM_UNIQUE_WINDOWS] = {
- "about_win",
- "equalizer_win",
- "filebrowser_win",
- NULL, /* infopopup position is not saved */
- "info_win",
- "jump_to_time_win",
- "jump_to_track_win",
- "playlist_export_win",
- "playlist_import_win",
- "playlist_manager_win",
- "queue_manager_win",
- "url_opener_win"
-};
-
-AudAPITable * _aud_api_table = NULL;
-
-static GtkWidget * windows[AUDGUI_NUM_UNIQUE_WINDOWS];
-
-static bool_t configure_cb (GtkWidget * window, GdkEventConfigure * event, const char * name)
-{
-    if (gtk_widget_get_visible (window))
-    {
-        int pos[4];
-        gtk_window_get_position ((GtkWindow *) window, & pos[0], & pos[1]);
-        gtk_window_get_size ((GtkWindow *) window, & pos[2], & pos[3]);
-
-        char * str = int_array_to_str (pos, 4);
-        aud_set_str ("audgui", name, str);
-        str_unref (str);
-    }
-
-    return FALSE;
-}
-
-void audgui_show_unique_window (int id, GtkWidget * widget)
-{
-    g_return_if_fail (id >= 0 && id < AUDGUI_NUM_UNIQUE_WINDOWS);
-
-    if (windows[id])
-        gtk_widget_destroy (windows[id]);
-
-    windows[id] = widget;
-    g_signal_connect (widget, "destroy", (GCallback) gtk_widget_destroyed, & windows[id]);
-
-    if (window_names[id])
-    {
-        char * str = aud_get_str ("audgui", window_names[id]);
-        int pos[4];
-
-        if (str_to_int_array (str, pos, 4))
-        {
-            gtk_window_move ((GtkWindow *) widget, pos[0], pos[1]);
-            gtk_window_set_default_size ((GtkWindow *) widget, pos[2], pos[3]);
-        }
-
-        g_signal_connect (widget, "configure-event", (GCallback) configure_cb,
-         (void *) window_names[id]);
-
-        str_unref (str);
-    }
-
-    gtk_widget_show_all (widget);
-}
-
-bool_t audgui_reshow_unique_window (int id)
-{
-    g_return_val_if_fail (id >= 0 && id < AUDGUI_NUM_UNIQUE_WINDOWS, FALSE);
-
-    if (! windows[id])
-        return FALSE;
-
-    gtk_window_present ((GtkWindow *) windows[id]);
-    return TRUE;
-}
-
-void audgui_hide_unique_window (int id)
-{
-    g_return_if_fail (id >= 0 && id < AUDGUI_NUM_UNIQUE_WINDOWS);
-
-    if (windows[id])
-        gtk_widget_destroy (windows[id]);
-}
-
-static void playlist_set_playing_cb (void * unused, void * unused2)
-{
-    audgui_pixbuf_uncache ();
-}
-
-static void playlist_position_cb (void * list, void * unused)
-{
-    if (GPOINTER_TO_INT (list) == aud_playlist_get_playing ())
-        audgui_pixbuf_uncache ();
-}
-
-EXPORT void audgui_init (AudAPITable * table, int version)
-{
-    if (version != _AUD_PLUGIN_VERSION)
-    {
-        fprintf (stderr, "libaudgui version mismatch\n");
-        abort ();
-    }
-
-    _aud_api_table = table;
-    aud_config_set_defaults ("audgui", audgui_defaults);
-
-    hook_associate ("playlist set playing", playlist_set_playing_cb, NULL);
-    hook_associate ("playlist position", playlist_position_cb, NULL);
-
-#ifndef _WIN32
-    gtk_window_set_default_icon_name ("audacious");
-#endif
-}
-
-EXPORT void audgui_cleanup (void)
-{
-    hook_dissociate ("playlist set playing", playlist_set_playing_cb);
-    hook_dissociate ("playlist position", playlist_position_cb);
-
-    for (int id = 0; id < AUDGUI_NUM_UNIQUE_WINDOWS; id ++)
-        audgui_hide_unique_window (id);
-
-    _aud_api_table = NULL;
-}
diff --git a/src/libaudgui/init.cc b/src/libaudgui/init.cc
new file mode 100644
index 000000000000..1d337458ee7a
--- /dev/null
+++ b/src/libaudgui/init.cc
@@ -0,0 +1,172 @@
+/*
+ * init.c
+ * Copyright 2010-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/hook.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/plugins.h>
+#include <libaudcore/runtime.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+static const char * const audgui_defaults[] = {
+    "clear_song_fields", "TRUE",
+    "close_dialog_add", "FALSE",
+    "close_dialog_open", "TRUE",
+    "close_jtf_dialog", "TRUE",
+    "remember_jtf_entry", "TRUE",
+    nullptr
+};
+
+static const char * const window_names[AUDGUI_NUM_UNIQUE_WINDOWS] = {
+    "about_win",
+    "equalizer_win",
+    "filebrowser_win",
+    nullptr, /* infopopup position is not saved */
+    "info_win",
+    "jump_to_time_win",
+    "jump_to_track_win",
+    "playlist_export_win",
+    "playlist_import_win",
+    "queue_manager_win",
+    "url_opener_win"
+};
+
+static int init_count = 0;
+
+static GtkWidget * windows[AUDGUI_NUM_UNIQUE_WINDOWS];
+
+static gboolean configure_cb (GtkWidget * window, GdkEventConfigure * event, const char * name)
+{
+    if (gtk_widget_get_visible (window))
+    {
+        int pos[4];
+        gtk_window_get_position ((GtkWindow *) window, & pos[0], & pos[1]);
+        gtk_window_get_size ((GtkWindow *) window, & pos[2], & pos[3]);
+
+        aud_set_str ("audgui", name, int_array_to_str (pos, 4));
+    }
+
+    return false;
+}
+
+void audgui_show_unique_window (int id, GtkWidget * widget)
+{
+    g_return_if_fail (id >= 0 && id < AUDGUI_NUM_UNIQUE_WINDOWS);
+
+    if (windows[id])
+        gtk_widget_destroy (windows[id]);
+
+    windows[id] = widget;
+    g_signal_connect (widget, "destroy", (GCallback) gtk_widget_destroyed, & windows[id]);
+
+    if (window_names[id])
+    {
+        String str = aud_get_str ("audgui", window_names[id]);
+        int pos[4];
+
+        if (str_to_int_array (str, pos, 4))
+        {
+            gtk_window_move ((GtkWindow *) widget, pos[0], pos[1]);
+            gtk_window_set_default_size ((GtkWindow *) widget, pos[2], pos[3]);
+        }
+
+        g_signal_connect (widget, "configure-event", (GCallback) configure_cb,
+         (void *) window_names[id]);
+    }
+
+    gtk_widget_show_all (widget);
+}
+
+bool audgui_reshow_unique_window (int id)
+{
+    g_return_val_if_fail (id >= 0 && id < AUDGUI_NUM_UNIQUE_WINDOWS, false);
+
+    if (! windows[id])
+        return false;
+
+    gtk_window_present ((GtkWindow *) windows[id]);
+    return true;
+}
+
+void audgui_hide_unique_window (int id)
+{
+    g_return_if_fail (id >= 0 && id < AUDGUI_NUM_UNIQUE_WINDOWS);
+
+    if (windows[id])
+        gtk_widget_destroy (windows[id]);
+}
+
+static void playlist_set_playing_cb (void *, void *)
+{
+    audgui_pixbuf_uncache ();
+}
+
+static void playlist_position_cb (void * list, void *)
+{
+    if (aud::from_ptr<int> (list) == aud_playlist_get_playing ())
+        audgui_pixbuf_uncache ();
+}
+
+EXPORT void audgui_init ()
+{
+    assert (aud_get_mainloop_type () == MainloopType::GLib);
+
+    if (init_count ++)
+        return;
+
+    gtk_init (nullptr, nullptr);
+
+    aud_config_set_defaults ("audgui", audgui_defaults);
+
+    status_init ();
+
+    hook_associate ("playlist set playing", playlist_set_playing_cb, nullptr);
+    hook_associate ("playlist position", playlist_position_cb, nullptr);
+
+#ifndef _WIN32
+    gtk_window_set_default_icon_name ("audacious");
+#endif
+}
+
+EXPORT void audgui_cleanup ()
+{
+    if (-- init_count)
+        return;
+
+    hook_dissociate ("playlist set playing", playlist_set_playing_cb);
+    hook_dissociate ("playlist position", playlist_position_cb);
+
+    status_cleanup ();
+
+    for (int id = 0; id < AUDGUI_NUM_UNIQUE_WINDOWS; id ++)
+        audgui_hide_unique_window (id);
+
+    audgui_hide_prefs_window ();
+    audgui_infopopup_hide ();
+
+    plugin_menu_cleanup ();
+    plugin_prefs_cleanup ();
+    urilist_cleanup ();
+}
diff --git a/src/libaudgui/init.h b/src/libaudgui/init.h
deleted file mode 100644
index 32632cf7a10a..000000000000
--- a/src/libaudgui/init.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * init.h
- * Copyright 2010-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDGUI_INIT_H
-#define AUDGUI_INIT_H
-
-#include <gtk/gtk.h>
-
-#include <audacious/api.h>
-
-enum {
-    AUDGUI_ABOUT_WINDOW,
-    AUDGUI_EQUALIZER_WINDOW,
-    AUDGUI_FILEBROWSER_WINDOW,
-    AUDGUI_INFOPOPUP_WINDOW,
-    AUDGUI_INFO_WINDOW,
-    AUDGUI_JUMP_TO_TIME_WINDOW,
-    AUDGUI_JUMP_TO_TRACK_WINDOW,
-    AUDGUI_PLAYLIST_EXPORT_WINDOW,
-    AUDGUI_PLAYLIST_IMPORT_WINDOW,
-    AUDGUI_PLAYLIST_MANAGER_WINDOW,
-    AUDGUI_QUEUE_MANAGER_WINDOW,
-    AUDGUI_URL_OPENER_WINDOW,
-    AUDGUI_NUM_UNIQUE_WINDOWS
-};
-
-void audgui_show_unique_window (int id, GtkWidget * widget);
-bool_t audgui_reshow_unique_window (int id);
-void audgui_hide_unique_window (int id);
-
-void audgui_init (AudAPITable * table, int version);
-void audgui_cleanup (void);
-
-/* pixbufs.c */
-void audgui_pixbuf_uncache (void);
-
-#endif /* AUDGUI_INIT_H */
diff --git a/src/libaudgui/internal.h b/src/libaudgui/internal.h
new file mode 100644
index 000000000000..da1a158b9492
--- /dev/null
+++ b/src/libaudgui/internal.h
@@ -0,0 +1,65 @@
+/*
+ * internal.h
+ * Copyright 2010-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef AUDGUI_INTERNAL_H
+#define AUDGUI_INTERNAL_H
+
+#include <gtk/gtk.h>
+
+enum class PluginType;
+
+enum {
+    AUDGUI_ABOUT_WINDOW,
+    AUDGUI_EQUALIZER_WINDOW,
+    AUDGUI_FILEBROWSER_WINDOW,
+    AUDGUI_INFOPOPUP_WINDOW,
+    AUDGUI_INFO_WINDOW,
+    AUDGUI_JUMP_TO_TIME_WINDOW,
+    AUDGUI_JUMP_TO_TRACK_WINDOW,
+    AUDGUI_PLAYLIST_EXPORT_WINDOW,
+    AUDGUI_PLAYLIST_IMPORT_WINDOW,
+    AUDGUI_QUEUE_MANAGER_WINDOW,
+    AUDGUI_URL_OPENER_WINDOW,
+    AUDGUI_NUM_UNIQUE_WINDOWS
+};
+
+void audgui_show_unique_window (int id, GtkWidget * widget);
+bool audgui_reshow_unique_window (int id);
+void audgui_hide_unique_window (int id);
+
+/* pixbufs.c */
+void audgui_pixbuf_uncache ();
+
+/* plugin-menu.c */
+void plugin_menu_cleanup ();
+
+/* plugin-prefs.c */
+void plugin_prefs_cleanup ();
+
+/* plugin-view.c */
+GtkWidget * plugin_view_new (PluginType type);
+
+/* status.c */
+void status_init ();
+void status_cleanup ();
+
+/* urilist.c */
+void urilist_cleanup ();
+
+#endif /* AUDGUI_INTERNAL_H */
diff --git a/src/libaudgui/jump-to-time.c b/src/libaudgui/jump-to-time.c
deleted file mode 100644
index 357b42200b43..000000000000
--- a/src/libaudgui/jump-to-time.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * jump-to-time.c
- * Copyright 2012-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <stdio.h>
-#include <gtk/gtk.h>
-
-#include <audacious/drct.h>
-#include <audacious/i18n.h>
-#include <libaudcore/audstrings.h>
-
-#include "init.h"
-#include "libaudgui.h"
-#include "libaudgui-gtk.h"
-
-static void jump_cb (void * entry)
-{
-    const char * text = gtk_entry_get_text ((GtkEntry *) entry);
-    unsigned minutes, seconds;
-
-    if (sscanf (text, "%u:%u", & minutes, & seconds) == 2 && aud_drct_get_playing ())
-        aud_drct_seek ((minutes * 60 + seconds) * 1000);
-}
-
-EXPORT void audgui_jump_to_time (void)
-{
-    if (audgui_reshow_unique_window (AUDGUI_JUMP_TO_TIME_WINDOW))
-        return;
-
-    GtkWidget * entry = gtk_entry_new ();
-    gtk_entry_set_activates_default ((GtkEntry *) entry, TRUE);
-
-    GtkWidget * button1 = audgui_button_new (_("_Jump"), "go-jump", jump_cb, entry);
-    GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop", NULL, NULL);
-
-    GtkWidget * dialog = audgui_dialog_new (GTK_MESSAGE_OTHER,
-     _("Jump to Time"), _("Enter time (minutes:seconds):"), button1, button2);
-
-    audgui_dialog_add_widget (dialog, entry);
-
-    if (aud_drct_get_playing ())
-    {
-        int time = aud_drct_get_time () / 1000;
-        SPRINTF (buf, "%u:%02u", time / 60, time % 60);
-        gtk_entry_set_text ((GtkEntry *) entry, buf);
-    }
-
-    audgui_show_unique_window (AUDGUI_JUMP_TO_TIME_WINDOW, dialog);
-}
diff --git a/src/libaudgui/jump-to-time.cc b/src/libaudgui/jump-to-time.cc
new file mode 100644
index 000000000000..bd4925ac6874
--- /dev/null
+++ b/src/libaudgui/jump-to-time.cc
@@ -0,0 +1,62 @@
+/*
+ * jump-to-time.c
+ * Copyright 2012-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gtk/gtk.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/drct.h>
+#include <libaudcore/i18n.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+static void jump_cb (void * entry)
+{
+    const char * text = gtk_entry_get_text ((GtkEntry *) entry);
+    unsigned minutes, seconds;
+
+    if (sscanf (text, "%u:%u", & minutes, & seconds) == 2 && aud_drct_get_playing ())
+        aud_drct_seek ((minutes * 60 + seconds) * 1000);
+}
+
+EXPORT void audgui_jump_to_time ()
+{
+    if (audgui_reshow_unique_window (AUDGUI_JUMP_TO_TIME_WINDOW))
+        return;
+
+    GtkWidget * entry = gtk_entry_new ();
+    gtk_entry_set_activates_default ((GtkEntry *) entry, true);
+
+    GtkWidget * button1 = audgui_button_new (_("_Jump"), "go-jump", jump_cb, entry);
+    GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop", nullptr, nullptr);
+
+    GtkWidget * dialog = audgui_dialog_new (GTK_MESSAGE_OTHER,
+     _("Jump to Time"), _("Enter time (minutes:seconds):"), button1, button2);
+
+    audgui_dialog_add_widget (dialog, entry);
+
+    if (aud_drct_get_playing ())
+    {
+        int time = aud_drct_get_time () / 1000;
+        gtk_entry_set_text ((GtkEntry *) entry, str_printf ("%u:%02u", time / 60, time % 60));
+    }
+
+    audgui_show_unique_window (AUDGUI_JUMP_TO_TIME_WINDOW, dialog);
+}
diff --git a/src/libaudgui/jump-to-track-cache.cc b/src/libaudgui/jump-to-track-cache.cc
new file mode 100644
index 000000000000..db079956a150
--- /dev/null
+++ b/src/libaudgui/jump-to-track-cache.cc
@@ -0,0 +1,214 @@
+/*
+ * jump-to-track-cache.c
+ * Copyright 2008-2014 Jussi Judin and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "jump-to-track-cache.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <glib.h>  /* for GRegex */
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/runtime.h>
+
+/**
+ * Creates an regular expression list usable in searches from search keyword.
+ *
+ * In searches, every regular expression on this list is matched against
+ * the search title and if they all match, the title is declared as
+ * matching one.
+ *
+ * Regular expressions in list are formed by splitting the 'keyword' to words
+ * by splitting the keyword string with space character.
+ */
+Index<GRegex *> jump_to_track_cache_regex_list_create (const char * keyword)
+{
+    Index<GRegex *> regex_list;
+
+    /* Chop the key string into ' '-separated key regex-pattern strings */
+    Index<String> words = str_list_to_index (keyword, " ");
+
+    /* create a list of regex using the regex-pattern strings */
+    for (const char * word : words)
+    {
+        // Ignore empty words.
+        if (! word[0])
+            continue;
+
+        GRegex * regex = g_regex_new (word, G_REGEX_CASELESS, (GRegexMatchFlags) 0, nullptr);
+        if (regex)
+            regex_list.append (regex);
+    }
+
+    return regex_list;
+}
+
+/**
+ * Checks if 'song' matches all regular expressions in 'regex_list'.
+ */
+static bool jump_to_track_match (const char * name, Index<GRegex *> & regex_list)
+{
+    if (! name)
+        return false;
+
+    for (GRegex * regex : regex_list)
+    {
+        if (! g_regex_match (regex, name, (GRegexMatchFlags) 0, nullptr))
+            return false;
+    }
+
+    return true;
+}
+
+/**
+ * Returns all songs that match 'keyword'.
+ *
+ * Searches are conducted against entries in 'search_space' variable
+ * and after the search, search result is added to 'cache'.
+ *
+ * @param cache The result of this search is added to cache.
+ * @param search_space Entries inside which the search is conducted.
+ * @param keyword Normalized string for searches.
+ */
+const KeywordMatches * JumpToTrackCache::search_within
+ (const KeywordMatches * subset, const char * keyword)
+{
+    Index<GRegex *> regex_list = jump_to_track_cache_regex_list_create (keyword);
+
+    KeywordMatches * k = add (String (keyword), KeywordMatches ());
+
+    for (const KeywordMatch & item : * subset)
+    {
+        if (! regex_list.len () ||
+         jump_to_track_match (item.title, regex_list) ||
+         jump_to_track_match (item.artist, regex_list) ||
+         jump_to_track_match (item.album, regex_list) ||
+         jump_to_track_match (item.path, regex_list))
+            k->append (item);
+    }
+
+    for (GRegex * regex : regex_list)
+        g_regex_unref (regex);
+
+    return k;
+}
+
+/**
+ * Creates a new song search cache.
+ *
+ * Returned value should be freed with ui_jump_to_track_cache_free() function.
+ */
+void JumpToTrackCache::init ()
+{
+    int playlist = aud_playlist_get_active ();
+    int entries = aud_playlist_entry_count (playlist);
+
+    // the empty string will match all playlist entries
+    KeywordMatches & k = * add (String (""), KeywordMatches ());
+
+    k.insert (0, entries);
+
+    for (int entry = 0; entry < entries; entry ++)
+    {
+        KeywordMatch & item = k[entry];
+        item.entry = entry;
+        item.path = String (uri_to_display (aud_playlist_entry_get_filename (playlist, entry)));
+
+        Tuple tuple = aud_playlist_entry_get_tuple (playlist, entry, Playlist::Guess);
+        item.title = tuple.get_str (Tuple::Title);
+        item.artist = tuple.get_str (Tuple::Artist);
+        item.album = tuple.get_str (Tuple::Album);
+    }
+}
+
+/**
+ * Searches 'keyword' inside 'playlist' by using 'cache' to speed up searching.
+ *
+ * Searches are basically conducted as follows:
+ *
+ * Cache is checked if it has the information about right playlist and
+ * initialized with playlist data if needed.
+ *
+ * Keyword is normalized for searching (Unicode NFKD, case folding)
+ *
+ * Cache is checked if it has keyword and if it has, we can immediately get
+ * the search results and return. If not, searching goes as follows:
+ *
+ * Search for the longest word that is in cache that matches the beginning
+ * of keyword and use the cached matches as base for the current search.
+ * The shortest word that can be matched against is the empty string "", so
+ * there should always be matches in cache.
+ *
+ * After that conduct the search by splitting keyword into words separated
+ * by space and using regular expressions.
+ *
+ * When the keyword is searched, search result is added to cache to
+ * corresponding keyword that can be used as base for new searches.
+ *
+ * The motivation for caching is that to search word 'some cool song' one
+ * has to type following strings that are all searched individually:
+ *
+ * s
+ * so
+ * som
+ * some
+ * some
+ * some c
+ * some co
+ * some coo
+ * some cool
+ * some cool
+ * some cool s
+ * some cool so
+ * some cool son
+ * some cool song
+ *
+ * If the search results are cached in every phase and the result of
+ * the maximum length matching string is used as base for concurrent
+ * searches, we can probably get the matches reduced to some hundreds
+ * after a few letters typed on playlists with thousands of songs and
+ * reduce useless iteration quite a lot.
+ *
+ * Return: GArray of int
+ */
+const KeywordMatches * JumpToTrackCache::search (const char * keyword)
+{
+    if (! n_items ())
+        init ();
+
+    StringBuf match_string = str_copy (keyword);
+    const KeywordMatches * matches;
+
+    while (! (matches = lookup (String (match_string))))
+    {
+        // try to reuse the result of a previous search
+        // (the empty string is always present as a fallback)
+        assert (match_string[0]);
+        match_string[strlen (match_string) - 1] = 0;
+    }
+
+    // exact match?
+    if (! strcmp (match_string, keyword))
+        return matches;
+
+    // search within the previous result
+    return search_within (matches, keyword);
+}
diff --git a/src/libaudgui/jump-to-track-cache.h b/src/libaudgui/jump-to-track-cache.h
new file mode 100644
index 000000000000..d265eb1f7f59
--- /dev/null
+++ b/src/libaudgui/jump-to-track-cache.h
@@ -0,0 +1,46 @@
+/*
+ * jump-to-track-cache.h
+ * Copyright 2008 Jussi Judin
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDGUI_JUMPTOTRACK_CACHE_H
+#define LIBAUDGUI_JUMPTOTRACK_CACHE_H
+
+#include <libaudcore/index.h>
+#include <libaudcore/multihash.h>
+#include <libaudcore/objects.h>
+
+// Struct to keep information about matches from searches.
+struct KeywordMatch {
+    int entry;
+    String title, artist, album, path;
+};
+
+typedef Index<KeywordMatch> KeywordMatches;
+
+class JumpToTrackCache : private SimpleHash<String, KeywordMatches>
+{
+public:
+    const KeywordMatches * search (const char * keyword);
+    using SimpleHash::clear;
+
+private:
+    void init ();
+    const KeywordMatches * search_within (const KeywordMatches * subset, const char * keyword);
+};
+
+#endif
diff --git a/src/libaudgui/jump-to-track.cc b/src/libaudgui/jump-to-track.cc
new file mode 100644
index 000000000000..5d16e26cf38e
--- /dev/null
+++ b/src/libaudgui/jump-to-track.cc
@@ -0,0 +1,343 @@
+/*
+ * jump-to-track.c
+ * Copyright 2007-2014 Yoshiki Yazawa, John Lindgren, and Thomas Lange
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/runtime.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+#include "list.h"
+#include "jump-to-track-cache.h"
+
+static void update_cb (void * data, void *);
+static void activate_cb (void * data, void *);
+
+static JumpToTrackCache cache;
+static const KeywordMatches * search_matches;
+static GtkWidget * treeview, * filter_entry, * queue_button, * jump_button;
+static bool watching = false;
+
+static void destroy_cb ()
+{
+    if (watching)
+    {
+        hook_dissociate ("playlist update", update_cb);
+        hook_dissociate ("playlist activate", activate_cb);
+        watching = false;
+    }
+
+    cache.clear ();
+
+    search_matches = nullptr;
+}
+
+static int get_selected_entry ()
+{
+    g_return_val_if_fail (treeview && search_matches, -1);
+
+    GtkTreeModel * model = gtk_tree_view_get_model ((GtkTreeView *) treeview);
+    GtkTreeSelection * selection = gtk_tree_view_get_selection ((GtkTreeView *) treeview);
+    GtkTreeIter iter;
+
+    if (! gtk_tree_selection_get_selected (selection, nullptr, & iter))
+        return -1;
+
+    GtkTreePath * path = gtk_tree_model_get_path (model, & iter);
+    int row = gtk_tree_path_get_indices (path)[0];
+    gtk_tree_path_free (path);
+
+    g_return_val_if_fail (row >= 0 && row < search_matches->len (), -1);
+    return (* search_matches)[row].entry;
+}
+
+static void do_jump (void *)
+{
+    int entry = get_selected_entry ();
+    if (entry < 0)
+        return;
+
+    int playlist = aud_playlist_get_active ();
+    aud_playlist_set_position (playlist, entry);
+    aud_playlist_play (playlist);
+
+    if (aud_get_bool ("audgui", "close_jtf_dialog"))
+        audgui_jump_to_track_hide ();
+}
+
+static void update_queue_button (int entry)
+{
+    g_return_if_fail (queue_button);
+
+    if (entry < 0)
+    {
+        gtk_button_set_label ((GtkButton *) queue_button, _("_Queue"));
+        gtk_widget_set_sensitive (queue_button, false);
+    }
+    else
+    {
+        if (aud_playlist_queue_find_entry (aud_playlist_get_active (), entry) != -1)
+            gtk_button_set_label ((GtkButton *) queue_button, _("Un_queue"));
+        else
+            gtk_button_set_label ((GtkButton *) queue_button, _("_Queue"));
+
+        gtk_widget_set_sensitive (queue_button, true);
+    }
+}
+
+static void do_queue (void *)
+{
+    int playlist = aud_playlist_get_active ();
+    int entry = get_selected_entry ();
+    if (entry < 0)
+        return;
+
+    int queued = aud_playlist_queue_find_entry (playlist, entry);
+    if (queued >= 0)
+        aud_playlist_queue_delete (playlist, queued, 1);
+    else
+        aud_playlist_queue_insert (playlist, -1, entry);
+
+    update_queue_button (entry);
+}
+
+static void selection_changed ()
+{
+    int entry = get_selected_entry ();
+    gtk_widget_set_sensitive (jump_button, entry >= 0);
+
+    update_queue_button (entry);
+}
+
+static gboolean keypress_cb (GtkWidget * widget, GdkEventKey * event)
+{
+    if (event->keyval == GDK_KEY_Escape)
+    {
+        audgui_jump_to_track_hide ();
+        return true;
+    }
+
+    return false;
+}
+
+static void fill_list ()
+{
+    g_return_if_fail (treeview && filter_entry);
+
+    search_matches = cache.search (gtk_entry_get_text ((GtkEntry *) filter_entry));
+
+    audgui_list_delete_rows (treeview, 0, audgui_list_row_count (treeview));
+    audgui_list_insert_rows (treeview, 0, search_matches->len ());
+
+    if (search_matches->len () >= 1)
+    {
+        GtkTreeSelection * sel = gtk_tree_view_get_selection ((GtkTreeView *) treeview);
+        GtkTreePath * path = gtk_tree_path_new_from_indices (0, -1);
+        gtk_tree_selection_select_path (sel, path);
+        gtk_tree_path_free (path);
+    }
+}
+
+static void update_cb (void * data, void *)
+{
+    g_return_if_fail (treeview);
+
+    GtkTreeModel * model;
+    GtkTreeIter iter;
+    GtkTreePath * path = nullptr;
+
+    auto level = aud::from_ptr<Playlist::UpdateLevel> (data);
+    if (level <= Playlist::Selection)
+        return;
+
+    cache.clear ();
+
+    /* If it's only a metadata update, save and restore the cursor position. */
+    if (level <= Playlist::Metadata &&
+     gtk_tree_selection_get_selected (gtk_tree_view_get_selection
+     ((GtkTreeView *) treeview), & model, & iter))
+        path = gtk_tree_model_get_path (model, & iter);
+
+    fill_list ();
+
+    if (path != nullptr)
+    {
+        gtk_tree_selection_select_path (gtk_tree_view_get_selection
+         ((GtkTreeView *) treeview), path);
+        gtk_tree_view_scroll_to_cell ((GtkTreeView *) treeview, path, nullptr, true, 0.5, 0);
+        gtk_tree_path_free (path);
+    }
+}
+
+static void activate_cb (void * data, void *)
+{
+    update_cb (aud::to_ptr (Playlist::Structure), nullptr);
+}
+
+static void filter_icon_cb (GtkEntry * entry)
+{
+    gtk_entry_set_text (entry, "");
+}
+
+static void toggle_button_cb (GtkToggleButton * toggle)
+{
+    aud_set_bool ("audgui", "close_jtf_dialog", gtk_toggle_button_get_active (toggle));
+}
+
+static void list_get_value (void * user, int row, int column, GValue * value)
+{
+    g_return_if_fail (search_matches);
+    g_return_if_fail (column >= 0 && column < 2);
+    g_return_if_fail (row >= 0 && row < search_matches->len ());
+
+    int playlist = aud_playlist_get_active ();
+    int entry = (* search_matches)[row].entry;
+
+    switch (column)
+    {
+    case 0:
+        g_value_set_int (value, 1 + entry);
+        break;
+    case 1:
+        Tuple tuple = aud_playlist_entry_get_tuple (playlist, entry, Playlist::Guess);
+        g_value_set_string (value, tuple.get_str (Tuple::FormattedTitle));
+        break;
+    }
+}
+
+static const AudguiListCallbacks callbacks = {
+    list_get_value
+};
+
+static GtkWidget * create_window ()
+{
+    GtkWidget * jump_to_track_win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_type_hint ((GtkWindow *) jump_to_track_win, GDK_WINDOW_TYPE_HINT_DIALOG);
+
+    gtk_window_set_title ((GtkWindow *) jump_to_track_win, _("Jump to Song"));
+
+    g_signal_connect (jump_to_track_win, "key_press_event", (GCallback) keypress_cb, nullptr);
+    g_signal_connect (jump_to_track_win, "destroy", (GCallback) destroy_cb, nullptr);
+
+    gtk_container_set_border_width ((GtkContainer *) jump_to_track_win, 10);
+    gtk_window_set_default_size ((GtkWindow *) jump_to_track_win, 600, 500);
+
+    GtkWidget * vbox = gtk_vbox_new (false, 6);
+    gtk_container_add ((GtkContainer *) jump_to_track_win, vbox);
+
+    treeview = audgui_list_new (& callbacks, nullptr, 0);
+    gtk_tree_view_set_headers_visible ((GtkTreeView *) treeview, false);
+
+    audgui_list_add_column (treeview, nullptr, 0, G_TYPE_INT, 7);
+    audgui_list_add_column (treeview, nullptr, 1, G_TYPE_STRING, -1);
+
+    g_signal_connect (gtk_tree_view_get_selection ((GtkTreeView *) treeview),
+     "changed", (GCallback) selection_changed, nullptr);
+    g_signal_connect (treeview, "row-activated", (GCallback) do_jump, nullptr);
+
+    GtkWidget * hbox = gtk_hbox_new (false, 6);
+    gtk_box_pack_start ((GtkBox *) vbox, hbox, false, false, 3);
+
+    /* filter box */
+    GtkWidget * search_label = gtk_label_new (_("Filter: "));
+    gtk_label_set_markup_with_mnemonic ((GtkLabel *) search_label, _("_Filter:"));
+    gtk_box_pack_start ((GtkBox *) hbox, search_label, false, false, 0);
+
+    filter_entry = gtk_entry_new ();
+    gtk_entry_set_icon_from_icon_name ((GtkEntry *) filter_entry,
+     GTK_ENTRY_ICON_SECONDARY, "edit-clear");
+    gtk_label_set_mnemonic_widget ((GtkLabel *) search_label, filter_entry);
+    g_signal_connect (filter_entry, "changed", (GCallback) fill_list, nullptr);
+    g_signal_connect (filter_entry, "icon-press", (GCallback) filter_icon_cb, nullptr);
+    gtk_entry_set_activates_default ((GtkEntry *) filter_entry, true);
+    gtk_box_pack_start ((GtkBox *) hbox, filter_entry, true, true, 0);
+
+    GtkWidget * scrollwin = gtk_scrolled_window_new (nullptr, nullptr);
+    gtk_container_add ((GtkContainer *) scrollwin, treeview);
+    gtk_scrolled_window_set_policy ((GtkScrolledWindow *) scrollwin,
+     GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+    gtk_scrolled_window_set_shadow_type ((GtkScrolledWindow *) scrollwin, GTK_SHADOW_IN);
+    gtk_box_pack_start ((GtkBox *) vbox, scrollwin, true, true, 0);
+
+    GtkWidget * hbox2 = gtk_hbox_new (false, 0);
+    gtk_box_pack_end ((GtkBox *) vbox, hbox2, false, false, 0);
+
+    GtkWidget * bbox = gtk_hbutton_box_new ();
+    gtk_button_box_set_layout ((GtkButtonBox *) bbox, GTK_BUTTONBOX_END);
+    gtk_box_set_spacing ((GtkBox *) bbox, 6);
+
+    GtkWidget * alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+    gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 0, 6, 0);
+    gtk_container_add ((GtkContainer *) alignment, bbox);
+    gtk_box_pack_end ((GtkBox *) hbox2, alignment, true, true, 0);
+
+    /* close dialog toggle */
+    GtkWidget * toggle = gtk_check_button_new_with_mnemonic (_("C_lose on jump"));
+    gtk_toggle_button_set_active ((GtkToggleButton *) toggle, aud_get_bool
+     ("audgui", "close_jtf_dialog"));
+    gtk_container_add ((GtkContainer *) hbox2, toggle);
+    g_signal_connect (toggle, "clicked", (GCallback) toggle_button_cb, nullptr);
+
+    /* queue button */
+    queue_button = audgui_button_new (_("_Queue"), nullptr, do_queue, nullptr);
+    gtk_container_add ((GtkContainer *) bbox, queue_button);
+
+    /* close button */
+    GtkWidget * close = audgui_button_new (_("_Close"), "window-close",
+     (AudguiCallback) audgui_jump_to_track_hide, nullptr);
+    gtk_container_add ((GtkContainer *) bbox, close);
+
+    /* jump button */
+    jump_button = audgui_button_new (_("_Jump"), "go-jump", do_jump, nullptr);
+    gtk_container_add ((GtkContainer *) bbox, jump_button);
+    gtk_widget_set_can_default (jump_button, true);
+    gtk_widget_grab_default (jump_button);
+
+    return jump_to_track_win;
+}
+
+EXPORT void audgui_jump_to_track ()
+{
+    if (audgui_reshow_unique_window (AUDGUI_JUMP_TO_TRACK_WINDOW))
+        return;
+
+    GtkWidget * jump_to_track_win = create_window ();
+
+    if (! watching)
+    {
+        fill_list ();
+        hook_associate ("playlist update", update_cb, nullptr);
+        hook_associate ("playlist activate", activate_cb, nullptr);
+        watching = true;
+    }
+
+    gtk_widget_grab_focus (filter_entry);
+
+    audgui_show_unique_window (AUDGUI_JUMP_TO_TRACK_WINDOW, jump_to_track_win);
+}
+
+EXPORT void audgui_jump_to_track_hide ()
+{
+    audgui_hide_unique_window (AUDGUI_JUMP_TO_TRACK_WINDOW);
+}
diff --git a/src/libaudgui/libaudgui-gtk.h b/src/libaudgui/libaudgui-gtk.h
index 7e65a03034bf..4d12b7d17675 100644
--- a/src/libaudgui/libaudgui-gtk.h
+++ b/src/libaudgui/libaudgui-gtk.h
@@ -22,24 +22,39 @@
 
 #include <stdint.h>
 #include <gtk/gtk.h>
-#include <libaudcore/core.h>
+
+#include <libaudcore/objects.h>
+
+#define audgui_create_widgets(b, w) audgui_create_widgets_with_domain (b, w, PACKAGE)
+
+enum class AudMenuID;
+struct PreferencesWidget;
 
 typedef void (* AudguiCallback) (void * data);
 
 /* pixbufs.c */
 GdkPixbuf * audgui_pixbuf_from_data (const void * data, int64_t size);
-GdkPixbuf * audgui_pixbuf_fallback (void);
+GdkPixbuf * audgui_pixbuf_fallback ();
 void audgui_pixbuf_scale_within (GdkPixbuf * * pixbuf, int size);
-GdkPixbuf * audgui_pixbuf_request (const char * filename);
-GdkPixbuf * audgui_pixbuf_request_current (void);
+GdkPixbuf * audgui_pixbuf_request (const char * filename, bool * queued = nullptr);
+GdkPixbuf * audgui_pixbuf_request_current (bool * queued = nullptr);
+
+/* plugin-menu.c */
+GtkWidget * audgui_get_plugin_menu (AudMenuID id);
+
+/* prefs-widget.c */
+void audgui_create_widgets_with_domain (GtkWidget * box,
+ ArrayRef<PreferencesWidget> widgets, const char * domain);
 
-/* scaled-image.c */
+/* scaled-image.c -- okay to use without audgui_init() */
 GtkWidget * audgui_scaled_image_new (GdkPixbuf * pixbuf);
 void audgui_scaled_image_set (GtkWidget * widget, GdkPixbuf * pixbuf);
 
-/* util.c */
+/* util.c -- okay to use without audgui_init() */
 int audgui_get_digit_width (GtkWidget * widget);
 void audgui_get_mouse_coords (GtkWidget * widget, int * x, int * y);
+void audgui_get_mouse_coords (GdkScreen * screen, int * x, int * y);
+void audgui_get_monitor_geometry (GdkScreen * screen, int x, int y, GdkRectangle * geom);
 void audgui_destroy_on_escape (GtkWidget * widget);
 void audgui_simple_message (GtkWidget * * widget, GtkMessageType type,
  const char * title, const char * text);
diff --git a/src/libaudgui/libaudgui.h b/src/libaudgui/libaudgui.h
index db88ed1bdd7e..de9719e599a8 100644
--- a/src/libaudgui/libaudgui.h
+++ b/src/libaudgui/libaudgui.h
@@ -20,58 +20,76 @@
 #ifndef LIBAUDGUI_H
 #define LIBAUDGUI_H
 
-#include <stdint.h>
-#include <libaudcore/core.h>
+#include <libaudcore/index.h>
+#include <libaudcore/objects.h>
 
-void audgui_show_add_url_window(bool_t open);
-
-void audgui_jump_to_track(void);
-void audgui_jump_to_track_hide(void);
-
-void audgui_run_filebrowser(bool_t open);
-void audgui_hide_filebrowser(void);
+enum class AudMenuID;
+enum class PluginType;
+class PluginHandle;
 
 /* about.c */
-void audgui_show_about_window (void);
-void audgui_hide_about_window (void);
+void audgui_show_about_window ();
+void audgui_hide_about_window ();
 
 /* confirm.c */
 void audgui_confirm_playlist_delete (int playlist);
 void audgui_show_playlist_rename (int playlist);
 
 /* equalizer.c */
-void audgui_show_equalizer_window (void);
-void audgui_hide_equalizer_window (void);
+void audgui_show_equalizer_window ();
+void audgui_hide_equalizer_window ();
 
 /* infopopup.c */
 void audgui_infopopup_show (int playlist, int entry);
-void audgui_infopopup_show_current (void);
-void audgui_infopopup_hide (void);
+void audgui_infopopup_show_current ();
+void audgui_infopopup_hide ();
+
+/* file-opener.c */
+void audgui_run_filebrowser (bool open);
+void audgui_hide_filebrowser ();
 
 /* infowin.c */
 void audgui_infowin_show (int playlist, int entry);
-void audgui_infowin_show_current (void);
-void audgui_infowin_hide (void);
+void audgui_infowin_show_current ();
+void audgui_infowin_hide ();
+
+/* init.c */
+void audgui_init ();
+void audgui_cleanup ();
 
 /* jump-to-time.c */
-void audgui_jump_to_time (void);
+void audgui_jump_to_time ();
+
+/* jump-to-track.c */
+void audgui_jump_to_track ();
+void audgui_jump_to_track_hide ();
 
 /* playlists.c */
-void audgui_import_playlist (void);
-void audgui_export_playlist (void);
+void audgui_import_playlist ();
+void audgui_export_playlist ();
 
-/* queue-manager.c */
-void audgui_queue_manager_show (void);
+/* plugin-menu.c */
+void audgui_plugin_menu_add (AudMenuID id, void (* func) (void), const char * name, const char * icon);
+void audgui_plugin_menu_remove (AudMenuID id, void (* func) (void));
+
+/* plugin-prefs.c */
+void audgui_show_plugin_about (PluginHandle * plugin);
+void audgui_show_plugin_prefs (PluginHandle * plugin);
 
-/* ui_playlist_manager.c */
-void audgui_playlist_manager (void);
+/* prefs-window.c */
+void audgui_show_prefs_window ();
+void audgui_show_prefs_for_plugin_type (PluginType type);
+void audgui_hide_prefs_window ();
+
+/* queue-manager.c */
+void audgui_queue_manager_show ();
 
 /* urilist.c */
 void audgui_urilist_open (const char * list);
 void audgui_urilist_insert (int playlist, int position, const char * list);
-char * audgui_urilist_create_from_selected (int playlist);
+Index<char> audgui_urilist_create_from_selected (int playlist);
 
-/* util.c */
-void audgui_format_time (char * buf, int bufsize, int64_t milliseconds);
+/* url-opener.c */
+void audgui_show_add_url_window (bool open);
 
 #endif /* LIBAUDGUI_H */
diff --git a/src/libaudgui/list.c b/src/libaudgui/list.c
deleted file mode 100644
index aa3cb7d3fedc..000000000000
--- a/src/libaudgui/list.c
+++ /dev/null
@@ -1,891 +0,0 @@
-/*
- * list.c
- * Copyright 2011-2013 John Lindgren and Michał Lipski
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <stddef.h>
-#include <gtk/gtk.h>
-
-#include "libaudgui-gtk.h"
-#include "list.h"
-
-enum {HIGHLIGHT_COLUMN, RESERVED_COLUMNS};
-
-#define MODEL_HAS_CB(m, cb) \
- ((m)->cbs_size > offsetof (AudguiListCallbacks, cb) && (m)->cbs->cb)
-#define PATH_IS_SELECTED(w, p) (gtk_tree_selection_path_is_selected \
- (gtk_tree_view_get_selection ((GtkTreeView *) (w)), (p)))
-
-typedef struct {
-    GObject parent;
-    const AudguiListCallbacks * cbs;
-    int cbs_size;
-    void * user;
-    int charwidth;
-    int rows, highlight;
-    int columns;
-    GList * column_types;
-    bool_t frozen, blocked;
-    bool_t dragging;
-    bool_t clicked_row, receive_row;
-    int scroll_source, scroll_speed;
-} ListModel;
-
-/* ==== MODEL ==== */
-
-static GtkTreeModelFlags list_model_get_flags (GtkTreeModel * model)
-{
-    return GTK_TREE_MODEL_LIST_ONLY;
-}
-
-static int list_model_get_n_columns (GtkTreeModel * model)
-{
-    return ((ListModel *) model)->columns;
-}
-
-static GType list_model_get_column_type (GtkTreeModel * _model, int column)
-{
-    ListModel * model = (ListModel *) _model;
-    g_return_val_if_fail (column >= 0 && column < model->columns, G_TYPE_INVALID);
-
-    if (column == HIGHLIGHT_COLUMN)
-        return PANGO_TYPE_WEIGHT;
-
-    return GPOINTER_TO_INT (g_list_nth_data (model->column_types, column -
-     RESERVED_COLUMNS));
-}
-
-static bool_t list_model_get_iter (GtkTreeModel * model, GtkTreeIter * iter,
- GtkTreePath * path)
-{
-    int row = gtk_tree_path_get_indices (path)[0];
-    if (row < 0 || row >= ((ListModel *) model)->rows)
-        return FALSE;
-    iter->user_data = GINT_TO_POINTER (row);
-    return TRUE;
-}
-
-static GtkTreePath * list_model_get_path (GtkTreeModel * model,
- GtkTreeIter * iter)
-{
-    int row = GPOINTER_TO_INT (iter->user_data);
-    g_return_val_if_fail (row >= 0 && row < ((ListModel *) model)->rows, NULL);
-    return gtk_tree_path_new_from_indices (row, -1);
-}
-
-static void list_model_get_value (GtkTreeModel * _model, GtkTreeIter * iter,
- int column, GValue * value)
-{
-    ListModel * model = (ListModel *) _model;
-    int row = GPOINTER_TO_INT (iter->user_data);
-    g_return_if_fail (column >= 0 && column < model->columns);
-    g_return_if_fail (row >= 0 && row < model->rows);
-
-    if (column == HIGHLIGHT_COLUMN)
-    {
-        g_value_init (value, PANGO_TYPE_WEIGHT);
-        g_value_set_enum (value, row == model->highlight ? PANGO_WEIGHT_BOLD :
-         PANGO_WEIGHT_NORMAL);
-        return;
-    }
-
-    g_value_init (value, GPOINTER_TO_INT (g_list_nth_data (model->column_types,
-     column - RESERVED_COLUMNS)));
-    model->cbs->get_value (model->user, row, column - RESERVED_COLUMNS, value);
-}
-
-static bool_t list_model_iter_next (GtkTreeModel * _model, GtkTreeIter * iter)
-{
-    ListModel * model = (ListModel *) _model;
-    int row = GPOINTER_TO_INT (iter->user_data);
-    g_return_val_if_fail (row >= 0 && row < model->rows, FALSE);
-    if (row + 1 >= model->rows)
-        return FALSE;
-    iter->user_data = GINT_TO_POINTER (row + 1);
-    return TRUE;
-}
-
-static bool_t list_model_iter_children (GtkTreeModel * model,
- GtkTreeIter * iter, GtkTreeIter * parent)
-{
-    if (parent || ((ListModel *) model)->rows < 1)
-        return FALSE;
-    iter->user_data = GINT_TO_POINTER (0);
-    return TRUE;
-}
-
-static bool_t list_model_iter_has_child (GtkTreeModel * model,
- GtkTreeIter * iter)
-{
-    return FALSE;
-}
-
-static int list_model_iter_n_children (GtkTreeModel * model, GtkTreeIter * iter)
-{
-    return iter ? 0 : ((ListModel *) model)->rows;
-}
-
-static bool_t list_model_iter_nth_child (GtkTreeModel * model,
- GtkTreeIter * iter, GtkTreeIter * parent, int n)
-{
-    if (parent || n < 0 || n >= ((ListModel *) model)->rows)
-        return FALSE;
-    iter->user_data = GINT_TO_POINTER (n);
-    return TRUE;
-}
-
-static bool_t list_model_iter_parent (GtkTreeModel * model,
- GtkTreeIter * iter, GtkTreeIter * child)
-{
-    return FALSE;
-}
-
-static void iface_init (GtkTreeModelIface * iface)
-{
-    iface->get_flags = list_model_get_flags;
-    iface->get_n_columns = list_model_get_n_columns;
-    iface->get_column_type = list_model_get_column_type;
-    iface->get_iter = list_model_get_iter;
-    iface->get_path = list_model_get_path;
-    iface->get_value = list_model_get_value;
-    iface->iter_next = list_model_iter_next;
-    iface->iter_children = list_model_iter_children;
-    iface->iter_has_child = list_model_iter_has_child;
-    iface->iter_n_children = list_model_iter_n_children;
-    iface->iter_nth_child = list_model_iter_nth_child;
-    iface->iter_parent = list_model_iter_parent;
-}
-
-static const GInterfaceInfo iface_info =
-{
-    .interface_init = (GInterfaceInitFunc) iface_init,
-    .interface_finalize = NULL,
-    .interface_data = NULL,
-};
-
-static GType list_model_get_type (void)
-{
-    static GType type = G_TYPE_INVALID;
-    if (type == G_TYPE_INVALID)
-    {
-        type = g_type_register_static_simple (G_TYPE_OBJECT, "AudguiListModel",
-         sizeof (GObjectClass), NULL, sizeof (ListModel), NULL, 0);
-        g_type_add_interface_static (type, GTK_TYPE_TREE_MODEL, & iface_info);
-    }
-    return type;
-}
-
-/* ==== CALLBACKS ==== */
-
-static bool_t select_allow_cb (GtkTreeSelection * sel, GtkTreeModel * model,
- GtkTreePath * path, bool_t was, void * user)
-{
-    return ! ((ListModel *) model)->frozen;
-}
-
-static void select_row_cb (GtkTreeModel * _model, GtkTreePath * path,
- GtkTreeIter * iter, void * user)
-{
-    ListModel * model = (ListModel *) _model;
-    int row = gtk_tree_path_get_indices (path)[0];
-    g_return_if_fail (row >= 0 && row < model->rows);
-    model->cbs->set_selected (model->user, row, TRUE);
-}
-
-static void select_cb (GtkTreeSelection * sel, ListModel * model)
-{
-    if (model->blocked)
-        return;
-    model->cbs->select_all (model->user, FALSE);
-    gtk_tree_selection_selected_foreach (sel, select_row_cb, NULL);
-}
-
-static void focus_cb (GtkTreeView * tree, ListModel * model)
-{
-    if (! model->blocked)
-        model->cbs->focus_change (model->user,
-         audgui_list_get_focus ((GtkWidget *) tree));
-}
-
-static void activate_cb (GtkTreeView * tree, GtkTreePath * path,
- GtkTreeViewColumn * col, ListModel * model)
-{
-    int row = gtk_tree_path_get_indices (path)[0];
-    g_return_if_fail (row >= 0 && row < model->rows);
-    model->cbs->activate_row (model->user, row);
-}
-
-static bool_t button_press_cb (GtkWidget * widget, GdkEventButton * event,
- ListModel * model)
-{
-    GtkTreePath * path = NULL;
-    gtk_tree_view_get_path_at_pos ((GtkTreeView *) widget, event->x, event->y,
-     & path, NULL, NULL, NULL);
-
-    if (event->type == GDK_BUTTON_PRESS && event->button == 3
-     && MODEL_HAS_CB (model, right_click))
-    {
-        /* Only allow GTK to select this row if it is not already selected.  We
-         * don't want to clear a multiple selection. */
-        if (path)
-        {
-            if (PATH_IS_SELECTED (widget, path))
-                model->frozen = TRUE;
-            gtk_tree_view_set_cursor ((GtkTreeView *) widget, path, NULL, FALSE);
-            model->frozen = FALSE;
-        }
-
-        model->cbs->right_click (model->user, event);
-
-        if (path)
-            gtk_tree_path_free (path);
-        return TRUE;
-    }
-
-    /* Only allow GTK to select this row if it is not already selected.  If we
-     * are going to be dragging, we don't want to clear a multiple selection.
-     * If this is just a simple click, we will clear the multiple selection in
-     * button_release_cb. */
-    if (event->type == GDK_BUTTON_PRESS && event->button == 1 && ! (event->state
-     & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) && path && PATH_IS_SELECTED (widget,
-     path))
-        model->frozen = TRUE;
-
-    if (path)
-        model->clicked_row = gtk_tree_path_get_indices (path)[0];
-    else
-        model->clicked_row = -1;
-
-    if (path)
-        gtk_tree_path_free (path);
-    return FALSE;
-}
-
-static bool_t button_release_cb (GtkWidget * widget, GdkEventButton * event,
- ListModel * model)
-{
-    /* If button_press_cb set "frozen", and we were not dragging, we need to
-     * clear a multiple selection. */
-    if (model->frozen && model->clicked_row >= 0 && model->clicked_row <
-     model->rows)
-    {
-        model->frozen = FALSE;
-        GtkTreePath * path = gtk_tree_path_new_from_indices (model->clicked_row,
-         -1);
-        gtk_tree_view_set_cursor ((GtkTreeView *) widget, path, NULL, FALSE);
-        gtk_tree_path_free (path);
-    }
-
-    return FALSE;
-}
-
-static bool_t key_press_cb (GtkWidget * widget, GdkEventKey * event, ListModel * model)
-{
-    /* GTK thinks the spacebar should activate a row; I (jlindgren) disagree */
-    if (event->keyval == ' ' && ! (event->state & GDK_CONTROL_MASK))
-        return TRUE;
-
-    return FALSE;
-}
-
-static bool_t motion_notify_cb (GtkWidget * widget, GdkEventMotion * event, ListModel * model)
-{
-    if (MODEL_HAS_CB (model, mouse_motion))
-    {
-        int x, y;
-        gtk_tree_view_convert_bin_window_to_widget_coords ((GtkTreeView *)
-         widget, event->x, event->y, & x, & y);
-
-        int row = audgui_list_row_at_point (widget, x, y);
-        model->cbs->mouse_motion (model->user, event, row);
-    }
-
-    return FALSE;
-}
-
-static bool_t leave_notify_cb (GtkWidget * widget, GdkEventMotion * event, ListModel * model)
-{
-    if (MODEL_HAS_CB (model, mouse_leave))
-    {
-        int x, y;
-        gtk_tree_view_convert_bin_window_to_widget_coords ((GtkTreeView *)
-         widget, event->x, event->y, & x, & y);
-
-        int row = audgui_list_row_at_point (widget, x, y);
-        model->cbs->mouse_leave (model->user, event, row);
-    }
-
-    return FALSE;
-}
-
-/* ==== DRAG AND DROP ==== */
-
-static void drag_begin (GtkWidget * widget, GdkDragContext * context,
- ListModel * model)
-{
-    g_signal_stop_emission_by_name (widget, "drag-begin");
-
-    model->dragging = TRUE;
-}
-
-static void drag_end (GtkWidget * widget, GdkDragContext * context,
- ListModel * model)
-{
-    g_signal_stop_emission_by_name (widget, "drag-end");
-
-    model->dragging = FALSE;
-    model->clicked_row = -1;
-}
-
-static void drag_data_get (GtkWidget * widget, GdkDragContext * context,
- GtkSelectionData * sel, unsigned int info, unsigned int time, ListModel * model)
-{
-    g_signal_stop_emission_by_name (widget, "drag-data-get");
-
-    void * data = NULL;
-    int length = 0;
-    model->cbs->get_data (model->user, & data, & length);
-    gtk_selection_data_set (sel, gdk_atom_intern (model->cbs->data_type, FALSE),
-     8, data, length);
-    g_free (data);
-}
-
-static int calc_drop_row (ListModel * model, GtkWidget * widget, int x, int y)
-{
-    int row = audgui_list_row_at_point_rounded (widget, x, y);
-    if (row < 0)
-        row = model->rows;
-    return row;
-}
-
-static void stop_autoscroll (ListModel * model)
-{
-    if (! model->scroll_source)
-        return;
-
-    g_source_remove (model->scroll_source);
-    model->scroll_source = 0;
-    model->scroll_speed = 0;
-}
-
-static bool_t autoscroll (GtkWidget * widget)
-{
-    ListModel * model = (ListModel *) gtk_tree_view_get_model
-     ((GtkTreeView *) widget);
-
-    GtkAdjustment * adj = gtk_scrollable_get_vadjustment ((GtkScrollable *) widget);
-    if (! adj)
-        return FALSE;
-
-    int new = gtk_adjustment_get_value (adj) + model->scroll_speed;
-    int clamped = CLAMP (new, 0, gtk_adjustment_get_upper (adj) -
-     gtk_adjustment_get_page_size (adj));
-    gtk_adjustment_set_value (adj, clamped);
-
-    if (clamped != new) /* reached top or bottom? */
-        return FALSE;
-
-    if (model->scroll_speed > 0)
-        model->scroll_speed = MIN (model->scroll_speed + 2, 100);
-    else
-        model->scroll_speed = MAX (model->scroll_speed - 2, -100);
-
-    return TRUE;
-}
-
-static void start_autoscroll (ListModel * model, GtkWidget * widget, int speed)
-{
-    if (model->scroll_source)
-        return;
-
-    model->scroll_source = g_timeout_add (50, (GSourceFunc) autoscroll, widget);
-    model->scroll_speed = speed;
-}
-
-static bool_t drag_motion (GtkWidget * widget, GdkDragContext * context,
- int x, int y, unsigned int time, ListModel * model)
-{
-    g_signal_stop_emission_by_name (widget, "drag-motion");
-
-    /* If button_press_cb preserved a multiple selection, tell button_release_cb
-     * not to clear it. */
-    model->frozen = FALSE;
-
-    if (model->dragging && MODEL_HAS_CB (model, shift_rows)) /* dragging within same list */
-        gdk_drag_status (context, GDK_ACTION_MOVE, time);
-    else if (MODEL_HAS_CB (model, data_type)) /* cross-widget dragging */
-        gdk_drag_status (context, GDK_ACTION_COPY, time);
-    else
-        return FALSE;
-
-    if (model->rows > 0)
-    {
-        int row = calc_drop_row (model, widget, x, y);
-        if (row == model->rows)
-        {
-            GtkTreePath * path = gtk_tree_path_new_from_indices (row - 1, -1);
-            gtk_tree_view_set_drag_dest_row ((GtkTreeView *) widget, path,
-             GTK_TREE_VIEW_DROP_AFTER);
-            gtk_tree_path_free (path);
-        }
-        else
-        {
-            GtkTreePath * path = gtk_tree_path_new_from_indices (row, -1);
-            gtk_tree_view_set_drag_dest_row ((GtkTreeView *) widget, path,
-             GTK_TREE_VIEW_DROP_BEFORE);
-            gtk_tree_path_free (path);
-        }
-    }
-
-    int height;
-    gdk_window_get_geometry (gtk_tree_view_get_bin_window ((GtkTreeView *)
-     widget), NULL, NULL, NULL, & height);
-    gtk_tree_view_convert_widget_to_bin_window_coords ((GtkTreeView *) widget,
-     x, y, & x, & y);
-
-    int hotspot = MIN (height / 4, 24);
-
-    if (y >= 0 && y < hotspot)
-        start_autoscroll (model, widget, -2);
-    else if (y >= height - hotspot && y < height)
-        start_autoscroll (model, widget, 2);
-    else
-        stop_autoscroll (model);
-
-    return TRUE;
-}
-
-static void drag_leave (GtkWidget * widget, GdkDragContext * context,
- unsigned int time, ListModel * model)
-{
-    g_signal_stop_emission_by_name (widget, "drag-leave");
-
-    gtk_tree_view_set_drag_dest_row ((GtkTreeView *) widget, NULL, 0);
-    stop_autoscroll (model);
-}
-
-static bool_t drag_drop (GtkWidget * widget, GdkDragContext * context, int x,
- int y, unsigned int time, ListModel * model)
-{
-    g_signal_stop_emission_by_name (widget, "drag-drop");
-
-    bool_t success = TRUE;
-    int row = calc_drop_row (model, widget, x, y);
-
-    if (model->dragging && MODEL_HAS_CB (model, shift_rows)) /* dragging within same list */
-    {
-        if (model->clicked_row >= 0 && model->clicked_row < model->rows)
-            model->cbs->shift_rows (model->user, model->clicked_row, row);
-        else
-            success = FALSE;
-    }
-    else if (MODEL_HAS_CB (model, data_type)) /* cross-widget dragging */
-    {
-        model->receive_row = row;
-        gtk_drag_get_data (widget, context, gdk_atom_intern
-         (model->cbs->data_type, FALSE), time);
-    }
-    else
-        success = FALSE;
-
-    gtk_drag_finish (context, success, FALSE, time);
-    gtk_tree_view_set_drag_dest_row ((GtkTreeView *) widget, NULL, 0);
-    stop_autoscroll (model);
-    return TRUE;
-}
-
-static void drag_data_received (GtkWidget * widget, GdkDragContext * context, int x,
- int y, GtkSelectionData * sel, unsigned int info, unsigned int time, ListModel * model)
-{
-    g_signal_stop_emission_by_name (widget, "drag-data-received");
-
-    g_return_if_fail (model->receive_row >= 0 && model->receive_row <=
-     model->rows);
-
-    const unsigned char * data = gtk_selection_data_get_data (sel);
-    int length = gtk_selection_data_get_length (sel);
-
-    if (data && length)
-        model->cbs->receive_data (model->user, model->receive_row, data, length);
-
-    model->receive_row = -1;
-}
-
-/* ==== PUBLIC FUNCS ==== */
-
-static void destroy_cb (GtkWidget * list, ListModel * model)
-{
-    /* workaround for Gnome bug #679291 */
-    g_signal_handlers_disconnect_matched (list, G_SIGNAL_MATCH_DATA, 0, 0, NULL,
-     NULL, model);
-
-    stop_autoscroll (model);
-    g_list_free (model->column_types);
-    g_object_unref (model);
-}
-
-static void update_selection (GtkWidget * list, ListModel * model, int at,
- int rows)
-{
-    model->blocked = TRUE;
-    GtkTreeSelection * sel = gtk_tree_view_get_selection ((GtkTreeView *) list);
-
-    for (int i = at; i < at + rows; i ++)
-    {
-        GtkTreeIter iter = {.user_data = GINT_TO_POINTER (i)};
-        if (model->cbs->get_selected (model->user, i))
-            gtk_tree_selection_select_iter (sel, & iter);
-        else
-            gtk_tree_selection_unselect_iter (sel, & iter);
-    }
-
-    model->blocked = FALSE;
-}
-
-EXPORT GtkWidget * audgui_list_new_real (const AudguiListCallbacks * cbs, int cbs_size,
- void * user, int rows)
-{
-    g_return_val_if_fail (cbs->get_value, NULL);
-
-    ListModel * model = (ListModel *) g_object_new (list_model_get_type (), NULL);
-    model->cbs = cbs;
-    model->cbs_size = cbs_size;
-    model->user = user;
-    model->rows = rows;
-    model->highlight = -1;
-    model->columns = RESERVED_COLUMNS;
-    model->column_types = NULL;
-    model->frozen = FALSE;
-    model->blocked = FALSE;
-    model->dragging = FALSE;
-    model->clicked_row = -1;
-    model->receive_row = -1;
-    model->scroll_source = 0;
-    model->scroll_speed = 0;
-
-    GtkWidget * list = gtk_tree_view_new_with_model ((GtkTreeModel *) model);
-    gtk_tree_view_set_fixed_height_mode ((GtkTreeView *) list, TRUE);
-    g_signal_connect (list, "destroy", (GCallback) destroy_cb, model);
-
-    model->charwidth = audgui_get_digit_width (list);
-
-    if (MODEL_HAS_CB (model, get_selected) && MODEL_HAS_CB (model, set_selected)
-     && MODEL_HAS_CB (model, select_all))
-    {
-        GtkTreeSelection * sel = gtk_tree_view_get_selection
-         ((GtkTreeView *) list);
-        gtk_tree_selection_set_mode (sel, GTK_SELECTION_MULTIPLE);
-        gtk_tree_selection_set_select_function (sel, select_allow_cb, NULL, NULL);
-        g_signal_connect (sel, "changed", (GCallback) select_cb, model);
-
-        update_selection (list, model, 0, rows);
-    }
-
-    if (MODEL_HAS_CB (model, focus_change))
-        g_signal_connect (list, "cursor-changed", (GCallback) focus_cb, model);
-
-    if (MODEL_HAS_CB (model, activate_row))
-        g_signal_connect (list, "row-activated", (GCallback) activate_cb, model);
-
-    g_signal_connect (list, "button-press-event", (GCallback) button_press_cb, model);
-    g_signal_connect (list, "button-release-event", (GCallback) button_release_cb, model);
-    g_signal_connect (list, "key-press-event", (GCallback) key_press_cb, model);
-    g_signal_connect (list, "motion-notify-event", (GCallback) motion_notify_cb, model);
-    g_signal_connect (list, "leave-notify-event", (GCallback) leave_notify_cb, model);
-
-    bool_t supports_drag = FALSE;
-
-    if (MODEL_HAS_CB (model, data_type) && MODEL_HAS_CB (model, get_data) &&
-     MODEL_HAS_CB (model, receive_data))
-    {
-        const GtkTargetEntry target = {(char *) cbs->data_type, 0, 0};
-
-        gtk_drag_source_set (list, GDK_BUTTON1_MASK, & target, 1,
-         GDK_ACTION_COPY);
-        gtk_drag_dest_set (list, 0, & target, 1, GDK_ACTION_COPY);
-
-        g_signal_connect (list, "drag-data-get", (GCallback) drag_data_get,
-         model);
-        g_signal_connect (list, "drag-data-received", (GCallback)
-         drag_data_received, model);
-
-        supports_drag = TRUE;
-    }
-    else if (MODEL_HAS_CB (model, shift_rows))
-    {
-        gtk_drag_source_set (list, GDK_BUTTON1_MASK, NULL, 0, GDK_ACTION_COPY);
-        gtk_drag_dest_set (list, 0, NULL, 0, GDK_ACTION_COPY);
-        supports_drag = TRUE;
-    }
-
-    if (supports_drag)
-    {
-        g_signal_connect (list, "drag-begin", (GCallback) drag_begin, model);
-        g_signal_connect (list, "drag-end", (GCallback) drag_end, model);
-        g_signal_connect (list, "drag-motion", (GCallback) drag_motion, model);
-        g_signal_connect (list, "drag-leave", (GCallback) drag_leave, model);
-        g_signal_connect (list, "drag-drop", (GCallback) drag_drop, model);
-    }
-
-    return list;
-}
-
-EXPORT void * audgui_list_get_user (GtkWidget * list)
-{
-    ListModel * model = (ListModel *) gtk_tree_view_get_model
-     ((GtkTreeView *) list);
-    return model->user;
-}
-
-EXPORT void audgui_list_add_column (GtkWidget * list, const char * title,
- int column, GType type, int width)
-{
-    ListModel * model = (ListModel *) gtk_tree_view_get_model
-     ((GtkTreeView *) list);
-    g_return_if_fail (RESERVED_COLUMNS + column == model->columns);
-
-    model->columns ++;
-    model->column_types = g_list_append (model->column_types, GINT_TO_POINTER
-     (type));
-
-    GtkCellRenderer * renderer = gtk_cell_renderer_text_new ();
-    GtkTreeViewColumn * tree_column = gtk_tree_view_column_new_with_attributes
-     (title, renderer, "text", RESERVED_COLUMNS + column, "weight",
-     HIGHLIGHT_COLUMN, NULL);
-    gtk_tree_view_column_set_sizing (tree_column, GTK_TREE_VIEW_COLUMN_FIXED);
-    gtk_tree_view_column_set_resizable (tree_column, TRUE);
-
-    int pad1, pad2, pad3;
-    gtk_widget_style_get (list, "horizontal-separator", & pad1, "focus-line-width", & pad2, NULL);
-    gtk_cell_renderer_get_padding (renderer, & pad3, NULL);
-    int padding = pad1 + 2 * pad2 + 2 * pad3;
-
-    if (width < 1)
-    {
-        gtk_tree_view_column_set_min_width (tree_column,
-         6 * model->charwidth + model->charwidth / 2 + padding);
-        gtk_tree_view_column_set_expand (tree_column, TRUE);
-        g_object_set ((GObject *) renderer, "ellipsize-set", TRUE, "ellipsize",
-         PANGO_ELLIPSIZE_END, NULL);
-    }
-    else
-    {
-        gtk_tree_view_column_set_min_width (tree_column,
-         width * model->charwidth + model->charwidth / 2 + padding);
-        g_object_set ((GObject *) renderer, "xalign", (float) 1, NULL);
-    }
-
-    gtk_tree_view_append_column ((GtkTreeView *) list, tree_column);
-}
-
-EXPORT int audgui_list_row_count (GtkWidget * list)
-{
-    return ((ListModel *) gtk_tree_view_get_model ((GtkTreeView *) list))->rows;
-}
-
-EXPORT void audgui_list_insert_rows (GtkWidget * list, int at, int rows)
-{
-    ListModel * model = (ListModel *) gtk_tree_view_get_model
-     ((GtkTreeView *) list);
-    g_return_if_fail (at >= 0 && at <= model->rows && rows >= 0);
-
-    model->rows += rows;
-    if (model->highlight >= at)
-        model->highlight += rows;
-
-    GtkTreeIter iter = {.user_data = GINT_TO_POINTER (at)};
-    GtkTreePath * path = gtk_tree_path_new_from_indices (at, -1);
-
-    for (int i = rows; i --; )
-        gtk_tree_model_row_inserted ((GtkTreeModel *) model, path, & iter);
-
-    gtk_tree_path_free (path);
-
-    if (model->cbs->get_selected)
-        update_selection (list, model, at, rows);
-}
-
-EXPORT void audgui_list_update_rows (GtkWidget * list, int at, int rows)
-{
-    ListModel * model = (ListModel *) gtk_tree_view_get_model
-     ((GtkTreeView *) list);
-    g_return_if_fail (at >= 0 && rows >= 0 && at + rows <= model->rows);
-
-    GtkTreeIter iter = {.user_data = GINT_TO_POINTER (at)};
-    GtkTreePath * path = gtk_tree_path_new_from_indices (at, -1);
-
-    while (rows --)
-    {
-        gtk_tree_model_row_changed ((GtkTreeModel *) model, path, & iter);
-        iter.user_data = GINT_TO_POINTER (GPOINTER_TO_INT (iter.user_data) + 1);
-        gtk_tree_path_next (path);
-    }
-
-    gtk_tree_path_free (path);
-}
-
-EXPORT void audgui_list_delete_rows (GtkWidget * list, int at, int rows)
-{
-    ListModel * model = (ListModel *) gtk_tree_view_get_model
-     ((GtkTreeView *) list);
-    g_return_if_fail (at >= 0 && rows >= 0 && at + rows <= model->rows);
-
-    model->rows -= rows;
-    if (model->highlight >= at + rows)
-        model->highlight -= rows;
-    else if (model->highlight >= at)
-        model->highlight = -1;
-
-    model->frozen = TRUE;
-    model->blocked = TRUE;
-
-    int focus = audgui_list_get_focus (list);
-
-    // first delete rows after cursor so it does not get moved to one of them
-    if (focus >= at && focus + 1 < at + rows)
-    {
-        GtkTreePath * path = gtk_tree_path_new_from_indices (focus + 1, -1);
-
-        while (focus + 1 < at + rows)
-        {
-            gtk_tree_model_row_deleted ((GtkTreeModel *) model, path);
-            rows --;
-        }
-
-        gtk_tree_path_free (path);
-    }
-
-    // now delete rows preceding cursor and finally cursor row itself
-    GtkTreePath * path = gtk_tree_path_new_from_indices (at, -1);
-
-    while (rows --)
-        gtk_tree_model_row_deleted ((GtkTreeModel *) model, path);
-
-    gtk_tree_path_free (path);
-
-    model->frozen = FALSE;
-    model->blocked = FALSE;
-}
-
-EXPORT void audgui_list_update_selection (GtkWidget * list, int at, int rows)
-{
-    ListModel * model = (ListModel *) gtk_tree_view_get_model
-     ((GtkTreeView *) list);
-    g_return_if_fail (model->cbs->get_selected);
-    g_return_if_fail (at >= 0 && rows >= 0 && at + rows <= model->rows);
-    update_selection (list, model, at, rows);
-}
-
-EXPORT int audgui_list_get_highlight (GtkWidget * list)
-{
-    ListModel * model = (ListModel *) gtk_tree_view_get_model
-     ((GtkTreeView *) list);
-    return model->highlight;
-}
-
-EXPORT void audgui_list_set_highlight (GtkWidget * list, int row)
-{
-    ListModel * model = (ListModel *) gtk_tree_view_get_model
-     ((GtkTreeView *) list);
-    g_return_if_fail (row >= -1 && row < model->rows);
-
-    int old = model->highlight;
-    if (row == old)
-        return;
-    model->highlight = row;
-
-    if (old >= 0)
-        audgui_list_update_rows (list, old, 1);
-    if (row >= 0)
-        audgui_list_update_rows (list, row, 1);
-}
-
-EXPORT int audgui_list_get_focus (GtkWidget * list)
-{
-    GtkTreePath * path = NULL;
-    gtk_tree_view_get_cursor ((GtkTreeView *) list, & path, NULL);
-
-    if (! path)
-        return -1;
-
-    int row = gtk_tree_path_get_indices (path)[0];
-
-    gtk_tree_path_free (path);
-    return row;
-}
-
-EXPORT void audgui_list_set_focus (GtkWidget * list, int row)
-{
-    ListModel * model = (ListModel *) gtk_tree_view_get_model
-     ((GtkTreeView *) list);
-    g_return_if_fail (row >= -1 && row < model->rows);
-
-    if (row < 0 || row == audgui_list_get_focus (list))
-        return;
-
-    model->frozen = TRUE;
-    model->blocked = TRUE;
-
-    GtkTreePath * path = gtk_tree_path_new_from_indices (row, -1);
-    gtk_tree_view_set_cursor ((GtkTreeView *) list, path, NULL, FALSE);
-    gtk_tree_view_scroll_to_cell ((GtkTreeView *) list, path, NULL, FALSE, 0, 0);
-    gtk_tree_path_free (path);
-
-    model->frozen = FALSE;
-    model->blocked = FALSE;
-}
-
-EXPORT int audgui_list_row_at_point (GtkWidget * list, int x, int y)
-{
-    ListModel * model = (ListModel *) gtk_tree_view_get_model ((GtkTreeView *) list);
-
-    GtkTreePath * path = NULL;
-    gtk_tree_view_convert_widget_to_bin_window_coords ((GtkTreeView *) list, x, y, & x, & y);
-    gtk_tree_view_get_path_at_pos ((GtkTreeView *) list, x, y, & path, NULL, NULL, NULL);
-
-    if (! path)
-        return -1;
-
-    int row = gtk_tree_path_get_indices (path)[0];
-    g_return_val_if_fail (row >= 0 && row < model->rows, -1);
-
-    gtk_tree_path_free (path);
-    return row;
-}
-
-EXPORT int audgui_list_row_at_point_rounded (GtkWidget * list, int x, int y)
-{
-    ListModel * model = (ListModel *) gtk_tree_view_get_model ((GtkTreeView *) list);
-
-    GtkTreePath * path = NULL;
-    gtk_tree_view_convert_widget_to_bin_window_coords ((GtkTreeView *) list, x, y, & x, & y);
-    gtk_tree_view_get_path_at_pos ((GtkTreeView *) list, x, y, & path, NULL, NULL, NULL);
-
-    if (! path)
-        return -1;
-
-    int row = gtk_tree_path_get_indices (path)[0];
-    g_return_val_if_fail (row >= 0 && row < model->rows, -1);
-
-    GdkRectangle rect;
-    gtk_tree_view_get_background_area ((GtkTreeView *) list, path, NULL, & rect);
-    if (y > rect.y + rect.height / 2)
-        row ++;
-
-    gtk_tree_path_free (path);
-    return row;
-}
diff --git a/src/libaudgui/list.cc b/src/libaudgui/list.cc
new file mode 100644
index 000000000000..a7b00220f051
--- /dev/null
+++ b/src/libaudgui/list.cc
@@ -0,0 +1,894 @@
+/*
+ * list.c
+ * Copyright 2011-2013 John Lindgren and Michał Lipski
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <stddef.h>
+#include <gtk/gtk.h>
+
+#include <libaudcore/objects.h>
+
+#include "libaudgui-gtk.h"
+#include "list.h"
+
+enum {
+    HIGHLIGHT_COLUMN,
+    RESERVED_COLUMNS
+};
+
+#define MODEL_HAS_CB(m, cb) \
+ ((m)->cbs_size > (int) offsetof (AudguiListCallbacks, cb) && (m)->cbs->cb)
+#define PATH_IS_SELECTED(w, p) (gtk_tree_selection_path_is_selected \
+ (gtk_tree_view_get_selection ((GtkTreeView *) (w)), (p)))
+
+struct ListModel {
+    GObject parent;
+    const AudguiListCallbacks * cbs;
+    int cbs_size;
+    void * user;
+    int charwidth;
+    int rows, highlight;
+    int columns;
+    GList * column_types;
+    bool resizable;
+    bool frozen, blocked;
+    bool dragging;
+    int clicked_row, receive_row;
+    int scroll_source, scroll_speed;
+};
+
+/* ==== MODEL ==== */
+
+static GtkTreeModelFlags list_model_get_flags (GtkTreeModel * model)
+{
+    return GTK_TREE_MODEL_LIST_ONLY;
+}
+
+static int list_model_get_n_columns (GtkTreeModel * model)
+{
+    return ((ListModel *) model)->columns;
+}
+
+static GType list_model_get_column_type (GtkTreeModel * _model, int column)
+{
+    ListModel * model = (ListModel *) _model;
+    g_return_val_if_fail (column >= 0 && column < model->columns, G_TYPE_INVALID);
+
+    if (column == HIGHLIGHT_COLUMN)
+        return PANGO_TYPE_WEIGHT;
+
+    return GPOINTER_TO_INT (g_list_nth_data (model->column_types, column -
+     RESERVED_COLUMNS));
+}
+
+static gboolean list_model_get_iter (GtkTreeModel * model, GtkTreeIter * iter,
+ GtkTreePath * path)
+{
+    int row = gtk_tree_path_get_indices (path)[0];
+    if (row < 0 || row >= ((ListModel *) model)->rows)
+        return false;
+    iter->user_data = GINT_TO_POINTER (row);
+    return true;
+}
+
+static GtkTreePath * list_model_get_path (GtkTreeModel * model,
+ GtkTreeIter * iter)
+{
+    int row = GPOINTER_TO_INT (iter->user_data);
+    g_return_val_if_fail (row >= 0 && row < ((ListModel *) model)->rows, nullptr);
+    return gtk_tree_path_new_from_indices (row, -1);
+}
+
+static void list_model_get_value (GtkTreeModel * _model, GtkTreeIter * iter,
+ int column, GValue * value)
+{
+    ListModel * model = (ListModel *) _model;
+    int row = GPOINTER_TO_INT (iter->user_data);
+    g_return_if_fail (column >= 0 && column < model->columns);
+    g_return_if_fail (row >= 0 && row < model->rows);
+
+    if (column == HIGHLIGHT_COLUMN)
+    {
+        g_value_init (value, PANGO_TYPE_WEIGHT);
+        g_value_set_enum (value, row == model->highlight ? PANGO_WEIGHT_BOLD :
+         PANGO_WEIGHT_NORMAL);
+        return;
+    }
+
+    g_value_init (value, GPOINTER_TO_INT (g_list_nth_data (model->column_types,
+     column - RESERVED_COLUMNS)));
+    model->cbs->get_value (model->user, row, column - RESERVED_COLUMNS, value);
+}
+
+static gboolean list_model_iter_next (GtkTreeModel * _model, GtkTreeIter * iter)
+{
+    ListModel * model = (ListModel *) _model;
+    int row = GPOINTER_TO_INT (iter->user_data);
+    g_return_val_if_fail (row >= 0 && row < model->rows, false);
+    if (row + 1 >= model->rows)
+        return false;
+    iter->user_data = GINT_TO_POINTER (row + 1);
+    return true;
+}
+
+static gboolean list_model_iter_children (GtkTreeModel * model,
+ GtkTreeIter * iter, GtkTreeIter * parent)
+{
+    if (parent || ((ListModel *) model)->rows < 1)
+        return false;
+    iter->user_data = GINT_TO_POINTER (0);
+    return true;
+}
+
+static gboolean list_model_iter_has_child (GtkTreeModel * model,
+ GtkTreeIter * iter)
+{
+    return false;
+}
+
+static int list_model_iter_n_children (GtkTreeModel * model, GtkTreeIter * iter)
+{
+    return iter ? 0 : ((ListModel *) model)->rows;
+}
+
+static gboolean list_model_iter_nth_child (GtkTreeModel * model,
+ GtkTreeIter * iter, GtkTreeIter * parent, int n)
+{
+    if (parent || n < 0 || n >= ((ListModel *) model)->rows)
+        return false;
+    iter->user_data = GINT_TO_POINTER (n);
+    return true;
+}
+
+static gboolean list_model_iter_parent (GtkTreeModel * model,
+ GtkTreeIter * iter, GtkTreeIter * child)
+{
+    return false;
+}
+
+static void iface_init (GtkTreeModelIface * iface)
+{
+    iface->get_flags = list_model_get_flags;
+    iface->get_n_columns = list_model_get_n_columns;
+    iface->get_column_type = list_model_get_column_type;
+    iface->get_iter = list_model_get_iter;
+    iface->get_path = list_model_get_path;
+    iface->get_value = list_model_get_value;
+    iface->iter_next = list_model_iter_next;
+    iface->iter_children = list_model_iter_children;
+    iface->iter_has_child = list_model_iter_has_child;
+    iface->iter_n_children = list_model_iter_n_children;
+    iface->iter_nth_child = list_model_iter_nth_child;
+    iface->iter_parent = list_model_iter_parent;
+}
+
+static const GInterfaceInfo iface_info = {
+    (GInterfaceInitFunc) iface_init
+};
+
+static GType list_model_get_type ()
+{
+    static GType type = G_TYPE_INVALID;
+    if (type == G_TYPE_INVALID)
+    {
+        type = g_type_register_static_simple (G_TYPE_OBJECT, "AudguiListModel",
+         sizeof (GObjectClass), nullptr, sizeof (ListModel), nullptr, (GTypeFlags) 0);
+        g_type_add_interface_static (type, GTK_TYPE_TREE_MODEL, & iface_info);
+    }
+    return type;
+}
+
+/* ==== CALLBACKS ==== */
+
+static gboolean select_allow_cb (GtkTreeSelection * sel, GtkTreeModel * model,
+ GtkTreePath * path, gboolean was, void * user)
+{
+    return ! ((ListModel *) model)->frozen;
+}
+
+static void select_row_cb (GtkTreeModel * _model, GtkTreePath * path,
+ GtkTreeIter * iter, void * user)
+{
+    ListModel * model = (ListModel *) _model;
+    int row = gtk_tree_path_get_indices (path)[0];
+    g_return_if_fail (row >= 0 && row < model->rows);
+    model->cbs->set_selected (model->user, row, true);
+}
+
+static void select_cb (GtkTreeSelection * sel, ListModel * model)
+{
+    if (model->blocked)
+        return;
+    model->cbs->select_all (model->user, false);
+    gtk_tree_selection_selected_foreach (sel, select_row_cb, nullptr);
+}
+
+static void focus_cb (GtkTreeView * tree, ListModel * model)
+{
+    if (! model->blocked)
+        model->cbs->focus_change (model->user,
+         audgui_list_get_focus ((GtkWidget *) tree));
+}
+
+static void activate_cb (GtkTreeView * tree, GtkTreePath * path,
+ GtkTreeViewColumn * col, ListModel * model)
+{
+    int row = gtk_tree_path_get_indices (path)[0];
+    g_return_if_fail (row >= 0 && row < model->rows);
+    model->cbs->activate_row (model->user, row);
+}
+
+static gboolean button_press_cb (GtkWidget * widget, GdkEventButton * event,
+ ListModel * model)
+{
+    GtkTreePath * path = nullptr;
+    gtk_tree_view_get_path_at_pos ((GtkTreeView *) widget, event->x, event->y,
+     & path, nullptr, nullptr, nullptr);
+
+    if (event->type == GDK_BUTTON_PRESS && event->button == 3
+     && MODEL_HAS_CB (model, right_click))
+    {
+        /* Only allow GTK to select this row if it is not already selected.  We
+         * don't want to clear a multiple selection. */
+        if (path)
+        {
+            if (PATH_IS_SELECTED (widget, path))
+                model->frozen = true;
+            gtk_tree_view_set_cursor ((GtkTreeView *) widget, path, nullptr, false);
+            model->frozen = false;
+        }
+
+        model->cbs->right_click (model->user, event);
+
+        if (path)
+            gtk_tree_path_free (path);
+        return true;
+    }
+
+    /* Only allow GTK to select this row if it is not already selected.  If we
+     * are going to be dragging, we don't want to clear a multiple selection.
+     * If this is just a simple click, we will clear the multiple selection in
+     * button_release_cb. */
+    if (event->type == GDK_BUTTON_PRESS && event->button == 1 && ! (event->state
+     & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) && path && PATH_IS_SELECTED (widget,
+     path))
+        model->frozen = true;
+
+    if (path)
+        model->clicked_row = gtk_tree_path_get_indices (path)[0];
+    else
+        model->clicked_row = -1;
+
+    if (path)
+        gtk_tree_path_free (path);
+    return false;
+}
+
+static gboolean button_release_cb (GtkWidget * widget, GdkEventButton * event,
+ ListModel * model)
+{
+    /* If button_press_cb set "frozen", and we were not dragging, we need to
+     * clear a multiple selection. */
+    if (model->frozen && model->clicked_row >= 0 && model->clicked_row <
+     model->rows)
+    {
+        model->frozen = false;
+        GtkTreePath * path = gtk_tree_path_new_from_indices (model->clicked_row, -1);
+        gtk_tree_view_set_cursor ((GtkTreeView *) widget, path, nullptr, false);
+        gtk_tree_path_free (path);
+    }
+
+    return false;
+}
+
+static gboolean key_press_cb (GtkWidget * widget, GdkEventKey * event, ListModel * model)
+{
+    /* GTK thinks the spacebar should activate a row; I (jlindgren) disagree */
+    if (event->keyval == ' ' && ! (event->state & GDK_CONTROL_MASK))
+        return true;
+
+    return false;
+}
+
+static gboolean motion_notify_cb (GtkWidget * widget, GdkEventMotion * event, ListModel * model)
+{
+    if (MODEL_HAS_CB (model, mouse_motion))
+    {
+        int x, y;
+        gtk_tree_view_convert_bin_window_to_widget_coords ((GtkTreeView *)
+         widget, event->x, event->y, & x, & y);
+
+        int row = audgui_list_row_at_point (widget, x, y);
+        model->cbs->mouse_motion (model->user, event, row);
+    }
+
+    return false;
+}
+
+static gboolean leave_notify_cb (GtkWidget * widget, GdkEventMotion * event, ListModel * model)
+{
+    if (MODEL_HAS_CB (model, mouse_leave))
+    {
+        int x, y;
+        gtk_tree_view_convert_bin_window_to_widget_coords ((GtkTreeView *)
+         widget, event->x, event->y, & x, & y);
+
+        int row = audgui_list_row_at_point (widget, x, y);
+        model->cbs->mouse_leave (model->user, event, row);
+    }
+
+    return false;
+}
+
+/* ==== DRAG AND DROP ==== */
+
+static void drag_begin (GtkWidget * widget, GdkDragContext * context,
+ ListModel * model)
+{
+    g_signal_stop_emission_by_name (widget, "drag-begin");
+
+    model->dragging = true;
+}
+
+static void drag_end (GtkWidget * widget, GdkDragContext * context,
+ ListModel * model)
+{
+    g_signal_stop_emission_by_name (widget, "drag-end");
+
+    model->dragging = false;
+    model->clicked_row = -1;
+}
+
+static void drag_data_get (GtkWidget * widget, GdkDragContext * context,
+ GtkSelectionData * sel, unsigned info, unsigned time, ListModel * model)
+{
+    g_signal_stop_emission_by_name (widget, "drag-data-get");
+
+    Index<char> data = model->cbs->get_data (model->user);
+    gtk_selection_data_set (sel, gdk_atom_intern (model->cbs->data_type, false),
+     8, (const unsigned char *) data.begin (), data.len ());
+}
+
+static int calc_drop_row (ListModel * model, GtkWidget * widget, int x, int y)
+{
+    int row = audgui_list_row_at_point_rounded (widget, x, y);
+    if (row < 0)
+        row = model->rows;
+    return row;
+}
+
+static void stop_autoscroll (ListModel * model)
+{
+    if (! model->scroll_source)
+        return;
+
+    g_source_remove (model->scroll_source);
+    model->scroll_source = 0;
+    model->scroll_speed = 0;
+}
+
+static gboolean autoscroll (GtkWidget * widget)
+{
+    ListModel * model = (ListModel *) gtk_tree_view_get_model
+     ((GtkTreeView *) widget);
+
+    GtkAdjustment * adj = gtk_tree_view_get_vadjustment ((GtkTreeView *) widget);
+    if (! adj)
+    {
+        stop_autoscroll (model);
+        return false;
+    }
+
+    int pos = gtk_adjustment_get_value (adj) + model->scroll_speed;
+    int clamped = aud::clamp<int> (pos, 0, gtk_adjustment_get_upper (adj) -
+     gtk_adjustment_get_page_size (adj));
+    gtk_adjustment_set_value (adj, clamped);
+
+    if (clamped != pos) /* reached top or bottom? */
+    {
+        stop_autoscroll (model);
+        return false;
+    }
+
+    if (model->scroll_speed > 0)
+        model->scroll_speed = aud::min (model->scroll_speed + 2, 100);
+    else
+        model->scroll_speed = aud::max (model->scroll_speed - 2, -100);
+
+    return true;
+}
+
+static void start_autoscroll (ListModel * model, GtkWidget * widget, int speed)
+{
+    if (model->scroll_source)
+        return;
+
+    model->scroll_source = g_timeout_add (50, (GSourceFunc) autoscroll, widget);
+    model->scroll_speed = speed;
+}
+
+static gboolean drag_motion (GtkWidget * widget, GdkDragContext * context,
+ int x, int y, unsigned time, ListModel * model)
+{
+    g_signal_stop_emission_by_name (widget, "drag-motion");
+
+    /* If button_press_cb preserved a multiple selection, tell button_release_cb
+     * not to clear it. */
+    model->frozen = false;
+
+    if (model->dragging && MODEL_HAS_CB (model, shift_rows)) /* dragging within same list */
+        gdk_drag_status (context, GDK_ACTION_MOVE, time);
+    else if (MODEL_HAS_CB (model, data_type)) /* cross-widget dragging */
+        gdk_drag_status (context, GDK_ACTION_COPY, time);
+    else
+        return false;
+
+    if (model->rows > 0)
+    {
+        int row = calc_drop_row (model, widget, x, y);
+        if (row == model->rows)
+        {
+            GtkTreePath * path = gtk_tree_path_new_from_indices (row - 1, -1);
+            gtk_tree_view_set_drag_dest_row ((GtkTreeView *) widget, path,
+             GTK_TREE_VIEW_DROP_AFTER);
+            gtk_tree_path_free (path);
+        }
+        else
+        {
+            GtkTreePath * path = gtk_tree_path_new_from_indices (row, -1);
+            gtk_tree_view_set_drag_dest_row ((GtkTreeView *) widget, path,
+             GTK_TREE_VIEW_DROP_BEFORE);
+            gtk_tree_path_free (path);
+        }
+    }
+
+    int height;
+    gdk_window_get_geometry (gtk_tree_view_get_bin_window ((GtkTreeView *)
+     widget), nullptr, nullptr, nullptr, & height, nullptr);
+    gtk_tree_view_convert_widget_to_bin_window_coords ((GtkTreeView *) widget,
+     x, y, & x, & y);
+
+    int hotspot = aud::min (height / 4, 24);
+
+    if (y >= 0 && y < hotspot)
+        start_autoscroll (model, widget, -2);
+    else if (y >= height - hotspot && y < height)
+        start_autoscroll (model, widget, 2);
+    else
+        stop_autoscroll (model);
+
+    return true;
+}
+
+static void drag_leave (GtkWidget * widget, GdkDragContext * context,
+ unsigned time, ListModel * model)
+{
+    g_signal_stop_emission_by_name (widget, "drag-leave");
+
+    gtk_tree_view_set_drag_dest_row ((GtkTreeView *) widget, nullptr, (GtkTreeViewDropPosition) 0);
+    stop_autoscroll (model);
+}
+
+static gboolean drag_drop (GtkWidget * widget, GdkDragContext * context, int x,
+ int y, unsigned time, ListModel * model)
+{
+    g_signal_stop_emission_by_name (widget, "drag-drop");
+
+    gboolean success = true;
+    int row = calc_drop_row (model, widget, x, y);
+
+    if (model->dragging && MODEL_HAS_CB (model, shift_rows)) /* dragging within same list */
+    {
+        if (model->clicked_row >= 0 && model->clicked_row < model->rows)
+            model->cbs->shift_rows (model->user, model->clicked_row, row);
+        else
+            success = false;
+    }
+    else if (MODEL_HAS_CB (model, data_type)) /* cross-widget dragging */
+    {
+        model->receive_row = row;
+        gtk_drag_get_data (widget, context, gdk_atom_intern
+         (model->cbs->data_type, false), time);
+    }
+    else
+        success = false;
+
+    gtk_drag_finish (context, success, false, time);
+    gtk_tree_view_set_drag_dest_row ((GtkTreeView *) widget, nullptr, (GtkTreeViewDropPosition) 0);
+    stop_autoscroll (model);
+    return true;
+}
+
+static void drag_data_received (GtkWidget * widget, GdkDragContext * context, int x,
+ int y, GtkSelectionData * sel, unsigned info, unsigned time, ListModel * model)
+{
+    g_signal_stop_emission_by_name (widget, "drag-data-received");
+
+    g_return_if_fail (model->receive_row >= 0 && model->receive_row <=
+     model->rows);
+
+    auto data = (const char *) gtk_selection_data_get_data (sel);
+    int length = gtk_selection_data_get_length (sel);
+
+    if (data && length)
+        model->cbs->receive_data (model->user, model->receive_row, data, length);
+
+    model->receive_row = -1;
+}
+
+/* ==== PUBLIC FUNCS ==== */
+
+static void destroy_cb (GtkWidget * list, ListModel * model)
+{
+    stop_autoscroll (model);
+    g_list_free (model->column_types);
+    g_object_unref (model);
+}
+
+static void update_selection (GtkWidget * list, ListModel * model, int at,
+ int rows)
+{
+    model->blocked = true;
+    GtkTreeSelection * sel = gtk_tree_view_get_selection ((GtkTreeView *) list);
+
+    for (int i = at; i < at + rows; i ++)
+    {
+        GtkTreeIter iter = {0, GINT_TO_POINTER (i)};
+        if (model->cbs->get_selected (model->user, i))
+            gtk_tree_selection_select_iter (sel, & iter);
+        else
+            gtk_tree_selection_unselect_iter (sel, & iter);
+    }
+
+    model->blocked = false;
+}
+
+EXPORT GtkWidget * audgui_list_new_real (const AudguiListCallbacks * cbs, int cbs_size,
+ void * user, int rows)
+{
+    g_return_val_if_fail (cbs->get_value, nullptr);
+
+    ListModel * model = (ListModel *) g_object_new (list_model_get_type (), nullptr);
+    model->cbs = cbs;
+    model->cbs_size = cbs_size;
+    model->user = user;
+    model->rows = rows;
+    model->highlight = -1;
+    model->columns = RESERVED_COLUMNS;
+    model->column_types = nullptr;
+    model->resizable = true;
+    model->frozen = false;
+    model->blocked = false;
+    model->dragging = false;
+    model->clicked_row = -1;
+    model->receive_row = -1;
+    model->scroll_source = 0;
+    model->scroll_speed = 0;
+
+    GtkWidget * list = gtk_tree_view_new_with_model ((GtkTreeModel *) model);
+    gtk_tree_view_set_fixed_height_mode ((GtkTreeView *) list, true);
+    g_signal_connect (list, "destroy", (GCallback) destroy_cb, model);
+
+    model->charwidth = audgui_get_digit_width (list);
+
+    if (MODEL_HAS_CB (model, get_selected) && MODEL_HAS_CB (model, set_selected)
+     && MODEL_HAS_CB (model, select_all))
+    {
+        GtkTreeSelection * sel = gtk_tree_view_get_selection
+         ((GtkTreeView *) list);
+        gtk_tree_selection_set_mode (sel, GTK_SELECTION_MULTIPLE);
+        gtk_tree_selection_set_select_function (sel, select_allow_cb, nullptr, nullptr);
+        g_signal_connect (sel, "changed", (GCallback) select_cb, model);
+
+        update_selection (list, model, 0, rows);
+    }
+
+    if (MODEL_HAS_CB (model, focus_change))
+        g_signal_connect (list, "cursor-changed", (GCallback) focus_cb, model);
+
+    if (MODEL_HAS_CB (model, activate_row))
+        g_signal_connect (list, "row-activated", (GCallback) activate_cb, model);
+
+    g_signal_connect (list, "button-press-event", (GCallback) button_press_cb, model);
+    g_signal_connect (list, "button-release-event", (GCallback) button_release_cb, model);
+    g_signal_connect (list, "key-press-event", (GCallback) key_press_cb, model);
+    g_signal_connect (list, "motion-notify-event", (GCallback) motion_notify_cb, model);
+    g_signal_connect (list, "leave-notify-event", (GCallback) leave_notify_cb, model);
+
+    gboolean supports_drag = false;
+
+    if (MODEL_HAS_CB (model, data_type) && MODEL_HAS_CB (model, get_data) &&
+     MODEL_HAS_CB (model, receive_data))
+    {
+        const GtkTargetEntry target = {(char *) cbs->data_type, 0, 0};
+
+        gtk_drag_source_set (list, GDK_BUTTON1_MASK, & target, 1,
+         GDK_ACTION_COPY);
+        gtk_drag_dest_set (list, (GtkDestDefaults) 0, & target, 1, GDK_ACTION_COPY);
+
+        g_signal_connect (list, "drag-data-get", (GCallback) drag_data_get, model);
+        g_signal_connect (list, "drag-data-received", (GCallback)
+         drag_data_received, model);
+
+        supports_drag = true;
+    }
+    else if (MODEL_HAS_CB (model, shift_rows))
+    {
+        gtk_drag_source_set (list, GDK_BUTTON1_MASK, nullptr, 0, GDK_ACTION_COPY);
+        gtk_drag_dest_set (list, (GtkDestDefaults) 0, nullptr, 0, GDK_ACTION_COPY);
+        supports_drag = true;
+    }
+
+    if (supports_drag)
+    {
+        g_signal_connect (list, "drag-begin", (GCallback) drag_begin, model);
+        g_signal_connect (list, "drag-end", (GCallback) drag_end, model);
+        g_signal_connect (list, "drag-motion", (GCallback) drag_motion, model);
+        g_signal_connect (list, "drag-leave", (GCallback) drag_leave, model);
+        g_signal_connect (list, "drag-drop", (GCallback) drag_drop, model);
+    }
+
+    return list;
+}
+
+EXPORT void * audgui_list_get_user (GtkWidget * list)
+{
+    ListModel * model = (ListModel *) gtk_tree_view_get_model
+     ((GtkTreeView *) list);
+    return model->user;
+}
+
+EXPORT void audgui_list_add_column (GtkWidget * list, const char * title,
+ int column, GType type, int width)
+{
+    ListModel * model = (ListModel *) gtk_tree_view_get_model
+     ((GtkTreeView *) list);
+    g_return_if_fail (RESERVED_COLUMNS + column == model->columns);
+
+    model->columns ++;
+    model->column_types = g_list_append (model->column_types, GINT_TO_POINTER
+     (type));
+
+    GtkCellRenderer * renderer = gtk_cell_renderer_text_new ();
+    GtkTreeViewColumn * tree_column = gtk_tree_view_column_new_with_attributes
+     (title, renderer, "text", RESERVED_COLUMNS + column, "weight",
+     HIGHLIGHT_COLUMN, nullptr);
+    gtk_tree_view_column_set_sizing (tree_column, GTK_TREE_VIEW_COLUMN_FIXED);
+
+    int pad1, pad2, pad3;
+    gtk_widget_style_get (list, "horizontal-separator", & pad1, "focus-line-width", & pad2, nullptr);
+    gtk_cell_renderer_get_padding (renderer, & pad3, nullptr);
+    int padding = pad1 + 2 * pad2 + 2 * pad3;
+
+    if (width < 0)
+    {
+        gtk_tree_view_column_set_expand (tree_column, true);
+        model->resizable = false;  // columns to the right will not be resizable
+    }
+    else
+    {
+        gtk_tree_view_column_set_resizable (tree_column, model->resizable);
+        gtk_tree_view_column_set_min_width (tree_column,
+         width * model->charwidth + model->charwidth / 2 + padding);
+    }
+
+    if (width >= 0 && width < 10)
+        g_object_set ((GObject *) renderer, "xalign", (float) 1, nullptr);
+    else
+        g_object_set ((GObject *) renderer, "ellipsize-set", true, "ellipsize",
+         PANGO_ELLIPSIZE_END, nullptr);
+
+    gtk_tree_view_append_column ((GtkTreeView *) list, tree_column);
+}
+
+EXPORT int audgui_list_row_count (GtkWidget * list)
+{
+    return ((ListModel *) gtk_tree_view_get_model ((GtkTreeView *) list))->rows;
+}
+
+EXPORT void audgui_list_insert_rows (GtkWidget * list, int at, int rows)
+{
+    ListModel * model = (ListModel *) gtk_tree_view_get_model
+     ((GtkTreeView *) list);
+    g_return_if_fail (at >= 0 && at <= model->rows && rows >= 0);
+
+    model->rows += rows;
+    if (model->highlight >= at)
+        model->highlight += rows;
+
+    GtkTreeIter iter = {0, GINT_TO_POINTER (at)};
+    GtkTreePath * path = gtk_tree_path_new_from_indices (at, -1);
+
+    for (int i = rows; i --; )
+        gtk_tree_model_row_inserted ((GtkTreeModel *) model, path, & iter);
+
+    gtk_tree_path_free (path);
+
+    if (model->cbs->get_selected)
+        update_selection (list, model, at, rows);
+}
+
+EXPORT void audgui_list_update_rows (GtkWidget * list, int at, int rows)
+{
+    ListModel * model = (ListModel *) gtk_tree_view_get_model
+     ((GtkTreeView *) list);
+    g_return_if_fail (at >= 0 && rows >= 0 && at + rows <= model->rows);
+
+    GtkTreeIter iter = {0, GINT_TO_POINTER (at)};
+    GtkTreePath * path = gtk_tree_path_new_from_indices (at, -1);
+
+    while (rows --)
+    {
+        gtk_tree_model_row_changed ((GtkTreeModel *) model, path, & iter);
+        iter.user_data = GINT_TO_POINTER (GPOINTER_TO_INT (iter.user_data) + 1);
+        gtk_tree_path_next (path);
+    }
+
+    gtk_tree_path_free (path);
+}
+
+EXPORT void audgui_list_delete_rows (GtkWidget * list, int at, int rows)
+{
+    ListModel * model = (ListModel *) gtk_tree_view_get_model
+     ((GtkTreeView *) list);
+    g_return_if_fail (at >= 0 && rows >= 0 && at + rows <= model->rows);
+
+    model->rows -= rows;
+    if (model->highlight >= at + rows)
+        model->highlight -= rows;
+    else if (model->highlight >= at)
+        model->highlight = -1;
+
+    model->frozen = true;
+    model->blocked = true;
+
+    int focus = audgui_list_get_focus (list);
+
+    // first delete rows after cursor so it does not get moved to one of them
+    if (focus >= at && focus + 1 < at + rows)
+    {
+        GtkTreePath * path = gtk_tree_path_new_from_indices (focus + 1, -1);
+
+        while (focus + 1 < at + rows)
+        {
+            gtk_tree_model_row_deleted ((GtkTreeModel *) model, path);
+            rows --;
+        }
+
+        gtk_tree_path_free (path);
+    }
+
+    // now delete rows preceding cursor and finally cursor row itself
+    GtkTreePath * path = gtk_tree_path_new_from_indices (at, -1);
+
+    while (rows --)
+        gtk_tree_model_row_deleted ((GtkTreeModel *) model, path);
+
+    gtk_tree_path_free (path);
+
+    model->frozen = false;
+    model->blocked = false;
+}
+
+EXPORT void audgui_list_update_selection (GtkWidget * list, int at, int rows)
+{
+    ListModel * model = (ListModel *) gtk_tree_view_get_model
+     ((GtkTreeView *) list);
+    g_return_if_fail (model->cbs->get_selected);
+    g_return_if_fail (at >= 0 && rows >= 0 && at + rows <= model->rows);
+    update_selection (list, model, at, rows);
+}
+
+EXPORT int audgui_list_get_highlight (GtkWidget * list)
+{
+    ListModel * model = (ListModel *) gtk_tree_view_get_model
+     ((GtkTreeView *) list);
+    return model->highlight;
+}
+
+EXPORT void audgui_list_set_highlight (GtkWidget * list, int row)
+{
+    ListModel * model = (ListModel *) gtk_tree_view_get_model
+     ((GtkTreeView *) list);
+    g_return_if_fail (row >= -1 && row < model->rows);
+
+    int old = model->highlight;
+    if (row == old)
+        return;
+    model->highlight = row;
+
+    if (old >= 0)
+        audgui_list_update_rows (list, old, 1);
+    if (row >= 0)
+        audgui_list_update_rows (list, row, 1);
+}
+
+EXPORT int audgui_list_get_focus (GtkWidget * list)
+{
+    GtkTreePath * path = nullptr;
+    gtk_tree_view_get_cursor ((GtkTreeView *) list, & path, nullptr);
+
+    if (! path)
+        return -1;
+
+    int row = gtk_tree_path_get_indices (path)[0];
+
+    gtk_tree_path_free (path);
+    return row;
+}
+
+EXPORT void audgui_list_set_focus (GtkWidget * list, int row)
+{
+    ListModel * model = (ListModel *) gtk_tree_view_get_model
+     ((GtkTreeView *) list);
+    g_return_if_fail (row >= -1 && row < model->rows);
+
+    if (row < 0 || row == audgui_list_get_focus (list))
+        return;
+
+    model->frozen = true;
+    model->blocked = true;
+
+    GtkTreePath * path = gtk_tree_path_new_from_indices (row, -1);
+    gtk_tree_view_set_cursor ((GtkTreeView *) list, path, nullptr, false);
+    gtk_tree_view_scroll_to_cell ((GtkTreeView *) list, path, nullptr, false, 0, 0);
+    gtk_tree_path_free (path);
+
+    model->frozen = false;
+    model->blocked = false;
+}
+
+EXPORT int audgui_list_row_at_point (GtkWidget * list, int x, int y)
+{
+    ListModel * model = (ListModel *) gtk_tree_view_get_model ((GtkTreeView *) list);
+
+    GtkTreePath * path = nullptr;
+    gtk_tree_view_convert_widget_to_bin_window_coords ((GtkTreeView *) list, x, y, & x, & y);
+    gtk_tree_view_get_path_at_pos ((GtkTreeView *) list, x, y, & path, nullptr, nullptr, nullptr);
+
+    if (! path)
+        return -1;
+
+    int row = gtk_tree_path_get_indices (path)[0];
+    g_return_val_if_fail (row >= 0 && row < model->rows, -1);
+
+    gtk_tree_path_free (path);
+    return row;
+}
+
+EXPORT int audgui_list_row_at_point_rounded (GtkWidget * list, int x, int y)
+{
+    ListModel * model = (ListModel *) gtk_tree_view_get_model ((GtkTreeView *) list);
+
+    GtkTreePath * path = nullptr;
+    gtk_tree_view_convert_widget_to_bin_window_coords ((GtkTreeView *) list, x, y, & x, & y);
+    gtk_tree_view_get_path_at_pos ((GtkTreeView *) list, x, y, & path, nullptr, nullptr, nullptr);
+
+    if (! path)
+        return -1;
+
+    int row = gtk_tree_path_get_indices (path)[0];
+    g_return_val_if_fail (row >= 0 && row < model->rows, -1);
+
+    GdkRectangle rect;
+    gtk_tree_view_get_background_area ((GtkTreeView *) list, path, nullptr, & rect);
+    if (y > rect.y + rect.height / 2)
+        row ++;
+
+    gtk_tree_path_free (path);
+    return row;
+}
diff --git a/src/libaudgui/list.h b/src/libaudgui/list.h
index 56d2d82ee450..df9d52d6541f 100644
--- a/src/libaudgui/list.h
+++ b/src/libaudgui/list.h
@@ -20,37 +20,39 @@
 #ifndef AUDGUI_LIST_H
 #define AUDGUI_LIST_H
 
+/* okay to use without audgui_init() */
+
 #include <gtk/gtk.h>
-#include <libaudcore/core.h>
+
+#include <libaudcore/index.h>
 
 /* New callbacks should be added to the end of this struct.  The
  * audgui_list_new() macro tells us the size of the callback struct as it was
  * defined when the caller code was compiled, allowing us to expand the struct
  * without breaking backward compatibility. */
 
-typedef struct {
+struct AudguiListCallbacks {
     void (* get_value) (void * user, int row, int column, GValue * value);
 
     /* selection (optional) */
-    bool_t (* get_selected) (void * user, int row);
-    void (* set_selected) (void * user, int row, bool_t selected);
-    void (* select_all) (void * user, bool_t selected);
+    bool (* get_selected) (void * user, int row);
+    void (* set_selected) (void * user, int row, bool selected);
+    void (* select_all) (void * user, bool selected);
 
     void (* activate_row) (void * user, int row); /* optional */
     void (* right_click) (void * user, GdkEventButton * event); /* optional */
     void (* shift_rows) (void * user, int row, int before); /* optional */
 
     /* cross-widget drag and drop (optional) */
-    /* the list will handle free()ing data returned by get_data() */
     const char * data_type;
-    void (* get_data) (void * user, void * * data, int * length);
-    void (* receive_data) (void * user, int row, const void * data, int length);
+    Index<char> (* get_data) (void * user);
+    void (* receive_data) (void * user, int row, const char * data, int len);
 
     void (* mouse_motion) (void * user, GdkEventMotion * event, int row); /* optional */
     void (* mouse_leave) (void * user, GdkEventMotion * event, int row); /* optional */
 
     void (* focus_change) (void * user, int row); /* optional */
-} AudguiListCallbacks;
+};
 
 GtkWidget * audgui_list_new_real (const AudguiListCallbacks * cbs, int cbs_size,
  void * user, int rows);
diff --git a/src/libaudgui/menu.c b/src/libaudgui/menu.c
deleted file mode 100644
index 6fe882f6ed36..000000000000
--- a/src/libaudgui/menu.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * menu.c
- * Copyright 2011-2014 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include "menu.h"
-
-#include <audacious/i18n.h>
-#include <audacious/misc.h>
-#include <libaudcore/hook.h>
-
-/* we still use GtkImageMenuItem until there is a good alternative */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
-static GtkWidget * image_menu_item_new (const char * text, const char * icon)
-{
-    GtkWidget * widget = gtk_image_menu_item_new_with_mnemonic (text);
-
-    if (icon)
-    {
-        GtkWidget * image = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_MENU);
-        gtk_image_menu_item_set_image ((GtkImageMenuItem *) widget, image);
-    }
-
-    return widget;
-}
-
-#pragma GCC diagnostic pop
-
-static void toggled_cb (GtkCheckMenuItem * check, const AudguiMenuItem * item)
-{
-    bool_t on = gtk_check_menu_item_get_active (check);
-
-    if (aud_get_bool (item->csect, item->cname) == on)
-        return;
-
-    aud_set_bool (item->csect, item->cname, on);
-
-    if (item->func)
-        item->func ();
-}
-
-static void hook_cb (void * data, GtkWidget * check)
-{
-    const AudguiMenuItem * item = g_object_get_data ((GObject *) check, "item");
-    gtk_check_menu_item_set_active ((GtkCheckMenuItem *) check, aud_get_bool
-     (item->csect, item->cname));
-}
-
-static void unhook_cb (GtkCheckMenuItem * check, const AudguiMenuItem * item)
-{
-    hook_dissociate_full (item->hook, (HookFunction) hook_cb, check);
-}
-
-EXPORT GtkWidget * audgui_menu_item_new_with_domain
- (const AudguiMenuItem * item, GtkAccelGroup * accel, const char * domain)
-{
-    const char * name = domain ? dgettext (domain, item->name) : item->name;
-    GtkWidget * widget = NULL;
-
-    if (name && item->func && ! item->cname) /* normal widget */
-    {
-        widget = image_menu_item_new (name, item->icon);
-        g_signal_connect (widget, "activate", item->func, NULL);
-    }
-    else if (name && item->cname) /* toggle widget */
-    {
-        widget = gtk_check_menu_item_new_with_mnemonic (name);
-        gtk_check_menu_item_set_active ((GtkCheckMenuItem *) widget,
-         aud_get_bool (item->csect, item->cname));
-        g_signal_connect (widget, "toggled", (GCallback) toggled_cb, (void *) item);
-
-        if (item->hook)
-        {
-            g_object_set_data ((GObject *) widget, "item", (void *) item);
-            hook_associate (item->hook, (HookFunction) hook_cb, widget);
-            g_signal_connect (widget, "destroy", (GCallback) unhook_cb, (void *) item);
-        }
-    }
-    else if (name && (item->items || item->get_sub)) /* submenu */
-    {
-        widget = image_menu_item_new (name, item->icon);
-
-        GtkWidget * sub;
-
-        if (item->get_sub)
-            sub = item->get_sub ();
-        else
-        {
-            sub = gtk_menu_new ();
-            audgui_menu_init_with_domain (sub, item->items, item->n_items, accel, domain);
-        }
-
-        gtk_menu_item_set_submenu ((GtkMenuItem *) widget, sub);
-    }
-    else if (item->sep) /* separator */
-        widget = gtk_separator_menu_item_new ();
-
-    if (widget && accel && item->key)
-        gtk_widget_add_accelerator (widget, "activate", accel, item->key,
-         item->mod, GTK_ACCEL_VISIBLE);
-
-    return widget;
-}
-
-EXPORT void audgui_menu_init_with_domain (GtkWidget * shell,
- const AudguiMenuItem * items, int n_items, GtkAccelGroup * accel,
- const char * domain)
-{
-    for (int i = 0; i < n_items; i ++)
-    {
-        GtkWidget * widget = audgui_menu_item_new_with_domain (& items[i], accel, domain);
-        if (! widget)
-            continue;
-
-        gtk_widget_show (widget);
-        gtk_menu_shell_append ((GtkMenuShell *) shell, widget);
-    }
-}
diff --git a/src/libaudgui/menu.cc b/src/libaudgui/menu.cc
new file mode 100644
index 000000000000..3069d8bf3d52
--- /dev/null
+++ b/src/libaudgui/menu.cc
@@ -0,0 +1,129 @@
+/*
+ * menu.c
+ * Copyright 2011-2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "menu.h"
+
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/runtime.h>
+
+static GtkWidget * image_menu_item_new (const char * text, const char * icon)
+{
+    GtkWidget * widget = gtk_image_menu_item_new_with_mnemonic (text);
+
+    if (icon)
+    {
+        GtkWidget * image = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_MENU);
+        gtk_image_menu_item_set_image ((GtkImageMenuItem *) widget, image);
+    }
+
+    return widget;
+}
+
+static void toggled_cb (GtkCheckMenuItem * check, const AudguiMenuItem * item)
+{
+    gboolean on = gtk_check_menu_item_get_active (check);
+
+    if (aud_get_bool (item->csect, item->cname) == on)
+        return;
+
+    aud_set_bool (item->csect, item->cname, on);
+
+    if (item->func)
+        item->func ();
+}
+
+static void hook_cb (void * data, GtkWidget * check)
+{
+    const AudguiMenuItem * item = (const AudguiMenuItem *) g_object_get_data
+     ((GObject *) check, "item");
+    gtk_check_menu_item_set_active ((GtkCheckMenuItem *) check, aud_get_bool
+     (item->csect, item->cname));
+}
+
+static void unhook_cb (GtkCheckMenuItem * check, const AudguiMenuItem * item)
+{
+    hook_dissociate (item->hook, (HookFunction) hook_cb, check);
+}
+
+EXPORT GtkWidget * audgui_menu_item_new_with_domain
+ (const AudguiMenuItem * item, GtkAccelGroup * accel, const char * domain)
+{
+    const char * name = domain ? dgettext (domain, item->name) : item->name;
+    GtkWidget * widget = nullptr;
+
+    if (name && item->func && ! item->cname) /* normal widget */
+    {
+        widget = image_menu_item_new (name, item->icon);
+        g_signal_connect (widget, "activate", item->func, nullptr);
+    }
+    else if (name && item->cname) /* toggle widget */
+    {
+        widget = gtk_check_menu_item_new_with_mnemonic (name);
+        gtk_check_menu_item_set_active ((GtkCheckMenuItem *) widget,
+         aud_get_bool (item->csect, item->cname));
+        g_signal_connect (widget, "toggled", (GCallback) toggled_cb, (void *) item);
+
+        if (item->hook)
+        {
+            g_object_set_data ((GObject *) widget, "item", (void *) item);
+            hook_associate (item->hook, (HookFunction) hook_cb, widget);
+            g_signal_connect (widget, "destroy", (GCallback) unhook_cb, (void *) item);
+        }
+    }
+    else if (name && (item->items.len || item->get_sub)) /* submenu */
+    {
+        widget = image_menu_item_new (name, item->icon);
+
+        GtkWidget * sub;
+
+        if (item->get_sub)
+            sub = item->get_sub ();
+        else
+        {
+            sub = gtk_menu_new ();
+            audgui_menu_init_with_domain (sub, item->items, accel, domain);
+        }
+
+        gtk_menu_item_set_submenu ((GtkMenuItem *) widget, sub);
+    }
+    else if (item->sep) /* separator */
+        widget = gtk_separator_menu_item_new ();
+
+    if (widget && accel && item->key)
+        gtk_widget_add_accelerator (widget, "activate", accel, item->key,
+         item->mod, GTK_ACCEL_VISIBLE);
+
+    return widget;
+}
+
+EXPORT void audgui_menu_init_with_domain (GtkWidget * shell,
+ ArrayRef<AudguiMenuItem> items, GtkAccelGroup * accel,
+ const char * domain)
+{
+    for (const AudguiMenuItem & item : items)
+    {
+        GtkWidget * widget = audgui_menu_item_new_with_domain (& item, accel, domain);
+        if (! widget)
+            continue;
+
+        gtk_widget_show (widget);
+        gtk_menu_shell_append ((GtkMenuShell *) shell, widget);
+    }
+}
diff --git a/src/libaudgui/menu.h b/src/libaudgui/menu.h
index fc27ae53fbf0..d6a0cd32dfe1 100644
--- a/src/libaudgui/menu.h
+++ b/src/libaudgui/menu.h
@@ -20,10 +20,12 @@
 #ifndef AUDGUI_MENU_H
 #define AUDGUI_MENU_H
 
+/* okay to use without audgui_init() */
+
 #include <gtk/gtk.h>
-#include <libaudcore/core.h>
+#include <libaudcore/objects.h>
 
-typedef struct _AudguiMenuItem {
+struct AudguiMenuItem {
     const char * name;
     const char * icon;
     unsigned key;
@@ -38,25 +40,44 @@ typedef struct _AudguiMenuItem {
     const char * hook;
 
     /* for submenus */
-    const struct _AudguiMenuItem * items;
-    int n_items;
+    ArrayRef<AudguiMenuItem> items;
 
     /* for custom submenus */
     GtkWidget * (* get_sub) (void);
 
     /* for separators */
-    bool_t sep;
-} AudguiMenuItem;
+    bool sep;
+};
+
+constexpr AudguiMenuItem MenuCommand (const char * name, const char * icon,
+ unsigned key, GdkModifierType mod, void (* func) (void))
+    { return {name, icon, key, mod, func}; }
+
+constexpr AudguiMenuItem MenuToggle (const char * name, const char * icon,
+ unsigned key, GdkModifierType mod, const char * csect, const char * cname,
+ void (* func) (void) = 0, const char * hook = 0)
+    { return {name, icon, key, mod, func, csect, cname, hook}; }
+
+constexpr AudguiMenuItem MenuSub (const char * name, const char * icon,
+ ArrayRef<AudguiMenuItem> items)
+    { return {name, icon, 0, (GdkModifierType) 0, 0, 0, 0, 0, items}; }
+
+constexpr AudguiMenuItem MenuSub (const char * name, const char * icon,
+ GtkWidget * (* get_sub) (void))
+    { return {name, icon, 0, (GdkModifierType) 0, 0, 0, 0, 0, 0, get_sub}; }
+
+constexpr AudguiMenuItem MenuSep ()
+    { return {0, 0, 0, (GdkModifierType) 0, 0, 0, 0, 0, 0, 0, true}; }
 
-/* use NULL for domain to skip translation */
+/* use nullptr for domain to skip translation */
 GtkWidget * audgui_menu_item_new_with_domain (const AudguiMenuItem * item,
  GtkAccelGroup * accel, const char * domain);
 
 void audgui_menu_init_with_domain (GtkWidget * shell,
- const AudguiMenuItem * items, int n_items, GtkAccelGroup * accel,
+ ArrayRef<AudguiMenuItem> items, GtkAccelGroup * accel,
  const char * domain);
 
 #define audgui_menu_item_new(i, a) audgui_menu_item_new_with_domain (i, a, PACKAGE)
-#define audgui_menu_init(s, i, n, a) audgui_menu_init_with_domain (s, i, n, a, PACKAGE)
+#define audgui_menu_init(s, i, a) audgui_menu_init_with_domain (s, i, a, PACKAGE)
 
 #endif /* AUDGUI_MENU_H */
diff --git a/src/libaudgui/pixbufs.c b/src/libaudgui/pixbufs.c
deleted file mode 100644
index 550dce07fdba..000000000000
--- a/src/libaudgui/pixbufs.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * pixbufs.c
- * Copyright 2010-2012 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include <audacious/debug.h>
-#include <audacious/misc.h>
-#include <audacious/playlist.h>
-#include <libaudcore/audstrings.h>
-
-#include "libaudgui-gtk.h"
-
-static GdkPixbuf * current_pixbuf;
-
-EXPORT GdkPixbuf * audgui_pixbuf_fallback (void)
-{
-    static GdkPixbuf * fallback = NULL;
-
-    if (! fallback)
-    {
-        const char * data_dir = aud_get_path (AUD_PATH_DATA_DIR);
-        SCONCAT2 (path, data_dir, "/images/album.png");
-        fallback = gdk_pixbuf_new_from_file (path, NULL);
-    }
-
-    if (fallback)
-        g_object_ref ((GObject *) fallback);
-
-    return fallback;
-}
-
-void audgui_pixbuf_uncache (void)
-{
-    if (current_pixbuf)
-    {
-        g_object_unref ((GObject *) current_pixbuf);
-        current_pixbuf = NULL;
-    }
-}
-
-EXPORT void audgui_pixbuf_scale_within (GdkPixbuf * * pixbuf, int size)
-{
-    int width = gdk_pixbuf_get_width (* pixbuf);
-    int height = gdk_pixbuf_get_height (* pixbuf);
-
-    if (width <= size && height <= size)
-        return;
-
-    if (width > height)
-    {
-        height = size * height / width;
-        width = size;
-    }
-    else
-    {
-        width = size * width / height;
-        height = size;
-    }
-
-    if (width < 1)
-        width = 1;
-    if (height < 1)
-        height = 1;
-
-    GdkPixbuf * pixbuf2 = gdk_pixbuf_scale_simple (* pixbuf, width, height, GDK_INTERP_BILINEAR);
-    g_object_unref (* pixbuf);
-    * pixbuf = pixbuf2;
-}
-
-EXPORT GdkPixbuf * audgui_pixbuf_request (const char * filename)
-{
-    const void * data;
-    int64_t size;
-
-    aud_art_request_data (filename, & data, & size);
-    if (! data)
-        return NULL;
-
-    GdkPixbuf * p = audgui_pixbuf_from_data (data, size);
-
-    aud_art_unref (filename);
-    return p;
-}
-
-EXPORT GdkPixbuf * audgui_pixbuf_request_current (void)
-{
-    if (! current_pixbuf)
-    {
-        int list = aud_playlist_get_playing ();
-        int entry = aud_playlist_get_position (list);
-        if (entry < 0)
-            return NULL;
-
-        char * filename = aud_playlist_entry_get_filename (list, entry);
-        current_pixbuf = audgui_pixbuf_request (filename);
-        str_unref (filename);
-    }
-
-    if (current_pixbuf)
-        g_object_ref ((GObject *) current_pixbuf);
-
-    return current_pixbuf;
-}
-
-EXPORT GdkPixbuf * audgui_pixbuf_from_data (const void * data, int64_t size)
-{
-    GdkPixbuf * pixbuf = NULL;
-    GdkPixbufLoader * loader = gdk_pixbuf_loader_new ();
-    GError * error = NULL;
-
-    if (gdk_pixbuf_loader_write (loader, data, size, & error) &&
-     gdk_pixbuf_loader_close (loader, & error))
-    {
-        if ((pixbuf = gdk_pixbuf_loader_get_pixbuf (loader)))
-            g_object_ref (pixbuf);
-    }
-    else
-    {
-        AUDDBG ("error while loading pixbuf: %s\n", error->message);
-        g_error_free (error);
-    }
-
-    g_object_unref (loader);
-    return pixbuf;
-}
diff --git a/src/libaudgui/pixbufs.cc b/src/libaudgui/pixbufs.cc
new file mode 100644
index 000000000000..498ed852adc4
--- /dev/null
+++ b/src/libaudgui/pixbufs.cc
@@ -0,0 +1,138 @@
+/*
+ * pixbufs.c
+ * Copyright 2010-2012 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/probe.h>
+#include <libaudcore/runtime.h>
+
+#include "internal.h"
+#include "libaudgui-gtk.h"
+
+static GdkPixbuf * current_pixbuf;
+
+EXPORT GdkPixbuf * audgui_pixbuf_fallback ()
+{
+    static GdkPixbuf * fallback = nullptr;
+
+    if (! fallback)
+        fallback = gdk_pixbuf_new_from_file (filename_build
+         ({aud_get_path (AudPath::DataDir), "images", "album.png"}), nullptr);
+
+    if (fallback)
+        g_object_ref ((GObject *) fallback);
+
+    return fallback;
+}
+
+void audgui_pixbuf_uncache ()
+{
+    if (current_pixbuf)
+    {
+        g_object_unref ((GObject *) current_pixbuf);
+        current_pixbuf = nullptr;
+    }
+}
+
+EXPORT void audgui_pixbuf_scale_within (GdkPixbuf * * pixbuf, int size)
+{
+    int width = gdk_pixbuf_get_width (* pixbuf);
+    int height = gdk_pixbuf_get_height (* pixbuf);
+
+    if (width <= size && height <= size)
+        return;
+
+    if (width > height)
+    {
+        height = size * height / width;
+        width = size;
+    }
+    else
+    {
+        width = size * width / height;
+        height = size;
+    }
+
+    if (width < 1)
+        width = 1;
+    if (height < 1)
+        height = 1;
+
+    GdkPixbuf * pixbuf2 = gdk_pixbuf_scale_simple (* pixbuf, width, height, GDK_INTERP_BILINEAR);
+    g_object_unref (* pixbuf);
+    * pixbuf = pixbuf2;
+}
+
+EXPORT GdkPixbuf * audgui_pixbuf_request (const char * filename, bool * queued)
+{
+    const Index<char> * data = aud_art_request_data (filename, queued);
+    if (! data)
+        return nullptr;
+
+    GdkPixbuf * p = audgui_pixbuf_from_data (data->begin (), data->len ());
+
+    aud_art_unref (filename);
+    return p;
+}
+
+EXPORT GdkPixbuf * audgui_pixbuf_request_current (bool * queued)
+{
+    if (queued)
+        * queued = false;
+
+    if (! current_pixbuf)
+    {
+        int list = aud_playlist_get_playing ();
+        int entry = aud_playlist_get_position (list);
+        if (entry < 0)
+            return nullptr;
+
+        String filename = aud_playlist_entry_get_filename (list, entry);
+        current_pixbuf = audgui_pixbuf_request (filename, queued);
+    }
+
+    if (current_pixbuf)
+        g_object_ref ((GObject *) current_pixbuf);
+
+    return current_pixbuf;
+}
+
+EXPORT GdkPixbuf * audgui_pixbuf_from_data (const void * data, int64_t size)
+{
+    GdkPixbuf * pixbuf = nullptr;
+    GdkPixbufLoader * loader = gdk_pixbuf_loader_new ();
+    GError * error = nullptr;
+
+    if (gdk_pixbuf_loader_write (loader, (const unsigned char *) data, size,
+     & error) && gdk_pixbuf_loader_close (loader, & error))
+    {
+        if ((pixbuf = gdk_pixbuf_loader_get_pixbuf (loader)))
+            g_object_ref (pixbuf);
+    }
+    else
+    {
+        AUDWARN ("While loading pixbuf: %s\n", error->message);
+        g_error_free (error);
+    }
+
+    g_object_unref (loader);
+    return pixbuf;
+}
diff --git a/src/libaudgui/playlists.c b/src/libaudgui/playlists.c
deleted file mode 100644
index fa3fa05087bc..000000000000
--- a/src/libaudgui/playlists.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * playlists.c
- * Copyright 2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gtk/gtk.h>
-
-#include <audacious/i18n.h>
-#include <audacious/misc.h>
-#include <audacious/playlist.h>
-#include <libaudcore/audstrings.h>
-#include <libaudcore/vfs.h>
-
-#include "init.h"
-#include "libaudgui.h"
-#include "libaudgui-gtk.h"
-
-typedef struct
-{
-    bool_t save;
-    int list_id;
-    char * filename;
-    GtkWidget * selector, * confirm;
-}
-ImportExportJob;
-
-/* "destroy" callback; do not call directly */
-static void cleanup_job (void * data)
-{
-    ImportExportJob * job = data;
-
-    char * folder = gtk_file_chooser_get_current_folder_uri ((GtkFileChooser *) job->selector);
-
-    if (folder)
-        aud_set_str ("audgui", "playlist_path", folder);
-
-    g_free (folder);
-
-    if (job->confirm)
-        gtk_widget_destroy (job->confirm);
-
-    g_free (job->filename);
-    g_slice_free (ImportExportJob, job);
-}
-
-static void finish_job (void * data)
-{
-    ImportExportJob * job = data;
-    int list = aud_playlist_by_unique_id (job->list_id);
-
-    if (list >= 0)
-    {
-        aud_playlist_set_filename (list, job->filename);
-
-        if (job->save)
-            aud_playlist_save (list, job->filename);
-        else
-        {
-            aud_playlist_entry_delete (list, 0, aud_playlist_entry_count (list));
-            aud_playlist_entry_insert (list, 0, job->filename, NULL, FALSE);
-        }
-    }
-
-    gtk_widget_destroy (job->selector);
-}
-
-static void confirm_overwrite (ImportExportJob * job)
-{
-    if (job->confirm)
-        gtk_widget_destroy (job->confirm);
-
-    SPRINTF (message, _("Overwrite %s?"), job->filename);
-
-    GtkWidget * button1 = audgui_button_new (_("_Overwrite"), "document-save", finish_job, job);
-    GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop", NULL, NULL);
-
-    job->confirm = audgui_dialog_new (GTK_MESSAGE_QUESTION,
-     _("Confirm Overwrite"), message, button1, button2);
-
-    g_signal_connect (job->confirm, "destroy", (GCallback) gtk_widget_destroyed, & job->confirm);
-
-    gtk_widget_show_all (job->confirm);
-}
-
-static void check_overwrite (void * data)
-{
-    ImportExportJob * job = data;
-
-    job->filename = gtk_file_chooser_get_uri ((GtkFileChooser *) job->selector);
-
-    if (! job->filename)
-        return;
-
-    if (job->save && vfs_file_test (job->filename, G_FILE_TEST_EXISTS))
-        confirm_overwrite (job);
-    else
-        finish_job (data);
-}
-
-static void create_selector (ImportExportJob * job, const char * filename, const char * folder)
-{
-    const char * title, * verb, * icon;
-    GtkFileChooserAction action;
-
-    if (job->save)
-    {
-        title = _("Export Playlist");
-        verb = _("_Export");
-        icon = "document-save";
-        action = GTK_FILE_CHOOSER_ACTION_SAVE;
-    }
-    else
-    {
-        title = _("Import Playlist");
-        verb = _("_Import");
-        icon = "document-open";
-        action = GTK_FILE_CHOOSER_ACTION_OPEN;
-    }
-
-    job->selector = gtk_file_chooser_dialog_new (title, NULL, action, NULL, NULL);
-
-    if (filename)
-        gtk_file_chooser_set_uri ((GtkFileChooser *) job->selector, filename);
-    else if (folder)
-        gtk_file_chooser_set_current_folder_uri ((GtkFileChooser *) job->selector, folder);
-
-    GtkWidget * button1 = audgui_button_new (verb, icon, check_overwrite, job);
-    GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop",
-     (AudguiCallback) gtk_widget_destroy, job->selector);
-
-    gtk_dialog_add_action_widget ((GtkDialog *) job->selector, button2, GTK_RESPONSE_NONE);
-    gtk_dialog_add_action_widget ((GtkDialog *) job->selector, button1, GTK_RESPONSE_NONE);
-
-    gtk_widget_set_can_default (button1, TRUE);
-    gtk_widget_grab_default (button1);
-
-    g_signal_connect_swapped (job->selector, "destroy", (GCallback) cleanup_job, job);
-
-    gtk_widget_show_all (job->selector);
-}
-
-static GtkWidget * start_job (bool_t save)
-{
-    int list = aud_playlist_get_active ();
-
-    char * filename = aud_playlist_get_filename (list);
-    char * folder = aud_get_str ("audgui", "playlist_path");
-
-    ImportExportJob * job = g_slice_new0 (ImportExportJob);
-
-    job->save = save;
-    job->list_id = aud_playlist_get_unique_id (list);
-
-    create_selector (job, filename, folder[0] ? folder : NULL);
-
-    str_unref (filename);
-    str_unref (folder);
-
-    return job->selector;
-}
-
-EXPORT void audgui_import_playlist (void)
-{
-    audgui_show_unique_window (AUDGUI_PLAYLIST_IMPORT_WINDOW, start_job (FALSE));
-}
-
-EXPORT void audgui_export_playlist (void)
-{
-    audgui_show_unique_window (AUDGUI_PLAYLIST_EXPORT_WINDOW, start_job (TRUE));
-}
diff --git a/src/libaudgui/playlists.cc b/src/libaudgui/playlists.cc
new file mode 100644
index 000000000000..c27b1f363f76
--- /dev/null
+++ b/src/libaudgui/playlists.cc
@@ -0,0 +1,183 @@
+/*
+ * playlists.c
+ * Copyright 2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gtk/gtk.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/runtime.h>
+#include <libaudcore/tuple.h>
+#include <libaudcore/vfs.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+struct ImportExportJob {
+    bool save;
+    int list_id;
+    char * filename;
+    GtkWidget * selector, * confirm;
+};
+
+/* "destroy" callback; do not call directly */
+static void cleanup_job (void * data)
+{
+    ImportExportJob * job = (ImportExportJob *) data;
+
+    char * folder = gtk_file_chooser_get_current_folder_uri ((GtkFileChooser *) job->selector);
+
+    if (folder)
+        aud_set_str ("audgui", "playlist_path", folder);
+
+    g_free (folder);
+
+    if (job->confirm)
+        gtk_widget_destroy (job->confirm);
+
+    g_free (job->filename);
+    g_slice_free (ImportExportJob, job);
+}
+
+static void finish_job (void * data)
+{
+    ImportExportJob * job = (ImportExportJob *) data;
+    int list = aud_playlist_by_unique_id (job->list_id);
+
+    Playlist::GetMode mode = Playlist::Wait;
+    if (aud_get_bool (nullptr, "metadata_on_play"))
+        mode = Playlist::Nothing;
+
+    if (list >= 0)
+    {
+        aud_playlist_set_filename (list, job->filename);
+
+        if (job->save)
+            aud_playlist_save (list, job->filename, mode);
+        else
+        {
+            aud_playlist_entry_delete (list, 0, aud_playlist_entry_count (list));
+            aud_playlist_entry_insert (list, 0, job->filename, Tuple (), false);
+        }
+    }
+
+    gtk_widget_destroy (job->selector);
+}
+
+static void confirm_overwrite (ImportExportJob * job)
+{
+    if (job->confirm)
+        gtk_widget_destroy (job->confirm);
+
+    GtkWidget * button1 = audgui_button_new (_("_Overwrite"), "document-save", finish_job, job);
+    GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop", nullptr, nullptr);
+
+    job->confirm = audgui_dialog_new (GTK_MESSAGE_QUESTION,
+     _("Confirm Overwrite"), str_printf (_("Overwrite %s?"), job->filename),
+     button1, button2);
+
+    g_signal_connect (job->confirm, "destroy", (GCallback) gtk_widget_destroyed, & job->confirm);
+
+    gtk_widget_show_all (job->confirm);
+}
+
+static void check_overwrite (void * data)
+{
+    ImportExportJob * job = (ImportExportJob *) data;
+
+    job->filename = gtk_file_chooser_get_uri ((GtkFileChooser *) job->selector);
+
+    if (! job->filename)
+        return;
+
+    if (job->save && VFSFile::test_file (job->filename, VFS_EXISTS))
+        confirm_overwrite (job);
+    else
+        finish_job (data);
+}
+
+static void create_selector (ImportExportJob * job, const char * filename, const char * folder)
+{
+    const char * title, * verb, * icon;
+    GtkFileChooserAction action;
+
+    if (job->save)
+    {
+        title = _("Export Playlist");
+        verb = _("_Export");
+        icon = "document-save";
+        action = GTK_FILE_CHOOSER_ACTION_SAVE;
+    }
+    else
+    {
+        title = _("Import Playlist");
+        verb = _("_Import");
+        icon = "document-open";
+        action = GTK_FILE_CHOOSER_ACTION_OPEN;
+    }
+
+    job->selector = gtk_file_chooser_dialog_new (title, nullptr, action, nullptr, nullptr);
+
+    if (filename)
+        gtk_file_chooser_set_uri ((GtkFileChooser *) job->selector, filename);
+    else if (folder)
+        gtk_file_chooser_set_current_folder_uri ((GtkFileChooser *) job->selector, folder);
+
+    GtkWidget * button1 = audgui_button_new (verb, icon, check_overwrite, job);
+    GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop",
+     (AudguiCallback) gtk_widget_destroy, job->selector);
+
+    gtk_dialog_add_action_widget ((GtkDialog *) job->selector, button2, GTK_RESPONSE_NONE);
+    gtk_dialog_add_action_widget ((GtkDialog *) job->selector, button1, GTK_RESPONSE_NONE);
+
+    gtk_widget_set_can_default (button1, true);
+    gtk_widget_grab_default (button1);
+
+    g_signal_connect_swapped (job->selector, "destroy", (GCallback) cleanup_job, job);
+
+    gtk_widget_show_all (job->selector);
+}
+
+static GtkWidget * start_job (bool save)
+{
+    int list = aud_playlist_get_active ();
+
+    String filename = aud_playlist_get_filename (list);
+    String folder = aud_get_str ("audgui", "playlist_path");
+
+    ImportExportJob * job = g_slice_new0 (ImportExportJob);
+
+    job->save = save;
+    job->list_id = aud_playlist_get_unique_id (list);
+
+    create_selector (job, filename, folder[0] ? (const char *) folder : nullptr);
+
+    return job->selector;
+}
+
+EXPORT void audgui_import_playlist ()
+{
+    audgui_show_unique_window (AUDGUI_PLAYLIST_IMPORT_WINDOW, start_job (false));
+}
+
+EXPORT void audgui_export_playlist ()
+{
+    audgui_show_unique_window (AUDGUI_PLAYLIST_EXPORT_WINDOW, start_job (true));
+}
diff --git a/src/libaudgui/plugin-menu.cc b/src/libaudgui/plugin-menu.cc
new file mode 100644
index 000000000000..268ad5582170
--- /dev/null
+++ b/src/libaudgui/plugin-menu.cc
@@ -0,0 +1,118 @@
+/*
+ * plugin-menu.c
+ * Copyright 2009-2011 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gtk/gtk.h>
+
+#include <libaudcore/i18n.h>
+#include <libaudcore/interface.h>
+#include <libaudcore/plugins.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+#include "menu.h"
+
+static aud::array<AudMenuID, GList *> items; /* of AudguiMenuItem */
+static aud::array<AudMenuID, GtkWidget *> menus;
+
+static void configure_plugins ()
+{
+    audgui_show_prefs_for_plugin_type (PluginType::General);
+}
+
+static const AudguiMenuItem main_items[] = {
+    MenuCommand (N_("_Plugins ..."), 0, 0, (GdkModifierType) 0, configure_plugins),
+    MenuSep ()
+};
+
+static void add_to_menu (GtkWidget * menu, const AudguiMenuItem * item)
+{
+    GtkWidget * widget = audgui_menu_item_new_with_domain (item, nullptr, nullptr);
+    g_object_set_data ((GObject *) widget, "func", (void *) item->func);
+    gtk_widget_show (widget);
+    gtk_menu_shell_append ((GtkMenuShell *) menu, widget);
+}
+
+EXPORT GtkWidget * audgui_get_plugin_menu (AudMenuID id)
+{
+    if (! menus[id])
+    {
+        menus[id] = gtk_menu_new ();
+        g_signal_connect (menus[id], "destroy", (GCallback)
+         gtk_widget_destroyed, & menus[id]);
+
+        if (id == AudMenuID::Main)
+            audgui_menu_init (menus[id], main_items, nullptr);
+
+        for (GList * node = items[id]; node; node = node->next)
+            add_to_menu (menus[id], (const AudguiMenuItem *) node->data);
+    }
+
+    return menus[id];
+}
+
+EXPORT void audgui_plugin_menu_add (AudMenuID id, void (* func) (void),
+ const char * name, const char * icon)
+{
+    AudguiMenuItem * item = g_slice_new0 (AudguiMenuItem);
+    item->name = name;
+    item->icon = icon;
+    item->func = func;
+
+    items[id] = g_list_append (items[id], item);
+
+    if (menus[id])
+        add_to_menu (menus[id], item);
+}
+
+static void remove_cb (GtkWidget * widget, void (* func) (void))
+{
+    if (g_object_get_data ((GObject *) widget, "func") == (void *) func)
+        gtk_widget_destroy (widget);
+}
+
+EXPORT void audgui_plugin_menu_remove (AudMenuID id, void (* func) (void))
+{
+    if (menus[id])
+        gtk_container_foreach ((GtkContainer *) menus[id], (GtkCallback)
+         remove_cb, (void *) func);
+
+    GList * next;
+    for (GList * node = items[id]; node; node = next)
+    {
+        next = node->next;
+
+        if (((AudguiMenuItem *) node->data)->func == func)
+        {
+            g_slice_free (AudguiMenuItem, node->data);
+            items[id] = g_list_delete_link (items[id], node);
+        }
+    }
+}
+
+void plugin_menu_cleanup ()
+{
+    for (AudMenuID id : aud::range<AudMenuID> ())
+    {
+        g_warn_if_fail (! items[id]);
+
+        if (menus[id])
+            gtk_widget_destroy (menus[id]);
+    }
+}
diff --git a/src/libaudgui/plugin-prefs.cc b/src/libaudgui/plugin-prefs.cc
new file mode 100644
index 000000000000..ac27ae20f44b
--- /dev/null
+++ b/src/libaudgui/plugin-prefs.cc
@@ -0,0 +1,191 @@
+/*
+ * plugin-prefs.c
+ * Copyright 2012-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/plugin.h>
+#include <libaudcore/plugins.h>
+#include <libaudcore/preferences.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+static GList * about_windows;
+static GList * config_windows;
+
+static int find_cb (GtkWidget * window, PluginHandle * plugin)
+{
+    return (g_object_get_data ((GObject *) window, "plugin-id") != plugin);
+}
+
+static bool watch_cb (PluginHandle * plugin, void * window);
+
+/* window destroyed before plugin disabled */
+static void destroy_cb (GtkWidget * window, PluginHandle * plugin)
+{
+    GList * * list = & config_windows;
+    GList * node = g_list_find (* list, window);
+
+    if (! node)
+    {
+        list = & about_windows;
+        node = g_list_find (* list, nullptr);  /* set to nullptr by audgui_simple_message() */
+        g_return_if_fail (node);
+    }
+
+    aud_plugin_remove_watch (plugin, watch_cb, window);
+
+    * list = g_list_delete_link (* list, node);
+}
+
+/* plugin disabled before window destroyed */
+static bool watch_cb (PluginHandle * plugin, void * window)
+{
+    if (aud_plugin_get_enabled (plugin))
+        return true;
+
+    GList * * list = & about_windows;
+    GList * node = g_list_find (* list, window);
+
+    if (! node)
+    {
+        list = & config_windows;
+        node = g_list_find (* list, window);
+        g_return_val_if_fail (node, false);
+    }
+
+    g_signal_handlers_disconnect_by_func (window, (void *) destroy_cb, plugin);
+    gtk_widget_destroy ((GtkWidget *) window);
+
+    * list = g_list_delete_link (* list, node);
+
+    return false;
+}
+
+EXPORT void audgui_show_plugin_about (PluginHandle * plugin)
+{
+    GList * node = g_list_find_custom (about_windows, plugin, (GCompareFunc) find_cb);
+
+    if (node)
+    {
+        gtk_window_present ((GtkWindow *) node->data);
+        return;
+    }
+
+    Plugin * header = (Plugin *) aud_plugin_get_header (plugin);
+    g_return_if_fail (header);
+
+    const char * name = header->info.name;
+    const char * text = header->info.about;
+    if (! text)
+        return;
+
+    if (header->info.domain)
+    {
+        name = dgettext (header->info.domain, name);
+        text = dgettext (header->info.domain, text);
+    }
+
+    about_windows = node = g_list_prepend (about_windows, nullptr);
+
+    audgui_simple_message ((GtkWidget * *) & node->data, GTK_MESSAGE_INFO,
+     str_printf (_("About %s"), name), text);
+    g_object_set_data ((GObject *) node->data, "plugin-id", plugin);
+
+    g_signal_connect_after (node->data, "destroy", (GCallback) destroy_cb, plugin);
+    aud_plugin_add_watch (plugin, watch_cb, node->data);
+}
+
+static void response_cb (GtkWidget * window, int response, const PluginPreferences * p)
+{
+    if (response == GTK_RESPONSE_OK && p->apply)
+        p->apply ();
+
+    gtk_widget_destroy (window);
+}
+
+static void cleanup_cb (GtkWidget * window, const PluginPreferences * p)
+{
+    if (p->cleanup)
+        p->cleanup ();
+}
+
+EXPORT void audgui_show_plugin_prefs (PluginHandle * plugin)
+{
+    GList * node = g_list_find_custom (config_windows, plugin, (GCompareFunc) find_cb);
+
+    if (node)
+    {
+        gtk_window_present ((GtkWindow *) node->data);
+        return;
+    }
+
+    Plugin * header = (Plugin *) aud_plugin_get_header (plugin);
+    g_return_if_fail (header);
+
+    const PluginPreferences * p = header->info.prefs;
+    if (! p)
+        return;
+
+    if (p->init)
+        p->init ();
+
+    const char * name = header->info.name;
+    if (header->info.domain)
+        name = dgettext (header->info.domain, name);
+
+    GtkWidget * window = gtk_dialog_new ();
+    gtk_window_set_title ((GtkWindow *) window, str_printf (_("%s Settings"), name));
+
+    if (p->apply)
+    {
+        GtkWidget * button1 = audgui_button_new (_("_Set"), "system-run", nullptr, nullptr);
+        GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop", nullptr, nullptr);
+        gtk_dialog_add_action_widget ((GtkDialog *) window, button2, GTK_RESPONSE_CANCEL);
+        gtk_dialog_add_action_widget ((GtkDialog *) window, button1, GTK_RESPONSE_OK);
+    }
+    else
+    {
+        GtkWidget * button = audgui_button_new (_("_Close"), "window-close", nullptr, nullptr);
+        gtk_dialog_add_action_widget ((GtkDialog *) window, button, GTK_RESPONSE_CLOSE);
+    }
+
+    GtkWidget * content = gtk_dialog_get_content_area ((GtkDialog *) window);
+    GtkWidget * box = gtk_vbox_new (false, 0);
+    audgui_create_widgets_with_domain (box, p->widgets, header->info.domain);
+    gtk_box_pack_start ((GtkBox *) content, box, true, true, 0);
+
+    g_signal_connect (window, "response", (GCallback) response_cb, (void *) p);
+    g_signal_connect (window, "destroy", (GCallback) cleanup_cb, (void *) p);
+
+    gtk_widget_show_all (window);
+
+    g_object_set_data ((GObject *) window, "plugin-id", plugin);
+    config_windows = g_list_prepend (config_windows, window);
+
+    g_signal_connect_after (window, "destroy", (GCallback) destroy_cb, plugin);
+    aud_plugin_add_watch (plugin, watch_cb, window);
+}
+
+void plugin_prefs_cleanup ()
+{
+    g_list_foreach (about_windows, (GFunc) gtk_widget_destroy, nullptr);
+    g_list_foreach (config_windows, (GFunc) gtk_widget_destroy, nullptr);
+}
diff --git a/src/libaudgui/plugin-view.cc b/src/libaudgui/plugin-view.cc
new file mode 100644
index 000000000000..8cf237e07877
--- /dev/null
+++ b/src/libaudgui/plugin-view.cc
@@ -0,0 +1,250 @@
+/*
+ * plugin-view.c
+ * Copyright 2010-2012 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gtk/gtk.h>
+
+#include <libaudcore/i18n.h>
+#include <libaudcore/plugin.h>
+#include <libaudcore/plugins.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+enum {
+    PVIEW_COL_NODE,
+    PVIEW_COL_ENABLED,
+    PVIEW_COL_NAME,
+    PVIEW_COLS
+};
+
+struct Node {
+    PluginHandle * p;
+    GtkTreeModel * model;
+    GtkTreePath * path;
+};
+
+static PluginHandle * get_selected_plugin (GtkTreeView * tree)
+{
+    Node * n = nullptr;
+
+    GtkTreeSelection * sel = gtk_tree_view_get_selection (tree);
+
+    /* the treeview may not have a model yet */
+    if (! sel)
+        return nullptr;
+
+    GtkTreeModel * model;
+    GtkTreeIter iter;
+    if (gtk_tree_selection_get_selected (sel, & model, & iter))
+        gtk_tree_model_get (model, & iter, PVIEW_COL_NODE, & n, -1);
+
+    return n == nullptr ? nullptr : n->p;
+}
+
+static void do_enable (GtkCellRendererToggle * cell, const char * path_str,
+ GtkTreeModel * model)
+{
+    GtkTreePath * path = gtk_tree_path_new_from_string (path_str);
+    GtkTreeIter iter;
+    gtk_tree_model_get_iter (model, & iter, path);
+    gtk_tree_path_free (path);
+
+    Node * n = nullptr;
+    gboolean enabled;
+    gtk_tree_model_get (model, & iter, PVIEW_COL_NODE, & n,
+     PVIEW_COL_ENABLED, & enabled, -1);
+    g_return_if_fail (n != nullptr);
+
+    aud_plugin_enable (n->p, ! enabled);
+}
+
+static bool list_watcher (PluginHandle * p, void * data)
+{
+    auto n = (Node *) data;
+
+    GtkTreeIter iter;
+    gtk_tree_model_get_iter (n->model, & iter, n->path);
+    gtk_list_store_set ((GtkListStore *) n->model, & iter, PVIEW_COL_ENABLED,
+     aud_plugin_get_enabled (n->p), -1);
+
+    return true;
+}
+
+static void add_to_list (GtkTreeModel * model, PluginHandle * p)
+{
+    Node * n = new Node;
+
+    GtkTreeIter iter;
+    gtk_list_store_append ((GtkListStore *) model, & iter);
+    gtk_list_store_set ((GtkListStore *) model, & iter, PVIEW_COL_NODE, n,
+     PVIEW_COL_ENABLED, aud_plugin_get_enabled (p), PVIEW_COL_NAME,
+     aud_plugin_get_name (p), -1);
+
+    n->p = p;
+    n->model = model;
+    n->path = gtk_tree_model_get_path (model, & iter);
+
+    aud_plugin_add_watch (p, list_watcher, n);
+}
+
+static void list_fill (GtkTreeView * tree, void * type)
+{
+    GtkTreeModel * model = (GtkTreeModel *) gtk_list_store_new (PVIEW_COLS,
+     G_TYPE_POINTER, G_TYPE_BOOLEAN, G_TYPE_STRING);
+    gtk_tree_view_set_model (tree, model);
+
+    GtkTreeViewColumn * col = gtk_tree_view_column_new ();
+    gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
+    gtk_tree_view_column_set_resizable (col, false);
+    gtk_tree_view_append_column (tree, col);
+
+    GtkCellRenderer * rend = gtk_cell_renderer_toggle_new ();
+    g_signal_connect (rend, "toggled", (GCallback) do_enable, model);
+    gtk_tree_view_column_pack_start (col, rend, false);
+    gtk_tree_view_column_set_attributes (col, rend, "active", PVIEW_COL_ENABLED,
+     nullptr);
+
+    col = gtk_tree_view_column_new ();
+    gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
+    gtk_tree_view_column_set_expand (col, true);
+    gtk_tree_view_column_set_resizable (col, false);
+    gtk_tree_view_append_column (tree, col);
+
+    rend = gtk_cell_renderer_text_new ();
+    gtk_tree_view_column_pack_start (col, rend, false);
+    gtk_tree_view_column_set_attributes (col, rend, "text", PVIEW_COL_NAME, nullptr);
+
+    for (PluginHandle * plugin : aud_plugin_list (aud::from_ptr<PluginType> (type)))
+        add_to_list (model, plugin);
+}
+
+static void list_destroy (GtkTreeView * tree)
+{
+    GtkTreeModel * model = gtk_tree_view_get_model (tree);
+    if (model == nullptr)
+        return;
+
+    GtkTreeIter iter;
+    if (gtk_tree_model_get_iter_first (model, & iter))
+    {
+        do
+        {
+            Node * n = nullptr;
+            gtk_tree_model_get (model, & iter, PVIEW_COL_NODE, & n, -1);
+            g_return_if_fail (n != nullptr);
+
+            aud_plugin_remove_watch (n->p, list_watcher, n);
+            gtk_tree_path_free (n->path);
+            delete n;
+        }
+        while (gtk_tree_model_iter_next (model, & iter));
+    }
+
+    g_object_unref ((GObject *) model);
+}
+
+static bool watcher (PluginHandle * p, void * b)
+{
+    bool is_about = GPOINTER_TO_INT (g_object_get_data ((GObject *) b, "is_about"));
+
+    if (is_about)
+        gtk_widget_set_sensitive ((GtkWidget *) b,
+         aud_plugin_has_about (p) && aud_plugin_get_enabled (p));
+    else
+        gtk_widget_set_sensitive ((GtkWidget *) b,
+         aud_plugin_has_configure (p) && aud_plugin_get_enabled (p));
+
+    return true;
+}
+
+static void button_update (GtkTreeView * tree, GtkWidget * b)
+{
+    PluginHandle * p = (PluginHandle *) g_object_steal_data ((GObject *) b, "plugin");
+    if (p != nullptr)
+        aud_plugin_remove_watch (p, watcher, b);
+
+    p = get_selected_plugin (tree);
+    if (p != nullptr)
+    {
+        g_object_set_data ((GObject *) b, "plugin", p);
+        watcher (p, b);
+        aud_plugin_add_watch (p, watcher, b);
+    }
+    else
+        gtk_widget_set_sensitive (b, false);
+}
+
+static void do_config (void * tree)
+{
+    PluginHandle * plugin = get_selected_plugin ((GtkTreeView *) tree);
+    g_return_if_fail (plugin != nullptr);
+    audgui_show_plugin_prefs (plugin);
+}
+
+static void do_about (void * tree)
+{
+    PluginHandle * plugin = get_selected_plugin ((GtkTreeView *) tree);
+    g_return_if_fail (plugin != nullptr);
+    audgui_show_plugin_about (plugin);
+}
+
+static void button_destroy (GtkWidget * b)
+{
+    PluginHandle * p = (PluginHandle *) g_object_steal_data ((GObject *) b, "plugin");
+    if (p != nullptr)
+        aud_plugin_remove_watch (p, watcher, b);
+}
+
+GtkWidget * plugin_view_new (PluginType type)
+{
+    GtkWidget * vbox = gtk_vbox_new (false, 6);
+    gtk_container_set_border_width ((GtkContainer *) vbox, 6);
+
+    GtkWidget * scrolled = gtk_scrolled_window_new (nullptr, nullptr);
+    gtk_box_pack_start ((GtkBox *) vbox, scrolled, true, true, 0);
+    gtk_scrolled_window_set_policy ((GtkScrolledWindow *) scrolled,
+     GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+    gtk_scrolled_window_set_shadow_type ((GtkScrolledWindow *) scrolled, GTK_SHADOW_IN);
+
+    GtkWidget * tree = gtk_tree_view_new ();
+    gtk_container_add ((GtkContainer *) scrolled, tree);
+    gtk_tree_view_set_headers_visible ((GtkTreeView *) tree, false);
+    g_signal_connect (tree, "realize", (GCallback) list_fill, aud::to_ptr (type));
+    g_signal_connect (tree, "destroy", (GCallback) list_destroy, nullptr);
+
+    GtkWidget * hbox = gtk_hbox_new (false, 6);
+    gtk_box_pack_start ((GtkBox *) vbox, hbox, false, false, 0);
+
+    GtkWidget * config = audgui_button_new (_("_Settings"), "preferences-system", do_config, tree);
+    gtk_box_pack_start ((GtkBox *) hbox, config, false, false, 0);
+    gtk_widget_set_sensitive (config, false);
+    g_object_set_data ((GObject *) config, "is_about", GINT_TO_POINTER (false));
+    g_signal_connect (tree, "cursor-changed", (GCallback) button_update, config);
+    g_signal_connect (config, "destroy", (GCallback) button_destroy, nullptr);
+
+    GtkWidget * about = audgui_button_new (_("_About"), "help-about", do_about, tree);
+    gtk_box_pack_start ((GtkBox *) hbox, about, false, false, 0);
+    gtk_widget_set_sensitive (about, false);
+    g_object_set_data ((GObject *) about, "is_about", GINT_TO_POINTER (true));
+    g_signal_connect (tree, "cursor-changed", (GCallback) button_update, about);
+    g_signal_connect (about, "destroy", (GCallback) button_destroy, nullptr);
+
+    return vbox;
+}
diff --git a/src/libaudgui/prefs-widget.cc b/src/libaudgui/prefs-widget.cc
new file mode 100644
index 000000000000..c9674e989e15
--- /dev/null
+++ b/src/libaudgui/prefs-widget.cc
@@ -0,0 +1,570 @@
+/*
+ * prefs-widget.c
+ * Copyright 2007-2014 Tomasz Moń, William Pitcock, and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <string.h>
+#include <gtk/gtk.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/preferences.h>
+#include <libaudcore/runtime.h>
+
+#include "libaudgui-gtk.h"
+
+static void widget_changed (GtkWidget * widget, const PreferencesWidget * w)
+{
+    switch (w->type)
+    {
+    case PreferencesWidget::CheckButton:
+    {
+        gboolean set = gtk_toggle_button_get_active ((GtkToggleButton *) widget);
+        w->cfg.set_bool (set);
+
+        auto child = (GtkWidget *) g_object_get_data ((GObject *) widget, "child");
+        if (child)
+            gtk_widget_set_sensitive (child, set);
+
+        break;
+    }
+
+    case PreferencesWidget::RadioButton:
+        if (gtk_toggle_button_get_active ((GtkToggleButton *) widget))
+            w->cfg.set_int (w->data.radio_btn.value);
+
+        break;
+
+    case PreferencesWidget::SpinButton:
+        if (w->cfg.type == WidgetConfig::Int)
+            w->cfg.set_int (gtk_spin_button_get_value_as_int ((GtkSpinButton *) widget));
+        else if (w->cfg.type == WidgetConfig::Float)
+            w->cfg.set_float (gtk_spin_button_get_value ((GtkSpinButton *) widget));
+
+        break;
+
+    case PreferencesWidget::FontButton:
+        w->cfg.set_string (gtk_font_button_get_font_name ((GtkFontButton *) widget));
+        break;
+
+    case PreferencesWidget::Entry:
+        w->cfg.set_string (gtk_entry_get_text ((GtkEntry *) widget));
+        break;
+
+    case PreferencesWidget::ComboBox:
+    {
+        auto items = (const ComboItem *) g_object_get_data ((GObject *) widget, "comboitems");
+        int idx = gtk_combo_box_get_active ((GtkComboBox *) widget);
+
+        if (w->cfg.type == WidgetConfig::Int)
+            w->cfg.set_int (items[idx].num);
+        else if (w->cfg.type == WidgetConfig::String)
+            w->cfg.set_string (items[idx].str);
+
+        break;
+    }
+
+    default:
+        break;
+    }
+}
+
+static void combobox_update (GtkWidget * combobox, const PreferencesWidget * widget);
+
+static void widget_update (void *, void * widget)
+{
+    auto w = (const PreferencesWidget *) g_object_get_data ((GObject *) widget, "prefswidget");
+
+    g_signal_handlers_block_by_func (widget, (void *) widget_changed, (void *) w);
+
+    switch (w->type)
+    {
+    case PreferencesWidget::CheckButton:
+        gtk_toggle_button_set_active ((GtkToggleButton *) widget, w->cfg.get_bool ());
+        break;
+
+    case PreferencesWidget::RadioButton:
+        if (w->cfg.get_int () == w->data.radio_btn.value)
+            gtk_toggle_button_set_active ((GtkToggleButton *) widget, true);
+
+        break;
+
+    case PreferencesWidget::SpinButton:
+        if (w->cfg.type == WidgetConfig::Int)
+            gtk_spin_button_set_value ((GtkSpinButton *) widget, w->cfg.get_int ());
+        else if (w->cfg.type == WidgetConfig::Float)
+            gtk_spin_button_set_value ((GtkSpinButton *) widget, w->cfg.get_float ());
+
+        break;
+
+    case PreferencesWidget::FontButton:
+        gtk_font_button_set_font_name ((GtkFontButton *) widget, w->cfg.get_string ());
+        break;
+
+    case PreferencesWidget::Entry:
+        gtk_entry_set_text ((GtkEntry *) widget, w->cfg.get_string ());
+        break;
+
+    case PreferencesWidget::ComboBox:
+        combobox_update ((GtkWidget *) widget, w);
+        break;
+
+    default:
+        break;
+    }
+
+    g_signal_handlers_unblock_by_func (widget, (void *) widget_changed, (void *) w);
+}
+
+static void widget_unhook (GtkWidget * widget, const PreferencesWidget * w)
+{
+    hook_dissociate (w->cfg.hook, widget_update, widget);
+}
+
+static void widget_init (GtkWidget * widget, const PreferencesWidget * w)
+{
+    g_object_set_data ((GObject *) widget, "prefswidget", (void *) w);
+
+    widget_update (nullptr, widget);
+
+    switch (w->type)
+    {
+    case PreferencesWidget::CheckButton:
+    case PreferencesWidget::RadioButton:
+        g_signal_connect (widget, "toggled", (GCallback) widget_changed, (void *) w);
+        break;
+
+    case PreferencesWidget::SpinButton:
+        g_signal_connect (widget, "value_changed", (GCallback) widget_changed, (void *) w);
+        break;
+
+    case PreferencesWidget::FontButton:
+        g_signal_connect (widget, "font_set", (GCallback) widget_changed, (void *) w);
+        break;
+
+    case PreferencesWidget::Entry:
+    case PreferencesWidget::ComboBox:
+        g_signal_connect (widget, "changed", (GCallback) widget_changed, (void *) w);
+        break;
+
+    default:
+        break;
+    }
+
+    if (w->cfg.hook)
+    {
+        hook_associate (w->cfg.hook, widget_update, widget);
+        g_signal_connect (widget, "destroy", (GCallback) widget_unhook, (void *) w);
+    }
+}
+
+/* WIDGET_LABEL */
+
+static void create_label (const PreferencesWidget * widget, GtkWidget * * label,
+ GtkWidget * * icon, const char * domain)
+{
+    * label = gtk_label_new_with_mnemonic (dgettext (domain, widget->label));
+    gtk_label_set_use_markup ((GtkLabel *) * label, true);
+    gtk_label_set_line_wrap ((GtkLabel *) * label, true);
+    gtk_misc_set_alignment ((GtkMisc *) * label, 0, 0.5);
+}
+
+/* WIDGET_SPIN_BTN */
+
+static void create_spin_button (const PreferencesWidget * widget,
+ GtkWidget * * label_pre, GtkWidget * * spin_btn, GtkWidget * * label_past,
+ const char * domain)
+{
+    * label_pre = gtk_label_new (dgettext (domain, widget->label));
+    * spin_btn = gtk_spin_button_new_with_range (widget->data.spin_btn.min,
+     widget->data.spin_btn.max, widget->data.spin_btn.step);
+
+    if (widget->data.spin_btn.right_label)
+        * label_past = gtk_label_new (dgettext (domain, widget->data.spin_btn.right_label));
+
+    widget_init (* spin_btn, widget);
+}
+
+/* WIDGET_FONT_BTN */
+
+void create_font_btn (const PreferencesWidget * widget, GtkWidget * * label,
+ GtkWidget * * font_btn, const char * domain)
+{
+    * font_btn = gtk_font_button_new ();
+    gtk_font_button_set_use_font ((GtkFontButton *) * font_btn, true);
+    gtk_font_button_set_use_size ((GtkFontButton *) * font_btn, true);
+
+    if (widget->label)
+    {
+        * label = gtk_label_new (dgettext (domain, widget->label));
+        gtk_misc_set_alignment ((GtkMisc *) * label, 1, 0.5);
+    }
+
+    if (widget->data.font_btn.title)
+        gtk_font_button_set_title ((GtkFontButton *) * font_btn,
+         dgettext (domain, widget->data.font_btn.title));
+
+    widget_init (* font_btn, widget);
+}
+
+/* WIDGET_ENTRY */
+
+static void create_entry (const PreferencesWidget * widget, GtkWidget * * label,
+ GtkWidget * * entry, const char * domain)
+{
+    * entry = gtk_entry_new ();
+    gtk_entry_set_visibility ((GtkEntry *) * entry, ! widget->data.entry.password);
+
+    if (widget->label)
+    {
+        * label = gtk_label_new (dgettext (domain, widget->label));
+        gtk_misc_set_alignment ((GtkMisc *) * label, 1, 0.5);
+    }
+
+    widget_init (* entry, widget);
+}
+
+/* WIDGET_COMBO_BOX */
+
+static void combobox_update (GtkWidget * combobox, const PreferencesWidget * widget)
+{
+    auto domain = (const char *) g_object_get_data ((GObject *) combobox, "combodomain");
+
+    ArrayRef<ComboItem> items = widget->data.combo.elems;
+    if (widget->data.combo.fill)
+        items = widget->data.combo.fill ();
+
+    g_object_set_data ((GObject *) combobox, "comboitems", (void *) items.data);
+
+    /* no gtk_combo_box_text_clear()? */
+    gtk_list_store_clear ((GtkListStore *) gtk_combo_box_get_model ((GtkComboBox *) combobox));
+
+    for (const ComboItem & item : items)
+        gtk_combo_box_text_append_text ((GtkComboBoxText *) combobox,
+         dgettext (domain, item.label));
+
+    if (widget->cfg.type == WidgetConfig::Int)
+    {
+        int num = widget->cfg.get_int ();
+
+        for (int i = 0; i < items.len; i ++)
+        {
+            if (items.data[i].num == num)
+            {
+                gtk_combo_box_set_active ((GtkComboBox *) combobox, i);
+                break;
+            }
+        }
+    }
+    else if (widget->cfg.type == WidgetConfig::String)
+    {
+        String str = widget->cfg.get_string ();
+
+        for (int i = 0; i < items.len; i ++)
+        {
+            if (! strcmp_safe (items.data[i].str, str))
+            {
+                gtk_combo_box_set_active ((GtkComboBox *) combobox, i);
+                break;
+            }
+        }
+    }
+}
+
+static void create_cbox (const PreferencesWidget * widget, GtkWidget * * label,
+ GtkWidget * * combobox, const char * domain)
+{
+    * combobox = gtk_combo_box_text_new ();
+
+    if (widget->label)
+        * label = gtk_label_new (dgettext (domain, widget->label));
+
+    g_object_set_data ((GObject *) * combobox, "combodomain", (void *) domain);
+    widget_init (* combobox, widget);
+}
+
+/* WIDGET_TABLE */
+
+static void fill_table (GtkWidget * table,
+ ArrayRef<PreferencesWidget> widgets, const char * domain)
+{
+    for (const PreferencesWidget & w : widgets)
+    {
+        GtkWidget * widget_left = nullptr, * widget_middle = nullptr, * widget_right = nullptr;
+        GtkAttachOptions middle_policy = (GtkAttachOptions) (GTK_FILL);
+
+        switch (w.type)
+        {
+            case PreferencesWidget::SpinButton:
+                create_spin_button (& w, & widget_left,
+                 & widget_middle, & widget_right, domain);
+                break;
+
+            case PreferencesWidget::Label:
+                create_label (& w, & widget_middle, & widget_left, domain);
+                break;
+
+            case PreferencesWidget::FontButton:
+                create_font_btn (& w, & widget_left, & widget_middle, domain);
+                middle_policy = (GtkAttachOptions) (GTK_EXPAND | GTK_FILL);
+                break;
+
+            case PreferencesWidget::Entry:
+                create_entry (& w, & widget_left, & widget_middle, domain);
+                middle_policy = (GtkAttachOptions) (GTK_EXPAND | GTK_FILL);
+                break;
+
+            case PreferencesWidget::ComboBox:
+                create_cbox (& w, & widget_left, & widget_middle, domain);
+                middle_policy = (GtkAttachOptions) (GTK_EXPAND | GTK_FILL);
+                break;
+
+            default:
+                break;
+        }
+
+        int i = & w - widgets.data;
+
+        if (widget_left)
+            gtk_table_attach ((GtkTable *) table, widget_left, 0, 1, i, i + 1,
+             GTK_FILL, GTK_FILL, 0, 0);
+
+        if (widget_middle)
+            gtk_table_attach ((GtkTable *) table, widget_middle, 1, 2, i, i + 1,
+             middle_policy, GTK_FILL, 0, 0);
+
+        if (widget_right)
+            gtk_table_attach ((GtkTable *) table, widget_right, 2, 3, i, i + 1,
+             GTK_FILL, GTK_FILL, 0, 0);
+    }
+}
+
+/* ALL WIDGETS */
+
+/* box: a GtkBox */
+void audgui_create_widgets_with_domain (GtkWidget * box,
+ ArrayRef<PreferencesWidget> widgets, const char * domain)
+{
+    GtkWidget * widget = nullptr, * child_box = nullptr;
+    GSList * radio_btn_group = nullptr;
+
+    for (const PreferencesWidget & w : widgets)
+    {
+        GtkWidget * label = nullptr;
+
+        if (widget && w.child)
+        {
+            if (! child_box)
+            {
+                child_box = gtk_vbox_new (false, 0);
+                g_object_set_data ((GObject *) widget, "child", child_box);
+
+                GtkWidget * alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+                gtk_box_pack_start ((GtkBox *) box, alignment, false, false, 0);
+                gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 0, 12, 0);
+                gtk_container_add ((GtkContainer *) alignment, child_box);
+
+                if (GTK_IS_TOGGLE_BUTTON (widget))
+                    gtk_widget_set_sensitive (child_box,
+                     gtk_toggle_button_get_active ((GtkToggleButton *) widget));
+            }
+        }
+        else
+            child_box = nullptr;
+
+        GtkWidget * alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+        gtk_alignment_set_padding ((GtkAlignment *) alignment, 6, 0, 12, 0);
+        gtk_box_pack_start ((GtkBox *) (child_box ? child_box : box), alignment, false, false, 0);
+
+        widget = nullptr;
+
+        if (radio_btn_group && w.type != PreferencesWidget::RadioButton)
+            radio_btn_group = nullptr;
+
+        switch (w.type)
+        {
+            case PreferencesWidget::Button:
+                widget = audgui_button_new (dgettext (domain, w.label),
+                 w.data.button.icon, (AudguiCallback) w.data.button.callback, nullptr);
+                break;
+
+            case PreferencesWidget::CheckButton:
+                widget = gtk_check_button_new_with_mnemonic (dgettext (domain, w.label));
+                widget_init (widget, & w);
+                break;
+
+            case PreferencesWidget::Label:
+            {
+                if (strstr (w.label, "<b>"))
+                    gtk_alignment_set_padding ((GtkAlignment *) alignment,
+                     (& w == widgets.data) ? 0 : 12, 0, 0, 0);
+
+                GtkWidget * icon = nullptr;
+                create_label (& w, & label, & icon, domain);
+
+                if (icon)
+                {
+                    widget = gtk_hbox_new (false, 6);
+                    gtk_box_pack_start ((GtkBox *) widget, icon, false, false, 0);
+                    gtk_box_pack_start ((GtkBox *) widget, label, false, false, 0);
+                }
+                else
+                    widget = label;
+
+                break;
+            }
+
+            case PreferencesWidget::RadioButton:
+                widget = gtk_radio_button_new_with_mnemonic (radio_btn_group,
+                 dgettext (domain, w.label));
+                radio_btn_group = gtk_radio_button_get_group ((GtkRadioButton *) widget);
+                widget_init (widget, & w);
+                break;
+
+            case PreferencesWidget::SpinButton:
+            {
+                widget = gtk_hbox_new (false, 6);
+
+                GtkWidget * label_pre = nullptr, * spin_btn = nullptr, * label_past = nullptr;
+                create_spin_button (& w, & label_pre, & spin_btn, & label_past, domain);
+
+                if (label_pre)
+                    gtk_box_pack_start ((GtkBox *) widget, label_pre, false, false, 0);
+                if (spin_btn)
+                    gtk_box_pack_start ((GtkBox *) widget, spin_btn, false, false, 0);
+                if (label_past)
+                    gtk_box_pack_start ((GtkBox *) widget, label_past, false, false, 0);
+
+                break;
+            }
+
+            case PreferencesWidget::CustomGTK:
+                if (w.data.populate)
+                    widget = (GtkWidget *) w.data.populate ();
+
+                break;
+
+            case PreferencesWidget::FontButton:
+            {
+                widget = gtk_hbox_new (false, 6);
+
+                GtkWidget * font_btn = nullptr;
+                create_font_btn (& w, & label, & font_btn, domain);
+
+                if (label)
+                    gtk_box_pack_start ((GtkBox *) widget, label, false, false, 0);
+                if (font_btn)
+                    gtk_box_pack_start ((GtkBox *) widget, font_btn, false, false, 0);
+
+                break;
+            }
+
+            case PreferencesWidget::Table:
+                widget = gtk_table_new (0, 0, false);
+                gtk_table_set_col_spacings ((GtkTable *) widget, 6);
+                gtk_table_set_row_spacings ((GtkTable *) widget, 6);
+
+                fill_table (widget, w.data.table.widgets, domain);
+
+                break;
+
+            case PreferencesWidget::Entry:
+            {
+                widget = gtk_hbox_new (false, 6);
+
+                GtkWidget * entry = nullptr;
+                create_entry (& w, & label, & entry, domain);
+
+                if (label)
+                    gtk_box_pack_start ((GtkBox *) widget, label, false, false, 0);
+                if (entry)
+                    gtk_box_pack_start ((GtkBox *) widget, entry, true, true, 0);
+
+                break;
+            }
+
+            case PreferencesWidget::ComboBox:
+            {
+                widget = gtk_hbox_new (false, 6);
+
+                GtkWidget * combo = nullptr;
+                create_cbox (& w, & label, & combo, domain);
+
+                if (label)
+                    gtk_box_pack_start ((GtkBox *) widget, label, false, false, 0);
+                if (combo)
+                    gtk_box_pack_start ((GtkBox *) widget, combo, false, false, 0);
+
+                break;
+            }
+
+            case PreferencesWidget::Box:
+                if (w.data.box.horizontal)
+                    widget = gtk_hbox_new (false, 6);
+                else
+                    widget = gtk_vbox_new (false, 0);
+
+                audgui_create_widgets_with_domain (widget, w.data.box.widgets, domain);
+
+                if (w.data.box.frame)
+                {
+                    GtkWidget * frame = gtk_frame_new (dgettext (domain, w.label));
+                    gtk_container_add ((GtkContainer *) frame, widget);
+                    widget = frame;
+                }
+
+                break;
+
+            case PreferencesWidget::Notebook:
+                gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 0, 0, 0);
+
+                widget = gtk_notebook_new ();
+
+                for (const NotebookTab & tab : w.data.notebook.tabs)
+                {
+                    GtkWidget * vbox = gtk_vbox_new (false, 0);
+                    gtk_container_set_border_width ((GtkContainer *) vbox, 6);
+
+                    audgui_create_widgets_with_domain (vbox, tab.widgets, domain);
+
+                    gtk_notebook_append_page ((GtkNotebook *) widget, vbox,
+                     gtk_label_new (dgettext (domain, tab.name)));
+                }
+
+                break;
+
+            case PreferencesWidget::Separator:
+                widget = w.data.separator.horizontal ?
+                 gtk_hseparator_new () : gtk_vseparator_new ();
+                break;
+
+            default:
+                break;
+        }
+
+        if (widget)
+        {
+            /* use uniform spacing for horizontal boxes */
+            if (gtk_orientable_get_orientation ((GtkOrientable *) box) ==
+             GTK_ORIENTATION_HORIZONTAL)
+                gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 0, 0, 0);
+
+            gtk_container_add ((GtkContainer *) alignment, widget);
+        }
+    }
+}
diff --git a/src/libaudgui/prefs-window.cc b/src/libaudgui/prefs-window.cc
new file mode 100644
index 000000000000..90269a12eda3
--- /dev/null
+++ b/src/libaudgui/prefs-window.cc
@@ -0,0 +1,814 @@
+/*
+ * prefs-window.c
+ * Copyright 2006-2014 William Pitcock, Tomasz Moń, Michael Färber, and
+ *                     John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <string.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/drct.h>
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/plugin.h>
+#include <libaudcore/plugins.h>
+#include <libaudcore/preferences.h>
+#include <libaudcore/runtime.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+#ifdef USE_CHARDET
+#include <libguess.h>
+#endif
+
+enum CategoryViewCols {
+    CATEGORY_VIEW_COL_ICON,
+    CATEGORY_VIEW_COL_NAME,
+    CATEGORY_VIEW_N_COLS
+};
+
+struct Category {
+    const char * icon_path;
+    const char * name;
+};
+
+struct PluginCategory {
+    PluginType type;
+    const char * name;
+};
+
+struct TitleFieldTag {
+    const char * name;
+    const char * tag;
+};
+
+static const char aud_version_string[] =
+ "<span size='small'>Audacious " VERSION " (" BUILDSTAMP ")</span>";
+
+static GtkWidget * prefswin;
+static GtkWidget * category_treeview, * category_notebook, * plugin_notebook;
+static GtkWidget * titlestring_entry;
+
+enum {
+    CATEGORY_APPEARANCE = 0,
+    CATEGORY_AUDIO,
+    CATEGORY_NETWORK,
+    CATEGORY_PLAYLIST,
+    CATEGORY_SONG_INFO,
+    CATEGORY_PLUGINS
+};
+
+static const Category categories[] = {
+    { "appearance.png", N_("Appearance") },
+    { "audio.png", N_("Audio") },
+    { "connectivity.png", N_("Network") },
+    { "playlist.png", N_("Playlist")} ,
+    { "info.png", N_("Song Info") },
+    { "plugins.png", N_("Plugins") }
+};
+
+static const PluginCategory plugin_categories[] = {
+    { PluginType::General, N_("General") },
+    { PluginType::Effect, N_("Effect") },
+    { PluginType::Vis, N_("Visualization") },
+    { PluginType::Input, N_("Input") },
+    { PluginType::Playlist, N_("Playlist") },
+    { PluginType::Transport, N_("Transport") }
+};
+
+static const TitleFieldTag title_field_tags[] = {
+    { N_("Artist")     , "${artist}" },
+    { N_("Album")      , "${album}" },
+    { N_("Title")      , "${title}" },
+    { N_("Track number"), "${track-number}" },
+    { N_("Genre")      , "${genre}" },
+    { N_("File name")   , "${file-name}" },
+    { N_("File path")   , "${file-path}" },
+    { N_("Date")       , "${date}" },
+    { N_("Year")       , "${year}" },
+    { N_("Comment")    , "${comment}" },
+    { N_("Codec")      , "${codec}" },
+    { N_("Quality")    , "${quality}" }
+};
+
+#ifdef USE_CHARDET
+static const ComboItem chardet_detector_presets[] = {
+    ComboItem (N_("None"), ""),
+    ComboItem (N_("Arabic"), GUESS_REGION_AR),
+    ComboItem (N_("Baltic"), GUESS_REGION_BL),
+    ComboItem (N_("Chinese"), GUESS_REGION_CN),
+    ComboItem (N_("Greek"), GUESS_REGION_GR),
+    ComboItem (N_("Hebrew"), GUESS_REGION_HW),
+    ComboItem (N_("Japanese"), GUESS_REGION_JP),
+    ComboItem (N_("Korean"), GUESS_REGION_KR),
+    ComboItem (N_("Polish"), GUESS_REGION_PL),
+    ComboItem (N_("Russian"), GUESS_REGION_RU),
+    ComboItem (N_("Taiwanese"), GUESS_REGION_TW),
+    ComboItem (N_("Turkish"), GUESS_REGION_TR)
+};
+#endif
+
+static const ComboItem bitdepth_elements[] = {
+    ComboItem ("16", 16),
+    ComboItem ("24", 24),
+    ComboItem ("32", 32),
+    ComboItem (N_("Floating point"), 0)
+};
+
+static Index<ComboItem> iface_combo_elements;
+static int iface_combo_selected;
+static GtkWidget * iface_prefs_box;
+
+static ArrayRef<ComboItem> iface_combo_fill ();
+static void iface_combo_changed ();
+static void * iface_create_prefs_box ();
+
+static const PreferencesWidget appearance_page_widgets[] = {
+    WidgetLabel (N_("<b>Interface Settings</b>")),
+    WidgetCombo (N_("Interface plugin:"),
+        WidgetInt (iface_combo_selected, iface_combo_changed),
+        {0, iface_combo_fill}),
+    WidgetCustomGTK (iface_create_prefs_box)
+};
+
+static Index<ComboItem> output_combo_elements;
+static int output_combo_selected;
+static GtkWidget * output_config_button;
+static GtkWidget * output_about_button;
+
+static ArrayRef<ComboItem> output_combo_fill ();
+static void output_combo_changed ();
+static void * output_create_config_button ();
+static void * output_create_about_button ();
+static void output_bit_depth_changed ();
+
+static const PreferencesWidget output_combo_widgets[] = {
+    WidgetCombo (N_("Output plugin:"),
+        WidgetInt (output_combo_selected, output_combo_changed),
+        {0, output_combo_fill}),
+    WidgetCustomGTK (output_create_config_button),
+    WidgetCustomGTK (output_create_about_button)
+};
+
+static const PreferencesWidget audio_page_widgets[] = {
+    WidgetLabel (N_("<b>Output Settings</b>")),
+    WidgetBox ({{output_combo_widgets}, true}),
+    WidgetCombo (N_("Bit depth:"),
+        WidgetInt (0, "output_bit_depth", output_bit_depth_changed),
+        {{bitdepth_elements}}),
+    WidgetSpin (N_("Buffer size:"),
+        WidgetInt (0, "output_buffer_size"),
+        {100, 10000, 1000, N_("ms")}),
+    WidgetCheck (N_("Soft clipping"),
+        WidgetBool (0, "soft_clipping")),
+    WidgetCheck (N_("Use software volume control (not recommended)"),
+        WidgetBool (0, "software_volume_control")),
+    WidgetLabel (N_("<b>Replay Gain</b>")),
+    WidgetCheck (N_("Enable Replay Gain"),
+        WidgetBool (0, "enable_replay_gain")),
+    WidgetCheck (N_("Album mode"),
+        WidgetBool (0, "replay_gain_album"),
+        WIDGET_CHILD),
+    WidgetCheck (N_("Prevent clipping (recommended)"),
+        WidgetBool (0, "enable_clipping_prevention"),
+        WIDGET_CHILD),
+    WidgetLabel (N_("<b>Adjust Levels</b>"),
+        WIDGET_CHILD),
+    WidgetSpin (N_("Amplify all files:"),
+        WidgetFloat (0, "replay_gain_preamp"),
+        {-15, 15, 0.1, N_("dB")},
+        WIDGET_CHILD),
+    WidgetSpin (N_("Amplify untagged files:"),
+        WidgetFloat (0, "default_gain"),
+        {-15, 15, 0.1, N_("dB")},
+        WIDGET_CHILD)
+};
+
+static const PreferencesWidget proxy_host_port_elements[] = {
+    WidgetEntry (N_("Proxy hostname:"),
+        WidgetString (0, "proxy_host")),
+    WidgetEntry (N_("Proxy port:"),
+        WidgetString (0, "proxy_port"))
+};
+
+static const PreferencesWidget proxy_auth_elements[] = {
+    WidgetEntry (N_("Proxy username:"),
+        WidgetString (0, "proxy_user")),
+    WidgetEntry (N_("Proxy password:"),
+        WidgetString (0, "proxy_pass"),
+        {true})
+};
+
+static const PreferencesWidget connectivity_page_widgets[] = {
+    WidgetLabel (N_("<b>Network Settings</b>")),
+    WidgetSpin (N_("Buffer size:"),
+        WidgetInt (0, "net_buffer_kb"),
+        {16, 1024, 16, N_("KiB")}),
+    WidgetLabel (N_("<b>Proxy Configuration</b>")),
+    WidgetCheck (N_("Enable proxy usage"),
+        WidgetBool (0, "use_proxy")),
+    WidgetTable ({{proxy_host_port_elements}},
+        WIDGET_CHILD),
+    WidgetCheck (N_("Use authentication with proxy"),
+        WidgetBool (0, "use_proxy_auth")),
+    WidgetTable ({{proxy_auth_elements}},
+        WIDGET_CHILD)
+};
+
+static const PreferencesWidget chardet_elements[] = {
+#ifdef USE_CHARDET
+    WidgetCombo (N_("Auto character encoding detector for:"),
+        WidgetString (0, "chardet_detector"),
+        {{chardet_detector_presets}}),
+#endif
+    WidgetEntry (N_("Fallback character encodings:"),
+        WidgetString (0, "chardet_fallback"))
+};
+
+static void send_title_change ();
+static void * create_titlestring_table ();
+
+static const PreferencesWidget playlist_page_widgets[] = {
+    WidgetLabel (N_("<b>Behavior</b>")),
+    WidgetCheck (N_("Resume playback on startup"),
+        WidgetBool (0, "resume_playback_on_startup")),
+    WidgetCheck (N_("Pause instead of resuming immediately"),
+        WidgetBool (0, "always_resume_paused"),
+        WIDGET_CHILD),
+    WidgetCheck (N_("Advance when the current song is deleted"),
+        WidgetBool (0, "advance_on_delete")),
+    WidgetCheck (N_("Clear the playlist when opening files"),
+        WidgetBool (0, "clear_playlist")),
+    WidgetCheck (N_("Open files in a temporary playlist"),
+        WidgetBool (0, "open_to_temporary")),
+    WidgetLabel (N_("<b>Compatibility</b>")),
+    WidgetCheck (N_("Interpret \\ (backward slash) as a folder delimiter"),
+        WidgetBool (0, "convert_backslash")),
+    WidgetTable ({{chardet_elements}}),
+    WidgetLabel (N_("<b>Song Display</b>")),
+    WidgetCheck (N_("Show song numbers"),
+        WidgetBool (0, "show_numbers_in_pl", send_title_change)),
+    WidgetCheck (N_("Show leading zeroes (02:00 instead of 2:00)"),
+        WidgetBool (0, "leading_zero", send_title_change)),
+    WidgetCustomGTK (create_titlestring_table),
+    WidgetLabel (N_("<b>Advanced</b>")),
+    WidgetCheck (N_("Do not load metadata for songs until played"),
+        WidgetBool (0, "metadata_on_play")),
+    WidgetCheck (N_("Probe content of files with no recognized file name extension"),
+        WidgetBool (0, "slow_probe"))
+};
+
+static const PreferencesWidget song_info_page_widgets[] = {
+    WidgetLabel (N_("<b>Album Art</b>")),
+    WidgetLabel (N_("Search for images matching these words (comma-separated):")),
+    WidgetEntry (0, WidgetString (0, "cover_name_include")),
+    WidgetLabel (N_("Exclude images matching these words (comma-separated):")),
+    WidgetEntry (0, WidgetString (0, "cover_name_exclude")),
+    WidgetCheck (N_("Search for images matching song file name"),
+        WidgetBool (0, "use_file_cover")),
+    WidgetCheck (N_("Search recursively"),
+        WidgetBool (0, "recurse_for_cover")),
+    WidgetSpin (N_("Search depth:"),
+        WidgetInt (0, "recurse_for_cover_depth"),
+        {0, 100, 1},
+        WIDGET_CHILD),
+    WidgetLabel (N_("<b>Popup Information</b>")),
+    WidgetCheck (N_("Show popup information"),
+        WidgetBool (0, "show_filepopup_for_tuple")),
+    WidgetSpin (N_("Popup delay (tenths of a second):"),
+        WidgetInt (0, "filepopup_delay"),
+        {0, 100, 1},
+        WIDGET_CHILD),
+    WidgetCheck (N_("Show time scale for current song"),
+        WidgetBool (0, "filepopup_showprogressbar"),
+        WIDGET_CHILD)
+};
+
+#define TITLESTRING_NPRESETS 6
+
+static const char * const titlestring_presets[TITLESTRING_NPRESETS] = {
+    "${title}",
+    "${?artist:${artist} - }${title}",
+    "${?artist:${artist} - }${?album:${album} - }${title}",
+    "${?artist:${artist} - }${?album:${album} - }${?track-number:${track-number}. }${title}",
+    "${?artist:${artist} }${?album:[ ${album} ] }${?artist:- }${?track-number:${track-number}. }${title}",
+    "${?album:${album} - }${title}"
+};
+
+static const char * const titlestring_preset_names[TITLESTRING_NPRESETS] = {
+    N_("TITLE"),
+    N_("ARTIST - TITLE"),
+    N_("ARTIST - ALBUM - TITLE"),
+    N_("ARTIST - ALBUM - TRACK. TITLE"),
+    N_("ARTIST [ ALBUM ] - TRACK. TITLE"),
+    N_("ALBUM - TITLE")
+};
+
+static Index<ComboItem> fill_plugin_combo (PluginType type)
+{
+    Index<ComboItem> elems;
+    int i = 0;
+
+    for (PluginHandle * plugin : aud_plugin_list (type))
+        elems.append (aud_plugin_get_name (plugin), i ++);
+
+    return elems;
+}
+
+static void change_category (int category)
+{
+    if (aud_get_headless_mode () && category > CATEGORY_APPEARANCE)
+        category --;
+
+    GtkTreeSelection * selection = gtk_tree_view_get_selection ((GtkTreeView *) category_treeview);
+    GtkTreePath * path = gtk_tree_path_new_from_indices (category, -1);
+    gtk_tree_selection_select_path (selection, path);
+    gtk_tree_path_free (path);
+}
+
+static void category_changed (GtkTreeSelection * selection)
+{
+    GtkTreeModel * model;
+    GtkTreeIter iter;
+
+    if (gtk_tree_selection_get_selected (selection, & model, & iter))
+    {
+        GtkTreePath * path = gtk_tree_model_get_path (model, & iter);
+        int category = gtk_tree_path_get_indices (path)[0];
+        gtk_notebook_set_current_page ((GtkNotebook *) category_notebook, category);
+        gtk_tree_path_free (path);
+    }
+}
+
+static void send_title_change ()
+{
+    if (aud_drct_get_ready ())
+        hook_call ("title change", nullptr);
+}
+
+static void titlestring_tag_menu_cb (GtkMenuItem * menuitem, void * data)
+{
+    const char * separator = " - ";
+    auto tag = (const TitleFieldTag *) data;
+    int pos = gtk_editable_get_position ((GtkEditable *) titlestring_entry);
+
+    /* insert separator as needed */
+    if (gtk_entry_get_text ((GtkEntry *) titlestring_entry)[0])
+        gtk_editable_insert_text ((GtkEditable *) titlestring_entry, separator, -1, & pos);
+
+    gtk_editable_insert_text ((GtkEditable *) titlestring_entry, _(tag->tag), -1, & pos);
+    gtk_editable_set_position ((GtkEditable *) titlestring_entry, pos);
+}
+
+static void on_titlestring_help_button_clicked (GtkButton * button, void * menu)
+{
+    gtk_menu_popup ((GtkMenu *) menu, nullptr, nullptr, nullptr, nullptr, 0, GDK_CURRENT_TIME);
+}
+
+static void update_titlestring_cbox (GtkComboBox * cbox, const char * format)
+{
+    int preset;
+    for (preset = 0; preset < TITLESTRING_NPRESETS; preset ++)
+    {
+        if (! strcmp (titlestring_presets[preset], format))
+            break;
+    }
+
+    if (gtk_combo_box_get_active (cbox) != preset)
+        gtk_combo_box_set_active (cbox, preset);
+}
+
+static void on_titlestring_entry_changed (GtkEntry * entry, GtkComboBox * cbox)
+{
+    const char * format = gtk_entry_get_text (entry);
+    aud_set_str (nullptr, "generic_title_format", format);
+    update_titlestring_cbox (cbox, format);
+}
+
+static void on_titlestring_cbox_changed (GtkComboBox * cbox, GtkEntry * entry)
+{
+    int preset = gtk_combo_box_get_active (cbox);
+    if (preset < TITLESTRING_NPRESETS)
+        gtk_entry_set_text (entry, titlestring_presets[preset]);
+}
+
+static void fill_category_list (GtkTreeView * treeview, GtkNotebook * notebook)
+{
+    GtkTreeViewColumn * column = gtk_tree_view_column_new ();
+    gtk_tree_view_column_set_title (column, _("Category"));
+    gtk_tree_view_append_column (treeview, column);
+    gtk_tree_view_column_set_spacing (column, 2);
+
+    GtkCellRenderer * renderer = gtk_cell_renderer_pixbuf_new ();
+    gtk_tree_view_column_pack_start (column, renderer, false);
+    gtk_tree_view_column_set_attributes (column, renderer, "pixbuf", 0, nullptr);
+
+    renderer = gtk_cell_renderer_text_new ();
+    gtk_tree_view_column_pack_start (column, renderer, false);
+    gtk_tree_view_column_set_attributes (column, renderer, "text", 1, nullptr);
+
+    g_object_set ((GObject *) renderer, "wrap-width", 106, "wrap-mode",
+     PANGO_WRAP_WORD_CHAR, nullptr);
+
+    GtkListStore * store = gtk_list_store_new (CATEGORY_VIEW_N_COLS,
+     GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT);
+    gtk_tree_view_set_model (treeview, (GtkTreeModel *) store);
+
+    const char * data_dir = aud_get_path (AudPath::DataDir);
+
+    for (const Category & category : categories)
+    {
+        if (& category == & categories[CATEGORY_APPEARANCE] && aud_get_headless_mode ())
+            continue;
+
+        GtkTreeIter iter;
+        gtk_list_store_append (store, & iter);
+        gtk_list_store_set (store, & iter, CATEGORY_VIEW_COL_NAME,
+         gettext (category.name), -1);
+
+        StringBuf path = filename_build ({data_dir, "images", category.icon_path});
+        GdkPixbuf * img = gdk_pixbuf_new_from_file (path, nullptr);
+
+        if (img)
+        {
+            gtk_list_store_set (store, & iter, CATEGORY_VIEW_COL_ICON, img, -1);
+            g_object_unref (img);
+        }
+    }
+
+    g_object_unref (store);
+
+    GtkTreeSelection * selection = gtk_tree_view_get_selection (treeview);
+    g_signal_connect (selection, "changed", (GCallback) category_changed, nullptr);
+}
+
+static GtkWidget * create_titlestring_tag_menu ()
+{
+    GtkWidget * titlestring_tag_menu = gtk_menu_new ();
+
+    for (const TitleFieldTag & tag : title_field_tags)
+    {
+        GtkWidget * menu_item = gtk_menu_item_new_with_label (_(tag.name));
+        gtk_menu_shell_append ((GtkMenuShell *) titlestring_tag_menu, menu_item);
+        g_signal_connect (menu_item, "activate",
+         (GCallback) titlestring_tag_menu_cb, (void *) & tag);
+    }
+
+    gtk_widget_show_all (titlestring_tag_menu);
+
+    return titlestring_tag_menu;
+}
+
+static void create_titlestring_widgets (GtkWidget * * cbox, GtkWidget * * entry)
+{
+    * cbox = gtk_combo_box_text_new ();
+    for (int i = 0; i < TITLESTRING_NPRESETS; i ++)
+        gtk_combo_box_text_append_text ((GtkComboBoxText *) * cbox, _(titlestring_preset_names[i]));
+    gtk_combo_box_text_append_text ((GtkComboBoxText *) * cbox, _("Custom"));
+
+    * entry = gtk_entry_new ();
+
+    String format = aud_get_str (nullptr, "generic_title_format");
+    update_titlestring_cbox ((GtkComboBox *) * cbox, format);
+    gtk_entry_set_text ((GtkEntry *) * entry, format);
+
+    g_signal_connect (* cbox, "changed", (GCallback) on_titlestring_cbox_changed, * entry);
+    g_signal_connect (* entry, "changed", (GCallback) on_titlestring_entry_changed, * cbox);
+}
+
+static void * create_titlestring_table ()
+{
+    GtkWidget * grid = gtk_table_new (0, 0, false);
+    gtk_table_set_row_spacings ((GtkTable *) grid, 6);
+    gtk_table_set_col_spacings ((GtkTable *) grid, 6);
+
+    GtkWidget * label = gtk_label_new (_("Title format:"));
+    gtk_misc_set_alignment ((GtkMisc *) label, 1, 0.5);
+    gtk_table_attach ((GtkTable *) grid, label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
+
+    label = gtk_label_new (_("Custom string:"));
+    gtk_misc_set_alignment ((GtkMisc *) label, 1, 0.5);
+    gtk_table_attach ((GtkTable *) grid, label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
+
+    GtkWidget * titlestring_cbox;
+    create_titlestring_widgets (& titlestring_cbox, & titlestring_entry);
+    gtk_table_attach_defaults ((GtkTable *) grid, titlestring_cbox, 1, 2, 0, 1);
+    gtk_table_attach_defaults ((GtkTable *) grid, titlestring_entry, 1, 2, 1, 2);
+
+    GtkWidget * titlestring_help_button = gtk_button_new ();
+    gtk_widget_set_can_focus (titlestring_help_button, false);
+    gtk_button_set_focus_on_click ((GtkButton *) titlestring_help_button, false);
+    gtk_button_set_relief ((GtkButton *) titlestring_help_button, GTK_RELIEF_HALF);
+    gtk_table_attach ((GtkTable *) grid, titlestring_help_button, 2, 3, 1, 2,
+     GTK_FILL, GTK_FILL, 0, 0);
+
+    GtkWidget * titlestring_tag_menu = create_titlestring_tag_menu ();
+
+    g_signal_connect (titlestring_help_button, "clicked",
+     (GCallback) on_titlestring_help_button_clicked, titlestring_tag_menu);
+
+    GtkWidget * image = gtk_image_new_from_icon_name ("list-add", GTK_ICON_SIZE_BUTTON);
+    gtk_container_add ((GtkContainer *) titlestring_help_button, image);
+
+    return grid;
+}
+
+static void create_playlist_category ()
+{
+    GtkWidget * vbox = gtk_vbox_new (false, 0);
+    gtk_container_add ((GtkContainer *) category_notebook, vbox);
+    audgui_create_widgets (vbox, playlist_page_widgets);
+}
+
+static void create_song_info_category ()
+{
+    GtkWidget * vbox = gtk_vbox_new (false, 0);
+    gtk_container_add ((GtkContainer *) category_notebook, vbox);
+    audgui_create_widgets (vbox, song_info_page_widgets);
+}
+
+static void iface_fill_prefs_box ()
+{
+    Plugin * header = (Plugin *) aud_plugin_get_header (aud_plugin_get_current (PluginType::Iface));
+    if (header && header->info.prefs)
+        audgui_create_widgets_with_domain (iface_prefs_box,
+         header->info.prefs->widgets, header->info.domain);
+}
+
+static int iface_combo_changed_finish (void *)
+{
+    iface_fill_prefs_box ();
+    gtk_widget_show_all (iface_prefs_box);
+
+    audgui_cleanup ();
+
+    return G_SOURCE_REMOVE;
+}
+
+static void iface_combo_changed ()
+{
+    /* prevent audgui from being shut down during the switch */
+    audgui_init ();
+
+    gtk_container_foreach ((GtkContainer *) iface_prefs_box,
+     (GtkCallback) gtk_widget_destroy, nullptr);
+
+    aud_plugin_enable (aud_plugin_list (PluginType::Iface)[iface_combo_selected], true);
+
+    /* now wait till we have restarted into the new main loop */
+    g_idle_add_full (G_PRIORITY_HIGH, iface_combo_changed_finish, nullptr, nullptr);
+}
+
+static ArrayRef<ComboItem> iface_combo_fill ()
+{
+    if (! iface_combo_elements.len ())
+    {
+        iface_combo_elements = fill_plugin_combo (PluginType::Iface);
+        iface_combo_selected = aud_plugin_list (PluginType::Iface).
+         find (aud_plugin_get_current (PluginType::Iface));
+    }
+
+    return {iface_combo_elements.begin (), iface_combo_elements.len ()};
+}
+
+static void * iface_create_prefs_box ()
+{
+    iface_prefs_box = gtk_vbox_new (false, 0);
+    iface_fill_prefs_box ();
+    return iface_prefs_box;
+}
+
+static void create_appearance_category ()
+{
+    GtkWidget * vbox = gtk_vbox_new (false, 0);
+    gtk_container_add ((GtkContainer *) category_notebook, vbox);
+    audgui_create_widgets (vbox, appearance_page_widgets);
+}
+
+static void output_combo_changed ()
+{
+    PluginHandle * plugin = aud_plugin_list (PluginType::Output)[output_combo_selected];
+
+    if (aud_plugin_enable (plugin, true))
+    {
+        gtk_widget_set_sensitive (output_config_button, aud_plugin_has_configure (plugin));
+        gtk_widget_set_sensitive (output_about_button, aud_plugin_has_about (plugin));
+    }
+}
+
+static ArrayRef<ComboItem> output_combo_fill ()
+{
+    if (! output_combo_elements.len ())
+    {
+        output_combo_elements = fill_plugin_combo (PluginType::Output);
+        output_combo_selected = aud_plugin_list (PluginType::Output)
+         .find (aud_plugin_get_current (PluginType::Output));
+    }
+
+    return {output_combo_elements.begin (), output_combo_elements.len ()};
+}
+
+static void output_bit_depth_changed ()
+{
+    aud_output_reset (OutputReset::ReopenStream);
+}
+
+static void output_do_config (void *)
+{
+    audgui_show_plugin_prefs (aud_plugin_get_current (PluginType::Output));
+}
+
+static void output_do_about (void *)
+{
+    audgui_show_plugin_about (aud_plugin_get_current (PluginType::Output));
+}
+
+static void * output_create_config_button ()
+{
+    gboolean enabled = aud_plugin_has_configure (aud_plugin_get_current (PluginType::Output));
+
+    output_config_button = audgui_button_new (_("_Settings"),
+     "preferences-system", output_do_config, nullptr);
+    gtk_widget_set_sensitive (output_config_button, enabled);
+
+    return output_config_button;
+}
+
+static void * output_create_about_button ()
+{
+    gboolean enabled = aud_plugin_has_about (aud_plugin_get_current (PluginType::Output));
+
+    output_about_button = audgui_button_new (_("_About"), "help-about", output_do_about, nullptr);
+    gtk_widget_set_sensitive (output_about_button, enabled);
+
+    return output_about_button;
+}
+
+static void create_audio_category ()
+{
+    GtkWidget * audio_page_vbox = gtk_vbox_new (false, 0);
+    audgui_create_widgets (audio_page_vbox, audio_page_widgets);
+    gtk_container_add ((GtkContainer *) category_notebook, audio_page_vbox);
+}
+
+static void create_connectivity_category ()
+{
+    GtkWidget * connectivity_page_vbox = gtk_vbox_new (false, 0);
+    gtk_container_add ((GtkContainer *) category_notebook, connectivity_page_vbox);
+
+    GtkWidget * vbox = gtk_vbox_new (false, 0);
+    gtk_box_pack_start ((GtkBox *) connectivity_page_vbox, vbox, true, true, 0);
+
+    audgui_create_widgets (vbox, connectivity_page_widgets);
+}
+
+static void create_plugin_category ()
+{
+    plugin_notebook = gtk_notebook_new ();
+    gtk_container_add ((GtkContainer *) category_notebook, plugin_notebook);
+
+    for (const PluginCategory & category : plugin_categories)
+        gtk_notebook_append_page ((GtkNotebook *) plugin_notebook,
+         plugin_view_new (category.type), gtk_label_new (_(category.name)));
+}
+
+static void destroy_cb ()
+{
+    prefswin = nullptr;
+    category_treeview = nullptr;
+    category_notebook = nullptr;
+    titlestring_entry = nullptr;
+
+    iface_combo_elements.clear ();
+    output_combo_elements.clear ();
+}
+
+static void create_prefs_window ()
+{
+    prefswin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_type_hint ((GtkWindow *) prefswin, GDK_WINDOW_TYPE_HINT_DIALOG);
+    gtk_container_set_border_width ((GtkContainer *) prefswin, 12);
+    gtk_window_set_title ((GtkWindow *) prefswin, _("Audacious Settings"));
+    gtk_window_set_default_size ((GtkWindow *) prefswin, 680, 400);
+
+    GtkWidget * vbox = gtk_vbox_new (false, 0);
+    gtk_container_add ((GtkContainer *) prefswin, vbox);
+
+    GtkWidget * hbox = gtk_hbox_new (false, 6);
+    gtk_box_pack_start ((GtkBox *) vbox, hbox, true, true, 0);
+
+    GtkWidget * scrolledwindow = gtk_scrolled_window_new (nullptr, nullptr);
+    gtk_box_pack_start ((GtkBox *) hbox, scrolledwindow, false, false, 0);
+    gtk_scrolled_window_set_policy ((GtkScrolledWindow *) scrolledwindow,
+     GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+    gtk_scrolled_window_set_shadow_type ((GtkScrolledWindow *) scrolledwindow, GTK_SHADOW_IN);
+
+    category_treeview = gtk_tree_view_new ();
+    gtk_container_add ((GtkContainer *) scrolledwindow, category_treeview);
+    gtk_widget_set_size_request (scrolledwindow, 168, -1);
+    gtk_tree_view_set_headers_visible ((GtkTreeView *) category_treeview, false);
+
+    category_notebook = gtk_notebook_new ();
+    gtk_box_pack_start ((GtkBox *) hbox, category_notebook, true, true, 0);
+
+    gtk_widget_set_can_focus (category_notebook, false);
+    gtk_notebook_set_show_tabs ((GtkNotebook *) category_notebook, false);
+    gtk_notebook_set_show_border ((GtkNotebook *) category_notebook, false);
+
+    if (! aud_get_headless_mode ())
+        create_appearance_category ();
+
+    create_audio_category ();
+    create_connectivity_category ();
+    create_playlist_category ();
+    create_song_info_category ();
+    create_plugin_category ();
+
+    GtkWidget * hseparator = gtk_hseparator_new ();
+    gtk_box_pack_start ((GtkBox *) vbox, hseparator, false, false, 6);
+
+    hbox = gtk_hbox_new (false, 0);
+    gtk_box_pack_start ((GtkBox *) vbox, hbox, false, false, 0);
+
+    GtkWidget * audversionlabel = gtk_label_new (aud_version_string);
+    gtk_box_pack_start ((GtkBox *) hbox, audversionlabel, false, false, 0);
+    gtk_label_set_use_markup ((GtkLabel *) audversionlabel, true);
+
+    GtkWidget * prefswin_button_box = gtk_hbutton_box_new ();
+    gtk_box_pack_start ((GtkBox *) hbox, prefswin_button_box, true, true, 0);
+    gtk_button_box_set_layout ((GtkButtonBox *) prefswin_button_box, GTK_BUTTONBOX_END);
+    gtk_box_set_spacing ((GtkBox *) prefswin_button_box, 6);
+
+    GtkWidget * close = audgui_button_new (_("_Close"), "window-close",
+     (AudguiCallback) gtk_widget_destroy, prefswin);
+    gtk_container_add ((GtkContainer *) prefswin_button_box, close);
+    gtk_widget_set_can_default (close, true);
+
+    fill_category_list ((GtkTreeView *) category_treeview, (GtkNotebook *) category_notebook);
+
+    gtk_widget_show_all (vbox);
+
+    g_signal_connect (prefswin, "destroy", (GCallback) destroy_cb, nullptr);
+
+    audgui_destroy_on_escape (prefswin);
+}
+
+EXPORT void audgui_show_prefs_window ()
+{
+    if (! prefswin)
+        create_prefs_window ();
+
+    change_category (CATEGORY_APPEARANCE);
+
+    gtk_window_present ((GtkWindow *) prefswin);
+}
+
+EXPORT void audgui_show_prefs_for_plugin_type (PluginType type)
+{
+    if (! prefswin)
+        create_prefs_window ();
+
+    if (type == PluginType::Iface)
+        change_category (CATEGORY_APPEARANCE);
+    else if (type == PluginType::Output)
+        change_category (CATEGORY_AUDIO);
+    else
+    {
+        change_category (CATEGORY_PLUGINS);
+
+        for (const PluginCategory & category : plugin_categories)
+        {
+            if (category.type == type)
+                gtk_notebook_set_current_page ((GtkNotebook *) plugin_notebook,
+                 & category - plugin_categories);
+        }
+    }
+
+    gtk_window_present ((GtkWindow *) prefswin);
+}
+
+EXPORT void audgui_hide_prefs_window ()
+{
+    if (prefswin)
+        gtk_widget_destroy (prefswin);
+}
diff --git a/src/libaudgui/queue-manager.c b/src/libaudgui/queue-manager.c
deleted file mode 100644
index 8718365461d4..000000000000
--- a/src/libaudgui/queue-manager.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * queue-manager.c
- * Copyright 2011-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-
-#include <audacious/i18n.h>
-#include <audacious/playlist.h>
-#include <libaudcore/hook.h>
-
-#include "init.h"
-#include "libaudgui.h"
-#include "libaudgui-gtk.h"
-#include "list.h"
-
-enum {
- COLUMN_ENTRY,
- COLUMN_TITLE};
-
-static void get_value (void * user, int row, int column, GValue * value)
-{
-    int list = aud_playlist_get_active ();
-    int entry = aud_playlist_queue_get_entry (list, row);
-
-    switch (column)
-    {
-    case COLUMN_ENTRY:
-        g_value_set_int (value, 1 + entry);
-        break;
-    case COLUMN_TITLE:;
-        char * title = aud_playlist_entry_get_title (list, entry, TRUE);
-        g_value_set_string (value, title);
-        str_unref (title);
-        break;
-    }
-}
-
-static bool_t get_selected (void * user, int row)
-{
-    int list = aud_playlist_get_active ();
-    return aud_playlist_entry_get_selected (list, aud_playlist_queue_get_entry (list, row));
-}
-
-static void set_selected (void * user, int row, bool_t selected)
-{
-    int list = aud_playlist_get_active ();
-    aud_playlist_entry_set_selected (list, aud_playlist_queue_get_entry (list, row), selected);
-}
-
-static void select_all (void * user, bool_t selected)
-{
-    int list = aud_playlist_get_active ();
-    int count = aud_playlist_queue_count (list);
-
-    for (int i = 0; i < count; i ++)
-        aud_playlist_entry_set_selected (list, aud_playlist_queue_get_entry (list, i), selected);
-}
-
-static void shift_rows (void * user, int row, int before)
-{
-    GArray * shift = g_array_new (FALSE, FALSE, sizeof (int));
-    int list = aud_playlist_get_active ();
-    int count = aud_playlist_queue_count (list);
-
-    for (int i = 0; i < count; i ++)
-    {
-        int entry = aud_playlist_queue_get_entry (list, i);
-
-        if (aud_playlist_entry_get_selected (list, entry))
-        {
-            g_array_append_val (shift, entry);
-
-            if (i < before)
-                before --;
-        }
-    }
-
-    aud_playlist_queue_delete_selected (list);
-
-    for (int i = 0; i < shift->len; i ++)
-        aud_playlist_queue_insert (list, before + i, g_array_index (shift, int, i));
-
-    g_array_free (shift, TRUE);
-}
-
-static const AudguiListCallbacks callbacks = {
- .get_value = get_value,
- .get_selected = get_selected,
- .set_selected = set_selected,
- .select_all = select_all,
- .shift_rows = shift_rows};
-
-static void remove_selected (void * unused)
-{
-    int list = aud_playlist_get_active ();
-    int count = aud_playlist_queue_count (list);
-
-    for (int i = 0; i < count; )
-    {
-        int entry = aud_playlist_queue_get_entry (list, i);
-
-        if (aud_playlist_entry_get_selected (list, entry))
-        {
-            aud_playlist_queue_delete (list, i, 1);
-            aud_playlist_entry_set_selected (list, entry, FALSE);
-            count --;
-        }
-        else
-            i ++;
-    }
-}
-
-static void update_hook (void * data, void * user)
-{
-    GtkWidget * qm_list = user;
-
-    int oldrows = audgui_list_row_count (qm_list);
-    int newrows = aud_playlist_queue_count (aud_playlist_get_active ());
-    int focus = audgui_list_get_focus (qm_list);
-
-    audgui_list_update_rows (qm_list, 0, MIN (oldrows, newrows));
-    audgui_list_update_selection (qm_list, 0, MIN (oldrows, newrows));
-
-    if (newrows > oldrows)
-        audgui_list_insert_rows (qm_list, oldrows, newrows - oldrows);
-    if (newrows < oldrows)
-        audgui_list_delete_rows (qm_list, newrows, oldrows - newrows);
-
-    if (focus > newrows - 1)
-        audgui_list_set_focus (qm_list, newrows - 1);
-}
-
-static void destroy_cb (void)
-{
-    hook_dissociate ("playlist activate", update_hook);
-    hook_dissociate ("playlist update", update_hook);
-}
-
-static bool_t keypress_cb (GtkWidget * widget, GdkEventKey * event)
-{
-    if (event->keyval == GDK_KEY_A && (event->state & GDK_CONTROL_MASK))
-        select_all (NULL, TRUE);
-    else if (event->keyval == GDK_KEY_Delete)
-        remove_selected (NULL);
-    else if (event->keyval == GDK_KEY_Escape)
-        gtk_widget_destroy (widget);
-    else
-        return FALSE;
-
-    return TRUE;
-}
-
-static GtkWidget * create_queue_manager (void)
-{
-    GtkWidget * qm_win = gtk_dialog_new ();
-    gtk_window_set_title ((GtkWindow *) qm_win, _("Queue Manager"));
-    gtk_window_set_default_size ((GtkWindow *) qm_win, 400, 250);
-
-    GtkWidget * vbox = gtk_dialog_get_content_area ((GtkDialog *) qm_win);
-
-    GtkWidget * scrolled = gtk_scrolled_window_new (NULL, NULL);
-    gtk_scrolled_window_set_shadow_type ((GtkScrolledWindow *) scrolled, GTK_SHADOW_IN);
-    gtk_box_pack_start ((GtkBox *) vbox, scrolled, TRUE, TRUE, 0);
-
-    int count = aud_playlist_queue_count (aud_playlist_get_active ());
-    GtkWidget * qm_list = audgui_list_new (& callbacks, NULL, count);
-    gtk_tree_view_set_headers_visible ((GtkTreeView *) qm_list, FALSE);
-    audgui_list_add_column (qm_list, NULL, 0, G_TYPE_INT, 7);
-    audgui_list_add_column (qm_list, NULL, 1, G_TYPE_STRING, -1);
-    gtk_container_add ((GtkContainer *) scrolled, qm_list);
-
-    GtkWidget * button1 = audgui_button_new (_("_Unqueue"), "list-remove", remove_selected, NULL);
-    GtkWidget * button2 = audgui_button_new (_("_Close"), "window-close",
-     (AudguiCallback) gtk_widget_destroy, qm_win);
-
-    gtk_dialog_add_action_widget ((GtkDialog *) qm_win, button1, GTK_RESPONSE_NONE);
-    gtk_dialog_add_action_widget ((GtkDialog *) qm_win, button2, GTK_RESPONSE_NONE);
-
-    hook_associate ("playlist activate", update_hook, qm_list);
-    hook_associate ("playlist update", update_hook, qm_list);
-
-    g_signal_connect (qm_win, "destroy", (GCallback) destroy_cb, NULL);
-    g_signal_connect (qm_win, "key-press-event", (GCallback) keypress_cb, NULL);
-
-    return qm_win;
-}
-
-EXPORT void audgui_queue_manager_show (void)
-{
-    if (! audgui_reshow_unique_window (AUDGUI_QUEUE_MANAGER_WINDOW))
-        audgui_show_unique_window (AUDGUI_QUEUE_MANAGER_WINDOW, create_queue_manager ());
-}
diff --git a/src/libaudgui/queue-manager.cc b/src/libaudgui/queue-manager.cc
new file mode 100644
index 000000000000..4e6ad7474525
--- /dev/null
+++ b/src/libaudgui/queue-manager.cc
@@ -0,0 +1,213 @@
+/*
+ * queue-manager.c
+ * Copyright 2011-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/playlist.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+#include "list.h"
+
+enum {
+    COLUMN_ENTRY,
+    COLUMN_TITLE
+};
+
+static void get_value (void * user, int row, int column, GValue * value)
+{
+    int list = aud_playlist_get_active ();
+    int entry = aud_playlist_queue_get_entry (list, row);
+
+    switch (column)
+    {
+    case COLUMN_ENTRY:
+        g_value_set_int (value, 1 + entry);
+        break;
+    case COLUMN_TITLE:;
+        Tuple tuple = aud_playlist_entry_get_tuple (list, entry, Playlist::Guess);
+        g_value_set_string (value, tuple.get_str (Tuple::FormattedTitle));
+        break;
+    }
+}
+
+static bool get_selected (void * user, int row)
+{
+    int list = aud_playlist_get_active ();
+    return aud_playlist_entry_get_selected (list, aud_playlist_queue_get_entry (list, row));
+}
+
+static void set_selected (void * user, int row, bool selected)
+{
+    int list = aud_playlist_get_active ();
+    aud_playlist_entry_set_selected (list, aud_playlist_queue_get_entry (list, row), selected);
+}
+
+static void select_all (void * user, bool selected)
+{
+    int list = aud_playlist_get_active ();
+    int count = aud_playlist_queue_count (list);
+
+    for (int i = 0; i < count; i ++)
+        aud_playlist_entry_set_selected (list, aud_playlist_queue_get_entry (list, i), selected);
+}
+
+static void shift_rows (void * user, int row, int before)
+{
+    GArray * shift = g_array_new (false, false, sizeof (int));
+    int list = aud_playlist_get_active ();
+    int count = aud_playlist_queue_count (list);
+
+    for (int i = 0; i < count; i ++)
+    {
+        int entry = aud_playlist_queue_get_entry (list, i);
+
+        if (aud_playlist_entry_get_selected (list, entry))
+        {
+            g_array_append_val (shift, entry);
+
+            if (i < before)
+                before --;
+        }
+    }
+
+    aud_playlist_queue_delete_selected (list);
+
+    for (unsigned i = 0; i < shift->len; i ++)
+        aud_playlist_queue_insert (list, before + i, g_array_index (shift, int, i));
+
+    g_array_free (shift, true);
+}
+
+static const AudguiListCallbacks callbacks = {
+    get_value,
+    get_selected,
+    set_selected,
+    select_all,
+    0,  // activate_row
+    0,  // right_click
+    shift_rows
+};
+
+static void remove_selected (void *)
+{
+    int list = aud_playlist_get_active ();
+    int count = aud_playlist_queue_count (list);
+
+    for (int i = 0; i < count; )
+    {
+        int entry = aud_playlist_queue_get_entry (list, i);
+
+        if (aud_playlist_entry_get_selected (list, entry))
+        {
+            aud_playlist_queue_delete (list, i, 1);
+            aud_playlist_entry_set_selected (list, entry, false);
+            count --;
+        }
+        else
+            i ++;
+    }
+}
+
+static void update_hook (void * data, void * user)
+{
+    GtkWidget * qm_list = (GtkWidget *) user;
+
+    int oldrows = audgui_list_row_count (qm_list);
+    int newrows = aud_playlist_queue_count (aud_playlist_get_active ());
+    int focus = audgui_list_get_focus (qm_list);
+
+    audgui_list_update_rows (qm_list, 0, aud::min (oldrows, newrows));
+    audgui_list_update_selection (qm_list, 0, aud::min (oldrows, newrows));
+
+    if (newrows > oldrows)
+        audgui_list_insert_rows (qm_list, oldrows, newrows - oldrows);
+    if (newrows < oldrows)
+        audgui_list_delete_rows (qm_list, newrows, oldrows - newrows);
+
+    if (focus > newrows - 1)
+        audgui_list_set_focus (qm_list, newrows - 1);
+}
+
+static void destroy_cb ()
+{
+    hook_dissociate ("playlist activate", update_hook);
+    hook_dissociate ("playlist update", update_hook);
+}
+
+static gboolean keypress_cb (GtkWidget * widget, GdkEventKey * event)
+{
+    if (event->keyval == GDK_KEY_A && (event->state & GDK_CONTROL_MASK))
+        select_all (nullptr, true);
+    else if (event->keyval == GDK_KEY_Delete)
+        remove_selected (nullptr);
+    else if (event->keyval == GDK_KEY_Escape)
+        gtk_widget_destroy (widget);
+    else
+        return false;
+
+    return true;
+}
+
+static GtkWidget * create_queue_manager ()
+{
+    GtkWidget * qm_win = gtk_dialog_new ();
+    gtk_window_set_title ((GtkWindow *) qm_win, _("Queue Manager"));
+    gtk_window_set_default_size ((GtkWindow *) qm_win, 400, 250);
+
+    GtkWidget * vbox = gtk_dialog_get_content_area ((GtkDialog *) qm_win);
+
+    GtkWidget * scrolled = gtk_scrolled_window_new (nullptr, nullptr);
+    gtk_scrolled_window_set_shadow_type ((GtkScrolledWindow *) scrolled, GTK_SHADOW_IN);
+    gtk_scrolled_window_set_policy ((GtkScrolledWindow *) scrolled,
+     GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+    gtk_box_pack_start ((GtkBox *) vbox, scrolled, true, true, 0);
+
+    int count = aud_playlist_queue_count (aud_playlist_get_active ());
+    GtkWidget * qm_list = audgui_list_new (& callbacks, nullptr, count);
+    gtk_tree_view_set_headers_visible ((GtkTreeView *) qm_list, false);
+    audgui_list_add_column (qm_list, nullptr, 0, G_TYPE_INT, 7);
+    audgui_list_add_column (qm_list, nullptr, 1, G_TYPE_STRING, -1);
+    gtk_container_add ((GtkContainer *) scrolled, qm_list);
+
+    GtkWidget * button1 = audgui_button_new (_("_Unqueue"), "list-remove", remove_selected, nullptr);
+    GtkWidget * button2 = audgui_button_new (_("_Close"), "window-close",
+     (AudguiCallback) gtk_widget_destroy, qm_win);
+
+    gtk_dialog_add_action_widget ((GtkDialog *) qm_win, button1, GTK_RESPONSE_NONE);
+    gtk_dialog_add_action_widget ((GtkDialog *) qm_win, button2, GTK_RESPONSE_NONE);
+
+    hook_associate ("playlist activate", update_hook, qm_list);
+    hook_associate ("playlist update", update_hook, qm_list);
+
+    g_signal_connect (qm_win, "destroy", (GCallback) destroy_cb, nullptr);
+    g_signal_connect (qm_win, "key-press-event", (GCallback) keypress_cb, nullptr);
+
+    return qm_win;
+}
+
+EXPORT void audgui_queue_manager_show ()
+{
+    if (! audgui_reshow_unique_window (AUDGUI_QUEUE_MANAGER_WINDOW))
+        audgui_show_unique_window (AUDGUI_QUEUE_MANAGER_WINDOW, create_queue_manager ());
+}
diff --git a/src/libaudgui/scaled-image.c b/src/libaudgui/scaled-image.c
deleted file mode 100644
index 70adcce752e0..000000000000
--- a/src/libaudgui/scaled-image.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * scaled-image.c
- * Copyright 2012-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <libaudgui/libaudgui-gtk.h>
-
-static GdkPixbuf * get_scaled (GtkWidget * widget, int maxwidth, int maxheight)
-{
-    GdkPixbuf * unscaled = g_object_get_data ((GObject *) widget, "pixbuf-unscaled");
-
-    if (! unscaled)
-        return NULL;
-
-    int width = gdk_pixbuf_get_width (unscaled);
-    int height = gdk_pixbuf_get_height (unscaled);
-
-    if (width > maxwidth || height > maxheight)
-    {
-        if (width * maxheight > height * maxwidth)
-        {
-            height = height * maxwidth / width;
-            width = maxwidth;
-        }
-        else
-        {
-            width = width * maxheight / height;
-            height = maxheight;
-        }
-    }
-
-    GdkPixbuf * scaled = g_object_get_data ((GObject *) widget, "pixbuf-scaled");
-
-    if (scaled)
-    {
-        if (gdk_pixbuf_get_width (scaled) == width && gdk_pixbuf_get_height (scaled) == height)
-            return scaled;
-
-        g_object_unref (scaled);
-    }
-
-    scaled = gdk_pixbuf_scale_simple (unscaled, width, height, GDK_INTERP_BILINEAR);
-    g_object_set_data ((GObject *) widget, "pixbuf-scaled", scaled);
-
-    return scaled;
-}
-
-static bool_t draw_cb (GtkWidget * widget, cairo_t * cr)
-{
-    GdkRectangle rect;
-    gtk_widget_get_allocation (widget, & rect);
-
-    GdkPixbuf * scaled = get_scaled (widget, rect.width, rect.height);
-
-    if (scaled)
-    {
-        int x = (rect.width - gdk_pixbuf_get_width (scaled)) / 2;
-        int y = (rect.height - gdk_pixbuf_get_height (scaled)) / 2;
-        gdk_cairo_set_source_pixbuf (cr, scaled, x, y);
-        cairo_paint (cr);
-    }
-
-    return TRUE;
-}
-
-EXPORT void audgui_scaled_image_set (GtkWidget * widget, GdkPixbuf * pixbuf)
-{
-    GdkPixbuf * old;
-
-    if ((old = g_object_get_data ((GObject *) widget, "pixbuf-unscaled")))
-        g_object_unref (old);
-    if ((old = g_object_get_data ((GObject *) widget, "pixbuf-scaled")))
-        g_object_unref (old);
-
-    if (pixbuf)
-        g_object_ref (pixbuf);
-
-    g_object_set_data ((GObject *) widget, "pixbuf-unscaled", pixbuf);
-    g_object_set_data ((GObject *) widget, "pixbuf-scaled", NULL);
-
-    if (! gtk_widget_in_destruction (widget))
-        gtk_widget_queue_draw (widget);
-}
-
-static void destroy_cb (GtkWidget * widget)
-{
-    audgui_scaled_image_set (widget, NULL);
-}
-
-EXPORT GtkWidget * audgui_scaled_image_new (GdkPixbuf * pixbuf)
-{
-    GtkWidget * widget = gtk_drawing_area_new ();
-
-    g_signal_connect (widget, "draw", (GCallback) draw_cb, NULL);
-    g_signal_connect (widget, "destroy", (GCallback) destroy_cb, NULL);
-
-    audgui_scaled_image_set (widget, pixbuf);
-
-    return widget;
-}
diff --git a/src/libaudgui/scaled-image.cc b/src/libaudgui/scaled-image.cc
new file mode 100644
index 000000000000..41c804a66d04
--- /dev/null
+++ b/src/libaudgui/scaled-image.cc
@@ -0,0 +1,116 @@
+/*
+ * scaled-image.c
+ * Copyright 2012-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <libaudgui/libaudgui-gtk.h>
+
+static GdkPixbuf * get_scaled (GtkWidget * widget, int maxwidth, int maxheight)
+{
+    GdkPixbuf * unscaled = (GdkPixbuf *) g_object_get_data ((GObject *) widget, "pixbuf-unscaled");
+
+    if (! unscaled)
+        return nullptr;
+
+    int width = gdk_pixbuf_get_width (unscaled);
+    int height = gdk_pixbuf_get_height (unscaled);
+
+    if (width > maxwidth || height > maxheight)
+    {
+        if (width * maxheight > height * maxwidth)
+        {
+            height = height * maxwidth / width;
+            width = maxwidth;
+        }
+        else
+        {
+            width = width * maxheight / height;
+            height = maxheight;
+        }
+    }
+
+    GdkPixbuf * scaled = (GdkPixbuf *) g_object_get_data ((GObject *) widget, "pixbuf-scaled");
+
+    if (scaled)
+    {
+        if (gdk_pixbuf_get_width (scaled) == width && gdk_pixbuf_get_height (scaled) == height)
+            return scaled;
+
+        g_object_unref (scaled);
+    }
+
+    scaled = gdk_pixbuf_scale_simple (unscaled, width, height, GDK_INTERP_BILINEAR);
+    g_object_set_data ((GObject *) widget, "pixbuf-scaled", scaled);
+
+    return scaled;
+}
+
+static int expose_cb (GtkWidget * widget, GdkEventExpose * event)
+{
+    GdkRectangle rect;
+    gtk_widget_get_allocation (widget, & rect);
+
+    GdkPixbuf * scaled = get_scaled (widget, rect.width, rect.height);
+
+    if (scaled)
+    {
+        int x = (rect.width - gdk_pixbuf_get_width (scaled)) / 2;
+        int y = (rect.height - gdk_pixbuf_get_height (scaled)) / 2;
+
+        cairo_t * cr = gdk_cairo_create (gtk_widget_get_window (widget));
+        gdk_cairo_set_source_pixbuf (cr, scaled, x, y);
+        cairo_paint (cr);
+        cairo_destroy (cr);
+    }
+
+    return true;
+}
+
+EXPORT void audgui_scaled_image_set (GtkWidget * widget, GdkPixbuf * pixbuf)
+{
+    GdkPixbuf * old;
+
+    if ((old = (GdkPixbuf *) g_object_get_data ((GObject *) widget, "pixbuf-unscaled")))
+        g_object_unref (old);
+    if ((old = (GdkPixbuf *) g_object_get_data ((GObject *) widget, "pixbuf-scaled")))
+        g_object_unref (old);
+
+    if (pixbuf)
+        g_object_ref (pixbuf);
+
+    g_object_set_data ((GObject *) widget, "pixbuf-unscaled", pixbuf);
+    g_object_set_data ((GObject *) widget, "pixbuf-scaled", nullptr);
+
+    gtk_widget_queue_draw (widget);
+}
+
+static void destroy_cb (GtkWidget * widget)
+{
+    audgui_scaled_image_set (widget, nullptr);
+}
+
+EXPORT GtkWidget * audgui_scaled_image_new (GdkPixbuf * pixbuf)
+{
+    GtkWidget * widget = gtk_drawing_area_new ();
+
+    g_signal_connect (widget, "expose-event", (GCallback) expose_cb, nullptr);
+    g_signal_connect (widget, "destroy", (GCallback) destroy_cb, nullptr);
+
+    audgui_scaled_image_set (widget, pixbuf);
+
+    return widget;
+}
diff --git a/src/libaudgui/status.cc b/src/libaudgui/status.cc
new file mode 100644
index 000000000000..fa04fd3f4e64
--- /dev/null
+++ b/src/libaudgui/status.cc
@@ -0,0 +1,107 @@
+/*
+ * status.c
+ * Copyright 2014 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gtk/gtk.h>
+
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+
+#include "internal.h"
+#include "libaudgui-gtk.h"
+
+static GtkWidget * progress_window;
+static GtkWidget * progress_label, * progress_label_2;
+static GtkWidget * error_window;
+
+static void create_progress_window ()
+{
+    progress_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_type_hint ((GtkWindow *) progress_window, GDK_WINDOW_TYPE_HINT_DIALOG);
+    gtk_window_set_title ((GtkWindow *) progress_window, _("Working ..."));
+    gtk_window_set_resizable ((GtkWindow *) progress_window, false);
+    gtk_container_set_border_width ((GtkContainer *) progress_window, 6);
+
+    GtkWidget * vbox = gtk_vbox_new (false, 6);
+    gtk_container_add ((GtkContainer *) progress_window, vbox);
+
+    progress_label = gtk_label_new (nullptr);
+    gtk_label_set_width_chars ((GtkLabel *) progress_label, 40);
+    gtk_label_set_max_width_chars ((GtkLabel *) progress_label, 40);
+    gtk_label_set_ellipsize ((GtkLabel *) progress_label, PANGO_ELLIPSIZE_MIDDLE);
+    gtk_box_pack_start ((GtkBox *) vbox, progress_label, false, false, 0);
+
+    progress_label_2 = gtk_label_new (nullptr);
+    gtk_label_set_width_chars ((GtkLabel *) progress_label_2, 40);
+    gtk_label_set_max_width_chars ((GtkLabel *) progress_label_2, 40);
+    gtk_label_set_ellipsize ((GtkLabel *) progress_label, PANGO_ELLIPSIZE_MIDDLE);
+    gtk_box_pack_start ((GtkBox *) vbox, progress_label_2, false, false, 0);
+
+    gtk_widget_show_all (progress_window);
+
+    g_signal_connect (progress_window, "destroy",
+     (GCallback) gtk_widget_destroyed, & progress_window);
+}
+
+static void show_progress (void * data, void * user)
+{
+    if (! progress_window)
+        create_progress_window ();
+
+    gtk_label_set_text ((GtkLabel *) progress_label, (const char *) data);
+}
+
+static void show_progress_2 (void * data, void * user)
+{
+    if (! progress_window)
+        create_progress_window ();
+
+    gtk_label_set_text ((GtkLabel *) progress_label_2, (const char *) data);
+}
+
+static void hide_progress (void * data, void * user)
+{
+    if (progress_window)
+        gtk_widget_destroy (progress_window);
+}
+
+static void show_error (void * data, void * user)
+{
+    audgui_simple_message (& error_window, GTK_MESSAGE_ERROR, _("Error"), (const char *) data);
+}
+
+void status_init ()
+{
+    hook_associate ("ui show progress", show_progress, nullptr);
+    hook_associate ("ui show progress 2", show_progress_2, nullptr);
+    hook_associate ("ui hide progress", hide_progress, nullptr);
+    hook_associate ("ui show error", show_error, nullptr);
+}
+
+void status_cleanup ()
+{
+    hook_dissociate ("ui show progress", show_progress);
+    hook_dissociate ("ui show progress 2", show_progress_2);
+    hook_dissociate ("ui hide progress", hide_progress);
+    hook_dissociate ("ui show error", show_error);
+
+    if (progress_window)
+        gtk_widget_destroy (progress_window);
+    if (error_window)
+        gtk_widget_destroy (error_window);
+}
diff --git a/src/libaudgui/ui_fileopener.c b/src/libaudgui/ui_fileopener.c
deleted file mode 100644
index ae0ad1f38b91..000000000000
--- a/src/libaudgui/ui_fileopener.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * ui_fileopener.c
- * Copyright 2007-2013 Michael Färber and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gtk/gtk.h>
-
-#include <audacious/i18n.h>
-#include <audacious/drct.h>
-#include <audacious/misc.h>
-
-#include "init.h"
-#include "libaudgui.h"
-#include "libaudgui-gtk.h"
-
-static Index * get_files (GtkWidget * chooser)
-{
-    Index * index = index_new ();
-    GSList * list = gtk_file_chooser_get_uris ((GtkFileChooser *) chooser);
-
-    for (GSList * node = list; node; node = node->next)
-        index_insert (index, -1, str_get (node->data));
-
-    g_slist_free_full (list, g_free);
-    return index;
-}
-
-static void open_cb (void * data)
-{
-    GtkWidget * chooser = data;
-    Index * files = get_files (chooser);
-    bool_t open = GPOINTER_TO_INT (g_object_get_data ((GObject *) chooser, "do-open"));
-
-    if (open)
-        aud_drct_pl_open_list (files);
-    else
-        aud_drct_pl_add_list (files, -1);
-
-    GtkWidget * toggle = g_object_get_data ((GObject *) chooser, "toggle-button");
-    if (gtk_toggle_button_get_active ((GtkToggleButton *) toggle))
-        audgui_hide_filebrowser ();
-}
-
-static void destroy_cb (GtkWidget * chooser)
-{
-    char * path = gtk_file_chooser_get_current_folder ((GtkFileChooser *) chooser);
-    if (path)
-    {
-        aud_set_str ("audgui", "filesel_path", path);
-        g_free (path);
-    }
-}
-
-static void toggled_cb (GtkToggleButton * toggle, void * option)
-{
-    aud_set_bool ("audgui", (const char *) option, gtk_toggle_button_get_active (toggle));
-}
-
-static GtkWidget * create_filebrowser (bool_t open)
-{
-    const char * window_title, * verb, * icon, * toggle_text, * option;
-
-    if (open)
-    {
-        window_title = _("Open Files");
-        verb = _("_Open");
-        icon = "document-open";
-        toggle_text = _("Close _dialog on open");
-        option = "close_dialog_open";
-    }
-    else
-    {
-        window_title = _("Add Files");
-        verb = _("_Add");
-        icon = "list-add";
-        toggle_text = _("Close _dialog on add");
-        option = "close_dialog_add";
-    }
-
-    GtkWidget * window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-    gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DIALOG);
-    gtk_window_set_title(GTK_WINDOW(window), window_title);
-    gtk_window_set_default_size(GTK_WINDOW(window), 700, 450);
-    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
-
-    GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-    gtk_container_add(GTK_CONTAINER(window), vbox);
-
-    GtkWidget * chooser = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_OPEN);
-    gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(chooser), TRUE);
-
-    char * path = aud_get_str ("audgui", "filesel_path");
-    if (path[0])
-        gtk_file_chooser_set_current_folder ((GtkFileChooser *) chooser, path);
-    str_unref (path);
-
-    gtk_box_pack_start(GTK_BOX(vbox), chooser, TRUE, TRUE, 3);
-
-    GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-    gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 3);
-
-    GtkWidget * toggle = gtk_check_button_new_with_mnemonic (toggle_text);
-    gtk_toggle_button_set_active ((GtkToggleButton *) toggle, aud_get_bool ("audgui", option));
-    g_signal_connect (toggle, "toggled", (GCallback) toggled_cb, (void *) option);
-    gtk_box_pack_start(GTK_BOX(hbox), toggle, TRUE, TRUE, 3);
-
-    GtkWidget * bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
-    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
-    gtk_box_set_spacing(GTK_BOX(bbox), 6);
-    gtk_box_pack_end(GTK_BOX(hbox), bbox, TRUE, TRUE, 3);
-
-    GtkWidget * action_button = audgui_button_new (verb, icon, open_cb, chooser);
-    GtkWidget * close_button = audgui_button_new (_("_Close"), "window-close",
-     (AudguiCallback) audgui_hide_filebrowser, NULL);
-
-    gtk_container_add(GTK_CONTAINER(bbox), close_button);
-    gtk_container_add(GTK_CONTAINER(bbox), action_button);
-
-    gtk_widget_set_can_default (action_button, TRUE);
-    gtk_widget_grab_default (action_button);
-
-    g_object_set_data ((GObject *) chooser, "toggle-button", toggle);
-    g_object_set_data ((GObject *) chooser, "do-open", GINT_TO_POINTER (open));
-
-    g_signal_connect (chooser, "file-activated", (GCallback) open_cb, NULL);
-    g_signal_connect (chooser, "destroy", (GCallback) destroy_cb, NULL);
-
-    audgui_destroy_on_escape (window);
-
-    return window;
-}
-
-EXPORT void audgui_run_filebrowser (bool_t open)
-{
-    audgui_show_unique_window (AUDGUI_FILEBROWSER_WINDOW, create_filebrowser (open));
-}
-
-EXPORT void audgui_hide_filebrowser (void)
-{
-    audgui_hide_unique_window (AUDGUI_FILEBROWSER_WINDOW);
-}
diff --git a/src/libaudgui/ui_jumptotrack.c b/src/libaudgui/ui_jumptotrack.c
deleted file mode 100644
index 83addd425bdf..000000000000
--- a/src/libaudgui/ui_jumptotrack.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * ui_jumptotrack.c
- * Copyright 2007-2012 Yoshiki Yazawa and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-
-#include <audacious/drct.h>
-#include <audacious/i18n.h>
-#include <audacious/misc.h>
-#include <audacious/playlist.h>
-#include <libaudcore/hook.h>
-
-#include "init.h"
-#include "libaudgui.h"
-#include "libaudgui-gtk.h"
-#include "list.h"
-#include "ui_jumptotrack_cache.h"
-
-static void update_cb (void * data, void * user);
-static void activate_cb (void * data, void * user);
-
-static JumpToTrackCache* cache = NULL;
-static const GArray * search_matches;
-static GtkWidget * treeview, * filter_entry, * queue_button;
-static bool_t watching = FALSE;
-
-static void destroy_cb (void)
-{
-    if (watching)
-    {
-        hook_dissociate ("playlist update", update_cb);
-        hook_dissociate ("playlist activate", activate_cb);
-        watching = FALSE;
-    }
-
-    if (cache != NULL)
-    {
-        ui_jump_to_track_cache_free (cache);
-        cache = NULL;
-    }
-
-    search_matches = NULL;
-}
-
-static int get_selected_entry (void)
-{
-    g_return_val_if_fail (treeview && search_matches, -1);
-
-    GtkTreeModel * model = gtk_tree_view_get_model ((GtkTreeView *) treeview);
-    GtkTreeSelection * selection = gtk_tree_view_get_selection ((GtkTreeView *) treeview);
-    GtkTreeIter iter;
-
-    if (! gtk_tree_selection_get_selected (selection, NULL, & iter))
-        return -1;
-
-    GtkTreePath * path = gtk_tree_model_get_path (model, & iter);
-    int row = gtk_tree_path_get_indices (path)[0];
-    gtk_tree_path_free (path);
-
-    g_return_val_if_fail (row >= 0 && row < search_matches->len, -1);
-    return g_array_index (search_matches, int, row);
-}
-
-static void do_jump (void * unused)
-{
-    int entry = get_selected_entry ();
-    if (entry < 0)
-        return;
-
-    int playlist = aud_playlist_get_active ();
-    aud_playlist_set_position (playlist, entry);
-    aud_playlist_set_playing (playlist);
-    aud_drct_play ();
-
-    if (aud_get_bool ("audgui", "close_jtf_dialog"))
-        audgui_jump_to_track_hide();
-}
-
-static void update_queue_button (int entry)
-{
-    g_return_if_fail (queue_button);
-
-    if (entry < 0)
-    {
-        gtk_button_set_label ((GtkButton *) queue_button, _("_Queue"));
-        gtk_widget_set_sensitive (queue_button, FALSE);
-    }
-    else
-    {
-        if (aud_playlist_queue_find_entry (aud_playlist_get_active (), entry) != -1)
-            gtk_button_set_label ((GtkButton *) queue_button, _("Un_queue"));
-        else
-            gtk_button_set_label ((GtkButton *) queue_button, _("_Queue"));
-
-        gtk_widget_set_sensitive (queue_button, TRUE);
-    }
-}
-
-static void do_queue (void * unused)
-{
-    int playlist = aud_playlist_get_active ();
-    int entry = get_selected_entry ();
-    if (entry < 0)
-        return;
-
-    int queued = aud_playlist_queue_find_entry (playlist, entry);
-    if (queued >= 0)
-        aud_playlist_queue_delete (playlist, queued, 1);
-    else
-        aud_playlist_queue_insert (playlist, -1, entry);
-
-    update_queue_button (entry);
-}
-
-static void selection_changed (void)
-{
-    update_queue_button (get_selected_entry ());
-}
-
-static bool_t keypress_cb (GtkWidget * widget, GdkEventKey * event)
-{
-    if (event->keyval == GDK_KEY_Escape)
-    {
-        audgui_jump_to_track_hide();
-        return TRUE;
-    }
-
-    return FALSE;
-}
-
-static void fill_list (void)
-{
-    g_return_if_fail (treeview && filter_entry);
-
-    if (! cache)
-        cache = ui_jump_to_track_cache_new();
-
-    search_matches = ui_jump_to_track_cache_search (cache, gtk_entry_get_text
-     ((GtkEntry *) filter_entry));
-
-    audgui_list_delete_rows (treeview, 0, audgui_list_row_count (treeview));
-    audgui_list_insert_rows (treeview, 0, search_matches->len);
-
-    if (search_matches->len >= 1)
-    {
-        GtkTreeSelection * sel = gtk_tree_view_get_selection ((GtkTreeView *) treeview);
-        GtkTreePath * path = gtk_tree_path_new_from_indices (0, -1);
-        gtk_tree_selection_select_path (sel, path);
-        gtk_tree_path_free (path);
-    }
-}
-
-static void update_cb (void * data, void * user)
-{
-    g_return_if_fail (treeview);
-
-    GtkTreeModel * model;
-    GtkTreeIter iter;
-    GtkTreePath * path = NULL;
-
-    if (GPOINTER_TO_INT (data) <= PLAYLIST_UPDATE_SELECTION)
-        return;
-
-    if (cache != NULL)
-    {
-        ui_jump_to_track_cache_free (cache);
-        cache = NULL;
-    }
-
-    /* If it's only a metadata update, save and restore the cursor position. */
-    if (GPOINTER_TO_INT (data) <= PLAYLIST_UPDATE_METADATA &&
-     gtk_tree_selection_get_selected (gtk_tree_view_get_selection
-     ((GtkTreeView *) treeview), & model, & iter))
-        path = gtk_tree_model_get_path (model, & iter);
-
-    fill_list ();
-
-    if (path != NULL)
-    {
-        gtk_tree_selection_select_path (gtk_tree_view_get_selection
-         ((GtkTreeView *) treeview), path);
-        gtk_tree_view_scroll_to_cell ((GtkTreeView *) treeview, path, NULL, TRUE, 0.5, 0);
-        gtk_tree_path_free (path);
-    }
-}
-
-static void activate_cb (void * data, void * user)
-{
-    update_cb (GINT_TO_POINTER (PLAYLIST_UPDATE_STRUCTURE), NULL);
-}
-
-static void toggle_button_cb (GtkToggleButton * toggle, const char * setting)
-{
-    aud_set_bool ("audgui", setting, gtk_toggle_button_get_active (toggle));
-}
-
-static void list_get_value (void * user, int row, int column, GValue * value)
-{
-    g_return_if_fail (search_matches);
-    g_return_if_fail (column >= 0 && column < 2);
-    g_return_if_fail (row >= 0 && row < search_matches->len);
-
-    int playlist = aud_playlist_get_active ();
-    int entry = g_array_index (search_matches, int, row);
-
-    switch (column)
-    {
-    case 0:
-        g_value_set_int (value, 1 + entry);
-        break;
-    case 1:;
-        char * title = aud_playlist_entry_get_title (playlist, entry, TRUE);
-        g_return_if_fail (title);
-        g_value_set_string (value, title);
-        str_unref (title);
-        break;
-    }
-}
-
-static const AudguiListCallbacks callbacks = {
- .get_value = list_get_value};
-
-static GtkWidget * create_window (void)
-{
-    GtkWidget * jump_to_track_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-    gtk_window_set_type_hint(GTK_WINDOW(jump_to_track_win),
-                             GDK_WINDOW_TYPE_HINT_DIALOG);
-
-    gtk_window_set_title(GTK_WINDOW(jump_to_track_win), _("Jump to Song"));
-
-    g_signal_connect (jump_to_track_win, "key_press_event", (GCallback) keypress_cb, NULL);
-    g_signal_connect (jump_to_track_win, "destroy", (GCallback) destroy_cb, NULL);
-
-    gtk_container_set_border_width(GTK_CONTAINER(jump_to_track_win), 10);
-    gtk_window_set_default_size(GTK_WINDOW(jump_to_track_win), 600, 500);
-
-    GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
-    gtk_container_add(GTK_CONTAINER(jump_to_track_win), vbox);
-
-    treeview = audgui_list_new (& callbacks, NULL, 0);
-    gtk_tree_view_set_headers_visible ((GtkTreeView *) treeview, FALSE);
-
-    audgui_list_add_column (treeview, NULL, 0, G_TYPE_INT, 7);
-    audgui_list_add_column (treeview, NULL, 1, G_TYPE_STRING, -1);
-
-    g_signal_connect (gtk_tree_view_get_selection ((GtkTreeView *) treeview),
-     "changed", (GCallback) selection_changed, NULL);
-    g_signal_connect (treeview, "row-activated", (GCallback) do_jump, NULL);
-
-    GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3);
-
-    /* filter box */
-    GtkWidget * search_label = gtk_label_new (_("Filter: "));
-    gtk_label_set_markup_with_mnemonic(GTK_LABEL(search_label), _("_Filter:"));
-    gtk_box_pack_start(GTK_BOX(hbox), search_label, FALSE, FALSE, 0);
-
-    filter_entry = gtk_entry_new ();
-    gtk_label_set_mnemonic_widget ((GtkLabel *) search_label, filter_entry);
-    g_signal_connect (filter_entry, "changed", (GCallback) fill_list, NULL);
-    gtk_entry_set_activates_default ((GtkEntry *) filter_entry, TRUE);
-    gtk_box_pack_start ((GtkBox *) hbox, filter_entry, TRUE, TRUE, 0);
-
-    GtkWidget * scrollwin = gtk_scrolled_window_new (NULL, NULL);
-    gtk_container_add(GTK_CONTAINER(scrollwin), treeview);
-    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
-                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-    gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwin),
-                                        GTK_SHADOW_IN);
-    gtk_box_pack_start(GTK_BOX(vbox), scrollwin, TRUE, TRUE, 0);
-
-    GtkWidget * bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
-    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
-    gtk_box_set_spacing(GTK_BOX(bbox), 4);
-    gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
-    /* close dialog toggle */
-    GtkWidget * toggle = gtk_check_button_new_with_mnemonic (_("C_lose on jump"));
-    gtk_toggle_button_set_active ((GtkToggleButton *) toggle, aud_get_bool
-     ("audgui", "close_jtf_dialog"));
-    gtk_box_pack_start(GTK_BOX(bbox), toggle, FALSE, FALSE, 0);
-    g_signal_connect (toggle, "clicked", (GCallback) toggle_button_cb, "close_jtf_dialog");
-
-    /* queue button */
-    queue_button = audgui_button_new (_("_Queue"), NULL, do_queue, NULL);
-    gtk_box_pack_start ((GtkBox *) bbox, queue_button, FALSE, FALSE, 0);
-
-    /* jump button */
-    GtkWidget * jump = audgui_button_new (_("_Jump"), "go-jump", do_jump, NULL);
-    gtk_box_pack_start(GTK_BOX(bbox), jump, FALSE, FALSE, 0);
-
-    gtk_widget_set_can_default(jump, TRUE);
-    gtk_widget_grab_default(jump);
-
-    /* close button */
-    GtkWidget * close = audgui_button_new (_("_Close"), "window-close",
-     (AudguiCallback) audgui_jump_to_track_hide, NULL);
-    gtk_box_pack_start(GTK_BOX(bbox), close, FALSE, FALSE, 0);
-
-    return jump_to_track_win;
-}
-
-EXPORT void audgui_jump_to_track (void)
-{
-    if (audgui_reshow_unique_window (AUDGUI_JUMP_TO_TRACK_WINDOW))
-        return;
-
-    GtkWidget * jump_to_track_win = create_window ();
-
-    if (! watching)
-    {
-        fill_list ();
-        hook_associate ("playlist update", update_cb, NULL);
-        hook_associate ("playlist activate", activate_cb, NULL);
-        watching = TRUE;
-    }
-
-    gtk_widget_grab_focus (filter_entry);
-
-    audgui_show_unique_window (AUDGUI_JUMP_TO_TRACK_WINDOW, jump_to_track_win);
-}
-
-EXPORT void audgui_jump_to_track_hide (void)
-{
-    audgui_hide_unique_window (AUDGUI_JUMP_TO_TRACK_WINDOW);
-}
diff --git a/src/libaudgui/ui_jumptotrack_cache.c b/src/libaudgui/ui_jumptotrack_cache.c
deleted file mode 100644
index 21d4370b68e8..000000000000
--- a/src/libaudgui/ui_jumptotrack_cache.c
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- * ui_jumptotrack_cache.c
- * Copyright 2008-2012 Jussi Judin and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-
-#include <audacious/debug.h>
-#include <audacious/playlist.h>
-#include <libaudcore/audstrings.h>
-
-#include "ui_jumptotrack_cache.h"
-
-// Struct to keep information about matches from searches.
-typedef struct
-{
-    GArray * entries; // int
-    GArray * titles, * artists, * albums, * paths; // char * (pooled)
-} KeywordMatches;
-
-static void ui_jump_to_track_cache_init (JumpToTrackCache * cache);
-
-static KeywordMatches * keyword_matches_new (void)
-{
-    KeywordMatches * k = g_slice_new (KeywordMatches);
-    k->entries = g_array_new (FALSE, FALSE, sizeof (int));
-    k->titles = g_array_new (FALSE, FALSE, sizeof (char *));
-    k->artists = g_array_new (FALSE, FALSE, sizeof (char *));
-    k->albums = g_array_new (FALSE, FALSE, sizeof (char *));
-    k->paths = g_array_new (FALSE, FALSE, sizeof (char *));
-    return k;
-}
-
-static void keyword_matches_free (KeywordMatches * k)
-{
-    g_array_free (k->entries, TRUE);
-    g_array_free (k->titles, TRUE);
-    g_array_free (k->artists, TRUE);
-    g_array_free (k->albums, TRUE);
-    g_array_free (k->paths, TRUE);
-    g_slice_free (KeywordMatches, k);
-}
-
-/**
- * Creates an regular expression list usable in searches from search keyword.
- *
- * In searches, every regular expression on this list is matched against
- * the search title and if they all match, the title is declared as
- * matching one.
- *
- * Regular expressions in list are formed by splitting the 'keyword' to words
- * by splitting the keyword string with space character.
- */
-static GSList*
-ui_jump_to_track_cache_regex_list_create(const GString* keyword)
-{
-    GSList *regex_list = NULL;
-    char **words = NULL;
-    int i = -1;
-    /* Chop the key string into ' '-separated key regex-pattern strings */
-    words = g_strsplit(keyword->str, " ", 0);
-
-    /* create a list of regex using the regex-pattern strings */
-    while ( words[++i] != NULL )
-    {
-        // Ignore empty words.
-        if (words[i][0] == 0) {
-            continue;
-        }
-
-        GRegex * regex = g_regex_new (words[i], G_REGEX_CASELESS, 0, NULL);
-        if (regex)
-            regex_list = g_slist_append (regex_list, regex);
-    }
-
-    g_strfreev(words);
-
-    return regex_list;
-}
-
-/**
- * Checks if 'song' matches all regular expressions in 'regex_list'.
- */
-static bool_t
-ui_jump_to_track_match(const char * song, GSList *regex_list)
-{
-    if ( song == NULL )
-        return FALSE;
-
-    for ( ; regex_list ; regex_list = g_slist_next(regex_list) )
-    {
-        GRegex * regex = regex_list->data;
-        if (! g_regex_match (regex, song, 0, NULL))
-            return FALSE;
-    }
-
-    return TRUE;
-}
-
-/**
- * Returns all songs that match 'keyword'.
- *
- * Searches are conducted against entries in 'search_space' variable
- * and after the search, search result is added to 'cache'.
- *
- * @param cache The result of this search is added to cache.
- * @param search_space Entries inside which the search is conducted.
- * @param keyword Normalized string for searches.
- */
-static GArray*
-ui_jump_to_track_cache_match_keyword(JumpToTrackCache* cache,
-                                     const KeywordMatches* search_space,
-                                     const GString* keyword)
-{
-    GSList* regex_list = ui_jump_to_track_cache_regex_list_create(keyword);
-
-    KeywordMatches * k = keyword_matches_new ();
-
-    for (int i = 0; i < search_space->entries->len; i ++)
-    {
-        char * title = g_array_index (search_space->titles, char *, i);
-        char * artist = g_array_index (search_space->artists, char *, i);
-        char * album = g_array_index (search_space->albums, char *, i);
-        char * path = g_array_index (search_space->paths, char *, i);
-        bool_t match;
-
-        if (regex_list != NULL)
-            match = ui_jump_to_track_match (title, regex_list)
-             || ui_jump_to_track_match (artist, regex_list)
-             || ui_jump_to_track_match (album, regex_list)
-             || ui_jump_to_track_match (path, regex_list);
-        else
-            match = TRUE;
-
-        if (match) {
-            g_array_append_val (k->entries, g_array_index (search_space->entries, int, i));
-            g_array_append_val (k->titles, title);
-            g_array_append_val (k->artists, artist);
-            g_array_append_val (k->albums, album);
-            g_array_append_val (k->paths, path);
-        }
-    }
-
-    g_hash_table_insert (cache->keywords, GINT_TO_POINTER (g_string_hash (keyword)), k);
-
-    g_slist_free_full (regex_list, (GDestroyNotify) g_regex_unref);
-
-    return k->entries;
-}
-
-/**
- * Frees the possibly allocated data in KeywordMatches.
- */
-static void
-ui_jump_to_track_cache_free_keywordmatch_data(KeywordMatches* match_entry)
-{
-    for (int i = 0; i < match_entry->entries->len; i ++)
-    {
-        str_unref (g_array_index (match_entry->titles, char *, i));
-        str_unref (g_array_index (match_entry->artists, char *, i));
-        str_unref (g_array_index (match_entry->albums, char *, i));
-        str_unref (g_array_index (match_entry->paths, char *, i));
-    }
-}
-
-/**
- * Creates a new song search cache.
- *
- * Returned value should be freed with ui_jump_to_track_cache_free() function.
- */
-JumpToTrackCache*
-ui_jump_to_track_cache_new()
-{
-    JumpToTrackCache * cache = g_slice_new (JumpToTrackCache);
-
-    cache->keywords = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) keyword_matches_free);
-    ui_jump_to_track_cache_init (cache);
-    return cache;
-}
-
-/**
- * Clears the search cache.
- */
-static void
-ui_jump_to_track_cache_clear(JumpToTrackCache* cache)
-{
-    GString* empty_keyword = g_string_new("");
-    gpointer found_keyword = NULL;
-
-    // All normalized titles reside in an empty key "" so we'll free them
-    // first.
-    found_keyword = g_hash_table_lookup(cache->keywords,
-                                        GINT_TO_POINTER(g_string_hash(empty_keyword)));
-    g_string_free(empty_keyword,
-                  TRUE);
-    if (found_keyword != NULL)
-    {
-        KeywordMatches* all_titles = (KeywordMatches*)found_keyword;
-        ui_jump_to_track_cache_free_keywordmatch_data(all_titles);
-    }
-    // Now when all normalized strings are freed, no need to worry about
-    // double frees or memory leaks.
-    g_hash_table_remove_all(cache->keywords);
-}
-
-/**
- * Initializes the search cache if cache is empty or has wrong playlist.
- */
-static void ui_jump_to_track_cache_init (JumpToTrackCache * cache)
-{
-    // Reset cache state
-    ui_jump_to_track_cache_clear(cache);
-
-    // Initialize cache with playlist data
-    int playlist = aud_playlist_get_active ();
-    int entries = aud_playlist_entry_count (playlist);
-
-    KeywordMatches * k = keyword_matches_new ();
-
-    for (int entry = 0; entry < entries; entry ++)
-    {
-        char * title, * artist, * album;
-        aud_playlist_entry_describe (playlist, entry, & title, & artist, & album, TRUE);
-
-        char * uri = aud_playlist_entry_get_filename (playlist, entry);
-        char * decoded = uri_to_display (uri);
-        str_unref (uri);
-
-        g_array_append_val (k->entries, entry);
-        g_array_append_val (k->titles, title);
-        g_array_append_val (k->artists, artist);
-        g_array_append_val (k->albums, album);
-        g_array_append_val (k->paths, decoded);
-    }
-
-    // Finally insert all titles into cache into an empty key "" so that
-    // the matchable data has specified place to be.
-    GString * empty_keyword = g_string_new ("");
-    g_hash_table_insert (cache->keywords, GINT_TO_POINTER (g_string_hash (empty_keyword)), k);
-    g_string_free (empty_keyword, TRUE);
-}
-
-/**
- * Searches 'keyword' inside 'playlist' by using 'cache' to speed up searching.
- *
- * Searches are basically conducted as follows:
- *
- * Cache is checked if it has the information about right playlist and
- * initialized with playlist data if needed.
- *
- * Keyword is normalized for searching (Unicode NFKD, case folding)
- *
- * Cache is checked if it has keyword and if it has, we can immediately get
- * the search results and return. If not, searching goes as follows:
- *
- * Search for the longest word that is in cache that matches the beginning
- * of keyword and use the cached matches as base for the current search.
- * The shortest word that can be matched against is the empty string "", so
- * there should always be matches in cache.
- *
- * After that conduct the search by splitting keyword into words separated
- * by space and using regular expressions.
- *
- * When the keyword is searched, search result is added to cache to
- * corresponding keyword that can be used as base for new searches.
- *
- * The motivation for caching is that to search word 'some cool song' one
- * has to type following strings that are all searched individually:
- *
- * s
- * so
- * som
- * some
- * some
- * some c
- * some co
- * some coo
- * some cool
- * some cool
- * some cool s
- * some cool so
- * some cool son
- * some cool song
- *
- * If the search results are cached in every phase and the result of
- * the maximum length matching string is used as base for concurrent
- * searches, we can probably get the matches reduced to some hundreds
- * after a few letters typed on playlists with thousands of songs and
- * reduce useless iteration quite a lot.
- *
- * Return: GArray of int
- */
-const GArray * ui_jump_to_track_cache_search (JumpToTrackCache * cache, const
- char * keyword)
-{
-    GString* keyword_string = g_string_new(keyword);
-    GString* match_string = g_string_new(keyword);
-    int match_string_length = keyword_string->len;
-
-    while (match_string_length >= 0)
-    {
-        gpointer string_ptr =  GINT_TO_POINTER(g_string_hash(match_string));
-        gpointer result_entries = g_hash_table_lookup(cache->keywords,
-                                                      string_ptr);
-        if (result_entries != NULL)
-        {
-            KeywordMatches* matched_entries = (KeywordMatches*)result_entries;
-            // if keyword matches something we have, we'll just return the list
-            // of matches that the keyword has.
-            if (match_string_length == keyword_string->len) {
-                g_string_free(keyword_string, TRUE);
-                g_string_free(match_string, TRUE);
-                return matched_entries->entries;
-            }
-
-            // Do normal search by using the result of previous search
-            // as search space.
-            GArray* result = ui_jump_to_track_cache_match_keyword(cache,
-                                                                  matched_entries,
-                                                                  keyword_string);
-            g_string_free(keyword_string, TRUE);
-            g_string_free(match_string, TRUE);
-            return result;
-        }
-        match_string_length--;
-        g_string_set_size(match_string, match_string_length);
-    }
-    // This should never, ever get to this point because there is _always_
-    // the empty string to match against.
-    AUDDBG("One should never get to this point. Something is really wrong with \
-cache->keywords hash table.");
-    abort ();
-}
-
-void ui_jump_to_track_cache_free (JumpToTrackCache * cache)
-{
-    ui_jump_to_track_cache_clear (cache);
-    g_hash_table_unref (cache->keywords);
-    g_slice_free (JumpToTrackCache, cache);
-}
diff --git a/src/libaudgui/ui_jumptotrack_cache.h b/src/libaudgui/ui_jumptotrack_cache.h
deleted file mode 100644
index 84528452b907..000000000000
--- a/src/libaudgui/ui_jumptotrack_cache.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * ui_jumptotrack_cache.h
- * Copyright 2008 Jussi Judin
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef LIBAUDGUI_UI_JUMPTOTRACK_CACHE_H
-#define LIBAUDGUI_UI_JUMPTOTRACK_CACHE_H
-
-#include <glib.h>
-
-typedef struct _JumpToTrackCache JumpToTrackCache;
-
-struct _JumpToTrackCache
-{
-    GHashTable* keywords;
-};
-
-extern JumpToTrackCache* ui_jump_to_track_cache_new(void);
-extern const GArray * ui_jump_to_track_cache_search (JumpToTrackCache * cache,
- const char * keyword);
-extern void ui_jump_to_track_cache_free(JumpToTrackCache* cache);
-
-#endif
diff --git a/src/libaudgui/ui_playlist_manager.c b/src/libaudgui/ui_playlist_manager.c
deleted file mode 100644
index 7e4294783e76..000000000000
--- a/src/libaudgui/ui_playlist_manager.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * ui_playlist_manager.c
- * Copyright 2006-2012 Giacomo Lozito, John Lindgren, and Thomas Lange
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <string.h>
-#include <gtk/gtk.h>
-
-#include <audacious/i18n.h>
-#include <audacious/misc.h>
-#include <audacious/drct.h>
-#include <audacious/playlist.h>
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-
-#include "init.h"
-#include "libaudgui.h"
-#include "libaudgui-gtk.h"
-#include "list.h"
-
-static void activate_row (void * user, int row);
-
-static void play_cb (void * unused)
-{
-    activate_row (NULL, aud_playlist_get_active ());
-}
-
-static void rename_cb (void * unused)
-{
-    audgui_show_playlist_rename (aud_playlist_get_active ());
-}
-
-static void new_cb (void * unused)
-{
-    aud_playlist_insert (aud_playlist_get_active () + 1);
-    aud_playlist_set_active (aud_playlist_get_active () + 1);
-}
-
-static void delete_cb (void * unused)
-{
-    audgui_confirm_playlist_delete (aud_playlist_get_active ());
-}
-
-static void get_value (void * user, int row, int column, GValue * value)
-{
-    switch (column)
-    {
-    case 0:;
-        char * title = aud_playlist_get_title (row);
-        g_value_set_string (value, title);
-        str_unref (title);
-        break;
-    case 1:
-        g_value_set_int (value, aud_playlist_entry_count (row));
-        break;
-    }
-}
-
-static bool_t get_selected (void * user, int row)
-{
-    return (row == aud_playlist_get_active ());
-}
-
-static void set_selected (void * user, int row, bool_t selected)
-{
-    if (selected)
-        aud_playlist_set_active (row);
-}
-
-static void select_all (void * user, bool_t selected)
-{
-}
-
-static void activate_row (void * user, int row)
-{
-    aud_playlist_set_active (row);
-    aud_drct_play_playlist (row);
-
-    if (aud_get_bool ("audgui", "playlist_manager_close_on_activate"))
-        audgui_hide_unique_window (AUDGUI_PLAYLIST_MANAGER_WINDOW);
-}
-
-static void shift_rows (void * user, int row, int before)
-{
-    if (before < row)
-        aud_playlist_reorder (row, before, 1);
-    else if (before - 1 > row)
-        aud_playlist_reorder (row, before - 1, 1);
-}
-
-static const AudguiListCallbacks callbacks = {
- .get_value = get_value,
- .get_selected = get_selected,
- .set_selected = set_selected,
- .select_all = select_all,
- .activate_row = activate_row,
- .right_click = NULL,
- .shift_rows = shift_rows,
- .data_type = NULL,
- .get_data = NULL,
- .receive_data = NULL};
-
-static bool_t search_cb (GtkTreeModel * model, int column, const char * key,
- GtkTreeIter * iter, void * user)
-{
-    GtkTreePath * path = gtk_tree_model_get_path (model, iter);
-    g_return_val_if_fail (path, TRUE);
-    int row = gtk_tree_path_get_indices (path)[0];
-    gtk_tree_path_free (path);
-
-    char * title = aud_playlist_get_title (row);
-    g_return_val_if_fail (title, TRUE);
-
-    Index * keys = str_list_to_index (key, " ");
-    int count = index_count (keys);
-
-    bool_t match = FALSE;
-
-    for (int i = 0; i < count; i ++)
-    {
-        if (strstr_nocase_utf8 (title, index_get (keys, i)))
-            match = TRUE;
-        else
-        {
-            match = FALSE;
-            break;
-        }
-    }
-
-    index_free_full (keys, (IndexFreeFunc) str_unref);
-    str_unref (title);
-
-    return ! match; /* TRUE == not matched, FALSE == matched */
-}
-
-static bool_t position_changed = FALSE;
-static bool_t playlist_activated = FALSE;
-
-static void update_hook (void * data, void * list)
-{
-    int rows = aud_playlist_count ();
-
-    if (GPOINTER_TO_INT (data) == PLAYLIST_UPDATE_STRUCTURE)
-    {
-        int old_rows = audgui_list_row_count (list);
-
-        if (rows < old_rows)
-            audgui_list_delete_rows (list, rows, old_rows - rows);
-        else if (rows > old_rows)
-            audgui_list_insert_rows (list, old_rows, rows - old_rows);
-
-        position_changed = TRUE;
-        playlist_activated = TRUE;
-    }
-
-    if (GPOINTER_TO_INT (data) >= PLAYLIST_UPDATE_METADATA)
-        audgui_list_update_rows (list, 0, rows);
-
-    if (playlist_activated)
-    {
-        audgui_list_set_focus (list, aud_playlist_get_active ());
-        audgui_list_update_selection (list, 0, rows);
-        playlist_activated = FALSE;
-    }
-
-    if (position_changed)
-    {
-        audgui_list_set_highlight (list, aud_playlist_get_playing ());
-        position_changed = FALSE;
-    }
-}
-
-static void activate_hook (void * data, void * list)
-{
-    if (aud_playlist_update_pending ())
-        playlist_activated = TRUE;
-    else
-    {
-        audgui_list_set_focus (list, aud_playlist_get_active ());
-        audgui_list_update_selection (list, 0, aud_playlist_count ());
-    }
-}
-
-static void position_hook (void * data, void * list)
-{
-    if (aud_playlist_update_pending ())
-        position_changed = TRUE;
-    else
-        audgui_list_set_highlight (list, aud_playlist_get_playing ());
-}
-
-static void close_on_activate_cb (GtkToggleButton * toggle)
-{
-    aud_set_bool ("audgui", "playlist_manager_close_on_activate",
-     gtk_toggle_button_get_active (toggle));
-}
-
-static void destroy_cb (GtkWidget * window)
-{
-    hook_dissociate ("playlist update", update_hook);
-    hook_dissociate ("playlist activate", activate_hook);
-    hook_dissociate ("playlist set playing", position_hook);
-}
-
-static GtkWidget * create_playlist_manager (void)
-{
-    GtkWidget * playman_win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-    gtk_window_set_type_hint ((GtkWindow *) playman_win, GDK_WINDOW_TYPE_HINT_DIALOG);
-    gtk_window_set_title ((GtkWindow *) playman_win, _("Playlist Manager"));
-    gtk_container_set_border_width ((GtkContainer *) playman_win, 6);
-    gtk_widget_set_size_request (playman_win, 400, 250);
-
-    g_signal_connect (playman_win, "destroy", (GCallback) destroy_cb, NULL);
-    audgui_destroy_on_escape (playman_win);
-
-    GtkWidget * playman_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
-    gtk_container_add ((GtkContainer *) playman_win, playman_vbox);
-
-    /* ListView */
-    GtkWidget * playman_pl_lv = audgui_list_new (& callbacks, NULL, aud_playlist_count ());
-    audgui_list_add_column (playman_pl_lv, _("Title"), 0, G_TYPE_STRING, -1);
-    audgui_list_add_column (playman_pl_lv, _("Entries"), 1, G_TYPE_INT, 7);
-    audgui_list_set_highlight (playman_pl_lv, aud_playlist_get_playing ());
-    gtk_tree_view_set_search_equal_func ((GtkTreeView *) playman_pl_lv,
-     search_cb, NULL, NULL);
-    hook_associate ("playlist update", update_hook, playman_pl_lv);
-    hook_associate ("playlist activate", activate_hook, playman_pl_lv);
-    hook_associate ("playlist set playing", position_hook, playman_pl_lv);
-
-    GtkWidget * playman_pl_lv_sw = gtk_scrolled_window_new (NULL, NULL);
-    gtk_scrolled_window_set_shadow_type ((GtkScrolledWindow *) playman_pl_lv_sw,
-     GTK_SHADOW_IN);
-    gtk_scrolled_window_set_policy ((GtkScrolledWindow *) playman_pl_lv_sw,
-     GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-    gtk_container_add ((GtkContainer *) playman_pl_lv_sw, playman_pl_lv);
-    gtk_box_pack_start ((GtkBox *) playman_vbox, playman_pl_lv_sw, TRUE, TRUE, 0);
-
-    /* ButtonBox */
-    GtkWidget * playman_button_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-    GtkWidget * new_button = audgui_button_new (_("_New"), "document-new", new_cb, NULL);
-    GtkWidget * delete_button = audgui_button_new (_("_Remove"), "edit-delete", delete_cb, NULL);
-    GtkWidget * rename_button = audgui_button_new (_("Ren_ame"), "insert-text", rename_cb, NULL);
-    GtkWidget * play_button = audgui_button_new (_("_Play"), "media-playback-start", play_cb, NULL);
-
-    gtk_container_add ((GtkContainer *) playman_button_hbox, new_button);
-    gtk_container_add ((GtkContainer *) playman_button_hbox, delete_button);
-    gtk_box_pack_end ((GtkBox *) playman_button_hbox, play_button, FALSE, FALSE, 0);
-    gtk_box_pack_end ((GtkBox *) playman_button_hbox, rename_button, FALSE, FALSE, 0);
-    gtk_container_add ((GtkContainer *) playman_vbox, playman_button_hbox);
-
-    /* CheckButton */
-    GtkWidget * hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-    gtk_box_pack_start ((GtkBox *) playman_vbox, hbox, FALSE, FALSE, 0);
-    GtkWidget * check_button = gtk_check_button_new_with_mnemonic
-     (_("_Close dialog on activating playlist"));
-    gtk_box_pack_start ((GtkBox *) hbox, check_button, FALSE, FALSE, 0);
-    gtk_toggle_button_set_active ((GtkToggleButton *) check_button, aud_get_bool
-     ("audgui", "playlist_manager_close_on_activate"));
-    g_signal_connect (check_button, "toggled", (GCallback) close_on_activate_cb, NULL);
-
-    return playman_win;
-}
-
-EXPORT void audgui_playlist_manager (void)
-{
-    if (! audgui_reshow_unique_window (AUDGUI_PLAYLIST_MANAGER_WINDOW))
-        audgui_show_unique_window (AUDGUI_PLAYLIST_MANAGER_WINDOW, create_playlist_manager ());
-}
diff --git a/src/libaudgui/urilist.c b/src/libaudgui/urilist.c
deleted file mode 100644
index 4f7576457236..000000000000
--- a/src/libaudgui/urilist.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * urilist.c
- * Copyright 2010-2011 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <string.h>
-#include <glib.h>
-
-#include <audacious/drct.h>
-#include <audacious/playlist.h>
-#include <libaudcore/audstrings.h>
-#include <libaudcore/vfs.h>
-
-#include "libaudgui.h"
-
-typedef void (* ForEachFunc) (char *, void *);
-
-static char * check_uri (char * name)
-{
-    char * new;
-
-    if (strstr (name, "://") || ! (new = filename_to_uri (name)))
-        return name;
-
-    str_unref (name);
-    return new;
-}
-
-static void urilist_for_each (const char * list, ForEachFunc func, void * user)
-{
-    const char * end, * next;
-
-    while (list[0])
-    {
-        if ((end = strstr (list, "\r\n")))
-            next = end + 2;
-        else if ((end = strchr (list, '\n')))
-            next = end + 1;
-        else
-            next = end = strchr (list, 0);
-
-        func (check_uri (str_nget (list, end - list)), user);
-        list = next;
-    }
-}
-
-static void add_to_index (char * name, Index * index)
-{
-    index_insert (index, -1, name);
-}
-
-EXPORT void audgui_urilist_open (const char * list)
-{
-    Index * filenames = index_new ();
-    urilist_for_each (list, (ForEachFunc) add_to_index, filenames);
-    aud_drct_pl_open_list (filenames);
-}
-
-EXPORT void audgui_urilist_insert (int playlist, int at, const char * list)
-{
-    Index * filenames = index_new ();
-    urilist_for_each (list, (ForEachFunc) add_to_index, filenames);
-    aud_playlist_entry_insert_batch (playlist, at, filenames, NULL, FALSE);
-}
-
-EXPORT char * audgui_urilist_create_from_selected (int playlist)
-{
-    int entries = aud_playlist_entry_count (playlist);
-    int space = 0;
-    int count, length;
-    char * name;
-    char * buffer, * set;
-
-    for (count = 0; count < entries; count ++)
-    {
-        if (! aud_playlist_entry_get_selected (playlist, count))
-            continue;
-
-        name = aud_playlist_entry_get_filename (playlist, count);
-        g_return_val_if_fail (name != NULL, NULL);
-        space += strlen (name) + 1;
-        str_unref (name);
-    }
-
-    if (! space)
-        return NULL;
-
-    buffer = g_malloc (space);
-    set = buffer;
-
-    for (count = 0; count < entries; count ++)
-    {
-        if (! aud_playlist_entry_get_selected (playlist, count))
-            continue;
-
-        name = aud_playlist_entry_get_filename (playlist, count);
-        g_return_val_if_fail (name != NULL, NULL);
-        length = strlen (name);
-        g_return_val_if_fail (length + 1 <= space, NULL);
-        memcpy (set, name, length);
-        set += length;
-        * set ++ = '\n';
-        space -= length + 1;
-        str_unref (name);
-    }
-
-    * -- set = 0; /* last newline replaced with null */
-    return buffer;
-}
diff --git a/src/libaudgui/urilist.cc b/src/libaudgui/urilist.cc
new file mode 100644
index 000000000000..4b9193c314f6
--- /dev/null
+++ b/src/libaudgui/urilist.cc
@@ -0,0 +1,114 @@
+/*
+ * urilist.c
+ * Copyright 2010-2011 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <string.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/drct.h>
+#include <libaudcore/mainloop.h>
+#include <libaudcore/multihash.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/tuple.h>
+#include <libaudcore/vfs.h>
+
+#include "libaudgui.h"
+
+static SimpleHash<String, Tuple> tuple_cache;
+static QueuedFunc cleanup_timer;
+
+void urilist_cleanup ()
+{
+    tuple_cache.clear ();
+    cleanup_timer.stop ();
+}
+
+static String check_uri (const char * name)
+{
+    if (! strstr (name, "://"))
+    {
+        StringBuf uri = filename_to_uri (name);
+        if (uri)
+            return String (uri);
+    }
+
+    return String (name);
+}
+
+static Index<PlaylistAddItem> urilist_to_index (const char * list)
+{
+    Index<PlaylistAddItem> index;
+    const char * end, * next;
+
+    while (list[0])
+    {
+        if ((end = strchr (list, '\n')))
+        {
+            next = end + 1;
+            if (end > list && end[-1] == '\r')
+                end --;
+        }
+        else
+            next = end = strchr (list, 0);
+
+        String filename = check_uri (str_copy (list, end - list));
+        const Tuple * tuple = tuple_cache.lookup (filename);
+
+        index.append (filename, tuple ? tuple->ref () : Tuple ());
+
+        list = next;
+    }
+
+    return index;
+}
+
+EXPORT void audgui_urilist_open (const char * list)
+{
+    aud_drct_pl_open_list (urilist_to_index (list));
+}
+
+EXPORT void audgui_urilist_insert (int playlist, int at, const char * list)
+{
+    aud_playlist_entry_insert_batch (playlist, at, urilist_to_index (list), false);
+}
+
+EXPORT Index<char> audgui_urilist_create_from_selected (int playlist)
+{
+    Index<char> buf;
+    int entries = aud_playlist_entry_count (playlist);
+
+    for (int count = 0; count < entries; count ++)
+    {
+        if (aud_playlist_entry_get_selected (playlist, count))
+        {
+            if (buf.len ())
+                buf.append ('\n');
+
+            String filename = aud_playlist_entry_get_filename (playlist, count);
+            Tuple tuple = aud_playlist_entry_get_tuple (playlist, count, Playlist::Nothing);
+
+            buf.insert (filename, -1, strlen (filename));
+            if (tuple)
+                tuple_cache.add (filename, std::move (tuple));
+        }
+    }
+
+    cleanup_timer.start (30000, [] (void *) { urilist_cleanup (); }, nullptr);
+
+    return buf;
+}
diff --git a/src/libaudgui/url-opener.c b/src/libaudgui/url-opener.c
deleted file mode 100644
index 3baf7e8fcb73..000000000000
--- a/src/libaudgui/url-opener.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * url-opener.c
- * Copyright 2012-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <gtk/gtk.h>
-
-#include <audacious/drct.h>
-#include <audacious/i18n.h>
-#include <audacious/misc.h>
-
-#include "init.h"
-#include "libaudgui.h"
-#include "libaudgui-gtk.h"
-
-static void open_cb (void * entry)
-{
-    const char * text = gtk_entry_get_text ((GtkEntry *) entry);
-    bool_t open = GPOINTER_TO_INT (g_object_get_data ((GObject *) entry, "open"));
-
-    if (open)
-        aud_drct_pl_open (text);
-    else
-        aud_drct_pl_add (text, -1);
-
-    aud_history_add (text);
-}
-
-static GtkWidget * create_url_opener (bool_t open)
-{
-    const char * title, * verb, * icon;
-
-    if (open)
-    {
-        title = _("Open URL");
-        verb = _("_Open");
-        icon = "document-open";
-    }
-    else
-    {
-        title = _("Add URL");
-        verb = _("_Add");
-        icon = "list-add";
-    }
-
-    GtkWidget * combo = gtk_combo_box_text_new_with_entry ();
-    GtkWidget * entry = gtk_bin_get_child ((GtkBin *) combo);
-    gtk_entry_set_activates_default ((GtkEntry *) entry, TRUE);
-
-    const char * item;
-    for (int i = 0; (item = aud_history_get (i)); i++)
-        gtk_combo_box_text_append_text ((GtkComboBoxText *) combo, item);
-
-    g_object_set_data ((GObject *) entry, "open", GINT_TO_POINTER (open));
-
-    GtkWidget * button1 = audgui_button_new (verb, icon, open_cb, entry);
-    GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop", NULL, NULL);
-
-    GtkWidget * dialog = audgui_dialog_new (GTK_MESSAGE_OTHER, title,
-     _("Enter URL:"), button1, button2);
-    gtk_widget_set_size_request (dialog, 400, -1);
-    audgui_dialog_add_widget (dialog, combo);
-
-    return dialog;
-}
-
-EXPORT void audgui_show_add_url_window (bool_t open)
-{
-    audgui_show_unique_window (AUDGUI_URL_OPENER_WINDOW, create_url_opener (open));
-}
diff --git a/src/libaudgui/url-opener.cc b/src/libaudgui/url-opener.cc
new file mode 100644
index 000000000000..e092a4f4e5a4
--- /dev/null
+++ b/src/libaudgui/url-opener.cc
@@ -0,0 +1,89 @@
+/*
+ * url-opener.c
+ * Copyright 2012-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <gtk/gtk.h>
+
+#include <libaudcore/drct.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/runtime.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+static void open_cb (void * entry)
+{
+    const char * text = gtk_entry_get_text ((GtkEntry *) entry);
+    gboolean open = GPOINTER_TO_INT (g_object_get_data ((GObject *) entry, "open"));
+
+    if (open)
+        aud_drct_pl_open (text);
+    else
+        aud_drct_pl_add (text, -1);
+
+    aud_history_add (text);
+}
+
+static GtkWidget * create_url_opener (bool open)
+{
+    const char * title, * verb, * icon;
+
+    if (open)
+    {
+        title = _("Open URL");
+        verb = _("_Open");
+        icon = "document-open";
+    }
+    else
+    {
+        title = _("Add URL");
+        verb = _("_Add");
+        icon = "list-add";
+    }
+
+    GtkWidget * combo = gtk_combo_box_text_new_with_entry ();
+    GtkWidget * entry = gtk_bin_get_child ((GtkBin *) combo);
+    gtk_entry_set_activates_default ((GtkEntry *) entry, true);
+
+    for (int i = 0;; i++)
+    {
+        String item = aud_history_get (i);
+        if (! item)
+            break;
+
+        gtk_combo_box_text_append_text ((GtkComboBoxText *) combo, item);
+    }
+
+    g_object_set_data ((GObject *) entry, "open", GINT_TO_POINTER (open));
+
+    GtkWidget * button1 = audgui_button_new (verb, icon, open_cb, entry);
+    GtkWidget * button2 = audgui_button_new (_("_Cancel"), "process-stop", nullptr, nullptr);
+
+    GtkWidget * dialog = audgui_dialog_new (GTK_MESSAGE_OTHER, title,
+     _("Enter URL:"), button1, button2);
+    gtk_widget_set_size_request (dialog, 400, -1);
+    audgui_dialog_add_widget (dialog, combo);
+
+    return dialog;
+}
+
+EXPORT void audgui_show_add_url_window (bool open)
+{
+    audgui_show_unique_window (AUDGUI_URL_OPENER_WINDOW, create_url_opener (open));
+}
diff --git a/src/libaudgui/util.c b/src/libaudgui/util.c
deleted file mode 100644
index 5fee88523545..000000000000
--- a/src/libaudgui/util.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * util.c
- * Copyright 2010-2012 John Lindgren and Michał Lipski
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <string.h>
-
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-
-#include <audacious/debug.h>
-#include <audacious/i18n.h>
-#include <audacious/misc.h>
-#include <libaudcore/audstrings.h>
-#include <libaudcore/hook.h>
-
-#include "init.h"
-#include "libaudgui.h"
-#include "libaudgui-gtk.h"
-
-EXPORT int audgui_get_digit_width (GtkWidget * widget)
-{
-    int width;
-    PangoLayout * layout = gtk_widget_create_pango_layout (widget, "0123456789");
-    PangoFontDescription * desc = pango_font_description_new ();
-    pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
-    pango_layout_set_font_description (layout, desc);
-    pango_layout_get_pixel_size (layout, & width, NULL);
-    pango_font_description_free (desc);
-    g_object_unref (layout);
-    return (width + 9) / 10;
-}
-
-EXPORT void audgui_get_mouse_coords (GtkWidget * widget, int * x, int * y)
-{
-    if (widget)
-    {
-        int xwin, ywin;
-        GdkRectangle alloc;
-
-        GdkWindow * window = gtk_widget_get_window (widget);
-        GdkDisplay * display = gdk_window_get_display (window);
-        GdkDeviceManager * manager = gdk_display_get_device_manager (display);
-        GdkDevice * device = gdk_device_manager_get_client_pointer (manager);
-
-        gdk_window_get_device_position (window, device, & xwin, & ywin, NULL);
-        gtk_widget_get_allocation (widget, & alloc);
-
-        * x = xwin - alloc.x;
-        * y = ywin - alloc.y;
-    }
-    else
-    {
-        GdkDisplay * display = gdk_display_get_default ();
-        GdkDeviceManager * manager = gdk_display_get_device_manager (display);
-        GdkDevice * device = gdk_device_manager_get_client_pointer (manager);
-        gdk_device_get_position (device, NULL, x, y);
-    }
-}
-
-static bool_t escape_destroy_cb (GtkWidget * widget, GdkEventKey * event)
-{
-    if (event->keyval == GDK_KEY_Escape)
-    {
-        gtk_widget_destroy (widget);
-        return TRUE;
-    }
-
-    return FALSE;
-}
-
-EXPORT void audgui_destroy_on_escape (GtkWidget * widget)
-{
-    g_signal_connect (widget, "key-press-event", (GCallback) escape_destroy_cb, NULL);
-}
-
-EXPORT GtkWidget * audgui_button_new (const char * text, const char * icon,
- AudguiCallback callback, void * data)
-{
-    GtkWidget * button = gtk_button_new_with_mnemonic (text);
-
-    if (icon)
-    {
-        GtkWidget * image = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_MENU);
-        gtk_button_set_image ((GtkButton *) button, image);
-    }
-
-    if (callback)
-        g_signal_connect_swapped (button, "clicked", (GCallback) callback, data);
-
-    return button;
-}
-
-static const char * icon_for_message_type (GtkMessageType type)
-{
-    switch (type)
-    {
-        case GTK_MESSAGE_INFO: return "dialog-information";
-        case GTK_MESSAGE_WARNING: return "dialog-warning";
-        case GTK_MESSAGE_QUESTION: return "dialog-question";
-        case GTK_MESSAGE_ERROR: return "dialog-error";
-        default: return NULL;
-    }
-}
-
-/* style choices should not be enforced by deprecating API functions */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
-EXPORT GtkWidget * audgui_dialog_new (GtkMessageType type, const char * title,
- const char * text, GtkWidget * button1, GtkWidget * button2)
-{
-    GtkWidget * dialog = gtk_message_dialog_new (NULL, 0, type, GTK_BUTTONS_NONE, "%s", text);
-    gtk_window_set_title ((GtkWindow *) dialog, title);
-
-    const char * icon = icon_for_message_type (type);
-    if (icon)
-    {
-        GtkWidget * image = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_DIALOG);
-        gtk_message_dialog_set_image ((GtkMessageDialog *) dialog, image);
-    }
-
-    if (button2)
-    {
-        gtk_dialog_add_action_widget ((GtkDialog *) dialog, button2, GTK_RESPONSE_NONE);
-        g_signal_connect_swapped (button2, "clicked", (GCallback) gtk_widget_destroy, dialog);
-    }
-
-    gtk_dialog_add_action_widget ((GtkDialog *) dialog, button1, GTK_RESPONSE_NONE);
-    g_signal_connect_swapped (button1, "clicked", (GCallback) gtk_widget_destroy, dialog);
-
-    gtk_widget_set_can_default (button1, TRUE);
-    gtk_widget_grab_default (button1);
-
-    return dialog;
-}
-
-#pragma GCC diagnostic pop
-
-EXPORT void audgui_dialog_add_widget (GtkWidget * dialog, GtkWidget * widget)
-{
-    GtkWidget * box = gtk_message_dialog_get_message_area ((GtkMessageDialog *) dialog);
-    gtk_box_pack_start ((GtkBox *) box, widget, FALSE, FALSE, 0);
-}
-
-EXPORT void audgui_simple_message (GtkWidget * * widget, GtkMessageType type,
- const char * title, const char * text)
-{
-    AUDDBG ("%s\n", text);
-
-    if (* widget)
-    {
-        const char * old = NULL;
-        g_object_get ((GObject *) * widget, "text", & old, NULL);
-        g_return_if_fail (old);
-
-        int messages = GPOINTER_TO_INT (g_object_get_data ((GObject *) * widget, "messages"));
-        if (messages > 10)
-            text = _("\n(Further messages have been hidden.)");
-
-        if (! strstr (old, text))
-        {
-            SCONCAT3 (both, old, "\n", text);
-            g_object_set ((GObject *) * widget, "text", both, NULL);
-            g_object_set_data ((GObject *) * widget, "messages", GINT_TO_POINTER (messages + 1));
-        }
-
-        gtk_window_present ((GtkWindow *) * widget);
-    }
-    else
-    {
-        GtkWidget * button = audgui_button_new (_("_Close"), "window-close", NULL, NULL);
-        * widget = audgui_dialog_new (type, title, text, button, NULL);
-
-        g_object_set_data ((GObject *) * widget, "messages", GINT_TO_POINTER (1));
-        g_signal_connect (* widget, "destroy", (GCallback) gtk_widget_destroyed, widget);
-
-        gtk_widget_show_all (* widget);
-    }
-}
-
-EXPORT void audgui_format_time (char * buf, int bufsize, int64_t milliseconds)
-{
-    int hours = milliseconds / 3600000;
-    int minutes = (milliseconds / 60000) % 60;
-    int seconds = (milliseconds / 1000) % 60;
-
-    if (hours)
-        snprintf (buf, bufsize, "%d:%02d:%02d", hours, minutes, seconds);
-    else
-    {
-        bool_t zero = aud_get_bool (NULL, "leading_zero");
-        snprintf (buf, bufsize, zero ? "%02d:%02d" : "%d:%02d", minutes, seconds);
-    }
-}
diff --git a/src/libaudgui/util.cc b/src/libaudgui/util.cc
new file mode 100644
index 000000000000..e54554040057
--- /dev/null
+++ b/src/libaudgui/util.cc
@@ -0,0 +1,175 @@
+/*
+ * util.c
+ * Copyright 2010-2012 John Lindgren and Michał Lipski
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <string.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/runtime.h>
+
+#include "internal.h"
+#include "libaudgui.h"
+#include "libaudgui-gtk.h"
+
+EXPORT int audgui_get_digit_width (GtkWidget * widget)
+{
+    int width;
+    PangoLayout * layout = gtk_widget_create_pango_layout (widget, "0123456789");
+    PangoFontDescription * desc = pango_font_description_new ();
+    pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
+    pango_layout_set_font_description (layout, desc);
+    pango_layout_get_pixel_size (layout, & width, nullptr);
+    pango_font_description_free (desc);
+    g_object_unref (layout);
+    return (width + 9) / 10;
+}
+
+EXPORT void audgui_get_mouse_coords (GtkWidget * widget, int * x, int * y)
+{
+    gtk_widget_get_pointer (widget, x, y);
+}
+
+EXPORT void audgui_get_mouse_coords (GdkScreen * screen, int * x, int * y)
+{
+    gdk_display_get_pointer (gdk_screen_get_display (screen), nullptr, x, y, nullptr);
+}
+
+EXPORT void audgui_get_monitor_geometry (GdkScreen * screen, int x, int y, GdkRectangle * geom)
+{
+    int monitors = gdk_screen_get_n_monitors (screen);
+
+    for (int i = 0; i < monitors; i ++)
+    {
+        gdk_screen_get_monitor_geometry (screen, i, geom);
+        if (x >= geom->x && x < geom->x + geom->width && y >= geom->y && y < geom->y + geom->height)
+            return;
+    }
+
+    /* fall back to entire screen */
+    geom->x = 0;
+    geom->y = 0;
+    geom->width = gdk_screen_get_width (screen);
+    geom->height = gdk_screen_get_height (screen);
+}
+
+static gboolean escape_destroy_cb (GtkWidget * widget, GdkEventKey * event)
+{
+    if (event->keyval == GDK_KEY_Escape)
+    {
+        gtk_widget_destroy (widget);
+        return true;
+    }
+
+    return false;
+}
+
+EXPORT void audgui_destroy_on_escape (GtkWidget * widget)
+{
+    g_signal_connect (widget, "key-press-event", (GCallback) escape_destroy_cb, nullptr);
+}
+
+EXPORT GtkWidget * audgui_button_new (const char * text, const char * icon,
+ AudguiCallback callback, void * data)
+{
+    GtkWidget * button = gtk_button_new_with_mnemonic (text);
+
+    if (icon)
+    {
+        GtkWidget * image = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_MENU);
+        gtk_button_set_image ((GtkButton *) button, image);
+    }
+
+    if (callback)
+        g_signal_connect_swapped (button, "clicked", (GCallback) callback, data);
+
+    return button;
+}
+
+EXPORT GtkWidget * audgui_dialog_new (GtkMessageType type, const char * title,
+ const char * text, GtkWidget * button1, GtkWidget * button2)
+{
+    GtkWidget * dialog = gtk_message_dialog_new (nullptr, (GtkDialogFlags) 0, type,
+     GTK_BUTTONS_NONE, "%s", text);
+    gtk_window_set_title ((GtkWindow *) dialog, title);
+
+    if (button2)
+    {
+        gtk_dialog_add_action_widget ((GtkDialog *) dialog, button2, GTK_RESPONSE_NONE);
+        g_signal_connect_swapped (button2, "clicked", (GCallback) gtk_widget_destroy, dialog);
+    }
+
+    gtk_dialog_add_action_widget ((GtkDialog *) dialog, button1, GTK_RESPONSE_NONE);
+    g_signal_connect_swapped (button1, "clicked", (GCallback) gtk_widget_destroy, dialog);
+
+    gtk_widget_set_can_default (button1, true);
+    gtk_widget_grab_default (button1);
+
+    return dialog;
+}
+
+EXPORT void audgui_dialog_add_widget (GtkWidget * dialog, GtkWidget * widget)
+{
+    GtkWidget * box = gtk_message_dialog_get_message_area ((GtkMessageDialog *) dialog);
+    gtk_box_pack_start ((GtkBox *) box, widget, false, false, 0);
+}
+
+EXPORT void audgui_simple_message (GtkWidget * * widget, GtkMessageType type,
+ const char * title, const char * text)
+{
+    if (type == GTK_MESSAGE_ERROR)
+        AUDERR ("%s\n", text);
+    else if (type == GTK_MESSAGE_WARNING)
+        AUDWARN ("%s\n", text);
+    else if (type == GTK_MESSAGE_INFO)
+        AUDINFO ("%s\n", text);
+
+    if (* widget)
+    {
+        const char * old = nullptr;
+        g_object_get ((GObject *) * widget, "text", & old, nullptr);
+        g_return_if_fail (old);
+
+        int messages = GPOINTER_TO_INT (g_object_get_data ((GObject *) * widget, "messages"));
+        if (messages > 10)
+            text = _("\n(Further messages have been hidden.)");
+
+        if (! strstr (old, text))
+        {
+            StringBuf both = str_concat ({old, "\n", text});
+            g_object_set ((GObject *) * widget, "text", (const char *) both, nullptr);
+            g_object_set_data ((GObject *) * widget, "messages", GINT_TO_POINTER (messages + 1));
+        }
+
+        gtk_window_present ((GtkWindow *) * widget);
+    }
+    else
+    {
+        GtkWidget * button = audgui_button_new (_("_Close"), "window-close", nullptr, nullptr);
+        * widget = audgui_dialog_new (type, title, text, button, nullptr);
+
+        g_object_set_data ((GObject *) * widget, "messages", GINT_TO_POINTER (1));
+        g_signal_connect (* widget, "destroy", (GCallback) gtk_widget_destroyed, widget);
+
+        gtk_widget_show_all (* widget);
+    }
+}
diff --git a/src/libaudqt/Makefile b/src/libaudqt/Makefile
new file mode 100644
index 000000000000..42606d97b046
--- /dev/null
+++ b/src/libaudqt/Makefile
@@ -0,0 +1,45 @@
+SHARED_LIB = ${LIB_PREFIX}audqt${LIB_SUFFIX}
+LIB_MAJOR = 0
+LIB_MINOR = 0
+
+SRCS = about.cc			\
+       art.cc                   \
+       equalizer.cc		\
+       fileopener.cc		\
+       infowin.cc		\
+       info-widget.cc		\
+       log-inspector.cc         \
+       menu.cc			\
+       playlist-management.cc	\
+       plugin-menu.cc		\
+       prefs-builder.cc		\
+       prefs-plugin.cc          \
+       prefs-widget.cc		\
+       prefs-window.cc		\
+       prefs-pluginlist-model.cc  \
+       queue-manager.cc		\
+       util.cc                  \
+       volumebutton.cc
+
+INCLUDES = libaudqt.h iface.h volumebutton.h info-widget.h menu.h
+
+include ../../buildsys.mk
+include ../../extra.mk
+
+includesubdir = libaudqt
+
+LD = ${CXX}
+
+CPPFLAGS := -I.. -I../.. \
+            ${CPPFLAGS} \
+            ${QT_CFLAGS} \
+            ${LIBGUESS_CFLAGS}
+
+CFLAGS += ${LIB_CFLAGS}
+
+LIBS := -L../libaudcore -laudcore \
+        ${LIBS} -lm \
+        ${QT_LIBS}
+
+%.moc: %.h
+	moc $< -o $@
diff --git a/src/libaudqt/about.cc b/src/libaudqt/about.cc
new file mode 100644
index 000000000000..ef6bb352a005
--- /dev/null
+++ b/src/libaudqt/about.cc
@@ -0,0 +1,119 @@
+/*
+ * about.cc
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <QDialog>
+#include <QFile>
+#include <QLabel>
+#include <QPlainTextEdit>
+#include <QTabWidget>
+#include <QTextStream>
+#include <QVBoxLayout>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/runtime.h>
+
+#include "libaudqt.h"
+
+static QTabWidget * buildCreditsNotebook (QWidget * parent)
+{
+    const char * data_dir = aud_get_path (AudPath::DataDir);
+    const char * titles[2] = {_("Credits"), _("License")};
+    const char * filenames[2] = {"AUTHORS", "COPYING"};
+
+    auto tabs = new QTabWidget (parent);
+
+    for (int i = 0; i < 2; i ++)
+    {
+        QFile f (QString (filename_build ({data_dir, filenames[i]})));
+        if (! f.open (QIODevice::ReadOnly))
+            continue;
+
+        QTextStream in (& f);
+
+        auto edit = new QPlainTextEdit (in.readAll ().trimmed (), parent);
+        edit->setReadOnly (true);
+        tabs->addTab (edit, titles[i]);
+
+        f.close ();
+    }
+
+    return tabs;
+}
+
+static QDialog * buildAboutWindow ()
+{
+    const char * data_dir = aud_get_path (AudPath::DataDir);
+    const char * logo_path = filename_build ({data_dir, "images", "about-logo.png"});
+    const char * about_text = "<big><b>Audacious " VERSION "</b></big><br>" COPYRIGHT;
+    const char * website = "http://audacious-media-player.org";
+
+    auto window = new QDialog;
+
+    auto logo = new QLabel (window);
+    logo->setPixmap (QPixmap (logo_path));
+    logo->setAlignment (Qt::AlignHCenter);
+
+    auto text = new QLabel (about_text, window);
+    text->setAlignment (Qt::AlignHCenter);
+
+    auto anchor = QString ("<a href='%1'>%1</a>").arg (website);
+    auto link_label = new QLabel (anchor, window);
+    link_label->setAlignment (Qt::AlignHCenter);
+    link_label->setContentsMargins (0, 5, 0, 0);
+    link_label->setOpenExternalLinks (true);
+
+    auto layout = new QVBoxLayout (window);
+    layout->addWidget (logo);
+    layout->addWidget (text);
+    layout->addWidget (link_label);
+    layout->addWidget (buildCreditsNotebook (window));
+
+    window->setWindowTitle (_("About Audacious"));
+    window->setFixedSize (590, 450);
+
+    return window;
+}
+
+static QDialog * s_aboutwin = nullptr;
+
+namespace audqt {
+
+EXPORT void aboutwindow_show ()
+{
+    if (! s_aboutwin)
+    {
+        s_aboutwin = buildAboutWindow ();
+        s_aboutwin->setAttribute (Qt::WA_DeleteOnClose);
+
+        QObject::connect (s_aboutwin, & QObject::destroyed, [] () {
+            s_aboutwin = nullptr;
+        });
+    }
+
+    window_bring_to_front (s_aboutwin);
+}
+
+EXPORT void aboutwindow_hide ()
+{
+    if (s_aboutwin)
+        delete s_aboutwin;
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/art.cc b/src/libaudqt/art.cc
new file mode 100644
index 000000000000..d636ac4b06da
--- /dev/null
+++ b/src/libaudqt/art.cc
@@ -0,0 +1,69 @@
+/*
+ * art.cc
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <QApplication>
+#include <QPixmap>
+#include <QImage>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/probe.h>
+#include <libaudcore/runtime.h>
+
+namespace audqt {
+
+EXPORT QPixmap art_request (const char * filename, unsigned int w, unsigned int h, bool want_hidpi)
+{
+    const Index<char> * data = aud_art_request_data (filename);
+
+    if (! data)
+    {
+        QString fallback = QString (filename_build
+         ({aud_get_path (AudPath::DataDir), "images", "album.png"}));
+
+        return QPixmap (fallback);
+    }
+
+    QImage img = QImage::fromData ((const uchar *) data->begin (), data->len ());
+
+    aud_art_unref (filename);
+
+    if (! want_hidpi)
+        return QPixmap::fromImage (img.scaled (w, h, Qt::KeepAspectRatio, Qt::SmoothTransformation));
+
+    qreal r = qApp->devicePixelRatio ();
+
+    QPixmap pm = QPixmap::fromImage (img.scaled (w * r, h * r, Qt::KeepAspectRatio, Qt::SmoothTransformation));
+    pm.setDevicePixelRatio (r);
+
+    return pm;
+}
+
+EXPORT QPixmap art_request_current (unsigned int w, unsigned int h, bool want_hidpi)
+{
+    int list = aud_playlist_get_playing ();
+    int entry = aud_playlist_get_position (list);
+    if (entry < 0)
+        return QPixmap ();
+
+    String filename = aud_playlist_entry_get_filename (list, entry);
+    return art_request (filename, w, h, want_hidpi);
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/equalizer.cc b/src/libaudqt/equalizer.cc
new file mode 100644
index 000000000000..cb0556ba1524
--- /dev/null
+++ b/src/libaudqt/equalizer.cc
@@ -0,0 +1,167 @@
+/*
+ * equalizer.cc
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <QCheckBox>
+#include <QDialog>
+#include <QFrame>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QSlider>
+#include <QVBoxLayout>
+
+#include <libaudcore/equalizer.h>
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/runtime.h>
+
+#include "libaudqt.h"
+
+class EqualizerSlider : public QWidget
+{
+public:
+    EqualizerSlider (const char * label, QWidget * parent);
+    QSlider slider;
+};
+
+class EqualizerWindow : public QDialog
+{
+public:
+    EqualizerWindow ();
+
+private:
+    QCheckBox m_onoff_checkbox;
+    EqualizerSlider * m_preamp_slider;
+    EqualizerSlider * m_sliders[AUD_EQ_NBANDS];
+
+    void updateActive ();
+    void updatePreamp ();
+    void updateBands ();
+
+    const HookReceiver<EqualizerWindow>
+     hook1 {"set equalizer_active", this, & EqualizerWindow::updateActive},
+     hook2 {"set equalizer_preamp", this, & EqualizerWindow::updatePreamp},
+     hook3 {"set equalizer_bands", this, & EqualizerWindow::updateBands};
+};
+
+EqualizerWindow::EqualizerWindow () :
+    m_onoff_checkbox (audqt::translate_str (N_("_Enable")))
+{
+    const char * const names[AUD_EQ_NBANDS] = {N_("31 Hz"), N_("63 Hz"),
+     N_("125 Hz"), N_("250 Hz"), N_("500 Hz"), N_("1 kHz"), N_("2 kHz"),
+     N_("4 kHz"), N_("8 kHz"), N_("16 kHz")};
+
+    auto slider_container = new QWidget (this);
+    auto slider_layout = new QHBoxLayout (slider_container);
+
+    m_preamp_slider = new EqualizerSlider (_("Preamp"), this);
+    slider_layout->addWidget (m_preamp_slider);
+
+    auto line = new QFrame (this);
+    line->setFrameShape (QFrame::VLine);
+    line->setFrameShadow (QFrame::Sunken);
+    slider_layout->addWidget (line);
+
+    for (int i = 0; i < AUD_EQ_NBANDS; i++)
+    {
+        m_sliders[i] = new EqualizerSlider (names[i], this);
+        slider_layout->addWidget (m_sliders[i]);
+    }
+
+    auto layout = new QVBoxLayout (this);
+    layout->addWidget (& m_onoff_checkbox);
+    layout->addWidget (slider_container);
+
+    setWindowTitle (_("Equalizer"));
+
+    updateActive ();
+    updatePreamp ();
+    updateBands ();
+
+    connect (& m_onoff_checkbox, & QCheckBox::stateChanged, [] (int state) {
+        aud_set_bool (nullptr, "equalizer_active", (state == Qt::Checked));
+    });
+
+    connect (& m_preamp_slider->slider, & QSlider::valueChanged, [] (int value) {
+        aud_set_int (nullptr, "equalizer_preamp", value);
+    });
+
+    for (int i = 0; i < AUD_EQ_NBANDS; i++)
+    {
+        connect (& m_sliders[i]->slider, & QSlider::valueChanged, [i] (int value) {
+            aud_eq_set_band (i, value);
+        });
+    }
+}
+
+void EqualizerWindow::updateActive ()
+{
+    bool active = aud_get_bool (nullptr, "equalizer_active");
+    m_onoff_checkbox.setCheckState (active ? Qt::Checked : Qt::Unchecked);
+}
+
+void EqualizerWindow::updatePreamp ()
+{
+    m_preamp_slider->slider.setValue (aud_get_int (nullptr, "equalizer_preamp"));
+}
+
+void EqualizerWindow::updateBands ()
+{
+    double values[AUD_EQ_NBANDS];
+    aud_eq_get_bands (values);
+
+    for (int i = 0; i < AUD_EQ_NBANDS; i++)
+        m_sliders[i]->slider.setValue (values[i]);
+}
+
+EqualizerSlider::EqualizerSlider (const char * label, QWidget * parent) :
+    QWidget (parent),
+    slider (Qt::Vertical)
+{
+    slider.setRange (-AUD_EQ_MAX_GAIN, AUD_EQ_MAX_GAIN);
+
+    auto layout = new QVBoxLayout (this);
+    layout->addWidget (& slider);
+    layout->addWidget (new QLabel (label, this));
+}
+
+static EqualizerWindow * s_equalizer = nullptr;
+
+namespace audqt {
+
+EXPORT void equalizer_show (void)
+{
+    if (! s_equalizer)
+    {
+        s_equalizer = new EqualizerWindow;
+        s_equalizer->setAttribute (Qt::WA_DeleteOnClose);
+
+        QObject::connect (s_equalizer, & QObject::destroyed, [] () {
+            s_equalizer = nullptr;
+        });
+    }
+
+    window_bring_to_front (s_equalizer);
+}
+
+EXPORT void equalizer_hide (void)
+{
+    delete s_equalizer;
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/fileopener.cc b/src/libaudqt/fileopener.cc
new file mode 100644
index 000000000000..c4d6b5c9476a
--- /dev/null
+++ b/src/libaudqt/fileopener.cc
@@ -0,0 +1,88 @@
+/*
+ * fileopener.cc
+ * Copyright 2014 Michał Lipski
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <QFileDialog>
+
+#include <libaudcore/drct.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/runtime.h>
+
+#include <libaudqt/libaudqt.h>
+
+namespace audqt {
+
+static aud::array<FileMode, QFileDialog *> s_dialogs;
+
+EXPORT void fileopener_show (FileMode mode)
+{
+    QFileDialog * & dialog = s_dialogs[mode];
+
+    if (! dialog)
+    {
+        static constexpr aud::array<FileMode, const char *> titles {
+            N_("Open Files"),
+            N_("Open Folder"),
+            N_("Add Files"),
+            N_("Add Folder")
+        };
+
+        static constexpr aud::array<FileMode, const char *> labels {
+            N_("Open"),
+            N_("Open"),
+            N_("Add"),
+            N_("Add")
+        };
+
+        static constexpr aud::array<FileMode, QFileDialog::FileMode> modes {
+            QFileDialog::ExistingFiles,
+            QFileDialog::Directory,
+            QFileDialog::ExistingFiles,
+            QFileDialog::Directory
+        };
+
+        String path = aud_get_str ("audgui", "filesel_path");
+        dialog = new QFileDialog (nullptr, _(titles[mode]), QString (path));
+
+        dialog->setAttribute (Qt::WA_DeleteOnClose);
+        dialog->setFileMode (modes[mode]);
+        dialog->setLabelText (QFileDialog::Accept, _(labels[mode]));
+
+        QObject::connect (dialog, & QFileDialog::directoryEntered, [] (const QString & path)
+            { aud_set_str ("audgui", "filesel_path", path.toUtf8 ().constData ()); });
+
+        QObject::connect (dialog, & QFileDialog::accepted, [dialog, mode] ()
+        {
+            Index<PlaylistAddItem> files;
+            for (const QUrl & url : dialog->selectedUrls ())
+                files.append (String (url.toEncoded ().constData ()));
+
+            if (mode == FileMode::Add || mode == FileMode::AddFolder)
+                aud_drct_pl_add_list (std::move (files), -1);
+            else
+                aud_drct_pl_open_list (std::move (files));
+        });
+
+        QObject::connect (dialog, & QObject::destroyed, [& dialog] ()
+            { dialog = nullptr; });
+    }
+
+    window_bring_to_front (dialog);
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/iface.h b/src/libaudqt/iface.h
new file mode 100644
index 000000000000..ef5e05452208
--- /dev/null
+++ b/src/libaudqt/iface.h
@@ -0,0 +1,47 @@
+/*
+ * iface.h
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDQT_IFACE_H
+#define LIBAUDQT_IFACE_H
+
+#include <libaudcore/plugin.h>
+#include <libaudqt/libaudqt.h>
+
+namespace audqt {
+
+class QtIfacePlugin : public IfacePlugin
+{
+public:
+    constexpr QtIfacePlugin (PluginInfo info) : IfacePlugin (info) {}
+
+    void show_about_window () { aboutwindow_show (); }
+    void hide_about_window () { aboutwindow_hide (); }
+    void show_filebrowser (bool open) { fileopener_show (open ? FileMode::Open : FileMode::Add); }
+    void hide_filebrowser () {}
+    void show_jump_to_song () {}
+    void hide_jump_to_song () {}
+    void show_prefs_window () { prefswin_show (); }
+    void hide_prefs_window () { prefswin_hide (); }
+    void plugin_menu_add (AudMenuID id, void func (), const char * name, const char * icon) {}
+    void plugin_menu_remove (AudMenuID id, void func ()) {}
+};
+
+} // namespace audqt
+
+#endif
diff --git a/src/libaudqt/info-widget.cc b/src/libaudqt/info-widget.cc
new file mode 100644
index 000000000000..24f622d70cf1
--- /dev/null
+++ b/src/libaudqt/info-widget.cc
@@ -0,0 +1,205 @@
+/*
+ * info-widget.h
+ * Copyright 2006-2014 William Pitcock, Tomasz Moń, Eugene Zagidullin,
+ *                     John Lindgren, and Thomas Lange
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "info-widget.h"
+#include "libaudqt.h"
+
+#include <QHeaderView>
+
+#include <libaudcore/i18n.h>
+#include <libaudcore/probe.h>
+
+namespace audqt {
+
+struct TupleFieldMap {
+    const char * name;
+    Tuple::Field field;
+    bool editable;
+};
+const TupleFieldMap tuple_field_map[] = {
+    {N_("Metadata"), Tuple::Invalid, false},
+    {N_("Artist"), Tuple::Artist, true},
+    {N_("Album"), Tuple::Album, true},
+    {N_("Title"), Tuple::Title, true},
+    {N_("Track Number"), Tuple::Track, true},
+    {N_("Genre"), Tuple::Genre, true},
+    {N_("Comment"), Tuple::Comment, true},
+    {N_("Album Artist"), Tuple::AlbumArtist, true},
+    {N_("Composer"), Tuple::Composer, true},
+    {N_("Performer"), Tuple::Performer, true},
+    {N_("Recording Year"), Tuple::Year, true},
+    {N_("Recording Date"), Tuple::Date, true},
+
+    {"", Tuple::Invalid, false},
+    {N_("Technical"), Tuple::Invalid, false},
+    {N_("Length"), Tuple::Length, false},
+    {N_("MIME Type"), Tuple::MIMEType, false},
+    {N_("Codec"), Tuple::Codec, false},
+    {N_("Quality"), Tuple::Quality, false},
+    {N_("Bitrate"), Tuple::Bitrate, false},
+};
+
+EXPORT InfoWidget::InfoWidget (QWidget * parent) : QTreeView (parent)
+{
+    setModel (& m_model);
+    header ()->hide ();
+    setEditTriggers (QAbstractItemView::SelectedClicked);
+    setIndentation (0);
+}
+
+EXPORT InfoWidget::~InfoWidget ()
+{
+}
+
+EXPORT void InfoWidget::fillInfo (int playlist, int entry, const char * filename, const Tuple & tuple,
+ PluginHandle * decoder, bool updating_enabled)
+{
+    m_model.setTupleData (tuple, String (filename), decoder);
+}
+
+EXPORT bool InfoWidget::updateFile ()
+{
+    return m_model.updateFile ();
+}
+
+InfoModel::InfoModel (QObject * parent) : QAbstractTableModel (parent)
+{
+}
+
+int InfoModel::rowCount (const QModelIndex & parent) const
+{
+    auto r = ArrayRef<TupleFieldMap> (tuple_field_map);
+    return r.len;
+}
+
+int InfoModel::columnCount (const QModelIndex & parent) const
+{
+    return 2;
+}
+
+bool InfoModel::updateFile () const
+{
+    if (! m_dirty)
+        return true;
+
+    Tuple t = m_tuple.ref ();
+    t.set_filename (m_filename);
+
+    return aud_file_write_tuple (m_filename, m_plugin, t);
+}
+
+bool InfoModel::setData (const QModelIndex & index, const QVariant & value, int role)
+{
+    if (role != Qt::EditRole)
+        return false;
+
+    Tuple::Field field_id = tuple_field_map [index.row ()].field;
+    if (field_id == Tuple::Invalid)
+        return false;
+
+    m_dirty = true;
+
+    auto t = Tuple::field_get_type (field_id);
+    if (t == Tuple::String)
+    {
+        m_tuple.set_str (field_id, value.toString ().toLocal8Bit ());
+        emit dataChanged (index, index, {role});
+        return true;
+    }
+    else if (t == Tuple::Int)
+    {
+        m_tuple.set_int (field_id, value.toInt ());
+        emit dataChanged (index, index, {role});
+        return true;
+    }
+
+    return false;
+}
+
+QVariant InfoModel::data (const QModelIndex & index, int role) const
+{
+    Tuple::Field field_id = tuple_field_map [index.row ()].field;
+
+    if (role == Qt::DisplayRole || role == Qt::EditRole)
+    {
+        if (index.column () == 0)
+            return translate_str (tuple_field_map [index.row ()].name);
+        else if (index.column () == 1 && m_tuple)
+        {
+            if (field_id == Tuple::Invalid)
+                return QVariant ();
+
+            auto t = Tuple::field_get_type (field_id);
+
+            if (t == Tuple::String)
+            {
+                const char * res = m_tuple.get_str (field_id);
+                if (res)
+                    return QString (res);
+            }
+            else if (t == Tuple::Int)
+            {
+                int res = m_tuple.get_int (field_id);
+                if (res == -1)
+                    return QVariant ();
+                return res;
+            }
+        }
+    }
+    else if (role == Qt::FontRole)
+    {
+        if (field_id == Tuple::Invalid)
+        {
+            QFont f;
+            f.setBold (true);
+            return f;
+        }
+        return QVariant ();
+    }
+
+    return QVariant ();
+}
+
+Qt::ItemFlags InfoModel::flags (const QModelIndex & index) const
+{
+    if (index.column () == 1)
+    {
+        auto & t = tuple_field_map [index.row ()];
+
+        if (t.field == Tuple::Invalid)
+            return Qt::ItemNeverHasChildren;
+        else if (t.editable)
+            return Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled;
+
+        return Qt::ItemIsEnabled;
+    }
+
+    return Qt::ItemNeverHasChildren;
+}
+
+void InfoModel::setTupleData (const Tuple & tuple, String filename, PluginHandle * plugin)
+{
+    m_tuple = tuple.ref ();
+    m_filename = filename;
+    m_plugin = plugin;
+    m_dirty = false;
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/info-widget.h b/src/libaudqt/info-widget.h
new file mode 100644
index 000000000000..849b0ca6b5f7
--- /dev/null
+++ b/src/libaudqt/info-widget.h
@@ -0,0 +1,63 @@
+/*
+ * info-widget.h
+ * Copyright 2006-2014 William Pitcock, Tomasz Moń, Eugene Zagidullin,
+ *                     John Lindgren, and Thomas Lange
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <QAbstractTableModel>
+#include <QTreeView>
+
+#include <libaudcore/tuple.h>
+
+class PluginHandle;
+
+namespace audqt {
+
+class InfoModel : public QAbstractTableModel {
+public:
+    InfoModel (QObject * parent = nullptr);
+
+    int rowCount (const QModelIndex & parent = QModelIndex()) const;
+    int columnCount (const QModelIndex & parent = QModelIndex()) const;
+    QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const;
+    bool setData (const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
+    Qt::ItemFlags flags (const QModelIndex & index) const;
+
+    void setTupleData (const Tuple & tuple, String filename, PluginHandle * plugin);
+    bool updateFile () const;
+
+private:
+    Tuple m_tuple;
+    String m_filename;
+    PluginHandle * m_plugin;
+    bool m_dirty;
+};
+
+class InfoWidget : public QTreeView {
+public:
+    InfoWidget (QWidget * parent = nullptr);
+    ~InfoWidget ();
+
+    void fillInfo (int playlist, int entry, const char * filename, const Tuple & tuple,
+     PluginHandle * decoder, bool updating_enabled);
+    bool updateFile ();
+
+private:
+    InfoModel m_model;
+};
+
+} // namespace audqt
diff --git a/src/libaudqt/infowin.cc b/src/libaudqt/infowin.cc
new file mode 100644
index 000000000000..e71038af4355
--- /dev/null
+++ b/src/libaudqt/infowin.cc
@@ -0,0 +1,158 @@
+/*
+ * infowin.cc
+ * Copyright 2006-2014 William Pitcock, Tomasz Moń, Eugene Zagidullin,
+ *                     John Lindgren, and Thomas Lange
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <QDialog>
+#include <QDialogButtonBox>
+#include <QHBoxLayout>
+#include <QImage>
+#include <QLabel>
+#include <QPixmap>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/interface.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/probe.h>
+
+#include "info-widget.h"
+#include "libaudqt.h"
+
+namespace audqt {
+
+class InfoWindow : public QDialog {
+public:
+    InfoWindow (QWidget * parent = nullptr);
+
+    void fillInfo (int playlist, int entry, const char * filename, const Tuple & tuple,
+     PluginHandle * decoder, bool updating_enabled);
+
+private:
+    String m_filename;
+    QLabel m_image;
+    InfoWidget m_infowidget;
+
+    void displayImage (const char * filename);
+
+    const HookReceiver<InfoWindow, const char *>
+     art_hook {"art ready", this, & InfoWindow::displayImage};
+};
+
+InfoWindow::InfoWindow (QWidget * parent) : QDialog (parent)
+{
+    setWindowTitle (_("Song Info"));
+
+    auto hbox = new QHBoxLayout;
+    hbox->addWidget (& m_image);
+    hbox->addWidget (& m_infowidget);
+
+    auto vbox = new QVBoxLayout (this);
+    vbox->addLayout (hbox);
+
+    auto bbox = new QDialogButtonBox (QDialogButtonBox::Save | QDialogButtonBox::Close, this);
+    bbox->button (QDialogButtonBox::Save)->setText (translate_str (N_("_Save")));
+    bbox->button (QDialogButtonBox::Close)->setText (translate_str (N_("_Close")));
+    vbox->addWidget (bbox);
+
+    QObject::connect (bbox, & QDialogButtonBox::accepted, [this] () {
+        m_infowidget.updateFile ();
+        deleteLater ();
+    });
+
+    QObject::connect (bbox, & QDialogButtonBox::rejected, this, & QObject::deleteLater);
+}
+
+void InfoWindow::fillInfo (int playlist, int entry, const char * filename, const Tuple & tuple,
+ PluginHandle * decoder, bool updating_enabled)
+{
+    m_filename = String (filename);
+    displayImage (filename);
+    m_infowidget.fillInfo (playlist, entry, filename, tuple, decoder, updating_enabled);
+}
+
+void InfoWindow::displayImage (const char * filename)
+{
+    if (! strcmp_safe (filename, m_filename))
+        m_image.setPixmap (art_request (filename));
+}
+
+static InfoWindow * s_infowin = nullptr;
+
+EXPORT void infowin_show (int playlist, int entry)
+{
+    if (! s_infowin)
+    {
+        s_infowin = new InfoWindow;
+        s_infowin->setAttribute (Qt::WA_DeleteOnClose);
+
+        QObject::connect (s_infowin, & QObject::destroyed, [] () {
+            s_infowin = nullptr;
+        });
+    }
+
+    String filename = aud_playlist_entry_get_filename (playlist, entry);
+    if (! filename)
+        return;
+
+    PluginHandle * decoder = aud_playlist_entry_get_decoder (playlist, entry);
+    if (! decoder)
+        return;
+
+    Tuple tuple = aud_playlist_entry_get_tuple (playlist, entry);
+
+    if (tuple)
+    {
+        tuple.delete_fallbacks ();
+        s_infowin->fillInfo (playlist, entry, filename, tuple, decoder,
+            aud_file_can_write_tuple (filename, decoder));
+    }
+    else
+        aud_ui_show_error (str_printf (_("No info available for %s.\n"),
+            (const char *) filename));
+
+    s_infowin->resize (700, 300);
+
+    window_bring_to_front (s_infowin);
+}
+
+EXPORT void infowin_show_current ()
+{
+    int playlist = aud_playlist_get_playing ();
+    int position;
+
+    if (playlist == -1)
+        playlist = aud_playlist_get_active ();
+
+    position = aud_playlist_get_position (playlist);
+
+    if (position == -1)
+        return;
+
+    infowin_show (playlist, position);
+}
+
+EXPORT void infowin_hide ()
+{
+    delete s_infowin;
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/libaudqt.h b/src/libaudqt/libaudqt.h
new file mode 100644
index 000000000000..d646c1f4411d
--- /dev/null
+++ b/src/libaudqt/libaudqt.h
@@ -0,0 +1,104 @@
+/*
+ * libaudqt.h
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDQT_H
+#define LIBAUDQT_H
+
+#include <QString>
+#include <libaudcore/objects.h>
+
+class QBoxLayout;
+class QPixmap;
+class QWidget;
+
+enum class PluginType;
+class PluginHandle;
+struct PreferencesWidget;
+
+namespace audqt {
+
+enum class FileMode {
+    Open,
+    OpenFolder,
+    Add,
+    AddFolder,
+    count
+};
+
+struct MenuItem;
+
+/* about.cc */
+void aboutwindow_show ();
+void aboutwindow_hide ();
+
+/* playlist-management.cc */
+void playlist_confirm_delete (int playlist);
+void playlist_confirm_rename (int playlist);
+
+/* equalizer.cc */
+void equalizer_show ();
+void equalizer_hide ();
+
+/* fileopener.cc */
+void fileopener_show (FileMode mode);
+
+/* util.cc */
+void cleanup ();
+void window_bring_to_front (QWidget * win);
+void simple_message (const char * title, const char * text);
+QString translate_str (const char * str, const char * domain);
+
+#ifdef PACKAGE
+static inline QString translate_str (const char * str)
+    { return translate_str (str, PACKAGE); }
+#endif
+
+/* prefs-builder.cc */
+void prefs_populate (QBoxLayout * layout, ArrayRef<PreferencesWidget> widgets, const char * domain);
+
+/* prefs-plugin.cc */
+void plugin_about (PluginHandle * ph);
+void plugin_prefs (PluginHandle * ph);
+
+/* prefs-window.cc */
+void prefswin_show ();
+void prefswin_hide ();
+void prefswin_show_page (int id, bool show = true);
+void prefswin_show_plugin_page (PluginType type);
+
+/* log-inspector.cc */
+void log_inspector_show ();
+void log_inspector_hide ();
+
+/* art.cc */
+QPixmap art_request (const char * filename, unsigned int w = 256, unsigned int h = 256, bool want_hidpi = true);
+QPixmap art_request_current (unsigned int w = 256, unsigned int h = 256, bool want_hidpi = true);
+
+/* infowin.cc */
+void infowin_show (int playlist, int entry);
+void infowin_show_current ();
+void infowin_hide ();
+
+/* queue-manager.cc */
+void queue_manager_show ();
+void queue_manager_hide ();
+
+} // namespace audqt
+
+#endif
diff --git a/src/libaudqt/log-inspector.cc b/src/libaudqt/log-inspector.cc
new file mode 100644
index 000000000000..eeaf31c75f52
--- /dev/null
+++ b/src/libaudqt/log-inspector.cc
@@ -0,0 +1,283 @@
+/*
+ * log-inspector.cc
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "log-inspector.h"
+#include "libaudqt.h"
+
+#include <QComboBox>
+#include <QDialog>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QVBoxLayout>
+#include <QTreeView>
+#include <QWidget>
+
+#include <libaudcore/i18n.h>
+#include <libaudcore/index.h>
+#include <libaudcore/runtime.h>
+
+namespace audqt {
+
+const int LOGENTRY_MAX = 1000;
+
+enum LogEntryColumn {
+    Level,
+    File,
+    Line,
+    Function,
+    Message,
+    Count
+};
+
+struct LogEntry
+{
+    audlog::Level level;
+    const char * filename;
+    unsigned int line;
+    const char * function;
+    char * message;
+};
+
+static Index<SmartPtr<LogEntry>> entries;
+
+static void log_handler (audlog::Level level, const char * file, int line,
+ const char * func, const char * message);
+
+/* log entry model */
+LogEntryModel::LogEntryModel (QObject * parent) : QAbstractListModel (parent)
+{
+}
+
+LogEntryModel::~LogEntryModel ()
+{
+}
+
+int LogEntryModel::rowCount (const QModelIndex & parent) const
+{
+    return entries.len ();
+}
+
+int LogEntryModel::columnCount (const QModelIndex & parent) const
+{
+    return LogEntryColumn::Count;
+}
+
+QVariant LogEntryModel::data (const QModelIndex & index, int role) const
+{
+    auto & e = entries [index.row ()];
+
+    if (e && role == Qt::DisplayRole)
+    {
+        switch (index.column ())
+        {
+            case LogEntryColumn::Level: return QString (audlog::get_level_name (e->level));
+            case LogEntryColumn::File: return QString (e->filename);
+            case LogEntryColumn::Line: return e->line;
+            case LogEntryColumn::Function: return QString (e->function);
+            case LogEntryColumn::Message: return QString (e->message);
+        }
+    }
+
+    return QVariant ();
+}
+
+QVariant LogEntryModel::headerData (int section, Qt::Orientation orientation, int role) const
+{
+    if (role == Qt::DisplayRole && orientation == Qt::Horizontal)
+    {
+        switch (section)
+        {
+            case LogEntryColumn::Level: return QString (_("Level"));
+            case LogEntryColumn::File: return QString (_("Filename"));
+            case LogEntryColumn::Line: return QString (_("Line"));
+            case LogEntryColumn::Function: return QString (_("Function"));
+            case LogEntryColumn::Message: return QString (_("Message"));
+        }
+    }
+
+    return QVariant ();
+}
+
+bool LogEntryModel::insertRows (int row, int count, const QModelIndex & parent)
+{
+    int last = row + count - 1;
+    beginInsertRows (parent, row, last);
+    endInsertRows ();
+    return true;
+}
+
+bool LogEntryModel::removeRows (int row, int count, const QModelIndex & parent)
+{
+    int last = row + count - 1;
+    beginRemoveRows (parent, row, last);
+    endRemoveRows ();
+    return true;
+}
+
+void LogEntryModel::updateRows (int row, int count)
+{
+    int bottom = row + count - 1;
+    auto topLeft = createIndex (row, 0);
+    auto bottomRight = createIndex (bottom, columnCount () - 1);
+    emit dataChanged (topLeft, bottomRight);
+}
+
+void LogEntryModel::updateRow (int row)
+{
+    updateRows (row, 1);
+}
+
+/* log entry inspector */
+class LogEntryInspector : public QDialog
+{
+public:
+    LogEntryInspector (QWidget * parent = nullptr);
+    ~LogEntryInspector ();
+
+    audlog::Level m_level;
+
+    void pop ();
+    void push ();
+
+private:
+    QVBoxLayout m_layout;
+    LogEntryModel * m_model;
+    QTreeView * m_view;
+
+    QWidget m_bottom_container;
+    QHBoxLayout m_bottom_layout;
+
+    QComboBox m_level_combobox;
+    QLabel m_level_label;
+
+    void setLogLevel (audlog::Level level);
+};
+
+LogEntryInspector::LogEntryInspector (QWidget * parent) :
+    QDialog (parent)
+{
+    setWindowTitle (_("Log Inspector"));
+    setLayout (& m_layout);
+
+    m_model = new LogEntryModel (this);
+    m_view = new QTreeView (this);
+    m_view->setModel (m_model);
+
+    m_layout.addWidget (m_view);
+
+    m_bottom_layout.setContentsMargins (0, 0, 0, 0);
+
+    m_level_label.setText (_("Log Level:"));
+    m_bottom_layout.addWidget (& m_level_label);
+
+    m_level_combobox.addItem (_("Debug"), audlog::Debug);
+    m_level_combobox.addItem (_("Info"), audlog::Info);
+    m_level_combobox.addItem (_("Warning"), audlog::Warning);
+    m_level_combobox.addItem (_("Error"), audlog::Error);
+
+    QObject::connect (& m_level_combobox,
+                      static_cast <void (QComboBox::*) (int)> (&QComboBox::currentIndexChanged),
+                      [this] (int idx) { setLogLevel ((audlog::Level) idx); });
+
+    m_bottom_layout.addWidget (& m_level_combobox);
+
+    m_bottom_container.setLayout (& m_bottom_layout);
+    m_layout.addWidget (& m_bottom_container);
+
+    resize (800, 350);
+
+    setLogLevel (audlog::Info);
+}
+
+LogEntryInspector::~LogEntryInspector ()
+{
+    audlog::unsubscribe (log_handler);
+}
+
+static LogEntryInspector * s_inspector = nullptr;
+
+static void log_handler (audlog::Level level, const char * file, int line,
+ const char * func, const char * message)
+{
+    LogEntry * l = new LogEntry;
+
+    l->level = level;
+    l->filename = file;
+    l->line = line;
+    l->function = func;
+
+    l->message = strdup(message);
+    l->message[strlen (l->message) - 1] = 0;
+
+    entries.append (SmartPtr<LogEntry> (l));
+
+    if (entries.len () > LOGENTRY_MAX)
+    {
+        s_inspector->pop ();
+        entries.erase (0, 1);
+    }
+
+    s_inspector->push ();
+}
+
+void LogEntryInspector::setLogLevel (audlog::Level level)
+{
+    m_level = level;
+
+    audlog::unsubscribe (log_handler);
+    audlog::subscribe (log_handler, level);
+
+    m_level_combobox.setCurrentIndex (m_level);
+}
+
+void LogEntryInspector::pop ()
+{
+    m_model->removeRows (0, 1);
+}
+
+void LogEntryInspector::push ()
+{
+    m_model->insertRows (entries.len (), 1);
+#ifdef XXX_NOTYET
+    auto index = m_model->index (entries.len () - 1);
+    m_view->scrollTo (index);
+#endif
+}
+
+EXPORT void log_inspector_show ()
+{
+    if (! s_inspector)
+    {
+        s_inspector = new LogEntryInspector;
+        s_inspector->setAttribute (Qt::WA_DeleteOnClose);
+
+        QObject::connect (s_inspector, & QObject::destroyed, [] () {
+            s_inspector = nullptr;
+        });
+    }
+
+    window_bring_to_front (s_inspector);
+}
+
+EXPORT void log_inspector_hide ()
+{
+    delete s_inspector;
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/log-inspector.h b/src/libaudqt/log-inspector.h
new file mode 100644
index 000000000000..15beb78977a3
--- /dev/null
+++ b/src/libaudqt/log-inspector.h
@@ -0,0 +1,46 @@
+/*
+ * log-inspector.h
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <QAbstractListModel>
+
+#ifndef LIBAUDQT_LOG_INSPECTOR_H
+#define LIBAUDQT_LOG_INSPECTOR_H
+
+namespace audqt {
+
+class LogEntryModel : public QAbstractListModel
+{
+public:
+    LogEntryModel (QObject * parent = nullptr);
+    ~LogEntryModel ();
+
+    int rowCount (const QModelIndex & parent = QModelIndex ()) const;
+    int columnCount (const QModelIndex & parent = QModelIndex ()) const;
+    QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const;
+    QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
+
+    bool insertRows (int row, int count, const QModelIndex & parent = QModelIndex ());
+    bool removeRows (int row, int count, const QModelIndex & parent = QModelIndex ());
+    void updateRows (int row, int count);
+    void updateRow (int row);
+};
+
+} // namespace audqt
+
+#endif
diff --git a/src/libaudqt/menu.cc b/src/libaudqt/menu.cc
new file mode 100644
index 000000000000..2d04ab1d6bb4
--- /dev/null
+++ b/src/libaudqt/menu.cc
@@ -0,0 +1,125 @@
+/*
+ * menu.h
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "libaudqt.h"
+#include "libaudqt/menu.h"
+
+#include <QAction>
+#include <QIcon>
+#include <QMenu>
+#include <QMenuBar>
+
+#include <libaudcore/hook.h>
+#include <libaudcore/runtime.h>
+
+namespace audqt {
+
+class MenuAction : public QAction
+{
+public:
+    MenuAction (const MenuItem & item, const char * domain, QWidget * parent);
+
+private:
+    void toggle (bool checked);
+    void update ();
+
+    const MenuItem & m_item;
+    SmartPtr<HookReceiver<MenuAction>> m_hook;
+};
+
+MenuAction::MenuAction (const MenuItem & item, const char * domain, QWidget * parent) :
+    QAction (parent),
+    m_item (item)
+{
+    if (item.sep)
+    {
+        setSeparator (true);
+        return;
+    }
+
+    setText (translate_str (item.text.name, domain));
+
+    if (item.func)
+        QObject::connect (this, & QAction::triggered, item.func);
+    else if (item.cfg.name)
+    {
+        setCheckable (true);
+        setChecked (aud_get_bool (item.cfg.sect, item.cfg.name));
+
+        QObject::connect (this, & QAction::toggled, this, & MenuAction::toggle);
+
+        if (item.cfg.hook)
+            m_hook.capture (new HookReceiver<MenuAction> (item.cfg.hook, this, & MenuAction::update));
+    }
+    else if (item.items.len)
+        setMenu (menu_build (item.items, domain, parent));
+    else if (item.submenu)
+        setMenu (item.submenu ());
+
+#ifndef Q_OS_MAC
+    if (item.text.icon && QIcon::hasThemeIcon (item.text.icon))
+        setIcon (QIcon::fromTheme (item.text.icon));
+#endif
+
+    if (item.text.shortcut)
+        setShortcut (QString (item.text.shortcut));
+}
+
+void MenuAction::toggle (bool checked)
+{
+    if (aud_get_bool (m_item.cfg.sect, m_item.cfg.name) != checked)
+    {
+        aud_set_bool (m_item.cfg.sect, m_item.cfg.name, checked);
+
+        if (m_item.func)
+            m_item.func ();
+    }
+}
+
+void MenuAction::update ()
+{
+    setChecked (aud_get_bool (m_item.cfg.sect, m_item.cfg.name));
+}
+
+EXPORT QAction * menu_action (const MenuItem & menu_item, const char * domain, QWidget * parent)
+{
+    return new MenuAction (menu_item, domain, parent);
+}
+
+EXPORT QMenu * menu_build (ArrayRef<MenuItem> menu_items, const char * domain, QWidget * parent)
+{
+    QMenu * m = new QMenu (parent);
+
+    for (auto & it : menu_items)
+        m->addAction (new MenuAction (it, domain, m));
+
+    return m;
+}
+
+EXPORT QMenuBar * menubar_build (ArrayRef<MenuItem> menu_items, const char * domain, QWidget * parent)
+{
+    QMenuBar * m = new QMenuBar (parent);
+
+    for (auto & it : menu_items)
+        m->addAction (new MenuAction (it, domain, m));
+
+    return m;
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/menu.h b/src/libaudqt/menu.h
new file mode 100644
index 000000000000..b7f95c3af279
--- /dev/null
+++ b/src/libaudqt/menu.h
@@ -0,0 +1,95 @@
+/*
+ * menu.h
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "libaudqt.h"
+
+#ifndef LIBAUDQT_MENU_H
+#define LIBAUDQT_MENU_H
+
+#include <libaudcore/objects.h>
+
+class QAction;
+class QMenu;
+class QMenuBar;
+class QWidget;
+
+enum class AudMenuID;
+
+namespace audqt {
+
+struct MenuItemText {
+    const char * name;
+    const char * icon;
+    const char * shortcut;
+};
+
+struct MenuItemConfig {
+    const char * sect;
+    const char * name;
+    const char * hook;
+};
+
+struct MenuItem {
+    MenuItemText text;
+    void (* func) ();
+
+    /* for toggle items */
+    MenuItemConfig cfg;
+
+    /* for submenus */
+    ArrayRef<MenuItem> items;
+
+    /* for custom submenus */
+    QMenu * (* submenu) ();
+
+    /* for separators */
+    bool sep;
+};
+
+constexpr MenuItem MenuCommand (MenuItemText text, void (* func) ())
+    { return {text, func}; }
+constexpr MenuItem MenuToggle (MenuItemText text, MenuItemConfig cfg, void (* func) () = nullptr)
+    { return {text, func, cfg}; }
+constexpr MenuItem MenuSub (MenuItemText text, ArrayRef<MenuItem> items)
+    { return {text, nullptr, {}, items}; }
+constexpr MenuItem MenuSub (MenuItemText text, QMenu * (* submenu) ())
+    { return {text, nullptr, {}, nullptr, submenu}; }
+constexpr MenuItem MenuSep ()
+    { return {{}, nullptr, {}, nullptr, nullptr, true}; }
+
+/* menu.cc */
+QAction * menu_action (const MenuItem & menu_item, const char * domain, QWidget * parent = nullptr);
+QMenu * menu_build (ArrayRef<MenuItem> menu_items, const char * domain, QWidget * parent = nullptr);
+QMenuBar * menubar_build (ArrayRef<MenuItem> menu_items, const char * domain, QWidget * parent = nullptr);
+
+#ifdef PACKAGE
+static inline QMenu * menu_build (ArrayRef<MenuItem> menu_items, QWidget * parent = nullptr)
+    { return menu_build (menu_items, PACKAGE, parent); }
+static inline QMenuBar * menubar_build (ArrayRef<MenuItem> menu_items, QWidget * parent = nullptr)
+    { return menubar_build (menu_items, PACKAGE, parent); }
+#endif
+
+/* plugin-menu.cc */
+QMenu * menu_get_by_id (AudMenuID id);
+void menu_add (AudMenuID id, void (* func) (void), const char * name, const char * icon);
+void menu_remove (AudMenuID id, void (* func) (void));
+
+} // namespace audqt
+
+#endif
diff --git a/src/libaudqt/playlist-management.cc b/src/libaudqt/playlist-management.cc
new file mode 100644
index 000000000000..04417f7a03e0
--- /dev/null
+++ b/src/libaudqt/playlist-management.cc
@@ -0,0 +1,90 @@
+/*
+ * playlist-management.cc
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "libaudqt.h"
+
+#include <QCheckBox>
+#include <QDialog>
+#include <QDialogButtonBox>
+#include <QLabel>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/runtime.h>
+#include <libaudcore/playlist.h>
+
+namespace audqt {
+
+static QDialog * buildDeleteDialog (int playlist)
+{
+    auto dialog = new QDialog;
+
+    auto prompt = new QLabel ((const char *) str_printf
+     (_("Do you want to permanently remove “%s”?"),
+     (const char *) aud_playlist_get_title (playlist)), dialog);
+
+    auto skip_prompt = new QCheckBox (translate_str (N_("_Don’t ask again")), dialog);
+
+    auto remove = new QPushButton (translate_str (N_("_Remove")), dialog);
+    auto cancel = new QPushButton (translate_str (N_("_Cancel")), dialog);
+
+    auto buttonbox = new QDialogButtonBox (dialog);
+    buttonbox->addButton (remove, QDialogButtonBox::AcceptRole);
+    buttonbox->addButton (cancel, QDialogButtonBox::RejectRole);
+
+    int id = aud_playlist_get_unique_id (playlist);
+    QObject::connect (buttonbox, &QDialogButtonBox::accepted, [dialog, id] () {
+        int list = aud_playlist_by_unique_id (id);
+        if (list >= 0)
+            aud_playlist_delete (list);
+        dialog->close ();
+    });
+
+    QObject::connect (buttonbox, &QDialogButtonBox::rejected, dialog, &QDialog::close);
+
+    QObject::connect (skip_prompt, &QCheckBox::stateChanged, [] (int state) {
+        aud_set_bool ("audgui", "no_confirm_playlist_delete", (state == Qt::Checked));
+    });
+
+    auto layout = new QVBoxLayout (dialog);
+    layout->addWidget (prompt);
+    layout->addWidget (skip_prompt);
+    layout->addWidget (buttonbox);
+
+    dialog->setWindowTitle (_("Remove Playlist"));
+
+    return dialog;
+}
+
+EXPORT void playlist_confirm_delete (int playlist)
+{
+    if (aud_get_bool ("audgui", "no_confirm_playlist_delete"))
+    {
+        aud_playlist_delete (playlist);
+        return;
+    }
+
+    auto dialog = buildDeleteDialog (playlist);
+    dialog->setAttribute (Qt::WA_DeleteOnClose);
+    dialog->show ();
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/plugin-menu.cc b/src/libaudqt/plugin-menu.cc
new file mode 100644
index 000000000000..2557e557887b
--- /dev/null
+++ b/src/libaudqt/plugin-menu.cc
@@ -0,0 +1,78 @@
+/*
+ * plugin-menu.cc
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "libaudqt.h"
+#include "libaudqt/menu.h"
+
+#include <QMenu>
+
+#include <libaudcore/i18n.h>
+#include <libaudcore/interface.h>
+#include <libaudcore/plugins.h>
+
+namespace audqt {
+
+static aud::array<AudMenuID, Index<SmartPtr<MenuItem>>> items;
+static aud::array<AudMenuID, QMenu *> menus;
+
+static void show_prefs (void)
+{
+    prefswin_show_plugin_page (PluginType::General);
+}
+
+MenuItem default_menu_items[] = {
+    MenuCommand ({N_("Plugins ...")}, show_prefs),
+    MenuSep (),
+};
+
+EXPORT QMenu * menu_get_by_id (AudMenuID id)
+{
+    if (menus[id])
+        return menus[id];
+
+    menus[id] = new QMenu (translate_str ("Services"));
+
+    for (auto & item : default_menu_items)
+        menus[id]->addAction (menu_action (item, PACKAGE, menus[id]));
+
+    for (auto & item : items[id])
+        menus[id]->addAction (menu_action (* item, nullptr, menus[id]));
+
+    return menus[id];
+}
+
+EXPORT void menu_add (AudMenuID id, void (* func) (void), const char * name, const char * icon)
+{
+    MenuItem * item = new MenuItem (MenuCommand ({name, icon}, func));
+    items[id].append (item);
+
+    if (menus[id])
+        menus[id]->addAction (menu_action (* item, nullptr, menus[id]));
+}
+
+EXPORT void menu_remove (AudMenuID id, void (* func) (void))
+{
+    // FIXME: remove the QAction
+    auto is_match = [func] (SmartPtr<MenuItem> & item)
+        { return item->func == func; };
+
+    items[id].remove_if (is_match, true);
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/prefs-builder.cc b/src/libaudqt/prefs-builder.cc
new file mode 100644
index 000000000000..f3ad9948432c
--- /dev/null
+++ b/src/libaudqt/prefs-builder.cc
@@ -0,0 +1,142 @@
+/*
+ * prefs-builder.cc
+ * Copyright 2014 William Pitcock and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "libaudqt.h"
+#include "prefs-widget.h"
+
+#include <QButtonGroup>
+#include <QFrame>
+#include <QLayout>
+
+#include <libaudcore/i18n.h>
+#include <libaudcore/preferences.h>
+#include <libaudcore/runtime.h>
+
+namespace audqt {
+
+void prefs_populate (QBoxLayout * layout, ArrayRef<PreferencesWidget> widgets, const char * domain)
+{
+    QButtonGroup * radio_btn_group = nullptr;
+
+    for (const PreferencesWidget & w : widgets)
+    {
+        if (radio_btn_group && w.type != PreferencesWidget::RadioButton)
+            radio_btn_group = nullptr;
+
+        switch (w.type)
+        {
+        case PreferencesWidget::Button: {
+            ButtonWidget * bw = new ButtonWidget (& w, domain);
+            layout->addWidget (bw->widget ());
+            break;
+        }
+        case PreferencesWidget::CheckButton: {
+            BooleanWidget * bw = new BooleanWidget (& w, domain);
+            layout->addWidget (bw->widget ());
+            break;
+        }
+        case PreferencesWidget::Label: {
+            LabelWidget * lw = new LabelWidget (& w, domain);
+            layout->addWidget (lw->widget ());
+            break;
+        }
+        case PreferencesWidget::SpinButton: {
+            switch (w.cfg.type) {
+            case WidgetConfig::Int: {
+                IntegerWidget * iw = new IntegerWidget (& w, domain);
+                layout->addWidget (iw->widget ());
+                break;
+            }
+            case WidgetConfig::Float: {
+                DoubleWidget * dw = new DoubleWidget (& w, domain);
+                layout->addWidget (dw->widget ());
+                break;
+            }
+            default:
+                AUDDBG("encountered unhandled configuration type %d for PreferencesWidget::SpinButton\n", w.cfg.type);
+                break;
+            }
+            break;
+        }
+        case PreferencesWidget::Entry: {
+            StringWidget * sw = new StringWidget (& w, domain);
+            layout->addWidget (sw->widget ());
+            break;
+        }
+        case PreferencesWidget::RadioButton: {
+            if (! radio_btn_group)
+                radio_btn_group = new QButtonGroup;
+
+            RadioButtonWidget * rw = new RadioButtonWidget (& w, domain);
+            layout->addWidget (rw->widget (radio_btn_group));
+            break;
+        }
+        case PreferencesWidget::FontButton: {
+            /* XXX: unimplemented */
+            AUDDBG("font buttons are unimplemented\n");
+            break;
+        }
+        case PreferencesWidget::ComboBox: {
+            ComboBoxWidget * cw = new ComboBoxWidget (& w, domain);
+            layout->addWidget (cw->widget ());
+            break;
+        }
+        case PreferencesWidget::CustomQt: {
+            if (w.data.populate)
+            {
+                QWidget * wid = (QWidget *) w.data.populate ();
+                layout->addWidget (wid);
+            }
+            break;
+        }
+
+        /* layout widgets follow */
+        case PreferencesWidget::Box: {
+            BoxWidget * bw = new BoxWidget (& w, domain);
+            layout->addWidget (bw->widget ());
+            break;
+        }
+        case PreferencesWidget::Table: {
+            TableWidget * tw = new TableWidget (& w, domain);
+            layout->addWidget (tw->widget ());
+            break;
+        }
+        case PreferencesWidget::Notebook: {
+            NotebookWidget * nw = new NotebookWidget (& w, domain);
+            layout->addWidget (nw->widget ());
+            break;
+        }
+        case PreferencesWidget::Separator: {
+            QFrame * f = new QFrame;
+            f->setFrameShape (w.data.separator.horizontal ? QFrame::HLine : QFrame::VLine);
+            layout->addWidget (f);
+            break;
+        }
+
+        /* stub handler */
+        default:
+            AUDDBG("invoked stub handler for PreferencesWidget type %d\n", w.type);
+            break;
+        }
+    }
+
+    layout->addStretch (1);
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/prefs-plugin.cc b/src/libaudqt/prefs-plugin.cc
new file mode 100644
index 000000000000..a014fbb6668f
--- /dev/null
+++ b/src/libaudqt/prefs-plugin.cc
@@ -0,0 +1,145 @@
+/*
+ * prefs-plugin.cc
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <QDialog>
+#include <QDialogButtonBox>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/plugin.h>
+#include <libaudcore/plugins.h>
+#include <libaudcore/preferences.h>
+#include <libaudcore/runtime.h>
+
+#include "libaudqt.h"
+
+namespace audqt {
+
+EXPORT void plugin_about (PluginHandle * ph)
+{
+    Plugin * header = (Plugin *) aud_plugin_get_header (ph);
+
+    if (! header)
+        return;
+
+    const char * name = header->info.name;
+    const char * text = header->info.about;
+    if (! text)
+        return;
+
+    if (header->info.domain)
+    {
+        name = dgettext (header->info.domain, name);
+        text = dgettext (header->info.domain, text);
+    }
+
+    AUDDBG ("name = %s\n", name);
+
+    simple_message (str_printf (_("About %s"), name), text);
+}
+
+struct ConfigWindow {
+    PluginHandle * ph;
+    QDialog * root;
+};
+
+static Index<ConfigWindow *> config_windows;
+
+static ConfigWindow * find_config_window (PluginHandle * ph)
+{
+    for (ConfigWindow * cw : config_windows)
+    {
+        if (cw && cw->ph == ph)
+            return cw;
+    }
+
+    return nullptr;
+}
+
+EXPORT void plugin_prefs (PluginHandle * ph)
+{
+    ConfigWindow * cw = find_config_window (ph);
+
+    if (cw)
+    {
+        window_bring_to_front (cw->root);
+        return;
+    }
+
+    Plugin * header = (Plugin *) aud_plugin_get_header (ph);
+    if (! header)
+        return;
+
+    const PluginPreferences * p = header->info.prefs;
+    if (! p)
+        return;
+
+    cw = new ConfigWindow;
+    config_windows.append (cw);
+
+    cw->ph = ph;
+    cw->root = new QDialog;
+
+    if (p->init)
+        p->init ();
+
+    const char * name = header->info.name;
+    if (header->info.domain)
+        name = dgettext (header->info.domain, name);
+
+    cw->root->setWindowTitle ((const char *) str_printf(_("%s Settings"), name));
+
+    QVBoxLayout * vbox = new QVBoxLayout (cw->root);
+
+    vbox->setSpacing (4);
+    prefs_populate (vbox, p->widgets, header->info.domain);
+
+    QDialogButtonBox * bbox = new QDialogButtonBox;
+
+    if (p->apply)
+    {
+        bbox->setStandardButtons (QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
+        bbox->button (QDialogButtonBox::Ok)->setText (translate_str (N_("_Set")));
+        bbox->button (QDialogButtonBox::Cancel)->setText (translate_str (N_("_Cancel")));
+
+        QObject::connect (bbox, &QDialogButtonBox::accepted, [=] () {
+            if (p->apply)
+                p->apply ();
+
+            cw->root->hide ();
+        });
+
+        QObject::connect (bbox, &QDialogButtonBox::rejected, cw->root, &QWidget::hide);
+    }
+    else
+    {
+        bbox->setStandardButtons (QDialogButtonBox::Close);
+        bbox->button (QDialogButtonBox::Close)->setText (translate_str (N_("_Close")));
+
+        QObject::connect (bbox, &QDialogButtonBox::rejected, cw->root, &QWidget::hide);
+    }
+
+    vbox->addWidget (bbox);
+
+    window_bring_to_front (cw->root);
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/prefs-pluginlist-model.cc b/src/libaudqt/prefs-pluginlist-model.cc
new file mode 100644
index 000000000000..af542ba1f3f6
--- /dev/null
+++ b/src/libaudqt/prefs-pluginlist-model.cc
@@ -0,0 +1,138 @@
+/*
+ * prefs-pluginlist-model.cc
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "prefs-pluginlist-model.h"
+
+#include <QIcon>
+#include <libaudcore/plugins.h>
+
+namespace audqt {
+
+PluginListModel::PluginListModel (QObject * parent, PluginType category_id) : QAbstractListModel (parent),
+    m_list (aud_plugin_list (category_id))
+{
+
+}
+
+PluginListModel::~PluginListModel ()
+{
+
+}
+
+int PluginListModel::rowCount (const QModelIndex & parent) const
+{
+    return m_list.len ();
+}
+
+int PluginListModel::columnCount (const QModelIndex & parent) const
+{
+    return NumColumns;
+}
+
+QVariant PluginListModel::headerData (int section, Qt::Orientation orientation, int role) const
+{
+    return QVariant ();
+}
+
+QVariant PluginListModel::data (const QModelIndex &index, int role) const
+{
+    int row = index.row ();
+    if (row < 0 || row >= m_list.len ())
+        return QVariant ();
+
+    PluginHandle * p = m_list[row];
+    bool enabled = aud_plugin_get_enabled (p);
+
+    switch (index.column ())
+    {
+    case NameColumn:
+        if (role == Qt::DisplayRole)
+            return QString (aud_plugin_get_name (p));
+        if (role == Qt::CheckStateRole)
+            return enabled ? Qt::Checked : Qt::Unchecked;
+
+        break;
+
+    case AboutColumn:
+        if (role == Qt::DecorationRole && enabled && aud_plugin_has_about (p))
+            return QIcon::fromTheme ("dialog-information");
+
+        break;
+
+    case SettingsColumn:
+        if (role == Qt::DecorationRole && enabled && aud_plugin_has_configure (p))
+            return QIcon::fromTheme ("preferences-system");
+
+        break;
+
+    }
+
+    return QVariant ();
+}
+
+bool PluginListModel::setData (const QModelIndex &index, const QVariant &value, int role)
+{
+    int row = index.row ();
+    if (row < 0 || row >= m_list.len ())
+        return false;
+
+    if (role == Qt::CheckStateRole)
+    {
+        aud_plugin_enable (m_list[row], value.toUInt() != Qt::Unchecked);
+    }
+
+    emit dataChanged (index, index.sibling (index.row (), NumColumns - 1));
+    return true;
+}
+
+Qt::ItemFlags PluginListModel::flags (const QModelIndex & index) const
+{
+    return (Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
+}
+
+bool PluginListModel::insertRows (int row, int count, const QModelIndex & parent)
+{
+    int last = row + count - 1;
+    beginInsertRows (parent, row, last);
+    endInsertRows ();
+    return true;
+}
+
+bool PluginListModel::removeRows (int row, int count, const QModelIndex & parent)
+{
+    int last = row + count - 1;
+    beginRemoveRows (parent, row, last);
+    endRemoveRows ();
+    return true;
+}
+
+void PluginListModel::updateRows (int row, int count)
+{
+    int bottom = row + count - 1;
+    auto topLeft = createIndex (row, 0);
+    auto bottomRight = createIndex (bottom, columnCount () - 1);
+    emit dataChanged (topLeft, bottomRight);
+}
+
+void PluginListModel::updateRow (int row)
+{
+    updateRows (row, 1);
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/prefs-pluginlist-model.h b/src/libaudqt/prefs-pluginlist-model.h
new file mode 100644
index 000000000000..0d2f09344264
--- /dev/null
+++ b/src/libaudqt/prefs-pluginlist-model.h
@@ -0,0 +1,62 @@
+/*
+ * prefs-pluginlist-model.h
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef PREFS_PLUGINLIST_MODEL_H
+#define PREFS_PLUGINLIST_MODEL_H
+
+#include <QAbstractListModel>
+#include <libaudcore/index.h>
+
+enum class PluginType;
+class PluginHandle;
+
+namespace audqt {
+
+class PluginListModel : public QAbstractListModel
+{
+public:
+    enum {
+        NameColumn,
+        AboutColumn,
+        SettingsColumn,
+        NumColumns
+    };
+
+    PluginListModel (QObject * parent, PluginType category_id);
+    ~PluginListModel ();
+
+    int rowCount (const QModelIndex & parent = QModelIndex ()) const;
+    int columnCount (const QModelIndex & parent = QModelIndex ()) const;
+    QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const;
+    QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
+    bool setData (const QModelIndex &index, const QVariant &value, int role = Qt::DisplayRole);
+    Qt::ItemFlags flags (const QModelIndex & parent = QModelIndex ()) const;
+
+    bool insertRows (int row, int count, const QModelIndex & parent = QModelIndex ());
+    bool removeRows (int row, int count, const QModelIndex & parent = QModelIndex ());
+    void updateRows (int row, int count);
+    void updateRow (int row);
+
+private:
+    const Index<PluginHandle *> & m_list;
+};
+
+} // namespace audqt
+
+#endif
diff --git a/src/libaudqt/prefs-widget.cc b/src/libaudqt/prefs-widget.cc
new file mode 100644
index 000000000000..f15a214f00b4
--- /dev/null
+++ b/src/libaudqt/prefs-widget.cc
@@ -0,0 +1,356 @@
+/*
+ * prefs-widget.cc
+ * Copyright 2007-2014 Tomasz Moń, William Pitcock, and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "prefs-widget.h"
+#include "libaudqt.h"
+
+#include <assert.h>
+
+#include <QButtonGroup>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QLineEdit>
+#include <QPushButton>
+#include <QRadioButton>
+#include <QSpinBox>
+#include <QTabWidget>
+#include <QVBoxLayout>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/i18n.h>
+
+namespace audqt {
+
+/* button */
+QWidget * ButtonWidget::widget ()
+{
+    auto button = new QPushButton (translate_str (m_parent->label, m_domain));
+    QObject::connect (button, & QPushButton::clicked, m_parent->data.button.callback);
+    return button;
+}
+
+/* boolean widget (checkbox) */
+QWidget * BooleanWidget::widget ()
+{
+    m_checkbox = new QCheckBox (translate_str (m_parent->label, m_domain));
+
+    update ();
+
+    QObject::connect (m_checkbox, & QCheckBox::stateChanged, [this] (int state) {
+        m_parent->cfg.set_bool ((state != Qt::Unchecked));
+    });
+
+    return m_checkbox;
+}
+
+void BooleanWidget::update ()
+{
+    m_checkbox->setCheckState (m_parent->cfg.get_bool () ? Qt::Checked : Qt::Unchecked);
+}
+
+/* label */
+QWidget * LabelWidget::widget ()
+{
+    return new QLabel (translate_str (m_parent->label, m_domain));
+}
+
+/* integer (radio button) */
+QWidget * RadioButtonWidget::widget (QButtonGroup * btn_group)
+{
+    m_radio = new QRadioButton (translate_str (m_parent->label, m_domain));
+
+    if (btn_group)
+        btn_group->addButton (m_radio, m_parent->data.radio_btn.value);
+
+    update ();
+
+    QObject::connect (m_radio, & QAbstractButton::clicked, [this] (bool checked) {
+        if (checked)
+            m_parent->cfg.set_int (m_parent->data.radio_btn.value);
+    });
+
+    return m_radio;
+}
+
+void RadioButtonWidget::update ()
+{
+    if (m_parent->cfg.get_int () == m_parent->data.radio_btn.value)
+        m_radio->setChecked (true);
+}
+
+/* integer (spinbox) */
+QWidget * IntegerWidget::widget ()
+{
+    auto container = new QWidget;
+    auto layout = new QHBoxLayout (container);
+
+    layout->setContentsMargins (0, 0, 0, 0);
+    layout->setSpacing (4);
+
+    if (m_parent->label)
+        layout->addWidget (new QLabel (translate_str (m_parent->label, m_domain)));
+
+    m_spinner = new QSpinBox;
+    layout->addWidget (m_spinner);
+
+    if (m_parent->data.spin_btn.right_label)
+        layout->addWidget (new QLabel (translate_str
+         (m_parent->data.spin_btn.right_label, m_domain)));
+
+    layout->addStretch (1);
+
+    update ();
+
+    /*
+     * Qt has two different valueChanged signals for spin boxes.  So we have to do an explicit
+     * cast to the type of the correct valueChanged signal.  --kaniini.
+     */
+    void (QSpinBox::* signal) (int) = & QSpinBox::valueChanged;
+    QObject::connect (m_spinner, signal, [this] (int value) {
+        m_parent->cfg.set_int (value);
+    });
+
+    return container;
+}
+
+void IntegerWidget::update ()
+{
+    m_spinner->setRange ((int) m_parent->data.spin_btn.min, (int) m_parent->data.spin_btn.max);
+    m_spinner->setSingleStep ((int) m_parent->data.spin_btn.step);
+    m_spinner->setValue (m_parent->cfg.get_int ());
+}
+
+/* double (spinbox) */
+QWidget * DoubleWidget::widget ()
+{
+    auto container = new QWidget;
+    auto layout = new QHBoxLayout (container);
+
+    layout->setContentsMargins (0, 0, 0, 0);
+    layout->setSpacing (4);
+
+    if (m_parent->label)
+        layout->addWidget (new QLabel (translate_str (m_parent->label, m_domain)));
+
+    m_spinner = new QDoubleSpinBox;
+    layout->addWidget (m_spinner);
+
+    if (m_parent->data.spin_btn.right_label)
+        layout->addWidget (new QLabel (translate_str
+         (m_parent->data.spin_btn.right_label, m_domain)));
+
+    layout->addStretch (1);
+
+    update ();
+
+    void (QDoubleSpinBox::* signal) (double) = & QDoubleSpinBox::valueChanged;
+    QObject::connect (m_spinner, signal, [this] (double value) {
+        m_parent->cfg.set_float (value);
+    });
+
+    return container;
+}
+
+void DoubleWidget::update ()
+{
+    m_spinner->setRange (m_parent->data.spin_btn.min, m_parent->data.spin_btn.max);
+    m_spinner->setSingleStep (m_parent->data.spin_btn.step);
+    m_spinner->setValue (m_parent->cfg.get_float ());
+}
+
+/* string (lineedit) */
+QWidget * StringWidget::widget ()
+{
+    auto container = new QWidget;
+    auto layout = new QHBoxLayout (container);
+
+    layout->setContentsMargins (0, 0, 0, 0);
+    layout->setSpacing (4);
+
+    if (m_parent->label)
+        layout->addWidget (new QLabel (translate_str (m_parent->label, m_domain)));
+
+    m_lineedit = new QLineEdit;
+    if (m_parent->data.entry.password)
+        m_lineedit->setEchoMode (QLineEdit::Password);
+
+    layout->addWidget (m_lineedit, 1);
+
+    update ();
+
+    QObject::connect (m_lineedit, & QLineEdit::textChanged, [this] (const QString & value) {
+        m_parent->cfg.set_string (value.toUtf8 ());
+    });
+
+    return container;
+}
+
+void StringWidget::update ()
+{
+    m_lineedit->setText ((const char *) m_parent->cfg.get_string ());
+}
+
+/* combo box widget (string or int) */
+QWidget * ComboBoxWidget::widget ()
+{
+    auto container = new QWidget;
+    auto layout = new QHBoxLayout (container);
+
+    layout->setContentsMargins (0, 0, 0, 0);
+    layout->setSpacing (4);
+
+    if (m_parent->label)
+        layout->addWidget (new QLabel (translate_str (m_parent->label, m_domain)));
+
+    m_combobox = new QComboBox;
+    layout->addWidget (m_combobox);
+    layout->addStretch (1);
+
+    update ();
+
+    void (QComboBox::* signal) (int) = & QComboBox::currentIndexChanged;
+    QObject::connect (m_combobox, signal, [this] (int idx) {
+        QVariant data = m_combobox->itemData (idx);
+
+        switch (m_parent->cfg.type) {
+        case WidgetConfig::Int:
+            m_parent->cfg.set_int (data.toInt ());
+            break;
+        case WidgetConfig::String:
+            m_parent->cfg.set_string (data.toString ().toUtf8 ());
+            break;
+        default:
+            break;
+        }
+    });
+
+    return container;
+}
+
+void ComboBoxWidget::update ()
+{
+    ArrayRef<ComboItem> items = m_parent->data.combo.elems;
+
+    if (m_parent->data.combo.fill)
+        items = m_parent->data.combo.fill ();
+
+    m_combobox->clear ();
+
+    /* add combobox items */
+    switch (m_parent->cfg.type) {
+    case WidgetConfig::Int:
+        for (const ComboItem & item : items)
+            m_combobox->addItem (translate_str (item.label, m_domain), item.num);
+        break;
+    case WidgetConfig::String:
+        for (const ComboItem & item : items)
+            m_combobox->addItem (translate_str (item.label, m_domain), item.str);
+        break;
+    default:
+        break;
+    }
+
+    /* set selected index */
+    switch (m_parent->cfg.type) {
+    case WidgetConfig::Int: {
+        int num = m_parent->cfg.get_int ();
+
+        for (int i = 0; i < items.len; i++)
+        {
+            if (items.data[i].num == num)
+            {
+                m_combobox->setCurrentIndex (i);
+                break;
+            }
+        }
+
+        break;
+    }
+    case WidgetConfig::String: {
+        String str = m_parent->cfg.get_string ();
+
+        for (int i = 0; i < items.len; i++)
+        {
+            if (! strcmp_safe (items.data[i].str, str))
+            {
+                m_combobox->setCurrentIndex (i);
+                break;
+            }
+        }
+
+        break;
+    }
+    default:
+        break;
+    }
+}
+
+/* layout widgets */
+QWidget * BoxWidget::widget ()
+{
+    auto container = new QWidget;
+
+    QBoxLayout * layout;
+    if (m_parent->data.box.horizontal)
+        layout = new QHBoxLayout (container);
+    else
+        layout = new QVBoxLayout (container);
+
+    layout->setContentsMargins (0, 0, 0, 0);
+    layout->setSpacing (4);
+    prefs_populate (layout, m_parent->data.box.widgets, m_domain);
+
+    return container;
+}
+
+QWidget * TableWidget::widget ()
+{
+    // TODO: proper table layout
+    auto container = new QWidget;
+    auto layout = new QVBoxLayout (container);
+
+    layout->setContentsMargins (0, 0, 0, 0);
+    layout->setSpacing (4);
+    prefs_populate (layout, m_parent->data.table.widgets, m_domain);
+
+    return container;
+}
+
+QWidget * NotebookWidget::widget ()
+{
+    auto tabs = new QTabWidget;
+
+    for (const NotebookTab & tab : m_parent->data.notebook.tabs)
+    {
+        auto widget = new QWidget (tabs);
+        auto layout = new QVBoxLayout (widget);
+
+        layout->setContentsMargins (0, 0, 0, 0);
+        layout->setSpacing (4);
+        prefs_populate (layout, tab.widgets, nullptr);
+
+        tabs->addTab (widget, translate_str (tab.name, m_domain));
+    }
+
+    return tabs;
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/prefs-widget.h b/src/libaudqt/prefs-widget.h
new file mode 100644
index 000000000000..a26c755a20fb
--- /dev/null
+++ b/src/libaudqt/prefs-widget.h
@@ -0,0 +1,195 @@
+/*
+ * prefs-widget.cc
+ * Copyright 2007-2014 Tomasz Moń, William Pitcock, and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDQT_PREFS_WIDGET_H
+#define LIBAUDQT_PREFS_WIDGET_H
+
+#include <libaudcore/preferences.h>
+#include <libaudcore/hook.h>
+
+class QButtonGroup;
+class QCheckBox;
+class QComboBox;
+class QDoubleSpinBox;
+class QLineEdit;
+class QRadioButton;
+class QSpinBox;
+class QWidget;
+
+namespace audqt {
+
+/*
+ * basic idea is this.  create classes which wrap the PreferencesWidgets.
+ * Each should have it's own get(), set() and widget() methods.  those are the
+ * functions that we really care about.
+ * get() and set() allow for introspection and manipulation of the underlying
+ * objects.  they also handle pinging the plugin which owns the PreferencesWidget,
+ * i.e. calling PreferencesWidget::callback().
+ * widget() builds the actual Qt side of the widget, hooks up the relevant signals
+ * to slots, etc.  the result of widget() is not const as it is linked into a
+ * layout manager or shown or whatever.
+ */
+
+/* base class which provides plumbing for hooks. */
+class HookableWidget {
+protected:
+    HookableWidget (const PreferencesWidget * parent, const char * domain) :
+        m_parent (parent), m_domain (domain)
+    {
+        if (m_parent->cfg.hook)
+            hook.capture (new HookReceiver<HookableWidget>
+             {m_parent->cfg.hook, this, & HookableWidget::update});
+    }
+
+    virtual ~HookableWidget () {}
+    virtual void update () {}
+
+    const PreferencesWidget * const m_parent;
+    const char * const m_domain;
+
+private:
+    SmartPtr<HookReceiver<HookableWidget>> hook;
+};
+
+/* button widget */
+class ButtonWidget : HookableWidget {
+public:
+    ButtonWidget (const PreferencesWidget * parent, const char * domain) :
+        HookableWidget (parent, domain) {}
+
+    QWidget * widget ();
+};
+
+/* boolean widget (checkbox) */
+class BooleanWidget : HookableWidget {
+public:
+    BooleanWidget (const PreferencesWidget * parent, const char * domain) :
+        HookableWidget (parent, domain) {}
+
+    QWidget * widget ();
+    void update ();
+
+private:
+    QCheckBox * m_checkbox;
+};
+
+/* label, no get or set functions needed. */
+class LabelWidget : HookableWidget {
+public:
+    LabelWidget (const PreferencesWidget * parent, const char * domain) :
+        HookableWidget (parent, domain) {}
+
+    QWidget * widget ();
+};
+
+/* integer widget (spinner) */
+class IntegerWidget : HookableWidget {
+public:
+    IntegerWidget (const PreferencesWidget * parent, const char * domain) :
+        HookableWidget (parent, domain) {}
+
+    QWidget * widget ();
+    void update ();
+
+private:
+    QSpinBox * m_spinner;
+};
+
+/* integer widget (radio button) */
+class RadioButtonWidget : HookableWidget {
+public:
+    RadioButtonWidget (const PreferencesWidget * parent, const char * domain) :
+        HookableWidget (parent, domain) {}
+
+    QWidget * widget (QButtonGroup * btn_group = nullptr);
+    void update ();
+
+private:
+    QRadioButton * m_radio;
+};
+
+/* double widget (spinner) */
+class DoubleWidget : HookableWidget {
+public:
+    DoubleWidget (const PreferencesWidget * parent, const char * domain = nullptr) :
+        HookableWidget (parent, domain) {}
+
+    QWidget * widget ();
+    void update ();
+
+private:
+    QDoubleSpinBox * m_spinner;
+};
+
+/* string widget (lineedit) */
+class StringWidget : HookableWidget {
+public:
+    StringWidget (const PreferencesWidget * parent, const char * domain) :
+        HookableWidget (parent, domain) {}
+
+    QWidget * widget ();
+    void update ();
+
+private:
+    QLineEdit * m_lineedit;
+};
+
+/* combo box (string or int) */
+class ComboBoxWidget : HookableWidget {
+public:
+    ComboBoxWidget (const PreferencesWidget * parent, const char * domain) :
+        HookableWidget (parent, domain) {}
+
+    QWidget * widget ();
+    void update ();
+
+private:
+    QComboBox * m_combobox;
+};
+
+/* box container widget */
+class BoxWidget : HookableWidget {
+public:
+    BoxWidget (const PreferencesWidget * parent, const char * domain) :
+        HookableWidget (parent, domain) {}
+
+    QWidget * widget ();
+};
+
+/* table container widget */
+class TableWidget : HookableWidget {
+public:
+    TableWidget (const PreferencesWidget * parent, const char * domain) :
+        HookableWidget (parent, domain) {}
+
+    QWidget * widget ();
+};
+
+/* notebook widget */
+class NotebookWidget : HookableWidget {
+public:
+    NotebookWidget (const PreferencesWidget * parent, const char * domain) :
+        HookableWidget (parent, domain) {}
+
+    QWidget * widget ();
+};
+
+} // namespace audqt
+
+#endif
diff --git a/src/libaudqt/prefs-window.cc b/src/libaudqt/prefs-window.cc
new file mode 100644
index 000000000000..8798969b7b87
--- /dev/null
+++ b/src/libaudqt/prefs-window.cc
@@ -0,0 +1,753 @@
+/*
+ * prefs-window.cc
+ * Copyright 2006-2014 William Pitcock, Tomasz Moń, Michael Färber, and
+ *                     John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <QAction>
+#include <QComboBox>
+#include <QDialog>
+#include <QDialogButtonBox>
+#include <QGridLayout>
+#include <QHeaderView>
+#include <QIcon>
+#include <QItemSelectionModel>
+#include <QLabel>
+#include <QLineEdit>
+#include <QMenu>
+#include <QPushButton>
+#include <QSignalMapper>
+#include <QStackedWidget>
+#include <QTabWidget>
+#include <QToolBar>
+#include <QTreeView>
+#include <QVBoxLayout>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/drct.h>
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/plugin.h>
+#include <libaudcore/plugins.h>
+#include <libaudcore/preferences.h>
+#include <libaudcore/runtime.h>
+
+#include "libaudqt.h"
+#include "prefs-pluginlist-model.h"
+
+#ifdef USE_CHARDET
+#include <libguess.h>
+#endif
+
+namespace audqt {
+
+struct Category {
+    const char * icon_path;
+    const char * name;
+};
+
+struct PluginCategory {
+    PluginType type;
+    const char * name;
+};
+
+struct TitleFieldTag {
+    const char * name;
+    const char * tag;
+};
+
+enum {
+    CATEGORY_APPEARANCE = 0,
+    CATEGORY_AUDIO,
+    CATEGORY_NETWORK,
+    CATEGORY_PLAYLIST,
+    CATEGORY_SONG_INFO,
+    CATEGORY_PLUGINS,
+    CATEGORY_COUNT
+};
+
+static const Category categories[] = {
+    { "appearance.png", N_("Appearance") },
+    { "audio.png", N_("Audio") },
+    { "connectivity.png", N_("Network") },
+    { "playlist.png", N_("Playlist")} ,
+    { "info.png", N_("Song Info") },
+    { "plugins.png", N_("Plugins") }
+};
+
+static const PluginCategory plugin_categories[] = {
+    { PluginType::General, N_("General") },
+    { PluginType::Effect, N_("Effect") },
+    { PluginType::Vis, N_("Visualization") },
+    { PluginType::Input, N_("Input") },
+    { PluginType::Playlist, N_("Playlist") },
+    { PluginType::Transport, N_("Transport") }
+};
+
+static const TitleFieldTag title_field_tags[] = {
+    { N_("Artist")     , "${artist}" },
+    { N_("Album")      , "${album}" },
+    { N_("Title")      , "${title}" },
+    { N_("Track number"), "${track-number}" },
+    { N_("Genre")      , "${genre}" },
+    { N_("File name")   , "${file-name}" },
+    { N_("File path")   , "${file-path}" },
+    { N_("Date")       , "${date}" },
+    { N_("Year")       , "${year}" },
+    { N_("Comment")    , "${comment}" },
+    { N_("Codec")      , "${codec}" },
+    { N_("Quality")    , "${quality}" }
+};
+
+#ifdef USE_CHARDET
+static const ComboItem chardet_detector_presets[] = {
+    ComboItem (N_("None"), ""),
+    ComboItem (N_("Arabic"), GUESS_REGION_AR),
+    ComboItem (N_("Baltic"), GUESS_REGION_BL),
+    ComboItem (N_("Chinese"), GUESS_REGION_CN),
+    ComboItem (N_("Greek"), GUESS_REGION_GR),
+    ComboItem (N_("Hebrew"), GUESS_REGION_HW),
+    ComboItem (N_("Japanese"), GUESS_REGION_JP),
+    ComboItem (N_("Korean"), GUESS_REGION_KR),
+    ComboItem (N_("Polish"), GUESS_REGION_PL),
+    ComboItem (N_("Russian"), GUESS_REGION_RU),
+    ComboItem (N_("Taiwanese"), GUESS_REGION_TW),
+    ComboItem (N_("Turkish"), GUESS_REGION_TR)
+};
+#endif
+
+static const ComboItem bitdepth_elements[] = {
+    ComboItem ("16", 16),
+    ComboItem ("24", 24),
+    ComboItem ("32", 32),
+    ComboItem (N_("Floating point"), 0)
+};
+
+static Index<ComboItem> iface_combo_elements;
+static int iface_combo_selected;
+static QWidget * iface_prefs_box;
+
+static ArrayRef<ComboItem> iface_combo_fill ();
+static void iface_combo_changed (void);
+static void * iface_create_prefs_box (void);
+
+static const PreferencesWidget appearance_page_widgets[] = {
+    WidgetLabel (N_("<b>Interface Settings</b>")),
+    WidgetCombo (N_("Interface plugin:"),
+        WidgetInt (iface_combo_selected, iface_combo_changed),
+        {0, iface_combo_fill}),
+    WidgetCustomQt (iface_create_prefs_box)
+};
+
+static Index<ComboItem> output_combo_elements;
+static int output_combo_selected;
+static QPushButton * output_config_button;
+static QPushButton * output_about_button;
+
+static ArrayRef<ComboItem> output_combo_fill ();
+static void output_combo_changed (void);
+static void * output_create_config_button (void);
+static void * output_create_about_button (void);
+static void output_bit_depth_changed (void);
+
+static const PreferencesWidget output_combo_widgets[] = {
+    WidgetCombo (N_("Output plugin:"),
+        WidgetInt (output_combo_selected, output_combo_changed),
+        {0, output_combo_fill}),
+    WidgetCustomQt (output_create_config_button),
+    WidgetCustomQt (output_create_about_button)
+};
+
+static const PreferencesWidget audio_page_widgets[] = {
+    WidgetLabel (N_("<b>Output Settings</b>")),
+    WidgetBox ({{output_combo_widgets}, true}),
+    WidgetCombo (N_("Bit depth:"),
+        WidgetInt (0, "output_bit_depth", output_bit_depth_changed),
+        {{bitdepth_elements}}),
+    WidgetSpin (N_("Buffer size:"),
+        WidgetInt (0, "output_buffer_size"),
+        {100, 10000, 1000, N_("ms")}),
+    WidgetCheck (N_("Soft clipping"),
+        WidgetBool (0, "soft_clipping")),
+    WidgetCheck (N_("Use software volume control (not recommended)"),
+        WidgetBool (0, "software_volume_control")),
+    WidgetLabel (N_("<b>Replay Gain</b>")),
+    WidgetCheck (N_("Enable Replay Gain"),
+        WidgetBool (0, "enable_replay_gain")),
+    WidgetCheck (N_("Album mode"),
+        WidgetBool (0, "replay_gain_album"),
+        WIDGET_CHILD),
+    WidgetCheck (N_("Prevent clipping (recommended)"),
+        WidgetBool (0, "enable_clipping_prevention"),
+        WIDGET_CHILD),
+    WidgetLabel (N_("<b>Adjust Levels</b>"),
+        WIDGET_CHILD),
+    WidgetSpin (N_("Amplify all files:"),
+        WidgetFloat (0, "replay_gain_preamp"),
+        {-15, 15, 0.1, N_("dB")},
+        WIDGET_CHILD),
+    WidgetSpin (N_("Amplify untagged files:"),
+        WidgetFloat (0, "default_gain"),
+        {-15, 15, 0.1, N_("dB")},
+        WIDGET_CHILD)
+};
+
+static const PreferencesWidget proxy_host_port_elements[] = {
+    WidgetEntry (N_("Proxy hostname:"),
+        WidgetString (0, "proxy_host")),
+    WidgetEntry (N_("Proxy port:"),
+        WidgetString (0, "proxy_port"))
+};
+
+static const PreferencesWidget proxy_auth_elements[] = {
+    WidgetEntry (N_("Proxy username:"),
+        WidgetString (0, "proxy_user")),
+    WidgetEntry (N_("Proxy password:"),
+        WidgetString (0, "proxy_pass"),
+        {true})
+};
+
+static const PreferencesWidget connectivity_page_widgets[] = {
+    WidgetLabel (N_("<b>Network Settings</b>")),
+    WidgetSpin (N_("Buffer size:"),
+        WidgetInt (0, "net_buffer_kb"),
+        {16, 1024, 16, N_("KiB")}),
+    WidgetLabel (N_("<b>Proxy Configuration</b>")),
+    WidgetCheck (N_("Enable proxy usage"),
+        WidgetBool (0, "use_proxy")),
+    WidgetTable ({{proxy_host_port_elements}},
+        WIDGET_CHILD),
+    WidgetCheck (N_("Use authentication with proxy"),
+        WidgetBool (0, "use_proxy_auth")),
+    WidgetTable ({{proxy_auth_elements}},
+        WIDGET_CHILD)
+};
+
+static const PreferencesWidget chardet_elements[] = {
+#ifdef USE_CHARDET
+    WidgetCombo (N_("Auto character encoding detector for:"),
+        WidgetString (0, "chardet_detector"),
+        {{chardet_detector_presets}}),
+#endif
+    WidgetEntry (N_("Fallback character encodings:"),
+        WidgetString (0, "chardet_fallback"))
+};
+
+
+static void send_title_change (void);
+static void * create_titlestring_table (void);
+
+static const PreferencesWidget playlist_page_widgets[] = {
+    WidgetLabel (N_("<b>Behavior</b>")),
+    WidgetCheck (N_("Resume playback on startup"),
+        WidgetBool (0, "resume_playback_on_startup")),
+    WidgetCheck (N_("Pause instead of resuming immediately"),
+        WidgetBool (0, "always_resume_paused"),
+        WIDGET_CHILD),
+    WidgetCheck (N_("Advance when the current song is deleted"),
+        WidgetBool (0, "advance_on_delete")),
+    WidgetCheck (N_("Clear the playlist when opening files"),
+        WidgetBool (0, "clear_playlist")),
+    WidgetCheck (N_("Open files in a temporary playlist"),
+        WidgetBool (0, "open_to_temporary")),
+    WidgetCheck (N_("Do not load metadata for songs until played"),
+        WidgetBool (0, "metadata_on_play")),
+    WidgetLabel (N_("<b>Compatibility</b>")),
+    WidgetCheck (N_("Interpret \\ (backward slash) as a folder delimiter"),
+        WidgetBool (0, "convert_backslash")),
+    WidgetTable ({{chardet_elements}}),
+    WidgetLabel (N_("<b>Song Display</b>")),
+    WidgetCheck (N_("Show song numbers"),
+        WidgetBool (0, "show_numbers_in_pl", send_title_change)),
+    WidgetCheck (N_("Show leading zeroes (02:00 instead of 2:00)"),
+        WidgetBool (0, "leading_zero", send_title_change)),
+    WidgetCustomQt (create_titlestring_table),
+    WidgetLabel (N_("<b>Advanced</b>")),
+    WidgetCheck (N_("Do not load metadata for songs until played"),
+        WidgetBool (0, "metadata_on_play")),
+    WidgetCheck (N_("Probe content of files with no recognized file name extension"),
+        WidgetBool (0, "slow_probe"))
+};
+
+static const PreferencesWidget song_info_page_widgets[] = {
+    WidgetLabel (N_("<b>Album Art</b>")),
+    WidgetLabel (N_("Search for images matching these words (comma-separated):")),
+    WidgetEntry (0, WidgetString (0, "cover_name_include")),
+    WidgetLabel (N_("Exclude images matching these words (comma-separated):")),
+    WidgetEntry (0, WidgetString (0, "cover_name_exclude")),
+    WidgetCheck (N_("Search for images matching song file name"),
+        WidgetBool (0, "use_file_cover")),
+    WidgetCheck (N_("Search recursively"),
+        WidgetBool (0, "recurse_for_cover")),
+    WidgetSpin (N_("Search depth:"),
+        WidgetInt (0, "recurse_for_cover_depth"),
+        {0, 100, 1},
+        WIDGET_CHILD),
+    WidgetLabel (N_("<b>Popup Information</b>")),
+    WidgetCheck (N_("Show popup information"),
+        WidgetBool (0, "show_filepopup_for_tuple")),
+    WidgetSpin (N_("Popup delay (tenths of a second):"),
+        WidgetInt (0, "filepopup_delay"),
+        {0, 100, 1},
+        WIDGET_CHILD),
+    WidgetCheck (N_("Show time scale for current song"),
+        WidgetBool (0, "filepopup_showprogressbar"),
+        WIDGET_CHILD)
+};
+
+#define TITLESTRING_NPRESETS 6
+
+static const char * const titlestring_presets[TITLESTRING_NPRESETS] = {
+    "${title}",
+    "${?artist:${artist} - }${title}",
+    "${?artist:${artist} - }${?album:${album} - }${title}",
+    "${?artist:${artist} - }${?album:${album} - }${?track-number:${track-number}. }${title}",
+    "${?artist:${artist} }${?album:[ ${album} ] }${?artist:- }${?track-number:${track-number}. }${title}",
+    "${?album:${album} - }${title}"
+};
+
+static const char * const titlestring_preset_names[TITLESTRING_NPRESETS] = {
+    N_("TITLE"),
+    N_("ARTIST - TITLE"),
+    N_("ARTIST - ALBUM - TITLE"),
+    N_("ARTIST - ALBUM - TRACK. TITLE"),
+    N_("ARTIST [ ALBUM ] - TRACK. TITLE"),
+    N_("ALBUM - TITLE")
+};
+
+static void * create_titlestring_table (void)
+{
+    QWidget * w = new QWidget;
+    QGridLayout * l = new QGridLayout (w);
+
+    QLabel * lbl = new QLabel (_("Title format:"), w);
+    l->addWidget (lbl, 0, 0);
+
+    QComboBox * cbox = new QComboBox (w);
+    l->addWidget (cbox, 0, 1);
+
+    for (int i = 0; i < TITLESTRING_NPRESETS; i++)
+        cbox->addItem (translate_str (titlestring_preset_names [i]), i);
+    cbox->addItem (_("Custom"), TITLESTRING_NPRESETS);
+    cbox->setCurrentIndex (TITLESTRING_NPRESETS);
+
+    lbl = new QLabel (_("Custom string:"), w);
+    l->addWidget (lbl, 1, 0);
+
+    QLineEdit * le = new QLineEdit (w);
+    l->addWidget (le, 1, 1);
+
+    String format = aud_get_str (nullptr, "generic_title_format");
+    le->setText ((const char *) format);
+    for (int i = 0; i < TITLESTRING_NPRESETS; i++)
+    {
+        if (! strcmp (titlestring_presets [i], format))
+        {
+            cbox->setCurrentIndex (i);
+        }
+    }
+
+    QObject::connect (le, &QLineEdit::textChanged, [=] (const QString & text) {
+        aud_set_str (nullptr, "generic_title_format", text.toLocal8Bit ().data ());
+    });
+
+    QObject::connect (cbox,
+                      static_cast <void (QComboBox::*) (int)> (&QComboBox::currentIndexChanged),
+                      [=] (int idx) {
+        if (idx < TITLESTRING_NPRESETS)
+            le->setText (titlestring_presets [idx]);
+    });
+
+    /* build menu */
+    QPushButton * btn_mnu = new QPushButton (w);
+    btn_mnu->setIcon (QIcon::fromTheme ("list-add"));
+    l->addWidget (btn_mnu, 1, 2);
+
+    QMenu * mnu_fields = new QMenu (w);
+
+    for (auto & t : title_field_tags)
+    {
+        QAction * a = mnu_fields->addAction (_(t.name));
+        QObject::connect (a, &QAction::triggered, [=] () {
+            le->insert (t.tag);
+        });
+    }
+
+    QObject::connect (btn_mnu, &QAbstractButton::clicked, [=] () {
+        mnu_fields->popup (btn_mnu->mapToGlobal (QPoint (0, 0)));
+    });
+
+    return w;
+}
+
+static Index<ComboItem> fill_plugin_combo (PluginType type)
+{
+    Index<ComboItem> elems;
+    int i = 0;
+
+    for (PluginHandle * plugin : aud_plugin_list (type))
+        elems.append (aud_plugin_get_name (plugin), i ++);
+
+    return elems;
+}
+
+static void send_title_change (void)
+{
+    if (aud_drct_get_ready ())
+        hook_call ("title change", nullptr);
+}
+
+static void iface_fill_prefs_box (void)
+{
+    Plugin * header = (Plugin *) aud_plugin_get_header (aud_plugin_get_current (PluginType::Iface));
+    if (header && header->info.prefs)
+    {
+        QVBoxLayout * vbox = new QVBoxLayout (iface_prefs_box);
+
+        vbox->setContentsMargins (0, 0, 0, 0);
+        vbox->setSpacing (4);
+        prefs_populate (vbox, header->info.prefs->widgets, header->info.domain);
+    }
+}
+
+#ifdef XXX_NOTYET
+static int iface_combo_changed_finish (void *)
+{
+    iface_fill_prefs_box ();
+    gtk_widget_show_all (iface_prefs_box);
+
+    audgui_cleanup ();
+
+    return G_SOURCE_REMOVE;
+}
+#endif
+
+static void iface_combo_changed (void)
+{
+#ifdef XXX_NOTYET
+    /* prevent audgui from being shut down during the switch */
+    audgui_init ();
+
+    gtk_container_foreach ((GtkContainer *) iface_prefs_box,
+     (GtkCallback) gtk_widget_destroy, nullptr);
+
+    aud_plugin_enable (aud_plugin_by_index (PluginType::Iface, iface_combo_selected), true);
+
+    /* now wait till we have restarted into the new main loop */
+    g_idle_add_full (G_PRIORITY_HIGH, iface_combo_changed_finish, nullptr, nullptr);
+#endif
+}
+
+static ArrayRef<ComboItem> iface_combo_fill ()
+{
+    if (! iface_combo_elements.len ())
+    {
+        iface_combo_elements = fill_plugin_combo (PluginType::Iface);
+        iface_combo_selected = aud_plugin_list (PluginType::Iface)
+         .find (aud_plugin_get_current (PluginType::Iface));
+    }
+
+    return {iface_combo_elements.begin (), iface_combo_elements.len ()};
+}
+
+static void * iface_create_prefs_box (void)
+{
+    iface_prefs_box = new QWidget;
+    iface_fill_prefs_box ();
+    return iface_prefs_box;
+}
+
+static void output_combo_changed (void)
+{
+    PluginHandle * plugin = aud_plugin_list (PluginType::Output)[output_combo_selected];
+
+    if (aud_plugin_enable (plugin, true))
+    {
+        output_config_button->setEnabled (aud_plugin_has_configure (plugin));
+        output_about_button->setEnabled (aud_plugin_has_about (plugin));
+    }
+}
+
+static void * output_create_config_button (void)
+{
+    bool enabled = aud_plugin_has_configure (aud_plugin_get_current (PluginType::Output));
+
+    output_config_button = new QPushButton (translate_str (N_("_Settings")));
+    output_config_button->setEnabled (enabled);
+
+    QObject::connect (output_config_button, &QAbstractButton::clicked, [=] (bool) {
+        plugin_prefs (aud_plugin_get_current (PluginType::Output));
+    });
+
+    return output_config_button;
+}
+
+static void * output_create_about_button (void)
+{
+    bool enabled = aud_plugin_has_about (aud_plugin_get_current (PluginType::Output));
+
+    output_about_button = new QPushButton (translate_str (N_("_About")));
+    output_about_button->setEnabled (enabled);
+
+    QObject::connect (output_about_button, &QAbstractButton::clicked, [=] (bool) {
+        plugin_about (aud_plugin_get_current (PluginType::Output));
+    });
+
+    return output_about_button;
+}
+
+static ArrayRef<ComboItem> output_combo_fill ()
+{
+    if (! output_combo_elements.len ())
+    {
+        output_combo_elements = fill_plugin_combo (PluginType::Output);
+        output_combo_selected = aud_plugin_list (PluginType::Output)
+         .find (aud_plugin_get_current (PluginType::Output));
+    }
+
+    return {output_combo_elements.begin (), output_combo_elements.len ()};
+}
+
+static void output_bit_depth_changed (void)
+{
+    aud_output_reset (OutputReset::ReopenStream);
+}
+
+static void create_appearance_category (QStackedWidget * category_notebook)
+{
+    QWidget * w = new QWidget;
+    QVBoxLayout * vbox = new QVBoxLayout (w);
+
+    vbox->setContentsMargins (0, 0, 0, 0);
+    vbox->setSpacing (4);
+    prefs_populate (vbox, appearance_page_widgets, nullptr);
+
+    category_notebook->addWidget (w);
+}
+
+static void create_audio_category (QStackedWidget * category_notebook)
+{
+    QWidget * audio_page = new QWidget;
+    QVBoxLayout * audio_page_vbox = new QVBoxLayout;
+
+    audio_page_vbox->setContentsMargins (0, 0, 0, 0);
+    audio_page_vbox->setSpacing (4);
+    prefs_populate (audio_page_vbox, audio_page_widgets, nullptr);
+
+    audio_page->setLayout (audio_page_vbox);
+    category_notebook->addWidget (audio_page);
+}
+
+static void create_connectivity_category (QStackedWidget * category_notebook)
+{
+    QWidget * connectivity_page = new QWidget;
+    QVBoxLayout * connectivity_page_vbox = new QVBoxLayout (connectivity_page);
+
+    connectivity_page_vbox->setContentsMargins (0, 0, 0, 0);
+    connectivity_page_vbox->setSpacing (4);
+    prefs_populate (connectivity_page_vbox, connectivity_page_widgets, nullptr);
+
+    category_notebook->addWidget (connectivity_page);
+}
+
+static void create_playlist_category (QStackedWidget * category_notebook)
+{
+    QWidget * playlist_page = new QWidget;
+    QVBoxLayout * playlist_page_vbox = new QVBoxLayout (playlist_page);
+
+    playlist_page_vbox->setContentsMargins (0, 0, 0, 0);
+    playlist_page_vbox->setSpacing (4);
+    prefs_populate (playlist_page_vbox, playlist_page_widgets, nullptr);
+
+    category_notebook->addWidget (playlist_page);
+}
+
+static void create_song_info_category (QStackedWidget * category_notebook)
+{
+    QWidget * song_info_page = new QWidget;
+    QVBoxLayout * song_info_page_vbox = new QVBoxLayout (song_info_page);
+
+    song_info_page_vbox->setContentsMargins (0, 0, 0, 0);
+    song_info_page_vbox->setSpacing (4);
+    prefs_populate (song_info_page_vbox, song_info_page_widgets, nullptr);
+
+    category_notebook->addWidget (song_info_page);
+}
+
+static void create_plugin_category_page (PluginType category_id, const char * category_name, QTabWidget * parent)
+{
+    QTreeView * view = new QTreeView;
+    QHeaderView * header = view->header ();
+
+    view->setIndentation (0);
+    view->setModel (new PluginListModel (nullptr, category_id));
+    view->setSelectionMode (view->NoSelection);
+
+    header->hide ();
+    header->setSectionResizeMode (header->ResizeToContents);
+    header->setStretchLastSection (false);
+
+    parent->addTab (view, category_name);
+
+    QObject::connect (view, & QAbstractItemView::clicked,
+     [category_id] (const QModelIndex & index)
+    {
+        int row = index.row ();
+        auto & list = aud_plugin_list (category_id);
+
+        if (row < 0 || row >= list.len () || ! aud_plugin_get_enabled (list[row]))
+            return;
+
+        switch (index.column ())
+        {
+            case PluginListModel::AboutColumn:
+                plugin_about (list[row]);
+                break;
+            case PluginListModel::SettingsColumn:
+                plugin_prefs (list[row]);
+                break;
+        }
+    });
+}
+
+static QTabWidget * plugin_tabs = nullptr;
+
+static void create_plugin_category (QStackedWidget * parent)
+{
+    plugin_tabs = new QTabWidget;
+
+    for (const PluginCategory & w : plugin_categories)
+    {
+        create_plugin_category_page (w.type, _(w.name), plugin_tabs);
+    }
+
+    parent->addWidget (plugin_tabs);
+}
+
+static QDialog * s_prefswin = nullptr;
+static QStackedWidget * s_category_notebook = nullptr;
+
+static void create_prefs_window ()
+{
+    s_prefswin = new QDialog;
+    s_prefswin->setWindowTitle (_("Audacious Settings"));
+    s_prefswin->setAttribute (Qt::WA_DeleteOnClose);
+
+    QObject::connect (s_prefswin, & QObject::destroyed, [] () {
+        s_prefswin = nullptr;
+    });
+
+    QVBoxLayout * vbox_parent = new QVBoxLayout (s_prefswin);
+
+    vbox_parent->setSpacing (0);
+    vbox_parent->setContentsMargins (0, 0, 0, 0);
+
+    QToolBar * toolbar = new QToolBar;
+    toolbar->setToolButtonStyle (Qt::ToolButtonTextUnderIcon);
+    vbox_parent->addWidget (toolbar);
+
+    QWidget * child = new QWidget;
+    QVBoxLayout * child_vbox = new QVBoxLayout (child);
+    vbox_parent->addWidget (child);
+
+    s_category_notebook = new QStackedWidget;
+    child_vbox->addWidget (s_category_notebook);
+
+    create_appearance_category (s_category_notebook);
+    create_audio_category (s_category_notebook);
+    create_connectivity_category (s_category_notebook);
+    create_playlist_category (s_category_notebook);
+    create_song_info_category (s_category_notebook);
+    create_plugin_category (s_category_notebook);
+
+    QDialogButtonBox * bbox = new QDialogButtonBox (QDialogButtonBox::Close);
+    bbox->button (QDialogButtonBox::Close)->setText (translate_str (N_("_Close")));
+    child_vbox->addWidget (bbox);
+
+    QObject::connect (bbox, &QDialogButtonBox::rejected, s_prefswin, &QObject::deleteLater);
+
+    QSignalMapper * mapper = new QSignalMapper;
+    const char * data_dir = aud_get_path (AudPath::DataDir);
+
+    QObject::connect (mapper, static_cast <void (QSignalMapper::*)(int)>(&QSignalMapper::mapped),
+                      s_category_notebook, static_cast <void (QStackedWidget::*)(int)>(&QStackedWidget::setCurrentIndex));
+
+    for (int i = 0; i < CATEGORY_COUNT; i++)
+    {
+        QIcon ico (QString (filename_build ({data_dir, "images", categories[i].icon_path})));
+        QAction * a = new QAction (ico, translate_str (categories[i].name), nullptr);
+
+        toolbar->addAction (a);
+
+        mapper->setMapping (a, i);
+
+        QObject::connect (a, &QAction::triggered, mapper, static_cast <void (QSignalMapper::*)()>(&QSignalMapper::map));
+    }
+}
+
+EXPORT void prefswin_show ()
+{
+    if (! s_prefswin)
+        create_prefs_window ();
+
+    window_bring_to_front (s_prefswin);
+}
+
+EXPORT void prefswin_hide ()
+{
+    delete s_prefswin;
+}
+
+EXPORT void prefswin_show_page (int id, bool show)
+{
+    if (id < 0 || id > CATEGORY_COUNT)
+        return;
+
+    if (! s_prefswin)
+        create_prefs_window ();
+
+    s_category_notebook->setCurrentIndex (id);
+
+    if (show)
+        window_bring_to_front (s_prefswin);
+}
+
+EXPORT void prefswin_show_plugin_page (PluginType type)
+{
+    if (! s_prefswin)
+        create_prefs_window ();
+
+    if (type == PluginType::Iface)
+        return prefswin_show_page (CATEGORY_APPEARANCE);
+    else if (type == PluginType::Output)
+        return prefswin_show_page (CATEGORY_AUDIO);
+    else
+    {
+        prefswin_show_page (CATEGORY_PLUGINS, false);
+
+        for (const PluginCategory & category : plugin_categories)
+        {
+            if (category.type == type)
+                plugin_tabs->setCurrentIndex (& category - plugin_categories);
+        }
+
+        window_bring_to_front (s_prefswin);
+    }
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/queue-manager.cc b/src/libaudqt/queue-manager.cc
new file mode 100644
index 000000000000..4bf201cbac1a
--- /dev/null
+++ b/src/libaudqt/queue-manager.cc
@@ -0,0 +1,198 @@
+/*
+ * queue-manager.cc
+ * Copyright 2014 William Pitcock, John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "libaudqt.h"
+
+#include <QAbstractListModel>
+#include <QDialog>
+#include <QDialogButtonBox>
+#include <QPushButton>
+#include <QHeaderView>
+#include <QItemSelectionModel>
+#include <QTreeView>
+#include <QVBoxLayout>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/playlist.h>
+#include <libaudcore/hook.h>
+#include <libaudcore/i18n.h>
+
+/*
+ * TODO:
+ *     - shifting of selection entries
+ */
+
+namespace audqt {
+
+class QueueManagerModel : public QAbstractListModel {
+public:
+    QueueManagerModel (QObject * parent = nullptr) : QAbstractListModel (parent) {}
+
+    int rowCount (const QModelIndex & parent = QModelIndex()) const;
+    int columnCount (const QModelIndex & parent = QModelIndex()) const;
+    QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const;
+
+    void reset ();
+};
+
+int QueueManagerModel::rowCount (const QModelIndex & parent) const
+{
+    return aud_playlist_queue_count (aud_playlist_get_active ());
+}
+
+int QueueManagerModel::columnCount (const QModelIndex & parent) const
+{
+    return 2;
+}
+
+QVariant QueueManagerModel::data (const QModelIndex & index, int role) const
+{
+    if (role == Qt::DisplayRole)
+    {
+        int list = aud_playlist_get_active ();
+        int entry = aud_playlist_queue_get_entry (list, index.row ());
+
+        if (index.column () == 0)
+            return entry;
+        else
+        {
+            Tuple tuple = aud_playlist_entry_get_tuple (list, entry, Playlist::Guess);
+            return QString ((const char *) tuple.get_str (Tuple::FormattedTitle));
+        }
+    }
+    else if (role == Qt::TextAlignmentRole && index.column () == 0)
+        return Qt::AlignRight;
+
+    return QVariant ();
+}
+
+void QueueManagerModel::reset ()
+{
+    beginResetModel ();
+    endResetModel ();
+}
+
+class QueueManagerDialog : public QDialog {
+public:
+    QueueManagerDialog (QWidget * parent = nullptr);
+
+private:
+    QVBoxLayout m_layout;
+    QTreeView m_treeview;
+    QDialogButtonBox m_buttonbox;
+    QPushButton m_btn_unqueue;
+    QPushButton m_btn_close;
+    QueueManagerModel m_model;
+
+    void update (Playlist::UpdateLevel level);
+    void removeSelected ();
+
+    const HookReceiver<QueueManagerDialog, Playlist::UpdateLevel>
+     update_hook {"playlist update", this, & QueueManagerDialog::update};
+    const HookReceiver<QueueManagerModel>
+     activate_hook {"playlist activate", & m_model, & QueueManagerModel::reset};
+};
+
+QueueManagerDialog::QueueManagerDialog (QWidget * parent) :
+    QDialog (parent)
+{
+    m_btn_unqueue.setText (translate_str (N_("_Unqueue")));
+    m_btn_close.setText (translate_str (N_("_Close")));
+
+    connect (& m_btn_close, &QAbstractButton::clicked, this, &QWidget::hide);
+    connect (& m_btn_unqueue, &QAbstractButton::clicked, this, &QueueManagerDialog::removeSelected);
+
+    m_buttonbox.addButton (& m_btn_close, QDialogButtonBox::AcceptRole);
+    m_buttonbox.addButton (& m_btn_unqueue, QDialogButtonBox::AcceptRole);
+
+    m_layout.addWidget (& m_treeview);
+    m_layout.addWidget (& m_buttonbox);
+
+    m_treeview.setIndentation (0);
+    m_treeview.setModel (& m_model);
+    m_treeview.setSelectionMode (QAbstractItemView::ExtendedSelection);
+    m_treeview.header ()->hide ();
+
+    setLayout (& m_layout);
+    setWindowTitle (_("Queue Manager"));
+
+    QItemSelectionModel * model = m_treeview.selectionModel ();
+    connect (model, &QItemSelectionModel::selectionChanged, [=] (const QItemSelection & selected, const QItemSelection & deselected) {
+        int list = aud_playlist_get_active ();
+
+        for (auto & index : selected.indexes ())
+            aud_playlist_entry_set_selected (list, aud_playlist_queue_get_entry (list, index.row ()), true);
+
+        for (auto & index : deselected.indexes ())
+            aud_playlist_entry_set_selected (list, aud_playlist_queue_get_entry (list, index.row ()), false);
+    });
+
+    resize (500, 250);
+}
+
+void QueueManagerDialog::update (Playlist::UpdateLevel level)
+{
+    /* resetting the model due to selection updates causes breakage, so don't do it. */
+    if (level != Playlist::Selection)
+        m_model.reset ();
+}
+
+void QueueManagerDialog::removeSelected ()
+{
+    int list = aud_playlist_get_active ();
+    int count = aud_playlist_queue_count (list);
+
+    for (int i = 0; i < count; )
+    {
+        int entry = aud_playlist_queue_get_entry (list, i);
+
+        if (aud_playlist_entry_get_selected (list, entry))
+        {
+            aud_playlist_queue_delete (list, i, 1);
+            aud_playlist_entry_set_selected (list, entry, false);
+            count --;
+        }
+        else
+            i ++;
+    }
+}
+
+static QueueManagerDialog * s_queuemgr = nullptr;
+
+EXPORT void queue_manager_show ()
+{
+    if (! s_queuemgr)
+    {
+        s_queuemgr = new QueueManagerDialog;
+        s_queuemgr->setAttribute (Qt::WA_DeleteOnClose);
+
+        QObject::connect (s_queuemgr, & QObject::destroyed, [] () {
+            s_queuemgr = nullptr;
+        });
+    }
+
+    window_bring_to_front (s_queuemgr);
+}
+
+EXPORT void queue_manager_hide ()
+{
+    delete s_queuemgr;
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/util.cc b/src/libaudqt/util.cc
new file mode 100644
index 000000000000..ff71380cadc8
--- /dev/null
+++ b/src/libaudqt/util.cc
@@ -0,0 +1,90 @@
+/*
+ * util.cc
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <QDialog>
+#include <QDialogButtonBox>
+#include <QLabel>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/i18n.h>
+#include <libaudcore/runtime.h>
+
+#include "libaudqt.h"
+
+namespace audqt {
+
+EXPORT void cleanup ()
+{
+    aboutwindow_hide ();
+    equalizer_hide ();
+    infowin_hide ();
+    log_inspector_hide ();
+    prefswin_hide ();
+    queue_manager_hide ();
+}
+
+/* the goal is to force a window to come to the front on any Qt platform */
+EXPORT void window_bring_to_front (QWidget * window)
+{
+    window->show ();
+
+    Qt::WindowStates state = window->windowState ();
+
+    state &= ~Qt::WindowMinimized;
+    state |= Qt::WindowActive;
+
+    window->setWindowState (state);
+    window->raise ();
+    window->activateWindow ();
+}
+
+EXPORT void simple_message (const char * title, const char * text)
+{
+    QDialog msgbox;
+    QVBoxLayout vbox;
+    QLabel label;
+    QDialogButtonBox bbox;
+
+    label.setText (text);
+    label.setTextInteractionFlags (Qt::TextSelectableByMouse);
+
+    bbox.setStandardButtons (QDialogButtonBox::Close);
+    bbox.button (QDialogButtonBox::Close)->setText (translate_str (N_("_Close")));
+
+    QObject::connect (& bbox, & QDialogButtonBox::rejected, & msgbox, & QDialog::reject);
+
+    vbox.setSizeConstraint (QLayout::SetFixedSize);
+    vbox.addWidget (& label);
+    vbox.addWidget (& bbox);
+
+    msgbox.setWindowTitle (title);
+    msgbox.setLayout (& vbox);
+    msgbox.exec ();
+}
+
+/* translate GTK+ accelerators and also handle dgettext() */
+EXPORT QString translate_str (const char * str, const char * domain)
+{
+    /* translate the GTK+ accelerator (_) into a Qt accelerator (&) */
+    return QString (dgettext (domain, str)).replace ('_', '&');
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/volumebutton.cc b/src/libaudqt/volumebutton.cc
new file mode 100644
index 000000000000..32f2d4dd70ff
--- /dev/null
+++ b/src/libaudqt/volumebutton.cc
@@ -0,0 +1,103 @@
+/*
+ * volumebutton.cc
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "volumebutton.h"
+#include "libaudqt.h"
+
+#include <QIcon>
+#include <QSlider>
+#include <QVBoxLayout>
+#include <QWheelEvent>
+
+#include <libaudcore/drct.h>
+
+namespace audqt {
+
+EXPORT VolumeButton::VolumeButton (QWidget * parent) :
+    QToolButton (parent)
+{
+    setFocusPolicy (Qt::NoFocus);
+
+    auto layout = new QVBoxLayout (this);
+    layout->setContentsMargins (6, 6, 6, 6);
+
+    m_slider = new QSlider (Qt::Vertical, this);
+    m_slider->setRange (0, 100);
+
+    layout->addWidget (m_slider);
+
+    m_container = new QWidget;
+    m_container->setLayout (layout);
+
+    updateVolume ();
+
+    connect (this, & QAbstractButton::clicked, this, & VolumeButton::showSlider);
+    connect (m_slider, & QAbstractSlider::valueChanged, this, & VolumeButton::setVolume);
+}
+
+void VolumeButton::updateIcon (int val)
+{
+    if (val == 0)
+        setIcon (QIcon::fromTheme ("audio-volume-muted"));
+    else if (val > 0 && val < 35)
+        setIcon (QIcon::fromTheme ("audio-volume-low"));
+    else if (val >= 35 && val < 70)
+        setIcon (QIcon::fromTheme ("audio-volume-medium"));
+    else if (val >= 70)
+        setIcon (QIcon::fromTheme ("audio-volume-high"));
+
+    setToolTip (QString ("%1 %").arg (val));
+}
+
+void VolumeButton::updateVolume ()
+{
+    int val = aud_drct_get_volume_main ();
+    updateIcon (val);
+    m_slider->setValue (val);
+}
+
+void VolumeButton::showSlider ()
+{
+    m_container->setWindowFlags (Qt::Popup);
+    m_container->move (mapToGlobal (QPoint (0, 0)));
+
+    window_bring_to_front (m_container);
+}
+
+void VolumeButton::setVolume (int val)
+{
+    aud_drct_set_volume_main (val);
+    updateIcon (val);
+}
+
+void VolumeButton::wheelEvent (QWheelEvent * event)
+{
+    int val = m_slider->value ();
+    int y = event->angleDelta ().y ();
+
+    if (y < 0 && val > 0)
+        val--;
+    else if (y > 0 && val < 100)
+        val++;
+
+    setVolume (val);
+    m_slider->setValue (val);
+}
+
+} // namespace audqt
diff --git a/src/libaudqt/volumebutton.h b/src/libaudqt/volumebutton.h
new file mode 100644
index 000000000000..f58a49c51d4c
--- /dev/null
+++ b/src/libaudqt/volumebutton.h
@@ -0,0 +1,48 @@
+/*
+ * volumebutton.h
+ * Copyright 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#ifndef LIBAUDQT_VOLUMEBUTTON_H
+#define LIBAUDQT_VOLUMEBUTTON_H
+
+#include <QToolButton>
+
+class QSlider;
+
+namespace audqt {
+
+class VolumeButton : public QToolButton
+{
+public:
+    VolumeButton (QWidget * parent = nullptr);
+
+private:
+    void updateIcon (int val);
+    void updateVolume ();
+    void showSlider ();
+    void setVolume (int val);
+
+    void wheelEvent (QWheelEvent * event);
+
+    QSlider * m_slider;
+    QWidget * m_container;
+};
+
+} // namespace audqt
+
+#endif
diff --git a/src/libaudtag/Makefile b/src/libaudtag/Makefile
index 98086d7056c9..9a200f407371 100644
--- a/src/libaudtag/Makefile
+++ b/src/libaudtag/Makefile
@@ -1,21 +1,23 @@
 SHARED_LIB = ${LIB_PREFIX}audtag${LIB_SUFFIX}
-LIB_MAJOR = 1
+LIB_MAJOR = 2
 LIB_MINOR = 0
 
-SRCS = audtag.c		\
-       util.c		\
-       tag_module.c	\
-       id3/id3-common.c \
-       id3/id3v1.c	\
-       id3/id3v22.c	\
-       id3/id3v24.c	\
-       ape/ape.c
+SRCS = audtag.cc		\
+       util.cc		\
+       tag_module.cc	\
+       id3/id3-common.cc \
+       id3/id3v1.cc	\
+       id3/id3v22.cc	\
+       id3/id3v24.cc	\
+       ape/ape.cc
 
 INCLUDES = audtag.h
 
 include ../../buildsys.mk
 include ../../extra.mk
 
+LD = ${CXX}
+
 CPPFLAGS := -I.. -I../.. \
             ${CPPFLAGS} \
             ${GLIB_CFLAGS}
diff --git a/src/libaudtag/ape/ape.c b/src/libaudtag/ape/ape.c
deleted file mode 100644
index b755a049e139..000000000000
--- a/src/libaudtag/ape/ape.c
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- * ape.c
- * Copyright 2010 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-/* TODO:
- * - Support updating files that have their tag at the beginning?
- */
-
-#include <glib.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <libaudcore/audstrings.h>
-#include <libaudcore/vfs.h>
-
-#include "ape.h"
-
-#pragma pack(push) /* must be byte-aligned */
-#pragma pack(1)
-typedef struct
-{
-    char magic[8];
-    uint32_t version; /* LE */
-    uint32_t length; /* LE */
-    uint32_t items; /* LE */
-    uint32_t flags; /* LE */
-    uint64_t reserved;
-}
-APEHeader;
-#pragma pack(pop)
-
-typedef struct
-{
-    char * key, * value;
-}
-ValuePair;
-
-#define APE_FLAG_HAS_HEADER (1 << 31)
-#define APE_FLAG_HAS_NO_FOOTER (1 << 30)
-#define APE_FLAG_IS_HEADER (1 << 29)
-
-static bool_t ape_read_header (VFSFile * handle, APEHeader * header)
-{
-    if (vfs_fread (header, 1, sizeof (APEHeader), handle) != sizeof (APEHeader))
-        return FALSE;
-
-    if (strncmp (header->magic, "APETAGEX", 8))
-        return FALSE;
-
-    header->version = GUINT32_FROM_LE (header->version);
-    header->length = GUINT32_FROM_LE (header->length);
-    header->items = GUINT32_FROM_LE (header->items);
-    header->flags = GUINT32_FROM_LE (header->flags);
-
-    if (header->length < sizeof (APEHeader))
-        return FALSE;
-
-    return TRUE;
-}
-
-static bool_t ape_find_header (VFSFile * handle, APEHeader * header,
- int * start, int * length, int * data_start, int * data_length)
-{
-    APEHeader secondary;
-
-    if (vfs_fseek (handle, 0, SEEK_SET))
-        return FALSE;
-
-    if (ape_read_header (handle, header))
-    {
-        TAGDBG ("Found header at 0, length = %d, version = %d.\n",
-         (int) header->length, (int) header->version);
-
-        * start = 0;
-        * length = header->length;
-        * data_start = sizeof (APEHeader);
-        * data_length = header->length - sizeof (APEHeader);
-
-        if (! (header->flags & APE_FLAG_HAS_HEADER) || ! (header->flags & APE_FLAG_IS_HEADER))
-        {
-            TAGDBG ("Invalid header flags (%u).\n", (unsigned int) header->flags);
-            return FALSE;
-        }
-
-        if (! (header->flags & APE_FLAG_HAS_NO_FOOTER))
-        {
-            if (vfs_fseek (handle, header->length, SEEK_CUR))
-                return FALSE;
-
-            if (! ape_read_header (handle, & secondary))
-            {
-                TAGDBG ("Expected footer, but found none.\n");
-                return FALSE;
-            }
-
-            * length += sizeof (APEHeader);
-        }
-
-        return TRUE;
-    }
-
-    if (vfs_fseek (handle, -(int) sizeof (APEHeader), SEEK_END))
-        return FALSE;
-
-    if (! ape_read_header (handle, header))
-    {
-        /* APE tag may be followed by an ID3v1 tag */
-        if (vfs_fseek (handle, -128 - (int) sizeof (APEHeader), SEEK_END))
-            return FALSE;
-
-        if (! ape_read_header (handle, header))
-        {
-            TAGDBG ("No header found.\n");
-            return FALSE;
-        }
-    }
-
-    TAGDBG ("Found footer at %d, length = %d, version = %d.\n",
-     (int) vfs_ftell (handle) - (int) sizeof (APEHeader), (int) header->length,
-     (int) header->version);
-
-    * start = vfs_ftell (handle) - header->length;
-    * length = header->length;
-    * data_start = vfs_ftell (handle) - header->length;
-    * data_length = header->length - sizeof (APEHeader);
-
-    if ((header->flags & APE_FLAG_HAS_NO_FOOTER) || (header->flags & APE_FLAG_IS_HEADER))
-    {
-        TAGDBG ("Invalid footer flags (%u).\n", (unsigned) header->flags);
-        return FALSE;
-    }
-
-    if (header->flags & APE_FLAG_HAS_HEADER)
-    {
-        if (vfs_fseek (handle, -(int) header->length - sizeof (APEHeader), SEEK_CUR))
-            return FALSE;
-
-        if (! ape_read_header (handle, & secondary))
-        {
-            TAGDBG ("Expected header, but found none.\n");
-            return FALSE;
-        }
-
-        * start -= sizeof (APEHeader);
-        * length += sizeof (APEHeader);
-    }
-
-    return TRUE;
-}
-
-static bool_t ape_is_our_file (VFSFile * handle)
-{
-    APEHeader header;
-    int start, length, data_start, data_length;
-
-    return ape_find_header (handle, & header, & start, & length, & data_start,
-     & data_length);
-}
-
-static ValuePair * ape_read_item (void * * data, int length)
-{
-    uint32_t * header = * data;
-    char * value;
-    ValuePair * pair;
-
-    if (length < 8)
-    {
-        TAGDBG ("Expected item, but only %d bytes remain in tag.\n", length);
-        return NULL;
-    }
-
-    value = memchr ((char *) (* data) + 8, 0, length - 8);
-
-    if (value == NULL)
-    {
-        TAGDBG ("Unterminated item key (max length = %d).\n", length - 8);
-        return NULL;
-    }
-
-    value ++;
-
-    if (header[0] > (char *) (* data) + length - value)
-    {
-        TAGDBG ("Item value of length %d, but only %d bytes remain in tag.\n",
-         (int) header[0], (int) ((char *) (* data) + length - value));
-        return NULL;
-    }
-
-    pair = g_slice_new (ValuePair);
-    pair->key = str_get ((char *) (* data) + 8);
-    pair->value = str_nget (value, header[0]);
-
-    * data = value + header[0];
-
-    return pair;
-}
-
-static GList * ape_read_items (VFSFile * handle)
-{
-    GList * list = NULL;
-    APEHeader header;
-    int start, length, data_start, data_length;
-    void * data, * item;
-
-    if (! ape_find_header (handle, & header, & start, & length, & data_start,
-     & data_length))
-        return NULL;
-
-    if (vfs_fseek (handle, data_start, SEEK_SET))
-        return NULL;
-
-    data = g_malloc (data_length);
-
-    if (vfs_fread (data, 1, data_length, handle) != data_length)
-    {
-        g_free (data);
-        return NULL;
-    }
-
-    TAGDBG ("Reading %d items:\n", header.items);
-    item = data;
-
-    while (header.items --)
-    {
-        ValuePair * pair = ape_read_item (& item, (char *) data + data_length -
-         (char *) item);
-
-        if (pair == NULL)
-            break;
-
-        TAGDBG ("Read: %s = %s.\n", pair->key, pair->value);
-        list = g_list_prepend (list, pair);
-    }
-
-    g_free (data);
-    return g_list_reverse (list);
-}
-
-static void free_value_pair (ValuePair * pair)
-{
-    str_unref (pair->key);
-    str_unref (pair->value);
-    g_slice_free (ValuePair, pair);
-}
-
-static void parse_gain_text (const char * text, int * value, int * unit)
-{
-    int sign = 1;
-
-    * value = 0;
-    * unit = 1;
-
-    if (* text == '-')
-    {
-        sign = -1;
-        text ++;
-    }
-
-    while (* text >= '0' && * text <= '9')
-    {
-        * value = * value * 10 + (* text - '0');
-        text ++;
-    }
-
-    if (* text == '.')
-    {
-        text ++;
-
-        while (* text >= '0' && * text <= '9' && * value < G_MAXINT / 10)
-        {
-            * value = * value * 10 + (* text - '0');
-            * unit = * unit * 10;
-            text ++;
-        }
-    }
-
-    * value = * value * sign;
-}
-
-static void set_gain_info (Tuple * tuple, int field, int unit_field,
- const char * text)
-{
-    int value, unit;
-
-    parse_gain_text (text, & value, & unit);
-
-    if (tuple_get_value_type (tuple, unit_field) == TUPLE_INT)
-        value = value * (int64_t) tuple_get_int (tuple, unit_field) / unit;
-    else
-        tuple_set_int (tuple, unit_field, unit);
-
-    tuple_set_int (tuple, field, value);
-}
-
-static bool_t ape_read_tag (Tuple * tuple, VFSFile * handle)
-{
-    GList * list = ape_read_items (handle), * node;
-
-    for (node = list; node != NULL; node = node->next)
-    {
-        char * key = ((ValuePair *) node->data)->key;
-        char * value = ((ValuePair *) node->data)->value;
-
-        if (! strcmp (key, "Artist"))
-            tuple_set_str (tuple, FIELD_ARTIST, value);
-        else if (! strcmp (key, "Title"))
-            tuple_set_str (tuple, FIELD_TITLE, value);
-        else if (! strcmp (key, "Album"))
-            tuple_set_str (tuple, FIELD_ALBUM, value);
-        else if (! strcmp (key, "Comment"))
-            tuple_set_str (tuple, FIELD_COMMENT, value);
-        else if (! strcmp (key, "Genre"))
-            tuple_set_str (tuple, FIELD_GENRE, value);
-        else if (! strcmp (key, "Track"))
-            tuple_set_int (tuple, FIELD_TRACK_NUMBER, atoi (value));
-        else if (! strcmp (key, "Year"))
-            tuple_set_int (tuple, FIELD_YEAR, atoi (value));
-        else if (! g_ascii_strcasecmp (key, "REPLAYGAIN_TRACK_GAIN"))
-            set_gain_info (tuple, FIELD_GAIN_TRACK_GAIN, FIELD_GAIN_GAIN_UNIT, value);
-        else if (! g_ascii_strcasecmp (key, "REPLAYGAIN_TRACK_PEAK"))
-            set_gain_info (tuple, FIELD_GAIN_TRACK_PEAK, FIELD_GAIN_PEAK_UNIT, value);
-        else if (! g_ascii_strcasecmp (key, "REPLAYGAIN_ALBUM_GAIN"))
-            set_gain_info (tuple, FIELD_GAIN_ALBUM_GAIN, FIELD_GAIN_GAIN_UNIT, value);
-        else if (! g_ascii_strcasecmp (key, "REPLAYGAIN_ALBUM_PEAK"))
-            set_gain_info (tuple, FIELD_GAIN_ALBUM_PEAK, FIELD_GAIN_PEAK_UNIT, value);
-    }
-
-    g_list_free_full (list, (GDestroyNotify) free_value_pair);
-    return TRUE;
-}
-
-static bool_t ape_write_item (VFSFile * handle, const char * key,
- const char * value, int * written_length)
-{
-    int key_len = strlen (key) + 1;
-    int value_len = strlen (value);
-    uint32_t header[2];
-
-    TAGDBG ("Write: %s = %s.\n", key, value);
-
-    header[0] = GUINT32_TO_LE (value_len);
-    header[1] = 0;
-
-    if (vfs_fwrite (header, 1, 8, handle) != 8)
-        return FALSE;
-
-    if (vfs_fwrite (key, 1, key_len, handle) != key_len)
-        return FALSE;
-
-    if (vfs_fwrite (value, 1, value_len, handle) != value_len)
-        return FALSE;
-
-    * written_length += 8 + key_len + value_len;
-    return TRUE;
-}
-
-static bool_t write_string_item (const Tuple * tuple, int field, VFSFile *
- handle, const char * key, int * written_length, int * written_items)
-{
-    char * value = tuple_get_str (tuple, field);
-
-    if (value == NULL)
-        return TRUE;
-
-    bool_t success = ape_write_item (handle, key, value, written_length);
-
-    if (success)
-        (* written_items) ++;
-
-    str_unref (value);
-    return success;
-}
-
-static bool_t write_integer_item (const Tuple * tuple, int field, VFSFile *
- handle, const char * key, int * written_length, int * written_items)
-{
-    int value = tuple_get_int (tuple, field);
-    char scratch[32];
-
-    if (value <= 0)
-        return TRUE;
-
-    str_itoa (value, scratch, sizeof scratch);
-
-    if (! ape_write_item (handle, key, scratch, written_length))
-        return FALSE;
-
-    (* written_items) ++;
-    return TRUE;
-}
-
-static bool_t write_header (int data_length, int items, bool_t is_header,
- VFSFile * handle)
-{
-    APEHeader header;
-
-    memcpy (header.magic, "APETAGEX", 8);
-    header.version = GUINT32_TO_LE (2000);
-    header.length = GUINT32_TO_LE (data_length + sizeof (APEHeader));
-    header.items = GUINT32_TO_LE (items);
-    header.flags = is_header ? GUINT32_TO_LE (APE_FLAG_HAS_HEADER |
-     APE_FLAG_IS_HEADER) : GUINT32_TO_LE (APE_FLAG_HAS_HEADER);
-    header.reserved = 0;
-
-    return vfs_fwrite (& header, 1, sizeof (APEHeader), handle) == sizeof
-     (APEHeader);
-}
-
-static bool_t ape_write_tag (const Tuple * tuple, VFSFile * handle)
-{
-    GList * list = ape_read_items (handle), * node;
-    APEHeader header;
-    int start, length, data_start, data_length, items;
-
-    if (ape_find_header (handle, & header, & start, & length, & data_start,
-     & data_length))
-    {
-        if (start + length != vfs_fsize (handle))
-        {
-            TAGDBG ("Writing tags is only supported at end of file.\n");
-            goto ERR;
-        }
-
-        if (vfs_ftruncate (handle, start))
-            goto ERR;
-    }
-    else
-    {
-        start = vfs_fsize (handle);
-
-        if (start < 0)
-            goto ERR;
-    }
-
-    if (vfs_fseek (handle, start, SEEK_SET) || ! write_header (0, 0, TRUE,
-     handle))
-        goto ERR;
-
-    length = 0;
-    items = 0;
-
-    if (! write_string_item (tuple, FIELD_ARTIST, handle, "Artist", & length,
-     & items) || ! write_string_item (tuple, FIELD_TITLE, handle, "Title",
-     & length, & items) || ! write_string_item (tuple, FIELD_ALBUM, handle,
-     "Album", & length, & items) || ! write_string_item (tuple, FIELD_COMMENT,
-     handle, "Comment", & length, & items) || ! write_string_item (tuple,
-     FIELD_GENRE, handle, "Genre", & length, & items) || ! write_integer_item
-     (tuple, FIELD_TRACK_NUMBER, handle, "Track", & length, & items) ||
-     ! write_integer_item (tuple, FIELD_YEAR, handle, "Year", & length, & items))
-        goto ERR;
-
-    for (node = list; node != NULL; node = node->next)
-    {
-        char * key = ((ValuePair *) node->data)->key;
-        char * value = ((ValuePair *) node->data)->value;
-
-        if (! strcmp (key, "Artist") || ! strcmp (key, "Title") || ! strcmp
-         (key, "Album") || ! strcmp (key, "Comment") || ! strcmp (key, "Genre")
-         || ! strcmp (key, "Track") || ! strcmp (key, "Year"))
-            continue;
-
-        if (! ape_write_item (handle, key, value, & length))
-            goto ERR;
-
-        items ++;
-    }
-
-    TAGDBG ("Wrote %d items, %d bytes.\n", items, length);
-
-    if (! write_header (length, items, FALSE, handle) || vfs_fseek (handle,
-     start, SEEK_SET) || ! write_header (length, items, TRUE, handle))
-        goto ERR;
-
-    g_list_free_full (list, (GDestroyNotify) free_value_pair);
-    return TRUE;
-
-ERR:
-    g_list_free_full (list, (GDestroyNotify) free_value_pair);
-    return FALSE;
-}
-
-tag_module_t ape =
-{
-    .name = "APE",
-    .type = TAG_TYPE_APE,
-    .can_handle_file = ape_is_our_file,
-    .read_tag = ape_read_tag,
-    .write_tag = ape_write_tag,
-};
diff --git a/src/libaudtag/ape/ape.cc b/src/libaudtag/ape/ape.cc
new file mode 100644
index 000000000000..c8657b4e5da6
--- /dev/null
+++ b/src/libaudtag/ape/ape.cc
@@ -0,0 +1,466 @@
+/*
+ * ape.c
+ * Copyright 2010 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+/* TODO:
+ * - Support updating files that have their tag at the beginning?
+ */
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define WANT_AUD_BSWAP
+#include <libaudcore/audio.h>
+#include <libaudcore/audstrings.h>
+#include <libaudcore/runtime.h>
+#include <libaudcore/vfs.h>
+#include <libaudtag/builtin.h>
+
+#pragma pack(push) /* must be byte-aligned */
+#pragma pack(1)
+struct APEHeader {
+    char magic[8];
+    uint32_t version; /* LE */
+    uint32_t length; /* LE */
+    uint32_t items; /* LE */
+    uint32_t flags; /* LE */
+    uint64_t reserved;
+};
+#pragma pack(pop)
+
+struct ValuePair {
+    String key, value;
+};
+
+#define APE_FLAG_HAS_HEADER (1 << 31)
+#define APE_FLAG_HAS_NO_FOOTER (1 << 30)
+#define APE_FLAG_IS_HEADER (1 << 29)
+
+namespace audtag {
+
+static bool ape_read_header (VFSFile & handle, APEHeader * header)
+{
+    if (handle.fread (header, 1, sizeof (APEHeader)) != sizeof (APEHeader))
+        return false;
+
+    if (strncmp (header->magic, "APETAGEX", 8))
+        return false;
+
+    header->version = FROM_LE32 (header->version);
+    header->length = FROM_LE32 (header->length);
+    header->items = FROM_LE32 (header->items);
+    header->flags = FROM_LE32 (header->flags);
+
+    if (header->length < sizeof (APEHeader))
+        return false;
+
+    return true;
+}
+
+static bool ape_find_header (VFSFile & handle, APEHeader * header,
+ int * start, int * length, int * data_start, int * data_length)
+{
+    APEHeader secondary;
+
+    if (handle.fseek (0, VFS_SEEK_SET))
+        return false;
+
+    if (ape_read_header (handle, header))
+    {
+        AUDDBG ("Found header at 0, length = %d, version = %d.\n",
+         (int) header->length, (int) header->version);
+
+        * start = 0;
+        * length = header->length;
+        * data_start = sizeof (APEHeader);
+        * data_length = header->length - sizeof (APEHeader);
+
+        if (! (header->flags & APE_FLAG_HAS_HEADER) || ! (header->flags & APE_FLAG_IS_HEADER))
+        {
+            AUDWARN ("Invalid header flags (%u).\n", (unsigned) header->flags);
+            return false;
+        }
+
+        if (! (header->flags & APE_FLAG_HAS_NO_FOOTER))
+        {
+            if (handle.fseek (header->length, VFS_SEEK_CUR))
+                return false;
+
+            if (! ape_read_header (handle, & secondary))
+            {
+                AUDWARN ("Expected footer, but found none.\n");
+                return false;
+            }
+
+            * length += sizeof (APEHeader);
+        }
+
+        return true;
+    }
+
+    if (handle.fseek (-(int) sizeof (APEHeader), VFS_SEEK_END))
+        return false;
+
+    if (! ape_read_header (handle, header))
+    {
+        /* APE tag may be followed by an ID3v1 tag */
+        if (handle.fseek (-128 - (int) sizeof (APEHeader), VFS_SEEK_END))
+            return false;
+
+        if (! ape_read_header (handle, header))
+        {
+            AUDDBG ("No header found.\n");
+            return false;
+        }
+    }
+
+    AUDDBG ("Found footer at %d, length = %d, version = %d.\n",
+     (int) handle.ftell () - (int) sizeof (APEHeader), (int) header->length,
+     (int) header->version);
+
+    * start = handle.ftell () - header->length;
+    * length = header->length;
+    * data_start = handle.ftell () - header->length;
+    * data_length = header->length - sizeof (APEHeader);
+
+    if ((header->flags & APE_FLAG_HAS_NO_FOOTER) || (header->flags & APE_FLAG_IS_HEADER))
+    {
+        AUDWARN ("Invalid footer flags (%u).\n", (unsigned) header->flags);
+        return false;
+    }
+
+    if (header->flags & APE_FLAG_HAS_HEADER)
+    {
+        if (handle.fseek (-(int) header->length - sizeof (APEHeader), VFS_SEEK_CUR))
+            return false;
+
+        if (! ape_read_header (handle, & secondary))
+        {
+            AUDDBG ("Expected header, but found none.\n");
+            return false;
+        }
+
+        * start -= sizeof (APEHeader);
+        * length += sizeof (APEHeader);
+    }
+
+    return true;
+}
+
+bool APETagModule::can_handle_file (VFSFile & handle)
+{
+    APEHeader header;
+    int start, length, data_start, data_length;
+
+    return ape_find_header (handle, & header, & start, & length, & data_start,
+     & data_length);
+}
+
+/* returns start of next item or nullptr */
+static const char * ape_read_item (const char * data, int length, ValuePair & pair)
+{
+    auto header = (const uint32_t *) data;
+    const char * value;
+
+    if (length < 8)
+    {
+        AUDWARN ("Expected item, but only %d bytes remain in tag.\n", length);
+        return nullptr;
+    }
+
+    value = (const char *) memchr (data + 8, 0, length - 8);
+
+    if (! value)
+    {
+        AUDWARN ("Unterminated item key (max length = %d).\n", length - 8);
+        return nullptr;
+    }
+
+    value ++;
+
+    if (header[0] > (unsigned) (data + length - value))
+    {
+        AUDWARN ("Item value of length %d, but only %d bytes remain in tag.\n",
+         (int) header[0], (int) (data + length - value));
+        return nullptr;
+    }
+
+    pair.key = String (data + 8);
+    pair.value = String (str_copy (value, header[0]));
+
+    return value + header[0];
+}
+
+static Index<ValuePair> ape_read_items (VFSFile & handle)
+{
+    Index<ValuePair> list;
+    APEHeader header;
+    int start, length, data_start, data_length;
+
+    if (! ape_find_header (handle, & header, & start, & length, & data_start, & data_length))
+        return list;
+
+    if (handle.fseek (data_start, VFS_SEEK_SET))
+        return list;
+
+    Index<char> data;
+    data.insert (0, data_length);
+
+    if (handle.fread (data.begin (), 1, data_length) != data_length)
+        return list;
+
+    AUDDBG ("Reading %d items:\n", header.items);
+    const char * item = data.begin ();
+
+    while (header.items --)
+    {
+        ValuePair pair;
+        if (! (item = ape_read_item (item, data.end () - item, pair)))
+            break;
+
+        AUDDBG ("Read: %s = %s.\n", (const char *) pair.key, (const char *) pair.value);
+        list.append (std::move (pair));
+    }
+
+    return list;
+}
+
+static void parse_gain_text (const char * text, int * value, int * unit)
+{
+    int sign = 1;
+
+    * value = 0;
+    * unit = 1;
+
+    if (* text == '-')
+    {
+        sign = -1;
+        text ++;
+    }
+
+    while (* text >= '0' && * text <= '9')
+    {
+        * value = * value * 10 + (* text - '0');
+        text ++;
+    }
+
+    if (* text == '.')
+    {
+        text ++;
+
+        while (* text >= '0' && * text <= '9' && * value < INT_MAX / 10)
+        {
+            * value = * value * 10 + (* text - '0');
+            * unit = * unit * 10;
+            text ++;
+        }
+    }
+
+    * value = * value * sign;
+}
+
+static void set_gain_info (Tuple & tuple, Tuple::Field field,
+ Tuple::Field unit_field, const char * text)
+{
+    int value, unit;
+
+    parse_gain_text (text, & value, & unit);
+
+    if (tuple.get_value_type (unit_field) == Tuple::Int)
+        value = value * (int64_t) tuple.get_int (unit_field) / unit;
+    else
+        tuple.set_int (unit_field, unit);
+
+    tuple.set_int (field, value);
+}
+
+bool APETagModule::read_tag (Tuple & tuple, VFSFile & handle)
+{
+    Index<ValuePair> list = ape_read_items (handle);
+
+    for (const ValuePair & pair : list)
+    {
+        if (! strcmp (pair.key, "Artist"))
+            tuple.set_str (Tuple::Artist, pair.value);
+        else if (! strcmp (pair.key, "Title"))
+            tuple.set_str (Tuple::Title, pair.value);
+        else if (! strcmp (pair.key, "Album"))
+            tuple.set_str (Tuple::Album, pair.value);
+        else if (! strcmp (pair.key, "Comment"))
+            tuple.set_str (Tuple::Comment, pair.value);
+        else if (! strcmp (pair.key, "Genre"))
+            tuple.set_str (Tuple::Genre, pair.value);
+        else if (! strcmp (pair.key, "Track"))
+            tuple.set_int (Tuple::Track, atoi (pair.value));
+        else if (! strcmp (pair.key, "Year"))
+            tuple.set_int (Tuple::Year, atoi (pair.value));
+        else if (! strcmp_nocase (pair.key, "REPLAYGAIN_TRACK_GAIN"))
+            set_gain_info (tuple, Tuple::TrackGain, Tuple::GainDivisor, pair.value);
+        else if (! strcmp_nocase (pair.key, "REPLAYGAIN_TRACK_PEAK"))
+            set_gain_info (tuple, Tuple::TrackPeak, Tuple::PeakDivisor, pair.value);
+        else if (! strcmp_nocase (pair.key, "REPLAYGAIN_ALBUM_GAIN"))
+            set_gain_info (tuple, Tuple::AlbumGain, Tuple::GainDivisor, pair.value);
+        else if (! strcmp_nocase (pair.key, "REPLAYGAIN_ALBUM_PEAK"))
+            set_gain_info (tuple, Tuple::AlbumPeak, Tuple::PeakDivisor, pair.value);
+    }
+
+    return true;
+}
+
+static bool ape_write_item (VFSFile & handle, const char * key,
+ const char * value, int * written_length)
+{
+    int key_len = strlen (key) + 1;
+    int value_len = strlen (value);
+    uint32_t header[2];
+
+    AUDDBG ("Write: %s = %s.\n", key, value);
+
+    header[0] = TO_LE32 (value_len);
+    header[1] = 0;
+
+    if (handle.fwrite (header, 1, 8) != 8)
+        return false;
+
+    if (handle.fwrite (key, 1, key_len) != key_len)
+        return false;
+
+    if (handle.fwrite (value, 1, value_len) != value_len)
+        return false;
+
+    * written_length += 8 + key_len + value_len;
+    return true;
+}
+
+static bool write_string_item (const Tuple & tuple, Tuple::Field field,
+ VFSFile & handle, const char * key, int * written_length, int * written_items)
+{
+    String value = tuple.get_str (field);
+
+    if (! value)
+        return true;
+
+    bool success = ape_write_item (handle, key, value, written_length);
+
+    if (success)
+        (* written_items) ++;
+
+    return success;
+}
+
+static bool write_integer_item (const Tuple & tuple, Tuple::Field field,
+ VFSFile & handle, const char * key, int * written_length, int * written_items)
+{
+    int value = tuple.get_int (field);
+
+    if (value <= 0)
+        return true;
+
+    if (! ape_write_item (handle, key, int_to_str (value), written_length))
+        return false;
+
+    (* written_items) ++;
+    return true;
+}
+
+static bool write_header (int data_length, int items, bool is_header,
+ VFSFile & handle)
+{
+    APEHeader header;
+
+    memcpy (header.magic, "APETAGEX", 8);
+    header.version = TO_LE32 (2000);
+    header.length = TO_LE32 (data_length + sizeof (APEHeader));
+    header.items = TO_LE32 (items);
+    header.flags = is_header ? TO_LE32 (APE_FLAG_HAS_HEADER |
+     APE_FLAG_IS_HEADER) : TO_LE32 (APE_FLAG_HAS_HEADER);
+    header.reserved = 0;
+
+    return handle.fwrite (& header, 1, sizeof (APEHeader)) == sizeof (APEHeader);
+}
+
+bool APETagModule::write_tag (const Tuple & tuple, VFSFile & handle)
+{
+    Index<ValuePair> list = ape_read_items (handle);
+    APEHeader header;
+    int start, length, data_start, data_length, items;
+
+    if (ape_find_header (handle, & header, & start, & length, & data_start, & data_length))
+    {
+        if (start + length != handle.fsize ())
+        {
+            AUDERR ("Writing tags is only supported at end of file.\n");
+            return false;
+        }
+
+        if (handle.ftruncate (start))
+            return false;
+    }
+    else
+    {
+        start = handle.fsize ();
+
+        if (start < 0)
+            return false;
+    }
+
+    if (handle.fseek (start, VFS_SEEK_SET) || ! write_header (0, 0, true, handle))
+        return false;
+
+    length = 0;
+    items = 0;
+
+    if (! write_string_item (tuple, Tuple::Artist, handle, "Artist", & length, & items) ||
+     ! write_string_item (tuple, Tuple::Title, handle, "Title", & length, & items) ||
+     ! write_string_item (tuple, Tuple::Album, handle, "Album", & length, & items) ||
+     ! write_string_item (tuple, Tuple::Comment, handle, "Comment", & length, & items) ||
+     ! write_string_item (tuple, Tuple::Genre, handle, "Genre", & length, & items) ||
+     ! write_integer_item (tuple, Tuple::Track, handle, "Track", & length, & items) ||
+     ! write_integer_item (tuple, Tuple::Year, handle, "Year", & length, & items))
+        return false;
+
+    for (const ValuePair & pair : list)
+    {
+        if (! strcmp (pair.key, "Artist") || ! strcmp (pair.key, "Title") ||
+         ! strcmp (pair.key, "Album") || ! strcmp (pair.key, "Comment") ||
+         ! strcmp (pair.key, "Genre") || ! strcmp (pair.key, "Track") ||
+         ! strcmp (pair.key, "Year"))
+            continue;
+
+        if (! ape_write_item (handle, pair.key, pair.value, & length))
+            return false;
+
+        items ++;
+    }
+
+    AUDDBG ("Wrote %d items, %d bytes.\n", items, length);
+
+    if (! write_header (length, items, false, handle))
+        return false;
+
+    if (handle.fseek (start, VFS_SEEK_SET) < 0)
+        return false;
+
+    if (! write_header (length, items, true, handle))
+        return false;
+
+    return true;
+}
+
+}
diff --git a/src/libaudtag/ape/ape.h b/src/libaudtag/ape/ape.h
deleted file mode 100644
index 0f22843a2286..000000000000
--- a/src/libaudtag/ape/ape.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * ape.h
- * Copyright 2010 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDTAG_APE_H
-#define AUDTAG_APE_H
-
-#include "../audtag.h"
-#include "../tag_module.h"
-#include "../util.h"
-
-extern tag_module_t ape;
-
-#endif
diff --git a/src/libaudtag/audtag.c b/src/libaudtag/audtag.c
deleted file mode 100644
index 0ef0f3e0a877..000000000000
--- a/src/libaudtag/audtag.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * audtag.c
- * Copyright 2009-2011 Paula Stanciu and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include <libaudcore/tuple.h>
-
-#include "audtag.h"
-#include "tag_module.h"
-#include "util.h"
-
-bool_t tag_verbose = FALSE;
-
-EXPORT void tag_set_verbose (bool_t verbose)
-{
-    tag_verbose = verbose;
-}
-
-/* The tuple's file-related attributes are already set */
-
-EXPORT bool_t tag_tuple_read (Tuple * tuple, VFSFile * handle)
-{
-    tag_module_t * module = find_tag_module (handle, TAG_TYPE_NONE);
-
-    if (! module || ! module->read_tag)
-    {
-        TAGDBG ("read_tag() not supported for %s\n", vfs_get_filename (handle));
-        return FALSE;
-    }
-
-    return module->read_tag (tuple, handle);
-}
-
-EXPORT bool_t tag_image_read (VFSFile * handle, void * * data, int64_t * size)
-{
-    tag_module_t * module = find_tag_module (handle, TAG_TYPE_NONE);
-
-    if (! module || ! module->read_image)
-    {
-        TAGDBG ("read_image() not supported for %s\n", vfs_get_filename (handle));
-        return FALSE;
-    }
-
-    return module->read_image (handle, data, size);
-}
-
-EXPORT bool_t tag_tuple_write (const Tuple * tuple, VFSFile * handle, int new_type)
-{
-    tag_module_t * module = find_tag_module (handle, new_type);
-
-    if (! module || ! module->write_tag)
-    {
-        TAGDBG ("write_tag() not supported for %s\n", vfs_get_filename (handle));
-        return FALSE;
-    }
-
-    return module->write_tag (tuple, handle);
-}
-
-EXPORT bool_t tag_update_stream_metadata (Tuple * tuple, VFSFile * handle)
-{
-    bool_t updated = FALSE;
-    char * old, * new;
-    int value;
-
-    old = tuple_get_str (tuple, FIELD_TITLE);
-    new = vfs_get_metadata (handle, "track-name");
-
-    if (new && (! old || strcmp (old, new)))
-    {
-        tuple_set_str (tuple, FIELD_TITLE, new);
-        updated = TRUE;
-    }
-
-    str_unref (old);
-    str_unref (new);
-
-    old = tuple_get_str (tuple, FIELD_ARTIST);
-    new = vfs_get_metadata (handle, "stream-name");
-
-    if (new && (! old || strcmp (old, new)))
-    {
-        tuple_set_str (tuple, FIELD_ARTIST, new);
-        updated = TRUE;
-    }
-
-    str_unref (old);
-    str_unref (new);
-
-    new = vfs_get_metadata (handle, "content-bitrate");
-    value = new ? atoi (new) / 1000 : 0;
-
-    if (value && value != tuple_get_int (tuple, FIELD_BITRATE))
-    {
-        tuple_set_int (tuple, FIELD_BITRATE, value);
-        updated = TRUE;
-    }
-
-    str_unref (new);
-
-    return updated;
-}
-
-/* deprecated */
-EXPORT bool_t tag_tuple_write_to_file (Tuple * tuple, VFSFile * handle)
-{
-    return tag_tuple_write (tuple, handle, TAG_TYPE_NONE);
-}
diff --git a/src/libaudtag/audtag.cc b/src/libaudtag/audtag.cc
new file mode 100644
index 000000000000..ee04bcf761bd
--- /dev/null
+++ b/src/libaudtag/audtag.cc
@@ -0,0 +1,68 @@
+/*
+ * audtag.c
+ * Copyright 2009-2011 Paula Stanciu and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <libaudcore/runtime.h>
+
+#include "audtag.h"
+#include "tag_module.h"
+
+/* The tuple's file-related attributes are already set */
+
+namespace audtag {
+
+EXPORT bool tuple_read (Tuple & tuple, VFSFile & handle)
+{
+    TagModule * module = find_tag_module (handle, TagType::None);
+
+    if (! module)
+    {
+        AUDINFO ("read_tag() not supported for %s\n", handle.filename ());
+        return false;
+    }
+
+    return module->read_tag (tuple, handle);
+}
+
+EXPORT Index<char> image_read (VFSFile & handle)
+{
+    TagModule * module = find_tag_module (handle, TagType::None);
+
+    if (! module)
+    {
+        AUDINFO ("read_image() not supported for %s\n", handle.filename ());
+        return Index<char> ();
+    }
+
+    return module->read_image (handle);
+}
+
+EXPORT bool tuple_write (const Tuple & tuple, VFSFile & handle, TagType new_type)
+{
+    TagModule * module = find_tag_module (handle, new_type);
+
+    if (! module)
+    {
+        AUDINFO ("write_tag() not supported for %s\n", handle.filename ());
+        return false;
+    }
+
+    return module->write_tag (tuple, handle);
+}
+
+}
diff --git a/src/libaudtag/audtag.h b/src/libaudtag/audtag.h
index b746feb8504e..be08837d5128 100644
--- a/src/libaudtag/audtag.h
+++ b/src/libaudtag/audtag.h
@@ -23,25 +23,22 @@
 #include <libaudcore/tuple.h>
 #include <libaudcore/vfs.h>
 
-enum
+namespace audtag {
+
+enum class TagType
 {
-    TAG_TYPE_NONE = 0,
-    TAG_TYPE_APE,
-    TAG_TYPE_ID3V2
+    None,
+    APE,
+    ID3v2
 };
 
-void tag_set_verbose (bool_t verbose);
-
-bool_t tag_tuple_read (Tuple * tuple, VFSFile *fd);
-bool_t tag_image_read (VFSFile * handle, void * * data, int64_t * size);
+bool tuple_read (Tuple & tuple, VFSFile &fd);
+Index<char> image_read (VFSFile & handle);
 
-/* new_type specifies the type of tag (see the TAG_TYPE_* enum) that should be
+/* new_type specifies the type of tag (see the TagType enum) that should be
  * written if the file does not have any existing tag. */
-bool_t tag_tuple_write (const Tuple * tuple, VFSFile * handle, int new_type);
-
-bool_t tag_update_stream_metadata (Tuple * tuple, VFSFile * handle);
+bool tuple_write (const Tuple & tuple, VFSFile & handle, TagType new_type);
 
-/* deprecated, use tag_tuple_write */
-bool_t tag_tuple_write_to_file (Tuple * tuple, VFSFile * handle);
+}
 
 #endif /* AUDTAG_H */
diff --git a/src/libaudtag/builtin.h b/src/libaudtag/builtin.h
new file mode 100644
index 000000000000..b54617ad09b7
--- /dev/null
+++ b/src/libaudtag/builtin.h
@@ -0,0 +1,63 @@
+/*
+ * builtin.h
+ * Copyright (c) 2014 William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "libaudtag/audtag.h"
+#include "libaudtag/tag_module.h"
+#include "libaudtag/util.h"
+
+#ifndef __LIBAUDTAG_BUILTIN_H__
+#define __LIBAUDTAG_BUILTIN_H__
+
+namespace audtag {
+
+struct ID3v1TagModule : TagModule {
+    ID3v1TagModule() : TagModule("ID3v1", TagType::None) { };
+
+    bool can_handle_file (VFSFile &fd);
+    bool read_tag (Tuple & tuple, VFSFile & file);
+};
+
+struct ID3v22TagModule : TagModule {
+    ID3v22TagModule() : TagModule("ID3v2.2", TagType::None) { };
+
+    bool can_handle_file (VFSFile &fd);
+    bool read_tag (Tuple & tuple, VFSFile & file);
+    Index<char> read_image (VFSFile & handle);
+};
+
+struct ID3v24TagModule : TagModule {
+    ID3v24TagModule() : TagModule("ID3v2.3/v2.4", TagType::ID3v2) { };
+
+    bool can_handle_file (VFSFile &fd);
+    bool read_tag (Tuple & tuple, VFSFile & file);
+    Index<char> read_image (VFSFile & handle);
+    bool write_tag (const Tuple & tuple, VFSFile & f);
+};
+
+struct APETagModule : TagModule {
+    APETagModule() : TagModule("APE", TagType::APE) { };
+
+    bool can_handle_file (VFSFile &fd);
+    bool read_tag (Tuple & tuple, VFSFile & file);
+    bool write_tag (const Tuple & tuple, VFSFile & f);
+};
+
+}
+
+#endif
diff --git a/src/libaudtag/id3/id3-common.c b/src/libaudtag/id3/id3-common.c
deleted file mode 100644
index f7ec19dc4394..000000000000
--- a/src/libaudtag/id3/id3-common.c
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * id3-common.c
- * Copyright 2010-2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include "id3-common.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include <libaudcore/audstrings.h>
-
-#include "../util.h"
-
-#define ID3_ENCODING_LATIN1    0
-#define ID3_ENCODING_UTF16     1
-#define ID3_ENCODING_UTF16_BE  2
-#define ID3_ENCODING_UTF8      3
-
-static void * memchr16 (const void * mem, int16_t chr, int len)
-{
-    while (len >= 2)
-    {
-        if (* (int16_t *) mem == chr)
-            return (void *) mem;
-
-        mem = (char *) mem + 2;
-        len -= 2;
-    }
-
-    return NULL;
-}
-
-void id3_strnlen (const char * data, int size, int encoding,
- int * bytes_without_nul, int * bytes_with_nul)
-{
-    bool_t is16 = (encoding == ID3_ENCODING_UTF16 || encoding == ID3_ENCODING_UTF16_BE);
-    char * nul = is16 ? memchr16 (data, 0, size) : memchr (data, 0, size);
-
-    if (nul)
-    {
-        if (bytes_without_nul)
-            * bytes_without_nul = nul - data;
-        if (bytes_with_nul)
-            * bytes_with_nul = is16 ? nul + 2 - data : nul + 1 - data;
-    }
-    else
-    {
-        if (bytes_without_nul)
-            * bytes_without_nul = size;
-        if (bytes_with_nul)
-            * bytes_with_nul = size;
-    }
-}
-
-char * id3_convert (const char * data, int size, int encoding)
-{
-    if (encoding == ID3_ENCODING_UTF16)
-        return str_convert (data, size, "UTF-16", "UTF-8");
-    else if (encoding == ID3_ENCODING_UTF16_BE)
-        return str_convert (data, size, "UTF-16BE", "UTF-8");
-    else
-        return str_to_utf8 (data, size);
-}
-
-char * id3_decode_text (const char * data, int size)
-{
-    if (size < 1)
-        return NULL;
-
-    return id3_convert ((const char *) data + 1, size - 1, data[0]);
-}
-
-void id3_associate_string (Tuple * tuple, int field, const char * data, int size)
-{
-    char * text = id3_decode_text (data, size);
-
-    if (text && text[0])
-    {
-        TAGDBG ("Field %i = %s.\n", field, text);
-        tuple_set_str (tuple, field, text);
-    }
-
-    str_unref (text);
-}
-
-void id3_associate_int (Tuple * tuple, int field, const char * data, int size)
-{
-    char * text = id3_decode_text (data, size);
-
-    /* Ignore zeros here.  In particular, there are many ID3 tags with invalid
-     * TLEN fields floating around, and we want to let mpg123 recalculate the
-     * length in such cases. */
-    if (text && atoi (text) > 0)
-    {
-        TAGDBG ("Field %i = %s.\n", field, text);
-        tuple_set_int (tuple, field, atoi (text));
-    }
-
-    str_unref (text);
-}
-
-void id3_decode_genre (Tuple * tuple, const char * data, int size)
-{
-    char * text = id3_decode_text (data, size);
-    int numericgenre;
-
-    if (! text)
-        return;
-
-    if (text[0] == '(')
-        numericgenre = atoi (text + 1);
-    else
-        numericgenre = atoi (text);
-
-    if (numericgenre > 0)
-        tuple_set_str (tuple, FIELD_GENRE, convert_numericgenre_to_text (numericgenre));
-    else
-        tuple_set_str (tuple, FIELD_GENRE, text);
-
-    str_unref (text);
-}
-
-void id3_decode_comment (Tuple * tuple, const char * data, int size)
-{
-    if (size < 4)
-        return;
-
-    int before_nul, after_nul;
-    id3_strnlen (data + 4, size - 4, data[0], & before_nul, & after_nul);
-
-    const char * lang = data + 1;
-    char * type = id3_convert (data + 4, before_nul, data[0]);
-    char * value = id3_convert (data + 4 + after_nul, size - 4 - after_nul, data[0]);
-
-    TAGDBG ("Comment: lang = %.3s, type = %s, value = %s.\n", lang, type, value);
-
-    if (type && ! type[0] && value) /* blank type = actual comment */
-        tuple_set_str (tuple, FIELD_COMMENT, value);
-
-    str_unref (type);
-    str_unref (value);
-}
-
-static bool_t decode_rva_block (const char * * _data, int * _size,
- int * channel, int * adjustment, int * adjustment_unit, int * peak,
- int * peak_unit)
-{
-    const char * data = * _data;
-    int size = * _size;
-    int peak_bits;
-
-    if (size < 4)
-        return FALSE;
-
-    * channel = data[0];
-    * adjustment = (char) data[1]; /* first byte is signed */
-    * adjustment = (* adjustment << 8) | data[2];
-    * adjustment_unit = 512;
-    peak_bits = data[3];
-
-    data += 4;
-    size -= 4;
-
-    TAGDBG ("RVA block: channel = %d, adjustment = %d/%d, peak bits = %d\n",
-     * channel, * adjustment, * adjustment_unit, peak_bits);
-
-    if (peak_bits > 0 && peak_bits < sizeof (int) * 8)
-    {
-        int bytes = (peak_bits + 7) / 8;
-        int count;
-
-        if (bytes > size)
-            return FALSE;
-
-        * peak = 0;
-        * peak_unit = 1 << peak_bits;
-
-        for (count = 0; count < bytes; count ++)
-            * peak = (* peak << 8) | data[count];
-
-        data += bytes;
-        size -= count;
-
-        TAGDBG ("RVA block: peak = %d/%d\n", * peak, * peak_unit);
-    }
-    else
-    {
-        * peak = 0;
-        * peak_unit = 0;
-    }
-
-    * _data = data;
-    * _size = size;
-    return TRUE;
-}
-
-void id3_decode_rva (Tuple * tuple, const char * data, int size)
-{
-    const char * domain;
-    int channel, adjustment, adjustment_unit, peak, peak_unit;
-
-    if (memchr (data, 0, size) == NULL)
-        return;
-
-    domain = data;
-
-    TAGDBG ("RVA domain: %s\n", domain);
-
-    size -= strlen (domain) + 1;
-    data += strlen (domain) + 1;
-
-    while (size > 0)
-    {
-        if (! decode_rva_block (& data, & size, & channel, & adjustment,
-         & adjustment_unit, & peak, & peak_unit))
-            break;
-
-        if (channel != 1) /* specific channel? */
-            continue;
-
-        if (tuple_get_value_type (tuple, FIELD_GAIN_GAIN_UNIT) == TUPLE_INT)
-            adjustment = adjustment * (int64_t) tuple_get_int (tuple,
-             FIELD_GAIN_GAIN_UNIT) / adjustment_unit;
-        else
-            tuple_set_int (tuple, FIELD_GAIN_GAIN_UNIT, adjustment_unit);
-
-        if (peak_unit)
-        {
-            if (tuple_get_value_type (tuple, FIELD_GAIN_PEAK_UNIT) == TUPLE_INT)
-                peak = peak * (int64_t) tuple_get_int (tuple,
-                 FIELD_GAIN_PEAK_UNIT) / peak_unit;
-            else
-                tuple_set_int (tuple, FIELD_GAIN_PEAK_UNIT, peak_unit);
-        }
-
-        if (! g_ascii_strcasecmp (domain, "album"))
-        {
-            tuple_set_int (tuple, FIELD_GAIN_ALBUM_GAIN, adjustment);
-
-            if (peak_unit)
-                tuple_set_int (tuple, FIELD_GAIN_ALBUM_PEAK, peak);
-        }
-        else if (! g_ascii_strcasecmp (domain, "track"))
-        {
-            tuple_set_int (tuple, FIELD_GAIN_TRACK_GAIN, adjustment);
-
-            if (peak_unit)
-                tuple_set_int (tuple, FIELD_GAIN_TRACK_PEAK, peak);
-        }
-    }
-}
-
-bool_t id3_decode_picture (const char * data, int size, int * type,
- void * * image_data, int64_t * image_size)
-{
-    const char * nul;
-    if (size < 2 || ! (nul = memchr (data + 1, 0, size - 2)))
-        return FALSE;
-
-    const char * body = nul + 2;
-    int body_size = data + size - body;
-
-    int before_nul2, after_nul2;
-    id3_strnlen (body, body_size, data[0], & before_nul2, & after_nul2);
-
-    const char * mime = data + 1;
-    char * desc = id3_convert (body, before_nul2, data[0]);
-
-    * type = nul[1];
-    * image_size = body_size - after_nul2;
-    * image_data = g_memdup (body + after_nul2, * image_size);
-
-    TAGDBG ("Picture: mime = %s, type = %d, desc = %s, size = %d.\n", mime,
-     * type, desc, (int) * image_size);
-
-    str_unref (desc);
-    return TRUE;
-}
diff --git a/src/libaudtag/id3/id3-common.cc b/src/libaudtag/id3/id3-common.cc
new file mode 100644
index 000000000000..99732febf0c0
--- /dev/null
+++ b/src/libaudtag/id3/id3-common.cc
@@ -0,0 +1,306 @@
+/*
+ * id3-common.c
+ * Copyright 2010-2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include "id3-common.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <libaudcore/audstrings.h>
+#include <libaudcore/runtime.h>
+
+#include "../util.h"
+
+#define ID3_ENCODING_LATIN1    0
+#define ID3_ENCODING_UTF16     1
+#define ID3_ENCODING_UTF16_BE  2
+#define ID3_ENCODING_UTF8      3
+
+static void * memchr16 (const void * mem, int16_t chr, int len)
+{
+    while (len >= 2)
+    {
+        if (* (int16_t *) mem == chr)
+            return (void *) mem;
+
+        mem = (char *) mem + 2;
+        len -= 2;
+    }
+
+    return nullptr;
+}
+
+static void id3_strnlen (const char * data, int size, int encoding,
+ int * bytes_without_nul, int * bytes_with_nul)
+{
+    bool is16 = (encoding == ID3_ENCODING_UTF16 || encoding == ID3_ENCODING_UTF16_BE);
+    char * nul = is16 ? (char *) memchr16 (data, 0, size) : (char *) memchr (data, 0, size);
+
+    if (nul)
+    {
+        if (bytes_without_nul)
+            * bytes_without_nul = nul - data;
+        if (bytes_with_nul)
+            * bytes_with_nul = is16 ? nul + 2 - data : nul + 1 - data;
+    }
+    else
+    {
+        if (bytes_without_nul)
+            * bytes_without_nul = size;
+        if (bytes_with_nul)
+            * bytes_with_nul = size;
+    }
+}
+
+static StringBuf id3_convert (const char * data, int size, int encoding)
+{
+    if (encoding == ID3_ENCODING_UTF16)
+        return str_convert (data, size, "UTF-16", "UTF-8");
+    else if (encoding == ID3_ENCODING_UTF16_BE)
+        return str_convert (data, size, "UTF-16BE", "UTF-8");
+    else
+        return str_to_utf8 (data, size);
+}
+
+static StringBuf id3_decode_text (const char * data, int size)
+{
+    if (size < 1)
+        return StringBuf ();
+
+    int real_size;
+    id3_strnlen (data + 1, size - 1, data[0], & real_size, nullptr);
+    return id3_convert (data + 1, real_size, data[0]);
+}
+
+void id3_associate_string (Tuple & tuple, Tuple::Field field, const char * data, int size)
+{
+    StringBuf text = id3_decode_text (data, size);
+
+    if (text && text[0])
+    {
+        AUDDBG ("Field %i = %s.\n", field, (const char *) text);
+        tuple.set_str (field, text);
+    }
+}
+
+void id3_associate_int (Tuple & tuple, Tuple::Field field, const char * data, int size)
+{
+    StringBuf text = id3_decode_text (data, size);
+
+    /* Ignore zeros here.  In particular, there are many ID3 tags with invalid
+     * TLEN fields floating around, and we want to let mpg123 recalculate the
+     * length in such cases. */
+    if (text && atoi (text) > 0)
+    {
+        AUDDBG ("Field %i = %s.\n", field, (const char *) text);
+        tuple.set_int (field, atoi (text));
+    }
+}
+
+void id3_associate_length (Tuple & tuple, const char * data, int size)
+{
+    StringBuf text = id3_decode_text (data, size);
+    int decoder_length = tuple.get_int (Tuple::Length);
+    int tlen_length;
+
+    AUDDBG ("Length, decoder length: %i, tag length: %s.\n", decoder_length, (const char *) text);
+
+    if (text && (tlen_length = atoi (text)))
+    {
+        if (decoder_length <= 0 ||
+            (tlen_length > (decoder_length / 2) && tlen_length < (decoder_length * 2)))
+            tuple.set_int (Tuple::Length, tlen_length);
+    }
+}
+
+void id3_decode_genre (Tuple & tuple, const char * data, int size)
+{
+    StringBuf text = id3_decode_text (data, size);
+    int numericgenre;
+
+    if (! text)
+        return;
+
+    if (text[0] == '(')
+        numericgenre = atoi (text + 1);
+    else
+        numericgenre = atoi (text);
+
+    if (numericgenre > 0)
+        tuple.set_str (Tuple::Genre, convert_numericgenre_to_text (numericgenre));
+    else
+        tuple.set_str (Tuple::Genre, text);
+}
+
+void id3_decode_comment (Tuple & tuple, const char * data, int size)
+{
+    if (size < 4)
+        return;
+
+    int before_nul, after_nul;
+    id3_strnlen (data + 4, size - 4, data[0], & before_nul, & after_nul);
+
+    const char * lang = data + 1;
+    StringBuf type = id3_convert (data + 4, before_nul, data[0]);
+    StringBuf value = id3_convert (data + 4 + after_nul, size - 4 - after_nul, data[0]);
+
+    AUDDBG ("Comment: lang = %.3s, type = %s, value = %s.\n", lang,
+     (const char *) type, (const char *) value);
+
+    if (type && ! type[0] && value) /* blank type = actual comment */
+        tuple.set_str (Tuple::Comment, value);
+}
+
+static bool decode_rva_block (const char * * _data, int * _size,
+ int * channel, int * adjustment, int * adjustment_unit, int * peak,
+ int * peak_unit)
+{
+    const char * data = * _data;
+    int size = * _size;
+    int peak_bits;
+
+    if (size < 4)
+        return false;
+
+    * channel = (unsigned char) data[0];
+    * adjustment = (char) data[1]; /* first byte is signed */
+    * adjustment = (* adjustment << 8) | (unsigned char) data[2];
+    * adjustment_unit = 512;
+    peak_bits = (unsigned char) data[3];
+
+    data += 4;
+    size -= 4;
+
+    AUDDBG ("RVA block: channel = %d, adjustment = %d/%d, peak bits = %d\n",
+     * channel, * adjustment, * adjustment_unit, peak_bits);
+
+    if (peak_bits > 0 && peak_bits < (int) sizeof (int) * 8)
+    {
+        int bytes = (peak_bits + 7) / 8;
+        int count;
+
+        if (bytes > size)
+            return false;
+
+        * peak = 0;
+        * peak_unit = 1 << peak_bits;
+
+        for (count = 0; count < bytes; count ++)
+            * peak = (* peak << 8) | (unsigned char) data[count];
+
+        data += bytes;
+        size -= count;
+
+        AUDDBG ("RVA block: peak = %d/%d\n", * peak, * peak_unit);
+    }
+    else
+    {
+        * peak = 0;
+        * peak_unit = 0;
+    }
+
+    * _data = data;
+    * _size = size;
+    return true;
+}
+
+void id3_decode_rva (Tuple & tuple, const char * data, int size)
+{
+    const char * domain;
+    int channel, adjustment, adjustment_unit, peak, peak_unit;
+
+    if (memchr (data, 0, size) == nullptr)
+        return;
+
+    domain = data;
+
+    AUDDBG ("RVA domain: %s\n", domain);
+
+    size -= strlen (domain) + 1;
+    data += strlen (domain) + 1;
+
+    while (size > 0)
+    {
+        if (! decode_rva_block (& data, & size, & channel, & adjustment,
+         & adjustment_unit, & peak, & peak_unit))
+            break;
+
+        if (channel != 1) /* specific channel? */
+            continue;
+
+        if (tuple.get_value_type (Tuple::GainDivisor) == Tuple::Int)
+            adjustment = adjustment * (int64_t) tuple.get_int
+             (Tuple::GainDivisor) / adjustment_unit;
+        else
+            tuple.set_int (Tuple::GainDivisor, adjustment_unit);
+
+        if (peak_unit)
+        {
+            if (tuple.get_value_type (Tuple::PeakDivisor) == Tuple::Int)
+                peak = peak * (int64_t) tuple.get_int (Tuple::PeakDivisor) / peak_unit;
+            else
+                tuple.set_int (Tuple::PeakDivisor, peak_unit);
+        }
+
+        if (! strcmp_nocase (domain, "album"))
+        {
+            tuple.set_int (Tuple::AlbumGain, adjustment);
+
+            if (peak_unit)
+                tuple.set_int (Tuple::AlbumPeak, peak);
+        }
+        else if (! strcmp_nocase (domain, "track"))
+        {
+            tuple.set_int (Tuple::TrackGain, adjustment);
+
+            if (peak_unit)
+                tuple.set_int (Tuple::TrackPeak, peak);
+        }
+    }
+}
+
+Index<char> id3_decode_picture (const char * data, int size)
+{
+    Index<char> buf;
+
+    const char * nul;
+    if (size < 2 || ! (nul = (char *) memchr (data + 1, 0, size - 2)))
+        return buf;
+
+    int type = (unsigned char) nul[1];
+
+    const char * body = nul + 2;
+    int body_size = data + size - body;
+
+    int before_nul2, after_nul2;
+    id3_strnlen (body, body_size, data[0], & before_nul2, & after_nul2);
+
+    const char * mime = data + 1;
+    StringBuf desc = id3_convert (body, before_nul2, data[0]);
+
+    int image_size = body_size - after_nul2;
+
+    AUDDBG ("Picture: mime = %s, type = %d, desc = %s, size = %d.\n", mime,
+     type, (const char *) desc, image_size);
+
+    if (type == 3 || type == 0)  /* album cover or iTunes */
+        buf.insert (body + after_nul2, 0, image_size);
+
+    return buf;
+}
diff --git a/src/libaudtag/id3/id3-common.h b/src/libaudtag/id3/id3-common.h
index 1b100ab7f24e..1eb3cf5fc665 100644
--- a/src/libaudtag/id3/id3-common.h
+++ b/src/libaudtag/id3/id3-common.h
@@ -20,16 +20,16 @@
 #ifndef AUDTAG_ID3_COMMON_H
 #define AUDTAG_ID3_COMMON_H
 
-#include <stdint.h>
+#include <libaudcore/index.h>
 #include <libaudcore/tuple.h>
 
-void id3_associate_string (Tuple * tuple, int field, const char * data, int size);
-void id3_associate_int (Tuple * tuple, int field, const char * data, int size);
-void id3_decode_genre (Tuple * tuple, const char * data, int size);
-void id3_decode_comment (Tuple * tuple, const char * data, int size);
-void id3_decode_rva (Tuple * tuple, const char * data, int size);
+void id3_associate_string (Tuple & tuple, Tuple::Field field, const char * data, int size);
+void id3_associate_int (Tuple & tuple, Tuple::Field field, const char * data, int size);
+void id3_associate_length (Tuple & tuple, const char * data, int size);
+void id3_decode_genre (Tuple & tuple, const char * data, int size);
+void id3_decode_comment (Tuple & tuple, const char * data, int size);
+void id3_decode_rva (Tuple & tuple, const char * data, int size);
 
-bool_t id3_decode_picture (const char * data, int size, int * type,
- void * * image_data, int64_t * image_size);
+Index<char> id3_decode_picture (const char * data, int size);
 
 #endif
diff --git a/src/libaudtag/id3/id3v1.c b/src/libaudtag/id3/id3v1.c
deleted file mode 100644
index 16da2d26c32e..000000000000
--- a/src/libaudtag/id3/id3v1.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * id3v1.c
- * Copyright 2013 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include <libaudcore/audstrings.h>
-
-#include "../tag_module.h"
-#include "../util.h"
-
-#include "id3v1.h"
-
-#pragma pack(push)
-#pragma pack(1)
-
-typedef struct {
-    char header[3];
-    char title[30];
-    char artist[30];
-    char album[30];
-    char year[4];
-    char comment[30];
-    unsigned char genre;
-} ID3v1Tag;
-
-typedef struct {
-    char header[4];
-    char title[60];
-    char artist[60];
-    char album[60];
-    unsigned char speed;
-    char genre[30];
-    char start[6];
-    char end[6];
-} ID3v1Ext;
-
-#pragma pack(pop)
-
-static bool_t read_id3v1_tag (VFSFile * file, ID3v1Tag * tag)
-{
-    if (vfs_fseek (file, -sizeof (ID3v1Tag), SEEK_END) < 0)
-        return FALSE;
-    if (vfs_fread (tag, 1, sizeof (ID3v1Tag), file) != sizeof (ID3v1Tag))
-        return FALSE;
-
-    return ! strncmp (tag->header, "TAG", 3);
-}
-
-static bool_t read_id3v1_ext (VFSFile * file, ID3v1Ext * ext)
-{
-    if (vfs_fseek (file, -(sizeof (ID3v1Ext) + sizeof (ID3v1Tag)), SEEK_END) < 0)
-        return FALSE;
-    if (vfs_fread (ext, 1, sizeof (ID3v1Ext), file) != sizeof (ID3v1Ext))
-        return FALSE;
-
-    return ! strncmp (ext->header, "TAG+", 4);
-}
-
-static bool_t id3v1_can_handle_file (VFSFile * file)
-{
-    ID3v1Tag tag;
-    return read_id3v1_tag (file, & tag);
-}
-
-static bool_t combine_string (Tuple * tuple, int field, const char * str1,
- int size1, const char * str2, int size2)
-{
-    char str[size1 + size2 + 1];
-    
-    memset (str, 0, sizeof str);
-    strncpy (str, str1, size1);
-    strncpy (str + strlen (str), str2, size2);
-
-    g_strchomp (str);
-
-    if (! str[0])
-        return FALSE;
-
-    char * utf8 = str_to_utf8 (str, -1);
-    if (! utf8)
-        return FALSE;
-
-    tuple_set_str (tuple, field, utf8);
-
-    str_unref (utf8);
-    return TRUE;
-}
-
-static bool_t id3v1_read_tag (Tuple * tuple, VFSFile * file)
-{
-    ID3v1Tag tag;
-    ID3v1Ext ext;
-
-    if (! read_id3v1_tag (file, & tag))
-        return FALSE;
-
-    if (! read_id3v1_ext (file, & ext))
-        memset (& ext, 0, sizeof (ID3v1Ext));
-
-    combine_string (tuple, FIELD_TITLE, tag.title, sizeof tag.title, ext.title, sizeof ext.title);
-    combine_string (tuple, FIELD_ARTIST, tag.artist, sizeof tag.artist, ext.artist, sizeof ext.artist);
-    combine_string (tuple, FIELD_ALBUM, tag.album, sizeof tag.album, ext.album, sizeof ext.album);
-    combine_string (tuple, FIELD_COMMENT, tag.comment, sizeof tag.comment, NULL, 0);
-
-    SNCOPY (year, tag.year, 4);
-    if (atoi (year))
-        tuple_set_int (tuple, FIELD_YEAR, atoi (year));
-
-    if (! tag.comment[28] && tag.comment[29])
-        tuple_set_int (tuple, FIELD_TRACK_NUMBER, (unsigned char) tag.comment[29]);
-
-    if (! combine_string (tuple, FIELD_GENRE, ext.genre, sizeof ext.genre, NULL, 0))
-        tuple_set_str (tuple, FIELD_GENRE, convert_numericgenre_to_text (tag.genre));
-
-    return TRUE;
-}
-
-tag_module_t id3v1 = {
-    .name = "ID3v1",
-    .can_handle_file = id3v1_can_handle_file,
-    .read_tag = id3v1_read_tag,
-};
diff --git a/src/libaudtag/id3/id3v1.cc b/src/libaudtag/id3/id3v1.cc
new file mode 100644
index 000000000000..59b8e5483ec4
--- /dev/null
+++ b/src/libaudtag/id3/id3v1.cc
@@ -0,0 +1,127 @@
+/*
+ * id3v1.c
+ * Copyright 2013 John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>  /* for g_strchomp */
+
+#include <libaudcore/audstrings.h>
+#include <libaudtag/builtin.h>
+
+#pragma pack(push)
+#pragma pack(1)
+
+struct ID3v1Tag {
+    char header[3];
+    char title[30];
+    char artist[30];
+    char album[30];
+    char year[4];
+    char comment[30];
+    unsigned char genre;
+};
+
+struct ID3v1Ext {
+    char header[4];
+    char title[60];
+    char artist[60];
+    char album[60];
+    unsigned char speed;
+    char genre[30];
+    char start[6];
+    char end[6];
+};
+
+#pragma pack(pop)
+
+namespace audtag {
+
+static bool read_id3v1_tag (VFSFile & file, ID3v1Tag * tag)
+{
+    if (file.fseek (-sizeof (ID3v1Tag), VFS_SEEK_END) < 0)
+        return false;
+    if (file.fread (tag, 1, sizeof (ID3v1Tag)) != sizeof (ID3v1Tag))
+        return false;
+
+    return ! strncmp (tag->header, "TAG", 3);
+}
+
+static bool read_id3v1_ext (VFSFile & file, ID3v1Ext * ext)
+{
+    if (file.fseek (-(sizeof (ID3v1Ext) + sizeof (ID3v1Tag)), VFS_SEEK_END) < 0)
+        return false;
+    if (file.fread (ext, 1, sizeof (ID3v1Ext)) != sizeof (ID3v1Ext))
+        return false;
+
+    return ! strncmp (ext->header, "TAG+", 4);
+}
+
+bool ID3v1TagModule::can_handle_file (VFSFile & file)
+{
+    ID3v1Tag tag;
+    return read_id3v1_tag (file, & tag);
+}
+
+static bool combine_string (Tuple & tuple, Tuple::Field field,
+ const char * str1, int size1, const char * str2, int size2)
+{
+    StringBuf str = str_copy (str1, strlen_bounded (str1, size1));
+    str.insert (-1, str2, strlen_bounded (str2, size2));
+
+    g_strchomp (str);
+    str.resize (strlen (str));
+
+    if (! str.len ())
+        return false;
+
+    tuple.set_str (field, str);
+    return true;
+}
+
+bool ID3v1TagModule::read_tag (Tuple & tuple, VFSFile & file)
+{
+    ID3v1Tag tag;
+    ID3v1Ext ext;
+
+    if (! read_id3v1_tag (file, & tag))
+        return false;
+
+    if (! read_id3v1_ext (file, & ext))
+        memset (& ext, 0, sizeof (ID3v1Ext));
+
+    combine_string (tuple, Tuple::Title, tag.title, sizeof tag.title, ext.title, sizeof ext.title);
+    combine_string (tuple, Tuple::Artist, tag.artist, sizeof tag.artist, ext.artist, sizeof ext.artist);
+    combine_string (tuple, Tuple::Album, tag.album, sizeof tag.album, ext.album, sizeof ext.album);
+    combine_string (tuple, Tuple::Comment, tag.comment, sizeof tag.comment, nullptr, 0);
+
+    StringBuf year = str_copy (tag.year, strlen_bounded (tag.year, 4));
+    if (atoi (year))
+        tuple.set_int (Tuple::Year, atoi (year));
+
+    if (! tag.comment[28] && tag.comment[29])
+        tuple.set_int (Tuple::Track, (unsigned char) tag.comment[29]);
+
+    if (! combine_string (tuple, Tuple::Genre, ext.genre, sizeof ext.genre, nullptr, 0))
+        tuple.set_str (Tuple::Genre, convert_numericgenre_to_text (tag.genre));
+
+    return true;
+}
+
+}
diff --git a/src/libaudtag/id3/id3v1.h b/src/libaudtag/id3/id3v1.h
deleted file mode 100644
index 623982d0b230..000000000000
--- a/src/libaudtag/id3/id3v1.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * id3v1.h
- * Copyright 2010 Tony Vroon
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef ID3V1_H
-#define ID3V1_H
-
-#include "../tag_module.h"
-
-extern tag_module_t id3v1;
-
-#endif
diff --git a/src/libaudtag/id3/id3v22.c b/src/libaudtag/id3/id3v22.c
deleted file mode 100644
index 7e886fd48347..000000000000
--- a/src/libaudtag/id3/id3v22.c
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * id3v22.c
- * Copyright 2009-2011 Paula Stanciu, Tony Vroon, John Lindgren,
- *                     and William Pitcock
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <libaudcore/audstrings.h>
-
-#include "id3-common.h"
-#include "id3v22.h"
-#include "../util.h"
-
-enum
-{
-    ID3_ALBUM = 0,
-    ID3_TITLE,
-    ID3_COMPOSER,
-    ID3_COPYRIGHT,
-    ID3_DATE,
-    ID3_LENGTH,
-    ID3_ARTIST,
-    ID3_TRACKNR,
-    ID3_YEAR,
-    ID3_GENRE,
-    ID3_COMMENT,
-    ID3_ENCODER,
-    ID3_TXX,
-    ID3_RVA,
-    ID3_FUCKO_ARTIST,
-    ID3_TAGS_NO
-};
-
-static const char * id3_frames[ID3_TAGS_NO] = {"TAL", "TT2", "TCM", "TCR",
-"TDA", "TLE", "TPE", "TRK", "TYE", "TCO", "COM", "TSS", "TXX", "RVA", "TP1"};
-
-#pragma pack(push) /* must be byte-aligned */
-#pragma pack(1)
-typedef struct
-{
-    char magic[3];
-    unsigned char version;
-    unsigned char revision;
-    unsigned char flags;
-    uint32_t size;
-}
-ID3v2Header;
-
-typedef struct
-{
-    char key[3];
-    unsigned char size[3];
-}
-ID3v2FrameHeader;
-#pragma pack(pop)
-
-typedef struct
-{
-    char key[5];
-    unsigned char * data;
-    int size;
-}
-GenericFrame;
-
-#define ID3_HEADER_SYNCSAFE             0x40
-#define ID3_HEADER_COMPRESSED           0x20
-
-#define TAG_SIZE 1
-
-#define write_syncsafe_int32(x) vfs_fput_be32 (syncsafe32 (x))
-
-static bool_t validate_header (ID3v2Header * header)
-{
-    if (memcmp (header->magic, "ID3", 3))
-        return FALSE;
-
-    if ((header->version != 2))
-        return FALSE;
-
-    header->size = unsyncsafe32(GUINT32_FROM_BE(header->size));
-
-    TAGDBG ("Found ID3v2 header:\n");
-    TAGDBG (" magic = %.3s\n", header->magic);
-    TAGDBG (" version = %d\n", (int) header->version);
-    TAGDBG (" revision = %d\n", (int) header->revision);
-    TAGDBG (" flags = %x\n", (int) header->flags);
-    TAGDBG (" size = %d\n", (int) header->size);
-    return TRUE;
-}
-
-static bool_t read_header (VFSFile * handle, int * version, bool_t *
- syncsafe, gsize * offset, int * header_size, int * data_size)
-{
-    ID3v2Header header;
-
-    if (vfs_fseek (handle, 0, SEEK_SET))
-        return FALSE;
-
-    if (vfs_fread (& header, 1, sizeof (ID3v2Header), handle) != sizeof
-     (ID3v2Header))
-        return FALSE;
-
-    if (validate_header (& header))
-    {
-        * offset = 0;
-        * version = header.version;
-        * header_size = sizeof (ID3v2Header);
-        * data_size = header.size;
-    } else return FALSE;
-
-    * syncsafe = (header.flags & ID3_HEADER_SYNCSAFE) ? TRUE : FALSE;
-
-    TAGDBG ("Offset = %d, header size = %d, data size = %d\n",
-     (int) * offset, * header_size, * data_size);
-
-    return TRUE;
-}
-
-static bool_t read_frame (VFSFile * handle, int max_size, int version,
- bool_t syncsafe, int * frame_size, char * key, char * * data, int * size)
-{
-    ID3v2FrameHeader header;
-    int i;
-    uint32_t hdrsz = 0;
-
-    if ((max_size -= sizeof (ID3v2FrameHeader)) < 0)
-        return FALSE;
-
-    if (vfs_fread (& header, 1, sizeof (ID3v2FrameHeader), handle) != sizeof
-     (ID3v2FrameHeader))
-        return FALSE;
-
-    if (! header.key[0]) /* padding */
-        return FALSE;
-
-    for (i = 0; i < 3; i++)
-    {
-        hdrsz |= (uint32_t) header.size[i] << ((2 - i) * 8);
-        TAGDBG("header.size[%d] = %d hdrsz %d slot %d\n", i, header.size[i], hdrsz, 2 - i);
-    }
-
-//    hdrsz = GUINT32_TO_BE(hdrsz);
-    if (hdrsz > max_size || hdrsz == 0)
-        return FALSE;
-
-    TAGDBG ("Found frame:\n");
-    TAGDBG (" key = %.3s\n", header.key);
-    TAGDBG (" size = %d\n", (int) hdrsz);
-
-    * frame_size = sizeof (ID3v2FrameHeader) + hdrsz;
-    g_strlcpy (key, header.key, 4);
-
-    * size = hdrsz;
-    * data = g_malloc (* size);
-
-    if (vfs_fread (* data, 1, * size, handle) != * size)
-        return FALSE;
-
-    TAGDBG ("Data size = %d.\n", * size);
-    return TRUE;
-}
-
-
-static int get_frame_id (const char * key)
-{
-    int id;
-
-    for (id = 0; id < ID3_TAGS_NO; id ++)
-    {
-        if (! strcmp (key, id3_frames[id]))
-            return id;
-    }
-
-    return -1;
-}
-
-static bool_t id3v22_can_handle_file (VFSFile * handle)
-{
-    int version, header_size, data_size;
-    bool_t syncsafe;
-    gsize offset;
-
-    return read_header (handle, & version, & syncsafe, & offset, & header_size,
-     & data_size);
-}
-
-bool_t id3v22_read_tag (Tuple * tuple, VFSFile * handle)
-{
-    int version, header_size, data_size;
-    bool_t syncsafe;
-    gsize offset;
-    int pos;
-
-    if (! read_header (handle, & version, & syncsafe, & offset, & header_size,
-     & data_size))
-        return FALSE;
-
-    TAGDBG ("Reading tags from %i bytes of ID3 data in %s\n", data_size,
-     vfs_get_filename (handle));
-
-    for (pos = 0; pos < data_size; )
-    {
-        int frame_size, size, id;
-        char key[5];
-        char * data;
-
-        if (! read_frame (handle, data_size - pos, version, syncsafe,
-         & frame_size, key, & data, & size))
-        {
-            TAGDBG("read_frame failed at pos %i\n", pos);
-                break;
-        }
-
-        id = get_frame_id (key);
-
-        switch (id)
-        {
-          case ID3_ALBUM:
-            id3_associate_string (tuple, FIELD_ALBUM, data, size);
-            break;
-          case ID3_TITLE:
-            id3_associate_string (tuple, FIELD_TITLE, data, size);
-            break;
-          case ID3_COMPOSER:
-            id3_associate_string (tuple, FIELD_COMPOSER, data, size);
-            break;
-          case ID3_COPYRIGHT:
-            id3_associate_string (tuple, FIELD_COPYRIGHT, data, size);
-            break;
-          case ID3_DATE:
-            id3_associate_string (tuple, FIELD_DATE, data, size);
-            break;
-          case ID3_LENGTH:
-            id3_associate_int (tuple, FIELD_LENGTH, data, size);
-            break;
-          case ID3_FUCKO_ARTIST:
-          case ID3_ARTIST:
-            id3_associate_string (tuple, FIELD_ARTIST, data, size);
-            break;
-          case ID3_TRACKNR:
-            id3_associate_int (tuple, FIELD_TRACK_NUMBER, data, size);
-            break;
-          case ID3_YEAR:
-            id3_associate_int (tuple, FIELD_YEAR, data, size);
-            break;
-          case ID3_GENRE:
-            id3_decode_genre (tuple, data, size);
-            break;
-          case ID3_COMMENT:
-            id3_decode_comment (tuple, data, size);
-            break;
-          case ID3_RVA:
-            id3_decode_rva (tuple, data, size);
-            break;
-          default:
-            TAGDBG ("Ignoring unsupported ID3 frame %s.\n", key);
-            break;
-        }
-
-        g_free (data);
-        pos += frame_size;
-    }
-
-    return TRUE;
-}
-
-static bool_t id3v22_read_image (VFSFile * handle, void * * image_data, int64_t * image_size)
-{
-    int version, header_size, data_size, parsed;
-    bool_t syncsafe;
-    gsize offset;
-    bool_t found = FALSE;
-
-    if (! read_header (handle, & version, & syncsafe, & offset, & header_size,
-     & data_size))
-        return FALSE;
-
-    for (parsed = 0; parsed < data_size && ! found; )
-    {
-        int frame_size, size, type;
-        char key[5];
-        char * data;
-        int frame_length;
-
-        if (! read_frame (handle, data_size - parsed, version, syncsafe,
-         & frame_size, key, & data, & size))
-            break;
-
-        frame_length = size;
-
-        if (! strcmp (key, "PIC") && id3_decode_picture (data, frame_length,
-         & type, image_data, image_size))
-        {
-            if (type == 3) /* album cover */
-                found = TRUE;
-            else if (type == 0) /* iTunes */
-                found = TRUE;
-            else if (*image_data != NULL)
-            {
-                g_free(*image_data);
-                *image_data = NULL;
-            }
-        }
-
-        g_free (data);
-        parsed += frame_size;
-    }
-
-    return found;
-}
-
-static bool_t id3v22_write_tag (const Tuple * tuple, VFSFile * f)
-{
-    fprintf (stderr, "Writing ID3v2.2 tags is not implemented yet, sorry.\n");
-    return FALSE;
-}
-
-tag_module_t id3v22 =
-{
-    .name = "ID3v2.2",
-    .can_handle_file = id3v22_can_handle_file,
-    .read_tag = id3v22_read_tag,
-    .read_image = id3v22_read_image,
-    .write_tag = id3v22_write_tag,
-};
diff --git a/src/libaudtag/id3/id3v22.cc b/src/libaudtag/id3/id3v22.cc
new file mode 100644
index 000000000000..e905e82c84c2
--- /dev/null
+++ b/src/libaudtag/id3/id3v22.cc
@@ -0,0 +1,315 @@
+/*
+ * id3v22.c
+ * Copyright 2009-2014 Paula Stanciu, Tony Vroon, John Lindgren,
+ *                     and William Pitcock
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#define WANT_AUD_BSWAP
+#include <libaudcore/audio.h>
+#include <libaudcore/audstrings.h>
+#include <libaudcore/runtime.h>
+#include <libaudtag/builtin.h>
+
+#include "id3-common.h"
+
+enum
+{
+    ID3_ALBUM = 0,
+    ID3_TITLE,
+    ID3_COMPOSER,
+    ID3_COPYRIGHT,
+    ID3_DATE,
+    ID3_LENGTH,
+    ID3_ARTIST,
+    ID3_ALBUM_ARTIST,
+    ID3_TRACKNR,
+    ID3_YEAR,
+    ID3_GENRE,
+    ID3_COMMENT,
+    ID3_ENCODER,
+    ID3_TXX,
+    ID3_RVA,
+    ID3_TAGS_NO
+};
+
+static const char * id3_frames[ID3_TAGS_NO] = {
+    "TAL",
+    "TT2",
+    "TCM",
+    "TCR",
+    "TDA",
+    "TLE",
+    "TP1",
+    "TP2",
+    "TRK",
+    "TYE",
+    "TCO",
+    "COM",
+    "TSS",
+    "TXX",
+    "RVA"
+};
+
+#pragma pack(push) /* must be byte-aligned */
+#pragma pack(1)
+struct ID3v2Header {
+    char magic[3];
+    unsigned char version;
+    unsigned char revision;
+    unsigned char flags;
+    uint32_t size;
+};
+
+struct ID3v2FrameHeader {
+    char key[3];
+    unsigned char size[3];
+};
+#pragma pack(pop)
+
+struct GenericFrame : public Index<char> {
+    String key;
+};
+
+#define ID3_HEADER_SYNCSAFE             0x40
+#define ID3_HEADER_COMPRESSED           0x20
+
+namespace audtag {
+
+static bool validate_header (ID3v2Header * header)
+{
+    if (memcmp (header->magic, "ID3", 3))
+        return false;
+
+    if ((header->version != 2))
+        return false;
+
+    header->size = unsyncsafe32 (FROM_BE32 (header->size));
+
+    AUDDBG ("Found ID3v2 header:\n");
+    AUDDBG (" magic = %.3s\n", header->magic);
+    AUDDBG (" version = %d\n", (int) header->version);
+    AUDDBG (" revision = %d\n", (int) header->revision);
+    AUDDBG (" flags = %x\n", (int) header->flags);
+    AUDDBG (" size = %d\n", (int) header->size);
+    return true;
+}
+
+static bool read_header (VFSFile & handle, int * version, bool *
+ syncsafe, int64_t * offset, int * header_size, int * data_size)
+{
+    ID3v2Header header;
+
+    if (handle.fseek (0, VFS_SEEK_SET))
+        return false;
+
+    if (handle.fread (& header, 1, sizeof (ID3v2Header)) != sizeof
+     (ID3v2Header))
+        return false;
+
+    if (validate_header (& header))
+    {
+        * offset = 0;
+        * version = header.version;
+        * header_size = sizeof (ID3v2Header);
+        * data_size = header.size;
+    }
+    else
+        return false;
+
+    * syncsafe = (header.flags & ID3_HEADER_SYNCSAFE) ? true : false;
+
+    AUDDBG ("Offset = %d, header size = %d, data size = %d\n",
+     (int) * offset, * header_size, * data_size);
+
+    return true;
+}
+
+static bool read_frame (VFSFile & handle, int max_size, int version,
+ bool syncsafe, int * frame_size, GenericFrame & frame)
+{
+    ID3v2FrameHeader header;
+    uint32_t hdrsz = 0;
+
+    if ((max_size -= sizeof (ID3v2FrameHeader)) < 0)
+        return false;
+
+    if (handle.fread (& header, 1, sizeof (ID3v2FrameHeader)) != sizeof
+     (ID3v2FrameHeader))
+        return false;
+
+    if (! header.key[0]) /* padding */
+        return false;
+
+    for (int i = 0; i < 3; i++)
+    {
+        hdrsz |= (uint32_t) header.size[i] << ((2 - i) * 8);
+        AUDDBG ("header.size[%d] = %d hdrsz %d slot %d\n", i, header.size[i], hdrsz, 2 - i);
+    }
+
+    if (hdrsz > (unsigned) max_size || hdrsz == 0)
+        return false;
+
+    AUDDBG ("Found frame:\n");
+    AUDDBG (" key = %.3s\n", header.key);
+    AUDDBG (" size = %d\n", (int) hdrsz);
+
+    * frame_size = sizeof (ID3v2FrameHeader) + hdrsz;
+
+    frame.key = String (str_copy (header.key, 3));
+    frame.clear ();
+    frame.insert (0, hdrsz);
+
+    if (handle.fread (& frame[0], 1, frame.len ()) != frame.len ())
+        return false;
+
+    AUDDBG ("Data size = %d.\n", frame.len ());
+    return true;
+}
+
+
+static int get_frame_id (const char * key)
+{
+    int id;
+
+    for (id = 0; id < ID3_TAGS_NO; id ++)
+    {
+        if (! strcmp (key, id3_frames[id]))
+            return id;
+    }
+
+    return -1;
+}
+
+bool ID3v22TagModule::can_handle_file (VFSFile & handle)
+{
+    int version, header_size, data_size;
+    bool syncsafe;
+    int64_t offset;
+
+    return read_header (handle, & version, & syncsafe, & offset, & header_size,
+     & data_size);
+}
+
+bool ID3v22TagModule::read_tag (Tuple & tuple, VFSFile & handle)
+{
+    int version, header_size, data_size;
+    bool syncsafe;
+    int64_t offset;
+    int pos;
+
+    if (! read_header (handle, & version, & syncsafe, & offset, & header_size,
+     & data_size))
+        return false;
+
+    AUDDBG ("Reading tags from %i bytes of ID3 data in %s\n", data_size,
+     handle.filename ());
+
+    for (pos = 0; pos < data_size; )
+    {
+        int frame_size;
+        GenericFrame frame;
+
+        if (! read_frame (handle, data_size - pos, version, syncsafe, & frame_size, frame))
+        {
+            AUDDBG("read_frame failed at pos %i\n", pos);
+            break;
+        }
+
+        switch (get_frame_id (frame.key))
+        {
+          case ID3_ALBUM:
+            id3_associate_string (tuple, Tuple::Album, & frame[0], frame.len ());
+            break;
+          case ID3_TITLE:
+            id3_associate_string (tuple, Tuple::Title, & frame[0], frame.len ());
+            break;
+          case ID3_COMPOSER:
+            id3_associate_string (tuple, Tuple::Composer, & frame[0], frame.len ());
+            break;
+          case ID3_COPYRIGHT:
+            id3_associate_string (tuple, Tuple::Copyright, & frame[0], frame.len ());
+            break;
+          case ID3_DATE:
+            id3_associate_string (tuple, Tuple::Date, & frame[0], frame.len ());
+            break;
+          case ID3_LENGTH:
+            id3_associate_length (tuple, & frame[0], frame.len ());
+            break;
+          case ID3_ARTIST:
+            id3_associate_string (tuple, Tuple::Artist, & frame[0], frame.len ());
+            break;
+          case ID3_ALBUM_ARTIST:
+            id3_associate_string (tuple, Tuple::AlbumArtist, & frame[0], frame.len ());
+            break;
+          case ID3_TRACKNR:
+            id3_associate_int (tuple, Tuple::Track, & frame[0], frame.len ());
+            break;
+          case ID3_YEAR:
+            id3_associate_int (tuple, Tuple::Year, & frame[0], frame.len ());
+            break;
+          case ID3_GENRE:
+            id3_decode_genre (tuple, & frame[0], frame.len ());
+            break;
+          case ID3_COMMENT:
+            id3_decode_comment (tuple, & frame[0], frame.len ());
+            break;
+          case ID3_RVA:
+            id3_decode_rva (tuple, & frame[0], frame.len ());
+            break;
+          default:
+            AUDDBG ("Ignoring unsupported ID3 frame %s.\n", (const char *) frame.key);
+            break;
+        }
+
+        pos += frame_size;
+    }
+
+    return true;
+}
+
+Index<char> ID3v22TagModule::read_image (VFSFile & handle)
+{
+    int version, header_size, data_size, parsed;
+    bool syncsafe;
+    int64_t offset;
+    Index<char> buf;
+
+    if (! read_header (handle, & version, & syncsafe, & offset, & header_size,
+     & data_size))
+        return buf;
+
+    for (parsed = 0; parsed < data_size && ! buf.len (); )
+    {
+        int frame_size;
+        GenericFrame frame;
+
+        if (! read_frame (handle, data_size - parsed, version, syncsafe, & frame_size, frame))
+            break;
+
+        if (! strcmp (frame.key, "PIC"))
+            buf = id3_decode_picture (& frame[0], frame.len ());
+
+        parsed += frame_size;
+    }
+
+    return buf;
+}
+
+}
diff --git a/src/libaudtag/id3/id3v22.h b/src/libaudtag/id3/id3v22.h
deleted file mode 100644
index f78f8bb70f6f..000000000000
--- a/src/libaudtag/id3/id3v22.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * id3v22.h
- * Copyright 2010 Tony Vroon
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDTAG_ID3V22_H
-#define AUDTAG_ID3V22_H
-
-#include "../audtag.h"
-#include "../tag_module.h"
-#include "../util.h"
-
-extern tag_module_t id3v22;
-
-#endif
diff --git a/src/libaudtag/id3/id3v24.c b/src/libaudtag/id3/id3v24.c
deleted file mode 100644
index fac1a4443c85..000000000000
--- a/src/libaudtag/id3/id3v24.c
+++ /dev/null
@@ -1,807 +0,0 @@
-/*
- * id3v24.c
- * Copyright 2009-2014 Paula Stanciu, Tony Vroon, John Lindgren,
- *                     Mikael Magnusson, and Michał Lipski
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <libaudcore/audstrings.h>
-
-#include "id3-common.h"
-#include "id3v24.h"
-#include "../util.h"
-
-enum
-{
-    ID3_ALBUM = 0,
-    ID3_TITLE,
-    ID3_COMPOSER,
-    ID3_COPYRIGHT,
-    ID3_DATE,
-    ID3_LENGTH,
-    ID3_ARTIST,
-    ID3_TRACKNR,
-    ID3_YEAR,
-    ID3_GENRE,
-    ID3_COMMENT,
-    ID3_PRIVATE,
-    ID3_ENCODER,
-    ID3_RECORDING_TIME,
-    ID3_TXXX,
-    ID3_RVA2,
-    ID3_TAGS_NO
-};
-
-static const char * id3_frames[ID3_TAGS_NO] = {"TALB", "TIT2", "TCOM", "TCOP",
- "TDAT", "TLEN", "TPE1", "TRCK", "TYER", "TCON", "COMM", "PRIV", "TSSE", "TDRC",
- "TXXX", "RVA2"};
-
-static const unsigned char PRIMARY_CLASS_MUSIC[16] = {0xBC, 0x7D, 0x60, 0xD1, 0x23,
- 0xE3, 0xE2, 0x4B, 0x86, 0xA1, 0x48, 0xA4, 0x2A, 0x28, 0x44, 0x1E};
-static const unsigned char PRIMARY_CLASS_AUDIO[16] = {0x29, 0x0F, 0xCD, 0x01, 0x4E,
- 0xDA, 0x57, 0x41, 0x89, 0x7B, 0x62, 0x75, 0xD5, 0x0C, 0x4F, 0x11};
-static const unsigned char SECONDARY_CLASS_AUDIOBOOK[16] = {0xEB, 0x6B, 0x23, 0xE0,
- 0x81, 0xC2, 0xDE, 0x4E, 0xA3, 0x6D, 0x7A, 0xF7, 0x6A, 0x3D, 0x45, 0xB5};
-static const unsigned char SECONDARY_CLASS_SPOKENWORD[16] = {0x13, 0x2A, 0x17, 0x3A,
- 0xD9, 0x2B, 0x31, 0x48, 0x83, 0x5B, 0x11, 0x4F, 0x6A, 0x95, 0x94, 0x3F};
-static const unsigned char SECONDARY_CLASS_NEWS[16] = {0x9B, 0xDB, 0x77, 0x66, 0xA0,
- 0xE5, 0x63, 0x40, 0xA1, 0xAD, 0xAC, 0xEB, 0x52, 0x84, 0x0C, 0xF1};
-static const unsigned char SECONDARY_CLASS_TALKSHOW[16] = {0x67, 0x4A, 0x82, 0x1B,
- 0x80, 0x3F, 0x3E, 0x4E, 0x9C, 0xDE, 0xF7, 0x36, 0x1B, 0x0F, 0x5F, 0x1B};
-static const unsigned char SECONDARY_CLASS_GAMES_CLIP[16] = {0x68, 0x33, 0x03, 0x00,
- 0x09, 0x50, 0xC3, 0x4A, 0xA8, 0x20, 0x5D, 0x2D, 0x09, 0xA4, 0xE7, 0xC1};
-static const unsigned char SECONDARY_CLASS_GAMES_SONG[16] = {0x31, 0xF7, 0x4F, 0xF2,
- 0xFC, 0x96, 0x0F, 0x4D, 0xA2, 0xF5, 0x5A, 0x34, 0x83, 0x68, 0x2B, 0x1A};
-
-#pragma pack(push) /* must be byte-aligned */
-#pragma pack(1)
-typedef struct
-{
-    char magic[3];
-    unsigned char version;
-    unsigned char revision;
-    unsigned char flags;
-    uint32_t size;
-}
-ID3v2Header;
-
-typedef struct
-{
-    char key[4];
-    uint32_t size;
-    uint16_t flags;
-}
-ID3v2FrameHeader;
-#pragma pack(pop)
-
-typedef struct
-{
-    char key[5];
-    char * data;
-    int size;
-}
-GenericFrame;
-
-#define ID3_HEADER_SYNCSAFE             0x80
-#define ID3_HEADER_HAS_EXTENDED_HEADER  0x40
-#define ID3_HEADER_HAS_FOOTER           0x10
-
-#define ID3_FRAME_HAS_GROUP   0x0040
-#define ID3_FRAME_COMPRESSED  0x0008
-#define ID3_FRAME_ENCRYPTED   0x0004
-#define ID3_FRAME_SYNCSAFE    0x0002
-#define ID3_FRAME_HAS_LENGTH  0x0001
-
-static bool_t skip_extended_header_3 (VFSFile * handle, int * _size)
-{
-    uint32_t size;
-
-    if (vfs_fread (& size, 1, 4, handle) != 4)
-        return FALSE;
-
-    size = GUINT32_FROM_BE (size);
-
-    TAGDBG ("Found v2.3 extended header, size = %d.\n", (int) size);
-
-    if (vfs_fseek (handle, size, SEEK_CUR))
-        return FALSE;
-
-    * _size = 4 + size;
-    return TRUE;
-}
-
-static bool_t skip_extended_header_4 (VFSFile * handle, int * _size)
-{
-    uint32_t size;
-
-    if (vfs_fread (& size, 1, 4, handle) != 4)
-        return FALSE;
-
-    size = unsyncsafe32 (GUINT32_FROM_BE (size));
-
-    TAGDBG ("Found v2.4 extended header, size = %d.\n", (int) size);
-
-    if (vfs_fseek (handle, size - 4, SEEK_CUR))
-        return FALSE;
-
-    * _size = size;
-    return TRUE;
-}
-
-static bool_t validate_header (ID3v2Header * header, bool_t is_footer)
-{
-    if (memcmp (header->magic, is_footer ? "3DI" : "ID3", 3))
-        return FALSE;
-
-    if ((header->version != 3 && header->version != 4) || header->revision != 0)
-        return FALSE;
-
-    header->size = unsyncsafe32 (GUINT32_FROM_BE (header->size));
-
-    TAGDBG ("Found ID3v2 %s:\n", is_footer ? "footer" : "header");
-    TAGDBG (" magic = %.3s\n", header->magic);
-    TAGDBG (" version = %d\n", (int) header->version);
-    TAGDBG (" revision = %d\n", (int) header->revision);
-    TAGDBG (" flags = %x\n", (int) header->flags);
-    TAGDBG (" size = %d\n", (int) header->size);
-    return TRUE;
-}
-
-static bool_t read_header (VFSFile * handle, int * version, bool_t *
- syncsafe, int64_t * offset, int * header_size, int * data_size, int *
- footer_size)
-{
-    ID3v2Header header, footer;
-
-    if (vfs_fseek (handle, 0, SEEK_SET))
-        return FALSE;
-
-    if (vfs_fread (& header, 1, sizeof (ID3v2Header), handle) != sizeof
-     (ID3v2Header))
-        return FALSE;
-
-    if (validate_header (& header, FALSE))
-    {
-        * offset = 0;
-        * version = header.version;
-        * header_size = sizeof (ID3v2Header);
-        * data_size = header.size;
-
-        if (header.flags & ID3_HEADER_HAS_FOOTER)
-        {
-            if (vfs_fseek (handle, header.size, SEEK_CUR))
-                return FALSE;
-
-            if (vfs_fread (& footer, 1, sizeof (ID3v2Header), handle) != sizeof
-             (ID3v2Header))
-                return FALSE;
-
-            if (! validate_header (& footer, TRUE))
-                return FALSE;
-
-            if (vfs_fseek (handle, sizeof (ID3v2Header), SEEK_SET))
-                return FALSE;
-
-            * footer_size = sizeof (ID3v2Header);
-        }
-        else
-            * footer_size = 0;
-    }
-    else
-    {
-        int64_t end = vfs_fsize (handle);
-
-        if (end < 0)
-            return FALSE;
-
-        if (vfs_fseek (handle, end - sizeof (ID3v2Header), SEEK_SET))
-            return FALSE;
-
-        if (vfs_fread (& footer, 1, sizeof (ID3v2Header), handle) != sizeof
-         (ID3v2Header))
-            return FALSE;
-
-        if (! validate_header (& footer, TRUE))
-            return FALSE;
-
-        * offset = end - 2 * sizeof (ID3v2Header) - footer.size;
-        * version = footer.version;
-        * header_size = sizeof (ID3v2Header);
-        * data_size = footer.size;
-        * footer_size = sizeof (ID3v2Header);
-
-        if (vfs_fseek (handle, * offset, SEEK_SET))
-            return FALSE;
-
-        if (vfs_fread (& header, 1, sizeof (ID3v2Header), handle) != sizeof
-         (ID3v2Header))
-            return FALSE;
-
-        if (! validate_header (& header, FALSE))
-            return FALSE;
-    }
-
-    * syncsafe = (header.flags & ID3_HEADER_SYNCSAFE) ? TRUE : FALSE;
-
-    if (header.flags & ID3_HEADER_HAS_EXTENDED_HEADER)
-    {
-        int extended_size = 0;
-
-        if (header.version == 3)
-        {
-            if (! skip_extended_header_3 (handle, & extended_size))
-                return FALSE;
-        }
-        else if (header.version == 4)
-        {
-            if (! skip_extended_header_4 (handle, & extended_size))
-                return FALSE;
-        }
-
-        * header_size += extended_size;
-        * data_size -= extended_size;
-    }
-
-    TAGDBG ("Offset = %d, header size = %d, data size = %d, footer size = "
-     "%d.\n", (int) * offset, * header_size, * data_size, * footer_size);
-
-    return TRUE;
-}
-
-static int unsyncsafe (char * data, int size)
-{
-    char * get = data, * set = data;
-
-    while (size --)
-    {
-        char c = * set ++ = * get ++;
-
-        if (c == (char) 0xff && size && ! get[0])
-        {
-            size --;
-            get ++;
-        }
-    }
-
-    return set - data;
-}
-
-static bool_t read_frame (VFSFile * handle, int max_size, int version,
- bool_t syncsafe, int * frame_size, char * key, char * * data, int * size)
-{
-    ID3v2FrameHeader header;
-    int skip = 0;
-
-    if ((max_size -= sizeof (ID3v2FrameHeader)) < 0)
-        return FALSE;
-
-    if (vfs_fread (& header, 1, sizeof (ID3v2FrameHeader), handle) != sizeof
-     (ID3v2FrameHeader))
-        return FALSE;
-
-    if (! header.key[0]) /* padding */
-        return FALSE;
-
-    header.size = (version == 3) ? GUINT32_FROM_BE (header.size) : unsyncsafe32
-     (GUINT32_FROM_BE (header.size));
-    header.flags = GUINT16_FROM_BE (header.flags);
-
-    if (header.size > max_size || header.size == 0)
-        return FALSE;
-
-    TAGDBG ("Found frame:\n");
-    TAGDBG (" key = %.4s\n", header.key);
-    TAGDBG (" size = %d\n", (int) header.size);
-    TAGDBG (" flags = %x\n", (int) header.flags);
-
-    * frame_size = sizeof (ID3v2FrameHeader) + header.size;
-    g_strlcpy (key, header.key, 5);
-
-    if (header.flags & (ID3_FRAME_COMPRESSED | ID3_FRAME_ENCRYPTED))
-    {
-        TAGDBG ("Hit compressed/encrypted frame %s.\n", key);
-        return FALSE;
-    }
-
-    if (header.flags & ID3_FRAME_HAS_GROUP)
-        skip ++;
-    if (header.flags & ID3_FRAME_HAS_LENGTH)
-        skip += 4;
-
-    if ((skip > 0 && vfs_fseek (handle, skip, SEEK_CUR)) || skip >= header.size)
-        return FALSE;
-
-    * size = header.size - skip;
-    * data = g_malloc (* size);
-
-    if (vfs_fread (* data, 1, * size, handle) != * size)
-        return FALSE;
-
-    if (syncsafe || (header.flags & ID3_FRAME_SYNCSAFE))
-        * size = unsyncsafe (* data, * size);
-
-    TAGDBG ("Data size = %d.\n", * size);
-    return TRUE;
-}
-
-static void free_frame (GenericFrame * frame)
-{
-    g_free (frame->data);
-    g_slice_free (GenericFrame, frame);
-}
-
-static void free_frame_list (GList * list)
-{
-    g_list_free_full (list, (GDestroyNotify) free_frame);
-}
-
-static void read_all_frames (VFSFile * handle, int version, bool_t syncsafe,
- int data_size, GHashTable * dict)
-{
-    int pos;
-
-    for (pos = 0; pos < data_size; )
-    {
-        int frame_size, size;
-        char key[5];
-        char * data;
-        GenericFrame * frame;
-
-        if (! read_frame (handle, data_size - pos, version, syncsafe,
-         & frame_size, key, & data, & size))
-            break;
-
-        pos += frame_size;
-
-        frame = g_slice_new (GenericFrame);
-        strcpy (frame->key, key);
-        frame->data = data;
-        frame->size = size;
-
-        void * key2, * list = NULL;
-
-        if (g_hash_table_lookup_extended (dict, key, & key2, & list))
-            g_hash_table_steal (dict, key);
-        else
-            key2 = str_get (key);
-
-        list = g_list_append (list, frame);
-        g_hash_table_insert (dict, key2, list);
-    }
-}
-
-static bool_t write_frame (int fd, GenericFrame * frame, int version, int * frame_size)
-{
-    TAGDBG ("Writing frame %s, size %d\n", frame->key, frame->size);
-
-    ID3v2FrameHeader header;
-
-    memcpy (header.key, frame->key, 4);
-
-    uint32_t size = (version == 3) ? frame->size : syncsafe32 (frame->size);
-    header.size = GUINT32_TO_BE (size);
-
-    header.flags = 0;
-
-    if (write (fd, & header, sizeof (ID3v2FrameHeader)) != sizeof (ID3v2FrameHeader))
-        return FALSE;
-
-    if (write (fd, frame->data, frame->size) != frame->size)
-        return FALSE;
-
-    * frame_size = sizeof (ID3v2FrameHeader) + frame->size;
-    return TRUE;
-}
-
-typedef struct {
-    int fd;
-    int version;
-    int written_size;
-} WriteState;
-
-static void write_frame_list (void * key, void * list, void * user)
-{
-    WriteState * state = user;
-
-    for (GList * node = list; node; node = node->next)
-    {
-        int size;
-        if (write_frame (state->fd, node->data, state->version, & size))
-            state->written_size += size;
-    }
-}
-
-static int write_all_frames (int fd, GHashTable * dict, int version)
-{
-    WriteState state = {fd, version, 0};
-    g_hash_table_foreach (dict, write_frame_list, & state);
-
-    TAGDBG ("Total frame bytes written = %d.\n", state.written_size);
-    return state.written_size;
-}
-
-static bool_t write_header (int fd, int version, int size)
-{
-    ID3v2Header header;
-
-    memcpy (header.magic, "ID3", 3);
-    header.version = version;
-    header.revision = 0;
-    header.flags = 0;
-    header.size = syncsafe32 (size);
-    header.size = GUINT32_TO_BE (header.size);
-
-    return write (fd, & header, sizeof (ID3v2Header)) == sizeof (ID3v2Header);
-}
-
-static int get_frame_id (const char * key)
-{
-    int id;
-
-    for (id = 0; id < ID3_TAGS_NO; id ++)
-    {
-        if (! strcmp (key, id3_frames[id]))
-            return id;
-    }
-
-    return -1;
-}
-
-#if 0
-static void decode_private_info (Tuple * tuple, const unsigned char * data, int size)
-{
-    char * text = g_strndup ((const char *) data, size);
-
-    if (!strncmp(text, "WM/", 3))
-    {
-        char *separator = strchr(text, 0);
-        if (separator == NULL)
-            goto DONE;
-
-        char * value = separator + 1;
-        if (!strncmp(text, "WM/MediaClassPrimaryID", 22))
-        {
-            if (!memcmp(value, PRIMARY_CLASS_MUSIC, 16))
-                tuple_set_str (tuple, -1, "media-class", "Music");
-            if (!memcmp(value, PRIMARY_CLASS_AUDIO, 16))
-                tuple_set_str (tuple, -1, "media-class", "Audio (non-music)");
-        } else if (!strncmp(text, "WM/MediaClassSecondaryID", 24))
-        {
-            if (!memcmp(value, SECONDARY_CLASS_AUDIOBOOK, 16))
-                tuple_set_str (tuple, -1, "media-class", "Audio Book");
-            if (!memcmp(value, SECONDARY_CLASS_SPOKENWORD, 16))
-                tuple_set_str (tuple, -1, "media-class", "Spoken Word");
-            if (!memcmp(value, SECONDARY_CLASS_NEWS, 16))
-                tuple_set_str (tuple, -1, "media-class", "News");
-            if (!memcmp(value, SECONDARY_CLASS_TALKSHOW, 16))
-                tuple_set_str (tuple, -1, "media-class", "Talk Show");
-            if (!memcmp(value, SECONDARY_CLASS_GAMES_CLIP, 16))
-                tuple_set_str (tuple, -1, "media-class", "Game Audio (clip)");
-            if (!memcmp(value, SECONDARY_CLASS_GAMES_SONG, 16))
-                tuple_set_str (tuple, -1, "media-class", "Game Soundtrack");
-        } else {
-            TAGDBG("Unrecognised tag %s (Windows Media) ignored\n", text);
-        }
-    } else {
-        TAGDBG("Unable to decode private data, skipping: %s\n", text);
-    }
-
-DONE:
-    g_free (text);
-}
-#endif
-
-static GenericFrame * add_generic_frame (int id, int size,
- GHashTable * dict)
-{
-    GenericFrame * frame = g_slice_new (GenericFrame);
-
-    strcpy (frame->key, id3_frames[id]);
-    frame->data = g_malloc (size);
-    frame->size = size;
-
-    GList * list = g_list_append (NULL, frame);
-    g_hash_table_insert (dict, str_get (id3_frames[id]), list);
-
-    return frame;
-}
-
-static void remove_frame (int id, GHashTable * dict)
-{
-    TAGDBG ("Deleting frame %s.\n", id3_frames[id]);
-    g_hash_table_remove (dict, id3_frames[id]);
-}
-
-static void add_text_frame (int id, const char * text, GHashTable * dict)
-{
-    if (text == NULL)
-    {
-        remove_frame (id, dict);
-        return;
-    }
-
-    TAGDBG ("Adding text frame %s = %s.\n", id3_frames[id], text);
-
-    long words;
-    uint16_t * utf16 = g_utf8_to_utf16 (text, -1, NULL, & words, NULL);
-    g_return_if_fail (utf16);
-
-    GenericFrame * frame = add_generic_frame (id, 3 + 2 * words, dict);
-
-    frame->data[0] = 1;                            /* UTF-16 encoding */
-    * (uint16_t *) (frame->data + 1) = 0xfeff;     /* byte order mark */
-    memcpy (frame->data + 3, utf16, 2 * words);
-
-    g_free (utf16);
-}
-
-static void add_comment_frame (const char * text, GHashTable * dict)
-{
-    if (text == NULL)
-    {
-        remove_frame (ID3_COMMENT, dict);
-        return;
-    }
-
-    TAGDBG ("Adding comment frame = %s.\n", text);
-
-    long words;
-    uint16_t * utf16 = g_utf8_to_utf16 (text, -1, NULL, & words, NULL);
-    g_return_if_fail (utf16);
-
-    GenericFrame * frame = add_generic_frame (ID3_COMMENT, 10 + 2 * words, dict);
-
-    frame->data[0] = 1;                             /* UTF-16 encoding */
-    memcpy (frame->data + 1, "eng", 3);             /* language */
-    * (uint16_t *) (frame->data + 4) = 0xfeff;      /* byte order mark */
-    * (uint16_t *) (frame->data + 6) = 0;           /* end of content description */
-    * (uint16_t *) (frame->data + 8) = 0xfeff;      /* byte order mark */
-    memcpy (frame->data + 10, utf16, 2 * words);
-
-    g_free (utf16);
-}
-
-static void add_frameFromTupleStr (const Tuple * tuple, int field, int
- id3_field, GHashTable * dict)
-{
-    char * str = tuple_get_str (tuple, field);
-    add_text_frame (id3_field, str, dict);
-    str_unref (str);
-}
-
-static void add_frameFromTupleInt (const Tuple * tuple, int field, int
- id3_field, GHashTable * dict)
-{
-    if (tuple_get_value_type (tuple, field) != TUPLE_INT)
-    {
-        remove_frame (id3_field, dict);
-        return;
-    }
-
-    char scratch[16];
-    str_itoa (tuple_get_int (tuple, field), scratch, sizeof scratch);
-    add_text_frame (id3_field, scratch, dict);
-}
-
-static bool_t id3v24_can_handle_file (VFSFile * handle)
-{
-    int version, header_size, data_size, footer_size;
-    bool_t syncsafe;
-    int64_t offset;
-
-    return read_header (handle, & version, & syncsafe, & offset, & header_size,
-     & data_size, & footer_size);
-}
-
-static bool_t id3v24_read_tag (Tuple * tuple, VFSFile * handle)
-{
-    int version, header_size, data_size, footer_size;
-    bool_t syncsafe;
-    int64_t offset;
-    int pos;
-
-    if (! read_header (handle, & version, & syncsafe, & offset, & header_size,
-     & data_size, & footer_size))
-        return FALSE;
-
-    for (pos = 0; pos < data_size; )
-    {
-        int frame_size, size, id;
-        char key[5];
-        char * data;
-
-        if (! read_frame (handle, data_size - pos, version, syncsafe,
-         & frame_size, key, & data, & size))
-            break;
-
-        id = get_frame_id (key);
-
-        switch (id)
-        {
-          case ID3_ALBUM:
-            id3_associate_string (tuple, FIELD_ALBUM, data, size);
-            break;
-          case ID3_TITLE:
-            id3_associate_string (tuple, FIELD_TITLE, data, size);
-            break;
-          case ID3_COMPOSER:
-            id3_associate_string (tuple, FIELD_COMPOSER, data, size);
-            break;
-          case ID3_COPYRIGHT:
-            id3_associate_string (tuple, FIELD_COPYRIGHT, data, size);
-            break;
-          case ID3_DATE:
-            id3_associate_string (tuple, FIELD_DATE, data, size);
-            break;
-          case ID3_LENGTH:
-            id3_associate_int (tuple, FIELD_LENGTH, data, size);
-            break;
-          case ID3_ARTIST:
-            id3_associate_string (tuple, FIELD_ARTIST, data, size);
-            break;
-          case ID3_TRACKNR:
-            id3_associate_int (tuple, FIELD_TRACK_NUMBER, data, size);
-            break;
-          case ID3_YEAR:
-          case ID3_RECORDING_TIME:
-            id3_associate_int (tuple, FIELD_YEAR, data, size);
-            break;
-          case ID3_GENRE:
-            id3_decode_genre (tuple, data, size);
-            break;
-          case ID3_COMMENT:
-            id3_decode_comment (tuple, data, size);
-            break;
-#if 0
-          case ID3_PRIVATE:
-            decode_private_info (tuple, data, size);
-            break;
-#endif
-          case ID3_RVA2:
-            id3_decode_rva (tuple, data, size);
-            break;
-          default:
-            TAGDBG ("Ignoring unsupported ID3 frame %s.\n", key);
-            break;
-        }
-
-        g_free (data);
-        pos += frame_size;
-    }
-
-    return TRUE;
-}
-
-static bool_t id3v24_read_image (VFSFile * handle, void * * image_data,
- int64_t * image_size)
-{
-    int version, header_size, data_size, footer_size, parsed;
-    bool_t syncsafe;
-    int64_t offset;
-    bool_t found = FALSE;
-
-    if (! read_header (handle, & version, & syncsafe, & offset, & header_size,
-     & data_size, & footer_size))
-        return FALSE;
-
-    for (parsed = 0; parsed < data_size && ! found; )
-    {
-        int frame_size, size, type;
-        char key[5];
-        char * data;
-
-        if (! read_frame (handle, data_size - parsed, version, syncsafe,
-         & frame_size, key, & data, & size))
-            break;
-
-        if (! strcmp (key, "APIC") && id3_decode_picture (data, size, & type,
-         image_data, image_size))
-        {
-            if (type == 3) /* album cover */
-                found = TRUE;
-            else if (type == 0) /* iTunes */
-                found = TRUE;
-            else if (*image_data != NULL)
-            {
-                g_free(*image_data);
-                *image_data = NULL;
-            }
-        }
-
-        g_free (data);
-        parsed += frame_size;
-    }
-
-    return found;
-}
-
-static bool_t id3v24_write_tag (const Tuple * tuple, VFSFile * f)
-{
-    int version = 3;
-    int header_size, data_size, footer_size;
-    bool_t syncsafe;
-    int64_t offset;
-
-    //read all frames into generic frames;
-    GHashTable * dict = g_hash_table_new_full (g_str_hash, g_str_equal,
-     (GDestroyNotify) str_unref, (GDestroyNotify) free_frame_list);
-
-    if (read_header (f, & version, & syncsafe, & offset, & header_size, & data_size, & footer_size))
-        read_all_frames (f, version, syncsafe, data_size, dict);
-
-    //make the new frames from tuple and replace in the dictionary the old frames with the new ones
-    add_frameFromTupleStr (tuple, FIELD_TITLE, ID3_TITLE, dict);
-    add_frameFromTupleStr (tuple, FIELD_ARTIST, ID3_ARTIST, dict);
-    add_frameFromTupleStr (tuple, FIELD_ALBUM, ID3_ALBUM, dict);
-    add_frameFromTupleInt (tuple, FIELD_YEAR, ID3_YEAR, dict);
-    add_frameFromTupleInt (tuple, FIELD_TRACK_NUMBER, ID3_TRACKNR, dict);
-    add_frameFromTupleStr (tuple, FIELD_GENRE, ID3_GENRE, dict);
-
-    char * comment = tuple_get_str (tuple, FIELD_COMMENT);
-    add_comment_frame (comment, dict);
-    str_unref (comment);
-
-    /* location and size of non-tag data */
-    int64_t mp3_offset = offset ? 0 : header_size + data_size + footer_size;
-    int64_t mp3_size = offset ? offset : -1;
-
-    TempFile temp = {0};
-    if (! open_temp_file_for (& temp, f))
-        goto ERR;
-
-    /* write empty header (will be overwritten later) */
-    if (! write_header (temp.fd, version, 0))
-        goto ERR;
-
-    /* write tag data */
-    data_size = write_all_frames (temp.fd, dict, version);
-
-    /* copy non-tag data */
-    if (! copy_region_to_temp_file (& temp, f, mp3_offset, mp3_size))
-        goto ERR;
-
-    /* go back to beginning and write real header */
-    if (lseek (temp.fd, 0, SEEK_SET) < 0 || ! write_header (temp.fd, version, data_size))
-        goto ERR;
-
-    if (! replace_with_temp_file (& temp, f))
-        goto ERR;
-
-    g_hash_table_destroy (dict);
-    str_unref (temp.name);
-    return TRUE;
-
-ERR:
-    g_hash_table_destroy (dict);
-    str_unref (temp.name);
-    return FALSE;
-}
-
-tag_module_t id3v24 =
-{
-    .name = "ID3v2.3/4",
-    .type = TAG_TYPE_ID3V2,
-    .can_handle_file = id3v24_can_handle_file,
-    .read_tag = id3v24_read_tag,
-    .read_image = id3v24_read_image,
-    .write_tag = id3v24_write_tag,
-};
diff --git a/src/libaudtag/id3/id3v24.cc b/src/libaudtag/id3/id3v24.cc
new file mode 100644
index 000000000000..d608bbf66f58
--- /dev/null
+++ b/src/libaudtag/id3/id3v24.cc
@@ -0,0 +1,779 @@
+/*
+ * id3v24.c
+ * Copyright 2009-2014 Paula Stanciu, Tony Vroon, John Lindgren,
+ *                     Mikael Magnusson, and Michał Lipski
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <glib.h>  /* for g_utf8_to_utf16 */
+
+#define WANT_AUD_BSWAP
+#include <libaudcore/audio.h>
+#include <libaudcore/audstrings.h>
+#include <libaudcore/multihash.h>
+#include <libaudcore/runtime.h>
+#include <libaudtag/builtin.h>
+
+#include "id3-common.h"
+
+enum
+{
+    ID3_ALBUM = 0,
+    ID3_TITLE,
+    ID3_COMPOSER,
+    ID3_COPYRIGHT,
+    ID3_DATE,
+    ID3_LENGTH,
+    ID3_ARTIST,
+    ID3_ALBUM_ARTIST,
+    ID3_TRACKNR,
+    ID3_YEAR,
+    ID3_GENRE,
+    ID3_COMMENT,
+    ID3_PRIVATE,
+    ID3_ENCODER,
+    ID3_RECORDING_TIME,
+    ID3_TXXX,
+    ID3_RVA2,
+    ID3_TAGS_NO
+};
+
+static const char * id3_frames[ID3_TAGS_NO] = {
+    "TALB",
+    "TIT2",
+    "TCOM",
+    "TCOP",
+    "TDAT",
+    "TLEN",
+    "TPE1",
+    "TPE2",
+    "TRCK",
+    "TYER",
+    "TCON",
+    "COMM",
+    "PRIV",
+    "TSSE",
+    "TDRC",
+    "TXXX",
+    "RVA2"
+};
+
+/*
+static const unsigned char PRIMARY_CLASS_MUSIC[16] = {0xBC, 0x7D, 0x60, 0xD1, 0x23,
+ 0xE3, 0xE2, 0x4B, 0x86, 0xA1, 0x48, 0xA4, 0x2A, 0x28, 0x44, 0x1E};
+static const unsigned char PRIMARY_CLASS_AUDIO[16] = {0x29, 0x0F, 0xCD, 0x01, 0x4E,
+ 0xDA, 0x57, 0x41, 0x89, 0x7B, 0x62, 0x75, 0xD5, 0x0C, 0x4F, 0x11};
+static const unsigned char SECONDARY_CLASS_AUDIOBOOK[16] = {0xEB, 0x6B, 0x23, 0xE0,
+ 0x81, 0xC2, 0xDE, 0x4E, 0xA3, 0x6D, 0x7A, 0xF7, 0x6A, 0x3D, 0x45, 0xB5};
+static const unsigned char SECONDARY_CLASS_SPOKENWORD[16] = {0x13, 0x2A, 0x17, 0x3A,
+ 0xD9, 0x2B, 0x31, 0x48, 0x83, 0x5B, 0x11, 0x4F, 0x6A, 0x95, 0x94, 0x3F};
+static const unsigned char SECONDARY_CLASS_NEWS[16] = {0x9B, 0xDB, 0x77, 0x66, 0xA0,
+ 0xE5, 0x63, 0x40, 0xA1, 0xAD, 0xAC, 0xEB, 0x52, 0x84, 0x0C, 0xF1};
+static const unsigned char SECONDARY_CLASS_TALKSHOW[16] = {0x67, 0x4A, 0x82, 0x1B,
+ 0x80, 0x3F, 0x3E, 0x4E, 0x9C, 0xDE, 0xF7, 0x36, 0x1B, 0x0F, 0x5F, 0x1B};
+static const unsigned char SECONDARY_CLASS_GAMES_CLIP[16] = {0x68, 0x33, 0x03, 0x00,
+ 0x09, 0x50, 0xC3, 0x4A, 0xA8, 0x20, 0x5D, 0x2D, 0x09, 0xA4, 0xE7, 0xC1};
+static const unsigned char SECONDARY_CLASS_GAMES_SONG[16] = {0x31, 0xF7, 0x4F, 0xF2,
+ 0xFC, 0x96, 0x0F, 0x4D, 0xA2, 0xF5, 0x5A, 0x34, 0x83, 0x68, 0x2B, 0x1A};
+*/
+
+#pragma pack(push) /* must be byte-aligned */
+#pragma pack(1)
+struct ID3v2Header {
+    char magic[3];
+    unsigned char version;
+    unsigned char revision;
+    unsigned char flags;
+    uint32_t size;
+};
+
+struct ID3v2FrameHeader {
+    char key[4];
+    uint32_t size;
+    uint16_t flags;
+};
+#pragma pack(pop)
+
+struct GenericFrame : public Index<char> {
+    String key;
+};
+
+typedef Index<GenericFrame> FrameList;
+typedef SimpleHash<String, FrameList> FrameDict;
+
+#define ID3_HEADER_SYNCSAFE             0x80
+#define ID3_HEADER_HAS_EXTENDED_HEADER  0x40
+#define ID3_HEADER_HAS_FOOTER           0x10
+
+#define ID3_FRAME_HAS_GROUP   0x0040
+#define ID3_FRAME_COMPRESSED  0x0008
+#define ID3_FRAME_ENCRYPTED   0x0004
+#define ID3_FRAME_SYNCSAFE    0x0002
+#define ID3_FRAME_HAS_LENGTH  0x0001
+
+namespace audtag {
+
+static bool skip_extended_header_3 (VFSFile & handle, int * _size)
+{
+    uint32_t size;
+
+    if (handle.fread (& size, 1, 4) != 4)
+        return false;
+
+    size = FROM_BE32 (size);
+
+    AUDDBG ("Found v2.3 extended header, size = %d.\n", (int) size);
+
+    if (handle.fseek (size, VFS_SEEK_CUR))
+        return false;
+
+    * _size = 4 + size;
+    return true;
+}
+
+static bool skip_extended_header_4 (VFSFile & handle, int * _size)
+{
+    uint32_t size;
+
+    if (handle.fread (& size, 1, 4) != 4)
+        return false;
+
+    size = unsyncsafe32 (FROM_BE32 (size));
+
+    AUDDBG ("Found v2.4 extended header, size = %d.\n", (int) size);
+
+    if (handle.fseek (size - 4, VFS_SEEK_CUR))
+        return false;
+
+    * _size = size;
+    return true;
+}
+
+static bool validate_header (ID3v2Header * header, bool is_footer)
+{
+    if (memcmp (header->magic, is_footer ? "3DI" : "ID3", 3))
+        return false;
+
+    if ((header->version != 3 && header->version != 4) || header->revision != 0)
+        return false;
+
+    header->size = unsyncsafe32 (FROM_BE32 (header->size));
+
+    AUDDBG ("Found ID3v2 %s:\n", is_footer ? "footer" : "header");
+    AUDDBG (" magic = %.3s\n", header->magic);
+    AUDDBG (" version = %d\n", (int) header->version);
+    AUDDBG (" revision = %d\n", (int) header->revision);
+    AUDDBG (" flags = %x\n", (int) header->flags);
+    AUDDBG (" size = %d\n", (int) header->size);
+    return true;
+}
+
+static bool read_header (VFSFile & handle, int * version, bool *
+ syncsafe, int64_t * offset, int * header_size, int * data_size, int *
+ footer_size)
+{
+    ID3v2Header header, footer;
+
+    if (handle.fseek (0, VFS_SEEK_SET))
+        return false;
+
+    if (handle.fread (& header, 1, sizeof (ID3v2Header)) != sizeof
+     (ID3v2Header))
+        return false;
+
+    if (validate_header (& header, false))
+    {
+        * offset = 0;
+        * version = header.version;
+        * header_size = sizeof (ID3v2Header);
+        * data_size = header.size;
+
+        if (header.flags & ID3_HEADER_HAS_FOOTER)
+        {
+            if (handle.fseek (header.size, VFS_SEEK_CUR))
+                return false;
+
+            if (handle.fread (& footer, 1, sizeof (ID3v2Header)) != sizeof
+             (ID3v2Header))
+                return false;
+
+            if (! validate_header (& footer, true))
+                return false;
+
+            if (handle.fseek (sizeof (ID3v2Header), VFS_SEEK_SET))
+                return false;
+
+            * footer_size = sizeof (ID3v2Header);
+        }
+        else
+            * footer_size = 0;
+    }
+    else
+    {
+        int64_t end = handle.fsize ();
+
+        if (end < 0)
+            return false;
+
+        if (handle.fseek (end - sizeof (ID3v2Header), VFS_SEEK_SET))
+            return false;
+
+        if (handle.fread (& footer, 1, sizeof (ID3v2Header)) != sizeof
+         (ID3v2Header))
+            return false;
+
+        if (! validate_header (& footer, true))
+            return false;
+
+        * offset = end - 2 * sizeof (ID3v2Header) - footer.size;
+        * version = footer.version;
+        * header_size = sizeof (ID3v2Header);
+        * data_size = footer.size;
+        * footer_size = sizeof (ID3v2Header);
+
+        if (handle.fseek (* offset, VFS_SEEK_SET))
+            return false;
+
+        if (handle.fread (& header, 1, sizeof (ID3v2Header)) != sizeof
+         (ID3v2Header))
+            return false;
+
+        if (! validate_header (& header, false))
+            return false;
+    }
+
+    // this flag indicates tag-level unsynchronisation in ID3v2.3
+    // ID3v2.4 uses frame-level unsynchronisation, rendering this flag meaningless
+    * syncsafe = (* version == 3) && (header.flags & ID3_HEADER_SYNCSAFE);
+
+    if (header.flags & ID3_HEADER_HAS_EXTENDED_HEADER)
+    {
+        int extended_size = 0;
+
+        if (header.version == 3)
+        {
+            if (! skip_extended_header_3 (handle, & extended_size))
+                return false;
+        }
+        else if (header.version == 4)
+        {
+            if (! skip_extended_header_4 (handle, & extended_size))
+                return false;
+        }
+
+        * header_size += extended_size;
+        * data_size -= extended_size;
+    }
+
+    AUDDBG ("Offset = %d, header size = %d, data size = %d, footer size = "
+     "%d.\n", (int) * offset, * header_size, * data_size, * footer_size);
+
+    return true;
+}
+
+static void unsyncsafe (Index<char> & data)
+{
+    const char * get = data.begin (), * end = data.end ();
+    char * set = data.begin ();
+    const char * c;
+
+    while ((c = (const char *) memchr (get, 0xff, end - get)))
+    {
+        c ++;
+        memmove (set, get, c - get);
+        set += c - get;
+        get = c;
+
+        if (get < end && ! get[0])
+            get ++;
+    }
+
+    memmove (set, get, end - get);
+    set += end - get;
+
+    data.remove (set - data.begin (), -1);
+}
+
+static Index<char> read_tag_data (VFSFile & handle, int size, bool syncsafe)
+{
+    Index<char> data;
+    data.resize (size);
+    data.resize (handle.fread (data.begin (), 1, size));
+
+    if (syncsafe)
+        unsyncsafe (data);
+
+    return data;
+}
+
+static bool read_frame (const char * data, int max_size, int version,
+ int * frame_size, GenericFrame & frame)
+{
+    ID3v2FrameHeader header;
+    unsigned skip = 0;
+
+    if ((max_size -= sizeof (ID3v2FrameHeader)) < 0)
+        return false;
+
+    memcpy (& header, data, sizeof (ID3v2FrameHeader));
+    data += sizeof (ID3v2FrameHeader);
+
+    if (! header.key[0]) /* padding */
+        return false;
+
+    header.size = (version == 3) ? FROM_BE32 (header.size) : unsyncsafe32 (FROM_BE32 (header.size));
+    header.flags = FROM_BE16 (header.flags);
+
+    if (header.size > (unsigned) max_size || header.size == 0)
+        return false;
+
+    AUDDBG ("Found frame:\n");
+    AUDDBG (" key = %.4s\n", header.key);
+    AUDDBG (" size = %d\n", (int) header.size);
+    AUDDBG (" flags = %x\n", (int) header.flags);
+
+    if (header.flags & (ID3_FRAME_COMPRESSED | ID3_FRAME_ENCRYPTED))
+    {
+        AUDDBG ("Hit compressed/encrypted frame %.4s.\n", header.key);
+        return false;
+    }
+
+    if (header.flags & ID3_FRAME_HAS_GROUP)
+        skip ++;
+    if (header.flags & ID3_FRAME_HAS_LENGTH)
+        skip += 4;
+
+    if (skip >= header.size)
+        return false;
+
+    * frame_size = sizeof (ID3v2FrameHeader) + header.size;
+
+    frame.key = String (str_copy (header.key, 4));
+    frame.clear ();
+    frame.insert (data + skip, 0, header.size - skip);
+
+    if (header.flags & ID3_FRAME_SYNCSAFE)
+        unsyncsafe (frame);
+
+    AUDDBG ("Data size = %d.\n", frame.len ());
+    return true;
+}
+
+static void read_all_frames (const Index<char> & data, int version, FrameDict & dict)
+{
+    for (const char * pos = data.begin (); pos < data.end (); )
+    {
+        int frame_size;
+        GenericFrame frame;
+
+        if (! read_frame (pos, data.end () - pos, version, & frame_size, frame))
+            break;
+
+        pos += frame_size;
+
+        FrameList * list = dict.lookup (frame.key);
+        if (! list)
+            list = dict.add (frame.key, FrameList ());
+
+        list->append (std::move (frame));
+    }
+}
+
+static bool write_frame (int fd, const GenericFrame & frame, int version, int * frame_size)
+{
+    AUDDBG ("Writing frame %s, size %d\n", (const char *) frame.key, frame.len ());
+
+    ID3v2FrameHeader header;
+
+    strncpy (header.key, frame.key, 4);
+
+    uint32_t size = frame.len ();
+    if (version > 3)
+        size = syncsafe32 (size);
+
+    header.size = TO_BE32 (size);
+    header.flags = 0;
+
+    if (write (fd, & header, sizeof (ID3v2FrameHeader)) != sizeof (ID3v2FrameHeader))
+        return false;
+
+    if (write (fd, & frame[0], frame.len ()) != frame.len ())
+        return false;
+
+    * frame_size = sizeof (ID3v2FrameHeader) + frame.len ();
+    return true;
+}
+
+struct WriteState {
+    int fd;
+    int version;
+    int written_size;
+};
+
+static void write_frame_list (const String & key, FrameList & list, void * user)
+{
+    WriteState * state = (WriteState *) user;
+
+    for (const GenericFrame & frame : list)
+    {
+        int size;
+        if (write_frame (state->fd, frame, state->version, & size))
+            state->written_size += size;
+    }
+}
+
+static int write_all_frames (int fd, FrameDict & dict, int version)
+{
+    WriteState state = {fd, version, 0};
+    dict.iterate (write_frame_list, & state);
+
+    AUDDBG ("Total frame bytes written = %d.\n", state.written_size);
+    return state.written_size;
+}
+
+static bool write_header (int fd, int version, int size)
+{
+    ID3v2Header header;
+
+    memcpy (header.magic, "ID3", 3);
+    header.version = version;
+    header.revision = 0;
+    header.flags = 0;
+    header.size = TO_BE32 (syncsafe32 (size));
+
+    return write (fd, & header, sizeof (ID3v2Header)) == sizeof (ID3v2Header);
+}
+
+static int get_frame_id (const char * key)
+{
+    int id;
+
+    for (id = 0; id < ID3_TAGS_NO; id ++)
+    {
+        if (! strcmp (key, id3_frames[id]))
+            return id;
+    }
+
+    return -1;
+}
+
+#if 0
+static void decode_private_info (Tuple & tuple, const unsigned char * data, int size)
+{
+    char * text = g_strndup ((const char *) data, size);
+
+    if (!strncmp(text, "WM/", 3))
+    {
+        char *separator = strchr(text, 0);
+        if (separator == nullptr)
+            goto DONE;
+
+        char * value = separator + 1;
+        if (!strncmp(text, "WM/MediaClassPrimaryID", 22))
+        {
+            if (!memcmp(value, PRIMARY_CLASS_MUSIC, 16))
+                tuple.set_str (-1, "media-class", "Music");
+            if (!memcmp(value, PRIMARY_CLASS_AUDIO, 16))
+                tuple.set_str (-1, "media-class", "Audio (non-music)");
+        } else if (!strncmp(text, "WM/MediaClassSecondaryID", 24))
+        {
+            if (!memcmp(value, SECONDARY_CLASS_AUDIOBOOK, 16))
+                tuple.set_str (-1, "media-class", "Audio Book");
+            if (!memcmp(value, SECONDARY_CLASS_SPOKENWORD, 16))
+                tuple.set_str (-1, "media-class", "Spoken Word");
+            if (!memcmp(value, SECONDARY_CLASS_NEWS, 16))
+                tuple.set_str (-1, "media-class", "News");
+            if (!memcmp(value, SECONDARY_CLASS_TALKSHOW, 16))
+                tuple.set_str (-1, "media-class", "Talk Show");
+            if (!memcmp(value, SECONDARY_CLASS_GAMES_CLIP, 16))
+                tuple.set_str (-1, "media-class", "Game Audio (clip)");
+            if (!memcmp(value, SECONDARY_CLASS_GAMES_SONG, 16))
+                tuple.set_str (-1, "media-class", "Game Soundtrack");
+        } else {
+            AUDDBG("Unrecognised tag %s (Windows Media) ignored\n", text);
+        }
+    } else {
+        AUDDBG("Unable to decode private data, skipping: %s\n", text);
+    }
+
+DONE:
+    g_free (text);
+}
+#endif
+
+static GenericFrame & add_generic_frame (int id, int size, FrameDict & dict)
+{
+    String key (id3_frames[id]);
+    FrameList * list = dict.add (key, FrameList ());
+
+    GenericFrame & frame = list->append ();
+
+    frame.key = key;
+    frame.insert (0, size);
+
+    return frame;
+}
+
+static void remove_frame (int id, FrameDict & dict)
+{
+    AUDDBG ("Deleting frame %s.\n", id3_frames[id]);
+    dict.remove (String (id3_frames[id]));
+}
+
+static void add_text_frame (int id, const char * text, FrameDict & dict)
+{
+    if (! text)
+    {
+        remove_frame (id, dict);
+        return;
+    }
+
+    AUDDBG ("Adding text frame %s = %s.\n", id3_frames[id], text);
+
+    long words;
+    uint16_t * utf16 = g_utf8_to_utf16 (text, -1, nullptr, & words, nullptr);
+    g_return_if_fail (utf16);
+
+    GenericFrame & frame = add_generic_frame (id, 3 + 2 * words, dict);
+
+    frame[0] = 1;                             /* UTF-16 encoding */
+    * (uint16_t *) (& frame[1]) = 0xfeff;     /* byte order mark */
+    memcpy (& frame[3], utf16, 2 * words);
+
+    g_free (utf16);
+}
+
+static void add_comment_frame (const char * text, FrameDict & dict)
+{
+    if (! text)
+    {
+        remove_frame (ID3_COMMENT, dict);
+        return;
+    }
+
+    AUDDBG ("Adding comment frame = %s.\n", text);
+
+    long words;
+    uint16_t * utf16 = g_utf8_to_utf16 (text, -1, nullptr, & words, nullptr);
+    g_return_if_fail (utf16);
+
+    GenericFrame & frame = add_generic_frame (ID3_COMMENT, 10 + 2 * words, dict);
+
+    frame[0] = 1;                              /* UTF-16 encoding */
+    memcpy (& frame[1], "eng", 3);             /* language */
+    * (uint16_t *) (& frame[4]) = 0xfeff;      /* byte order mark */
+    * (uint16_t *) (& frame[6]) = 0;           /* end of content description */
+    * (uint16_t *) (& frame[8]) = 0xfeff;      /* byte order mark */
+    memcpy (& frame[10], utf16, 2 * words);
+
+    g_free (utf16);
+}
+
+static void add_frameFromTupleStr (const Tuple & tuple, Tuple::Field field,
+ int id3_field, FrameDict & dict)
+{
+    add_text_frame (id3_field, tuple.get_str (field), dict);
+}
+
+static void add_frameFromTupleInt (const Tuple & tuple, Tuple::Field field,
+ int id3_field, FrameDict & dict)
+{
+    if (tuple.get_value_type (field) != Tuple::Int)
+    {
+        remove_frame (id3_field, dict);
+        return;
+    }
+
+    add_text_frame (id3_field, int_to_str (tuple.get_int (field)), dict);
+}
+
+bool ID3v24TagModule::can_handle_file (VFSFile & handle)
+{
+    int version, header_size, data_size, footer_size;
+    bool syncsafe;
+    int64_t offset;
+
+    return read_header (handle, & version, & syncsafe, & offset, & header_size,
+     & data_size, & footer_size);
+}
+
+bool ID3v24TagModule::read_tag (Tuple & tuple, VFSFile & handle)
+{
+    int version, header_size, data_size, footer_size;
+    bool syncsafe;
+    int64_t offset;
+
+    if (! read_header (handle, & version, & syncsafe, & offset, & header_size,
+     & data_size, & footer_size))
+        return false;
+
+    Index<char> data = read_tag_data (handle, data_size, syncsafe);
+
+    for (const char * pos = data.begin (); pos < data.end (); )
+    {
+        int frame_size;
+        GenericFrame frame;
+
+        if (! read_frame (pos, data.end () - pos, version, & frame_size, frame))
+            break;
+
+        switch (get_frame_id (frame.key))
+        {
+          case ID3_ALBUM:
+            id3_associate_string (tuple, Tuple::Album, & frame[0], frame.len ());
+            break;
+          case ID3_TITLE:
+            id3_associate_string (tuple, Tuple::Title, & frame[0], frame.len ());
+            break;
+          case ID3_COMPOSER:
+            id3_associate_string (tuple, Tuple::Composer, & frame[0], frame.len ());
+            break;
+          case ID3_COPYRIGHT:
+            id3_associate_string (tuple, Tuple::Copyright, & frame[0], frame.len ());
+            break;
+          case ID3_DATE:
+            id3_associate_string (tuple, Tuple::Date, & frame[0], frame.len ());
+            break;
+          case ID3_LENGTH:
+            id3_associate_length (tuple, & frame[0], frame.len ());
+            break;
+          case ID3_ARTIST:
+            id3_associate_string (tuple, Tuple::Artist, & frame[0], frame.len ());
+            break;
+          case ID3_ALBUM_ARTIST:
+            id3_associate_string (tuple, Tuple::AlbumArtist, & frame[0], frame.len ());
+            break;
+          case ID3_TRACKNR:
+            id3_associate_int (tuple, Tuple::Track, & frame[0], frame.len ());
+            break;
+          case ID3_YEAR:
+          case ID3_RECORDING_TIME:
+            id3_associate_int (tuple, Tuple::Year, & frame[0], frame.len ());
+            break;
+          case ID3_GENRE:
+            id3_decode_genre (tuple, & frame[0], frame.len ());
+            break;
+          case ID3_COMMENT:
+            id3_decode_comment (tuple, & frame[0], frame.len ());
+            break;
+#if 0
+          case ID3_PRIVATE:
+            decode_private_info (tuple, & frame[0], frame.len ());
+            break;
+#endif
+          case ID3_RVA2:
+            id3_decode_rva (tuple, & frame[0], frame.len ());
+            break;
+          default:
+            AUDDBG ("Ignoring unsupported ID3 frame %s.\n", (const char *) frame.key);
+            break;
+        }
+
+        pos += frame_size;
+    }
+
+    return true;
+}
+
+Index<char> ID3v24TagModule::read_image (VFSFile & handle)
+{
+    Index<char> buf;
+    int version, header_size, data_size, footer_size;
+    bool syncsafe;
+    int64_t offset;
+
+    if (! read_header (handle, & version, & syncsafe, & offset, & header_size,
+     & data_size, & footer_size))
+        return buf;
+
+    Index<char> data = read_tag_data (handle, data_size, syncsafe);
+
+    for (const char * pos = data.begin (); pos < data.end (); )
+    {
+        int frame_size;
+        GenericFrame frame;
+
+        if (! read_frame (pos, data.end () - pos, version, & frame_size, frame))
+            break;
+
+        if (! strcmp (frame.key, "APIC"))
+            buf = id3_decode_picture (& frame[0], frame.len ());
+
+        pos += frame_size;
+    }
+
+    return buf;
+}
+
+bool ID3v24TagModule::write_tag (const Tuple & tuple, VFSFile & f)
+{
+    int version = 3;
+    int header_size, data_size, footer_size;
+    bool syncsafe;
+    int64_t offset;
+
+    //read all frames into generic frames;
+    FrameDict dict;
+
+    if (read_header (f, & version, & syncsafe, & offset, & header_size, & data_size, & footer_size))
+        read_all_frames (read_tag_data (f, data_size, syncsafe), version, dict);
+
+    //make the new frames from tuple and replace in the dictionary the old frames with the new ones
+    add_frameFromTupleStr (tuple, Tuple::Title, ID3_TITLE, dict);
+    add_frameFromTupleStr (tuple, Tuple::Artist, ID3_ARTIST, dict);
+    add_frameFromTupleStr (tuple, Tuple::Album, ID3_ALBUM, dict);
+    add_frameFromTupleStr (tuple, Tuple::AlbumArtist, ID3_ALBUM_ARTIST, dict);
+    add_frameFromTupleInt (tuple, Tuple::Year, ID3_YEAR, dict);
+    add_frameFromTupleInt (tuple, Tuple::Track, ID3_TRACKNR, dict);
+    add_frameFromTupleStr (tuple, Tuple::Genre, ID3_GENRE, dict);
+
+    String comment = tuple.get_str (Tuple::Comment);
+    add_comment_frame (comment, dict);
+
+    /* location and size of non-tag data */
+    int64_t mp3_offset = offset ? 0 : header_size + data_size + footer_size;
+    int64_t mp3_size = offset ? offset : -1;
+
+    TempFile temp = TempFile ();
+    if (! open_temp_file_for (& temp, f))
+        return false;
+
+    /* write empty header (will be overwritten later) */
+    if (! write_header (temp.fd, version, 0))
+        return false;
+
+    /* write tag data */
+    data_size = write_all_frames (temp.fd, dict, version);
+
+    /* copy non-tag data */
+    if (! copy_region_to_temp_file (& temp, f, mp3_offset, mp3_size))
+        return false;
+
+    /* go back to beginning and write real header */
+    if (lseek (temp.fd, 0, SEEK_SET) < 0 || ! write_header (temp.fd, version, data_size))
+        return false;
+
+    if (! replace_with_temp_file (& temp, f))
+        return false;
+
+    return true;
+}
+
+}
diff --git a/src/libaudtag/id3/id3v24.h b/src/libaudtag/id3/id3v24.h
deleted file mode 100644
index 232c19787377..000000000000
--- a/src/libaudtag/id3/id3v24.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * id3v24.h
- * Copyright 2010 John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#ifndef AUDTAG_ID3V2_H
-#define AUDTAG_ID3V2_H
-
-#include "../audtag.h"
-#include "../tag_module.h"
-#include "../util.h"
-
-extern tag_module_t id3v24;
-
-#endif
diff --git a/src/libaudtag/tag_module.c b/src/libaudtag/tag_module.c
deleted file mode 100644
index 560c5b8ba267..000000000000
--- a/src/libaudtag/tag_module.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * tag_module.c
- * Copyright 2009-2011 Paula Stanciu and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <glib.h>
-#include <stdio.h>
-
-#include <libaudcore/tuple.h>
-#include <libaudcore/vfs.h>
-
-#include "audtag.h"
-#include "util.h"
-#include "tag_module.h"
-#include "id3/id3v1.h"
-#include "id3/id3v22.h"
-#include "id3/id3v24.h"
-#include "ape/ape.h"
-
-static tag_module_t * const modules[] = {& id3v24, & id3v22, & ape, & id3v1};
-
-tag_module_t * find_tag_module (VFSFile * fd, int new_type)
-{
-    int i;
-
-    for (i = 0; i < ARRAY_LEN (modules); i ++)
-    {
-        if (vfs_fseek(fd, 0, SEEK_SET))
-        {
-            TAGDBG("not a seekable file\n");
-            return NULL;
-        }
-
-        if (modules[i]->can_handle_file (fd))
-        {
-            TAGDBG ("Module %s accepted file.\n", modules[i]->name);
-            return modules[i];
-        }
-    }
-
-    /* No existing tag; see if we can create a new one. */
-    if (new_type != TAG_TYPE_NONE)
-    {
-        for (i = 0; i < ARRAY_LEN (modules); i ++)
-        {
-            if (modules[i]->type == new_type)
-                return modules[i];
-        }
-    }
-
-    TAGDBG("no module found\n");
-    return NULL;
-}
diff --git a/src/libaudtag/tag_module.cc b/src/libaudtag/tag_module.cc
new file mode 100644
index 000000000000..fd27ac38ba6e
--- /dev/null
+++ b/src/libaudtag/tag_module.cc
@@ -0,0 +1,98 @@
+/*
+ * tag_module.c
+ * Copyright 2009-2011 Paula Stanciu and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <libaudcore/index.h>
+#include <libaudcore/runtime.h>
+#include <libaudcore/tuple.h>
+#include <libaudcore/vfs.h>
+
+#include "audtag.h"
+#include "util.h"
+#include "tag_module.h"
+#include "builtin.h"
+
+namespace audtag {
+
+static APETagModule ape;
+static ID3v1TagModule id3v1;
+static ID3v22TagModule id3v22;
+static ID3v24TagModule id3v24;
+
+static TagModule * const modules[] = {& id3v24, & id3v22, & ape, & id3v1};
+
+TagModule * find_tag_module (VFSFile & fd, TagType new_type)
+{
+    for (TagModule * module : modules)
+    {
+        if (fd.fseek (0, VFS_SEEK_SET))
+        {
+            AUDDBG("not a seekable file\n");
+            return nullptr;
+        }
+
+        if (module->can_handle_file (fd))
+        {
+            AUDDBG ("Module %s accepted file.\n", module->m_name);
+            return module;
+        }
+    }
+
+    /* No existing tag; see if we can create a new one. */
+    if (new_type != TagType::None)
+    {
+        for (TagModule * module : modules)
+        {
+            if (module->m_type == new_type)
+                return module;
+        }
+    }
+
+    AUDDBG("no module found\n");
+    return nullptr;
+}
+
+/**************************************************************************************************************
+ * tag module object management                                                                               *
+ **************************************************************************************************************/
+bool TagModule::can_handle_file (VFSFile & handle)
+{
+    AUDDBG("Module %s does not support %s (no probing function implemented).\n", m_name,
+           handle.filename ());
+    return false;
+}
+
+Index<char> TagModule::read_image (VFSFile & handle)
+{
+    AUDDBG("Module %s does not support images.\n", m_name);
+    return Index<char> ();
+}
+
+bool TagModule::read_tag (Tuple & tuple, VFSFile & handle)
+{
+    AUDDBG ("%s: read_tag() not implemented.\n", m_name);
+    return false;
+}
+
+bool TagModule::write_tag (Tuple const & tuple, VFSFile & handle)
+{
+    AUDDBG ("%s: write_tag() not implemented.\n", m_name);
+    return false;
+}
+
+}
diff --git a/src/libaudtag/tag_module.h b/src/libaudtag/tag_module.h
index a520c13a0db9..71360f7b4820 100644
--- a/src/libaudtag/tag_module.h
+++ b/src/libaudtag/tag_module.h
@@ -23,17 +23,23 @@
 #include "libaudcore/tuple.h"
 #include "libaudcore/vfs.h"
 
-typedef Tuple* pTuple;
-
-typedef struct _module {
-    char *name;
-    int type; /* set to TAG_TYPE_NONE if the module cannot create new tags */
-    bool_t(*can_handle_file) (VFSFile *fd);
-    bool_t (* read_tag) (Tuple * tuple, VFSFile * handle);
-    bool_t (* read_image) (VFSFile * handle, void * * data, int64_t * size);
-    bool_t (* write_tag) (const Tuple * tuple, VFSFile * handle);
-} tag_module_t;
-
-tag_module_t * find_tag_module (VFSFile * handle, int new_type);
+namespace audtag {
+
+struct TagModule {
+    const char *m_name;
+    TagType m_type; /* set to None if the module cannot create new tags */
+
+    virtual bool can_handle_file (VFSFile &fd);
+    virtual bool read_tag (Tuple & tuple, VFSFile & handle);
+    virtual Index<char> read_image (VFSFile & handle);
+    virtual bool write_tag (const Tuple & tuple, VFSFile & handle);
+
+protected:
+    TagModule(const char *name, TagType type) : m_name(name), m_type(type) { };
+};
+
+TagModule * find_tag_module (VFSFile & handle, TagType new_type);
+
+}
 
 #endif /* TAG_MODULE_H */
diff --git a/src/libaudtag/util.c b/src/libaudtag/util.c
deleted file mode 100644
index 5abd24b271f9..000000000000
--- a/src/libaudtag/util.c
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * util.c
- * Copyright 2009-2014 Paula Stanciu, Tony Vroon, and John Lindgren
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions, and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions, and the following disclaimer in the documentation
- *    provided with the distribution.
- *
- * This software is provided "as is" and without any warranty, express or
- * implied. In no event shall the authors be liable for any damages arising from
- * the use of this software.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-
-#include <glib.h>
-#include <glib/gstdio.h>
-
-#include <libaudcore/audstrings.h>
-
-#include "util.h"
-
-const char *convert_numericgenre_to_text(int numericgenre)
-{
-    const struct
-    {
-        int numericgenre;
-        const char *genre;
-    }
-    table[] =
-    {
-        {GENRE_BLUES, "Blues"},
-        {GENRE_CLASSIC_ROCK, "Classic Rock"},
-        {GENRE_COUNTRY, "Country"},
-        {GENRE_DANCE, "Dance"},
-        {GENRE_DISCO, "Disco"},
-        {GENRE_FUNK, "Funk"},
-        {GENRE_GRUNGE, "Grunge"},
-        {GENRE_HIPHOP, "Hip-Hop"},
-        {GENRE_JAZZ, "Jazz"},
-        {GENRE_METAL, "Metal"},
-        {GENRE_NEW_AGE, "New Age"},
-        {GENRE_OLDIES, "Oldies"},
-        {GENRE_OTHER, "Other"},
-        {GENRE_POP, "Pop"},
-        {GENRE_R_B, "R&B"},
-        {GENRE_RAP, "Rap"},
-        {GENRE_REGGAE, "Reggae"},
-        {GENRE_ROCK, "Rock"},
-        {GENRE_TECHNO, "Techno"},
-        {GENRE_INDUSTRIAL, "Industrial"},
-        {GENRE_ALTERNATIVE, "Alternative"},
-        {GENRE_SKA, "Ska"},
-        {GENRE_DEATH_METAL, "Death Metal"},
-        {GENRE_PRANKS, "Pranks"},
-        {GENRE_SOUNDTRACK, "Soundtrack"},
-        {GENRE_EURO_TECHNO, "Euro-Techno"},
-        {GENRE_AMBIENT, "Ambient"},
-        {GENRE_TRIP_HOP, "Trip-Hop"},
-        {GENRE_VOCAL, "Vocal"},
-        {GENRE_JAZZ_FUNK, "Jazz+Funk"},
-        {GENRE_FUSION, "Fusion"},
-        {GENRE_TRANCE, "Trance"},
-        {GENRE_CLASSICAL, "Classical"},
-        {GENRE_INSTRUMENTAL, "Instrumental"},
-        {GENRE_ACID, "Acid"},
-        {GENRE_HOUSE, "House"},
-        {GENRE_GAME, "Game"},
-        {GENRE_SOUND_CLIP, "Sound Clip"},
-        {GENRE_GOSPEL, "Gospel"},
-        {GENRE_NOISE, "Noise"},
-        {GENRE_ALTERNROCK, "AlternRock"},
-        {GENRE_BASS, "Bass"},
-        {GENRE_SOUL, "Soul"},
-        {GENRE_PUNK, "Punk"},
-        {GENRE_SPACE, "Space"},
-        {GENRE_MEDITATIVE, "Meditative"},
-        {GENRE_INSTRUMENTAL_POP, "Instrumental Pop"},
-        {GENRE_INSTRUMENTAL_ROCK, "Instrumental Rock"},
-        {GENRE_ETHNIC, "Ethnic"},
-        {GENRE_GOTHIC, "Gothic"},
-        {GENRE_DARKWAVE, "Darkwave"},
-        {GENRE_TECHNO_INDUSTRIAL, "Techno-Industrial"},
-        {GENRE_ELECTRONIC, "Electronic"},
-        {GENRE_POP_FOLK, "Pop-Folk"},
-        {GENRE_EURODANCE, "Eurodance"},
-        {GENRE_DREAM, "Dream"},
-        {GENRE_SOUTHERN_ROCK, "Southern Rock"},
-        {GENRE_COMEDY, "Comedy"},
-        {GENRE_CULT, "Cult"},
-        {GENRE_GANGSTA, "Gangsta"},
-        {GENRE_TOP40, "Top 40"},
-        {GENRE_CHRISTIAN_RAP, "Christian Rap"},
-        {GENRE_POP_FUNK, "Pop/Funk"},
-        {GENRE_JUNGLE, "Jungle"},
-        {GENRE_NATIVE_AMERICAN, "Native American"},
-        {GENRE_CABARET, "Cabaret"},
-        {GENRE_NEW_WAVE, "New Wave"},
-        {GENRE_PSYCHEDELIC, "Psychedelic"},
-        {GENRE_RAVE, "Rave"},
-        {GENRE_SHOWTUNES, "Showtunes"},
-        {GENRE_TRAILER, "Trailer"},
-        {GENRE_LO_FI, "Lo-Fi"},
-        {GENRE_TRIBAL, "Tribal"},
-        {GENRE_ACID_PUNK, "Acid Punk"},
-        {GENRE_ACID_JAZZ, "Acid Jazz"},
-        {GENRE_POLKA, "Polka"},
-        {GENRE_RETRO, "Retro"},
-        {GENRE_MUSICAL, "Musical"},
-        {GENRE_ROCK_ROLL, "Rock & Roll"},
-        {GENRE_HARD_ROCK, "Hard Rock"},
-        {GENRE_FOLK, "Folk"},
-        {GENRE_FOLK_ROCK, "Folk-Rock"},
-        {GENRE_NATIONAL_FOLK, "National Folk"},
-        {GENRE_SWING, "Swing"},
-        {GENRE_FAST_FUSION, "Fast Fusion"},
-        {GENRE_BEBOB, "Bebob"},
-        {GENRE_LATIN, "Latin"},
-        {GENRE_REVIVAL, "Revival"},
-        {GENRE_CELTIC, "Celtic"},
-        {GENRE_BLUEGRASS, "Bluegrass"},
-        {GENRE_AVANTGARDE, "Avantgarde"},
-        {GENRE_GOTHIC_ROCK, "Gothic Rock"},
-        {GENRE_PROGRESSIVE_ROCK, "Progressive Rock"},
-        {GENRE_PSYCHEDELIC_ROCK, "Psychedelic Rock"},
-        {GENRE_SYMPHONIC_ROCK, "Symphonic Rock"},
-        {GENRE_SLOW_ROCK, "Slow Rock"},
-        {GENRE_BIG_BAND, "Big Band"},
-        {GENRE_CHORUS, "Chorus"},
-        {GENRE_EASY_LISTENING, "Easy Listening"},
-        {GENRE_ACOUSTIC, "Acoustic"},
-        {GENRE_HUMOUR, "Humour"},
-        {GENRE_SPEECH, "Speech"},
-        {GENRE_CHANSON, "Chanson"},
-        {GENRE_OPERA, "Opera"},
-        {GENRE_CHAMBER_MUSIC, "Chamber Music"},
-        {GENRE_SONATA, "Sonata"},
-        {GENRE_SYMPHONY, "Symphony"},
-        {GENRE_BOOTY_BASS, "Booty Bass"},
-        {GENRE_PRIMUS, "Primus"},
-        {GENRE_PORN_GROOVE, "Porn Groove"},
-        {GENRE_SATIRE, "Satire"},
-        {GENRE_SLOW_JAM, "Slow Jam"},
-        {GENRE_CLUB, "Club"},
-        {GENRE_TANGO, "Tango"},
-        {GENRE_SAMBA, "Samba"},
-        {GENRE_FOLKLORE, "Folklore"},
-        {GENRE_BALLAD, "Ballad"},
-        {GENRE_POWER_BALLAD, "Power Ballad"},
-        {GENRE_RHYTHMIC_SOUL, "Rhythmic Soul"},
-        {GENRE_FREESTYLE, "Freestyle"},
-        {GENRE_DUET, "Duet"},
-        {GENRE_PUNK_ROCK, "Punk Rock"},
-        {GENRE_DRUM_SOLO, "Drum Solo"},
-        {GENRE_A_CAPELLA, "A capella"},
-        {GENRE_EURO_HOUSE, "Euro-House"},
-    };
-
-    int count;
-
-    for (count = 0; count < ARRAY_LEN (table); count++)
-    {
-        if (table[count].numericgenre == numericgenre)
-            return table[count].genre;
-    }
-
-    return "Unknown";
-}
-
-uint32_t unsyncsafe32 (uint32_t x)
-{
-    return (x & 0x7f) | ((x & 0x7f00) >> 1) | ((x & 0x7f0000) >> 2) | ((x &
-     0x7f000000) >> 3);
-}
-
-uint32_t syncsafe32 (uint32_t x)
-{
-    return (x & 0x7f) | ((x & 0x3f80) << 1) | ((x & 0x1fc000) << 2) | ((x &
-     0xfe00000) << 3);
-}
-
-bool_t open_temp_file_for (TempFile * temp, VFSFile * file)
-{
-    char * template = filename_build (g_get_tmp_dir (), "audacious-temp-XXXXXX");
-    SCOPY (tempname, template);
-    str_unref (template);
-
-    temp->fd = g_mkstemp (tempname);
-    if (temp->fd < 0)
-        return FALSE;
-
-    temp->name = str_get (tempname);
-
-    return TRUE;
-}
-
-bool_t copy_region_to_temp_file (TempFile * temp, VFSFile * file, int64_t offset, int64_t size)
-{
-    if (vfs_fseek (file, offset, SEEK_SET) < 0)
-        return FALSE;
-
-    char buf[16384];
-
-    while (size < 0 || size > 0)
-    {
-        int64_t readsize;
-
-        if (size > 0)
-        {
-            readsize = MIN (size, sizeof buf);
-            if (vfs_fread (buf, 1, readsize, file) != readsize)
-                return FALSE;
-
-            size -= readsize;
-        }
-        else
-        {
-            /* negative size means copy to EOF */
-            readsize = vfs_fread (buf, 1, sizeof buf, file);
-            if (! readsize)
-                break;
-        }
-
-        int64_t written = 0;
-        while (written < readsize)
-        {
-            int64_t writesize = write (temp->fd, buf + written, readsize - written);
-            if (writesize <= 0)
-                return FALSE;
-
-            written += writesize;
-        }
-    }
-
-    return TRUE;
-}
-
-bool_t replace_with_temp_file (TempFile * temp, VFSFile * file)
-{
-    if (lseek (temp->fd, 0, SEEK_SET) < 0)
-        return FALSE;
-
-    if (vfs_fseek (file, 0, SEEK_SET) < 0)
-        return FALSE;
-
-    if (vfs_ftruncate (file, 0) < 0)
-        return FALSE;
-
-    char buf[16384];
-
-    while (1)
-    {
-        int64_t readsize = read (temp->fd, buf, sizeof buf);
-        if (readsize < 0)
-            return FALSE;
-
-        if (readsize == 0)
-            break;
-
-        if (vfs_fwrite (buf, 1, readsize, file) != readsize)
-            return FALSE;
-    }
-
-    close (temp->fd);
-    g_unlink (temp->name);
-
-    return TRUE;
-}
diff --git a/src/libaudtag/util.cc b/src/libaudtag/util.cc
new file mode 100644
index 000000000000..da935f0ced79
--- /dev/null
+++ b/src/libaudtag/util.cc
@@ -0,0 +1,269 @@
+/*
+ * util.c
+ * Copyright 2009-2014 Paula Stanciu, Tony Vroon, and John Lindgren
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions, and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions, and the following disclaimer in the documentation
+ *    provided with the distribution.
+ *
+ * This software is provided "as is" and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising from
+ * the use of this software.
+ */
+
+#include <unistd.h>
+
+#include <glib/gstdio.h>
+
+#include <libaudcore/audstrings.h>
+
+#include "util.h"
+
+const char *convert_numericgenre_to_text(int numericgenre)
+{
+    static const struct
+    {
+        int numericgenre;
+        const char *genre;
+    }
+    table[] =
+    {
+        {GENRE_BLUES, "Blues"},
+        {GENRE_CLASSIC_ROCK, "Classic Rock"},
+        {GENRE_COUNTRY, "Country"},
+        {GENRE_DANCE, "Dance"},
+        {GENRE_DISCO, "Disco"},
+        {GENRE_FUNK, "Funk"},
+        {GENRE_GRUNGE, "Grunge"},
+        {GENRE_HIPHOP, "Hip-Hop"},
+        {GENRE_JAZZ, "Jazz"},
+        {GENRE_METAL, "Metal"},
+        {GENRE_NEW_AGE, "New Age"},
+        {GENRE_OLDIES, "Oldies"},
+        {GENRE_OTHER, "Other"},
+        {GENRE_POP, "Pop"},
+        {GENRE_R_B, "R&B"},
+        {GENRE_RAP, "Rap"},
+        {GENRE_REGGAE, "Reggae"},
+        {GENRE_ROCK, "Rock"},
+        {GENRE_TECHNO, "Techno"},
+        {GENRE_INDUSTRIAL, "Industrial"},
+        {GENRE_ALTERNATIVE, "Alternative"},
+        {GENRE_SKA, "Ska"},
+        {GENRE_DEATH_METAL, "Death Metal"},
+        {GENRE_PRANKS, "Pranks"},
+        {GENRE_SOUNDTRACK, "Soundtrack"},
+        {GENRE_EURO_TECHNO, "Euro-Techno"},
+        {GENRE_AMBIENT, "Ambient"},
+        {GENRE_TRIP_HOP, "Trip-Hop"},
+        {GENRE_VOCAL, "Vocal"},
+        {GENRE_JAZZ_FUNK, "Jazz+Funk"},
+        {GENRE_FUSION, "Fusion"},
+        {GENRE_TRANCE, "Trance"},
+        {GENRE_CLASSICAL, "Classical"},
+        {GENRE_INSTRUMENTAL, "Instrumental"},
+        {GENRE_ACID, "Acid"},
+        {GENRE_HOUSE, "House"},
+        {GENRE_GAME, "Game"},
+        {GENRE_SOUND_CLIP, "Sound Clip"},
+        {GENRE_GOSPEL, "Gospel"},
+        {GENRE_NOISE, "Noise"},
+        {GENRE_ALTERNROCK, "AlternRock"},
+        {GENRE_BASS, "Bass"},
+        {GENRE_SOUL, "Soul"},
+        {GENRE_PUNK, "Punk"},
+        {GENRE_SPACE, "Space"},
+        {GENRE_MEDITATIVE, "Meditative"},
+        {GENRE_INSTRUMENTAL_POP, "Instrumental Pop"},
+        {GENRE_INSTRUMENTAL_ROCK, "Instrumental Rock"},
+        {GENRE_ETHNIC, "Ethnic"},
+        {GENRE_GOTHIC, "Gothic"},
+        {GENRE_DARKWAVE, "Darkwave"},
+        {GENRE_TECHNO_INDUSTRIAL, "Techno-Industrial"},
+        {GENRE_ELECTRONIC, "Electronic"},
+        {GENRE_POP_FOLK, "Pop-Folk"},
+        {GENRE_EURODANCE, "Eurodance"},
+        {GENRE_DREAM, "Dream"},
+        {GENRE_SOUTHERN_ROCK, "Southern Rock"},
+        {GENRE_COMEDY, "Comedy"},
+        {GENRE_CULT, "Cult"},
+        {GENRE_GANGSTA, "Gangsta"},
+        {GENRE_TOP40, "Top 40"},
+        {GENRE_CHRISTIAN_RAP, "Christian Rap"},
+        {GENRE_POP_FUNK, "Pop/Funk"},
+        {GENRE_JUNGLE, "Jungle"},
+        {GENRE_NATIVE_AMERICAN, "Native American"},
+        {GENRE_CABARET, "Cabaret"},
+        {GENRE_NEW_WAVE, "New Wave"},
+        {GENRE_PSYCHEDELIC, "Psychedelic"},
+        {GENRE_RAVE, "Rave"},
+        {GENRE_SHOWTUNES, "Showtunes"},
+        {GENRE_TRAILER, "Trailer"},
+        {GENRE_LO_FI, "Lo-Fi"},
+        {GENRE_TRIBAL, "Tribal"},
+        {GENRE_ACID_PUNK, "Acid Punk"},
+        {GENRE_ACID_JAZZ, "Acid Jazz"},
+        {GENRE_POLKA, "Polka"},
+        {GENRE_RETRO, "Retro"},
+        {GENRE_MUSICAL, "Musical"},
+        {GENRE_ROCK_ROLL, "Rock & Roll"},
+        {GENRE_HARD_ROCK, "Hard Rock"},
+        {GENRE_FOLK, "Folk"},
+        {GENRE_FOLK_ROCK, "Folk-Rock"},
+        {GENRE_NATIONAL_FOLK, "National Folk"},
+        {GENRE_SWING, "Swing"},
+        {GENRE_FAST_FUSION, "Fast Fusion"},
+        {GENRE_BEBOB, "Bebob"},
+        {GENRE_LATIN, "Latin"},
+        {GENRE_REVIVAL, "Revival"},
+        {GENRE_CELTIC, "Celtic"},
+        {GENRE_BLUEGRASS, "Bluegrass"},
+        {GENRE_AVANTGARDE, "Avantgarde"},
+        {GENRE_GOTHIC_ROCK, "Gothic Rock"},
+        {GENRE_PROGRESSIVE_ROCK, "Progressive Rock"},
+        {GENRE_PSYCHEDELIC_ROCK, "Psychedelic Rock"},
+        {GENRE_SYMPHONIC_ROCK, "Symphonic Rock"},
+        {GENRE_SLOW_ROCK, "Slow Rock"},
+        {GENRE_BIG_BAND, "Big Band"},
+        {GENRE_CHORUS, "Chorus"},
+        {GENRE_EASY_LISTENING, "Easy Listening"},
+        {GENRE_ACOUSTIC, "Acoustic"},
+        {GENRE_HUMOUR, "Humour"},
+        {GENRE_SPEECH, "Speech"},
+        {GENRE_CHANSON, "Chanson"},
+        {GENRE_OPERA, "Opera"},
+        {GENRE_CHAMBER_MUSIC, "Chamber Music"},
+        {GENRE_SONATA, "Sonata"},
+        {GENRE_SYMPHONY, "Symphony"},
+        {GENRE_BOOTY_BASS, "Booty Bass"},
+        {GENRE_PRIMUS, "Primus"},
+        {GENRE_PORN_GROOVE, "Porn Groove"},
+        {GENRE_SATIRE, "Satire"},
+        {GENRE_SLOW_JAM, "Slow Jam"},
+        {GENRE_CLUB, "Club"},
+        {GENRE_TANGO, "Tango"},
+        {GENRE_SAMBA, "Samba"},
+        {GENRE_FOLKLORE, "Folklore"},
+        {GENRE_BALLAD, "Ballad"},
+        {GENRE_POWER_BALLAD, "Power Ballad"},
+        {GENRE_RHYTHMIC_SOUL, "Rhythmic Soul"},
+        {GENRE_FREESTYLE, "Freestyle"},
+        {GENRE_DUET, "Duet"},
+        {GENRE_PUNK_ROCK, "Punk Rock"},
+        {GENRE_DRUM_SOLO, "Drum Solo"},
+        {GENRE_A_CAPELLA, "A capella"},
+        {GENRE_EURO_HOUSE, "Euro-House"},
+    };
+
+    for (auto & pair : table)
+    {
+        if (pair.numericgenre == numericgenre)
+            return pair.genre;
+    }
+
+    return "Unknown";
+}
+
+uint32_t unsyncsafe32 (uint32_t x)
+{
+    return (x & 0x7f) | ((x & 0x7f00) >> 1) | ((x & 0x7f0000) >> 2) | ((x &
+     0x7f000000) >> 3);
+}
+
+uint32_t syncsafe32 (uint32_t x)
+{
+    return (x & 0x7f) | ((x & 0x3f80) << 1) | ((x & 0x1fc000) << 2) | ((x &
+     0xfe00000) << 3);
+}
+
+bool open_temp_file_for (TempFile * temp, VFSFile & file)
+{
+    StringBuf tempname = filename_build ({g_get_tmp_dir (), "audacious-temp-XXXXXX"});
+
+    temp->fd = g_mkstemp (tempname);
+    if (temp->fd < 0)
+        return false;
+
+    temp->name = String (tempname);
+
+    return true;
+}
+
+bool copy_region_to_temp_file (TempFile * temp, VFSFile & file, int64_t offset, int64_t size)
+{
+    if (file.fseek (offset, VFS_SEEK_SET) < 0)
+        return false;
+
+    char buf[16384];
+
+    while (size < 0 || size > 0)
+    {
+        int64_t readsize;
+
+        if (size > 0)
+        {
+            readsize = aud::min (size, (int64_t) sizeof buf);
+            if (file.fread (buf, 1, readsize) != readsize)
+                return false;
+
+            size -= readsize;
+        }
+        else
+        {
+            /* negative size means copy to EOF */
+            readsize = file.fread (buf, 1, sizeof buf);
+            if (! readsize)
+                break;
+        }
+
+        int64_t written = 0;
+        while (written < readsize)
+        {
+            int64_t writesize = write (temp->fd, buf + written, readsize - written);
+            if (writesize <= 0)
+                return false;
+
+            written += writesize;
+        }
+    }
+
+    return true;
+}
+
+bool replace_with_temp_file (TempFile * temp, VFSFile & file)
+{
+    if (lseek (temp->fd, 0, SEEK_SET) < 0)
+        return false;
+
+    if (file.fseek (0, VFS_SEEK_SET) < 0)
+        return false;
+
+    if (file.ftruncate (0) < 0)
+        return false;
+
+    char buf[16384];
+
+    while (1)
+    {
+        int64_t readsize = read (temp->fd, buf, sizeof buf);
+        if (readsize < 0)
+            return false;
+
+        if (readsize == 0)
+            break;
+
+        if (file.fwrite (buf, 1, readsize) != readsize)
+            return false;
+    }
+
+    close (temp->fd);
+    g_unlink (temp->name);
+
+    return true;
+}
diff --git a/src/libaudtag/util.h b/src/libaudtag/util.h
index 3b80ad7aba33..711f56e504c5 100644
--- a/src/libaudtag/util.h
+++ b/src/libaudtag/util.h
@@ -21,9 +21,8 @@
 #define TAGUTIL_H
 
 #include <stdint.h>
-#include <stdio.h>
 
-#include "libaudcore/vfs.h"
+#include <libaudcore/vfs.h>
 
 enum {
     GENRE_BLUES = 0,
@@ -153,22 +152,18 @@ enum {
     GENRE_EURO_HOUSE
 };
 
-extern bool_t tag_verbose;
-
-#define TAGDBG(...) do {if (tag_verbose) {printf ("%s:%d [%s]: ", __FILE__, __LINE__, __FUNCTION__); printf (__VA_ARGS__);}} while (0)
-
 const char *convert_numericgenre_to_text(int numericgenre);
 
 uint32_t unsyncsafe32 (uint32_t x);
 uint32_t syncsafe32 (uint32_t x);
 
-typedef struct {
-    char * name;
+struct TempFile {
+    String name;
     int fd;
-} TempFile;
+};
 
-bool_t open_temp_file_for (TempFile * temp, VFSFile * file);
-bool_t copy_region_to_temp_file (TempFile * temp, VFSFile * file, int64_t offset, int64_t size);
-bool_t replace_with_temp_file (TempFile * temp, VFSFile * file);
+bool open_temp_file_for (TempFile * temp, VFSFile & file);
+bool copy_region_to_temp_file (TempFile * temp, VFSFile & file, int64_t offset, int64_t size);
+bool replace_with_temp_file (TempFile * temp, VFSFile & file);
 
 #endif /* TAGUTIL_H */
-- 
2.1.4




More information about the pkg-multimedia-maintainers mailing list