git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v6 06/16] i18n: add--interactive: mark plural strings

From
Vasco Almeida <vascomalmeida@sapo.pt>
Date
Nov 11, 2016, 12:45 UTC
Message-ID
<20161111124541.8216-7-vascomalmeida@sapo.pt>
In-Reply-To
<20161111124541.8216-1-vascomalmeida@sapo.pt>

Mark plural strings for translation. Unfold each action case in one entire sentence.

Pass new keyword for xgettext to extract.
Update test to include new subroutine __n() for plural strings handling.

Update documentation to include a description of the new __n() subroutine.

Signed-off-by: Vasco Almeida <vascomalmeida@sapo.pt>
---
 Makefile                  |  3 ++-
 git-add--interactive.perl | 27 ++++++++++++++++++---------
 perl/Git/I18N.pm          | 10 +++++++++-
 t/t0202/test.pl           | 11 ++++++++++-
 4 files changed, 39 insertions(+), 12 deletions(-)
diff --git a/Makefile b/Makefile
index 9d6c24503..328151dd6 100644
--- a/Makefile
+++ b/Makefile
@@ -2113,7 +2113,8 @@ XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
 XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
-XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
+XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
+	--keyword=__ --keyword="__n:1,2"
 LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
 LOCALIZED_SH += git-parse-remote.sh
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index d05ac608e..cd617837b 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -669,12 +669,18 @@ sub status_cmd {
 sub say_n_paths {
 	my $did = shift @_;
 	my $cnt = scalar @_;
-	print "$did ";
-	if (1 < $cnt) {
-		print "$cnt paths\n";
-	}
-	else {
-		print "one path\n";
+	if ($did eq 'added') {
+		printf(__n("added %d path\n", "added %d paths\n",
+			   $cnt), $cnt);
+	} elsif ($did eq 'updated') {
+		printf(__n("updated %d path\n", "updated %d paths\n",
+			   $cnt), $cnt);
+	} elsif ($did eq 'reverted') {
+		printf(__n("reverted %d path\n", "reverted %d paths\n",
+			   $cnt), $cnt);
+	} else {
+		printf(__n("touched %d path\n", "touched %d paths\n",
+			   $cnt), $cnt);
 	}
 }
 
@@ -1423,7 +1429,8 @@ sub patch_update_file {
 				} elsif (0 < $response && $response <= $num) {
 					$ix = $response - 1;
 				} else {
-					error_msg "Sorry, only $num hunks available.\n";
+					error_msg sprintf(__n("Sorry, only %d hunk available.\n",
+							      "Sorry, only %d hunks available.\n", $num), $num);
 				}
 				next;
 			}
@@ -1518,8 +1525,10 @@ sub patch_update_file {
 			elsif ($other =~ /s/ && $line =~ /^s/) {
 				my @split = split_hunk($hunk[$ix]{TEXT}, $hunk[$ix]{DISPLAY});
 				if (1 < @split) {
-					print colored $header_color, "Split into ",
-					scalar(@split), " hunks.\n";
+					print colored $header_color, sprintf(
+						__n("Split into %d hunk.\n",
+						    "Split into %d hunks.\n",
+						    scalar(@split)), scalar(@split));
 				}
 				splice (@hunk, $ix, 1, @split);
 				$num = scalar @hunk;
diff --git a/perl/Git/I18N.pm b/perl/Git/I18N.pm
index f889fd6da..617d8c2a1 100644
--- a/perl/Git/I18N.pm
+++ b/perl/Git/I18N.pm
@@ -13,7 +13,7 @@ BEGIN {
 	}
 }
 
-our @EXPORT = qw(__);
+our @EXPORT = qw(__ __n);
 our @EXPORT_OK = @EXPORT;
 
 sub __bootstrap_locale_messages {
@@ -44,6 +44,7 @@ BEGIN
 	eval {
 		__bootstrap_locale_messages();
 		*__ = \&Locale::Messages::gettext;
+		*__n = \&Locale::Messages::ngettext;
 		1;
 	} or do {
 		# Tell test.pl that we couldn't load the gettext library.
@@ -51,6 +52,7 @@ BEGIN
 
 		# Just a fall-through no-op
 		*__ = sub ($) { $_[0] };
+		*__n = sub ($$$) { $_[2] == 1 ? $_[0] : $_[1] };
 	};
 }
 
@@ -70,6 +72,8 @@ Git::I18N - Perl interface to Git's Gettext localizations
 
 	printf __("The following error occurred: %s\n"), $error;
 
+	printf __n("commited %d file\n", "commited %d files\n", $files), $files;
+
 =head1 DESCRIPTION
 
 Git's internal Perl interface to gettext via L<Locale::Messages>. If
@@ -87,6 +91,10 @@ it.
 L<Locale::Messages>'s gettext function if all goes well, otherwise our
 passthrough fallback function.
 
+=head2 __n($$$)
+
+L<Locale::Messages>'s ngettext function or passthrough fallback function.
+
 =head1 AUTHOR
 
 E<AElig>var ArnfjE<ouml>rE<eth> Bjarmason <avarab@gmail.com>
diff --git a/t/t0202/test.pl b/t/t0202/test.pl
index 2c10cb469..4101833a8 100755
--- a/t/t0202/test.pl
+++ b/t/t0202/test.pl
@@ -4,7 +4,7 @@ use lib (split(/:/, $ENV{GITPERLLIB}));
 use strict;
 use warnings;
 use POSIX qw(:locale_h);
-use Test::More tests => 8;
+use Test::More tests => 11;
 use Git::I18N;
 
 my $has_gettext_library = $Git::I18N::__HAS_LIBRARY;
@@ -31,6 +31,7 @@ is_deeply(\@Git::I18N::EXPORT, \@Git::I18N::EXPORT_OK, "sanity: Git::I18N export
 	# more gettext wrapper functions.
 	my %prototypes = (qw(
 		__	$
+		__n	$$$
 	));
 	while (my ($sub, $proto) = each %prototypes) {
 		is(prototype(\&{"Git::I18N::$sub"}), $proto, "sanity: $sub has a $proto prototype");
@@ -46,6 +47,14 @@ is_deeply(\@Git::I18N::EXPORT, \@Git::I18N::EXPORT_OK, "sanity: Git::I18N export
 	my ($got, $expect) = (('TEST: A Perl test string') x 2);
 
 	is(__($got), $expect, "Passing a string through __() in the C locale works");
+
+	my ($got_singular, $got_plural, $expect_singular, $expect_plural) =
+		(('TEST: 1 file', 'TEST: n files') x 2);
+
+	is(__n($got_singular, $got_plural, 1), $expect_singular,
+		"Get singular string through __n() in C locale");
+	is(__n($got_singular, $got_plural, 2), $expect_plural,
+		"Get plural string through __n() in C locale");
 }
 
 # Test a basic message on different locales
-- 
2.11.0.rc0.33.gec17dab
Previous: Vasco AlmeidaNext: Vasco Almeida
Message 23 of 26 in “Mark strings in Perl scripts for translation”
  1. 00/16 Mark strings in Perl scripts for translationVasco Almeida, Nov 11, 2016
  2. 01/16 Git.pm: add subroutines for commenting linesVasco Almeida, Nov 11, 2016
  3. Vasco AlmeidaNov 22, 2016
  4. Junio C HamanoNov 22, 2016
  5. Vasco AlmeidaDec 9, 2016
  6. Johannes SchindelinDec 9, 2016
  7. Junio C HamanoDec 9, 2016
  8. Vasco AlmeidaDec 10, 2016
  9. Junio C HamanoDec 10, 2016
  10. Vasco AlmeidaDec 13, 2016
  11. Junio C HamanoDec 13, 2016
  12. 05/16 i18n: clean.c: match string with git-add--interactive.perlVasco Almeida, Nov 11, 2016
  13. 07/16 i18n: add--interactive: mark patch prompt for translationVasco Almeida, Nov 11, 2016
  14. 11/16 i18n: add--interactive: mark status words for translationVasco Almeida, Nov 11, 2016
  15. 12/16 i18n: send-email: mark strings for translationVasco Almeida, Nov 11, 2016
  16. 13/16 i18n: send-email: mark warnings and errors for translationVasco Almeida, Nov 11, 2016
  17. 15/16 i18n: send-email: mark composing message for translationVasco Almeida, Nov 11, 2016
  18. 08/16 i18n: add--interactive: i18n of help_patch_cmdVasco Almeida, Nov 11, 2016
  19. 14/16 i18n: send-email: mark string with interpolation for translationVasco Almeida, Nov 11, 2016
  20. 16/16 i18n: difftool: mark warnings for translationVasco Almeida, Nov 11, 2016
  21. 10/16 i18n: add--interactive: remove %patch_modes entriesVasco Almeida, Nov 11, 2016
  22. 09/16 i18n: add--interactive: mark edit_hunk_manually message for translationVasco Almeida, Nov 11, 2016
  23. 06/16 i18n: add--interactive: mark plural stringsVasco Almeida, Nov 11, 2016
  24. 04/16 i18n: add--interactive: mark strings with interpolation for translationVasco Almeida, Nov 11, 2016
  25. 02/16 i18n: add--interactive: mark strings for translationVasco Almeida, Nov 11, 2016
  26. 03/16 i18n: add--interactive: mark simple here-documents for translationVasco Almeida, Nov 11, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.