Lokalizace aplikací v C# .NET

C# .NET Pro pokročilé 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ženo 45x (1.23 MB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal vodacek
Avatar
Vodáček dělá že umí C#, naplno se již pět let angažuje v projektu ŽvB. Nyní studuje na FEI Upa informatiku, ikdyž si připadá spíš na ekonomice. Není mu také cizí PHP a SQL. Naopak cizí mu je Java a Python.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Předchozí článek
Regulární výrazy v C# .NET
Miniatura
Všechny články v sekci
C# - Pro pokročilé
Miniatura
Následující článek
Online cvičení regulárních výrazů

 

 

Komentáře

Avatar
Michal Žůrek (misaz):

Ačkoliv jsem to nikdy nezkoušel, mám za to, že C# má Resources File (přípona *.resx) ve kterém jsou stringy a třeba Modern UI aplikace psané v C# jsou schopné si to z tama vytahat.

Odpovědět 6.3.2015 13:39
Nesnáším {}, proto se jim vyhýbám.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.