2015-07-06 14:29:34 +00:00
using System ; //Copyright (c) NorbiPeti 2015 - See LICENSE file
2014-04-25 21:55:43 +00:00
using System.Collections.Generic ;
2014-10-24 17:02:38 +00:00
using System.IO ;
2014-04-25 21:55:43 +00:00
using System.Linq ;
using System.Text ;
using System.Threading.Tasks ;
2014-10-24 17:02:38 +00:00
using System.Windows.Forms ;
2014-04-25 21:55:43 +00:00
namespace MSGer.tk
{
2015-07-06 11:04:54 +00:00
public class Language : IPackable , IEquatable < Language > , IPackWithDefaults
2014-04-25 21:55:43 +00:00
{ //2014.04.19.
public Dictionary < string , string > Strings = new Dictionary < string , string > ( ) ;
2015-03-26 19:36:18 +00:00
private static Dictionary < Control , string > Controls = new Dictionary < Control , string > ( ) ;
2015-07-06 11:04:54 +00:00
private Language ( )
{
}
public static List < Language > Languages = new List < Language > ( ) ; //2015.05.16.
2015-03-26 19:36:18 +00:00
2015-07-06 11:04:54 +00:00
private string LanguageKey = "" ; //2015.04.03.
public override string ToString ( )
2014-04-25 21:55:43 +00:00
{
2015-07-06 11:04:54 +00:00
return LanguageKey ;
2014-04-25 21:55:43 +00:00
}
2015-07-06 11:04:54 +00:00
public static Language FromString ( string value )
2014-10-24 17:02:38 +00:00
{
2015-07-06 11:04:54 +00:00
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
2014-10-24 17:02:38 +00:00
{
2015-07-06 11:04:54 +00:00
if ( currentlanguage = = null ) //2015.05.16.
2015-03-26 19:36:18 +00:00
{
2015-07-06 11:04:54 +00:00
if ( Storage . Settings [ SettingType . Lang ] = = "" )
Storage . Settings [ SettingType . Lang ] = "en" ; //2015.05.21.
currentlanguage = Language . FromString ( Storage . Settings [ SettingType . Lang ] ) ; //2015.05.16.
2015-03-26 19:36:18 +00:00
}
2015-07-06 11:04:54 +00:00
return currentlanguage ; //2015.05.16.
2014-10-24 17:02:38 +00:00
}
2015-07-06 11:04:54 +00:00
set
2014-10-24 17:02:38 +00:00
{
2015-07-06 11:04:54 +00:00
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" ) )
2014-10-24 17:02:38 +00:00
{
2015-07-06 11:04:54 +00:00
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.
2014-10-24 17:02:38 +00:00
}
else
{
2015-07-06 11:04:54 +00:00
throw new FileNotFoundException ( "This is just so it will use English when downloading languages..." ) ;
2014-10-24 17:02:38 +00:00
}
}
2015-07-06 11:04:54 +00:00
string strid = id . ToString ( ) . ToLower ( ) ;
if ( CurrentLanguage . Strings . ContainsKey ( strid ) )
2015-03-26 19:36:18 +00:00
{
if ( defaultevent ! = null ) //2014.12.22.
2015-07-06 11:04:54 +00:00
ReloadEvent + = delegate { defaultevent . Text = CurrentLanguage . Strings [ strid ] ; } ; //2014.12.22.
return CurrentLanguage . Strings [ strid ] ;
2015-03-26 19:36:18 +00:00
}
2014-10-24 17:02:38 +00:00
else
{
2015-07-06 11:04:54 +00:00
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.
2014-10-24 17:02:38 +00:00
}
2014-04-25 21:55:43 +00:00
}
2015-03-26 19:36:18 +00:00
public static event EventHandler ReloadEvent ;
public static void ReloadLangs ( )
{
ChatPanel . ReopenChatWindows ( false ) ;
ReloadEvent ( null , null ) ;
Program . MainF . contactList . Items . Clear ( ) ;
Program . MainF . LoadPartnerList ( ) ;
}
2015-07-06 11:04:54 +00:00
#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 ,
2017-08-11 22:22:52 +00:00
FileReceived ,
NoUserNameForPasswordReset ,
DoYouWantNewPassword ,
NonexistentUser ,
LinkAlreadySent ,
LinkSent ,
LinkNotSent ,
LanguageEditor
2015-07-06 11:04:54 +00:00
} //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 < String > 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 < string , string > ( ) ;
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 < string > ( 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 ;
}
2014-04-25 21:55:43 +00:00
}
}