diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c606e029..db3d32208 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -129,6 +129,7 @@ IF( ENABLE_KDE_SUPPORT ) install( FILES cantataui.rc DESTINATION ${DATA_INSTALL_DIR}/cantata ) install( FILES cantata.notifyrc DESTINATION ${DATA_INSTALL_DIR}/cantata ) ADD_SUBDIRECTORY( icons ) + add_subdirectory(po) ELSE( ENABLE_KDE_SUPPORT ) SET( CANTATA_SRCS ${CANTATA_SRCS} widgets/lineedit.cpp) QT4_ADD_RESOURCES( CANTATA_RC_SRCS ${CANTATA_RCS} ) diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt new file mode 100644 index 000000000..8b0783308 --- /dev/null +++ b/po/CMakeLists.txt @@ -0,0 +1,25 @@ +find_program(GETTEXT_MSGFMT_EXECUTABLE msgfmt) + +if(NOT GETTEXT_MSGFMT_EXECUTABLE) + message("------\n" + "NOTE: msgfmt not found. Translations will *not* be installed\n" + "------\n") +else(NOT GETTEXT_MSGFMT_EXECUTABLE) + set(catalogname cantata) + add_custom_target(translations ALL) + file(GLOB PO_FILES *.po) + foreach(_poFile ${PO_FILES}) + get_filename_component(_poFileName ${_poFile} NAME) + string(REGEX REPLACE "^${catalogname}_?" "" _langCode ${_poFileName} ) + string(REGEX REPLACE "\\.po$" "" _langCode ${_langCode} ) + if(_langCode) + get_filename_component(_lang ${_poFile} NAME_WE) + set(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo) + add_custom_command(TARGET translations + COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check -o ${_gmoFile} ${_poFile} + DEPENDS ${_poFile}) + install(FILES ${_gmoFile} DESTINATION ${LOCALE_INSTALL_DIR}/${_langCode}/LC_MESSAGES/ RENAME ${catalogname}.mo) + endif( _langCode ) + endforeach(_poFile ${PO_FILES}) +endif(NOT GETTEXT_MSGFMT_EXECUTABLE) + diff --git a/po/cantata.pot b/po/cantata.pot new file mode 100644 index 000000000..10bec1726 --- /dev/null +++ b/po/cantata.pot @@ -0,0 +1,413 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-11-28 09:38+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: gui/lyrics.cpp:288 gui/lyrics.cpp:313 +msgid "No lyrics found" +msgstr "" + +#: gui/mainwindow.cpp:194 +msgid "Library" +msgstr "" + +#: gui/mainwindow.cpp:195 +msgid "Folders" +msgstr "" + +#: gui/mainwindow.cpp:196 +msgid "Playlists" +msgstr "" + +#: gui/mainwindow.cpp:197 +msgid "Lyrics" +msgstr "" + +#: gui/mainwindow.cpp:212 +msgid "Update Database" +msgstr "" + +#: gui/mainwindow.cpp:215 +msgid "Previous Track" +msgstr "" + +#: gui/mainwindow.cpp:219 +msgid "Next Track" +msgstr "" + +#: gui/mainwindow.cpp:223 +msgid "Play/Pause" +msgstr "" + +#: gui/mainwindow.cpp:227 +msgid "Stop" +msgstr "" + +#: gui/mainwindow.cpp:231 +msgid "Increase Volume" +msgstr "" + +#: gui/mainwindow.cpp:235 +msgid "Decrease Volume" +msgstr "" + +#: gui/mainwindow.cpp:239 +msgid "Add To Playlist" +msgstr "" + +#: gui/mainwindow.cpp:242 +msgid "Replace Playlist" +msgstr "" + +#: gui/mainwindow.cpp:245 +msgid "Load" +msgstr "" + +#: gui/mainwindow.cpp:248 gui/mainwindow.cpp:251 +msgid "Remove" +msgstr "" + +#: gui/mainwindow.cpp:255 +msgid "Copy Song Info" +msgstr "" + +#: gui/mainwindow.cpp:258 +msgid "Crop" +msgstr "" + +#: gui/mainwindow.cpp:261 +msgid "Shuffle" +msgstr "" + +#: gui/mainwindow.cpp:264 +msgid "Rename" +msgstr "" + +#: gui/mainwindow.cpp:267 +msgid "Save As" +msgstr "" + +#: gui/mainwindow.cpp:270 +msgid "Clear" +msgstr "" + +#: gui/mainwindow.cpp:273 +msgid "Show Playlist" +msgstr "" + +#: gui/mainwindow.cpp:276 +msgid "Random" +msgstr "" + +#: gui/mainwindow.cpp:279 +msgid "Repeat" +msgstr "" + +#: gui/mainwindow.cpp:282 +msgid "Consume" +msgstr "" + +#: gui/mainwindow.cpp:401 +msgid "Search library..." +msgstr "" + +#: gui/mainwindow.cpp:402 +msgid "Search files..." +msgstr "" + +#: gui/mainwindow.cpp:403 +msgid "Search playlist..." +msgstr "" + +#: gui/mainwindow.cpp:418 gui/mainwindow.cpp:910 gui/mainwindow.cpp:1028 +msgid "Stopped" +msgstr "" + +#: gui/mainwindow.cpp:658 +msgid "" +"The MPD connection died unexpectedly.\n" +"This error is unrecoverable, please restart %1." +msgstr "" + +#: gui/mainwindow.cpp:659 +msgid "Lost MPD Connection" +msgstr "" + +#: gui/mainwindow.cpp:931 +msgid "" +"
Artist:%1
Album:%2
Song:%3
Track:%4
Length:%5
" +msgstr "" + +#: gui/mainwindow.cpp:986 gui/mainwindow.cpp:987 +msgid "Volume %1%" +msgstr "" + +#: gui/mainwindow.cpp:1303 +msgid "1 Artist, " +msgid_plural "%1 Artists, " +msgstr[0] "" +msgstr[1] "" + +#: gui/mainwindow.cpp:1304 +msgid "1 Album, " +msgid_plural "%1 Albums, " +msgstr[0] "" +msgstr[1] "" + +#: gui/mainwindow.cpp:1305 +msgid "1 Song" +msgid_plural "%1 Songs" +msgstr[0] "" +msgstr[1] "" + +#: gui/mainwindow.cpp:1445 gui/playlisttablemodel.cpp:57 +msgid "Length" +msgstr "" + +#: gui/mainwindow.cpp:1445 gui/playlisttablemodel.cpp:55 +msgid "Track" +msgstr "" + +#: gui/mainwindow.cpp:1445 gui/playlisttablemodel.cpp:59 +msgid "Disc" +msgstr "" + +#: gui/mainwindow.cpp:1445 gui/playlisttablemodel.cpp:61 +msgid "Year" +msgstr "" + +#: gui/mainwindow.cpp:1558 main.cpp:36 +msgid "Cantata" +msgstr "" + +#: gui/mainwindow.cpp:1624 +msgid "Are you sure you want to delete playlist: %1?" +msgstr "" + +#: gui/mainwindow.cpp:1625 +msgid "Delete Playlist?" +msgstr "" + +#: gui/mainwindow.cpp:1647 +msgid "Playlist Name" +msgstr "" + +#: gui/mainwindow.cpp:1647 +msgid "Enter a name for the playlist:" +msgstr "" + +#: gui/mainwindow.cpp:1677 +msgid "Rename Playlist" +msgstr "" + +#: gui/mainwindow.cpp:1677 +msgid "Enter new name for playlist: %1" +msgstr "" + +#: gui/mainwindow.cpp:1751 +msgid "All Genres" +msgstr "" + +#: gui/playlisttablemodel.cpp:49 +msgid "Title" +msgstr "" + +#: gui/playlisttablemodel.cpp:51 +msgid "Artist" +msgstr "" + +#: gui/playlisttablemodel.cpp:53 +msgid "Album" +msgstr "" + +#: gui/preferencesdialog.cpp:41 +msgid "Configure" +msgstr "" + +#: gui/updatedialog.cpp:59 +msgid "Updating" +msgstr "" + +#: gui/updatedialog.cpp:69 +msgid "Updating backend database
Please wait..." +msgstr "" + +#: gui/updatedialog.cpp:89 +msgid "Finished
Database updated." +msgstr "" + +#: lib/mpdconnection.cpp:715 +msgid "A Playlist named %1 already exists!
Overwrite?" +msgstr "" + +#: lib/mpdconnection.cpp:719 +msgid "Failed to save playlist." +msgstr "" + +#: lib/mpdparseutils.cpp:223 +msgid "Unknown" +msgstr "" + +#: main.cpp:37 +msgid "A simple interface to MPD" +msgstr "" + +#: main.cpp:39 +msgid "Copyright (C) 2011 Craig Drummond" +msgstr "" + +#: main.cpp:40 +msgid "Based upon QtMPC - (C) 2007-2010 The QtMPC Authors" +msgstr "" + +#: main.cpp:43 +msgid "Craig Drummond" +msgstr "" + +#: main.cpp:43 +msgid "Maintainer" +msgstr "" + +#. i18n: file: cantataui.rc:6 +#. i18n: ectx: Menu (actions) +#: po/rc.cpp:3 rc.cpp:3 +msgid "Output" +msgstr "" + +#. i18n: file: gui/folderpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, FolderPage) +#. i18n: file: gui/librarypage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, LibraryPage) +#. i18n: file: gui/lyricspage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, LyricsPage) +#. i18n: file: gui/mainwindow.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, MainWindow) +#. i18n: file: gui/playlistspage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, PlaylistsPage) +#. i18n: file: gui/preferencesdialog.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, PreferencesDialog) +#. i18n: file: gui/folderpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, FolderPage) +#. i18n: file: gui/librarypage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, LibraryPage) +#. i18n: file: gui/lyricspage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, LyricsPage) +#. i18n: file: gui/mainwindow.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, MainWindow) +#. i18n: file: gui/playlistspage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, PlaylistsPage) +#. i18n: file: gui/preferencesdialog.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, PreferencesDialog) +#: po/rc.cpp:6 po/rc.cpp:9 po/rc.cpp:12 po/rc.cpp:15 po/rc.cpp:24 po/rc.cpp:27 +#: rc.cpp:6 rc.cpp:9 rc.cpp:12 rc.cpp:15 rc.cpp:24 rc.cpp:27 +msgid "Form" +msgstr "" + +#. i18n: file: gui/mainwindow.ui:109 +#. i18n: ectx: property (text), widget (KSqueezedTextLabel, trackLabel) +#: po/rc.cpp:18 rc.cpp:18 +msgid "KSqueezedTextLabel" +msgstr "" + +#. i18n: file: gui/mainwindow.ui:140 +#. i18n: ectx: property (text), widget (QLabel, songTimeElapsedLabel) +#: po/rc.cpp:21 rc.cpp:21 +msgid "(00:00)" +msgstr "" + +#. i18n: file: gui/preferencesdialog.ui:23 +#. i18n: ectx: property (text), widget (QLabel, label) +#: po/rc.cpp:30 rc.cpp:30 +msgid "MPD Host:" +msgstr "" + +#. i18n: file: gui/preferencesdialog.ui:36 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: po/rc.cpp:33 rc.cpp:33 +msgid "MPD Port:" +msgstr "" + +#. i18n: file: gui/preferencesdialog.ui:59 +#. i18n: ectx: property (text), widget (QLabel, label_3b) +#: po/rc.cpp:36 rc.cpp:36 +msgid "Password:" +msgstr "" + +#. i18n: file: gui/preferencesdialog.ui:76 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: po/rc.cpp:39 rc.cpp:39 +msgid "Music Folder:" +msgstr "" + +#. i18n: file: gui/preferencesdialog.ui:89 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: po/rc.cpp:42 rc.cpp:42 +msgid "Crossfading:" +msgstr "" + +#. i18n: file: gui/preferencesdialog.ui:99 +#. i18n: ectx: property (suffix), widget (QSpinBox, crossfading) +#: po/rc.cpp:45 rc.cpp:45 +msgid " seconds" +msgstr "" + +#. i18n: file: gui/preferencesdialog.ui:109 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: po/rc.cpp:48 rc.cpp:48 +msgid "Show In System Tray:" +msgstr "" + +#. i18n: file: gui/preferencesdialog.ui:129 +#. i18n: ectx: property (text), widget (QLabel, label_5) +#: po/rc.cpp:51 rc.cpp:51 +msgid "Show Popup Message:" +msgstr "" + +#: po/rc.cpp:52 rc.cpp:52 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "" + +#: po/rc.cpp:53 rc.cpp:53 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your emails" +msgstr "" + +#: widgets/fancytabwidget.cpp:667 +msgid "Large Sidebar" +msgstr "" + +#: widgets/fancytabwidget.cpp:668 +msgid "Small Sidebar" +msgstr "" + +#: widgets/fancytabwidget.cpp:669 +msgid "Plain Sidebar" +msgstr "" + +#: widgets/fancytabwidget.cpp:670 +msgid "Tabs On Top" +msgstr "" + +#: widgets/fancytabwidget.cpp:671 +msgid "Icons On Top" +msgstr "" diff --git a/po/generate.sh b/po/generate.sh new file mode 100755 index 000000000..74856591f --- /dev/null +++ b/po/generate.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +for app in extractrc xgettext msgmerge ; do + which $app > /dev/null 2>&1 + if [ $? -ne 0 ] ; then + echo "ERROR: Could not find $app" + exit + fi +done + +BASEDIR=".." # root of translatable sources +PROJECT="cantata" # project name +BUGADDR="" # MSGID-Bugs +WDIR=`pwd` # working dir +echo "Preparing rc files" +cd ${BASEDIR} +# we use simple sorting to make sure the lines do not jump around too much from system to system +find . -name '*.rc' -o -name '*.ui' -o -name '*.kcfg' | sort > ${WDIR}/rcfiles.list +xargs --arg-file=${WDIR}/rcfiles.list extractrc > ${WDIR}/rc.cpp +# additional string for KAboutData +echo 'i18nc("NAME OF TRANSLATORS","Your names");' >> ${WDIR}/rc.cpp +echo 'i18nc("EMAIL OF TRANSLATORS","Your emails");' >> ${WDIR}/rc.cpp +cd ${WDIR} +echo "Done preparing rc files" + +echo "Extracting messages" +cd ${BASEDIR} +# see above on sorting +find . -name '*.cpp' -o -name '*.h' -o -name '*.c' | sort > ${WDIR}/infiles.list +echo "rc.cpp" >> ${WDIR}/infiles.list +cd ${WDIR} +xgettext --from-code=UTF-8 -C -kde -ci18n -ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 -ktr2i18n:1 \ + -kI18N_NOOP:1 -kI18N_NOOP2:1c,2 -kaliasLocale -kki18n:1 -kki18nc:1c,2 -kki18np:1,2 -kki18ncp:1c,2,3 \ + --msgid-bugs-address="${BUGADDR}" \ + --files-from=infiles.list -D ${BASEDIR} -D ${WDIR} -o ${PROJECT}.pot || { echo "error while calling xgettext. aborting."; exit 1; } + +#Fix charset... +cat ${PROJECT}.pot | sed s^charset=CHARSET^charset=UTF-8^g > ${PROJECT}.pot-new +mv ${PROJECT}.pot-new ${PROJECT}.pot + +echo "Done extracting messages" + +echo "Merging translations" +catalogs=`find . -name '*.po'` +for cat in $catalogs; do + echo $cat + msgmerge -o $cat.new $cat ${PROJECT}.pot + mv $cat.new $cat +done +echo "Done merging translations" + +echo "Cleaning up" +cd ${WDIR} +rm rcfiles.list +rm infiles.list +rm rc.cpp +echo "Done"