~ubuntu-branches/debian/sid/kexi/sid

« back to all changes in this revision

Viewing changes to kundo2_aware_xgettext.sh

  • Committer: Package Import Robot
  • Author(s): Pino Toscano
  • Date: 2017-06-24 20:10:10 UTC
  • Revision ID: package-import@ubuntu.com-20170624201010-5lrzd5r2vwthwifp
Tags: upstream-3.0.1.1
ImportĀ upstreamĀ versionĀ 3.0.1.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#
 
2
# Helper function for extracting translatable messages from Calligra/Krita/Kexi source code.
 
3
# Usage: kundo2_aware_xgettext <pot-filename-without-path> <source-files-list>
 
4
# If there are no messages or the <source-files-list> is empty, the pot file is deleted.
 
5
#
 
6
# Example usage that creates $podir/myapp.pot file:
 
7
#     kundo2_aware_xgettext myapp.pot `find . -name \*.cpp -o -name \*.h`
 
8
#
 
9
function kundo2_aware_xgettext() {
 
10
    POTFILE="$podir/$1"
 
11
    shift
 
12
    if test -n "$*"; then
 
13
        # we rely on last line being a 'msgstr' signaling that strings has been extracted (a header is always present)
 
14
        # normally it ends with 'msgstr ""' but if plural it can end with eg 'msgstr[1] ""'
 
15
        kundo2_aware_xgettext_internal $* | tee "${POTFILE}" | tail -n1 | grep "^msgstr" > /dev/null \
 
16
            || rm -f "${POTFILE}" 2> /dev/null
 
17
    fi
 
18
}
 
19
 
 
20
# How to unit test:
 
21
#   export podir=.
 
22
#   cp init-sample.pot sample.pot
 
23
#   source krita_xgettext.sh
 
24
#   add_ctxt_qtundo sample.pot
 
25
#
 
26
#   Then check that all messages in sample.pot have "(qtundo-format)" in msgctxt.
 
27
function add_ctxt_qtundo() {
 
28
    POT_PART_QUNDOFORMAT="$1"
 
29
    POT_PART_QUNDOFORMAT2="`mktemp $podir/_qundoformat2_XXXXXXXX.pot`"
 
30
 
 
31
    # Prepend "(qtundo-format)" to existing msgctxt properties of messages
 
32
    sed -i -e 's/^msgctxt "/msgctxt "(qtundo-format) /' "${POT_PART_QUNDOFORMAT}"
 
33
 
 
34
    # Add msgctxt "(qtundo-format)" to messages not having msgctxt yet
 
35
    #
 
36
    # lastLine != "#, fuzzy" is the check for the .pot header.
 
37
    # If lastLine starts with '"' the msgctxt has been split on several lines and is treated by sed above, so skip it
 
38
    mv "${POT_PART_QUNDOFORMAT}" "${POT_PART_QUNDOFORMAT2}"
 
39
    cat "${POT_PART_QUNDOFORMAT2}" | awk '
 
40
        /^msgid "/ {
 
41
            if (lastLine !~ /^\"/ && lastLine !~ /^msgctxt/ && lastLine != "#, fuzzy") {
 
42
                print "msgctxt \"(qtundo-format)\""
 
43
            }
 
44
        }
 
45
        { print ; lastLine = $0 }' > "${POT_PART_QUNDOFORMAT}"
 
46
 
 
47
    rm -f "${POT_PART_QUNDOFORMAT2}"
 
48
}
 
