Lokalizace aplikací v C# .NET
V tomto tutoriálu se pokusím něco málo říci o tom, jak jsem lokalizoval svůj program. Systém to je kapku složitější, ale ve výsledku se vyplatí.
Lokalizujeme
Jako první nás se Satik-em napadlo, že si napíšeme vlastní lokalizační knihovničku, která bude naším malým potřebám vyhovovat. Ale nakonec jsme se vrhli na ozkoušené a poměrně starší řešení - Gettext. A protože existuje i implementace i pro C#, tak je poměrně snadné vše použít. A právě s ní to spácháme.
GetText
Na webu mají sice podrobný návod, ale... je v něm poměrně zásadní chyba a tak si postup popíšeme raději i tu. Jako základ použijeme obyčejnou konzolovou aplikaci s jednoduchým a prostým kódem:
Console.WriteLine("Ahoj svete.");
Console.ReadLine();
A právě ten řetězec budeme chtít překládat. Fakticky můžeme použít
switch
na více překladů, ale to nebude moc užitečné a právě
s tím nám GetText pomůže. Nejdříve vložíme referenci na knihovnu
GetText. Tu spolu se vším potřebným najdeme v připraveném
balíčku v adresáři Binaries. Dále budeme potřebovat šablonu. Pokud se
ptáte co to je ta šablona, tak z ní Visual Studio následně vygeneruje
zdrojový kód. V menu pro přidání se jmenuje Text Template
.
Pojmenujeme si ji např. String.tt
. Smažeme celý obsah a
nahradíme ho následujícím:
<#@ 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" #>
Tyto řádky jsou jen nějaké nastavení šablony. Jediné co změníme je
současný jmenný prostor. Změníme tedy proměnnou NamespaceName
na jmenný prostor naší aplikace. V tomto případě to bude
ConsoleApplicationLocal
.
this.NamespaceName = "ConsoleApplicationLocal";
Naši pozornost ale určitě upoutal také poslední řádek, kde se
odkazujeme na další soubor. Ten také nalezneme v připraveném archivu ve
složce Templates
. Někam do projektu si jej rozbalíme. Nesmíme
zapomenout upravit si k němu cestu. Já jsem si ho dal přímo ke zdrojovým
kódům a tak moje cesta bude:
<#@ include file="Strings.tt" #>
A máme skoro hotovo. Jakmile si soubor uložíte, tak se ihned vygeneruje
příslušný soubor. Na to jak vypadá a co dělá se můžete podívat sami.
Ještě nesmíme zapomenout přidat referenci na knihovnu
System.Configuration
. A máme fakticky hotovo. Tedy skoro.
Potřebujeme ve zdrojovém kódu označit řetězce, které se nám budou
překládat. To je ovšem velmi triviální. Je na to určena tato metoda:
Console.WriteLine(Strings.T("Ahoj svete."));
Ta se pokusí najít podle jazyka operačního systému soubor s překlady a
pokusí se najít tento řetězec. Když ho bude mít, tak jej vrátí, jinak
dostaneme to co jsme předali. Vše funguje i pro variantu, kde bychom
používali String.Format
. Jednoduše předáme vkládané
součásti jako parametry:
string vodacek = "Vodacku"; Console.WriteLine(Strings.T("A tebe {0} taky pozdravuju.", vodacek));
Vkládaný řetězec pak bude stále stejný a vloží se na místo označené v překladu. A jsme fakticky hotoví. Programová část určitě, dále budeme potřebovat vydolovat řetězce pro překlad, aby je bylo možné přeložit. Na to máme přibalený nástroj v našem balíčku. Jen je ho potřeba opět nakonfigurovat.
Výcuc
Ve složce Gnu.Gettext.Win32
nalezneme vše potřebné. Rozbalte
si tuto složku do hlavní složky vašeho projektu. Já jsem si ji navíc
přejmenoval na GetText, aby se mi lépe pamatovala. Do hlavní složky projektu
si také přidáme bat
soubor s konfigurací. Já jsem 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 jsme v něm základní parametry. Hlavní a důležitá pro nás je
třetí cesta a to do složky Templates
, kde budeme mít soubor s
vydolovanými řetězci. Tuto složku si musíme vytvořit, jinak nám to vůbec
nepojede. Ještě potřebujeme získat bat
soubor, který vše
obsluhuje. Ten najdeme v balíčku ve složce Scripts
.
Překopírujeme ho do složky GetText
. A jsme i zde hotoví.
Spustíme si extract.bat
a počkáme jak dopadneme. Pokud
úspěšně nalezneme v adresáři Templates
soubor
Strings.pot
. A právě ten použijeme k překladu.
Překládáme
Jsme v poslední fázi. Překlad. Pokud si vygenerovaný soubor prohlédnete (je to obyčejný textový soubor), najdete v něm 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še, co je označeno znakem #
, je komentář, pro nás je
důležitý msgid
, kde je náš původní text v aplikaci. Ten zde
ale nesmíme měnit, pouze pokud ho stejně změníme i v programu. Přeložený
text poté dáme do druhého řádku mezi uvozovky. Vyplníme si krátký
překlad, třebas do slovenštiny. Vypadat 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 prominou, snad. Takto přeložený text si uložíme do složky
Resources
a do složky SK-sk
. Což je identifikátor
pro slovenštinu. Jméno musí zůstat Strings
a přípona souboru
bude po. Dohromady tedy Strings.po
. Tuto složku se souborem
přidáme i do Visual Studia a nezapomeneme souboru nastavit, aby se nám
nakopíroval do výsledné složky.
Když nyní program spustíte, tak na českém systému bude česky a na slovenském slovensky s naším překladem. My si ale můžeme podstrčit slovenštinu a to tímto snadným příkazem:
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("SK-sk");
A hned se nám ukáže text lokalizovaný. Existují různé služby, kde můžete spravovat své překlady. Třebas takový Pootle. Ale s tím ještě nemám žádné zkušenosti, tak uvidíme třeba to vydá na další článek.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 81x (1.23 MB)
Aplikace je včetně zdrojových kódů v jazyce C#