#!/bin/sh
# Shell script to download the latest translations for a given GStreamer
# package from translationproject.org


# DOMAINS based on http://translationproject.org/extra/matrix.html
# We need to check all domains, not only po/LINGUAS, since there might be
# new translations
DOMAINS=\
"af am ar az be bg pt_BR bs ca zh_CN cs cy da de el eo es et eu fa fi fr "\
"ga en_GB gl gu he hi zh_HK hr hu id is it ja ko ku ky lg lt lv mk mn ms "\
"mt nb ne nl nn or pa pl pt rm ro ru rw sk sl sq sr sv ta tq th tk "\
"tr zh_TW uk ven vi wa xh zu"

# for testing/debugging:
#DOMAINS="es fr hu sv pl xx"

# check for 'diff' program
diff --version 2>/dev/null >/dev/null
if [ ! $? ]; then
  echo "==== You must have the 'diff' program installed for this script ===="
  exit 1
fi

# check for 'wget' program
wget --version 2>/dev/null >/dev/null
if [ ! $? ]; then
  echo "==== You must have the 'wget' program installed for this script ===="
  exit 1
fi

# make sure we're in the top-level directory
if [ ! -d ./po ]; then
  echo "==== No ./po directory in the current working directory ===="
  exit 1
fi

# make sure a package argument was passed to us
if [ -z "$1" ]; then
  echo "Usage: $0 PACKAGE, e.g. $0 gst-plugins-good"
  exit 1
fi

if test "$1" != "gstreamer" -a \
        "$1" != "gst-plugins-base" -a \
        "$1" != "gst-plugins-good" -a \
        "$1" != "gst-plugins-ugly" -a \
        "$1" != "gst-plugins-bad"; then
  echo "Unexpected package '$1' ?!"
  exit 1
fi

PACKAGE="$1"

DOMAINS_TO_ADD=""
DOMAINS_UPDATED=""
DOMAINS_NOT_IN_LINGUAS=""

echo "Downloading latest translation files for package $PACKAGE ..."
echo

for d in $DOMAINS
do
  PACKAGE_PO_URL_BASE="http://translationproject.org/latest/$PACKAGE"
  PO_URL="$PACKAGE_PO_URL_BASE/$d.po"
  PO_FILENAME="$PACKAGE.$d.po"
  if wget -q -nc -O $PO_FILENAME $PO_URL; then
    # we want all .po files in UTF-8 format really, so convert if needed..
    CHARSET=`grep Content-Type $PO_FILENAME | sed -e 's/.*charset=\(.*\)\\\\n.*/\1/'`
    if test "x$CHARSET" != "xUTF-8" -a "x$CHARSET" != "xutf-8"; then
      # note: things like the bugs address will be added back by make update-po
      if msguniq $PO_FILENAME --no-location \
                              --output-file=$PO_FILENAME.utf8 \
                              --to-code=UTF-8; then
        mv $PO_FILENAME.utf8 $PO_FILENAME
      else
        echo "**** $d: conversion from $CHARSET to UTF-8 failed ****"
      fi
    fi
    if [ -f "po/$d.po" ]; then
      # ./po/foo.po exists, so let's check if ours matches the latest from the
      # translation project website
      REVDATE_NEW=`grep PO-Revision-Date $PO_FILENAME`;
      REVDATE_OLD=`grep PO-Revision-Date po/$d.po`;
      CHARSET_OLD=`grep Content-Type po/$d.po | sed -e 's/.*charset=\(.*\)\\\\n.*/\1/'`
      if test "x$REVDATE_NEW" = "x$REVDATE_OLD" -a "x$CHARSET_OLD" = "xUTF-8"; then
        # note: source code line markers will be removed later by make upload-po
        echo "$d.po: up-to-date"
        rm -f $PO_FILENAME
      else
        mv $PO_FILENAME "po/$d.po"
        if test "x$CHARSET_OLD" != "xUTF-8" -a "x$CHARSET_OLD" != "xutf-8"; then
          echo "$d.po: update (and charset converted from $CHARSET_OLD to UTF-8)"
        else
          echo "$d.po: updated"
        fi
        DOMAINS_UPDATED="$DOMAINS_UPDATED $d"
      fi
      # make sure domain is listed in LINGUAS
      if ! grep $d "po/LINGUAS" >/dev/null 2>/dev/null; then
        DOMAINS_NOT_IN_LINGUAS="$DOMAINS_NOT_IN_LINGUAS $d"
      fi
    else
      # ./po/foo.po doesn't exist, but foo.po exists on the translation project
      # website, so it's probably a new translation
      echo "$d.po: new language"
      mv $PO_FILENAME "po/$d.po"
      DOMAINS_UPDATED="$DOMAINS_UPDATED $d"
      DOMAINS_TO_ADD="$DOMAINS_TO_ADD $d"
    fi
  else
    rm -f $PO_FILENAME
    echo "$d.po: failure (does probably not exist)"
  fi
done

if [ -n "$DOMAINS_UPDATED" ]; then
  echo "===================================================================="
  echo
  echo "Language domains updated    :$DOMAINS_UPDATED"
  echo "Language domains to git add :$DOMAINS_TO_ADD"
  echo
  echo "Source: http://translationproject.org/latest/$PACKAGE/"
  echo
  if [ -n "$DOMAINS_TO_ADD" ]; then
    CMD_STRING="git add"
    for d in $DOMAINS_TO_ADD; do
      CMD_STRING="$CMD_STRING po/$d.po"
    done
    echo "Please run"
    echo
    echo "  $CMD_STRING"
    echo
    echo "now and add the following domains to the po/LINGUAS file:"
    echo
    echo "  $DOMAINS_TO_ADD"
    echo
    echo
  fi
  echo "===================================================================="
fi

if [ -n "$DOMAINS_NOT_IN_LINGUAS" ]; then
  echo
  echo "Existing domains missing from the po/LINGUAS file:"
  echo
  echo "  $DOMAINS_NOT_IN_LINGUAS"
  echo
  echo
fi


