[GRASS5] PATCH: i.gensig

I need to clean up some old cruft I had not already committed to
generate a clean, uncluttered patch for the tempfile issues.

Any objections to the attached patch? Just some benign updates to
i.gensig to do with message output and localization.

--
Brad Douglas <rez@touchofmadness.com>

(attachments)

i.gensig.pat (12.7 KB)

Brad,

I did a quick inspection - looks good to me.

Markus

On Thu, Jul 21, 2005 at 02:23:05PM -0700, Brad Douglas wrote:

I need to clean up some old cruft I had not already committed to
generate a clean, uncluttered patch for the tempfile issues.

Any objections to the attached patch? Just some benign updates to
i.gensig to do with message output and localization.

--
Brad Douglas <rez@touchofmadness.com>

? imagery/i.gensig/OBJ.x86_64-unknown-linux-gnu
Index: imagery/i.gensig/check.c

RCS file: /grassrepository/grass6/imagery/i.gensig/check.c,v
retrieving revision 2.0
diff -u -r2.0 check.c
--- imagery/i.gensig/check.c 9 Nov 2004 12:55:04 -0000 2.0
+++ imagery/i.gensig/check.c 21 Jul 2005 21:18:31 -0000
@@ -1,6 +1,9 @@
#include "imagery.h"
+#include "glocale.h"
#include "signature.h"
#include "local_proto.h"
+
+
int
check_signatures (struct Signature *S)
{
@@ -18,14 +21,14 @@
   if (!can_invert(temp.sig[0].var, S->nbands))
   {
       S->sig[i].status = -1;
- fprintf (stderr, "Signature %d not invertible\n", i+1);
+ G_message(_("Signature [%d] not invertible,"), i+1);
       continue;
   }
   copy_covariances (temp.sig[0].var, S->sig[i].var, S->nbands);
   if (!eigen(temp.sig[0].var, lambda, S->nbands))
   {
       S->sig[i].status = -1;
- fprintf (stderr, "Signature %d can't get eigen values\n", i+1);
+ G_message(_("Signature [%d] can't get eigen values."), i+1);
       continue;
   }
   for (j = 0; j < S->nbands; j++)
@@ -33,7 +36,7 @@
       if (lambda[j] <= 0.0)
       {
     S->sig[i].status = -1;
- fprintf (stderr, "Signature %d not positive definite\n", i+1);
+ G_message(_("Signature [%d] not positive definite."), i+1);
     break;
       }
   }
Index: imagery/i.gensig/covariance.c

RCS file: /grassrepository/grass6/imagery/i.gensig/covariance.c,v
retrieving revision 2.1
diff -u -r2.1 covariance.c
--- imagery/i.gensig/covariance.c 13 Jul 2005 15:22:44 -0000 2.1
+++ imagery/i.gensig/covariance.c 21 Jul 2005 21:18:31 -0000
@@ -1,9 +1,11 @@
#include <stdlib.h>
#include "imagery.h"
+#include "glocale.h"
#include "signature.h"
#include "files.h"
#include "local_proto.h"

