intltool r746 - in trunk: . tests tests/cases



Author: wbolster
Date: Fri Jul 25 17:55:03 2008
New Revision: 746
URL: http://svn.gnome.org/viewvc/intltool?rev=746&view=rev

Log:
2008-07-25  Wouter Bolsterlee  <wbolster svn gnome org>

	reviewed by: Rodney Dawes <dobey pwns gmail com>

	* intltool-extract.in:
	* intltool-merge.in:
	* tests/cases/az.po:
	* tests/cases/fr.po:
	* tests/selftest.pl.in:

	Bug 458794 â Context support works only for single
	context on a msgid. Patch and test case by Dan Winship
	<danw gnome org>.



Modified:
   trunk/ChangeLog
   trunk/intltool-extract.in
   trunk/intltool-merge.in
   trunk/tests/cases/az.po
   trunk/tests/cases/fr.po
   trunk/tests/selftest.pl.in

Modified: trunk/intltool-extract.in
==============================================================================
--- trunk/intltool-extract.in	(original)
+++ trunk/intltool-extract.in	Fri Jul 25 17:55:03 2008
@@ -47,6 +47,7 @@
 my $UPDATE_ARG  = "0";
 my $QUIET_ARG   = "0";
 my $SRCDIR_ARG	= ".";
+my $NOMSGCTXT_ARG = "0";
 
 my $FILE;
 my $OUTFILE;
@@ -76,6 +77,7 @@
             "update"     => \$UPDATE_ARG,
 	    "quiet|q"    => \$QUIET_ARG,
 	    "srcdir=s"	 => \$SRCDIR_ARG,
+	    "nomsgctxt"  => \$NOMSGCTXT_ARG,            
             ) or &error;
 
 &split_on_argument;
@@ -445,6 +447,11 @@
                 $lookup =~ s/^\s+//s;
                 $lookup =~ s/\s+$//s;
             }
