Mogens Hansen wrote:
> "Byrial Jensen" <bjensen@nospam.dk> wrote:
>
>>Jeg vil gerne høre om du har et forslag til hvordan sådanne
>>lokaliseringsproblemer kan løses uden at bruge de i denne sammenhæng
>>praktiske printf-formatstrenge.
>
> Det korte svar:
> Boost.Format (
www.boost.org)
>
> Det lange svar:
>
> Internationalisering og lokalisering af en applikation er et stort og
> komplekst område.
> Se bogen
> Standard C++ IOStreams and Locales
> Angelika Langer, Klaus Kreft
> ISBN 0-201-18395-1
> Part III, Internationalization, side 251-342 for en gennemgang af hvilke
> faciliteter C++ stream biblioteket har.
>
> Formatstrengen til printf i C indeholder 2 (faktisk 3) informationer:
> * hvilken type der skal indsættes
> * hvor den variable tekst skal indsættes
> samt at der er en implicit, hårdkodet sammenhæng rækkefølgen som de indsatte
> tekster skal stå i og rækkefølgen parametrene til printf.
Rækkefølgen er ikke nødvendigvis implicit. Den kan også være eksplicit,
således at en oversætter af en formatstreng også kan ændre rækkefølgen.
Disse 2 printf-kald er ekvivalente:
printf ("%d %s", 1, "tekst");
printf ("%2$d %1$s", "tekst", 1);
Notationen er dog ikke specificeret C99, men i POSIX så vidt jeg ved
(korrektioner modtages gerne).
> Vi er formodentlig enige om at det er en fordel, hvis man ikke har mulighed
> for at lave type mismatch, som man kan med printf.
Bestemt. Jeg kender udmærket eksempler på lokaliserede programmer som er
gået ned fordi en oversætter er kommet til at ændre i type-angivelserne
i en formatstreng.
> Spørgsmålet er om formatstrengen til printf i C er tilstrækkelig fleksibel.
> Man kan forestille sig at hvis udskrivningen tager flere variable, så har
> man sommetider brug for at bytte om på rækkefølgen i forskellige talte
> sprog.
Det kan gøres. Se ovenfor.
> ..NET WriteLine er ikke bruger udvidelig med hensyn til hvilke typer den kan
> udskrive. Det svarer til printf i C, og er således mere begrænset end stream
> biblioteket i C++.
printf i GNU libc kan udvides med nye typer. Desværre er det ikke portabelt.
> Noget svarende til hvad der findes i .NET er direkte tilgængeligt i C++ ved
> hjælp af Boost.Format (
www.boost.org).
> Man man således i C++ skrive
> cout << boost::format("%1% %2%!") % "Hello" % "World";
> Naturligvis er det typesikkert og udvideligt med hensyn til typer, på samme
> måde som C++ streams generelt.
>
> Med en sådan løsning har man mulighed for at have den fleksibilitet i
> forbindelse med oversættelse som du efterspurgte, samtidig med at man har
> fuld typesikkerhed og mulighed for udvidelser med hensyn til hvilke typer
> der kan udskrives.
> Altså de bedste egenskaber fra C, C++ og C# slået sammen - hvis man har
> brug for det.
Bestemt. Det ser fornuftigt ud. Tak for henvisningen, jeg vil kigge
nærmere på boost::format.
> Men der skal mere til at oversætte en applikation til flere talte sprog og
> lokationer:
>
> Hvordan håndterer printf f.eks. at man nogen steder bruger '.' og andre
> steder ',' som decimal seperator, at 1000 separatorer er forskellige rundt
> om i verden,
Man sætter blot LC_NUMERIC lokalet som printf() bruger.
> at penge beløb
Man bruger LC_MONETARY lokalet.
> og tidspunkter
Man sættter LC_TIME lokalet og bruger strftime().
> skrives forskelligt rundt om i verden ?