+
/* must be called after compute_means() */
int compute_covariances (struct files *files, struct Signature *S)
{
@@ -21,7 +23,8 @@
     ncols = G_window_cols();
     class = (CELL *) G_calloc (ncols, sizeof(CELL));

- fprintf (stderr, "Calculating class covariance matri%s ...", S->nsigs==1?"x":"ces");
+ G_message(_("Calculating class covariance matri%s ..."),
+ S->nsigs==1 ? "x" : "ces");

     for (row = 0; row < nrows; row++)
     {
Index: imagery/i.gensig/get_train.c

RCS file: /grassrepository/grass6/imagery/i.gensig/get_train.c,v
retrieving revision 2.1
diff -u -r2.1 get_train.c
--- imagery/i.gensig/get_train.c 13 Jul 2005 15:22:44 -0000 2.1
+++ imagery/i.gensig/get_train.c 21 Jul 2005 21:18:31 -0000
@@ -1,8 +1,10 @@
#include <stdlib.h>
#include "imagery.h"
+#include "glocale.h"
#include "signature.h"
#include "files.h"

+
int get_training_classes (struct files *files, struct Signature *S)
{
     int fd;
@@ -23,11 +25,12 @@
/* determine the categories in the map */
     I_init_signatures (S, files->nbands);
     G_init_cell_stats (&cell_stats);
- fprintf (stderr, "Finding training classes ...");
+ G_message(_("Finding training classes ..."));
     for (row = 0; row < nrows; row++)
     {
   G_percent (row, nrows, 2);
- if (G_get_c_raster_row(fd, cell, row) < 0) exit(1);
+ if (G_get_c_raster_row(fd, cell, row) < 0)
+ G_fatal_error(_("Unable to read raster row."));
   G_update_cell_stats (cell, ncols, &cell_stats);
     }
     G_percent (row, nrows, 2);
@@ -49,15 +52,11 @@
     n++;
       }
       else
- fprintf (stderr,
- "WARNING: Training class [%d] only has one cell - this class will be ignored\n", cat);
+ G_warning(_("Training class [%d] only has one cell - this class will be ignored"), cat);
     }

     if (n==0)
- {
- fprintf (stderr, "ERROR: training map has no classes\n");
- exit(1);
- }
+ G_fatal_error(_("Training map has no classes."));

     list = (CELL *) G_calloc (n, sizeof(CELL));
     n = 0;
@@ -70,7 +69,7 @@

     files->ncats = n;
     files->training_cats = list;
- fprintf (stderr, "%d class%s\n", files->ncats, files->ncats==1?"":"es" );
+ G_message(_("%d class%s"), files->ncats, files->ncats==1 ? "" : "es");

     return 0;
}
Index: imagery/i.gensig/main.c

RCS file: /grassrepository/grass6/imagery/i.gensig/main.c,v
retrieving revision 2.1
diff -u -r2.1 main.c
--- imagery/i.gensig/main.c 13 Jul 2005 15:22:44 -0000 2.1
+++ imagery/i.gensig/main.c 21 Jul 2005 21:18:31 -0000
@@ -1,23 +1,25 @@
#include <stdlib.h>
#include "imagery.h"
+#include "glocale.h"
#include "signature.h"
#include "parms.h"
#include "files.h"
#include "local_proto.h"

+
int main (int argc, char *argv)
{
     struct parms parms; /* command line parms */
     struct files files; /* file descriptors, io, buffers */
     struct Signature S;
- struct GModule *module;
+ struct GModule *module;

     G_gisinit (argv[0]);

   module = G_define_module();
   module->description =
- "Generates statistics for i.maxlik "
- "from raster map layer.";
+ _("Generates statistics for i.maxlik "
+ "from raster map layer.");

     parse (argc,argv, &parms);
     openfiles (&parms, &files);
@@ -28,5 +30,6 @@
     compute_covariances (&files, &S);
     check_signatures (&S);
     write_sigfile (&parms, &S);
+
     exit(0);
}
Index: imagery/i.gensig/means.c

RCS file: /grassrepository/grass6/imagery/i.gensig/means.c,v
retrieving revision 2.1
diff -u -r2.1 means.c
--- imagery/i.gensig/means.c 13 Jul 2005 15:22:44 -0000 2.1
+++ imagery/i.gensig/means.c 21 Jul 2005 21:18:31 -0000
@@ -1,9 +1,11 @@
#include <stdlib.h>
#include "imagery.h"
+#include "glocale.h"
#include "signature.h"
#include "files.h"
#include "local_proto.h"

