| #! /bin/sh | |
| . "${srcdir=.}/init.sh"; path_prepend_ . ../src | |
| # Test of gettext facilities in the C# language. | |
| # Assumes an fr_FR locale is installed. | |
| # Assumes the following packages are installed: mono, mcs. | |
| # Note: This test fails when a GNU gettext version < 0.17 is installed with | |
| # the same --prefix as mcs. mcs apparently searches ${prefix}/lib before | |
| # searching the directory specified on the command line: | |
| # $ mcs -out:program.exe -lib:../../gettext-runtime/intl-csharp -reference:GNU.Gettext program.cs | |
| # program.cs(17,45): error CS0117: `GNU.Gettext.GettextResourceManager' does not contain a definition for `GetParticularPluralString' | |
| # /usr/local/lib/GNU.Gettext.dll (Location of the symbol related to previous error) | |
| # program.cs(18,45): error CS0117: `GNU.Gettext.GettextResourceManager' does not contain a definition for `GetParticularString' | |
| # /usr/local/lib/GNU.Gettext.dll (Location of the symbol related to previous error) | |
| # Compilation failed: 2 error(s), 0 warnings | |
| # The workaround is to install GNU gettext with the same --prefix, despite | |
| # the test failure, and run "make check" afterwards. | |
| # Test whether we can build and test C# programs. | |
| test "${CSHARP_CHOICE}" != no || { | |
| echo "Skipping test: configured with --disable-csharp" | |
| Exit 77 | |
| } | |
| test "${BUILDCSHARP}" = yes || { | |
| echo "Skipping test: C# compiler not found" | |
| Exit 77 | |
| } | |
| test "${TESTCSHARP}" = yes || { | |
| echo "Skipping test: C# engine not found" | |
| Exit 77 | |
| } | |
| cat <<\EOF > program.cs | |
| using System; | |
| using GNU.Gettext; | |
| class Program { | |
| static void Main (String[] args) { | |
| #if __MonoCS__ | |
| // Some systems don't set CurrentCulture and CurrentUICulture as specified | |
| // by LC_ALL. So set it by hand. | |
| System.Threading.Thread.CurrentThread.CurrentCulture = | |
| System.Threading.Thread.CurrentThread.CurrentUICulture = | |
| new System.Globalization.CultureInfo("fr-FR"); | |
| #endif | |
| int n = Int32.Parse(args[0]); | |
| GettextResourceManager catalog = new GettextResourceManager("prog"); | |
| Console.WriteLine(catalog.GetString("'Your command, please?', asked the waiter.")); | |
| Console.WriteLine(String.Format(catalog.GetPluralString("a piece of cake","{0} pieces of cake",n), n)); | |
| Console.WriteLine(String.Format(catalog.GetString("{0} is replaced by {1}."), "FF", "EUR")); | |
| Console.WriteLine(String.Format(catalog.GetParticularPluralString("++","a piece of cake","{0} pieces of cake",n), n)); | |
| Console.WriteLine(String.Format(catalog.GetParticularString("++","{0} is replaced by {1}."), "FF", "EUR")); | |
| } | |
| } | |
| EOF | |
| : ${CSHARPCOMP="/bin/sh ../../csharpcomp.sh"} | |
| ${CSHARPCOMP} -o program.exe -L ../../../gettext-runtime/intl-csharp -l GNU.Gettext program.cs || Exit 1 | |
| : ${XGETTEXT=xgettext} | |
| ${XGETTEXT} -o prog.tmp --omit-header --no-location program.cs || Exit 1 | |
| LC_ALL=C tr -d '\r' < prog.tmp > prog.pot || Exit 1 | |
| cat <<EOF > prog.ok | |
| msgid "'Your command, please?', asked the waiter." | |
| msgstr "" | |
| #, csharp-format | |
| msgid "a piece of cake" | |
| msgid_plural "{0} pieces of cake" | |
| msgstr[0] "" | |
| msgstr[1] "" | |
| #, csharp-format | |
| msgid "{0} is replaced by {1}." | |
| msgstr "" | |
| #, csharp-format | |
| msgctxt "++" | |
| msgid "a piece of cake" | |
| msgid_plural "{0} pieces of cake" | |
| msgstr[0] "" | |
| msgstr[1] "" | |
| #, csharp-format | |
| msgctxt "++" | |
| msgid "{0} is replaced by {1}." | |
| msgstr "" | |
| EOF | |
| : ${DIFF=diff} | |
| ${DIFF} prog.ok prog.pot || Exit 1 | |
| cat <<\EOF > 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 garçon." | |
| # Les gateaux allemands sont les meilleurs du monde. | |
| #, csharp-format | |
| msgid "a piece of cake" | |
| msgid_plural "{0} pieces of cake" | |
| msgstr[0] "un morceau de gateau" | |
| msgstr[1] "{0} morceaux de gateau" | |
| # Reverse the arguments. | |
| #, csharp-format | |
| msgid "{0} is replaced by {1}." | |
| msgstr "{1} remplace {0}." | |
| # Euphemistic formulation. | |
| #, csharp-format | |
| msgctxt "++" | |
| msgid "a piece of cake" | |
| msgid_plural "{0} pieces of cake" | |
| msgstr[0] "un morceau de gateau succulent" | |
| msgstr[1] "{0} morceaux de gateau succulent" | |
| # Euphemistic formulation. | |
| #, csharp-format | |
| msgctxt "++" | |
| msgid "{0} is replaced by {1}." | |
| msgstr "Le nouveau {1} remplace le vieux {0}." | |
| EOF | |
| : ${MSGMERGE=msgmerge} | |
| ${MSGMERGE} -q -o fr.po.tmp fr.po prog.pot || Exit 1 | |
| LC_ALL=C tr -d '\r' < fr.po.tmp > fr.po.new || Exit 1 | |
| : ${DIFF=diff} | |
| ${DIFF} fr.po fr.po.new || Exit 1 | |
| : ${MSGFMT=msgfmt} | |
| GETTEXTCSHARPLIBDIR=../../../gettext-runtime/intl-csharp \ | |
| ${MSGFMT} --csharp -d . -r prog -l fr fr.po || Exit 1 | |
| # Test which of the fr_FR locales are installed. | |
| : ${LOCALE_FR=fr_FR} | |
| : ${LOCALE_FR_UTF8=fr_FR.UTF-8} | |
| 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 | |
| Exit 77 | |
| fi | |
| : ${DIFF=diff} | |
| cat <<\EOF > prog.ok | |
| «Votre commande, s'il vous plait», dit le garçon. | |
| 2 morceaux de gateau | |
| EUR remplace FF. | |
| 2 morceaux de gateau succulent | |
| Le nouveau EUR remplace le vieux FF. | |
| EOF | |
| cat <<\EOF > prog.oku | |
| «Votre commande, s'il vous plait», dit le garçon. | |
| 2 morceaux de gateau | |
| EUR remplace FF. | |
| 2 morceaux de gateau succulent | |
| Le nouveau EUR remplace le vieux FF. | |
| EOF | |
| : ${LOCALE_FR=fr_FR} | |
| : ${LOCALE_FR_UTF8=fr_FR.UTF-8} | |
| : ${CSHARPEXEC="/bin/sh ../../csharpexec.sh"} | |
| if test $LOCALE_FR != none; then | |
| # On Mac OS X, with mono 4.2.3, this test would fail, because the Console's | |
| # output encoding is System.Text.Encoding.Default, and this is UTF-8 even | |
| # in the fr_FR.ISO8859-1 locale. System.Text.Encoding.Default is defined | |
| # through InternalCodePage(), which uses g_get_charset(), which uses either | |
| # locale_charset() or nl_langinfo(CODESET) [which is "ISO8859-1" in this case] | |
| # or "UTF-8" - depending on platform or build configuration. So, allow the | |
| # expected result in UTF-8 encoding here too. | |
| prepare_locale_ fr $LOCALE_FR | |
| LANGUAGE= LC_ALL=$LOCALE_FR ${CSHARPEXEC} -L ../../../gettext-runtime/intl-csharp program.exe 2 > prog.out || Exit 1 | |
| ${DIFF} prog.oku prog.out >/dev/null || ${DIFF} prog.ok prog.out || Exit 1 | |
| fi | |
| if test $LOCALE_FR_UTF8 != none; then | |
| prepare_locale_ fr $LOCALE_FR_UTF8 | |
| LANGUAGE= LC_ALL=$LOCALE_FR_UTF8 ${CSHARPEXEC} -L ../../../gettext-runtime/intl-csharp program.exe 2 > prog.out || Exit 1 | |
| ${DIFF} prog.oku prog.out || Exit 1 | |
| fi | |
| Exit 0 |