[Cluster-devel] [PATCH 3/3] mkfs i18n:

Carlos Maiolino cmaiolino at redhat.com
Wed Sep 21 00:33:53 UTC 2011


Hi Steve, I was looking through some codes from GNU project, and here are some examples I found:


from fdisk tool (this is the latest version, but I think fdisk is not often updated):

/* Prompt the user to answer a yes or no question. */
int
command_line_prompt_boolean_question (const char* prompt) {
        char        *user_ans;
        StrList *possibilities = str_list_create (_("yes"), _("no"), NULL);
        user_ans = fdisk_command_line_get_word (_(prompt), _("no"), possibilities, 0);

        if (strcmp (user_ans, _("yes")) == 0)
                return 1;

        /* user answered no */
        return 0;
}


I found another idea in the gnu parted.

The GNU parted adds the rpmatch function as a library
into the parted source code, and adds a regex expression
to be translated into the .pot file:

<snip>
 #: lib/rpmatch.c:147
 msgid "^[yY]"
 msgstr ""

 #: lib/rpmatch.c:160
 msgid "^[nN]"
 msgstr ""

</snip>

Looking through both of the above codes, looks like there 
is no specific rule about how to translate "y/n" strings.
In both cases these are translated via .pot file.

One suggestion, would be to split the string

"Are you sure? [y/n]"

in three different strings like:

"Are you sure?"
"yes"
"no"

This way would be more 'understandable' for translators
than the current one.
Or, we can add to the .pot file a comment explaining 
what to do with this portion of translation.



> > > Signed-off-by: Carlos Maiolino <cmaiolino at redhat.com>
> > > ---
> > >  gfs2/mkfs/main_mkfs.c |   30 ++++++++++++++++++++++--------
> > >  1 files changed, 22 insertions(+), 8 deletions(-)
> > > 
> > > diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
> > > index 4751f19..d68cf98 100644
> > > --- a/gfs2/mkfs/main_mkfs.c
> > > +++ b/gfs2/mkfs/main_mkfs.c
> > > @@ -456,8 +456,11 @@ fail:
> > >  
> > >  static void are_you_sure(struct gfs2_sbd *sdp)
> > >  {
> > > -	char input[32];
> > > +	char *line = NULL;
> > > +	size_t len = 0;
> > >  	int fd;
> > > +	int ret = -1;
> > > +	int res = 0;
> > >  
> > >  	fd = open(sdp->device_name, O_RDONLY|O_CLOEXEC);
> > >  	if (fd < 0)
> > > @@ -465,14 +468,25 @@ static void are_you_sure(struct gfs2_sbd *sdp)
> > >  	printf( _("This will destroy any data on %s.\n"), sdp->device_name);
> > >  	check_dev_content(sdp->device_name);
> > >  	close(fd);
> > > -	printf( _("\nAre you sure you want to proceed? [y/n] "));
> > > -	if(!fgets(input, 32, stdin))
> > > -		die( _("unable to read from stdin\n"));
> > > +	
> > > +	do{
> > > +		printf( _("\nAre you sure you want to proceed? [y/n]"));
> > This means that the translator needs to know that rpmatch is being used
> > and to also know how to translate this accordingly. Why not use
> > nl_langinfo() to put the response strings into this message?
> > 
> I was looking how nl_langinfo() works, and all it does to help with yes/no 
> questions is to return a regex expression (like [^[SsyY].*) to be used to match 
> the user's answer, it does not return a string or char value like yes/no (en_US) or 
> sim/nao(pt_BR) we can use to replace the y/n in the question string.
> 
> The rpmatch() function takes advantage of nl_langinfo() internaly to match the
> customer's answer according to which l10n the system is set.
> 
> This way, even using nl_langinfo(), the translator person will still need to translate
> the y/n to s/n, since is not possible to use nl_langinfo to replace these values.
> 
> What we could do, is to create an auxiliar function to check the return of nl_langinfo(),
> and, according with this value, write an specific string (s/n, y/n, etc). But, imho, this
> could lead to an error prone condition during string creation.
> 
> What u think?
> 
> Cheers,
> -- 
> --Carlos
> 

-- 
--Carlos




More information about the Cluster-devel mailing list