+
int compute_means (struct files *files, struct Signature *S)
{
     int n, n_nulls;
@@ -19,7 +21,7 @@
     ncols = G_window_cols();
     class = (CELL *) G_calloc (ncols, sizeof(CELL));

- fprintf (stderr, "Calculating class mean%s ...", S->nsigs==1?"":"s");
+ G_message(_("Calculating class mean%s ..."), S->nsigs==1 ? "" : "s");

     for (row = 0; row < nrows; row++)
     {
Index: imagery/i.gensig/opencell.c

RCS file: /grassrepository/grass6/imagery/i.gensig/opencell.c,v
retrieving revision 2.1
diff -u -r2.1 opencell.c
--- imagery/i.gensig/opencell.c 13 Jul 2005 15:22:44 -0000 2.1
+++ imagery/i.gensig/opencell.c 21 Jul 2005 21:18:31 -0000
@@ -1,5 +1,7 @@
#include <stdlib.h>
#include "gis.h"
+#include "glocale.h"
+

CELL *
open_cell (char *name, char *mapset, int *fd)
@@ -9,6 +11,5 @@
     if (*fd >= 0)
   return G_allocate_cell_buf();
     
- fprintf (stderr, "ERROR: unable to open raster map [%s]\n", name);
- exit(1);
+ G_fatal_error(_("Unable to open raster map [%s]."), name);
}
Index: imagery/i.gensig/openfiles.c

RCS file: /grassrepository/grass6/imagery/i.gensig/openfiles.c,v
retrieving revision 2.1
diff -u -r2.1 openfiles.c
--- imagery/i.gensig/openfiles.c 13 Jul 2005 15:22:44 -0000 2.1
+++ imagery/i.gensig/openfiles.c 21 Jul 2005 21:18:31 -0000
@@ -1,7 +1,10 @@
#include <stdlib.h>
#include "imagery.h"
+#include "glocale.h"
#include "parms.h"
#include "files.h"
+
+
int
openfiles (struct parms *parms, struct files *files)
{
@@ -11,18 +14,12 @@

     if (!I_get_subgroup_ref (parms->group, parms->subgroup, &Ref))
- {
- fprintf (stderr,
- "ERROR: unable to read REF file for subgroup [%s] in group [%s]\n",
- parms->subgroup, parms->group);
- exit(1);
- }
+ G_fatal_error(_("Unable to read REF file for subgroup [%s] in group [%s]."),
+ parms->subgroup, parms->group);
+
     if (Ref.nfiles <= 0)
- {
- fprintf (stderr, "ERROR: subgroup [%s] in group [%s] contains no files\n",
- parms->subgroup, parms->group);
- exit(1);
- }
+ G_fatal_error(_("Subgroup [%s] in group [%s] contains no files."),
+ parms->subgroup, parms->group);

     /* allocate file descriptors, and array of io buffers */
     files->nbands = Ref.nfiles;
Index: imagery/i.gensig/parse.c

RCS file: /grassrepository/grass6/imagery/i.gensig/parse.c,v
retrieving revision 2.1
diff -u -r2.1 parse.c
--- imagery/i.gensig/parse.c 13 Jul 2005 15:22:44 -0000 2.1
+++ imagery/i.gensig/parse.c 21 Jul 2005 21:18:31 -0000
@@ -1,7 +1,10 @@
#include <stdlib.h>
#include "gis.h"
+#include "glocale.h"
#include "imagery.h"
#include "parms.h"
+
+
int
parse (int argc, char *argv, struct parms *parms)
{
@@ -9,27 +12,27 @@

     trainingmap = G_define_option();
     trainingmap->key = "trainingmap";
- trainingmap->description = "ground truth training map";
+ trainingmap->description = _("ground truth training map");
     trainingmap->required = YES;
     trainingmap->type = TYPE_STRING;
     trainingmap->gisprompt = "old,cell,raster";

     group = G_define_option();
     group->key = "group";
- group->description = "imagery group";
+ group->description = _("imagery group");
     group->required = YES;
     group->type = TYPE_STRING;
     group->gisprompt = "old,group,group";

     subgroup = G_define_option();
     subgroup->key = "subgroup";
- subgroup->description = "subgroup containing image files";
+ subgroup->description = _("subgroup containing image files");
     subgroup->required = YES;
     subgroup->type = TYPE_STRING;

     sigfile = G_define_option();
     sigfile->key = "signaturefile";
- sigfile->description = "resultant signature file";
+ sigfile->description = _("resultant signature file");
     sigfile->required = YES;
     sigfile->type = TYPE_STRING;

@@ -42,20 +45,13 @@

/* check all the inputs */
     if(G_find_cell(parms->training_map, "") == NULL)
- {
- fprintf (stderr, "ERROR: training map [%s] not found\n", parms->training_map);
- exit(1);
- }
+ G_fatal_error(_("Training map [%s] not found."), parms->training_map);
+
     if (!I_find_group(parms->group))
- {
- fprintf (stderr, "ERROR: group [%s] not found\n", parms->group);
- exit(1);
- }
+ G_fatal_error(_("Group [%s] not found."), parms->group);
+
     if (!I_find_subgroup(parms->group, parms->subgroup))
- {
- fprintf (stderr, "ERROR: subgroup [%s] not found\n", parms->subgroup);
- exit(1);
- }
+ G_fatal_error(_("Subgroup [%s] not found."), parms->subgroup);

     return 0;
}
Index: imagery/i.gensig/print_sig.c

RCS file: /grassrepository/grass6/imagery/i.gensig/print_sig.c,v
retrieving revision 2.0
diff -u -r2.0 print_sig.c
--- imagery/i.gensig/print_sig.c 9 Nov 2004 12:56:10 -0000 2.0
+++ imagery/i.gensig/print_sig.c 21 Jul 2005 21:18:31 -0000
@@ -1,28 +1,28 @@
#include "imagery.h"
+#include "glocale.h"
#include "signature.h"

+
int
print_one_sig (struct Signature *S, int k)
{
   struct One_Sig *s;
   int i,n;
- FILE *fd;
-
- fd = stdout;

   s = &S->sig[k];

- fprintf (fd, "#%s\n", s->desc);
- fprintf (fd, "%d\n", s->npoints);
+ G_message(_("#%s"), s->desc);
+ G_message("%d", s->npoints);
+
   for (i=0; i < S->nbands; i++)
- fprintf(fd, "%lf ", s->mean[i]);
- fprintf (fd, "\n");
+ G_message("%lf\n", s->mean[i]);
+
   for (i=0; i < S->nbands; i++)
   {
       for (n=0; n < S->nbands; n++)
- fprintf (fd, "%lf ", s->var[i][n]);
- fprintf (fd, "\n");
+ G_message("%lf\n", s->var[i][n]);
   }
+
   if (s->have_color)
- fprintf (fd, "%f %f %f\n", s->r, s->g, s->b);
+ G_message("%f %f %f", s->r, s->g, s->b);
}
Index: imagery/i.gensig/write_sig.c

RCS file: /grassrepository/grass6/imagery/i.gensig/write_sig.c,v
retrieving revision 2.1
diff -u -r2.1 write_sig.c
--- imagery/i.gensig/write_sig.c 13 Jul 2005 15:22:44 -0000 2.1
+++ imagery/i.gensig/write_sig.c 21 Jul 2005 21:18:31 -0000
@@ -1,24 +1,23 @@
#include <stdlib.h>
#include "imagery.h"
+#include "glocale.h"
#include "signature.h"
#include "parms.h"

+
int write_sigfile (struct parms *parms, struct Signature *S)
{
     FILE *fd;

     fd = I_fopen_signature_file_new (parms->group, parms->subgroup, parms->sigfile);
     if (fd == NULL)
- {
- fprintf (stderr, "ERROR: unable to create signature file [%s] ", parms->sigfile);
- fprintf (stderr, "for subgroup [%s] in group [%s]\n",
- parms->subgroup, parms->group);
- exit(1);
- }
- fprintf (stderr, "Writing signature file [%s] ...", parms->sigfile);
- fflush (stderr);
+ G_fatal_error(_("Unable to create signature file [%s] for "
+ "subgroup [%s] in group [%s]."),
+ parms->sigfile, parms->subgroup, parms->group);
+
+ G_message(_("Writing signature file [%s] ..."), parms->sigfile);
     I_write_signatures (fd, S);
- fprintf (stderr, "\n");
+ G_message(_("Done."));

     return 0;
}

--
Markus Neteler <neteler itc it> http://mpa.itc.it
ITC-irst - Centro per la Ricerca Scientifica e Tecnologica
MPBA - Predictive Models for Biol. & Environ. Data Analysis
Via Sommarive, 18 - 38050 Povo (Trento), Italy

From: Markus Neteler <neteler@itc.it>
Sent: Fri, 22 Jul 2005 09:44:30 +0200

Brad,

I did a quick inspection - looks good to me.

Markus

On Thu, Jul 21, 2005 at 02:23:05PM -0700, Brad Douglas wrote:
> I need to clean up some old cruft I had not already committed to
> generate a clean, uncluttered patch for the tempfile issues.
>
> Any objections to the attached patch? Just some benign updates to
> i.gensig to do with message output and localization.

[...]

> - fprintf (stderr, "Calculating class covariance matri%s ...",

S->nsigs==1?"x":"ces");

> + G_message(_("Calculating class covariance matri%s ..."),
> + S->nsigs==1 ? "x" : "ces");

Please correct these to have two distinct strings in singluar and plural, e.g.

if( S->nsigs == 1 ){
  G_message(_("Calculating class covariance matrix ..."));
}else{
  G_message(_("Calculating class covariance matrices ..."));
}

Because:

1) Not every language has an easy suffix replacement plural/singular handling.
E.g. in spanish you also need to change an article that doesn't exist in english.

2) "x" and "ces" are not being translated.

