#! /bin/bash echo "No translation-update-upstream data available. Keeping existing translation." exit 0 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 touch -r LINGUAS translation-update-upstream-tmp-stamp if sed '/^#/d' >LINGUAS fi touch -r translation-update-upstream-tmp-stamp LINGUAS rm translation-update-upstream-tmp-stamp 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." touch -r $OLDPWD/configure.ac translation-update-upstream-tmp-stamp sed -i 's/ALL_LINGUAS="/&'$LNG' /;s/\(ALL_LINGUAS=\)\([^"]\|$\)/\1"'$LNG' "\2/' $OLDPWD/configure.ac touch -r translation-update-upstream-tmp-stamp $OLDPWD/configure.ac rm translation-update-upstream-tmp-stamp fi fi if test -f $OLDPWD/configure.in ; then if grep -q 'ALL_LINGUAS=' $OLDPWD/configure.in ; then echo "Adding $LNG to configure.in." touch -r $OLDPWD/configure.in translation-update-upstream-tmp-stamp sed -i 's/ALL_LINGUAS="/&'$LNG' /;s/\(ALL_LINGUAS=\)\([^"]\|$\)/\1"'$LNG' "\2/' $OLDPWD/configure.in touch -r translation-update-upstream-tmp-stamp $OLDPWD/configure.in rm translation-update-upstream-tmp-stamp fi fi if test -f $OLDPWD/configure ; then if grep -q 'ALL_LINGUAS=' $OLDPWD/configure ; then echo "Adding $LNG to configure." touch -r $OLDPWD/configure translation-update-upstream-tmp-stamp sed -i 's/ALL_LINGUAS="/&'$LNG' /;s/\(ALL_LINGUAS=\)\([^"]\|$\)/\1"'$LNG' "\2/' $OLDPWD/configure touch -r translation-update-upstream-tmp-stamp $OLDPWD/configure rm translation-update-upstream-tmp-stamp 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 USE_INTLTOOL=false if test -f configure.ac ; then if grep PROG_INTLTOOL configure.ac ; then USE_INTLTOOL=true fi fi if test -f configure.in ; then if grep PROG_INTLTOOL configure.in ; then USE_INTLTOOL=true 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 $USE_INTLTOOL ; then if test -z "$DOMAIN" ; then intltool-update --pot else intltool-update --gettext-package=$DOMAIN --pot fi else # Fallback: use xgettext with default options except those that we # cannot guess (it can stil fail, as options can be customized). if test -z "$DOMAIN" ; then ## Ugly hack! intltool could return invalid po, but its ## FindPackageName() can guess domain. Call it to get it. intltool-update --pot for POT in *.pot ; do DOMAIN=${POT%.pot} done fi xgettext --default-domain="$DOMAIN" --directory="$OLDPWD" \ --add-comments=TRANSLATORS: --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=C_:1c,2 --keyword=NC_:1c,2 --keyword=g_dngettext:2,3 --add-comments \ --files-from=./POTFILES.in mv "$DOMAIN.po" "$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. ## In theory, we should call msgmerge here, as the ## imported file might be outdated. But we have to live ## with the fact that the pot file heuristic above ## might be incorrect, and the generated pot file is ## incomplete. Never make things worse, and skip ## msgmerge. Superfluous strings are better than ## deleted strings. ## In time of writing the priginal code, --compendium ## worked around the fact that msgcat prefers empty ## string from the first file over translated string ## from the second file. Now msgcat behaves logically, ## so this step is not needed. #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 if @LIBEXECDIR@/translation-update-upstream/msgheadermerge $PO $PO.new $PO.header --mergemode ; then #msgcat --use-first $PO.header $PO.new2 -o $PO msgcat --use-first $PO.header -o $PO #rm $PO.new $PO.new2 $PO.header rm $PO.new $PO.header else #rm $PO.new $PO.new2 rm $PO.new 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. ## In theory, we should call msgmerge here, as the ## imported file might be outdated. But we have to live ## with the fact that the pot file heuristic above ## might be incorrect, and the generated pot file is ## incomplete. Never make things worse, and skip ## msgmerge. Superfluous strings are better than ## deleted strings. ## In time of writing the priginal code, --compendium ## worked around the fact that msgcat prefers empty ## string from the first file over translated string ## from the second file. Now msgcat behaves logically, ## so this step is not needed. #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 if ! @LIBEXECDIR@/translation-update-upstream/msgheadermerge $PO $PO.new $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 msgcat --use-first $PO.header $PO.new -o $PO #rm $PO.new $PO.new2 $PO.header rm $PO.new $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