49
 
 
50
function kundo2_aware_xgettext_internal() {
 
51
    SRC_FILES="$*"
 
52
    POT_PART_NORMAL="`mktemp $podir/_normal_XXXXXXXX.pot`"
 
53
    POT_PART_QUNDOFORMAT="`mktemp $podir/_qundoformat_XXXXXXXX.pot`"
 
54
    POT_MERGED="`mktemp $podir/_merged_XXXXXXXX.pot`"
 
55
 
 
56
    $XGETTEXT ${CXG_EXTRA_ARGS} ${SRC_FILES} -o "${POT_PART_NORMAL}" --force-po
 
57
 
 
58
    XGETTEXT_FLAGS_KUNDO2="\
 
59
--copyright-holder=This_file_is_part_of_KDE \
 
60
--msgid-bugs-address=http://bugs.kde.org \
 
61
--from-code=UTF-8
 
62
-C -k --kde \
 
63
-kkundo2_i18n:1 -kkundo2_i18np:1,2 -kkundo2_i18nc:1c,2 -kkundo2_i18ncp:1c,2,3 \
 
64
"
 
65
 
 
66
    $XGETTEXT_PROGRAM ${XGETTEXT_FLAGS_KUNDO2} ${CXG_EXTRA_ARGS} ${SRC_FILES} -o "${POT_PART_QUNDOFORMAT}"
 
67
 
 
68
    if [ $(cat ${POT_PART_NORMAL} ${POT_PART_QUNDOFORMAT} | grep -c \(qtundo-format\)) != 0 ]; then
 
69
        echo "ERROR: Context '(qtundo-format)' should not be added manually. Use kundo2_i18n*() calls instead." 1>&2
 
70
        exit 17
 
71
    fi
 
72
 
 
73
    if [ -s "${POT_PART_QUNDOFORMAT}" ]; then
 
74
        add_ctxt_qtundo "${POT_PART_QUNDOFORMAT}"
 
75
    fi
 
76
 
 
77
    if [ -s "${POT_PART_NORMAL}" -a -s "${POT_PART_QUNDOFORMAT}" ]; then
 
78
        # ensure an empty line or else KDE_HEADER search will fail
 
79
        # in case POT_PART_NORMAL only contains header
 
80
        echo "" >>${POT_PART_NORMAL}
 
81
        
 
82
        ${MSGCAT} -F "${POT_PART_NORMAL}" "${POT_PART_QUNDOFORMAT}" > ${POT_MERGED}
 
83
        MERGED_HEADER_LINE_COUNT=$(cat ${POT_MERGED} | grep "^$" -B 100000 --max-count=1 | wc -l)
 
84
        KDE_HEADER="$(cat ${POT_PART_NORMAL} | grep "^$" -B 100000 --max-count=1)"
 
85
        MERGED_TAIL="$(cat ${POT_MERGED} | tail -n +$MERGED_HEADER_LINE_COUNT)"
 
86
 
 
87
        # Print out the resulting .pot
 
88
        echo "$KDE_HEADER"
 
89
        echo "$MERGED_TAIL"
 
90
    elif [ -s "${POT_PART_NORMAL}" ]; then
 
91
        echo "# POT_PART_NORMAL only"
 
92
        cat "${POT_PART_NORMAL}"
 
93
    elif [ -s "${POT_PART_QUNDOFORMAT}" ]; then
 
94
        echo "# POT_PART_QUNDOFORMAT only"
 
95
        cat "${POT_PART_QUNDOFORMAT}"
 
96
    fi
 
97
 
 
98
    rm -f "${POT_PART_NORMAL}" "${POT_PART_QUNDOFORMAT}" "${POT_MERGED}"
 
99
}
 
100
 
 
101
# Sets EXCLUDE variable to excludes compatible with the find(1) command, e.g. '-path a -o -path b'.
 
102
# To unconditionally exclude dir (with subdirs) just put an empty file .i18n in it.
 
103
# To disable excluding for given file, e.g. foo.pot, add "foo.pot" line to the .i18n file.
 
104
function find_exclude() {
 
105
    EXCLUDE=""
 
106
    for f in `find . -name .i18n | sed 's/\/\.i18n$//g' | sort`; do
 
107
        if ! grep -q "^${1}$" "$f/.i18n" ; then
 
108
            if [ -n "$EXCLUDE" ] ; then EXCLUDE="$EXCLUDE -o " ; fi
 
109
            EXCLUDE="$EXCLUDE -path $f"
 
110
        fi
 
111
    done
 
112
    if [ -z "$EXCLUDE" ] ; then EXCLUDE="-path __dummy__" ; fi # needed because -prune in find needs args
 
113
}