#! /bin/sh

# Test of gettext facilities in the sh language.
# Assumes an fr_FR locale is installed.
# Assumes the following packages are installed: bash.

# Note: This test fails on BeOS because there all locales use the UTF-8
# encoding, even the locale fr_FR, thus the output comes out in UTF-8.

tmpfiles=""
trap 'rm -fr $tmpfiles' 1 2 3 15

: ${XGETTEXT=../src/xgettext}
: ${MSGMERGE=../src/msgmerge}
: ${MSGFMT=../src/msgfmt}
: ${LOCALE_FR=fr_FR}
: ${LOCALE_FR_UTF8=fr_FR.UTF-8}
: ${DIFF=diff -b}

tmpfiles="$tmpfiles prog.sh"
cat <<\EOF > prog.sh
#! /bin/sh

n=$1

: ${GETTEXT=../../gettext-runtime/src/gettext}
: ${NGETTEXT=../../gettext-runtime/src/ngettext}
: ${ENVSUBST=../../gettext-runtime/src/envsubst}

# Find a way to echo strings without interpreting backslash.
if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
  echo='echo'
else
  if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
    echo='printf %s\n'
  else
    echo_func () {
      cat <<EOT
$*
EOT
    }
    echo='echo_func'
  fi
fi

# eval_gettext MSGID
# looks up the translation of MSGID and substitutes shell variables in the
# result.
eval_gettext () {
  ${GETTEXT} "$1" | (export PATH `${ENVSUBST} --variables "$1"`; ${ENVSUBST} "$1")
}

# eval_ngettext MSGID MSGID-PLURAL COUNT
# looks up the translation of MSGID / MSGID-PLURAL for COUNT and substitutes
# shell variables in the result.
eval_ngettext () {
  ${NGETTEXT} "$1" "$2" "$3" | (export PATH `${ENVSUBST} --variables "$1 $2"`; ${ENVSUBST} "$1 $2")
}

TEXTDOMAIN=prog
export TEXTDOMAIN
TEXTDOMAINDIR=l-sh
export TEXTDOMAINDIR

$echo "`gettext \"'Your command, please?', asked the waiter.\"`"

$echo "`eval_ngettext \"a piece of cake\" \"\\$n pieces of cake\" $n`"
EOF

tmpfiles="$tmpfiles l-sh-prog.tmp l-sh-prog.pot"
${XGETTEXT} -o l-sh-prog.tmp --omit-header --no-location prog.sh
test $? = 0 || { rm -fr $tmpfiles; exit 1; }
LC_ALL=C tr -d '\r' < l-sh-prog.tmp > l-sh-prog.pot
test $? = 0 || { rm -fr $tmpfiles; exit 1; }

tmpfiles="$tmpfiles l-sh-prog.ok"
cat <<\EOF > l-sh-prog.ok
msgid "'Your command, please?', asked the waiter."
msgstr ""

#, sh-format
msgid "a piece of cake"
msgid_plural "$n pieces of cake"
msgstr[0] ""
msgstr[1] ""
EOF

${DIFF} l-sh-prog.ok l-sh-prog.pot || exit 1

tmpfiles="$tmpfiles l-sh-fr.po"
cat <<\EOF > l-sh-fr.po
msgid ""
msgstr ""
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

msgid "'Your command, please?', asked the waiter."
msgstr "Votre commande, s'il vous plait, dit le garon."

# Les gateaux allemands sont les meilleurs du monde.
#, sh-format
msgid "a piece of cake"
msgid_plural "$n pieces of cake"
msgstr[0] "un morceau de gateau"
msgstr[1] "$n morceaux de gateau"
EOF

tmpfiles="$tmpfiles l-sh-fr.po.tmp l-sh-fr.po.new"
${MSGMERGE} -q -o l-sh-fr.po.tmp l-sh-fr.po l-sh-prog.pot
test $? = 0 || { rm -fr $tmpfiles; exit 1; }
LC_ALL=C tr -d '\r' < l-sh-fr.po.tmp > l-sh-fr.po.new
test $? = 0 || { rm -fr $tmpfiles; exit 1; }

${DIFF} l-sh-fr.po l-sh-fr.po.new || exit 1

tmpfiles="$tmpfiles l-sh"
test -d l-sh || mkdir l-sh
test -d l-sh/fr || mkdir l-sh/fr
test -d l-sh/fr/LC_MESSAGES || mkdir l-sh/fr/LC_MESSAGES

${MSGFMT} -o l-sh/fr/LC_MESSAGES/prog.mo l-sh-fr.po

# Test which of the fr_FR locales are installed.
if test $LOCALE_FR != none; then
  LC_ALL=$LOCALE_FR ./testlocale
  case $? in
    0) ;;
    77) LOCALE_FR=none;;
    *) exit 1;;
  esac
fi
if test $LOCALE_FR_UTF8 != none; then
  LC_ALL=$LOCALE_FR_UTF8 ./testlocale
  case $? in
    0) ;;
    77) LOCALE_FR_UTF8=none;;
    *) exit 1;;
  esac
fi
if test $LOCALE_FR = none && test $LOCALE_FR_UTF8 = none; then
  if test -f /usr/bin/localedef; then
    echo "Skipping test: no french locale is installed"
  else
    echo "Skipping test: no french locale is supported"
  fi
  rm -fr $tmpfiles; exit 77
fi

tmpfiles="$tmpfiles l-sh-prog.ok l-sh-prog.oku l-sh-prog.out"
cat <<\EOF > l-sh-prog.ok
Votre commande, s'il vous plait, dit le garon.
2 morceaux de gateau
EOF
cat <<\EOF > l-sh-prog.oku
«Votre commande, s'il vous plait», dit le garçon.
2 morceaux de gateau
EOF

if test $LOCALE_FR != none; then
  LANGUAGE= LC_ALL=$LOCALE_FR sh ./prog.sh 2 > l-sh-prog.out || exit 1
  ${DIFF} l-sh-prog.ok l-sh-prog.out || exit 1
fi
if test $LOCALE_FR_UTF8 != none; then
  LANGUAGE= LC_ALL=$LOCALE_FR_UTF8 sh ./prog.sh 2 > l-sh-prog.out || exit 1
  ${DIFF} l-sh-prog.oku l-sh-prog.out || exit 1
fi

rm -fr $tmpfiles

exit 0
