diff options
author | Slávek Banko <[email protected]> | 2020-05-14 19:13:27 +0200 |
---|---|---|
committer | Slávek Banko <[email protected]> | 2020-05-14 19:13:27 +0200 |
commit | 7b46022903dc10e829ac2abff8aeaa60c1e1fd18 (patch) | |
tree | 42a56ba79d2acef0ef068d44d07f9fc22230e0fb | |
parent | a7c35253fa86ccaba568822a967af03ea263bbc0 (diff) | |
download | scripts-7b46022903dc10e829ac2abff8aeaa60c1e1fd18.tar.gz scripts-7b46022903dc10e829ac2abff8aeaa60c1e1fd18.zip |
Add a script to prepare desktop files for translation.
Signed-off-by: Slávek Banko <[email protected]>
-rwxr-xr-x | conversions/tde-l10n/tde-l10n_split_desktop | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/conversions/tde-l10n/tde-l10n_split_desktop b/conversions/tde-l10n/tde-l10n_split_desktop new file mode 100755 index 0000000..e9831da --- /dev/null +++ b/conversions/tde-l10n/tde-l10n_split_desktop @@ -0,0 +1,153 @@ +#!/bin/sh + +# default keyword +KEYWORDS="Name GenericName Comment Keywords Description ExtraNames X-TDE-Submenu" + +# parse arguments +while [ $# -gt 0 ]; do + key="$1" + case $key in + -k*) + if [ "${1#-k}" = "" ]; then + KEYWORD="$2" + shift + else + KEYWORD=${1#-k} + fi + if [ "$KEYWORD" = "-" ]; then + KEYWORDS="" + else + KEYWORDS="$KEYWORDS $KEYWORD" + fi + ;; + + -o*) + if [ "${1#-o}" = "" ]; then + POT="$2" + shift + else + POT=${1#-o} + fi + ;; + + *) + [ -f "$1" ] && \ + D+=("$1") + ;; + esac + shift +done + +set -- "${D[@]}" + +if [ -z "$1" ]; then + echo "No desktop file specified for processing. Exiting..." + exit 1 +fi +if [ -z "$KEYWORDS" ]; then + echo "No keywords specified to extract. Exiting..." + exit 1 +fi + +# determine path for translations +TRANSLATIONS_DIR="translations/desktop_files" +if [ -n "`git rev-parse --git-dir 2>/dev/null`" ]; then + TRANSLATIONS_DIR="$(git rev-parse --show-toplevel)/${TRANSLATIONS_DIR}" + APPNAME=$(basename $(git rev-parse --show-toplevel)) +fi + +# determine POT name +if [ -z "$POT" ]; then + if [ $# -gt 1 ]; then + POT="$APPNAME-desktops" + else + POT="$(basename "$1")/" + fi +fi +if [ "${POT%/}" != "${POT}" ]; then + TRANSLATIONS_DIR="$TRANSLATIONS_DIR/${POT%/}" + POT=${POT%/} +fi +if [ "${POT%.pot}" = "${POT}" ]; then + POT=${POT}.pot +fi +[ -d "$TRANSLATIONS_DIR" ] || \ +mkdir -p "$TRANSLATIONS_DIR" + +# prepare keywords to match +KEYWORDS_MATCH="$(echo "$KEYWORDS" | sed -e "s|^ *||" -e "s| *$||" -e "s# \+#\\\\|#g" )" + +# prepare desktop files for xgettext +unset DO +unset DX +while [ $# -gt 0 ]; do + D="$1" + shift + DO="$DO|$D.orig" + DX="$DX|$D.tde_l10n" + + if [ ! -f "$D.orig" ]; then + mv "$D" "$D.orig" + grep -v "^[a-zA-Z][^=]*\[[a-z][^=]*\]" "$D.orig" > "$D" + fi + + # xgettext for desktop files generates a reference to the source file + # one line below the actual position and does not have the option + # to use the variable name as a comment in the POT file. + # That's why we have our own mechanism for extracting strings. + sed \ + -e "s|\"|\\\\\"|g" \ + < $D | \ + sed \ + -e "s#^\($KEYWORDS_MATCH\)[ ]*=[ ]*\(.*\)#/*\1*/i18n(\"\2\");#;t" \ + -e "s|.*||" \ + > $D.tde_l10n +done + +# extract strings +#xgettext --foreign-user -L Desktop -k -k"Name" -k"GenericName" -k"Comment" -k"Keywords" -k"Description" -k"ExtraNames" -k"X-TDE-Submenu" -o - "$D" | \ +echo -n "${DX#|}" | tr "|" "\0" | xargs -r0 \ +xgettext --foreign-user -Cc -ki18n -o - | \ +sed "s|\.tde_l10n||g" | \ +sed "s|Content-Type: text/plain; charset=CHARSET|Content-Type: text/plain; charset=UTF-8|" \ +> "$TRANSLATIONS_DIR/$POT" +POT_HEADER=$(sed -n "1,/^$/p" "$TRANSLATIONS_DIR/$POT") + +# remove temporary files +echo -n "${DX#|}" | tr "|" "\0" | xargs -r0 \ +rm + +# process languages +echo -n "${DO#|}" | tr "|" "\0" | xargs -r0 cat | +sed -n "s|.*\[\([^]]*\)\][ ]*=.*|\1|p" | \ +grep -vx "xx" | \ +sort -u | \ +while read L; do + echo "$POT_HEADER" | sed "s|\(Language: \)|\1$L|" > "$TRANSLATIONS_DIR/$L.po" + echo >> "$TRANSLATIONS_DIR/$L.po" + + # process sections + echo "${DO#|}" | tr "|" "\n" | + while read D; do + sed -n "s|^\[\(.*\)\]$|\1|p" "$D" | \ + while read S; do + # process variables + sed -n "/^\[$S\]/,/^\[/s|^\([^#\[][^\[]*\)\[$L\][ ]*=.*|\1|p" "$D" | \ + while read V; do + MSGID=`sed -n -e "s|\"|\\\\\"|g" -e "/^\[$S\]/,/^\[/s|^$V[ ]*=[ ]*\(.*\)$|msgid \"\1\"|p" "$D"` + if [ -n "$MSGID" ] && [ -z "$(grep -Fx "$MSGID" "$TRANSLATIONS_DIR/$L.po")" ]; then + echo "$MSGID" + sed -n -e "s|\"|\\\\\"|g" -e "/^\[$S\]/,/^\[/s|^$V\[$L\][ ]*=[ ]*\(.*\)$|msgstr \"\1\"|p" "$D" | head -n1 + echo + fi + done >> "$TRANSLATIONS_DIR/$L.po" + done + done + + # update according to template + echo -n "-- $L " + msgmerge --update --backup=none "$TRANSLATIONS_DIR/$L.po" "$TRANSLATIONS_DIR/$POT" +done + +# The LINGUAS file will be generated during build. +#ls "$TRANSLATIONS_DIR" | LANG=C sort | sed -n "s|\.po$||p" > "$TRANSLATIONS_DIR/LINGUAS" |