3) It's not at all obvious in the .po file what "... matri%s" corresponds to.

There are three or four occurences of this trick.

Daniel.

Hello Brad

Brad Douglas wrote:

I need to clean up some old cruft I had not already committed to
generate a clean, uncluttered patch for the tempfile issues.

Any objections to the attached patch? Just some benign updates to
i.gensig to do with message output and localization.

- fprintf (stderr, "Calculating class covariance matri%s ...", S->nsigs==1?"x":"ces");
+ G_message(_("Calculating class covariance matri%s ..."), + S->nsigs==1 ? "x" : "ces");

Well I don't think this type of thing would translate well into other languages unless the singular and plural of the translation of the word matrix ended in 'x' and 'ces' respectively!
Might be better to simplify/lengthen it to something like

if( S->nsigs==1 )
   G_message(_("Calculating class covariance matrix ...");
else
   G_message(_("Calculating class covariance matrices ...");

Paul

On Fri, 2005-07-22 at 15:36 -0500, Daniel Calvelo Aros wrote:

From: Markus Neteler <neteler@itc.it>
Sent: Fri, 22 Jul 2005 09:44:30 +0200
>
> Brad,
>
> I did a quick inspection - looks good to me.
>
> Markus
>
> On Thu, Jul 21, 2005 at 02:23:05PM -0700, Brad Douglas wrote:
> > I need to clean up some old cruft I had not already committed to
> > generate a clean, uncluttered patch for the tempfile issues.
> >
> > Any objections to the attached patch? Just some benign updates to
> > i.gensig to do with message output and localization.

[...]
> > - fprintf (stderr, "Calculating class covariance matri%s ...",
S->nsigs==1?"x":"ces");
> > + G_message(_("Calculating class covariance matri%s ..."),
> > + S->nsigs==1 ? "x" : "ces");

Please correct these to have two distinct strings in singluar and plural, e.g.

if( S->nsigs == 1 ){
  G_message(_("Calculating class covariance matrix ..."));
}else{
  G_message(_("Calculating class covariance matrices ..."));
}

Ack! Thanks for catching this. I must have been in "drone mode". I'll
commit fixes today.

--
Brad Douglas <rez@touchofmadness.com>

Daniel Calvelo Aros wrote:

> > - fprintf (stderr, "Calculating class covariance matri%s ...", S->nsigs==1?"x":"ces");
> > + G_message(_("Calculating class covariance matri%s ..."),
> > + S->nsigs==1 ? "x" : "ces");

Please correct these to have two distinct strings in singluar and plural, e.g.

if( S->nsigs == 1 ){
  G_message(_("Calculating class covariance matrix ..."));
}else{
  G_message(_("Calculating class covariance matrices ..."));
}

In the general case, it's preferable to use a conditional expression
for the format string, i.e.:

  G_message(S->nsigs == 1
             ? _("Calculating class covariance matrix ...")
             : _("Calculating class covariance matrices ..."));

If the format string contains % specifiers and you are passing
arguments, you don't need to repeat the argument list for each case.

Because:

1) Not every language has an easy suffix replacement plural/singular handling.
E.g. in spanish you also need to change an article that doesn't exist in english.

2) "x" and "ces" are not being translated.

3) It's not at all obvious in the .po file what "... matri%s" corresponds to.

There are three or four occurences of this trick.

All good points:

Just in case it isn't clear: don't try to "construct" sentences with
printf(). This isn't limited to singular/plural forms, but also to
negatives (e.g. foo("X %s Y", test ? "is" : "is not")) and
alternatives (e.g. foo("X is %s", test ? "on" : "off")).

The problem is that trying to translate individual words, devoid of
context, is almost impossible. It needs to be borne in mind that any
given string can only have one translation in a module[1]. If you try
to translate individual words (particularly essential verbs such as
"is" or "has", or prepositions), you can easily end up with
conflicting translations.

[1] In this case, "module" means a text domain, i.e. either
"grasslibs" or "grassmods".

--
Glynn Clements <glynn@gclements.plus.com>