Jak mám udělaný překlad klasických Windows aplikací

Základem jsou 5 tříd – RL, Translation, AppLangConverter, AppLang a AppLangHelper a výčtu Langs. Podle kódu poznáte, že jazyků program může mít maximálně 10 (jedná se o jediné číslo, tedy 0-9). Takže nyní vám tu naservíruji všechny tyto třídy, výčty a jak se to používá v praxi:
RL:

CODE
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
/// <summary>
/// Staticka trida, do ktere se ulozi pod jednotlive klice cesky text i anglicky preklad
/// Ma metodu pro vraceni textu na zaklade daneho jazyku.
/// </summary>
public static class Localizer
{
public static Langs l = Langs.en;
static Dictionary<string, string> en = new Dictionary<string, string>();
static Dictionary<string, string> cs = new Dictionary<string, string>();
public  static void Initialize(Dictionary<string, Translation> translations)
{
foreach (var item in translations)
{
en.Add(item.Key, item.Value.En);
cs.Add(item.Key, item.Value.Cs);
}
}
public static string GetString(string k)
{
if (l == Langs.cs)
{
return cs[k];
}
return en[k];
}
}

Translation:

CODE
/// <summary>
/// Datova trida, obsahujici pouze cesky text a jeho odpovidajici anglicky preklad
/// </summary>
public class Translation
{
public string En = null;
public string Cs = null;
public Translation(string en, string cs)
{
En = en;
Cs = cs;
}
}

AppLangConverter:

CODE
using swf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/// <summary>
/// Staticka  prevodni trida, prevadejici vsechny data z tridy AppLang do retezce a naopak
/// </summary>
public static class AppLangConverter
{
public static AppLang ConvertTo(string b)
{
byte type = 0;
if (!byte.TryParse(b[0].ToString(), out type))
{
return new AppLang(1, 0);
}
byte lang = 0;
if (!byte.TryParse(b[1].ToString(), out lang))
{
return new AppLang(1, 0);
}
return new AppLang(type, lang);
}
public static string ConvertFrom(AppLang t)
{
return t.Type.ToString() + t.Language.ToString();
}
}

AppLang:

CODE
/// <summary>
/// AppLang je pouze datova trida, ktera obsahuje dvou ciferne cislo. Pokud je prvni cislo 0, druhe cislo oznacuje ID jazyku, ktery bude fixne nastaveny. Pokud je 1. cislo 1, bude se jazyk nastavovat podle systemu.
/// </summary>
public class AppLang
{
byte language = 0;
byte type = 0;
/// <summary>
/// Pokud se jedna o systemovy jazyk, z hodnoty 0 se jazyk bere z CurrentUICulture, kdezto u hodnoty 1 z CurrentCulture
/// </summary>
public byte Language
{
get
{
return language;
}
}
/// <summary>
/// Typ jazyka zda fixni nebo systemovy
///
/// </summary>
public byte Type
{
get
{
return type;
}
}
/// <summary>
/// Je zde vykon na 1. miste, proto tato trida nema zadnou metodu Parse a zadny bezparametrovy konstruktor.
/// </summary>
/// <param name="type"></param>
/// <param name="language"></param>
public AppLang(byte type, byte language)
{
this.type = type;
this.language = language;
}
public override string ToString()
{
return AppLangHelper.ToString(this);
}
}

AppLangHelper:

