]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
Deal with the case where a message gets or loses the plural form status
authorBruno Haible <bruno@clisp.org>
Fri, 30 Nov 2001 13:04:09 +0000 (13:04 +0000)
committerBruno Haible <bruno@clisp.org>
Sun, 21 Jun 2009 21:29:38 +0000 (23:29 +0200)
during msgmerge.

src/ChangeLog
src/Makefile.am
src/message.c
src/msgmerge.c
tests/ChangeLog
tests/Makefile.am
tests/msgmerge-17 [new file with mode: 0755]
tests/msgmerge-18 [new file with mode: 0755]
tests/msgmerge-19 [new file with mode: 0755]

index 84dcffd47612c6670c97a1a0d47df3ebbac90214..a6e708089e2aaaaedfd07f2cf129b36519e1e5a1 100644 (file)
@@ -1,3 +1,11 @@
+2001-11-30  Bruno Haible  <bruno@clisp.org>
+
+       * message.c (message_merge): Determine whether postprocessing is
+       needed.
+       * msgmerge.c (match_domain): Postprocess some problematic cases.
+       * Makefile.am (libgettextsrc_la_SOURCES): Add plural.c.
+       (msgfmt_SOURCES): Remove plural.c.
+
 2001-11-29  Bruno Haible  <bruno@clisp.org>
 
        * plural-eval.c: Include config.h and plural-exp.h.
index 1c01150b79b35a93289db19c8c04ffcad0062837..bf460f97fa66efe7167d1ab39e89fc34f98380f5 100644 (file)
@@ -72,14 +72,14 @@ format-ycp.c
 # libgettextsrc contains all code that is needed by at least two programs.
 libgettextsrc_la_SOURCES = \
 $(COMMON_SOURCE) read-po.c write-po.c msgl-ascii.c msgl-iconv.c msgl-equal.c \
-msgl-cat.c msgl-english.c file-list.c msgl-charset.c po-time.c \
+msgl-cat.c msgl-english.c file-list.c msgl-charset.c po-time.c plural.c \
 $(FORMAT_SOURCE)
 
 # Source dependencies.
 gettext_SOURCES = gettext.c
 ngettext_SOURCES = ngettext.c
 msgcmp_SOURCES = msgcmp.c
-msgfmt_SOURCES = msgfmt.c write-mo.c write-java.c plural.c plural-eval.c
+msgfmt_SOURCES = msgfmt.c write-mo.c write-java.c plural-eval.c
 msgmerge_SOURCES = msgmerge.c
 msgunfmt_SOURCES = msgunfmt.c read-mo.c read-java.c
 xgettext_SOURCES = xgettext.c x-c.c x-po.c x-java.l x-ycp.c x-rst.c
index 08dbfafc420a2f50887bf06a1ece0173bee6334c..0f19e202d53ac1dba8a388fb9673133189ca042e 100644 (file)
@@ -420,6 +420,19 @@ message_merge (def, ref)
       message_comment_filepos (result, pp->file_name, pp->line_number);
     }
 
+  /* Special postprocessing is needed if the reference message is a
+     plural form and the definition message isn't, or vice versa.  */
+  if (ref->msgid_plural != NULL)
+    {
+      if (def->msgid_plural == NULL)
+       result->used = 1;
+    }
+  else
+    {
+      if (def->msgid_plural != NULL)
+       result->used = 2;
+    }
+
   /* All done, return the merged message to the caller.  */
   return result;
 }
index 35bac222320a6214d71859d2c79a580ffe6e9e14..a7272ff3a3450d7405ad2753f0a827fe7e395986 100644 (file)
 #include "message.h"
 #include "read-po.h"
 #include "write-po.h"
+#include "xmalloc.h"
 #include "system.h"
 #include "po.h"
 #include "msgl-equal.h"
+#include "plural-exp.h"
 #include "backupfile.h"
 #include "copy-file.h"
 #include "libgettext.h"
@@ -577,6 +579,85 @@ this message is used but not defined in %s"), fn1);
            }
        }
     }