+            if (exists $attrs->{"msgctxt"}) {
+                my $context = entity_decode ($attrs->{"msgctxt"});
+                $context =~ s/^["'](.*)["']/$1/;
+                $lookup = "$context\004$lookup";
+            }
 
 	    if ($lookup && $translate != 2) {
                 $comments{$lookup} = $XMLCOMMENT if $XMLCOMMENT;
@@ -833,6 +840,7 @@
     for my $message (@msgids)
     {
 	my $offsetlines = 1;
+	my $context = undef;
 	$offsetlines++ if $message =~ /%/;
 	if (defined ($comments{$message}))
 	{
@@ -847,12 +855,30 @@
                 if defined $comments{$message};
    	print OUT "/* xgettext:no-c-format */\n" if $message =~ /%/;
         
+    	if ($message =~ /(.*)\004(.*)/) {
+    	    $context = $1;
+    	    $message = $2;
+    	}
     	my @lines = split (/\n/, $message, -1);
     	for (my $n = 0; $n < @lines; $n++)
 	{
             if ($n == 0)
             {
- 		print OUT "char *s = N_(\""; 
+                if (defined $context)
+                {
+                     if ($NOMSGCTXT_ARG)
+                     {
+                          print OUT "char *s = N_(\"", $context, "|"; 
+                     }
+                     else
+                     {
+ 		          print OUT "char *s = C_(\"", $context, "\", \""; 
+                     }
+                }
+                else
+                {
+ 		     print OUT "char *s = N_(\""; 
+                }
             }
             else
             {  

Modified: trunk/intltool-merge.in
==============================================================================
--- trunk/intltool-merge.in	(original)
+++ trunk/intltool-merge.in	Fri Jul 25 17:55:03 2008
@@ -441,6 +441,18 @@
     &create_cache;
 }
 
+sub add_translation
+{
+    my ($lang, $msgctxt, $msgid, $msgstr) = @_;
+
+    return if !($msgid && $msgstr);
+
+    if ($msgctxt) {
+	$msgid = "$msgctxt\004$msgid";
+    }
+    $translations{$lang, $msgid} = $msgstr;
+}
+
 sub create_translation_database
 {
     for my $lang (keys %po_files_by_lang) 
@@ -468,8 +480,10 @@
         }
 
 	my $nextfuzzy = 0;
+	my $inmsgctxt = 0;
 	my $inmsgid = 0;
 	my $inmsgstr = 0;
+	my $msgctxt = "";
 	my $msgid = "";
 	my $msgstr = "";
 
@@ -477,31 +491,52 @@
         {
 	    $nextfuzzy = 1 if /^#, fuzzy/;
        
+	    if (/^msgctxt "((\\.|[^\\]+)*)"/ ) 
+            {
+		if ($inmsgstr) {
+		    add_translation ($lang, $msgctxt, $msgid, $msgstr);
+		    $msgctxt = "";
+		    $msgid = "";
+		    $msgstr = "";
+		}
+
+		$msgctxt = unescape_po_string($1);
+		$inmsgctxt = 1;
+		$inmsgid = 0;
+		$inmsgstr = 0;
+	    }
+
 	    if (/^msgid "((\\.|[^\\]+)*)"/ ) 
             {
-		$translations{$lang, $msgid} = $msgstr if $inmsgstr && $msgid && $msgstr;
-		$msgid = "";
-		$msgstr = "";
+		if ($inmsgstr) {
+		    add_translation ($lang, $msgctxt, $msgid, $msgstr);
+		    $msgctxt = "";
+		    $msgid = "";
+		    $msgstr = "";
+		}
 
 		if ($nextfuzzy) {
 		    $inmsgid = 0;
+		    $nextfuzzy = 0;
 		} else {
 		    $msgid = unescape_po_string($1);
 		    $inmsgid = 1;
 		}
+		$inmsgctxt = 0;
 		$inmsgstr = 0;
-		$nextfuzzy = 0;
 	    }
 
 	    if (/^msgstr "((\\.|[^\\]+)*)"/) 
             {
 	        $msgstr = unescape_po_string($1);
 		$inmsgstr = 1;
+		$inmsgctxt = 0;
 		$inmsgid = 0;
 	    }
 
 	    if (/^"((\\.|[^\\]+)*)"/) 
             {
+	        $msgctxt .= unescape_po_string($1) if $inmsgctxt;
 	        $msgid .= unescape_po_string($1) if $inmsgid;
 	        $msgstr .= unescape_po_string($1) if $inmsgstr;
 	    }
@@ -814,16 +849,23 @@
 
 	print $fh "<$nodename", $outattr;
 	if ($translate) {
-	    $lookup = getXMLstring($content, $spacepreserve);
+	    $content = getXMLstring($content, $spacepreserve);
             if (!$spacepreserve) {
-                $lookup =~ s/^\s+//s;
-                $lookup =~ s/\s+$//s;
+                $content =~ s/^\s+//s;
+                $content =~ s/\s+$//s;
+            }
+            if (exists $attrs->{"msgctxt"}) {
+                my $context = entity_decode ($attrs->{"msgctxt"});
+                $context =~ s/^["'](.*)["']/$1/;
+                $lookup = "$context\004$content";
+            } else {
+                $lookup = $content;
             }
 
 	    if ($lookup || $translate == 2) {
                 my $translation = $translations{$language, $lookup} if isWellFormedXmlFragment($translations{$language, $lookup});
                 if ($MULTIPLE_OUTPUT && ($translation || $translate == 2)) {
-                    $translation = $lookup if (!$translation);
+                    $translation = $content if (!$translation);
                     print $fh " xml:lang=\"", $language, "\"" if $language;
                     print $fh ">";
                     if ($translate == 2) {
@@ -840,7 +882,7 @@
                     if ($translate == 2) {
                         translate_subnodes($fh, \ all, $language, 1, $spacepreserve);
                     } else {
-                        print $fh $lookup;
+                        print $fh $content;
                     }
                     print $fh "</$nodename>";
                 }
@@ -859,7 +901,7 @@
                         my $localattrs = getAttributeString($attrs, 1, $lang, \$translate);
                         my $translation = $translations{$lang, $lookup} if isWellFormedXmlFragment($translations{$lang, $lookup});
                         if ($translate && !$translation) {
-                            $translation = $lookup;
+                            $translation = $content;
                         }
 
                         if ($translation || $translate) {

Modified: trunk/tests/selftest.pl.in
==============================================================================
--- trunk/tests/selftest.pl.in	(original)
+++ trunk/tests/selftest.pl.in	Fri Jul 25 17:55:03 2008
@@ -267,6 +267,16 @@
 system("$INTLTOOL_MERGE -x --quiet cases cases/$case.in cases/$case") == 0 or $failed = 1;
 check_merge_result($case);
 
+print "35. Extract messages from an XML file with msgctxts:                 ";
+$case = "context.xml.in";
+system("$INTLTOOL_EXTRACT --type=gettext/xml --quiet --update cases/$case") == 0 or $failed = 1;
+check_extract_result($case);
+
+print "36. Merge translations into an XML file with msgctxts:               ";
+$case = "context.xml";
+system("$INTLTOOL_MERGE -x --quiet cases cases/$case.in cases/$case") == 0 or $failed = 1;
+check_merge_result($case);
+
 system("rm -f cases/*.*") if $srcdir ne ".";
 system("rm -rf C az extract9 fr fr_BE fr_FR merge6 schemasmerge1 schemasmerge2 spacepreserve test test-quoted merge6.xml");
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]