Lokalizácia aplikácií v C # .NET
V tomto tutoriále sa pokúsim niečo málo povedať o tom, ako som lokalizoval svoj program. Systém to je kvapku zložitejšie, ale vo výsledku sa oplatí.
Lokalizujeme
Ako prvý nás sa Satik-om napadlo, že si napíšeme vlastný lokalizačný knihovníčku, ktorá bude naším malým potrebám vyhovovať. Ale nakoniec sme sa vrhli na odskúšané a pomerne staršie riešenia - gettext. A pretože existuje aj implementácia aj pre C#, tak je pomerne jednoduché všetko použiť. A práve s ňou to spáchame.
Gettext
Na webe majú síce podrobný návod, ale ... je v ňom pomerne zásadná chyba a tak si postup popíšeme radšej aj tú. Ako základ použijeme obyčajnú konzolovú aplikáciu s jednoduchým a prostým kódom:
Console.WriteLine("Ahoj svete.");
Console.ReadLine();
A práve ten reťazec budeme chcieť prekladať. Fakticky môžeme použiť
switch
na viac prekladov, ale to nebude moc užitočné a práve s
tým nám gettext pomôže. Najskôr vložíme referenciu na knižnicu gettext.
Tú spolu so všetkým potrebným nájdeme v pripravenom
balíčku v adresári Binaries. Ďalej budeme potrebovať šablónu. Ak sa
pýtate, čo to je tá šablóna, tak z nej Visual Studio následne vygeneruje
zdrojový kód. V menu pre pridanie sa volá Text Template
.
Pomenujeme si ju napr. String.tt
. Zmažeme celý obsah a nahradíme
ho nasledujúcim:
<#@ assembly name="System.Configuration" #> <# this.ClassName = "Strings"; this.ResourceName = "Strings"; this.NamespaceName = "Gettext.Samples.Console"; this.DefaultResourceDir = "Resources"; #> <#@ include file="..\..\Core\Gettext.Cs\Templates\Strings.tt" #>
Tieto riadky sú len nejaké nastavenia šablóny. Jediné čo zmeníme je
súčasný menný priestor. Zmeníme teda premennú NamespaceName
na menný priestor našej aplikácie. V tomto prípade to bude
ConsoleApplicationLocal
.
this.NamespaceName = "ConsoleApplicationLocal";
Našu pozornosť ale určite upútal aj posledný riadok, kde sa odkazujeme
na ďalší súbor. Ten tiež nájdeme v pripravenom archíve v priečinku
Templates
. Niekam do projektu si ho rozbalíme. Nesmieme zabudnúť
upraviť si k nemu cestu. Ja som si ho dal priamo k zdrojovým kódom a tak moja
cesta bude:
<#@ include file="Strings.tt" #>
A máme skoro hotovo. Akonáhle si súbor uložíte, tak sa ihneď vygeneruje
príslušný súbor. Na to ako vyzerá a čo robí sa môžete pozrieť sami.
Ešte nesmieme zabudnúť pridať referenciu na knižnicu
System.Configuration
. A máme fakticky hotovo. Teda skoro.
Potrebujeme v zdrojovom kóde označiť reťazce, ktoré sa nám budú
prekladať. To je však veľmi triviálne. Je na to určená táto metóda:
Console.WriteLine(Strings.T("Ahoj svete."));
Tá sa pokúsi nájsť podľa jazyka operačného systému súbor s prekladmi
a pokúsi sa nájsť tento reťazec. Keď ho bude mať, tak ho vráti, inak
dostaneme to čo sme odovzdali. Všetko funguje aj pre variant, kde by sme
používali String.Format
. Jednoducho odovzdáme vkladané
súčasti ako parametre:
string vodacek = "Vodacku"; Console.WriteLine(Strings.T("A tebe {0} taky pozdravuju.", vodacek));
Vkladaný reťazec potom bude stále rovnaký a vloží sa na miesto označené v preklade. A sme fakticky hotoví. Programová časť určite, ďalej budeme potrebovať vydolovať reťazca pre preklad, aby ich bolo možné preložiť. Na to máme pribalený nástroj v našom balíku. Len je ho potrebné opäť nakonfigurovať.
Výcuc
V priečinku Gnu.Gettext.Win32
nájdeme všetko potrebné.
Rozbaľte si túto zložku do hlavnej zložky vášho projektu. Ja som si ju
navyše premenoval na gettext, aby sa mi lepšie pamätala. Do hlavnej zložky
projektu si tiež pridáme bat
súbor s konfiguráciou. Ja som si
ho nazval extract.bat
:
echo Setting up global variables... SET path_xgettext=GetText\xgettext.exe SET file_list=*.cs SET path_output=Templates echo Generating strings po file... CALL GetText\ExtractStrings.bat Strings pause
Nastavili sme v ňom základné parametre. Hlavné a dôležitá pre nás je
tretia cesta a to do zložky Templates
, kde budeme mať súbor s
vydolovanými reťazcami. Túto zložku si musíme vytvoriť, inak nám to
vôbec nepôjde. Ešte potrebujeme získať bat
súbor, ktorý
všetko obsluhuje. Ten nájdeme v balíčku v priečinku Scripts
.
Prekopíruje ho do zložky GetText
. A sme aj tu hotoví. Spustíme
si extract.bat
a počkáme ako dopadneme. Ak úspešne nájdeme v
adresári Templates
súbor Strings.pot
. A práve ten
použijeme na preklad.
Prekladáme
Sme v poslednej fáze. Preklad. Pokiaľ si vygenerovaný súbor prehliadnete (je to obyčajný textový súbor), nájdete v ňom toto:
#: ConsoleApplicationLocal\ConsoleApplicationLocal\Program.cs:13 msgid "Ahoj svete." msgstr "" #: ConsoleApplicationLocal\ConsoleApplicationLocal\Program.cs:16 #, csharp-format msgid "A tebe {0} taky pozdravuju." msgstr ""
Všetko, čo je označené znakom #
, je komentár, pre nás je
dôležitý msgid
, kde je náš pôvodný text v aplikácii. Ten tu
ale nesmieme meniť, iba ak ho rovnako zmeníme aj v programe. Preložený text
potom dáme do druhého riadku medzi úvodzovky. Vyplníme si krátky preklad,
trebárs do slovenčiny. Vyzerať to bude asi takto:
#: ConsoleApplicationLocal\ConsoleApplicationLocal\Program.cs:13 msgid "Ahoj svete." msgstr "Čuatě." #: ConsoleApplicationLocal\ConsoleApplicationLocal\Program.cs:16 #, csharp-format msgid "A tebe {0} taky pozdravuju." msgstr "Aj tebe {0} pozdravujem."
Slováci prepáčia, snáď. Takto preložený text si uložíme do zložky
Resources
a do zložky SK-sk
. Čo je identifikátor
pre slovenčinu. Meno musí zostať Strings
a prípona súboru bude
po. Dohromady teda Strings.po
. Túto zložku so súborom pridáme
aj do Visual Studia a nezabudneme súboru nastaviť, aby sa nám skopírovali na
výslednej zložky.
Keď teraz program spustíte, tak na českom systéme bude česky a na slovenský slovenský s naším prekladom. My si ale môžeme podstrčiť slovenčinu a to týmto jednoduchým príkazom:
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("SK-sk");
A hneď sa nám ukáže text lokalizovaný. Existujú rôzne služby, kde môžete spravovať svoje preklady. Trebárs taký Pootle. Ale s tým ešte nemám žiadne skúsenosti, tak uvidíme treba to vydá na ďalší článok.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 81x (1.23 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C#