#! /bin/bash set -o errexit shopt -s nullglob if test "$1" = "--help" ; then echo "Upstream translation update tool works in top directory of unpacked source code." echo "Usage: $0 [translation_directory] [translation_domain] [command to create pot file]" fi # Update all known mechanisms to add language: function linguas_update { if test -f LINGUAS -o -f ../po/LINGUAS ; then if test -f LINGUAS ; then if sed '/^#/d' >LINGUAS fi else echo "Not adding $LNG to LINGUAS - secondary domain, global LINGUAS." fi else if test -f $OLDPWD/configure.ac ; then if grep -q 'ALL_LINGUAS=' $OLDPWD/configure.ac ; then echo "Adding $LNG to configure.ac." sed -i 's/ALL_LINGUAS="/&'$LNG' /;s/\(ALL_LINGUAS=\)\([^"]\|$\)/\1"'$LNG' "\2/' $OLDPWD/configure.ac fi fi if test -f $OLDPWD/configure.in ; then if grep -q 'ALL_LINGUAS=' $OLDPWD/configure.in ; then echo "Adding $LNG to configure.in." sed -i 's/ALL_LINGUAS="/&'$LNG' /;s/\(ALL_LINGUAS=\)\([^"]\|$\)/\1"'$LNG' "\2/' $OLDPWD/configure.in fi fi if test -f $OLDPWD/configure ; then if grep -q 'ALL_LINGUAS=' $OLDPWD/configure ; then echo "Adding $LNG to configure." sed -i 's/ALL_LINGUAS="/&'$LNG' /;s/\(ALL_LINGUAS=\)\([^"]\|$\)/\1"'$LNG' "\2/' $OLDPWD/configure fi fi fi } DOMAIN=$2 USE_MESON=false if test -f meson.build -a ! \( -f ${1:-po}/Makefile.in.in -o -f ${1:-po}/Makefile.in -o -f ${1:-po}/Makefile \) ; then echo "Switching to meson style pot file extraction." >&2 USE_MESON=true if test -z "$DOMAIN" ; then MESON_PROJECT="$(sed -n "/^project(/,+1{1{h;d};2{x;G}};s/^project[[:space:]]*([[:space:]]*'\([^']*\)'.*/\1/p" &2 exit 1 fi fi fi fi DIR=${1:-po} if test -z "$3" ; then if $USE_MESON ; then if test -f POTFILES ; then POTFILES="$PWD/${1:-po}/POTFILES" else POTFILES="$PWD/${1:-po}/POTFILES.in" fi xgettext --package-name="$DOMAIN"\ -p "$PWD" -f "$POTFILES" -D "$PWD"\ -k_ -o "$PWD/${1:-po}/$DOMAIN.pot"\ --keyword=NC_:1c,2\ --flag=g_strdup_printf:1:c-format\ --flag=g_set_error:4:c-format\ --flag=g_dngettext:2:pass-c-format\ --flag=g_string_printf:2:c-format\ --add-comments\ --from-code=UTF-8\ --keyword=C_:1c,2\ --flag=N_:1:pass-c-format\ --flag=g_string_append_printf:2:c-format\ --flag=C_:2:pass-c-format\ --keyword=N_\ --flag=g_error_new:3:c-format\ --flag=NC_:2:pass-c-format\ --keyword=g_dngettext:2,3\ --keyword=g_dpgettext2:2c,3\ --keyword=_\ --keyword=g_dcgettext:2 cd $DIR else cd $DIR if test -z "$DOMAIN" ; then intltool-update --pot else intltool-update --gettext-package=$DOMAIN --pot fi fi else eval $3 fi POT_NOT_UNIQUE=false NO_POT=true for POT in *.pot ; do MISSING=true if $POT_NOT_UNIQUE ; then echo "ERROR: Directory $DIR contains more than one .pot file." exit 1 fi POT_NOT_UNIQUE=true DOMAIN=${POT%.pot} # STRING_COLLECT_MODE is a special mode used during string # collection. STRING_COLLECT_DIR must be set as well. if test "$STRING_COLLECT_MODE" = 1 ; then mkdir $STRING_COLLECT_DIR/$DOMAIN cp -a $POT $STRING_COLLECT_DIR/$DOMAIN cp -a *.po $STRING_COLLECT_DIR/$DOMAIN else if test -d @DATADIR@/translation-update-upstream ; then if test -d @DATADIR@/translation-update-upstream/po/$DOMAIN ; then for PO_PATH in @DATADIR@/translation-update-upstream/po/$DOMAIN/*.po ; do PO=${PO_PATH##*/} LNG=${PO%.po} if test -f $PO ; then if test "$SKIP_TUU" = true ; then echo "SKIP_TUU is set. Skipping update of $PO." continue fi echo "Updating $PO using translation-update-upstream." echo "(You can skip update by setting environment variable SKIP_TUU=true.)" # PO_PATH is first: Update any string, even if it was already translated. # Swap $PO_PATH and $PO to disable this behavior. msgcat --use-first $PO_PATH $PO -o $PO.new # Return .po file notes that are not present in the update file. msgmerge --no-fuzzy-matching --compendium=$PO_PATH -o $PO.new2 $PO.new $POT # And finally, synthesize header that not change every time. if @LIBEXECDIR@/translation-update-upstream/msgheadermerge $PO $PO.new2 $PO.header --mergemode ; then msgcat --use-first $PO.header $PO.new2 -o $PO rm $PO.new $PO.new2 $PO.header else rm $PO.new $PO.new2 echo "WARNING: Update of $PO for $DOMAIN is older than data in package. Skipping." fi else echo "Adding $PO from translation-update-upstream." cp -a $PO_PATH $PO linguas_update fi done MISSING=false fi if test -d @DATADIR@/translation-update-upstream/po-mandatory/$DOMAIN ; then for PO_PATH in @DATADIR@/translation-update-upstream/po-mandatory/$DOMAIN/*.po ; do PO=${PO_PATH##*/} LNG=${PO%.po} if test -f $PO ; then if test "$SKIP_TUU" = true ; then echo "SKIP_TUU is set. Skipping update of $PO." continue fi echo "Updating $PO using translation-update-upstream mandatory source." echo "(You can skip update by setting environment variable SKIP_TUU=true.)" # PO_PATH is first: Update any string, even if it was already translated. # Swap $PO_PATH and $PO to disable this behavior. msgcat --use-first $PO_PATH $PO -o $PO.new # Return .po file notes that are not present in the update file. msgmerge --no-fuzzy-matching --compendium=$PO_PATH -o $PO.new2 $PO.new $POT # And finally, synthesize header that not change every time. if ! @LIBEXECDIR@/translation-update-upstream/msgheadermerge $PO $PO.new2 $PO.header --mergemode --continue ; then echo "WARNING: Mandatory update of $PO for $DOMAIN is older than data in package or upstream snapshot. Using anyway!" fi msgcat --use-first $PO.header $PO.new2 -o $PO rm $PO.new $PO.new2 $PO.header else echo "Adding $PO from translation-update-upstream mandatory source." cp -a $PO_PATH $PO linguas_update fi done MISSING=false fi if $MISSING ; then echo "WARNING: Missing $DOMAIN in translation-update-upstream configuration! No updates available." fi else echo "ERROR: Package translation-update-upstream is not installed. Please update your BuildRequires!" exit 1 fi fi NO_POT=false done if $NO_POT ; then echo "ERROR: Pot file was not created. Please fix or set command line arguments properly!" exit 1 fi