findutils-patches
[Top][All Lists]
Advanced

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

[Findutils-patches] [PATCH] Initial attempts to internationalise plural


From: James Youngman
Subject: [Findutils-patches] [PATCH] Initial attempts to internationalise plural forms better
Date: Wed, 19 Dec 2007 21:04:05 -0000

---
 find/find.c     |   26 ++++++++++++++++-------
 find/fstype.c   |    8 +++++-
 find/ftsfind.c  |    7 ++++-
 find/parser.c   |   21 ++++++++++--------
 find/pred.c     |   15 ++++++++++--
 find/tree.c     |    2 +-
 lib/regextype.c |    2 +-
 locate/locate.c |   61 ++++++++++++++++++++++++++++++------------------------
 xargs/xargs.c   |   36 ++++++++++++++++++++-----------
 9 files changed, 112 insertions(+), 66 deletions(-)

diff --git a/find/find.c b/find/find.c
index acee35e..7022d05 100644
--- a/find/find.c
+++ b/find/find.c
@@ -64,6 +64,7 @@
 # define _(Text) Text
 #define textdomain(Domain)
 #define bindtextdomain(Package, Directory)
+#define ngettext(singular,plural,n) ((1==n) ? singular : plural)
 #endif
 #ifdef gettext_noop
 # define N_(String) gettext_noop (String)
