Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Delphi - Ako najjednoduchšie lokalizovať program do viac jazykov?

Kedysi za čias TP som to raz skúsil. Robil som to štýlom:

const
  textzmazat = 1;
  textpridat = textzmazat + 1;

A takto to pokračovalo ďalej. V externom súbore som mal texty a tie som uložil do poľa. K tomuto poľu som už potom pristupoval ako k normálnym reťazcom pomocou uvedených konštánt.

Teraz uvažujem nad podobným problémom v Delphi. Napadlo ma, že už vtedy som tie číselné konštanty mohol nahradiť vymenovaným typom a práca by bola jednoduchšia o to pričítanie jednotky. Viem, že v Delphi je nejaká takáto možnosť pomocou zdrojov *.res, ale mojou podmienkou je prehľadný textový súbor s lokalizovanými textami ako v Total Commanderi alebo v PSPade. K poľu by som pristupoval ako k inicializačnému súboru *.ini (ako je to v PSPade) a na začiatku načítal celé pole textov. Samozrejme pri inicializácii formulárov sa musia nastaviť všetky texty na formulári podľa zvolenej lokalizácie.

Je aj jednoduchší spôsob lokalizácie v Delphi alebo je práve táto cesta správna?

Předmět Autor Datum
Tak ako to chceš Ty - mať texty v textovom súbore ? - je asi najjednoduchšie použiť TIniFile a z neh…
pme 19.05.2006 19:50
pme
1. pro kazdy jazyk jiny soubor (jak ti to budou jinak uzivatele lokalizovat) ? 2. sekce pouzij pro l…
Jan Fiala 19.05.2006 21:39
Jan Fiala
1. Presne tak si to aj predstavujem. 2. Tie sekcie je výborný nápad. Postupne by som na to prišiel u…
msx. 19.05.2006 23:39
msx.
Tak kdyz uz to budes mit v tom ini-fajlu se sekcema, tak k tomu normalne za behu pristupuj pres GetP…
Ynd0r 19.05.2006 23:46
Ynd0r
Ja viem, ako pristupovať k sekciám za behu programu. Mne išlo len o to, čo je z hľadiska programu kr…
msx. 20.05.2006 13:43
msx.
GetProfileString() je zbytecne "nakladny". Provede totiz otevreni INI, jeho nacteni, nalezeni a prec…
Jan Fiala 20.05.2006 13:46
Jan Fiala
Existuji knihovny, ktere ti vytahnou retezce do souboru a pak jsou schopny formulare automaticky lok…
Jan Fiala 20.05.2006 13:43
Jan Fiala
Tá funkcia je univerzálna a lokalizuje proste celý formulár a hotovo alebo sú v nej postupne vypísan…
msx. 20.05.2006 13:51
msx.
Nemohu si pomoci, ale nejlépe měl lokalizace vyřešen AmigaOS 3.0 a vyšší - v zásadě textové soubory…
touchwood 20.05.2006 08:56
touchwood
Takže sčasti v tom vidím aj odpoveď na otázku vyššie položenú. Ak je program rozsiahly, čo zatiaľ u…
msx. 20.05.2006 13:46
msx.
Interni Delphi lokalizator dela vlastne DLL, ktere obsahuji nejen lokalizovane retezce, ale i pozice…
Jan Fiala 20.05.2006 13:53
Jan Fiala
Áno, ten program mám ešte teraz živý v pamäti.:)) Keď som ho upravoval minulý rok na inú aplikáciu,… poslední
msx. 20.05.2006 13:58
msx.
Strukturou jsi zrejme myslel treba XML. Pro preklad davam prednost prostemu textu - je tam jen to ne…
Jan Fiala 20.05.2006 13:50
Jan Fiala
Čiže vlastne ešte utilitka, čo upraví ostatné lokalizácie podľa angličtiny, ak som správne pochopil.…
msx. 20.05.2006 13:54
msx.

1. pro kazdy jazyk jiny soubor (jak ti to budou jinak uzivatele lokalizovat) ?
2. sekce pouzij pro lokazizaci jednotlivych formularu - ulehci to prekladatelum orientaci v prekladu
3. pokud zacinas projekt a pocitas s tim, ze bude lokalizovany, pis jej v anglictine (mysleno uzivatelske rozhrani) a to vcetne nazvu ovladacich prvku, ktere budes lokalizovat
4. pojmenovavej ovladaci prvky podle funkce, nenechavej tam Label1 ... Label36, jinak to clovek, ktery bude prekladat nebude mit sanci prelozit.

Priklad:

[MainForm]
Caption=Moje nova aplikace
aNewFile=Novy soubor
aOpenFile=Otevrit soubor
...

[Settings]
lDefaultDirectory=Vychozi adresar
cBackup=Zalohovat soubory
...

