summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSlávek Banko <[email protected]>2020-05-14 19:13:27 +0200
committerSlávek Banko <[email protected]>2020-05-14 19:13:27 +0200
commit7b46022903dc10e829ac2abff8aeaa60c1e1fd18 (patch)
tree42a56ba79d2acef0ef068d44d07f9fc22230e0fb
parenta7c35253fa86ccaba568822a967af03ea263bbc0 (diff)
downloadscripts-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-xconversions/tde-l10n/tde-l10n_split_desktop153
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"