+
+  /* Now postprocess the problematic merges.  This is needed because we
+     want the result to pass the "msgfmt -c -v" check.  */
+  {
+    /* message_merge sets mp->used to 1 or 2, depending on the problem.
+       Compute the bitwise OR of all these.  */
+    int problematic = 0;
+
+    for (j = 0; j < resultmlp->nitems; j++)
+      problematic |= resultmlp->item[j]->used;
+
+    if (problematic)
+      {
+       unsigned long int nplurals = 0;
+
+       if (problematic & 1)
+         {
+           /* Need to know nplurals of the result domain.  */
+           message_ty *header_entry;
+           struct expression *plural;
+
+           header_entry = message_list_search (resultmlp, "");
+           extract_plural_expression (header_entry
+                                      ? header_entry->msgstr
+                                      : NULL,
+                                      &plural, &nplurals);
+         }
+
+       for (j = 0; j < resultmlp->nitems; j++)
+         {
+           message_ty *mp = resultmlp->item[j];
+
+           if ((mp->used & 1) && (nplurals > 0))
+             {
+               /* ref->msgid_plural != NULL but def->msgid_plural == NULL.
+                  Use a copy of def->msgstr for each possible plural form.  */
+               size_t new_msgstr_len;
+               char *new_msgstr;
+               char *p;
+               unsigned long i;
+
+               if (verbosity_level > 1)
+                 {
+                   po_gram_error_at_line (&mp->pos, _("\
+this message should define plural forms"));
+                 }
+
+               new_msgstr_len = nplurals * mp->msgstr_len;
+               new_msgstr = (char *) xmalloc (new_msgstr_len);
+               for (i = 0, p = new_msgstr; i < nplurals; i++)
+                 {
+                   memcpy (p, mp->msgstr, mp->msgstr_len);
+                   p += mp->msgstr_len;
+                 }
+               mp->msgstr = new_msgstr;
+               mp->msgstr_len = new_msgstr_len;
+               mp->is_fuzzy = true;
+             }
+
+           if ((mp->used & 2) && (mp->msgstr_len > strlen (mp->msgstr) + 1))
+             {
+               /* ref->msgid_plural == NULL but def->msgid_plural != NULL.
+                  Use only the first among the plural forms.  */
+
+               if (verbosity_level > 1)
+                 {
+                   po_gram_error_at_line (&mp->pos, _("\
+this message should not define plural forms"));
+                 }
+
+               mp->msgstr_len = strlen (mp->msgstr) + 1;
+               mp->is_fuzzy = true;
+             }
+
+           /* Postprocessing of this message is done.  */
+           mp->used = 0;
+         }
+      }
+  }
 }
 
 static msgdomain_list_ty *
index 6dd22799d2d966759072867807935f8814a2e038..70743c83cb17c0b3fae1e5557cf731aa3df517a6 100644 (file)
@@ -1,3 +1,10 @@
+2001-11-30  Bruno Haible  <bruno@clisp.org>
+
+       * msgmerge-17: New file.
+       * msgmerge-18: New file.
+       * msgmerge-19: New file.
+       * Makefile.am (TESTS): Add them.
+
 2001-11-27  Bruno Haible  <bruno@clisp.org>
 
        * Makefile.am (TESTS): Add msgmerge-14, msgmerge-15, msgmerge-16.
index 0f07ba630f9b2e268ccc6bc82732094c9df88e00..c7a1dfdef1e374aad9e0836c682393e1027138ae 100644 (file)
@@ -30,7 +30,8 @@ TESTS = gettext-1 gettext-2 \
        msgfmt-8 msgfmt-9 \
        msgmerge-1 msgmerge-2 msgmerge-3 msgmerge-4 msgmerge-5 msgmerge-6 \
        msgmerge-7 msgmerge-8 msgmerge-9 msgmerge-10 msgmerge-11 msgmerge-12 \
-       msgmerge-13 msgmerge-14 msgmerge-15 msgmerge-16 \
+       msgmerge-13 msgmerge-14 msgmerge-15 msgmerge-16 msgmerge-17 \
+       msgmerge-18 msgmerge-19 \
        msgunfmt-1 \
        msguniq-1 msguniq-2 msguniq-3 \
        xgettext-1 xgettext-2 xgettext-3 xgettext-4 xgettext-5 xgettext-6 \
