* I18N gettext style
@ 2000-03-04 0:00 David Starner
2000-03-04 0:00 ` tmoran
2000-03-06 0:00 ` Nick Roberts
0 siblings, 2 replies; 8+ messages in thread
From: David Starner @ 2000-03-04 0:00 UTC (permalink / raw)
gettext is a C library that does message translation - i.e.
puts (N("Hi!"));
will replace Hi with whatever's appropriate for the locale, provided the
message catalog has it. That's simple enough to interface/rewrite for Ada.
But it's also used in stuff like
printf (N("Hi! There are %d widgets!"), I);
where in the %d will get moved to where ever the number needs to be in the
translated message.
Unfortunetly,
Ada.Text_IO.Put (N("Hi! There are ") && To_String(I) && N("widgets!"));
won't put I in the proper position in the translated message for some
languages. What's the easiest way to do this type of thing for Ada?
--
David Starner - dstarner98@aasaa.ofe.org
Only a nerd would worry about wrong parentheses with
square brackets. But that's what mathematicians are.
-- Dr. Burchard, math professor at OSU
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: I18N gettext style
2000-03-04 0:00 I18N gettext style David Starner
@ 2000-03-04 0:00 ` tmoran
2000-03-04 0:00 ` David Starner
2000-03-05 0:00 ` tmoran
2000-03-06 0:00 ` Nick Roberts
1 sibling, 2 replies; 8+ messages in thread
From: tmoran @ 2000-03-04 0:00 UTC (permalink / raw)
> Ada.Text_IO.Put (N("Hi! There are ") && To_String(I) && N("widgets!"));
>won't put I in the proper position in the translated message for some
Certainly an Ada version of printf in the form of a set like
procedure print0(s : in string);
procedure print1(s : in string; a : in string);
procedure print2(s : in string; a : in string; b : in string);
is easy enough to write. So then you could call
print1( N("Hi! There are %s widgets!"), To_String(I));
By always passing in string arguments (using 'image in the simplest
case) your Ada routines need only handle %s, not %d or any of
the other codes, which is simple and avoids combinatorial explosion.
Better yet, instead of %s, use %a in print1, %a and %b in print2,
etc, and then N can even change the order, which it can't in the
C paradigm.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: I18N gettext style
2000-03-04 0:00 ` tmoran
@ 2000-03-04 0:00 ` David Starner
2000-03-05 0:00 ` Jeff Carter
2000-03-05 0:00 ` tmoran
1 sibling, 1 reply; 8+ messages in thread
From: David Starner @ 2000-03-04 0:00 UTC (permalink / raw)
On Sat, 04 Mar 2000 08:28:01 GMT, tmoran@bix.com <tmoran@bix.com> wrote:
>> Ada.Text_IO.Put (N("Hi! There are ") && To_String(I) && N("widgets!"));
>>won't put I in the proper position in the translated message for some
> Certainly an Ada version of printf in the form of a set like
> procedure print0(s : in string);
> procedure print1(s : in string; a : in string);
> procedure print2(s : in string; a : in string; b : in string);
Is there any reason you used print0, print1, print2, instead of
print, print, print? My instinct is to overload them.
> Better yet, instead of %s, use %a in print1, %a and %b in print2,
>etc, and then N can even change the order, which it can't in the
>C paradigm.
Or %1 and %2, for compatibility with current systems.
Thanks.
--
David Starner - dstarner98@aasaa.ofe.org
Only a nerd would worry about wrong parentheses with
square brackets. But that's what mathematicians are.
-- Dr. Burchard, math professor at OSU
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: I18N gettext style
2000-03-04 0:00 ` tmoran
2000-03-04 0:00 ` David Starner
@ 2000-03-05 0:00 ` tmoran
1 sibling, 0 replies; 8+ messages in thread
From: tmoran @ 2000-03-05 0:00 UTC (permalink / raw)
>Is there any reason you used print0, print1, print2, instead of
>print, print, print? My instinct is to overload them.
The only reason is that I was trying to code after midnight. #.#
>Or %1 and %2, for compatibility with current systems.
How about producing:
Hi!
Hi! There are 3 widgets!
Hi! There are 3 parts, code 1234!
Hi! For $99.95 you can buy 3 parts, code 1234!
using
with ada.text_io,
ada.text_io.editing;
use ada.text_io,
ada.text_io.editing;
procedure test is
procedure print(s : in string;
p1 : in string := "";
p2 : in string := "";
p3 : in string := "") is
si : integer := s'first;
begin
while si <= s'last loop
if si < s'last and then s(si) = '%' then
case s(si+1) is
when '1' => put(p1);
when '2' => put(p2);
when '3' => put(p3);
when others => null;
end case;
si := si+2;
else
put(s(si));
si := si+1;
end if;
end loop;
new_line;
end print;
count : integer := 3;
id : integer := 1234;
type money is delta 0.01 digits 5;
package print_money is new ada.text_io.editing.decimal_output(money);
money_picture : constant picture := to_picture("-$$9.99");
price : money := 99.95;
begin
print("Hi!");
print("Hi! There are%1 widgets!",
integer'image(count));
print("Hi! There are%1 parts, code%2!",
integer'image(count),
integer'image(id));
print("Hi! For%3 you can buy%1 parts, code%2!",
integer'image(count),
integer'image(id),
print_money.image(price, money_picture));
end test;
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: I18N gettext style
2000-03-04 0:00 ` David Starner
@ 2000-03-05 0:00 ` Jeff Carter
2000-03-05 0:00 ` Ehud Lamm
0 siblings, 1 reply; 8+ messages in thread
From: Jeff Carter @ 2000-03-05 0:00 UTC (permalink / raw)
David Starner wrote:
>
> On Sat, 04 Mar 2000 08:28:01 GMT, tmoran@bix.com <tmoran@bix.com> wrote:
> >> Ada.Text_IO.Put (N("Hi! There are ") && To_String(I) && N("widgets!"));
> >>won't put I in the proper position in the translated message for some
> > Certainly an Ada version of printf in the form of a set like
> > procedure print0(s : in string);
> > procedure print1(s : in string; a : in string);
> > procedure print2(s : in string; a : in string; b : in string);
>
> Is there any reason you used print0, print1, print2, instead of
> print, print, print? My instinct is to overload them.
My instinct is to only have one, which can handle an indeterminate
number of arguments:
with Ada.Strings.Unbounded;
use Ada.Strings.Unbounded;
...
type String_Set is array (Positive range <>) of Unbounded_String;
procedure Print (Format : in String; Arguments : in String_Set);
...
Print
(Format => "There are %s arguments.", -- is this correct?
Arguments => (1 => Image (Num_Args) );
--
Jeff Carter
"Your mother was a hamster and your father smelt of elderberries."
Monty Python & the Holy Grail
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: I18N gettext style
2000-03-05 0:00 ` Jeff Carter
@ 2000-03-05 0:00 ` Ehud Lamm
0 siblings, 0 replies; 8+ messages in thread
From: Ehud Lamm @ 2000-03-05 0:00 UTC (permalink / raw)
This is the way I did it in one of the frameworks I wrote.
One of the nice things Ada provides is the standard way of dealing with
unconstrained arrays...
Ehud Lamm mslamm@mscc.huji.ac.il
http://purl.oclc.org/NET/ehudlamm <== My home on the web
Check it out and subscribe to the E-List- for interesting essays and more!
On Sun, 5 Mar 2000, Jeff Carter wrote:
|David Starner wrote:
|>
|> On Sat, 04 Mar 2000 08:28:01 GMT, tmoran@bix.com <tmoran@bix.com> wrote:
|> >> Ada.Text_IO.Put (N("Hi! There are ") && To_String(I) && N("widgets!"));
|> >>won't put I in the proper position in the translated message for some
|> > Certainly an Ada version of printf in the form of a set like
|> > procedure print0(s : in string);
|> > procedure print1(s : in string; a : in string);
|> > procedure print2(s : in string; a : in string; b : in string);
|>
|> Is there any reason you used print0, print1, print2, instead of
|> print, print, print? My instinct is to overload them.
|
|My instinct is to only have one, which can handle an indeterminate
|number of arguments:
|
|with Ada.Strings.Unbounded;
|use Ada.Strings.Unbounded;
|...
|type String_Set is array (Positive range <>) of Unbounded_String;
|
|procedure Print (Format : in String; Arguments : in String_Set);
|...
|Print
|(Format => "There are %s arguments.", -- is this correct?
| Arguments => (1 => Image (Num_Args) );
|
|--
|Jeff Carter
|"Your mother was a hamster and your father smelt of elderberries."
|Monty Python & the Holy Grail
|
|
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: I18N gettext style
2000-03-04 0:00 I18N gettext style David Starner
2000-03-04 0:00 ` tmoran
@ 2000-03-06 0:00 ` Nick Roberts
2000-03-06 0:00 ` David Starner
1 sibling, 1 reply; 8+ messages in thread
From: Nick Roberts @ 2000-03-06 0:00 UTC (permalink / raw)
I'm sure I posted quite a lengthy article on this very subject just a couple
of weeks ago. (Maybe it was too lengthy :-( ;-)
To precis it incredibly briefly, my advice is to: (a) use forms such as
"Number of widgets: " for each message, so that the problem of inserting
parameters goes away; (b) use a database to store the messages in different
languages, so that (one good reason for a start) you can use standard
database tools to enter, edit, browse, report, analyse, check, etc., the
text; (c) to be really fancy, build in a default set of messages, in case
the program is run in circumstances where the database isn't available.
--
Nick Roberts
http://www.adapower.com/lab/adaos
"David Starner" <dvdeug@x8b4e53cd.dhcp.okstate.edu> wrote in message
news:89q6pg$9ac1@news.cis.okstate.edu...
> gettext is a C library that does message translation - i.e.
>
> puts (N("Hi!"));
>
> will replace Hi with whatever's appropriate for the locale,
> [etc.]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: I18N gettext style
2000-03-06 0:00 ` Nick Roberts
@ 2000-03-06 0:00 ` David Starner
0 siblings, 0 replies; 8+ messages in thread
From: David Starner @ 2000-03-06 0:00 UTC (permalink / raw)
On Mon, 6 Mar 2000 02:12:03 -0000,
Nick Roberts <nickroberts@callnetuk.com> wrote:
>To precis it incredibly briefly, my advice is to: (a) use forms such as
>"Number of widgets: " for each message, so that the problem of inserting
>parameters goes away;
Which is ugly, and won't always work. It's too much of a PITA to do that
when it's simple to fix.
>(b) use a database to store the messages in different
>languages, so that (one good reason for a start) you can use standard
>database tools to enter, edit, browse, report, analyse, check, etc., the
>text; (c) to be really fancy, build in a default set of messages, in case
>the program is run in circumstances where the database isn't available.
In other words, do it like gettext does, except replace the .po files - that
are plain text and have several specialized editors - with a database -
which is binary (big/little endian problems) and requires the translator
use different tools that she's probably not familiar with.
Frankly, my current plan - if I don't quit using Ada for a more Unix friendly
language - is to rewrite/adapt/wrap gettext. It's the standard on Linux,
and I'm going to lose enough users due to Ada and libgtkada already. I
don't need to drive away anymore due to a non-standard translation system.
--
David Starner - dstarner98@aasaa.ofe.org
Only a nerd would worry about wrong parentheses with
square brackets. But that's what mathematicians are.
-- Dr. Burchard, math professor at OSU
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2000-03-06 0:00 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-03-04 0:00 I18N gettext style David Starner
2000-03-04 0:00 ` tmoran
2000-03-04 0:00 ` David Starner
2000-03-05 0:00 ` Jeff Carter
2000-03-05 0:00 ` Ehud Lamm
2000-03-05 0:00 ` tmoran
2000-03-06 0:00 ` Nick Roberts
2000-03-06 0:00 ` David Starner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox