File indexing completed on 2024-03-24 16:39:31

0001 #
0002 # Helper function for extracting translatable messages from Calligra/Krita/Kexi source code.
0003 # Usage: kundo2_aware_xgettext <pot-filename-without-path> <source-files-list>
0004 # If there are no messages or the <source-files-list> is empty, the pot file is deleted.
0005 #
0006 # Example usage that creates $podir/myapp.pot file:
0007 #     kundo2_aware_xgettext myapp.pot `find . -name \*.cpp -o -name \*.h`
0008 #
0009 function kundo2_aware_xgettext() {
0010     POTFILE="$podir/$1"
0011     shift
0012     if test -n "$*"; then
0013         # we rely on last line being a 'msgstr' signaling that strings has been extracted (a header is always present)
0014         # normally it ends with 'msgstr ""' but if plural it can end with eg 'msgstr[1] ""'
0015         kundo2_aware_xgettext_internal $* | tee "${POTFILE}" | tail -n1 | grep "^msgstr" > /dev/null \
0016             || rm -f "${POTFILE}" 2> /dev/null
0017     fi
0018 }
0019 
0020 # How to unit test:
0021 #   export podir=.
0022 #   cp init-sample.pot sample.pot
0023 #   source krita_xgettext.sh
0024 #   add_ctxt_qtundo sample.pot
0025 #
0026 #   Then check that all messages in sample.pot have "(qtundo-format)" in msgctxt.
0027 function add_ctxt_qtundo() {
0028     POT_PART_QUNDOFORMAT="$1"
0029     POT_PART_QUNDOFORMAT2="`mktemp "$podir"/_qundoformat2_XXXXXXXX.pot`"
0030 
0031     # Prepend "(qtundo-format)" to existing msgctxt properties of messages
0032     sed -i -e 's/^msgctxt "/msgctxt "(qtundo-format) /' "${POT_PART_QUNDOFORMAT}"
0033 
0034     # Add msgctxt "(qtundo-format)" to messages not having msgctxt yet
0035     #
0036     # lastLine != "#, fuzzy" is the check for the .pot header.
0037     # If lastLine starts with '"' the msgctxt has been split on several lines and is treated by sed above, so skip it
0038     mv "${POT_PART_QUNDOFORMAT}" "${POT_PART_QUNDOFORMAT2}"
0039     cat "${POT_PART_QUNDOFORMAT2}" | awk '
0040         /^msgid "/ {
0041             if (lastLine !~ /^"/ && lastLine !~ /^msgctxt/ && lastLine != "#, fuzzy") {
0042                 print "msgctxt \"(qtundo-format)\""
0043             }
0044         }
0045         { print ; lastLine = $0 }' > "${POT_PART_QUNDOFORMAT}"
0046 
0047     rm -f "${POT_PART_QUNDOFORMAT2}"
0048 }
0049 
0050 function kundo2_aware_xgettext_internal() {
0051     SRC_FILES="$*"
0052     POT_PART_NORMAL="`mktemp "$podir"/_normal_XXXXXXXX.pot`"
0053     POT_PART_QUNDOFORMAT="`mktemp "$podir"/_qundoformat_XXXXXXXX.pot`"
0054     POT_MERGED="`mktemp "$podir"/_merged_XXXXXXXX.pot`"
0055 
0056     $XGETTEXT ${CXG_EXTRA_ARGS} ${SRC_FILES} -o "${POT_PART_NORMAL}" --force-po
0057 
0058     XGETTEXT_FLAGS_KUNDO2="\
0059 --copyright-holder=This_file_is_part_of_KDE \
0060 --msgid-bugs-address=http://bugs.kde.org \
0061 --from-code=UTF-8
0062 -C -k --kde \
0063 -kkundo2_i18n:1 -kkundo2_i18np:1,2 -kkundo2_i18nc:1c,2 -kkundo2_i18ncp:1c,2,3 \
0064 "
0065 
0066     $XGETTEXT_PROGRAM ${XGETTEXT_FLAGS_KUNDO2} ${CXG_EXTRA_ARGS} ${SRC_FILES} -o "${POT_PART_QUNDOFORMAT}"
0067 
0068     if [ $(cat "${POT_PART_NORMAL}" "${POT_PART_QUNDOFORMAT}" | grep -c \(qtundo-format\)) != 0 ]; then
0069         echo "ERROR: Context '(qtundo-format)' should not be added manually. Use kundo2_i18n*() calls instead." 1>&2
0070         exit 17
0071     fi
0072 
0073     if [ -s "${POT_PART_QUNDOFORMAT}" ]; then
0074         add_ctxt_qtundo "${POT_PART_QUNDOFORMAT}"
0075     fi
0076 
0077     if [ -s "${POT_PART_NORMAL}" -a -s "${POT_PART_QUNDOFORMAT}" ]; then
0078         # ensure an empty line or else KDE_HEADER search will fail
0079         # in case POT_PART_NORMAL only contains header
0080         echo "" >>"${POT_PART_NORMAL}"
0081         
0082         ${MSGCAT} -F "${POT_PART_NORMAL}" "${POT_PART_QUNDOFORMAT}" > "${POT_MERGED}"
0083         MERGED_HEADER_LINE_COUNT=$(cat "${POT_MERGED}" | grep "^$" -B 100000 --max-count=1 | wc -l)
0084         KDE_HEADER="$(cat "${POT_PART_NORMAL}" | grep "^$" -B 100000 --max-count=1)"
0085         MERGED_TAIL="$(cat "${POT_MERGED}" | tail -n +$MERGED_HEADER_LINE_COUNT)"
0086 
0087         # Print out the resulting .pot
0088         echo "$KDE_HEADER"
0089         echo "$MERGED_TAIL"
0090     elif [ -s "${POT_PART_NORMAL}" ]; then
0091         echo "# POT_PART_NORMAL only"
0092         cat "${POT_PART_NORMAL}"
0093     elif [ -s "${POT_PART_QUNDOFORMAT}" ]; then
0094         echo "# POT_PART_QUNDOFORMAT only"
0095         cat "${POT_PART_QUNDOFORMAT}"
0096     fi
0097 
0098     rm -f "${POT_PART_NORMAL}" "${POT_PART_QUNDOFORMAT}" "${POT_MERGED}"
0099 }
0100 
0101 # Sets EXCLUDE variable to excludes compatible with the find(1) command, e.g. '-path a -o -path b'.
0102 # To unconditionally exclude dir (with subdirs) just put an empty file .i18n in it.
0103 # To disable excluding for given file, e.g. foo.pot, add "foo.pot" line to the .i18n file.
0104 function find_exclude() {
0105     EXCLUDE=""
0106     for f in `find . -name .i18n | sed 's/\/\.i18n$//g' | sort`; do
0107         if ! grep -q "^${1}$" "$f/.i18n" ; then
0108             if [ -n "$EXCLUDE" ] ; then EXCLUDE="$EXCLUDE -o " ; fi
0109             EXCLUDE="$EXCLUDE -path $f"
0110         fi
0111     done
0112     if [ -z "$EXCLUDE" ] ; then EXCLUDE="-path __dummy__" ; fi # needed because -prune in find needs args
0113 }