Sql lokalizace asp.net 2.0

Projekt, spíše komponenta pro lokalizaci asp.net 2.0 aplikací. Založená na možnosti rozšíření funkčního modelu asp.net pomocí implementace ResourceProviderFactory. Využívající jako zdroj dat pro lokalizaci textových informací na webové stránce databázové tabulky.

Motivace

Tato komponenta byla původně určena jako námět k několika článkům na mém blogu, avšak po vyhlášení soutěže komponenta roku jsem se rozhodl, po chvilkovém váhání, že ji přihlásím a pokusím se soutěžit o jednu z hodnotných cen. Nedělám si velké ambice, ale jedno můžu říct již nyní, budu rád, pokud přinese užitek alespoň jednomu asp.net vývojáři.

Popis komponenty

Komponenta umožňuje lokalizaci asp.net aplikace z databázové tabulky. Před tvorbou webové aplikace je tedy nutné mít založenu databázi a vytvořenu lokalizační tabulku. Do této se poté umisťují texty, které se následně budou lokalizovat. Struktura tabulky je jednoduchá a vypadá následovně:

  • resType - představuje typ lokalizace. Tímto typem je myšlena cesta k lokalizovanému formuláři v případě použití ekvivalentu lokálních resources, případně className v případě ekvivalentu globálních resources.
  • resCulture - je název jazyka, pro který je daná lokalizace vytvořena. Název je přebrán jako CultureInfo.Name tedy např. EN-us.
  • resKey - představuje konkrétní klíč použitý k identifikaci lokalizovaného textu.
  • resValue - v tomto sloupečku je uložena samotná lokalizovaná hodnota

Standardní použití

Nejdříve je nutné vytvořit databázovou tabulku, k tomu nám dobře poslouží přiložený soubor dbo.Localization.sql, který nad zvolenou databází spustíme. Poté přikopírujeme zkompilovanou assembly JiravaNet.KomponentaRoku.Localization.dll do bin adresáře naší webové aplikace. V ten okamžik již můžeme začít pracovat s naší webovou aplikací. Otevřeme si soubor web.config a nejdeme element globalization. Pokud takový element ještě v souboru neexistuje, tak jej vytvoříme - Studio by nám mělo s jeho tvorbou pomoci, přesto zde uvedu, kde je třeba takový element umístit configuration/system.web a jak by takový element měl vypadat i po zapsání atributu resourceProviderFactoryType: V uvedené části zápisu je již vyplněn i odkaz na příslušnou ResourceProviderFactory, která se postará o přístup k resources na SQL Serveru. Ještě předtím však je potřeba dále upravit web.config soubor a to přidáním připojovacího řetězce na databázi s dříve vytvořenou tabulkou. Připojovací řetězec se přebírá z výchozího umístění tedy sekce connectionStrings a má název DbLocalization.

V tuto chvíli můžeme konfigurační soubor uložit a přejít k tvorbě stránek. Stránky tvoříme shodně jako dříve, s použitím resx souborů. O tento komfort se stará vestavěný desing time designer, třída poděděná z DesignTimeResourceProviderFactory, která zajišťuje, že veškeré implicitní lokální lokalizace jsou zapsány do databázové tabulky. Toto se uděje po vybrání volby menu Tools - Generate Local Resource. V případě, že používáte na stránce explicitní lokalizaci nebo se z nějakého důvodu nechcete přepínat do Design módu je nutné zapsat všechny potřebné údaje o lokalizaci do databázového zdroje manuálně.

Jak lokalizovat v databázi

Po úspěšném vytvoření všech stránek můžeme přistoupit k samotné lokalizaci. Jestliže jste nezapomínali generovat si lokální resource máte vyhráno a v databázové tabulce objevíte vše potřebné k provedení lokalizace.

Jeden záznam v tabulce lokalizace tak pro výchozí stránku default.aspx na které je umístěn prvek Localizebude vypadat následovně:

  • resType = default.aspx
  • resCulture = < prázdné="">
  • resKey = Localize1.Text
  • resValue = < prázdné="">
Na vás už je jen vytvořit shodné řádky s danou Culture a doplnit lokalizační texty.

Osobně používám tento způsob (platné v případě prvního generování) insert into dbo.Localization (resType, resCulture, resKey, resValue) select resType, 'en-US', resKey, resValue from dbo.Localization jenž vytvoří všechny potřebné klíče pro anglickou lokalizaci. Poté již stačí doplnit texty ve sloupečku resValue a radovat se s perfektně odvedené práce.

Co je dobré vědět

Předně je to způsob, jakým se zachází s lokálními a globálními lokalizacemi, tyto nejsou v tabulce nikterak rozlišovány a jediným rozlišovacím bodem je tak sloupeček resType. Ten, v případě lokální lokalizace obsahuje cestu k souboru (stránce nebo uživatelského kontrolu), v případě globální lokalizace se poté chová následovně:

  • je definována className je tato použita a poté takto uvedený zápis představuje naplnění polí takto resType = MyGlobalStrings a resKey = GlobalResourceString
  • není definována className, potom je použit jako identifikátor název souboru ve kterém se taková definice nachází. Tedy pokud budeme mít takovouto definici v souboru default.aspx bude naplnění polí vypadat takto resType = default.aspx a resKey = GlobalResourceString

Též by bylo vhodné se zmínit o tom, že tento provider nemá implementovánu žádnou dependenci na změny v lokalizační tabulce. Pro promítnutí úprav do lokalizačních textů je tak nutné recyklovat asp.net proces, tak aby došlo k znovunačtení všech hodnot. Na druhou stranu je tak zajištěn velice rychlí přístup k textům.

Provedl jsem malou úpravu v chování oproti "očekávanému", a to tím, že je vždy navrácen text a nikoli hodnota null v okamžiku, kdy daný klíč neexistuje. Takovýto text je tvořen vykřičníky a názvem klíče, který neexistuje.

Dodatečné informace

Přestože by si takováto komponenta zasloužila krásný a efektivní nástroj pro snadné editování zdrojů není součástí tohoto balíčků. V tento okamžik je to z důvodu, že by se již jednalo o kompletní nástroj a jako takový by již nemusel splňovat podmínky pro účast v Komponentě roku.

V důsledku omezené možnosti, vlastně žádné, jakkoli konfigurovat vytváření instancí v ResourceProviderFactory jsou všechny potřebné konfigurační hodnoty integrovány přímo do komponenty. Samozřejmě by nebyl problém vytvořit vlastní ConfigurationSection, což by jen mírně zkomplikovalo prvotní nastavení této komponenty, ale zkomplikovalo a proto jsem se rozhodl ji nepoužít a omezit uživatele na zadání konkrétní hodnoty pro identifikaci connection stringu.Jak příjemné by bylo, kdyby i ResourceProvider bylo možné konfigurovat shodně jako ostatní (Membership, Role, Profile ...) providery.

Samozřejmě nesmí scházet ani poslední výzva a to na vás, uživatele, této komponenty. Máte nějaký nápad nebo postřeh jak ji vylepšit, určitě se ozvěte v komentářích.

Ke stažení

Stáhnout komponentu

PS: zdrojové soubory nejsou v tuto chvíli součástí balíčku, není však pro mě překážkou je na vyžádání poskytnout.

Add a Comment