|
[ vilyu @ 21.12.2007. 09:22 ] @
| Ćao,
Interesuje me kako vi rešavate prevođenje interfejsa programa na više jezika? Npr, pretpostavimo da se program startovao sa interfejsom na srpskom, a onda u toku rada korisnik izabere interfejs na engleskom.
Moja ideja je bila da napravim language fajlove koji bi sadržali informacije tipa: identifikator = prevod. U program bih učitao potreban lang fajl, isparsirao ga u niz (ili sl.), i na svakom mestu gde treba da se pojavi tekst, pozvao bih svoju f-ju sa argumentom identifikatorom prevoda. F-ja bi potom pronasla prevod identifikatora iz adekvatnog niza i vratila ga natrag.
E sada, to znači pozivanje potprograma svaki čas. Stavi na stek, skini sa steka, ... Može li ovo jednostavnije, ili/i brže? Hvala. |
[ X Files @ 21.12.2007. 10:29 ] @
Citat:
E sada, to znači pozivanje potprograma svaki čas. Stavi na stek, skini sa steka, ... Može li ovo jednostavnije, ili/i brže? Hvala.
Brzina zamene jednog teksta drugim ide jako brzo i time ne treba da se oprterećuješ. 1000-de stringova za zamenu je baš ništa. U principu, onemogućiš osvežavanje ekrana, izvršiš zamenu, opet omogućiš osvežavanje ekrana, osvežiš i to je to.
Ono što zapravo jeste problem u celoj priči jer kako da ti za sve jezike sva slova budu zaista prikazana na formama, tasterima i sl. Tu se javlja problematika kodnih strana i sl.
Najbolje je da potražiš ponuđena rešenja za konkretno okruženje koje koristiš.
Recimo, jedno od rešenja za BCB je:
(Borland Newsgroups)
Citat:
Code:
// MyStrings.rh
#define IDS_CANCEL 27114
// Strings.rc
#pragma code_page(1252)
#include "MyStrings.rh"
STRINGTABLE
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
BEGIN
IDS_CANCEL, "Cancel"
END
STRINGTABLE
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
BEGIN
IDS_CANCEL, "Zrusit"
END
Then, in your application, create a couple of helper functions to assist you
when setting the language:
static const TFontCharset CodepageToCharset( unsigned int cp )
{
CHARSETINFO csi;
if ( (cp == 0) || (!TranslateCharsetInfo( (unsigned long *)cp, &csi, TCI_SRCCODEPAGE )) )
{
return OEM_CHARSET;
}
return (TFontCharset)csi.ciCharset;
}
static AnsiString InternalLoadStr( int ErrorCode )
{
const int MaxResourceBufferSize = 4096; // maximum resource string length is 4095 bytes
char string[MaxResourceBufferSize];
LoadString( GetModuleHandle(0), ErrorCode, string, MaxResourceBufferSize );
return AnsiString( string );
}
Finally, set the thread locale to the desired language:
SetThreadLocale( 0x0409 ); // U.S. English
btnCancel->Font->Charset = CodepageToCharset( 1252 ); // western codepage
btnCancel->Caption = InternalLoadStr( IDS_CANCEL );
SetThreadLocale( 0x0405 ); // Czech locale
btnCancel->Font->Charset = CodepageToCharset( 1250 ); // eastern europe codepage
btnCancel->Caption = InternalLoadStr( IDS_CANCEL );
Ja opet koristim nešto drugačiju strukturu, ali sve se svodi na isto.
Neki proizvođači softvera (TotalCommander) ostavili su prevode u običnim INI baziranim fajlovima što može biti korisno za CUSTOM prevode, drugim rečima nema potrebe za rekompajliranjem programa ako treba dodati neki drugi jezik.
[ savkic @ 21.12.2007. 20:18 ] @
> nteresuje me kako vi rešavate prevođenje interfejsa programa na više jezika? Npr, pretpostavimo da se program startovao sa interfejsom na srpskom, a
> onda u toku rada korisnik izabere interfejs na engleskom.
Najbolje da pređeš na Unicode kontrole a jezičke resurse čuvaš u unicode fajlu u obliku ID=Vrednost. Svakoj kontroli dodeli jedinstveni Tag i posle kreiranja forme promeni tekst shodno selektovanom jeziku.
[ kiklop74 @ 22.12.2007. 05:47 ] @
[ vilyu @ 22.12.2007. 09:42 ] @
Hvala na komentarima. Videću da li postoji standardno resenje za wxWidgets, mada mi se čini da sva rešenja funkcionišu na prilično sličnim principima.
[ Časlav Ilić @ 22.12.2007. 09:57 ] @
Kao što Darko napisa, samo da „ohrabrim“ :)
Posebno ako pišeš program pod Linuksom, ali i inače, najbolje rešenje jeste Gettekst — zaokružena celina, podrška direktno u libcu, dugo iskustvo na terenu i mnogobrojni alati i za programere i za prevodioce, i neke napredne jezičke mogućnosti koje nema nijedan drugi sistem.
Međutim, Gettekst je opšti sistem, za svakakve programske jezike i okruženja, pa se stoga ne bavi detaljima koji strogo zavise od radnog okvira, kao što je promena jezika u letu. Za to bi morao nešto sam da smisliš — u principu, da izvedeš tako da se sve vidljive niske mogu ponovo provući gettekst-pozive kada korisnik promeni jezik. S druge strane, promenu jezika u letu malo koji program izvodi, jer nije osobito korisna mogućnost. To zato što Gettekst tesno sarađuje sa sistemom, tako da ako je korisnik izabrao određeni jezik globalno, program koji koristi Gettekst će se bez dodatnih zahvata pokretati na tom jeziku.
Što se brzine tiče, na osrednjoj mašini od pre pet godina, Gettekst daje reda 50.000 poruka veličine prosečne rečenice u sekundi. Tako da slobodno zaboravi na brzinu :)
[ IDE @ 22.12.2007. 14:51 ] @
Ako nekome treba rjesenje za Borland C++ Bilder ili delphi , neka pogleda ovo:
http://www.sicomponents.com/tsilang1.html
Ja koristim ovu komponentu, i sjajna je... Jako lagano preskakanje sa jezika na jezik...
[ DjoleReject @ 31.12.2007. 12:37 ] @
Postoji jedna seljacka fora koju ja koristim:
Sav tekst koji se vidi u programu se cita iz fajla. Napravis vise fajlova sa istim tekstovima na razlicitim jezicima i onda svakom dugmetu, panelu i cemu vec treba kazes da tekst za sebe procita u fajlu. Imas jos jedan fajl u kome pise koji od jezika se koristi u tom trenutku i to je to.
Ovo je zgodno za neke specificne stvari kojima se ja bavim, jer ne mogu koristiti uobicajene forme. Kad god mozes, bolje je imati neko vec sredjeno resenje kao ovo sto su savetovali ljudi iznad mene. Ovo sto ja radim je samo kad si ostavljen na vetrometini "cistog" C++a. Cak mozda i za te situacije ima boljih resenja, a da ih ja ne znam.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|