CODE
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows.Controls;
public static class AppLangHelper
{
public static CultureInfo currentCulture = null;
public static CultureInfo currentUICulture = null;
/// <summary>
/// Jazyky ktere si muze zvolit sam uzivatel
/// V klici je zkratka jazyku, v hodnote pak jeji plny nazev
/// </summary>
static Dictionary<string, string> fixedLanguages = new Dictionary<string, string>();
/// <summary>
/// Texty, ktere jazyky
/// V klici je dvou znakovy nazev jazyku, v hodnote pak texty "Podle nastaveneho jazyka OS" a "Depending on the OS language"
/// </summary>
static Dictionary<string, List<string>> systemLanguages = new Dictionary<string, List<string>>();
/// <summary>
/// V klici je dvouznakovy nazev jazyku, v hodnote cislo tohoto jazyku, ktere je v tride AppLang
/// </summary>
static Dictionary<string, byte> languageCodes = new Dictionary<string, byte>();
/// <summary>
/// Cislo 0
/// </summary>
const byte fixedType = 0;
/// <summary>
/// Cislo 1
/// </summary>
const byte systemType = 1;
const byte dependingOnLanguage = 0;
//const byte dependingOnCountry = 1;
/// <summary>
/// Text Podle nastaveneho jazyka OS
/// Ackoliv ma v nazvu 0, pouziva se kdyz typ jazyku neni 0
/// </summary>
const string csSystemLanguageText = "Podle nastaveneho jazyka OS";
//const string cs1 = "Podle nastaveneho regionu";
/// <summary>
/// Text Depending on the OS language
/// Ackoliv ma v nazvu 0, pouziva se kdyz typ jazyku neni 0
/// </summary>
const string enSystemLanguageText = "Depending on the OS language";
//const string en1 = "Depending on the country";
public static AppLang selectedLanguage = null;
static AppLangHelper()
{
fixedLanguages.Add("cs", "Cestina");
fixedLanguages.Add("en", "English");
List<string> systemLanguageCS = new List<string>();
systemLanguageCS.Add(csSystemLanguageText);
//systemLanguageCS.Add(cs1);
List<string> systemLanguageEN = new List<string>();
systemLanguageEN.Add(enSystemLanguageText);
//systemLanguageEN.Add(en1);
systemLanguages.Add("cs", systemLanguageCS);
systemLanguages.Add("en", systemLanguageEN);
}
/// <summary>
/// Vrati nazev jazyku napriklad do ComboBoxu na zmenu jazyka
/// Vraci pokud A1.TYpe neni 0 spravny text podle jazyka OS
/// </summary>
/// <param name="actual"></param>
/// <param name="displayed"></param>
/// <returns></returns>
public static string ToString(AppLang actual)
{
string vr = "";
//Langs l = Langs.cs;
if (actual.Type == fixedType)
{
//l = (Langs)actual.Language;
vr = fixedLanguages[((Langs)actual.Language).ToString()];
}
else
{
CultureInfo depending = null;
if (actual.Language == dependingOnLanguage)
{
depending = currentUICulture;
}
else
{
depending = currentCulture;
}
//depending = CultureInfo.CurrentCulture;
if (depending == null)
{
if (actual.Language == dependingOnLanguage)
{
depending = CultureInfo.CurrentUICulture;
}
else
{
depending = CultureInfo.CurrentCulture;
}
}
if (depending.TwoLetterISOLanguageName == "cs")
{
//l = Enum.Parse(typeof(Langs), de
//int i = 0;
//foreach (var item in systemLanguages["cs"])
//{
//-OK, aktualni jazyk je podle CultureInfo.CurrentUICulture.TwoLetterISOLanguageName
if (actual.Language == 0)
{
vr = csSystemLanguageText + " - " + fixedLanguages[CultureInfo.CurrentUICulture.TwoLetterISOLanguageName];
}
//else if (actual.Language == 1)
//{
//    vr = cs1 + " - " + fixedLanguages[CultureInfo.CurrentCulture.TwoLetterISOLanguageName];
//}
//i++;
//}
}
else //if (depending.TwoLetterISOLanguageName == "en")
{
if (actual.Language == 0)
{
vr = enSystemLanguageText + " - " + fixedLanguages[CultureInfo.CurrentUICulture.TwoLetterISOLanguageName];
}
//else if (actual.Language == 1)
//{
//    vr = en1 + " - " + fixedLanguages[CultureInfo.CurrentCulture.TwoLetterISOLanguageName];
//}
}
}
return vr;
}
/// <summary>
/// Metoda ktera mi vrati jazyk ve kterem se ma obsah zobrazit
/// </summary>
/// <param name="b"></param>
/// <returns></returns>
public static Langs GetLang(string b)
{
Langs vr = Langs.cs;
AppLang actual = AppLangConverter.ConvertTo(b);
if (actual.Type == fixedType)
{
vr = (Langs)actual.Language;
}
else
{
//CultureInfo depending = CultureInfo.CurrentCulture;
//if (depending.TwoLetterISOLanguageName == "cs")
//{
//l = Enum.Parse(typeof(Langs), de
//int i = 0;
//foreach (var item in systemLanguages["cs"])
//{
//-OK, aktualni jazyk je podle CultureInfo.CurrentUICulture.TwoLetterISOLanguageName
if (actual.Language == 0)
{
vr = ParseLang(CultureInfo.CurrentUICulture.TwoLetterISOLanguageName);
}
else if (actual.Language == 1)
{
vr = ParseLang(CultureInfo.CurrentCulture.TwoLetterISOLanguageName);
}
//i++;
//}
//}
//else if (depending.TwoLetterISOLanguageName == "en")
//{
//    if (actual.Language == 0)
//    {
//        vr = en0 + " - " + fixedLanguages[CultureInfo.CurrentUICulture.TwoLetterISOLanguageName];
//    }
//    else if (actual.Language == 1)
//    {
//        vr = en1 + " - " + fixedLanguages[CultureInfo.CurrentCulture.TwoLetterISOLanguageName];
//    }
//}
}
return vr;
}
/// <summary>
/// Pouziva se kdyz chci vratit jazyk ve vyctu Langs - A1 musi byt obsah vyctu Langs, tedy cs nebo en
/// 2 ma v nazvu proto ze stejna metoda jiz existuje, ale ta mi vrati jazyk i podle OS
/// </summary>
/// <param name="p"></param>
/// <returns></returns>
private static Langs ParseLang(string p)
{
Langs vr = Langs.cs;
if (Enum.TryParse<Langs>(p, out vr))
{
return vr;
}
return Langs.en;
}
/// <summary>
/// Vrati CultureInfo dane zeme bez specifikace jazyka pro jazyk A1
/// </summary>
/// <param name="p"></param>
/// <returns></returns>
public static CultureInfo GetCultureInfo(Langs p)
{
CultureInfo culture = null;
if (p == Langs.cs)
{
culture = new CultureInfo("cs");
}
else
{
culture = new CultureInfo("en");
}
return culture;
}
/// <summary>
/// Vrati mi vycet Langs, tedy jazyk na zaklade A1
/// </summary>
/// <param name="cultureInfo"></param>
/// <returns></returns>
public static Langs GetLang(CultureInfo cultureInfo)
{
if (cultureInfo.TwoLetterISOLanguageName == "cs")
{
return Langs.cs;
}
else
{
return Langs.en;
}
}
/// <summary>
/// Prida polozky do A1 - nejdrive fixni jazyky a jak podle OS v jazyku OS
/// Pokud vystup metody AppLangConverter.ConvertFrom aktualni iterace rovna A2, polozka se zvoli.
/// </summary>
/// <param name="comboBox"></param>
/// <param name="settingsAl"></param>
public static void AddItemsToComboBox(ComboBox comboBox, string settingsAl)
{
selectedLanguage = null;
byte i = 0;
foreach (var item in fixedLanguages)
{
AppLang al = new AppLang(fixedType, i);
comboBox.Items.Add(al);
if (selectedLanguage == null)
{
if (AppLangConverter.ConvertFrom(al) == settingsAl)
{
selectedLanguage = al;
}
}
i++;
}
if (CultureInfo.CurrentUICulture.TwoLetterISOLanguageName == "cs")
{
i = 0;
foreach (var item in systemLanguages["cs"])
{
AppLang al = new AppLang(systemType, i);
comboBox.Items.Add(al);
if (selectedLanguage == null)
{
if (AppLangConverter.ConvertFrom(al) == settingsAl)
{
selectedLanguage = al;
}
}
i++;
}
}
else
{
i = 0;
foreach (var item in systemLanguages["en"])
{
AppLang al = new AppLang(systemType, i);
comboBox.Items.Add(al);
if (selectedLanguage == null)
{
if (AppLangConverter.ConvertFrom(al) == settingsAl)
{
selectedLanguage = al;
}
}
i++;
}
}
comboBox.SelectedItem = selectedLanguage;
//-To by se snad nikdy nemelo stat
//if (selectedInCB == null)
//{
//}
}
}

Langs:

CODE
public enum Langs : byte
{
cs = 0,
en = 1
}

Jedinečné pro každou aplikaci:

CODE
//-Vytvorim slovnik s klicy stejnymi jako polozky kterymi se budou naplnovat a dale anglicky text a cesky preklad
Dictionary<string, Translation> translations = new Dictionary<string, Translation>();
translations.Add("btnAddFolder.Content", new Translation("Add folders", "Pridat slozky"));
//-
Localizer.Initialize(translations);
//-Zde muzete take fixne urcit nejaky jazyk nebo pomoci CultureInfo tridy nastavit jazyk podle systemu
//-Ja zde nacitam jazyk ze souboru, program si jej pamatuje
Localizer.l = AppLangHelper.GetLang(SunamoAlarmSettings.Language);
//-Ulozim si vycet Langs z RL.l do lokalni promenne pro snazsi pristup k ni
l = Localizer.l;
//-Takhle uz pak jen vsude nastavite lingualne spravny text
btnAddFolder.Content = Localizer.GetString("btnAddFolder.Content");

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *