FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor


 
 
LinkBack Thread Tools
 
Old 09-06-2011, 05:41 PM
Carlos Maiolino
 
Default mkfs i18n:

Use rpmatch() function to get answer to
yes-or-no questions during mkfs confirmation

Signed-off-by: Carlos Maiolino <cmaiolino@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.
"), sdp->device_name);
check_dev_content(sdp->device_name);
close(fd);
- printf( _("
Are you sure you want to proceed? [y/n] "));
- if(!fgets(input, 32, stdin))
- die( _("unable to read from stdin
"));
+
+ do{
+ printf( _("
Are you sure you want to proceed? [y/n]"));
+ ret = getline(&line, &len, stdin);
+ res = rpmatch(line);
+
+ if (res > 0){
+ free(line);
+ return;
+ }
+ if (!res){
+ printf("
");
+ die( _("aborted
"));
+ }
+
+ }while(ret >= 0);

- if (input[0] != 'y')
- die( _("aborted
"));
- else
- printf("
");
+ if(line)
+ free(line);
}

/**
--
1.7.6
 
Old 09-06-2011, 06:29 PM
Bob Peterson
 
Default mkfs i18n:

Hi Carlos,

----- Original Message -----
| + do{
| + printf( _("
Are you sure you want to proceed? [y/n]"));
| + ret = getline(&line, &len, stdin);
| + res = rpmatch(line);

I'd like to see the free(line); moved right here after rpmatch.
Otherwise multiple iterations through the loop will leak memory.

| +
| + if (res > 0){

With my suggestion above, this can be removed:
| + free(line);

Other than that, it looks good.

Regards,

Bob Peterson
Red Hat File Systems
 
Old 09-06-2011, 07:10 PM
Steven Whitehouse
 
Default mkfs i18n:

Hi,

On Tue, 2011-09-06 at 14:41 -0300, Carlos Maiolino wrote:
> Use rpmatch() function to get answer to
> yes-or-no questions during mkfs confirmation
>
> Signed-off-by: Carlos Maiolino <cmaiolino@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.
"), sdp->device_name);
> check_dev_content(sdp->device_name);
> close(fd);
> - printf( _("
Are you sure you want to proceed? [y/n] "));
> - if(!fgets(input, 32, stdin))
> - die( _("unable to read from stdin
"));
> +
> + do{
> + printf( _("
Are 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?

Also, starting the string with
is a bit odd too,

Steve.


> + ret = getline(&line, &len, stdin);
> + res = rpmatch(line);
> +
> + if (res > 0){
> + free(line);
> + return;
> + }
> + if (!res){
> + printf("
");
> + die( _("aborted
"));
> + }
> +
> + }while(ret >= 0);
>
> - if (input[0] != 'y')
> - die( _("aborted
"));
> - else
> - printf("
");
> + if(line)
> + free(line);
> }
>
> /**
 
Old 09-20-2011, 05:27 PM
Carlos Maiolino
 
Default mkfs i18n:

Hi,
On Tue, Sep 06, 2011 at 08:10:06PM +0100, Steven Whitehouse wrote:
> Hi,
>
> On Tue, 2011-09-06 at 14:41 -0300, Carlos Maiolino wrote:
> > Use rpmatch() function to get answer to
> > yes-or-no questions during mkfs confirmation
> >
> > Signed-off-by: Carlos Maiolino <cmaiolino@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.
"), sdp->device_name);
> > check_dev_content(sdp->device_name);
> > close(fd);
> > - printf( _("
Are you sure you want to proceed? [y/n] "));
> > - if(!fgets(input, 32, stdin))
> > - die( _("unable to read from stdin
"));
> > +
> > + do{
> > + printf( _("
Are 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
 
Old 09-21-2011, 12:33 AM
Carlos Maiolino
 
Default mkfs i18n:

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@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.
"), sdp->device_name);
> > > check_dev_content(sdp->device_name);
> > > close(fd);
> > > - printf( _("
Are you sure you want to proceed? [y/n] "));
> > > - if(!fgets(input, 32, stdin))
> > > - die( _("unable to read from stdin
"));
> > > +
> > > + do{
> > > + printf( _("
Are 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
 
Old 09-22-2011, 09:47 AM
Steven Whitehouse
 
Default mkfs i18n:

Hi,

On Tue, 2011-09-20 at 21:33 -0300, Carlos Maiolino wrote:
> 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.
>
>
I prefer the longer string to splitting it, if we cannot get the
translation automatically from glibc, which does appear to be the case.
Also, I think adding a comment to the .pot to explain how to translate
the question is a good idea. We should always be doing that where
anything tricky is encountered,

Steve.

>
> > > > Signed-off-by: Carlos Maiolino <cmaiolino@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.
"), sdp->device_name);
> > > > check_dev_content(sdp->device_name);
> > > > close(fd);
> > > > - printf( _("
Are you sure you want to proceed? [y/n] "));
> > > > - if(!fgets(input, 32, stdin))
> > > > - die( _("unable to read from stdin
"));
> > > > +
> > > > + do{
> > > > + printf( _("
Are 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
> >
>
 
Old 09-22-2011, 09:50 AM
Steven Whitehouse
 
Default mkfs i18n:

Hi,

On Tue, 2011-09-20 at 14:27 -0300, Carlos Maiolino wrote:
> Hi,
> On Tue, Sep 06, 2011 at 08:10:06PM +0100, Steven Whitehouse wrote:
> > Hi,
> >
> > On Tue, 2011-09-06 at 14:41 -0300, Carlos Maiolino wrote:
> > > Use rpmatch() function to get answer to
> > > yes-or-no questions during mkfs confirmation
> > >
> > > Signed-off-by: Carlos Maiolino <cmaiolino@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.
"), sdp->device_name);
> > > check_dev_content(sdp->device_name);
> > > close(fd);
> > > - printf( _("
Are you sure you want to proceed? [y/n] "));
> > > - if(!fgets(input, 32, stdin))
> > > - die( _("unable to read from stdin
"));
> > > +
> > > + do{
> > > + printf( _("
Are 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,

It is is not possible to use glibc for this, then lets not worry about
it too much. I just wanted to be certain that there was not some
standard way to deal with these kinds of translations before we create
our own solution to the problem,

Steve.
 

Thread Tools




All times are GMT. The time now is 09:48 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org