diff --git a/kexi_xgettext.sh b/kexi_xgettext.sh deleted file mode 100644 --- a/kexi_xgettext.sh +++ /dev/null @@ -1,81 +0,0 @@ -# -# Helper function for extracting translatable messages from Kexi source code. -# Usage: kexi_xgettext -# If there are no messages or the is empty, the pot file is deleted. -# -# Example usage that creates $podir/myapp.pot file: -# xgettext_xgettext myapp.pot `find . -name \*.cpp -o -name \*.h` -# -function kexi_xgettext() { - POTFILE="$podir/$1" - shift - if test -n "$*"; then - kexi_xgettext_internal $* | tee "${POTFILE}" | tail -n1 | grep "^msgstr \"\"\$" > /dev/null \ - || rm -f "${POTFILE}" 2> /dev/null - fi -} - -function kexi_xgettext_internal() { - SRC_FILES="$*" - POT_PART_NORMAL="`mktemp $podir/_normal_XXXXXXXX.pot`" - POT_PART_QUNDOFORMAT="`mktemp $podir/_qundoformat_XXXXXXXX.pot`" - POT_PART_QUNDOFORMAT2="`mktemp $podir/_qundoformat2_XXXXXXXX.pot`" - POT_MERGED="`mktemp $podir/_merged_XXXXXXXX.pot`" - - $XGETTEXT ${CXG_EXTRA_ARGS} ${SRC_FILES} -o "${POT_PART_NORMAL}" --force-po - $XGETTEXT_PROGRAM --from-code=UTF-8 -C --kde -kkundo2_i18n:1 -kkundo2_i18np:1,2 -kkundo2_i18nc:1c,2 -kkundo2_i18ncp:1c,2,3 ${CXG_EXTRA_ARGS} ${SRC_FILES} -o "${POT_PART_QUNDOFORMAT}" - - if [ $(cat ${POT_PART_NORMAL} ${POT_PART_QUNDOFORMAT} | grep -c \(qtundo-format\)) != 0 ]; then - echo "ERROR: Context '(qtundo-format)' should not be added manually. Use kundo2_i18n*() calls instead." 1>&2 - exit 17 - fi - - if [ -s "${POT_PART_QUNDOFORMAT}" ]; then - # Prepend "(qtundo-format)" to existing msgctxt properties of messages - sed -i -e 's/^msgctxt "/msgctxt "(qtundo-format) /' "${POT_PART_QUNDOFORMAT}" - - # Add msgctxt "(qtundo-format)" to messages not having msgctxt yet - # - # lastLine != "#, fuzzy" is the check for the .pot header. - mv "${POT_PART_QUNDOFORMAT}" "${POT_PART_QUNDOFORMAT2}" - cat "${POT_PART_QUNDOFORMAT2}" | awk ' - /^msgid "/ { - if (lastLine !~ /^msgctxt/ && lastLine != "#, fuzzy") { - print "msgctxt \"(qtundo-format)\"" - } - } - { print ; lastLine = $0 }' > "${POT_PART_QUNDOFORMAT}" - fi - - if [ -s "${POT_PART_NORMAL}" -a -s "${POT_PART_QUNDOFORMAT}" ]; then - ${MSGCAT} -F "${POT_PART_NORMAL}" "${POT_PART_QUNDOFORMAT}" > ${POT_MERGED} - MERGED_HEADER_LINE_COUNT=$(cat ${POT_MERGED} | grep "^$" -B 100000 --max-count=1 | wc -l) - - KDE_HEADER="$(cat ${POT_PART_NORMAL} | grep "^$" -B 100000 --max-count=1)" - MERGED_TAIL="$(cat ${POT_MERGED} | tail -n +$MERGED_HEADER_LINE_COUNT)" - - # Print out the resulting .pot - echo "$KDE_HEADER" - echo "$MERGED_TAIL" - elif [ -s "${POT_PART_NORMAL}" ]; then - cat "${POT_PART_NORMAL}" - elif [ -s "${POT_PART_QUNDOFORMAT}" ]; then - cat "${POT_PART_QUNDOFORMAT}" - fi - - rm -f "${POT_PART_NORMAL}" "${POT_PART_QUNDOFORMAT}" "${POT_PART_QUNDOFORMAT2}" "${POT_MERGED}" -} - -# Sets EXCLUDE variable to excludes compatible with the find(1) command, e.g. '-path a -o -path b'. -# To unconditionally exclude dir (with subdirs) just put an empty file .i18n in it. -# To disable excluding for given file, e.g. foo.pot, add "foo.pot" line to the .i18n file. -function find_exclude() { - EXCLUDE="" - for f in `find . -name .i18n | sed 's/\/\.i18n$//g' | sort`; do - if ! grep -q "^${1}$" "$f/.i18n" ; then - if [ -n "$EXCLUDE" ] ; then EXCLUDE="$EXCLUDE -o " ; fi - EXCLUDE="$EXCLUDE -path $f" - fi - done - if [ -z "$EXCLUDE" ] ; then EXCLUDE="-path __dummy__" ; fi # needed because -prune in find needs args -} diff --git a/kundo2_aware_xgettext.sh b/kundo2_aware_xgettext.sh new file mode 100644 --- /dev/null +++ b/kundo2_aware_xgettext.sh @@ -0,0 +1,113 @@ +# +# Helper function for extracting translatable messages from Calligra/Krita/Kexi source code. +# Usage: kundo2_aware_xgettext +# If there are no messages or the is empty, the pot file is deleted. +# +# Example usage that creates $podir/myapp.pot file: +# kundo2_aware_xgettext myapp.pot `find . -name \*.cpp -o -name \*.h` +# +function kundo2_aware_xgettext() { + POTFILE="$podir/$1" + shift + if test -n "$*"; then + # we rely on last line being a 'msgstr' signaling that strings has been extracted (a header is always present) + # normally it ends with 'msgstr ""' but if plural it can end with eg 'msgstr[1] ""' + kundo2_aware_xgettext_internal $* | tee "${POTFILE}" | tail -n1 | grep "^msgstr" > /dev/null \ + || rm -f "${POTFILE}" 2> /dev/null + fi +} + +# How to unit test: +# export podir=. +# cp init-sample.pot sample.pot +# source krita_xgettext.sh +# add_ctxt_qtundo sample.pot +# +# Then check that all messages in sample.pot have "(qtundo-format)" in msgctxt. +function add_ctxt_qtundo() { + POT_PART_QUNDOFORMAT="$1" + POT_PART_QUNDOFORMAT2="`mktemp $podir/_qundoformat2_XXXXXXXX.pot`" + + # Prepend "(qtundo-format)" to existing msgctxt properties of messages + sed -i -e 's/^msgctxt "/msgctxt "(qtundo-format) /' "${POT_PART_QUNDOFORMAT}" + + # Add msgctxt "(qtundo-format)" to messages not having msgctxt yet + # + # lastLine != "#, fuzzy" is the check for the .pot header. + # If lastLine starts with '"' the msgctxt has been split on several lines and is treated by sed above, so skip it + mv "${POT_PART_QUNDOFORMAT}" "${POT_PART_QUNDOFORMAT2}" + cat "${POT_PART_QUNDOFORMAT2}" | awk ' + /^msgid "/ { + if (lastLine !~ /^\"/ && lastLine !~ /^msgctxt/ && lastLine != "#, fuzzy") { + print "msgctxt \"(qtundo-format)\"" + } + } + { print ; lastLine = $0 }' > "${POT_PART_QUNDOFORMAT}" + + rm -f "${POT_PART_QUNDOFORMAT2}" +} + +function kundo2_aware_xgettext_internal() { + SRC_FILES="$*" + POT_PART_NORMAL="`mktemp $podir/_normal_XXXXXXXX.pot`" + POT_PART_QUNDOFORMAT="`mktemp $podir/_qundoformat_XXXXXXXX.pot`" + POT_MERGED="`mktemp $podir/_merged_XXXXXXXX.pot`" + + $XGETTEXT ${CXG_EXTRA_ARGS} ${SRC_FILES} -o "${POT_PART_NORMAL}" --force-po + + XGETTEXT_FLAGS_KUNDO2="\ +--copyright-holder=This_file_is_part_of_KDE \ +--msgid-bugs-address=http://bugs.kde.org \ +--from-code=UTF-8 +-C -k --kde \ +-kkundo2_i18n:1 -kkundo2_i18np:1,2 -kkundo2_i18nc:1c,2 -kkundo2_i18ncp:1c,2,3 \ +" + + $XGETTEXT_PROGRAM ${XGETTEXT_FLAGS_KUNDO2} ${CXG_EXTRA_ARGS} ${SRC_FILES} -o "${POT_PART_QUNDOFORMAT}" + + if [ $(cat ${POT_PART_NORMAL} ${POT_PART_QUNDOFORMAT} | grep -c \(qtundo-format\)) != 0 ]; then + echo "ERROR: Context '(qtundo-format)' should not be added manually. Use kundo2_i18n*() calls instead." 1>&2 + exit 17 + fi + + if [ -s "${POT_PART_QUNDOFORMAT}" ]; then + add_ctxt_qtundo "${POT_PART_QUNDOFORMAT}" + fi + + if [ -s "${POT_PART_NORMAL}" -a -s "${POT_PART_QUNDOFORMAT}" ]; then + # ensure an empty line or else KDE_HEADER search will fail + # in case POT_PART_NORMAL only contains header + echo "" >>${POT_PART_NORMAL} + + ${MSGCAT} -F "${POT_PART_NORMAL}" "${POT_PART_QUNDOFORMAT}" > ${POT_MERGED} + MERGED_HEADER_LINE_COUNT=$(cat ${POT_MERGED} | grep "^$" -B 100000 --max-count=1 | wc -l) + KDE_HEADER="$(cat ${POT_PART_NORMAL} | grep "^$" -B 100000 --max-count=1)" + MERGED_TAIL="$(cat ${POT_MERGED} | tail -n +$MERGED_HEADER_LINE_COUNT)" + + # Print out the resulting .pot + echo "$KDE_HEADER" + echo "$MERGED_TAIL" + elif [ -s "${POT_PART_NORMAL}" ]; then + echo "# POT_PART_NORMAL only" + cat "${POT_PART_NORMAL}" + elif [ -s "${POT_PART_QUNDOFORMAT}" ]; then + echo "# POT_PART_QUNDOFORMAT only" + cat "${POT_PART_QUNDOFORMAT}" + fi + + rm -f "${POT_PART_NORMAL}" "${POT_PART_QUNDOFORMAT}" "${POT_MERGED}" +} + +# Sets EXCLUDE variable to excludes compatible with the find(1) command, e.g. '-path a -o -path b'. +# To unconditionally exclude dir (with subdirs) just put an empty file .i18n in it. +# To disable excluding for given file, e.g. foo.pot, add "foo.pot" line to the .i18n file. +function find_exclude() { + EXCLUDE="" + for f in `find . -name .i18n | sed 's/\/\.i18n$//g' | sort`; do + if ! grep -q "^${1}$" "$f/.i18n" ; then + if [ -n "$EXCLUDE" ] ; then EXCLUDE="$EXCLUDE -o " ; fi + EXCLUDE="$EXCLUDE -path $f" + fi + done + if [ -z "$EXCLUDE" ] ; then EXCLUDE="-path __dummy__" ; fi # needed because -prune in find needs args +} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -83,7 +83,7 @@ Messages.sh # non-source: - ${CMAKE_SOURCE_DIR}/kexi_xgettext.sh + ${CMAKE_SOURCE_DIR}/kundo2_aware_xgettext.sh Mainpage.dox Messages.sh ) diff --git a/src/Messages.sh b/src/Messages.sh --- a/src/Messages.sh +++ b/src/Messages.sh @@ -1,5 +1,5 @@ #! /bin/sh -source ../kexi_xgettext.sh +source ../kundo2_aware_xgettext.sh potfile=kexi.pot find_exclude $potfile @@ -14,5 +14,5 @@ if ! grep -q '^#warning noi18n ' $f ; then echo $f; fi \ done \ ` -kexi_xgettext $potfile $LIST +kundo2_aware_xgettext $potfile $LIST rm -f rc.cpp diff --git a/src/migration/mdb/Messages.sh b/src/migration/mdb/Messages.sh --- a/src/migration/mdb/Messages.sh +++ b/src/migration/mdb/Messages.sh @@ -1,5 +1,5 @@ #! /bin/sh -source ../../../kexi_xgettext.sh +source ../../../kundo2_aware_xgettext.sh potfile=keximigrate_mdb.pot find_exclude $potfile @@ -9,5 +9,5 @@ if ! grep -q '^#warning noi18n ' $f ; then echo $f; fi \ done \ ` -kexi_xgettext $potfile $LIST +kundo2_aware_xgettext $potfile $LIST rm -f rc.cpp diff --git a/src/migration/mysql/Messages.sh b/src/migration/mysql/Messages.sh --- a/src/migration/mysql/Messages.sh +++ b/src/migration/mysql/Messages.sh @@ -1,5 +1,5 @@ #! /bin/sh -source ../../../kexi_xgettext.sh +source ../../../kundo2_aware_xgettext.sh potfile=keximigrate_mysql.pot find_exclude $potfile @@ -9,5 +9,5 @@ if ! grep -q '^#warning noi18n ' $f ; then echo $f; fi \ done \ ` -kexi_xgettext $potfile $LIST +kundo2_aware_xgettext $potfile $LIST rm -f rc.cpp diff --git a/src/migration/odb/Messages.sh b/src/migration/odb/Messages.sh --- a/src/migration/odb/Messages.sh +++ b/src/migration/odb/Messages.sh @@ -1,5 +1,5 @@ #! /bin/sh -source ../../../kexi_xgettext.sh +source ../../../kundo2_aware_xgettext.sh potfile=keximigrate_odb.pot find_exclude $potfile @@ -9,5 +9,5 @@ if ! grep -q '^#warning noi18n ' $f ; then echo $f; fi \ done \ ` -kexi_xgettext $potfile $LIST +kundo2_aware_xgettext $potfile $LIST rm -f rc.cpp diff --git a/src/migration/postgresql/Messages.sh b/src/migration/postgresql/Messages.sh --- a/src/migration/postgresql/Messages.sh +++ b/src/migration/postgresql/Messages.sh @@ -1,5 +1,5 @@ #! /bin/sh -source ../../../kexi_xgettext.sh +source ../../../kundo2_aware_xgettext.sh potfile=keximigrate_postgresql.pot find_exclude $potfile @@ -9,5 +9,5 @@ if ! grep -q '^#warning noi18n ' $f ; then echo $f; fi \ done \ ` -kexi_xgettext $potfile $LIST +kundo2_aware_xgettext $potfile $LIST rm -f rc.cpp diff --git a/src/migration/spreadsheet/Messages.sh b/src/migration/spreadsheet/Messages.sh --- a/src/migration/spreadsheet/Messages.sh +++ b/src/migration/spreadsheet/Messages.sh @@ -1,5 +1,5 @@ #! /bin/sh -source ../../../kexi_xgettext.sh +source ../../../kundo2_aware_xgettext.sh potfile=keximigrate_spreadsheet.pot find_exclude $potfile @@ -9,5 +9,5 @@ if ! grep -q '^#warning noi18n ' $f ; then echo $f; fi \ done \ ` -kexi_xgettext $potfile $LIST +kundo2_aware_xgettext $potfile $LIST rm -f rc.cpp diff --git a/src/migration/sybase/Messages.sh b/src/migration/sybase/Messages.sh --- a/src/migration/sybase/Messages.sh +++ b/src/migration/sybase/Messages.sh @@ -1,5 +1,5 @@ #! /bin/sh -source ../../../kexi_xgettext.sh +source ../../../kundo2_aware_xgettext.sh potfile=keximigrate_sybase.pot find_exclude $potfile @@ -9,5 +9,5 @@ if ! grep -q '^#warning noi18n ' $f ; then echo $f; fi \ done \ ` -kexi_xgettext $potfile $LIST +kundo2_aware_xgettext $potfile $LIST rm -f rc.cpp diff --git a/src/migration/tsv/Messages.sh b/src/migration/tsv/Messages.sh --- a/src/migration/tsv/Messages.sh +++ b/src/migration/tsv/Messages.sh @@ -1,5 +1,5 @@ #! /bin/sh -source ../../../kexi_xgettext.sh +source ../../../kundo2_aware_xgettext.sh potfile=keximigrate_tsv.pot find_exclude $potfile @@ -9,5 +9,5 @@ if ! grep -q '^#warning noi18n ' $f ; then echo $f; fi \ done \ ` -kexi_xgettext $potfile $LIST +kundo2_aware_xgettext $potfile $LIST rm -f rc.cpp diff --git a/src/migration/xbase/Messages.sh b/src/migration/xbase/Messages.sh --- a/src/migration/xbase/Messages.sh +++ b/src/migration/xbase/Messages.sh @@ -1,5 +1,5 @@ #! /bin/sh -source ../../../kexi_xgettext.sh +source ../../../kundo2_aware_xgettext.sh potfile=keximigrate_xbase.pot find_exclude $potfile @@ -9,5 +9,5 @@ if ! grep -q '^#warning noi18n ' $f ; then echo $f; fi \ done \ ` -kexi_xgettext $potfile $LIST +kundo2_aware_xgettext $potfile $LIST rm -f rc.cpp diff --git a/src/plugins/forms/widgets/mapbrowser/Messages.sh b/src/plugins/forms/widgets/mapbrowser/Messages.sh --- a/src/plugins/forms/widgets/mapbrowser/Messages.sh +++ b/src/plugins/forms/widgets/mapbrowser/Messages.sh @@ -1,5 +1,5 @@ #! /bin/sh -source ../../../../../kexi_xgettext.sh +source ../../../../../kundo2_aware_xgettext.sh potfile=kexiforms_mapwidgetplugin.pot find_exclude $potfile @@ -9,5 +9,5 @@ if ! grep -q '^#warning noi18n ' $f ; then echo $f; fi \ done \ ` -kexi_xgettext $potfile $LIST +kundo2_aware_xgettext $potfile $LIST rm -f rc.cpp diff --git a/src/plugins/forms/widgets/webbrowser/Messages.sh b/src/plugins/forms/widgets/webbrowser/Messages.sh --- a/src/plugins/forms/widgets/webbrowser/Messages.sh +++ b/src/plugins/forms/widgets/webbrowser/Messages.sh @@ -1,5 +1,5 @@ #! /bin/sh -source ../../../../../kexi_xgettext.sh +source ../../../../../kundo2_aware_xgettext.sh potfile=kexiforms_webbrowserwidgetplugin.pot find_exclude $potfile @@ -9,5 +9,5 @@ if ! grep -q '^#warning noi18n ' $f ; then echo $f; fi \ done \ ` -kexi_xgettext $potfile $LIST +kundo2_aware_xgettext $potfile $LIST rm -f rc.cpp