Zakladem jsou 5 trid – RL, Translation, AppLangConverter, AppLang a AppLangHelper a vyctu Langs. Podle kodu poznate, ze jazyku program muze mit maximalne 10(jedna se o jedine cislo, tedy 0-9). Takze nyni vam tu naserviruji vsechny tyto tridy, vycty a jak se to pouziva v praxi:
RL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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 RL { 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> trans) { foreach (var item in trans) { 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/// <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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
/// <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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 |
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 fixedC = 0; /// <summary> /// Cislo 1 /// </summary> const byte systemC = 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 cs0 = "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 en0 = "Depending on the OS language"; //const string en1 = "Depending on the country"; public static AppLang selectedInCB = null; static AppLangHelper() { fixedLanguages.Add("cs", "Cestina"); fixedLanguages.Add("en", "English"); List<string> systemLanguageCS = new List<string>(); systemLanguageCS.Add(cs0); //systemLanguageCS.Add(cs1); List<string> systemLanguageEN = new List<string>(); systemLanguageEN.Add(en0); //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 == fixedC) { //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 = cs0 + " - " + 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 = en0 + " - " + 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 == fixedC) { 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 = GetLang2(CultureInfo.CurrentUICulture.TwoLetterISOLanguageName); } else if (actual.Language == 1) { vr = GetLang2(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 GetLang2(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 GetCi(Langs p) { CultureInfo ci = null; if (p == Langs.cs) { ci = new CultureInfo("cs"); } else { ci = new CultureInfo("en"); } return ci; } /// <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="cb"></param> /// <param name="settingsAl"></param> public static void AddItemsToComboBox(ComboBox cb, string settingsAl) { selectedInCB = null; byte i = 0; foreach (var item in fixedLanguages) { AppLang al = new AppLang(fixedC, i); cb.Items.Add(al); if (selectedInCB == null) { if (AppLangConverter.ConvertFrom(al) == settingsAl) { selectedInCB = al; } } i++; } if (CultureInfo.CurrentUICulture.TwoLetterISOLanguageName == "cs") { i = 0; foreach (var item in systemLanguages["cs"]) { AppLang al = new AppLang(systemC, i); cb.Items.Add(al); if (selectedInCB == null) { if (AppLangConverter.ConvertFrom(al) == settingsAl) { selectedInCB = al; } } i++; } } else { i = 0; foreach (var item in systemLanguages["en"]) { AppLang al = new AppLang(systemC, i); cb.Items.Add(al); if (selectedInCB == null) { if (AppLangConverter.ConvertFrom(al) == settingsAl) { selectedInCB = al; } } i++; } } cb.SelectedItem = selectedInCB; //-To by se snad nikdy nemelo stat //if (selectedInCB == null) //{ //} } } |
Langs:
1 2 3 4 5 |
public enum Langs : byte { cs = 0, en = 1 } |
Jedinecne pro kazdou aplikaci:
1 2 3 4 5 6 7 8 9 10 11 12 |
//-Vytvorim slovnik s klicy stejnymi jako polozky kterymi se budou naplnovat a dale anglicky text a cesky preklad Dictionary<string, Translation> trans = new Dictionary<string, Translation>(); trans.Add("btnAddFolder.Content", new Translation("Add folders", "Pridat slozky")); //- RL.Initialize(trans); //-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 RL.l = AppLangHelper.GetLang(SunamoAlarmSettings.Language); //-Ulozim si vycet Langs z RL.l do lokalni promenne pro snazsi pristup k ni l = RL.l; //-Takhle uz pak jen vsude nastavite lingualne spravny text btnAddFolder.Content = RL.GetString("btnAddFolder.Content"); |