@@ -487,7 +488,8 @@ wd_sanity_check(const char *thing_to_stat,
          {
            fstype = filesystem_type(newinfo, current_dir);
            error (1, 0,
-                  _("%s%s changed during execution of %s (old device number 
%ld, new device number %ld, file system type is %s) [ref %ld]"),
+                  _("%1$s%2$s changed during execution of %3$s "
+                    "(old device number %4$ld, new device number %5$ld, file 
system type is %6$s) [ref %7$ld]"),
                   safely_quote_err_filename(0, specific_what),
                   parent ? "/.." : "",
                   safely_quote_err_filename(1, progname),
@@ -524,7 +526,8 @@ wd_sanity_check(const char *thing_to_stat,
       
       error ((isfatal == FATAL_IF_SANITY_CHECK_FAILS) ? 1 : 0,
             0,                 /* no relevant errno value */
-            _("%s%s changed during execution of %s (old inode number %ld, new 
inode number %ld, file system type is %s) [ref %ld]"),
+            _("%1$s%2$s changed during execution of %3$s "
+              "(old inode number %4$ld, new inode number %5$ld, file system 
type is %5$s) [ref %7$ld]"),
             safely_quote_err_filename(0, specific_what), 
             parent ? "/.." : "",
             safely_quote_err_filename(1, progname),
@@ -1121,12 +1124,14 @@ issue_loop_warning(const char *name, const char 
*pathname, int level)
        * to /a/b/c.
        */
       error(0, 0,
-           _("Filesystem loop detected; %s has the same device number and 
inode as a directory which is %d %s."),
+           ngettext(
+                    "Filesystem loop detected; %1$s has the same device number 
and inode as "
+                    "a directory which is %2$d level higher in the file system 
hierarchy",
+                    "Filesystem loop detected; %1$s has the same device number 
and inode as "
+                    "a directory which is %2$d levels higher in the file 
system hierarchy",
+                    (long)distance),
            safely_quote_err_filename(0, pathname),
-           distance,
-           (distance == 1 ?
-            _("level higher in the file system hierarchy") :
-            _("levels higher in the file system hierarchy")));
+           distance);
     }
 }
 
@@ -1415,7 +1420,12 @@ process_dir (char *pathname, char *name, int pathlen, 
const struct stat *statp,
                   * doesn't really handle hard links with Unix semantics.
                   * In the latter case, -noleaf should be used routinely.
                   */
-                 error(0, 0, _("WARNING: Hard link count is wrong for %s (saw 
only st_nlink=%d but we already saw %d subdirectories): this may be a bug in 
your file system driver.  Automatically turning on find's -noleaf option.  
Earlier results may have failed to include directories that should have been 
searched."),
+                 error(0, 0, _("WARNING: Hard link count is wrong for %1$s "
+                               "(saw only st_nlink=%2$d but we already saw 
%3$d subdirectories): "
+                               "this may be a bug in your file system driver.  
"
+                               "Automatically turning on find's -noleaf 
option.  "
+                               "Earlier results may have failed to include 
directories "
+                               "that should have been searched."),
                        safely_quote_err_filename(0, pathname),
                        statp->st_nlink,
                        dircount);
diff --git a/find/fstype.c b/find/fstype.c
index 75b3371..ed2946a 100644
--- a/find/fstype.c
+++ b/find/fstype.c
@@ -246,8 +246,12 @@ file_system_type_uncached (const struct stat *statp, const 
char *path)
 
   /* Don't cache unknown values. */
   fstype_known = (type != NULL);
-  
-  return type ? type : xstrdup(_("unknown"));
+  if (type)
+    return type;
+  else
+    return xstrdup(_("unknown"
+                    /* TRANSLATORS: this is essentially an abbreviation 
+                       for "unknown file system type" */));
 }
 
 
diff --git a/find/ftsfind.c b/find/ftsfind.c
index 7f882a6..361cace 100644
--- a/find/ftsfind.c
+++ b/find/ftsfind.c
@@ -296,7 +296,7 @@ issue_loop_warning(FTSENT * ent)
        */
       error(0, 0,
            _("File system loop detected; "
-             "%s is part of the same file system loop as %s."),
+             "%1$s is part of the same file system loop as %2$s."),
            safely_quote_err_filename(0, ent->fts_path),
            partial_quotearg_n(1,
                               ent->fts_cycle->fts_path,
@@ -607,7 +607,10 @@ find(char *arg)
   p = fts_open(arglist, ftsoptions, NULL);
   if (NULL == p)
     {
-      error (0, errno, _("cannot search %s"),
+      error (0, errno, _("cannot search %s"
+                        /* TRANSLATORS: the argument is either
+                           a file or a directory. */
+                        ),
             safely_quote_err_filename(0, arg));
     }
   else
diff --git a/find/parser.c b/find/parser.c
index 7eaefc1..a4d79eb 100644
--- a/find/parser.c
+++ b/find/parser.c
@@ -527,9 +527,9 @@ found_parser(const char *original_arg, const struct 
parser_table *entry)
            {
              /* option which follows a non-option */
              error (0, 0,
-                    _("warning: you have specified the %s "
-                      "option after a non-option argument %s, "
-                      "but options are not positional (%s affects "
+                    _("warning: you have specified the %1$s "
+                      "option after a non-option argument %2$s, "
+                      "but options are not positional (%3$s affects "
                       "tests specified before it as well as those "
                       "specified after it).  Please specify options "
                       "before other arguments.\n"),
@@ -1063,9 +1063,9 @@ parse_group (const struct parser_table* entry, char 
**argv, int *arg_ptr)
              else
                {
                  /* XXX: no test in test suite for this */
-                 error(1, 0, _("%s is not the name of an existing group and"
+                 error(1, 0, _("%1$s is not the name of an existing group and"
                                " it does not look like a numeric group ID "
-                               "because it has the unexpected suffix %s"),
+                               "because it has the unexpected suffix %2$s"),
                        quotearg_n_style(0, options.err_quoting_style, 
groupname),
                        quotearg_n_style(1, options.err_quoting_style, 
groupname+gid_len));
                  return false;
@@ -1346,7 +1346,7 @@ insert_depthspec(const struct parser_table* entry, char 
**argv, int *arg_ptr,
              return parse_noop(entry, argv, arg_ptr);
            }
        }
-      error(1, 0, _("Expected a positive decimal integer argument to %s, but 
got %s"),
+      error(1, 0, _("Expected a positive decimal integer argument to %1$s, but 
got %2$s"),
            predicate,
            quotearg_n_style(0, options.err_quoting_style, depthstr));
       return false;
@@ -1846,7 +1846,10 @@ parse_perm (const struct parser_table* entry, char 
**argv, int *arg_ptr)
     {
       change = mode_compile (perm_expr + mode_start);
       if (NULL == change)
-       error (1, 0, _("invalid mode %s"),
+       error (1, 0, _("invalid mode %s"
+                      /* TRANSLATORS: the argument is a 
+                       * file permission string like 'u=rw,go='
+                       */),
               quotearg_n_style(0, options.err_quoting_style, perm_expr));
     }
   perm_val[0] = mode_adjust (0, false, 0, change, NULL);
@@ -2979,9 +2982,9 @@ check_path_safety(const char *action, char **argv)
       else if ('/' != s[0])
        {
          /* Relative paths are also dangerous in $PATH. */
-         error(1, 0, _("The relative path %s is included in the PATH "
+         error(1, 0, _("The relative path %1$s is included in the PATH "
                        "environment variable, which is insecure in "
-                       "combination with the %s action of find.  "
+                       "combination with the %2$s action of find.  "
                        "Please remove that entry from $PATH"),
                safely_quote_err_filename(0, s),
                action);
diff --git a/find/pred.c b/find/pred.c
index bc26b58..1c00093 100644
--- a/find/pred.c
+++ b/find/pred.c
@@ -408,7 +408,12 @@ pred_delete (const char *pathname, struct stat *stat_buf, 
struct predicate *pred
                }
            }
        }
-      error (0, errno, _("cannot delete %s"),
+      error (0, errno, _("cannot delete %s"
+                        /* TRANSLATORS: the argument is either a
+                         * file or a directory, but we do not know which.
+                         * Mail address@hidden if you cannot correctly 
+                         * translate the string without knowing.
+                         */),
             safely_quote_err_filename(0, pathname));
       /* Previously I had believed that having the -delete action
        * return false provided the user with control over whether an
@@ -1411,7 +1416,11 @@ is_ok(const char *program, const char *arg)
      This standard does not have requirements for locales other than POSIX
   */
   /* XXX: printing UNTRUSTED data here. */
-  fprintf (stderr, _("< %s ... %s > ? "), program, arg);
+  fprintf (stderr, _("< %s ... %s > ? "
+                    /* TRANSLATORS: we would like, if possible, the final 
non-blank 
+                     * character of this string to be '?', but it is not 
+                     * wholly essential. */
+                    ), program, arg);
   fflush (stderr);
   return yesno();
 }
@@ -1969,7 +1978,7 @@ launch (const struct buildcmd_control *ctl,
   
   if (WIFSIGNALED (wait_status))
     {
-      error (0, 0, _("%s terminated by signal %d"),
+      error (0, 0, _("%1$s terminated by signal %2$d"),
             quotearg_n_style(0, options.err_quoting_style,
                              buildstate->cmd_argv[0]),
             WTERMSIG (wait_status));
diff --git a/find/tree.c b/find/tree.c
index 7420c60..38c198b 100644
--- a/find/tree.c
+++ b/find/tree.c
@@ -1259,7 +1259,7 @@ build_expression_tree(int argc, char *argv[], int 
end_of_leading_options)
                }
              else
                {
-                 error (1, 0, _("invalid argument `%s' to `%s'"),
+                 error (1, 0, _("invalid argument `%1$s' to `%2$s'"),
                         argv[i], predicate_name);
                }
            }
diff --git a/lib/regextype.c b/lib/regextype.c
index e060244..d43ae54 100644
--- a/lib/regextype.c
+++ b/lib/regextype.c
@@ -103,7 +103,7 @@ get_regex_type(const char *s)
       p += sprintf(p, "%s", quote(regex_map[i].name));
     }
   
-  error(1, 0, _("Unknown regular expression type %s; valid types are %s."),
+  error(1, 0, _("Unknown regular expression type %1$s; valid types are %2$s."),
        quote(s),
        buf);
   /*NOTREACHED*/
diff --git a/locate/locate.c b/locate/locate.c
index a55d807..78810ab 100644
--- a/locate/locate.c
+++ b/locate/locate.c
@@ -103,6 +103,7 @@
 # define _(Text) Text
 #define textdomain(Domain)
 #define bindtextdomain(Package, Directory)
+#define ngettext(singular,plural,n) ((1==n) ? singular : plural)
 #endif
 #ifdef gettext_noop
 # define N_(String) gettext_noop (String)
@@ -889,30 +890,34 @@ visit_count(struct process_data *procdata, void *context)
 static void
 print_stats(int argc, size_t database_file_size)
 {
-  char hbuf[LONGEST_HUMAN_READABLE + 1];
+  char hbuf1[LONGEST_HUMAN_READABLE + 1];
+  char hbuf2[LONGEST_HUMAN_READABLE + 1];
+  char hbuf3[LONGEST_HUMAN_READABLE + 1];
+  char hbuf4[LONGEST_HUMAN_READABLE + 1];
   
-  printf(_("Locate database size: %s bytes\n"),
+  printf(ngettext("Locate database size: %s byte\n",
+                 "Locate database size: %s bytes\n",
+                 database_file_size),
         human_readable ((uintmax_t) database_file_size,
-                        hbuf, human_ceiling, 1, 1));
+                        hbuf1, human_ceiling, 1, 1));
   
   printf( (results_were_filtered ? 
-          _("Matching Filenames: %s ") :
-          _("All Filenames: %s ")),
-        human_readable (statistics.total_filename_count,
-                        hbuf, human_ceiling, 1, 1));
-  printf(_("with a cumulative length of %s bytes"),
-        human_readable (statistics.total_filename_length,
-                        hbuf, human_ceiling, 1, 1));
-  
-  printf(_("\n\tof which %s contain whitespace, "),
-        human_readable (statistics.whitespace_count,
-                        hbuf, human_ceiling, 1, 1));
-  printf(_("\n\t%s contain newline characters, "),
-        human_readable (statistics.newline_count,
-                        hbuf, human_ceiling, 1, 1));
-  printf(_("\n\tand %s contain characters with the high bit set.\n"),
-        human_readable (statistics.highbit_filename_count,
-                        hbuf, human_ceiling, 1, 1));
+          _("Matching Filenames: %s\n") :
+          _("All Filenames: %s\n")),
+         human_readable (statistics.total_filename_count,
+                        hbuf1, human_ceiling, 1, 1));
+  /* XXX: We would ideally use ngettext() here, but I don't know 
+   *      how to use it to handle more than one possibly-plural thing/
+   */
+  printf(_("File names have a cumulative length of %1$s bytes.\n"
+          "Of those file names,\n"
+          "\n\t%2$s contain whitespace, "
+          "\n\t%3$s contain newline characters, "
+          "\n\tand %4$s contain characters with the high bit set.\n"),
+        human_readable (statistics.total_filename_length,  hbuf1, 
human_ceiling, 1, 1),
+        human_readable (statistics.whitespace_count,       hbuf2, 
human_ceiling, 1, 1),
+        human_readable (statistics.newline_count,          hbuf3, 
human_ceiling, 1, 1),
+        human_readable (statistics.highbit_filename_count, hbuf4, 
human_ceiling, 1, 1));
   
   if (!argc)
     {
@@ -993,8 +998,8 @@ looking_at_slocate_locatedb (const char *filename,
                   * We don't know how to handle those.
                   */
                  error(0, 0,
-                       _("locate database %s looks like an slocate "
-                         "database but it seems to have security level %c, "
+                       _("locate database %1$s looks like an slocate "
+                         "database but it seems to have security level %2$c, "
                          "which GNU findutils does not currently support"),
                        quotearg_n_style(0, locale_quoting_style, filename),
                        data[1]);
@@ -1124,7 +1129,7 @@ search_one_database (int argc,
           * so do nothing further 
           */
          error(0, 0,
-               _("%s is an slocate database of unsupported security level %d; 
skipping it."),
+               _("%1$s is an slocate database of unsupported security level 
%2$d; skipping it."),
                quotearg_n_style(0, locale_quoting_style, procdata.dbfile),
                slocate_seclevel);
          return 0;
@@ -1342,7 +1347,7 @@ search_one_database (int argc,
 
   if (stats)
     {
-      printf(_("Database %s is in the %s format.\n"),
+      printf(_("Database %1$s is in the %2$s format.\n"),
             procdata.dbfile,
             format_name);
     }
@@ -1859,10 +1864,12 @@ dolocate (int argc, char **argv, int secure_db_fd)
                  /* For example:
                     warning: database `fred' is more than 8 days old (actual 
age is 10 days)*/
                  error (0, 0,
-                        _("warning: database %s is more than %d %s old (actual 
age is %.1f %s)"),
+                        _("warning: database %1$s is more than %2$d %3$s old 
(actual age is %4$.1f %5$s)"),
                         quotearg_n_style(0,  locale_quoting_style, e), 
-                        warn_number_units,              _(warn_name_units),
-                        (age/(double)SECONDS_PER_UNIT), _(warn_name_units));
+                        warn_number_units,
+                        _(warn_name_units),
+                        (age/(double)SECONDS_PER_UNIT),
+                        _(warn_name_units));
                }
            }
        }
diff --git a/xargs/xargs.c b/xargs/xargs.c
index 1394fa3..3757cd5 100644
--- a/xargs/xargs.c
+++ b/xargs/xargs.c
@@ -318,13 +318,15 @@ get_char_oct_or_hex_escape(const char *s)
       if (16 == base)
        {
          error(1, 0,
-               _("Invalid escape sequence %s in input delimiter specification; 
character values must not exceed %lx."),
+               _("Invalid escape sequence %1$s in input delimiter 
specification; "
+                 "character values must not exceed %2$lx."),
                s, (unsigned long)UCHAR_MAX);
        }
       else
        {
          error(1, 0,
-               _("Invalid escape sequence %s in input delimiter specification; 
character values must not exceed %lo."),
+               _("Invalid escape sequence %1$s in input delimiter 
specification; "
+                 "character values must not exceed %2$lo."),
                s, (unsigned long)UCHAR_MAX);
        }
     }
@@ -333,7 +335,8 @@ get_char_oct_or_hex_escape(const char *s)
   if (0 != *endp)
     {
       error(1, 0,
-           _("Invalid escape sequence %s in input delimiter specification; 
trailing characters %s not recognised."),
+           _("Invalid escape sequence %1$s in input delimiter specification; "
+             "the trailing characters %2$s were not recognised."),
            s, endp);
     }
   
@@ -378,7 +381,9 @@ get_input_delimiter(const char *s)
       else
        {
          error(1, 0,
-               _("Invalid input delimiter specification %s: the delimiter must 
be either a single character or an escape sequence starting with \\."),
+               _("Invalid input delimiter specification %s: "
+                 "the delimiter must be either a single character "
+                 "or an escape sequence starting with \\."),
                s);
          /*NOTREACHED*/
          return 0;
@@ -580,8 +585,8 @@ main (int argc, char **argv)
            if (arg_size > bc_ctl.posix_arg_size_max)
              {
                error (0, 0,
-                      _("warning: value %ld for -s option is too large, "
-                        "using %ld instead"),
+                      _("warning: value %1$ld for -s option is too large, "
+                        "using %2$ld instead"),
                       arg_size, bc_ctl.posix_arg_size_max);
                arg_size = bc_ctl.posix_arg_size_max;
              }
@@ -838,8 +843,11 @@ read_line (void)
          if (state == QUOTE)
            {
              exec_if_possible ();
-             error (1, 0, _("unmatched %s quote; by default quotes are special 
to xargs unless you use the -0 option"),
-                    quotc == '"' ? _("double") : _("single"));
+             if (quotc == '"')
+               error (1, 0, _("unmatched double quote; by default quotes are 
special to xargs unless you use the -0 option"));
+             else
+               error (1, 0, _("unmatched single quote; by default quotes are 
special to xargs unless you use the -0 option"));
+
            }
          if (first && EOF_STR (linebuf))
            return -1;
@@ -931,8 +939,10 @@ read_line (void)
          if (c == '\n')
            {
              exec_if_possible ();
-             error (1, 0, _("unmatched %s quote; by default quotes are special 
to xargs unless you use the -0 option"),
-                    quotc == '"' ? _("double") : _("single"));
+             if (quotc == '"')
+               error (1, 0, _("unmatched double quote; by default quotes are 
special to xargs unless you use the -0 option"));
+             else
+               error (1, 0, _("unmatched single quote; by default quotes are 
special to xargs unless you use the -0 option"));
            }
          if (c == quotc)
            {
@@ -1264,14 +1274,14 @@ parse_num (char *str, int option, long int min, long 
int max, int fatal)
   val = strtol (str, &eptr, 10);
   if (eptr == str || *eptr)
     {
-      fprintf (stderr, _("%s: invalid number for -%c option\n"),
+      fprintf (stderr, _("%1$s: invalid number for -%2$c option\n"),
               program_name, option);
       usage (stderr);
       exit(1);
     }
   else if (val < min)
     {
-      fprintf (stderr, _("%s: value for -%c option should be >= %ld\n"),
+      fprintf (stderr, _("%1$s: value for -%2$c option should be >= %3%ld\n"),
               program_name, option, min);
       if (fatal)
        {
@@ -1285,7 +1295,7 @@ parse_num (char *str, int option, long int min, long int 
max, int fatal)
     }
   else if (max >= 0 && val > max)
     {
-      fprintf (stderr, _("%s: value for -%c option should be < %ld\n"),
+      fprintf (stderr, _("%1$s: value for -%2$c option should be < %3$ld\n"),
               program_name, option, max);
       if (fatal)
        {
-- 
1.5.3.7





reply via email to

[Prev in Thread] Current Thread [Next in Thread]