diff --git a/tests/msgmerge-17 b/tests/msgmerge-17
new file mode 100755 (executable)
index 0000000..d729cb5
--- /dev/null
@@ -0,0 +1,92 @@
+#! /bin/sh
+
+# Test merging of a message which has plural forms in ref.pot but not
+# in def.po.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mm-test17.po"
+cat <<EOF > mm-test17.po
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cog_training 1.0\n"
+"POT-Creation-Date: 2001-04-29 22:40+0200\n"
+"PO-Revision-Date: 2001-04-29 21:19+02:00\n"
+"Last-Translator: Felix N. <xyz@zyx.uucp>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#:foobar.c:29
+#, c-format
+msgid "%d error"
+msgstr "%d erreur"
+EOF
+
+tmpfiles="$tmpfiles mm-test17.pot"
+cat <<EOF > mm-test17.pot
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2001-04-30 18:51+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#:foobar.c:32
+#, c-format
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] ""
+msgstr[1] ""
+EOF
+
+tmpfiles="$tmpfiles mm-test17.out"
+: ${MSGMERGE=msgmerge}
+${MSGMERGE} -q mm-test17.po mm-test17.pot -o mm-test17.out
+
+tmpfiles="$tmpfiles mm-test17.ok"
+cat <<EOF > mm-test17.ok
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cog_training 1.0\n"
+"POT-Creation-Date: 2001-04-30 18:51+0200\n"
+"PO-Revision-Date: 2001-04-29 21:19+02:00\n"
+"Last-Translator: Felix N. <xyz@zyx.uucp>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: foobar.c:32
+#, fuzzy, c-format
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] "%d erreur"
+msgstr[1] "%d erreur"
+EOF
+
+: ${DIFF=diff}
+${DIFF} mm-test17.ok mm-test17.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/tests/msgmerge-18 b/tests/msgmerge-18
new file mode 100755 (executable)
index 0000000..662913c
--- /dev/null
@@ -0,0 +1,98 @@
+#! /bin/sh
+
+# Test merging of a message which has plural forms in ref.pot but not
+# in def.po.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mm-test18.po"
+cat <<EOF > mm-test18.po
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cog_training 1.0\n"
+"POT-Creation-Date: 2001-04-29 22:40+0200\n"
+"PO-Revision-Date: 2001-04-29 21:19+02:00\n"
+"Last-Translator: Felix N. <xyz@zyx.uucp>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
+"%100==4 ? 2 : 3);\n"
+
+#:foobar.c:29
+#, c-format
+msgid "%d error"
+msgstr "%d erreur"
+EOF
+
+tmpfiles="$tmpfiles mm-test18.pot"
+cat <<EOF > mm-test18.pot
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2001-04-30 18:51+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#:foobar.c:32
+#, c-format
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] ""
+msgstr[1] ""
+EOF
+
+tmpfiles="$tmpfiles mm-test18.out"
+: ${MSGMERGE=msgmerge}
+${MSGMERGE} -q mm-test18.po mm-test18.pot -o mm-test18.out
+
+tmpfiles="$tmpfiles mm-test18.ok"
+cat <<EOF > mm-test18.ok
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cog_training 1.0\n"
+"POT-Creation-Date: 2001-04-30 18:51+0200\n"
+"PO-Revision-Date: 2001-04-29 21:19+02:00\n"
+"Last-Translator: Felix N. <xyz@zyx.uucp>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
+"%100==4 ? 2 : 3);\n"
+
+#: foobar.c:32
+#, fuzzy, c-format
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] "%d erreur"
+msgstr[1] "%d erreur"
+msgstr[2] "%d erreur"
+msgstr[3] "%d erreur"
+EOF
+
+: ${DIFF=diff}
+${DIFF} mm-test18.ok mm-test18.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/tests/msgmerge-19 b/tests/msgmerge-19
new file mode 100755 (executable)
index 0000000..6810492
--- /dev/null
@@ -0,0 +1,90 @@
+#! /bin/sh
+
+# Test merging of a message which has plural forms in def.po but not
+# in ref.pot.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mm-test19.po"
+cat <<EOF > mm-test19.po
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cog_training 1.0\n"
+"POT-Creation-Date: 2001-04-29 22:40+0200\n"
+"PO-Revision-Date: 2001-04-29 21:19+02:00\n"
+"Last-Translator: Felix N. <xyz@zyx.uucp>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#:foobar.c:29
+#, c-format
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] "%d erreur"
+msgstr[1] "%d erreurs"
+EOF
+
+tmpfiles="$tmpfiles mm-test19.pot"
+cat <<EOF > mm-test19.pot
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2001-04-30 18:51+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#:foobar.c:32
+#, c-format
+msgid "%d error"
+msgstr ""
+EOF
+
+tmpfiles="$tmpfiles mm-test19.out"
+: ${MSGMERGE=msgmerge}
+${MSGMERGE} -q mm-test19.po mm-test19.pot -o mm-test19.out
+
+tmpfiles="$tmpfiles mm-test19.ok"
+cat <<EOF > mm-test19.ok
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cog_training 1.0\n"
+"POT-Creation-Date: 2001-04-30 18:51+0200\n"
+"PO-Revision-Date: 2001-04-29 21:19+02:00\n"
+"Last-Translator: Felix N. <xyz@zyx.uucp>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: foobar.c:32
+#, fuzzy, c-format
+msgid "%d error"
+msgstr "%d erreur"
+EOF
+
+: ${DIFF=diff}
+${DIFF} mm-test19.ok mm-test19.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result