From e91e04e0f3dc4ca7decb3a998b063bd4e5b83c74 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 1 Apr 2025 23:11:13 +0200 Subject: [PATCH] examples: Add hello-d example. * gettext-tools/examples/hello-d/INSTALL: New file. * gettext-tools/examples/hello-d/autogen.sh: New file. * gettext-tools/examples/hello-d/autoclean.sh: New file. * gettext-tools/examples/hello-d/hello.d.in: New file. * gettext-tools/examples/hello-d/Makefile.am: New file. * gettext-tools/examples/hello-d/configure.ac: New file. * gettext-tools/examples/hello-d/m4/Makefile.am: New file. * gettext-tools/examples/hello-d/po/LINGUAS: New file. * gettext-tools/examples/hello-d/po/Makefile.am: New file. * gettext-tools/examples/installpaths.in: Define also includedir. * gettext-tools/examples/Makefile.am (EXAMPLESFILES, EXAMPLESDIRS): Add hello-d. * gettext-tools/examples/po/Makefile.am (POTFILES, SMALLPOTS): Update for hello-d. (hello-d.pot): New target. (SMALLPOFILES_FOR_lang): Update for hello-d. ($(srcdir)/../hello-d/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-d as well. * gettext-tools/examples/README: Mention hello-d. * gettext-tools/doc/lang-d.texi: Likewise. * NEWS: Likewise. --- NEWS | 1 + gettext-tools/doc/lang-d.texi | 2 + gettext-tools/examples/Makefile.am | 10 + gettext-tools/examples/README | 2 + gettext-tools/examples/check-examples | 10 + gettext-tools/examples/hello-d/INSTALL | 10 + gettext-tools/examples/hello-d/Makefile.am | 49 ++ gettext-tools/examples/hello-d/autoclean.sh | 51 ++ gettext-tools/examples/hello-d/autogen.sh | 61 +++ gettext-tools/examples/hello-d/configure.ac | 49 ++ gettext-tools/examples/hello-d/hello.d.in | 29 ++ gettext-tools/examples/hello-d/m4/Makefile.am | 3 + gettext-tools/examples/hello-d/po/LINGUAS | 5 + gettext-tools/examples/hello-d/po/Makefile.am | 434 ++++++++++++++++++ gettext-tools/examples/installpaths.in | 3 +- gettext-tools/examples/po/Makefile.am | 9 + 16 files changed, 727 insertions(+), 1 deletion(-) create mode 100644 gettext-tools/examples/hello-d/INSTALL create mode 100644 gettext-tools/examples/hello-d/Makefile.am create mode 100755 gettext-tools/examples/hello-d/autoclean.sh create mode 100755 gettext-tools/examples/hello-d/autogen.sh create mode 100644 gettext-tools/examples/hello-d/configure.ac create mode 100644 gettext-tools/examples/hello-d/hello.d.in create mode 100644 gettext-tools/examples/hello-d/m4/Makefile.am create mode 100644 gettext-tools/examples/hello-d/po/LINGUAS create mode 100644 gettext-tools/examples/hello-d/po/Makefile.am diff --git a/NEWS b/NEWS index 9967b7e41..f007128c5 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ Version 0.25 - April 2025 - xgettext now supports D. - 'msgfmt -c' now verifies the syntax of translations of D format strings. + - A new example 'hello-d' has been added. Version 0.24 - February 2025 diff --git a/gettext-tools/doc/lang-d.texi b/gettext-tools/doc/lang-d.texi index 9c3b4971d..d2271f6ec 100644 --- a/gettext-tools/doc/lang-d.texi +++ b/gettext-tools/doc/lang-d.texi @@ -70,3 +70,5 @@ fully portable @item po-mode marking --- @end table + +An example is available in the @file{examples} directory: @code{hello-d}. diff --git a/gettext-tools/examples/Makefile.am b/gettext-tools/examples/Makefile.am index 56b81d42b..1e895b630 100644 --- a/gettext-tools/examples/Makefile.am +++ b/gettext-tools/examples/Makefile.am @@ -400,6 +400,15 @@ EXAMPLESFILES = \ hello-pascal/m4/Makefile.am \ hello-pascal/po/Makefile.am \ \ + hello-d/INSTALL \ + hello-d/autogen.sh \ + hello-d/autoclean.sh \ + hello-d/hello.d.in \ + hello-d/Makefile.am \ + hello-d/configure.ac \ + hello-d/m4/Makefile.am \ + hello-d/po/Makefile.am \ + \ hello-smalltalk/INSTALL \ hello-smalltalk/autogen.sh \ hello-smalltalk/autoclean.sh \ @@ -491,6 +500,7 @@ EXAMPLESDIRS = \ hello-sh \ hello-gawk \ hello-pascal \ + hello-d \ hello-smalltalk \ hello-tcl \ hello-tcl-tk \ diff --git a/gettext-tools/examples/README b/gettext-tools/examples/README index d432965d1..bbd6359b4 100644 --- a/gettext-tools/examples/README +++ b/gettext-tools/examples/README @@ -36,6 +36,7 @@ environment. hello-sh Shell hello-gawk awk hello-pascal Pascal + hello-d D hello-smalltalk Smalltalk hello-tcl Tcl hello-tcl-tk Tcl Tk @@ -83,6 +84,7 @@ Makefile types: hello-sh .gmo Makefile.am hello-gawk .gmo Makefile.am hello-pascal .gmo Makefile.am + hello-d .gmo Makefile.am hello-smalltalk .gmo Makefile.am hello-perl .gmo Makefile.am hello-php .gmo Makefile.am diff --git a/gettext-tools/examples/check-examples b/gettext-tools/examples/check-examples index 0d40dca91..3cae3186e 100755 --- a/gettext-tools/examples/check-examples +++ b/gettext-tools/examples/check-examples @@ -159,6 +159,7 @@ func_check_autoclean_all () func_check_autoclean hello-sh func_check_autoclean hello-gawk func_check_autoclean hello-pascal + func_check_autoclean hello-d func_check_autoclean hello-smalltalk func_check_autoclean hello-tcl func_check_autoclean hello-tcl-tk @@ -237,6 +238,7 @@ func_check_distclean_all () func_check_distclean hello-sh func_check_distclean hello-gawk func_check_distclean hello-pascal + func_check_distclean hello-d func_check_distclean hello-smalltalk func_check_distclean hello-tcl func_check_distclean hello-tcl-tk @@ -317,6 +319,7 @@ func_check_maintainerclean_all () func_check_maintainerclean hello-sh func_check_maintainerclean hello-gawk func_check_maintainerclean hello-pascal + func_check_maintainerclean hello-d func_check_maintainerclean hello-smalltalk func_check_maintainerclean hello-tcl func_check_maintainerclean hello-tcl-tk @@ -400,6 +403,7 @@ func_check_maintainerclean_vpath_all () func_check_maintainerclean_vpath hello-sh func_check_maintainerclean_vpath hello-gawk func_check_maintainerclean_vpath hello-pascal + func_check_maintainerclean_vpath hello-d func_check_maintainerclean_vpath hello-smalltalk func_check_maintainerclean_vpath hello-tcl func_check_maintainerclean_vpath hello-tcl-tk @@ -490,6 +494,7 @@ func_check_dist_all () func_check_dist hello-sh func_check_dist hello-gawk func_check_dist hello-pascal + func_check_dist hello-d func_check_dist hello-smalltalk func_check_dist hello-tcl func_check_dist hello-tcl-tk @@ -580,6 +585,7 @@ func_check_dist_vpath_all () func_check_dist_vpath hello-sh func_check_dist_vpath hello-gawk func_check_dist_vpath hello-pascal + func_check_dist_vpath hello-d func_check_dist_vpath hello-smalltalk func_check_dist_vpath hello-tcl func_check_dist_vpath hello-tcl-tk @@ -662,6 +668,7 @@ func_check_install_all () func_check_install hello-sh func_check_install hello-gawk func_check_install hello-pascal + func_check_install hello-d func_check_install hello-smalltalk func_check_install hello-tcl func_check_install hello-tcl-tk @@ -741,6 +748,7 @@ func_check_uninstall_all () func_check_uninstall hello-sh func_check_uninstall hello-gawk func_check_uninstall hello-pascal + func_check_uninstall hello-d func_check_uninstall hello-smalltalk func_check_uninstall hello-tcl func_check_uninstall hello-tcl-tk @@ -822,6 +830,7 @@ func_check_distcheck_all () func_check_distcheck hello-sh func_check_distcheck hello-gawk func_check_distcheck hello-pascal + func_check_distcheck hello-d func_check_distcheck hello-smalltalk func_check_distcheck hello-tcl func_check_distcheck hello-tcl-tk @@ -886,6 +895,7 @@ func_check_all () func_check hello-sh func_check hello-gawk func_check hello-pascal + func_check hello-d func_check hello-smalltalk func_check hello-tcl func_check hello-tcl-tk diff --git a/gettext-tools/examples/hello-d/INSTALL b/gettext-tools/examples/hello-d/INSTALL new file mode 100644 index 000000000..79993777b --- /dev/null +++ b/gettext-tools/examples/hello-d/INSTALL @@ -0,0 +1,10 @@ +This example relies on a D compiler (one of gdc, ldc2, dmd). + +Installation: + ./autogen.sh + ./configure --prefix=/some/prefix + make + make install +Cleanup: + make distclean + ./autoclean.sh diff --git a/gettext-tools/examples/hello-d/Makefile.am b/gettext-tools/examples/hello-d/Makefile.am new file mode 100644 index 000000000..de7901d5d --- /dev/null +++ b/gettext-tools/examples/hello-d/Makefile.am @@ -0,0 +1,49 @@ +# 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 = m4 po + +# The list of programs that are built. +bin_PROGRAMS = hello + +# The source files of the 'hello' program. +nodist_hello_SOURCES = hello.d + +# Compile time dependencies. +dincludedir = $(D_PACKAGES_PREFIX)/include/d +dlibdir = $(D_PACKAGES_EXECPREFIX)/lib + +# Link time dependencies. +LDADD = @LIBINTL@ + +hello$(EXEEXT): hello.d $(dlibdir)/libintl_d.a + $(SHELL) ./dcomp.sh -I$(dincludedir) -o hello$(EXEEXT) hello.d $(dlibdir)/libintl_d.a $(LDADD) + +# Compile dependency module. +# For simplicity, compile the entire module to a single object file. +$(dlibdir)/libintl_d.a: + mkdir -p $(dlibdir) + $(SHELL) ./dcomp.sh -I$(dincludedir) -c -o $(dlibdir)/libintl_d.a `find $(dincludedir)/gnu/libintl -name '*.d' -print` + +DISTCLEANFILES = dcomp.sh + +distclean-local: distclean-generic + @if test '$(D_PACKAGES_EXECPREFIX)' = './depends'; then \ + rm -f $(dlibdir)/libintl_d.a; \ + rmdir $(dlibdir); \ + rmdir depends 2>/dev/null || true; \ + fi + +# Additional files to be distributed. +EXTRA_DIST = \ + autogen.sh autoclean.sh \ + depends/include/d/gnu/libintl/package.d \ + depends/include/d/gnu/libintl/libintl.d \ + depends/include/d/gnu/libintl/internal/low.d diff --git a/gettext-tools/examples/hello-d/autoclean.sh b/gettext-tools/examples/hello-d/autoclean.sh new file mode 100755 index 000000000..079ca7d4d --- /dev/null +++ b/gettext-tools/examples/hello-d/autoclean.sh @@ -0,0 +1,51 @@ +#!/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 +rm -rf autom4te.cache + +# Brought in by explicit copy. +rm -rf depends + +# Brought in by autopoint. +rm -f ABOUT-NLS +rm -f config.rpath +rm -f m4/gettext.m4 +rm -f m4/build-to-host.m4 +rm -f m4/host-cpu-c-abi.m4 +rm -f m4/iconv.m4 +rm -f m4/intlmacosx.m4 +rm -f m4/lib-ld.m4 +rm -f m4/lib-link.m4 +rm -f m4/lib-prefix.m4 +rm -f m4/nls.m4 +rm -f m4/po.m4 +rm -f m4/progtest.m4 +rm -f po/Makefile.in.in +rm -f po/remove-potcdate.sed + +# Brought in by explicit copy. +rm -f m4/dcomp.m4 +rm -f dcomp.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 m4/Makefile.in +rm -f po/Makefile.in +rm -f compile +rm -f install-sh +rm -f missing +rm -f config.guess +rm -f config.sub +rm -f po/*.pot +rm -f po/stamp-po +rm -f po/*.gmo diff --git a/gettext-tools/examples/hello-d/autogen.sh b/gettext-tools/examples/hello-d/autogen.sh new file mode 100755 index 000000000..66ed26caa --- /dev/null +++ b/gettext-tools/examples/hello-d/autogen.sh @@ -0,0 +1,61 @@ +#!/bin/sh +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Script for regenerating all autogenerated files. + +mkdir -p depends/include/d +if test -r ../Makefile.am || test -r ../Makefile; then + if test -r ../Makefile.am; then + # Inside the gettext source directory. + GETTEXT_TOPSRCDIR=../../.. + else + # 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/../.. + fi + (cd "$GETTEXT_TOPSRCDIR/gettext-runtime/intl-d" \ + && tar cf - `find gnu/libintl -name '*.d' -print`) \ + | (cd depends/include/d && tar xf -) +else + # Installed under ${prefix}/share/doc/gettext/examples. + . ../installpaths + (cd "$includedir/d" \ + && tar cf - `find gnu/libintl -name '*.d' -print`) \ + | (cd depends/include/d && tar xf -) +fi + +autopoint -f # was: gettextize -f -c +rm po/Makefile.in.in +rm po/Makevars.template +rm po/Rules-quot +rm po/boldquot.sed +rm po/en@boldquot.header +rm po/en@quot.header +rm po/insert-header.sed +rm po/quot.sed + +cp -p ${EXAMPLESCONFIGDIR-$GETTEXT_TOPSRCDIR/gettext-tools/gnulib-m4}/dcomp.m4 m4/dcomp.m4 +cp -p ${EXAMPLESCONFIGDIR-$GETTEXT_TOPSRCDIR/build-aux}/dcomp.sh.in dcomp.sh.in + +aclocal -I m4 + +autoconf + +automake -a -c + +rm -rf autom4te.cache + +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-d/configure.ac b/gettext-tools/examples/hello-d/configure.ac new file mode 100644 index 000000000..2a8b7f291 --- /dev/null +++ b/gettext-tools/examples/hello-d/configure.ac @@ -0,0 +1,49 @@ +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-d], [0]) +AC_CONFIG_SRCDIR([hello.d.in]) +AM_INIT_AUTOMAKE([1.11]) + +gt_DCOMP +if test -z "$DC"; then + echo "*** D compiler not found" 1>&2 + exit 1 +fi + +D_PACKAGES_PREFIX='$(srcdir)/depends' +D_PACKAGES_EXECPREFIX='./depends' +AC_ARG_WITH([d-packages-prefix], + [[ --with-d-packages-prefix=DIR search for D packages in DIR/include/d, DIR/lib]], + [if test "X$withval" != "X" && test "X$withval" != "Xno"; then + D_PACKAGES_PREFIX="$withval" + D_PACKAGES_EXECPREFIX="$D_PACKAGES_PREFIX" + fi + ]) +AC_SUBST([D_PACKAGES_PREFIX]) +AC_SUBST([D_PACKAGES_EXECPREFIX]) + +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]) + +AM_GNU_GETTEXT([external]) +AM_GNU_GETTEXT_VERSION([0.24]) + +AC_CONFIG_FILES([Makefile hello.d]) +AC_CONFIG_FILES([dcomp.sh]) +AC_CONFIG_FILES([m4/Makefile]) +AC_CONFIG_FILES([po/Makefile], [AM_POSTPROCESS_PO_MAKEFILE]) +AC_OUTPUT diff --git a/gettext-tools/examples/hello-d/hello.d.in b/gettext-tools/examples/hello-d/hello.d.in new file mode 100644 index 000000000..544e605ab --- /dev/null +++ b/gettext-tools/examples/hello-d/hello.d.in @@ -0,0 +1,29 @@ +/* Example for use of GNU gettext. + This file is in the public domain. + + Source code of the D program. */ + + +// Get writeln. +import std.stdio; +// Get format. +import std.format; +// Get locale constants. +import core.stdc.locale : LC_ALL; +// Get textdomain, bindtextdomain, gettext, ngettext, setlocale. +import gnu.libintl : textdomain, bindtextdomain, gettext, ngettext, setlocale; +// Get thisProcessID. +import std.process : thisProcessID; + +// Define _() as a shorthand for gettext(). +alias _ = gettext; + +void main (string[] args) +{ + setlocale (LC_ALL, ""); + textdomain ("hello-d"); + bindtextdomain ("hello-d", `@localedir@`); + + writeln (_("Hello, world!")); + writeln (format (_("This program is running as process number %d."), thisProcessID)); +} diff --git a/gettext-tools/examples/hello-d/m4/Makefile.am b/gettext-tools/examples/hello-d/m4/Makefile.am new file mode 100644 index 000000000..0b103bb74 --- /dev/null +++ b/gettext-tools/examples/hello-d/m4/Makefile.am @@ -0,0 +1,3 @@ +EXTRA_DIST = \ + nls.m4 po.m4 \ + dcomp.m4 diff --git a/gettext-tools/examples/hello-d/po/LINGUAS b/gettext-tools/examples/hello-d/po/LINGUAS new file mode 100644 index 000000000..dc4a82afb --- /dev/null +++ b/gettext-tools/examples/hello-d/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-d/po/Makefile.am b/gettext-tools/examples/hello-d/po/Makefile.am new file mode 100644 index 000000000..42d7beddc --- /dev/null +++ b/gettext-tools/examples/hello-d/po/Makefile.am @@ -0,0 +1,434 @@ +# 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 = \ + hello.d.in + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = -k_ --flag=_:1:pass-c-format --flag=_:1:pass-d-format + +# 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 msgid 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/installpaths.in b/gettext-tools/examples/installpaths.in index 3a17c2e71..3d31403f5 100644 --- a/gettext-tools/examples/installpaths.in +++ b/gettext-tools/examples/installpaths.in @@ -1,6 +1,6 @@ # Shell script snippet that records various directories found by 'configure'. -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003-2025 Free Software Foundation, Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ exec_prefix="@exec_prefix@" datarootdir="@datarootdir@" datadir="@datadir@" docdir="@docdir@" +includedir="@includedir@" ACLOCALDIR="@aclocaldir@" GETTEXTSRCDIR="@datadir@/gettext" GETTEXTSRCPODIR="@datadir@/gettext/po" diff --git a/gettext-tools/examples/po/Makefile.am b/gettext-tools/examples/po/Makefile.am index e00ff220b..384ce47ef 100644 --- a/gettext-tools/examples/po/Makefile.am +++ b/gettext-tools/examples/po/Makefile.am @@ -68,6 +68,7 @@ POTFILES = \ hello-sh/hello.sh \ hello-gawk/hello.awk \ hello-pascal/hello.pas \ + hello-d/hello.d.in \ hello-smalltalk/hello.st.in \ hello-tcl/hello.tcl \ hello-tcl-tk/hello.tcl \ @@ -109,6 +110,7 @@ SMALLPOTS = \ hello-sh.pot \ hello-gawk.pot \ hello-pascal.pot \ + hello-d.pot \ hello-smalltalk.pot \ hello-tcl.pot \ hello-tcl-tk.pot \ @@ -352,6 +354,9 @@ hello-gawk.pot : $(POTFILES_DEPS) hello-pascal.pot : $(POTFILES_DEPS) $(USE_BUILT_PROGS) $(SHELL) '$(srcdir)/xsmallpot.sh' '$(srcdir)' hello-pascal +hello-d.pot : $(POTFILES_DEPS) + $(USE_BUILT_PROGS) $(SHELL) '$(srcdir)/xsmallpot.sh' '$(srcdir)' hello-d + hello-smalltalk.pot : $(POTFILES_DEPS) $(USE_BUILT_PROGS) $(SHELL) '$(srcdir)/xsmallpot.sh' '$(srcdir)' hello-smalltalk @@ -477,6 +482,7 @@ SMALLPOFILES_FOR_lang = \ $(srcdir)/../hello-sh/po/$$lang.po \ $(srcdir)/../hello-gawk/po/$$lang.po \ $(srcdir)/../hello-pascal/po/$$lang.po \ + $(srcdir)/../hello-d/po/$$lang.po \ $(srcdir)/../hello-smalltalk/po/$$lang.po \ $(srcdir)/../hello-tcl/po/$$lang.po \ $(srcdir)/../hello-tcl-tk/po/$$lang.po \ @@ -577,6 +583,9 @@ $(srcdir)/../hello-gawk/po/$(LL).po: $(srcdir)/hello-gawk.pot $(srcdir)/$(LL).po $(srcdir)/../hello-pascal/po/$(LL).po: $(srcdir)/hello-pascal.pot $(srcdir)/$(LL).po $(USE_BUILT_PROGS) cd $(srcdir) && $(SHELL) mmsmallpo.sh hello-pascal $(LL) +$(srcdir)/../hello-d/po/$(LL).po: $(srcdir)/hello-d.pot $(srcdir)/$(LL).po + $(USE_BUILT_PROGS) cd $(srcdir) && $(SHELL) mmsmallpo.sh hello-d $(LL) + $(srcdir)/../hello-smalltalk/po/$(LL).po: $(srcdir)/hello-smalltalk.pot $(srcdir)/$(LL).po $(USE_BUILT_PROGS) cd $(srcdir) && $(SHELL) mmsmallpo.sh hello-smalltalk $(LL) -- 2.47.3