1. Presne tak si to aj predstavujem.
2. Tie sekcie je výborný nápad. Postupne by som na to prišiel určite aj sám, ale je dobré to vedieť hneď.
3. Zásadne píšem všetky programy (názvy objektov atď.) v angličtine. Tak som to robil aj v Turbo Pascale, pretože je prehľadnejí zápis a navyše sa nemusím pasovať s anglickoslovenskými výrazmi, pretože potom sa stane, že aj také sa vyskytnú. Okrem toho, viac povie slovo Button ako slovo Tlacitko nielen mne, ale aj hocikomu inému, kto sa na zdroják pozrie.
4. No niekedy v rýchlosti nechávam také názvy, ale iba, ak je tým Labelov málo. Inak, keď sa mi nechce to vypisovať, tak to riešim šachovnicovo podľa umiestnenia Labelu (LabelC4 atď.), ale ak sa dá, tak sa tomu radšej vyhýbam.

Ešte otázka:
Čo je lepšie? Načítať všetky texty naraz alebo ich načitávať počas behu programu zo súboru?
- naraz - viac nárokov na pamäť, čo je zanedbateľné, ale program je flexibilnejší, čo sa týka počtu otvorených súborov a teda je univerzálnejší
- postupne - menej nárokov na pamäť, ale program "drží" súbor s lokalizáciou a ten je neprístupný pre prípadné úpravy počas behu programu

GetProfileString() je zbytecne "nakladny". Provede totiz otevreni INI, jeho nacteni, nalezeni a precteni stringu a zavreni INI. A tohle chces delat pro kazdy string na formulari ?

To uz je mnohem lepsi pouzit nejaky optimalizovani INI (treba TMemIniFile z Delphi), ktery si po pristupu do sekce zapamatuje pozici sekce a nehleda to pokazde znovu, navic si stringy hashuje pro snadnejsi vyhledavani.

Existuji knihovny, ktere ti vytahnou retezce do souboru a pak jsou schopny formulare automaticky lokalizovat.
Ja si ti delal ve vlastni rezii, takze pro kazdy form mam funkci, ktera jej zlokalizuje.
Takze lokalizuji pri zobrazeni formulare (az kdyz to potrebuju), nelokalizuji vse zbytecne pri startu.

Tá funkcia je univerzálna a lokalizuje proste celý formulár a hotovo alebo sú v nej postupne vypísané lokalizačné príkazy pre každý objekt zvlášť? Teoreticky sa to dá naraz pomocou Controls, ak sa nemýlim, ale potom vznikne problém pri vlastnosti Text, Caption, Items a podobne.

Nemohu si pomoci, ale nejlépe měl lokalizace vyřešen AmigaOS 3.0 a vyšší - v zásadě textové soubory s databázovým formátem s podporou napříč OS a aplikacemi. Bohužel implementace češtiny byla (kvůli konfliktům s některými řídicím znaky) docela problém.

Jinak správně -- základem je abstrakce od kódu. V závislosti na velikosti SW a tudíž i počtu lokalizovatelných stringů bych volil buď plaintext, nebo nějakou strukturu.

Takže sčasti v tom vidím aj odpoveď na otázku vyššie položenú. Ak je program rozsiahly, čo zatiaľ u mňa nehrozí, tak z konfiguračného súboru načítavať stringy postupne a keď malýá, tak na začiatku načítať všetko.

Ešte otázka: Ako to vlastne funguje v Delphi pomocou zdrojov? Tam sa dá tiež lokalizovať do viac jazykov, ale s tým, že nebudú lokalizované texty bežne prístupné a z hľadiska programového kódu sa pristupovať k lokalizovaným textom už jednoduchšie nedá. Mám pravdu?

Interni Delphi lokalizator dela vlastne DLL, ktere obsahuji nejen lokalizovane retezce, ale i pozice prvku na formulari. Tam si totiz muzes pohnout pri lokalizaci i s ovladacimi prvky, pokud by ti prekazely - male mito na text apod.
Ale operavdu to neni lokalizovatelne "zvenku"

Podivej se na priklad:
\Program Files\Borland\Delphi7\Demos\RichEdit\

Strukturou jsi zrejme myslel treba XML.
Pro preklad davam prednost prostemu textu - je tam jen to nezbytne minimum informaci, neni tam okolo zadna "omacka" jako elementy v XML.

Osobne to resim tak, ze pokud delam novou verzi, vezmu anglictinu, kterou udrzuji a pomoci ni sestavim znovu vsechny ostatni lokalizace. Takze retezce, ktere tam chybi dodam v anglictine a jeste je oznacim a retezce, ktere zmizi a anglictiny se tak odstrani ze vsech ostatnich lokalizaci automaticky. Clovek ktery updatuje lokalizaci pouze vyhleda par oznacenych retezcu, dolokalizuje a posle. Nemusi srovnavat a hledat co pribylo noveho.
Protoze je to od tech lidi prace dobrovolna, snazim se jim to co nejvic ulehcit.

Zpět do poradny Odpovědět na původní otázku Nahoru