From: Bruno Haible Date: Sat, 8 Mar 2025 12:19:41 +0000 (+0100) Subject: examples: Add hello-go example. X-Git-Tag: v0.25~92 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5ebaafda3a562e6adcad3fb4d311944af0acf910;p=thirdparty%2Fgettext.git examples: Add hello-go example. * gettext-tools/examples/hello-go/INSTALL: New file. * gettext-tools/examples/hello-go/autogen.sh: New file. * gettext-tools/examples/hello-go/autoclean.sh: New file. * gettext-tools/examples/hello-go/example1/hello1sl.go.in: New file. * gettext-tools/examples/hello-go/example1/hello1ml.go.in: New file. * gettext-tools/examples/hello-go/example1/go.mod.in: New file. * gettext-tools/examples/hello-go/example1/Makefile.am: New file. * gettext-tools/examples/hello-go/example2/hello2sl.go.in: New file. * gettext-tools/examples/hello-go/example2/go.mod.in: New file. * gettext-tools/examples/hello-go/example2/Makefile.am: New file. * gettext-tools/examples/hello-go/example3/hello3ml.go.in: New file. * gettext-tools/examples/hello-go/example3/go.mod.in: New file. * gettext-tools/examples/hello-go/example3/Makefile.am: New file. * gettext-tools/examples/hello-go/Makefile.am: New file. * gettext-tools/examples/hello-go/configure.ac: New file. * gettext-tools/examples/hello-go/m4/Makefile.am: New file. * gettext-tools/examples/hello-go/po/LINGUAS: New file. * gettext-tools/examples/hello-go/po/Makefile.am: New file. * gettext-tools/examples/Makefile.am (EXAMPLESFILES, EXAMPLESDIRS): Add hello-go. * gettext-tools/examples/po/Makefile.am (POTFILES, SMALLPOTS): Update for hello-go. (hello-go.pot): New target. (SMALLPOFILES_FOR_lang): Update for hello-go. ($(srcdir)/../hello-go/po/$(LL).po): New rule. * gettext-tools/examples/check-examples (func_check_autoclean_all, func_check_distclean_all, func_check_maintainerclean_all, func_check_maintainerclean_vpath_all, func_check_dist_all, func_check_dist_vpath_all, func_check_install_all, func_check_uninstall_all, func_check_distcheck_all, func_check_all): Handle hello-go as well. * gettext-tools/examples/README: Mention hello-go. * gettext-tools/doc/lang-go.texi: Likewise. * NEWS: Likewise. --- diff --git a/NEWS b/NEWS index 9a2d88ce7..7da77187c 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ Version 0.25 - March 2025 - xgettext now supports Go. - 'msgfmt -c' now verifies the syntax of translations of Go format strings. + - A new example 'hello-go' has been added. Version 0.24 - February 2025 diff --git a/gettext-tools/doc/lang-go.texi b/gettext-tools/doc/lang-go.texi index fe7ea2adc..2f5e659d8 100644 --- a/gettext-tools/doc/lang-go.texi +++ b/gettext-tools/doc/lang-go.texi @@ -249,3 +249,5 @@ fully portable @item po-mode marking --- @end table + +An example is available in the @file{examples} directory: @code{hello-go}. diff --git a/gettext-tools/examples/Makefile.am b/gettext-tools/examples/Makefile.am index 82ceeadb3..2cd7b4df5 100644 --- a/gettext-tools/examples/Makefile.am +++ b/gettext-tools/examples/Makefile.am @@ -335,6 +335,24 @@ EXAMPLESFILES = \ hello-rust/m4/Makefile.am \ hello-rust/po/Makefile.am \ \ + hello-go/INSTALL \ + hello-go/autogen.sh \ + hello-go/autoclean.sh \ + hello-go/example1/hello1sl.go.in \ + hello-go/example1/hello1ml.go.in \ + hello-go/example1/go.mod \ + hello-go/example1/Makefile.am \ + hello-go/example2/hello2sl.go.in \ + hello-go/example2/go.mod \ + hello-go/example2/Makefile.am \ + hello-go/example3/hello3ml.go.in \ + hello-go/example3/go.mod \ + hello-go/example3/Makefile.am \ + hello-go/Makefile.am \ + hello-go/configure.ac \ + hello-go/m4/Makefile.am \ + hello-go/po/Makefile.am \ + \ hello-ruby/INSTALL \ hello-ruby/autogen.sh \ hello-ruby/autoclean.sh \ @@ -456,6 +474,7 @@ EXAMPLESDIRS = \ hello-clisp \ hello-librep \ hello-rust \ + hello-go \ hello-ruby \ hello-sh \ hello-gawk \ diff --git a/gettext-tools/examples/README b/gettext-tools/examples/README index 8505cef68..68af328b8 100644 --- a/gettext-tools/examples/README +++ b/gettext-tools/examples/README @@ -30,6 +30,7 @@ environment. hello-clisp Lisp hello-librep librep hello-rust Rust + hello-go Go hello-ruby Ruby hello-sh Shell hello-gawk awk @@ -75,6 +76,7 @@ Makefile types: hello-clisp .gmo Makefile.am hello-librep .gmo Makefile.am hello-rust .gmo Makefile.am + hello-go .gmo Makefile.am hello-ruby .gmo Makefile.am hello-sh .gmo Makefile.am hello-gawk .gmo Makefile.am diff --git a/gettext-tools/examples/check-examples b/gettext-tools/examples/check-examples index c0ff1db87..4cd8029c4 100755 --- a/gettext-tools/examples/check-examples +++ b/gettext-tools/examples/check-examples @@ -153,6 +153,7 @@ func_check_autoclean_all () func_check_autoclean hello-clisp func_check_autoclean hello-librep func_check_autoclean hello-rust + func_check_autoclean hello-go func_check_autoclean hello-ruby func_check_autoclean hello-sh func_check_autoclean hello-gawk @@ -229,6 +230,7 @@ func_check_distclean_all () func_check_distclean hello-clisp func_check_distclean hello-librep func_check_distclean hello-rust + func_check_distclean hello-go func_check_distclean hello-ruby func_check_distclean hello-sh func_check_distclean hello-gawk @@ -307,6 +309,7 @@ func_check_maintainerclean_all () func_check_maintainerclean hello-clisp func_check_maintainerclean hello-librep func_check_maintainerclean hello-rust + func_check_maintainerclean hello-go func_check_maintainerclean hello-ruby func_check_maintainerclean hello-sh func_check_maintainerclean hello-gawk @@ -388,6 +391,7 @@ func_check_maintainerclean_vpath_all () func_check_maintainerclean_vpath hello-clisp func_check_maintainerclean_vpath hello-librep func_check_maintainerclean_vpath hello-rust + func_check_maintainerclean_vpath hello-go func_check_maintainerclean_vpath hello-ruby func_check_maintainerclean_vpath hello-sh func_check_maintainerclean_vpath hello-gawk @@ -476,6 +480,7 @@ func_check_dist_all () func_check_dist hello-clisp func_check_dist hello-librep func_check_dist hello-rust + func_check_dist hello-go func_check_dist hello-ruby func_check_dist hello-sh func_check_dist hello-gawk @@ -564,6 +569,7 @@ func_check_dist_vpath_all () func_check_dist_vpath hello-clisp func_check_dist_vpath hello-librep func_check_dist_vpath hello-rust + func_check_dist_vpath hello-go func_check_dist_vpath hello-ruby func_check_dist_vpath hello-sh func_check_dist_vpath hello-gawk @@ -644,6 +650,7 @@ func_check_install_all () func_check_install hello-clisp func_check_install hello-librep func_check_install hello-rust + func_check_install hello-go func_check_install hello-ruby func_check_install hello-sh func_check_install hello-gawk @@ -721,6 +728,7 @@ func_check_uninstall_all () func_check_uninstall hello-clisp func_check_uninstall hello-librep func_check_uninstall hello-rust + func_check_uninstall hello-go func_check_uninstall hello-ruby func_check_uninstall hello-sh func_check_uninstall hello-gawk @@ -800,6 +808,7 @@ func_check_distcheck_all () func_check_distcheck hello-clisp func_check_distcheck hello-librep func_check_distcheck hello-rust + func_check_distcheck hello-go func_check_distcheck hello-ruby func_check_distcheck hello-sh func_check_distcheck hello-gawk @@ -862,6 +871,7 @@ func_check_all () func_check hello-clisp func_check hello-librep func_check hello-rust + func_check hello-go func_check hello-ruby func_check hello-sh func_check hello-gawk diff --git a/gettext-tools/examples/hello-go/INSTALL b/gettext-tools/examples/hello-go/INSTALL new file mode 100644 index 000000000..f53900b31 --- /dev/null +++ b/gettext-tools/examples/hello-go/INSTALL @@ -0,0 +1,10 @@ +This example relies on Go (package: golang-go, if available, or gccgo). + +Installation: + ./autogen.sh + ./configure --prefix=/some/prefix + make + make install +Cleanup: + make distclean + ./autoclean.sh diff --git a/gettext-tools/examples/hello-go/Makefile.am b/gettext-tools/examples/hello-go/Makefile.am new file mode 100644 index 000000000..c504b1335 --- /dev/null +++ b/gettext-tools/examples/hello-go/Makefile.am @@ -0,0 +1,16 @@ +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Makefile configuration - processed by automake. + +# General automake options. +AUTOMAKE_OPTIONS = foreign +ACLOCAL_AMFLAGS = -I m4 + +# The list of subdirectories containing Makefiles. +SUBDIRS = example1 example2 example3 m4 po + +DISTCLEANFILES = gocomp.sh + +# Additional files to be distributed. +EXTRA_DIST = autogen.sh autoclean.sh diff --git a/gettext-tools/examples/hello-go/autoclean.sh b/gettext-tools/examples/hello-go/autoclean.sh new file mode 100755 index 000000000..44f41b582 --- /dev/null +++ b/gettext-tools/examples/hello-go/autoclean.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Script for cleaning all autogenerated files. + +test ! -f Makefile || make distclean +# Do the equivalent of "make maintainer-clean", even without the Makefile. +rm -f */go.sum +rm -rf autom4te.cache + +# Brought in by explicit copy. +rm -f m4/nls.m4 +rm -f m4/po.m4 +rm -f m4/progtest.m4 +rm -f po/remove-potcdate.sed + +# Brought in by explicit copy. +rm -f m4/gocomp.m4 +rm -f gocomp.sh.in + +# Generated by aclocal. +rm -f aclocal.m4 + +# Generated by autoconf. +rm -f configure + +# Generated or brought in by automake. +rm -f Makefile.in +rm -f example1/Makefile.in +rm -f example2/Makefile.in +rm -f example3/Makefile.in +rm -f m4/Makefile.in +rm -f po/Makefile.in +rm -f install-sh +rm -f missing +rm -f po/*.pot +rm -f po/stamp-po +rm -f po/*.gmo diff --git a/gettext-tools/examples/hello-go/autogen.sh b/gettext-tools/examples/hello-go/autogen.sh new file mode 100755 index 000000000..9022bd8ad --- /dev/null +++ b/gettext-tools/examples/hello-go/autogen.sh @@ -0,0 +1,47 @@ +#!/bin/sh +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Script for regenerating all autogenerated files. + +if test -r ../Makefile.am; then + # Inside the gettext source directory. + GETTEXT_TOPSRCDIR=../../.. +else + if test -r ../Makefile; then + # Inside a gettext build directory. + GETTEXT_TOOLS_SRCDIR=`sed -n -e 's,^top_srcdir *= *\(.*\)$,\1,p' ../Makefile` + # Adjust a relative top_srcdir. + case $GETTEXT_TOOLS_SRCDIR in + /*) ;; + *) GETTEXT_TOOLS_SRCDIR=../$GETTEXT_TOOLS_SRCDIR ;; + esac + GETTEXT_TOPSRCDIR=$GETTEXT_TOOLS_SRCDIR/../.. + else + # Installed under ${prefix}/share/doc/gettext/examples. + . ../installpaths + fi +fi + +cp -p ${ACLOCALDIR-$GETTEXT_TOPSRCDIR/gettext-runtime/m4}/nls.m4 m4/nls.m4 +cp -p ${ACLOCALDIR-$GETTEXT_TOPSRCDIR/gettext-runtime/m4}/po.m4 m4/po.m4 +cp -p ${ACLOCALDIR-$GETTEXT_TOPSRCDIR/gettext-runtime/m4}/progtest.m4 m4/progtest.m4 +cp -p ${GETTEXTSRCPODIR-$GETTEXT_TOPSRCDIR/gettext-runtime/po}/remove-potcdate.sed po/remove-potcdate.sed + +cp -p ${EXAMPLESCONFIGDIR-$GETTEXT_TOPSRCDIR/gettext-tools/gnulib-m4}/gocomp.m4 m4/gocomp.m4 +cp -p ${EXAMPLESCONFIGDIR-$GETTEXT_TOPSRCDIR/build-aux}/gocomp.sh.in gocomp.sh.in + +aclocal -I m4 + +autoconf + +automake -a -c + +cd po +for f in *.po; do + if test -r "$f"; then + lang=`echo $f | sed -e 's,\.po$,,'` + msgfmt -c -o $lang.gmo $lang.po + fi +done +cd .. diff --git a/gettext-tools/examples/hello-go/configure.ac b/gettext-tools/examples/hello-go/configure.ac new file mode 100644 index 000000000..f2f7acfff --- /dev/null +++ b/gettext-tools/examples/hello-go/configure.ac @@ -0,0 +1,44 @@ +dnl Example for use of GNU gettext. +dnl This file is in the public domain. +dnl +dnl Configuration file - processed by autoconf. + +AC_INIT([hello-go], [0]) +AC_CONFIG_SRCDIR([example1/go.mod.in]) +AM_INIT_AUTOMAKE([1.11]) + +gt_GOCOMP +if test -z "$GO"; then + echo "*** Essential program go or go- not found" 1>&2 + exit 1 +fi + +dnl The installed program must know where to find its message catalogs. +dnl Unfortunately, prefix gets only finally determined at the end of configure. +if test "X$prefix" = "XNONE"; then + final_prefix="$ac_default_prefix" +else + final_prefix="$prefix" +fi +save_prefix="$prefix" +prefix="$final_prefix" +eval "datarootdir=\"${datarootdir}\"" +eval "localedir=\"${datarootdir}/locale\"" +prefix="$save_prefix" +AC_SUBST([localedir]) + +dnl Support for the po directory. +AM_PO_SUBDIRS + +AC_CONFIG_FILES([Makefile]) +dnl Support for VPATH builds: +dnl We need a copy of go.mod in the build directory, otherwise we get an error +dnl "go.mod file not found in current directory or any parent directory; +dnl see 'go help modules'". +AC_CONFIG_FILES([example1/Makefile example1/go.mod example1/hello1ml.go example1/hello1sl.go]) +AC_CONFIG_FILES([example2/Makefile example2/go.mod example2/hello2sl.go]) +AC_CONFIG_FILES([example3/Makefile example3/go.mod example3/hello3ml.go]) +AC_CONFIG_FILES([gocomp.sh]) +AC_CONFIG_FILES([m4/Makefile]) +AC_CONFIG_FILES([po/Makefile], [AM_POSTPROCESS_PO_MAKEFILE]) +AC_OUTPUT diff --git a/gettext-tools/examples/hello-go/example1/Makefile.am b/gettext-tools/examples/hello-go/example1/Makefile.am new file mode 100644 index 000000000..77eb7a58a --- /dev/null +++ b/gettext-tools/examples/hello-go/example1/Makefile.am @@ -0,0 +1,28 @@ +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Makefile configuration - processed by automake. + +# The list of programs that are built. +bin_PROGRAMS = hello1ml hello1sl + +# The source files of the 'hello1ml' program. +nodist_hello1ml_SOURCES = hello1ml.go + +# The source files of the 'hello1sl' program. +nodist_hello1sl_SOURCES = hello1sl.go + +EXTRA_DIST = go.mod.in + +CLEANFILES = go.sum + +# Rules for compiling the programs. + +go.sum: + $(GO) mod download github.com/leonelquinteros/gotext + +hello1ml$(EXEEXT): $(nodist_hello1ml_SOURCES) go.sum + $(SHELL) ../gocomp.sh $(nodist_hello1ml_SOURCES) + +hello1sl$(EXEEXT): $(nodist_hello1sl_SOURCES) go.sum + $(SHELL) ../gocomp.sh $(nodist_hello1sl_SOURCES) diff --git a/gettext-tools/examples/hello-go/example1/go.mod.in b/gettext-tools/examples/hello-go/example1/go.mod.in new file mode 100644 index 000000000..e659ac0da --- /dev/null +++ b/gettext-tools/examples/hello-go/example1/go.mod.in @@ -0,0 +1,3 @@ +module hello +go 1.11 +require github.com/leonelquinteros/gotext v1.6.0 diff --git a/gettext-tools/examples/hello-go/example1/hello1ml.go.in b/gettext-tools/examples/hello-go/example1/hello1ml.go.in new file mode 100644 index 000000000..13f464bfd --- /dev/null +++ b/gettext-tools/examples/hello-go/example1/hello1ml.go.in @@ -0,0 +1,45 @@ +// Example for use of GNU gettext. +// This file is in the public domain. + +// Source code of a Go program showing the use of a multi-locale API. + + +package main + +import ( + // Documentation: https://pkg.go.dev/fmt + "fmt" + // Documentation: https://pkg.go.dev/github.com/leonelquinteros/gotext + "github.com/leonelquinteros/gotext" + // Documentation: https://pkg.go.dev/os + "os" +) + +// Returns the language in the form "ll_CC". +// Alternatives: +// - https://pkg.go.dev/github.com/Xuanwo/go-locale +// - https://pkg.go.dev/github.com/jeandeaual/go-locale +func getUserLanguage() string { + // Look at the POSIX environment variables. + for _, variable := range []string{"LC_ALL", "LC_MESSAGES", "LANG"} { + if value := os.Getenv(variable); value != "" { + return gotext.SimplifiedLocale(value) + } + } + // The "C" locale is essentially the same as the en-US locale. + return "en_US" +} + +func main () { + // Specify locale. + language := getUserLanguage() + + // Specify localedir. + localizer := gotext.NewLocale("@localedir@", language) + // Specify domain. + localizer.AddDomain("hello-go") + + fmt.Println(localizer.Get("Hello, world!")) + fmt.Println(localizer.Get("This program is running as process number %d.", + os.Getpid())) +} diff --git a/gettext-tools/examples/hello-go/example1/hello1sl.go.in b/gettext-tools/examples/hello-go/example1/hello1sl.go.in new file mode 100644 index 000000000..833245f51 --- /dev/null +++ b/gettext-tools/examples/hello-go/example1/hello1sl.go.in @@ -0,0 +1,43 @@ +// Example for use of GNU gettext. +// This file is in the public domain. + +// Source code of a Go program showing the use of a single-locale API. + + +package main + +import ( + // Documentation: https://pkg.go.dev/fmt + "fmt" + // Documentation: https://pkg.go.dev/github.com/leonelquinteros/gotext + "github.com/leonelquinteros/gotext" + // Documentation: https://pkg.go.dev/os + "os" +) + +// Returns the language in the form "ll_CC". +// Alternatives: +// - https://pkg.go.dev/github.com/Xuanwo/go-locale +// - https://pkg.go.dev/github.com/jeandeaual/go-locale +func getUserLanguage() string { + // Look at the POSIX environment variables. + for _, variable := range []string{"LC_ALL", "LC_MESSAGES", "LANG"} { + if value := os.Getenv(variable); value != "" { + return gotext.SimplifiedLocale(value) + } + } + // The "C" locale is essentially the same as the en-US locale. + return "en_US" +} + +func main () { + // Specify locale. + language := getUserLanguage() + + // Specify localedir, domain. + gotext.Configure("@localedir@", language, "hello-go") + + fmt.Println(gotext.Get("Hello, world!")) + fmt.Println(gotext.Get("This program is running as process number %d.", + os.Getpid())) +} diff --git a/gettext-tools/examples/hello-go/example2/Makefile.am b/gettext-tools/examples/hello-go/example2/Makefile.am new file mode 100644 index 000000000..145b5f7c6 --- /dev/null +++ b/gettext-tools/examples/hello-go/example2/Makefile.am @@ -0,0 +1,22 @@ +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Makefile configuration - processed by automake. + +# The list of programs that are built. +bin_PROGRAMS = hello2sl + +# The source files of the 'hello2sl' program. +nodist_hello2sl_SOURCES = hello2sl.go + +EXTRA_DIST = go.mod.in + +CLEANFILES = go.sum + +# Rules for compiling the programs. + +go.sum: + $(GO) mod download github.com/gosexy/gettext + +hello2sl$(EXEEXT): $(nodist_hello2sl_SOURCES) go.sum + $(SHELL) ../gocomp.sh $(nodist_hello2sl_SOURCES) diff --git a/gettext-tools/examples/hello-go/example2/go.mod.in b/gettext-tools/examples/hello-go/example2/go.mod.in new file mode 100644 index 000000000..d41b1cdb2 --- /dev/null +++ b/gettext-tools/examples/hello-go/example2/go.mod.in @@ -0,0 +1,3 @@ +module hello +go 1.11 +require github.com/gosexy/gettext v0.0.0-20160830220431-74466a0a0c4a diff --git a/gettext-tools/examples/hello-go/example2/hello2sl.go.in b/gettext-tools/examples/hello-go/example2/hello2sl.go.in new file mode 100644 index 000000000..d47016596 --- /dev/null +++ b/gettext-tools/examples/hello-go/example2/hello2sl.go.in @@ -0,0 +1,31 @@ +// Example for use of GNU gettext. +// This file is in the public domain. + +// Source code of a Go program showing the use of a single-locale API. + + +package main + +import ( + // Documentation: https://pkg.go.dev/fmt + "fmt" + // Documentation: https://pkg.go.dev/github.com/gosexy/gettext + "github.com/gosexy/gettext" + // Documentation: https://pkg.go.dev/os + "os" +) + +func main () { + // Specify domain, localedir. + domain := "hello-go" + gettext.BindTextdomain(domain, "@localedir@") + gettext.Textdomain(domain) + + // Specify locale. + locale := "" // looks at the POSIX environment variables + gettext.SetLocale(gettext.LcAll, locale) + + fmt.Println(gettext.Gettext("Hello, world!")) + fmt.Println(fmt.Sprintf(gettext.Gettext("This program is running as process number %d."), + os.Getpid())) +} diff --git a/gettext-tools/examples/hello-go/example3/Makefile.am b/gettext-tools/examples/hello-go/example3/Makefile.am new file mode 100644 index 000000000..19370aedb --- /dev/null +++ b/gettext-tools/examples/hello-go/example3/Makefile.am @@ -0,0 +1,22 @@ +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Makefile configuration - processed by automake. + +# The list of programs that are built. +bin_PROGRAMS = hello3ml + +# The source files of the 'hello3ml' program. +nodist_hello3ml_SOURCES = hello3ml.go + +EXTRA_DIST = go.mod.in + +CLEANFILES = go.sum + +# Rules for compiling the programs. + +go.sum: + $(GO) mod download github.com/snapcore/go-gettext + +hello3ml$(EXEEXT): $(nodist_hello3ml_SOURCES) go.sum + $(SHELL) ../gocomp.sh $(nodist_hello3ml_SOURCES) diff --git a/gettext-tools/examples/hello-go/example3/go.mod.in b/gettext-tools/examples/hello-go/example3/go.mod.in new file mode 100644 index 000000000..55630f440 --- /dev/null +++ b/gettext-tools/examples/hello-go/example3/go.mod.in @@ -0,0 +1,3 @@ +module hello +go 1.11 +require github.com/snapcore/go-gettext v0.0.0-20230721153050-9082cdc2db05 diff --git a/gettext-tools/examples/hello-go/example3/hello3ml.go.in b/gettext-tools/examples/hello-go/example3/hello3ml.go.in new file mode 100644 index 000000000..9a1dcc7a1 --- /dev/null +++ b/gettext-tools/examples/hello-go/example3/hello3ml.go.in @@ -0,0 +1,47 @@ +// Example for use of GNU gettext. +// This file is in the public domain. + +// Source code of a Go program showing the use of a multi-locale API. + + +package main + +import ( + // Documentation: https://pkg.go.dev/fmt + "fmt" + // Documentation: https://pkg.go.dev/github.com/snapcore/go-gettext + "github.com/snapcore/go-gettext" + // Documentation: https://pkg.go.dev/os + "os" +) + +// Alternatives: +// - gettext.getUserLanguages() +// - https://pkg.go.dev/github.com/Xuanwo/go-locale +// - https://pkg.go.dev/github.com/jeandeaual/go-locale +func getUserLanguage() string { + // Look at the POSIX environment variables. + for _, variable := range []string{"LC_ALL", "LC_MESSAGES", "LANG"} { + if value := os.Getenv(variable); value != "" { + return value + } + } + // The "C" locale is essentially the same as the en-US locale. + return "en-US" +} + +func main () { + // Specify locale. + locale := getUserLanguage() + + // Specify domain, localedir. + domain := &gettext.TextDomain{ + Name: "hello-go", + LocaleDir: "@localedir@", + } + gettext := domain.Locale(locale) + + fmt.Println(gettext.Gettext("Hello, world!")) + fmt.Println(fmt.Sprintf(gettext.Gettext("This program is running as process number %d."), + os.Getpid())) +} diff --git a/gettext-tools/examples/hello-go/m4/Makefile.am b/gettext-tools/examples/hello-go/m4/Makefile.am new file mode 100644 index 000000000..a41b47ed6 --- /dev/null +++ b/gettext-tools/examples/hello-go/m4/Makefile.am @@ -0,0 +1,3 @@ +EXTRA_DIST = \ + nls.m4 po.m4 \ + gocomp.m4 diff --git a/gettext-tools/examples/hello-go/po/LINGUAS b/gettext-tools/examples/hello-go/po/LINGUAS new file mode 100644 index 000000000..dc4a82afb --- /dev/null +++ b/gettext-tools/examples/hello-go/po/LINGUAS @@ -0,0 +1,5 @@ +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Set of available languages. +af ast bg ca cs da de el eo es fi fr ga gl hr hu id it ja ka ky lv ms mt nb nl nn pl pt pt_BR ro ru sk sl sq sr sv ta tr uk vi zh_CN zh_HK zh_TW diff --git a/gettext-tools/examples/hello-go/po/Makefile.am b/gettext-tools/examples/hello-go/po/Makefile.am new file mode 100644 index 000000000..c09a37d8a --- /dev/null +++ b/gettext-tools/examples/hello-go/po/Makefile.am @@ -0,0 +1,437 @@ +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Makefile configuration - processed by automake. + +# List of files which contain translatable strings. +POTFILES = \ + example1/hello1ml.go.in \ + example1/hello1sl.go.in \ + example2/hello2sl.go.in \ + example3/hello3ml.go.in + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Yoyodyne, Inc. + +# This tells whether or not to prepend "GNU " prefix to the package +# name that gets inserted into the header of the $(DOMAIN).pot file. +# Possible values are "yes", "no", or empty. If it is empty, try to +# detect it automatically by scanning the files in $(top_srcdir) for +# "GNU packagename" string. +PACKAGE_GNU = no + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +MSGID_BUGS_ADDRESS = bug-gettext@gnu.org + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = + +# These options get passed to msgmerge. +# Useful options are in particular: +# --previous to keep previous msgids of translated messages +MSGMERGE_OPTIONS = + +# These options get passed to msginit. +# If you want to disable line wrapping when writing PO files, add +# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and +# MSGINIT_OPTIONS. +MSGINIT_OPTIONS = + +MSGMERGE = @MSGMERGE@ +MSGMERGE_UPDATE = @MSGMERGE@ --update +MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@ +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +# This is computed as $(foreach file, $(POTFILES), $(top_srcdir)/$(file)) +POTFILES_DEPS != for file in $(POTFILES); do echo $(top_srcdir)/$$file; done + +# The set of available translations. +ALL_LINGUAS != if test -f $(srcdir)/LINGUAS; then \ + sed -e '/^\#/d' < $(srcdir)/LINGUAS; \ + else \ + echo $(LINGUAS); \ + fi +# This is computed as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) +POFILES != for lang in $(ALL_LINGUAS); do echo $(srcdir)/$$lang.po; done +# This is computed as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) +GMOFILES != for lang in $(ALL_LINGUAS); do echo $(srcdir)/$$lang.gmo; done +# This is computed as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) +UPDATEPOFILES != for lang in $(ALL_LINGUAS); do echo $$lang.po-update; done +# This is computed as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) +DUMMYPOFILES != for lang in $(ALL_LINGUAS); do echo $$lang.nop; done + +# The set of desired translations, as specified by the installer or distributor. +DESIRED_LINGUAS = @DESIRED_LINGUAS@ +# The set of translations to install. This is computed based on $(ALL_LINGUAS) +# and $(DESIRED_LINGUAS). It is a subset of $(ALL_LINGUAS). +# We use the presentlang catalog if desiredlang is +# a. equal to presentlang, or +# b. a variant of presentlang (because in this case, presentlang can be used +# as a fallback for messages which are not translated in the desiredlang +# catalog). +INST_LINGUAS != for presentlang in $(ALL_LINGUAS); do \ + useit=false; \ + for desiredlang in $(DESIRED_LINGUAS); do \ + case "$$desiredlang" in \ + "$$presentlang" | "$$presentlang"_* | "$$presentlang".* | "$$presentlang"@*) \ + useit=true ;; \ + esac; \ + done; \ + if $$useit; then echo $$presentlang; fi; \ + done +# This is computed as $(foreach lang, $(INST_LINGUAS), $(lang).gmo) +CATALOGS != for lang in $(INST_LINGUAS); do echo $$lang.gmo; done + +SUFFIXES = .po .gmo .nop .po-create .po-update + +# The .pot file, stamp-po, .po files, and .gmo files appear in release tarballs. +# The GNU Coding Standards say in +# : +# "GNU distributions usually contain some files which are not source files +# ... . Since these files normally appear in the source directory, they +# should always appear in the source directory, not in the build directory. +# So Makefile rules to update them should put the updated files in the +# source directory." +# Therefore we put these files in the source directory, not the build directory. + +# During .po -> .gmo conversion, take into account the most recent changes to +# the .pot file. This eliminates the need to update the .po files when the +# .pot file has changed, which would be troublesome if the .po files are put +# under version control. +$(GMOFILES): $(srcdir)/$(DOMAIN).pot +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(MSGMERGE) $(MSGMERGE_FOR_MSGFMT_OPTION) -o $${lang}.1po $${lang}.po $(DOMAIN).pot && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.1po && rm -f $${lang}.1po"; \ + cd $(srcdir) && \ + rm -f $${lang}.gmo && \ + $(MSGMERGE) $(MSGMERGE_FOR_MSGFMT_OPTION) -o $${lang}.1po $${lang}.po $(DOMAIN).pot && \ + $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.1po && \ + mv t-$${lang}.gmo $${lang}.gmo && \ + rm -f $${lang}.1po + + +all-local: all-local-@USE_NLS@ + +all-local-yes: $(srcdir)/stamp-po +all-local-no: + +# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no +# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because +# we don't want to bother translators with empty POT files). We assume that +# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. +# In this case, $(srcdir)/stamp-po is a nop (i.e. a phony target). + +# $(srcdir)/stamp-po is a timestamp denoting the last time at which the CATALOGS +# have been loosely updated. Its purpose is that when a developer or translator +# checks out the package from a version control system, and the $(DOMAIN).pot +# file is not under version control, "make" will update the $(DOMAIN).pot and +# the $(CATALOGS), but subsequent invocations of "make" will do nothing. This +# timestamp would not be necessary if updating the $(CATALOGS) would always +# touch them; however, the rule for $(POFILES) has been designed to not touch +# files that don't need to be changed. +$(srcdir)/stamp-po: $(srcdir)/$(DOMAIN).pot + test ! -f $(srcdir)/$(DOMAIN).pot || \ + test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) + @test ! -f $(srcdir)/$(DOMAIN).pot || { \ + echo "touch $(srcdir)/stamp-po" && \ + echo timestamp > $(srcdir)/stamp-poT && \ + mv $(srcdir)/stamp-poT $(srcdir)/stamp-po; \ + } + +# This target rebuilds $(DOMAIN).pot; it is an expensive operation. +# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. +# The determination of whether the package xyz is a GNU one is based on the +# heuristic whether some file in the top level directory mentions "GNU xyz". +# If GNU 'find' is available, we avoid grepping through monster files. +$(DOMAIN).pot-update: $(POTFILES_DEPS) + package_gnu="$(PACKAGE_GNU)"; \ + test -n "$$package_gnu" || { \ + if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \ + LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f -size -10000000c -exec grep -i 'GNU $(PACKAGE)' /dev/null '{}' ';' 2>/dev/null; \ + else \ + LC_ALL=C grep -i 'GNU $(PACKAGE)' $(top_srcdir)/* 2>/dev/null; \ + fi; \ + } | grep -v 'libtool:' >/dev/null; then \ + package_gnu=yes; \ + else \ + package_gnu=no; \ + fi; \ + }; \ + if test "$$package_gnu" = "yes"; then \ + package_prefix='GNU '; \ + else \ + package_prefix=''; \ + fi; \ + if test -n '$(MSGID_BUGS_ADDRESS)'; then \ + msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ + else \ + msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ + fi; \ + case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ + $(POTFILES) \ + ;; \ + *) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --package-name="$${package_prefix}$(PACKAGE)" \ + --package-version='$(VERSION)' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ + $(POTFILES) \ + ;; \ + esac + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot-header; then \ + sed -e '1,/^#$$/d' < $(DOMAIN).po > $(DOMAIN).1po && \ + cat $(srcdir)/$(DOMAIN).pot-header $(DOMAIN).1po > $(DOMAIN).po && \ + rm -f $(DOMAIN).1po \ + || exit 1; \ + fi; \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f $(srcdir)/remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f $(srcdir)/remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +# This rule has no dependencies: we don't need to update $(DOMAIN).pot at +# every "make" invocation, only create it when it is missing. +# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +# This target rebuilds a PO file if $(DOMAIN).pot has changed. +# Note that a PO file is not touched if it doesn't need to be changed. +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + if test -f "$(srcdir)/$${lang}.po"; then \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) --quiet $(MSGMERGE_OPTIONS) --lang=$${lang} --previous $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) \ + && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.10 | 0.10.*) \ + $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ + 0.1[1-5] | 0.1[1-5].*) \ + $(MSGMERGE_UPDATE) --quiet $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ + 0.1[6-7] | 0.1[6-7].*) \ + $(MSGMERGE_UPDATE) --quiet $(MSGMERGE_OPTIONS) --previous $${lang}.po $(DOMAIN).pot;; \ + *) \ + $(MSGMERGE_UPDATE) --quiet $(MSGMERGE_OPTIONS) --lang=$${lang} --previous $${lang}.po $(DOMAIN).pot;; \ + esac; \ + }; \ + else \ + $(MAKE) $${lang}.po-create; \ + fi + + +install-data-local: install-data-local-@USE_NLS@ +install-data-local-no: all-local +install-data-local-yes: all-local + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(MKDIR_P) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +installdirs-local: installdirs-local-@USE_NLS@ +installdirs-local-no: +installdirs-local-yes: + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(MKDIR_P) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +uninstall-local: uninstall-local-@USE_NLS@ +uninstall-local-no: +uninstall-local-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +html ID: + +MOSTLYCLEANFILES = +MOSTLYCLEANFILES += stamp-poT +MOSTLYCLEANFILES += core core.* *.stackdump $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po +MOSTLYCLEANFILES += *.o + +MAINTAINERCLEANFILES = $(DOMAIN).pot stamp-po $(GMOFILES) + +EXTRA_DIST = remove-potcdate.sed LINGUAS $(POFILES) $(GMOFILES) + +# Hidden from automake, but really activated. Works around an automake-1.5 bug. +#distdir: distdir1 +distdir1: + $(MAKE) update-po + $(MAKE) $(srcdir)/stamp-po + @if test -f $(srcdir)/$(DOMAIN).pot; then \ + for file in $(DOMAIN).pot stamp-po; do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + cp -p $$d/$$file $(distdir)/$$file || exit 1; \ + done; \ + else \ + case $(XGETTEXT) in \ + :) echo "Warning: Creating a tarball without '$(DOMAIN).pot', because a suitable 'xgettext' program was not found in PATH." 1>&2;; \ + *) echo "Warning: Creating a tarball without '$(DOMAIN).pot', because 'xgettext' found no strings to extract. Check the POTFILES and the XGETTEXT_OPTIONS in the Makefile.am file." 1>&2;; \ + esac; \ + fi + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for creating PO files. + +.nop.po-create: + @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ + echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ + exit 1 + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) --quiet $(MSGMERGE_OPTIONS) --lang=$$lang --previous $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.10 | 0.10.*) \ + $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + 0.1[1-5] | 0.1[1-5].*) \ + $(MSGMERGE) --quiet $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + 0.1[6-7] | 0.1[6-7].*) \ + $(MSGMERGE) --quiet $(MSGMERGE_OPTIONS) --previous -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + *) \ + $(MSGMERGE) --quiet $(MSGMERGE_OPTIONS) --lang=$$lang --previous -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + esac; \ + }; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: diff --git a/gettext-tools/examples/po/Makefile.am b/gettext-tools/examples/po/Makefile.am index b7608fa04..06c9618f3 100644 --- a/gettext-tools/examples/po/Makefile.am +++ b/gettext-tools/examples/po/Makefile.am @@ -59,6 +59,10 @@ POTFILES = \ hello-clisp/hello.lisp.in \ hello-librep/hello.jl.in \ hello-rust/src/main.rs.in \ + hello-go/example1/hello1sl.go.in \ + hello-go/example1/hello1ml.go.in \ + hello-go/example2/hello2sl.go.in \ + hello-go/example3/hello3ml.go.in \ hello-ruby/hello.rb \ hello-sh/hello.sh \ hello-gawk/hello.awk \ @@ -98,6 +102,7 @@ SMALLPOTS = \ hello-clisp.pot \ hello-librep.pot \ hello-rust.pot \ + hello-go.pot \ hello-ruby.pot \ hello-sh.pot \ hello-gawk.pot \ @@ -327,6 +332,9 @@ hello-librep.pot : $(POTFILES_DEPS) hello-rust.pot : $(POTFILES_DEPS) $(USE_BUILT_PROGS) $(SHELL) '$(srcdir)/xsmallpot.sh' '$(srcdir)' hello-rust +hello-go.pot : $(POTFILES_DEPS) + $(USE_BUILT_PROGS) $(SHELL) '$(srcdir)/xsmallpot.sh' '$(srcdir)' hello-go + hello-ruby.pot : $(POTFILES_DEPS) $(USE_BUILT_PROGS) $(SHELL) '$(srcdir)/xsmallpot.sh' '$(srcdir)' hello-ruby @@ -458,6 +466,7 @@ SMALLPOFILES_FOR_lang = \ $(srcdir)/../hello-clisp/po/$$lang.po \ $(srcdir)/../hello-librep/po/$$lang.po \ $(srcdir)/../hello-rust/po/$$lang.po \ + $(srcdir)/../hello-go/po/$$lang.po \ $(srcdir)/../hello-ruby/po/$$lang.po \ $(srcdir)/../hello-sh/po/$$lang.po \ $(srcdir)/../hello-gawk/po/$$lang.po \ @@ -544,6 +553,9 @@ $(srcdir)/../hello-librep/po/$(LL).po: $(srcdir)/hello-librep.pot $(srcdir)/$(LL $(srcdir)/../hello-rust/po/$(LL).po: $(srcdir)/hello-rust.pot $(srcdir)/$(LL).po $(USE_BUILT_PROGS) cd $(srcdir) && $(SHELL) mmsmallpo.sh hello-rust $(LL) +$(srcdir)/../hello-go/po/$(LL).po: $(srcdir)/hello-go.pot $(srcdir)/$(LL).po + $(USE_BUILT_PROGS) cd $(srcdir) && $(SHELL) mmsmallpo.sh hello-go $(LL) + $(srcdir)/../hello-ruby/po/$(LL).po: $(srcdir)/hello-ruby.pot $(srcdir)/$(LL).po $(USE_BUILT_PROGS) cd $(srcdir) && $(SHELL) mmsmallpo.sh hello-ruby $(LL)