C # Jak používat jednoduchou formu i18n místo souborů zdrojů (soubory resx)

Už vás nebaví soubory zdrojů (soubory resx)?

Stejně jako mnozí z vás vyvíjím aplikace C # mnoho let. Byly časy, kdy jsem musel používat soubory .resx pro uložení překladu jako klíč-hodnota. Použití souborů resx má několik výhod:

1 - Je to editor zabudovaný do Visual Studio 2 - Visual Studio vytváří statickou třídu, která poskytuje hodnoty překladu

Existují však také některé problémy: 1- Úpravy souborů resx je možné pouze v aplikaci Visual Studio. I když používáme aplikace třetích stran, jako jsou ZetaResourceEditor nebo ResXResourceManager, jsme omezeni na operační systém Windows. 2 - Pro ty, kteří se starají o méně dlls ve výstupu aplikace, jsou soubory resx problémem, protože způsobují, že výstup aplikace má mnoho satelitních sestav. 3 - Závislost injekce s přístupem resx není triviální a potřebuje nějaké obálky kolem statické třídy.

Pokud vás zajímá jiná alternativa, čtěte dál.

JSON k záchraně!

Jako alternativu můžeme použít JSON k uložení našich překladů. Vytvořil jsem úložiště s názvem libc.translation, které tuto úlohu provádí pouze se 6 soubory zdrojového kódu. Uvidíme, jak nám tento kus kódu pomůže:

1 - Odkazujte na balíček nuget: https://www.nuget.org/packages/libc.translation/

2 - Nyní musíme psát naše překlady do souboru JSON (vytvořte náš zdroj lokalizace). Náš soubor JSON je objekt s klíči jako kultur překladů. Níže je uveden příklad:

Příklad souboru JSON s překlady klíčových hodnot arabština (ar), perština (fa) a angličtina (en)

3 - Existují dva způsoby, jak tento soubor použít jako zdroj ILocalizationSource:

3–1 - Vložte tento soubor do naší sestavy: Vyberte soubor v aplikaci Solution Explorer a stiskněte klávesu F4. Na panelu Vlastnosti vyberte „Vložený prostředek“ jako „Sestavit akci“. Nyní je soubor JSON vložen do naší sestavy :-) Pamatujte, že při použití mého přístupu nebudou na výstupu žádné satelitní sestavy

3–2 - Tento soubor uložte někam na disk.

4 - V tomto článku půjdu s vloženým souborem JSON (3–1). Pokud je název našeho projektu „libc.translation.tests“, můžeme vytvořit instanci ILocalizationSource jako je tato:

Vytvořte instanci ILocalizationSource

Třída LocalizationSource má také některá další přetížení konstruktoru, která nám umožňují poskytovat FileInfo, JObject nebo Stream pro data JSON.

Většinu času nepoužíváme přímo ILocalizationSource. Místo toho předáme zdroj konstruktoru Localizer:

Vytvořte instanci ILocalizer

Všimli jste si, že existuje parametr „fallbackCulture“? Jak název napovídá, nouzová kultura se používá, když v našich překladech chybí. Ve výše uvedeném příkladu JSON předpokládejme, že někde v našem kódu se pokusíme získat překladovou hodnotu klíče „InvalidInput“ v „de“ (německém) jazyce. „De“ kultura není specifikována v souboru JSON, takže instance Localizer používá nouzovou kulturu a vrací hodnotu v „ar“ (arabsky).

5- Je čas načíst hodnoty překladu pomocí některých klíčů a požadovaných kultur:

5–1 - Získejte překlad bez předávání kultury: Stačí předat klíč (nerozlišují velká a malá písmena). Zde Localizer použije kulturu vlákna: (Nezapomeňte, že aktuální kultura vlákna není v souboru JSON přítomna, použije se záložní kultura)

Získejte překlad bez předávání kultury

5–2– Získat překlad v konkrétní kultuře: Předejte požadovanou kulturu, pak klíč (nerozlišujte velká a malá písmena) (Pamatujte, že pokud daná kultura není v souboru JSON, použije se nouzová kultura). Podívejme se na příklad:

Získejte překlad v konkrétní kultuře. Vyzkoušejte také záložní kulturu

V prvním bloku výše jsme potřebovali hodnotu překladu pro klíč „InvalidInput“ v „en“ (anglické) kultuře. Ve druhém bloku jsme se pokusili tento překlad získat v „de“ (německé) kultuře, ale protože „de“ není v našem souboru JSON, Localizer se pokusí načíst překlad v nouzové kultuře (což je „ar“ ( Arabština))

5–3– Získejte formátovaný překlad (pomocí řetězce.Formát) bez předání kultury:

Získejte překlad ve formátu bez předávání kultury

Zde jsme předali klíč (všimněte si, že první písmeno je malými písmeny na rozdíl od „UnknownError“, což U je velká písmena) a používá se kultura aktuálního vlákna (což je arabština). A také, podobně jako v řetězci.Format, Localizer nahrazuje „{0}“ za „!!!“.

Můžete se podívat na poskytnuté testy a podívat se na další příklady.

Závěr:

V tomto článku jsme se pokusili použít alternativní způsob lokalizace našich aplikací v projektech .Net Standard 2.0 (.Net Core & .Net Framework 4.6.1+). Viděli jsme, jak vytvořit zdroj ILocalizationSource a předat jej instanci ILocalizer.

Saeid Farahi je íránský softwarový vývojář zaměřený především na ekosystém .Net Framework a .Net Core. Také se zajímá o všechny nabídky na pronájem z libovolného místa na světě :-)