using System; //Copyright (c) NorbiPeti 2015 - See LICENSE file using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace MSGer.tk { public class Language : IPackable, IEquatable, IPackWithDefaults { //2014.04.19. public Dictionary Strings = new Dictionary(); private static Dictionary Controls = new Dictionary(); private Language() { } public static List Languages = new List(); //2015.05.16. private string LanguageKey = ""; //2015.04.03. public override string ToString() { return LanguageKey; } public static Language FromString(string value) { Language tmp = null; tmp = Languages.FirstOrDefault(entry => entry.LanguageKey == value); //Single-->FirstOrDefault: 2015.06.06. return tmp; } private static Language currentlanguage; public static Language CurrentLanguage { //2015.04.03. get { if (currentlanguage == null) //2015.05.16. { if (Storage.Settings[SettingType.Lang] == "") Storage.Settings[SettingType.Lang] = "en"; //2015.05.21. currentlanguage = Language.FromString(Storage.Settings[SettingType.Lang]); //2015.05.16. } return currentlanguage; //2015.05.16. } set { Storage.Settings[SettingType.Lang] = value.ToString(); currentlanguage = value; //2015.05.16. value.LoadAllStrings(); //2015.05.21. } } public static string Translate(StringID id, Control defaultevent = null) //Csak akkor kell az event, ha látszódik az adott ablak, amikor átállítódik - Tehát csak MainForm és ChatForm { //2014.08.19. if (CurrentLanguage == null) { //2015.05.22. if (Language.Languages.Any(entry => entry.LanguageKey == "en")) { MessageBox.Show("Error: The specified language (" + Storage.Settings[SettingType.Lang] + ") is not found.\nThe program will use english that you can change later."); CurrentLanguage = Languages.FirstOrDefault(entry => entry.LanguageKey == "en"); //Single-->FirstOrDefault: 2015.06.06. } else { throw new FileNotFoundException("This is just so it will use English when downloading languages..."); } } string strid = id.ToString().ToLower(); if (CurrentLanguage.Strings.ContainsKey(strid)) { if (defaultevent != null) //2014.12.22. ReloadEvent += delegate { defaultevent.Text = CurrentLanguage.Strings[strid]; }; //2014.12.22. return CurrentLanguage.Strings[strid]; } else { MessageBox.Show("Translation string not found: " + strid + "\nIn file: " + CurrentLanguage.FileName); //CurrentLanguage.FileName: 2015.05.22. return "Str not found (" + strid + ")"; //id: 2015.04.03. } } public static event EventHandler ReloadEvent; public static void ReloadLangs() { ChatPanel.ReopenChatWindows(false); ReloadEvent(null, null); Program.MainF.contactList.Items.Clear(); Program.MainF.LoadPartnerList(); } #region StringID public enum StringID { //2015.04.05. About, About_Version, About_Programmer, About_SpecialThanks, About_SpecThanks1, About_SpecThanks2, About_SpecThanks3, About_SpecThanks4, AddContact, AddContact_NameEmail, AddContact_Search, UserName, Chat_Title, Sendbtn_Send, Chat_NoWindow, Networking_Alone, Login, Password, Registration, ForgotPassword, Login_Desc1, Login_Desc2, Button_Cancel, ConnectError, Reg_Code, Reg_EmptyField, Reg_CodeErr, Reg_NameErr, Reg_NameLen, Reg_PassLen, Reg_Email, Reg_Success, Menu_Contacts_MakeCategory, Menu_Contacts_EditCategory, Menu_Contacts_RemoveCategory, Menu_Operations, Sendmsg, Menu_Operations_SendOther, Menu_Operations_SendMail, Menu_File_SendFile, Menu_Operations_CallContact, Menu_Operations_VideoCall, Menu_Operations_ShowOnlineFiles, Menu_Operations_PlayGame, Menu_Operations_AskForHelp, Menu_Tools, Menu_Tools_AlwaysOnTop, Menu_Tools_ChangeImage, Menu_Tools_ChangeBackground, Menu_Tools_VoiceVideoSettings, Menu_Tools_Settings, Menu_Help, Menu_Help_Contents, Menu_Help_Status, Menu_Help_PrivacyPolicy, Menu_Help_TermsOfUse, Menu_Help_Report, Menu_Help_ImproveProgram, Menu_Help_About, SearchBar, IconMenu_Show, Menu_File_Logout, Menu_File_Exit, BeforeLogin_CheckForUpdates, OutOfDate, OutOfDate_Caption, Updater, Error, BeforeLogin_LoginForm, Close, Contact_SendEmail, Contact_Info, Contact_Block, Contact_Remove, Contact_EditName, Contact_EventNotifications, Contact_OpenChatLog, Stats_MainServer, Stats_NoNetwork, Stats_Retrying, Stats_Connected, Stats_Servers, Stats_OnlineServers, BeforeLogin_TranslateMainF, Menu_File, Menu_File_LoginNewUser, Menu_File_Status, Menu_File_Status_Online, Menu_File_Status_Busy, Menu_File_Status_Away, Menu_File_Status_Hidden, Menu_File_OpenReceivedFiles, Menu_File_OpenRecentmsgs, Menu_File_Close, Menu_Contacts, Menu_Contacts_Add, Menu_Contacts_Edit, Menu_Contacts_Remove, Menu_Contacts_Invite, Menu_Contacts_MakeGroup, Error_No_Network, UserID, Settings, Settings_Personal, Settings_Layout, Name, Message, Language, Settings_ChatWindow, Settings_ChatWindowTabs, Offline, Contact_CopyEmail, Login_BadNamePass, Said, CurrentLang, ScriptNotFound, ScriptError, ScriptUnloadRequired, Scripter, Scripter_New, Scripter_Open, Scripter_Save, Scripter_Exit, Error_Network_NoInternet, ReceivedFiles, Settings_Packs, Settings_Network, Error_Unknown1, Error_Unknown2, Error_ServerError, FatalError, RestartButton, SelectImage, Modify, Emoticons, Add, Remove, Text, AreYouSure, Handwriting, FileReceived, NoUserNameForPasswordReset, DoYouWantNewPassword, NonexistentUser, LinkAlreadySent, LinkSent, LinkNotSent, LanguageEditor } //TODO: Egyszerűsíteni az azonosítókat, nagyjából jelentsék azt, amit, és semmi több (pl. ne Menu_File_...) #endregion private string FileName; public bool LoadFromPack(string filename) //2015.05.16. { FileName = filename; //2015.05.21. LanguageKey = Path.GetFileNameWithoutExtension(filename); if (this != CurrentLanguage) //<-- Ellenőrzés: 2015.05.21. { foreach (string line in File.ReadLines(filename)) { string[] strs = line.Split('='); if (strs.Length != 2) continue; if (strs[0] == "currentlang") { Strings.Add(strs[0], strs[1]); break; } } } Languages.Add(this); if (this == CurrentLanguage) { LoadAllStrings(); //2015.05.21. } return true; //2015.05.24. } private void LoadAllStrings() //Külön metódus: 2015.05.21. { string filename = FileName; string[] stringids = Enum.GetNames(typeof(StringID)).Select(entry => entry.ToLower()).ToArray(); bool[] stringidsused = new bool[stringids.Length]; string[] lines = File.ReadAllLines(filename); var split = lines.Select(l => l.Split('=')); //2015.06.06. List duplicates = split.GroupBy(x => x[0]) //2015.06.06. .Where(g => g.Count() > 1) //2015.06.06. .Select(g => g.Key) //2015.06.06. .ToList(); //2015.06.06. if (duplicates.Count > 0) { //2015.06.06. MessageBox.Show("Duplicate found (in a different line) in \"" + filename + "\":\n" + duplicates.Aggregate((entry1, entry2) => entry1 += ", " + entry2)); return; } var dict = split.ToDictionary(a => a[0], a => a[1]); var finaldict = new Dictionary(); foreach (var item in dict) { var spl = item.Key.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); duplicates = spl.GroupBy(x => x) //2015.06.06. .Where(g => g.Count() > 1) //2015.06.06. .Select(g => g.Key) //2015.06.06. .ToList(); //2015.06.06. if (duplicates.Count > 0) { //2015.06.06. MessageBox.Show("Duplicate found (in the same line) in \"" + filename + "\":\n" + duplicates.Aggregate((entry1, entry2) => entry1 += ", " + entry2)); return; } foreach (var key in spl) { finaldict.Add(key, item.Value); //Hozzáadja az összes felsorolt keyt külön, ugyanazzal az értékkel int pos = Array.IndexOf(stringids, key); if (pos == -1) { MessageBox.Show("Warning: The translation ID \"" + key + "\" in " + filename + " is not in use. Please remove it or correct the ID."); } else stringidsused[pos] = true; } } for (int i = 0; i < stringids.Length; i++) { if (!stringidsused[i]) { MessageBox.Show("Warning: The translation for ID \"" + stringids[i] + "\" in " + filename + " is missing. Please add it to the file."); } } this.LanguageKey = Path.GetFileNameWithoutExtension(filename); this.Strings = finaldict; } public void UnloadFromPack() //2015.05.16. { } public bool Equals(Language other) { //2015.05.16. return this.LanguageKey == other.LanguageKey; } } }