Browse Source

added support for mulitple languages
[SAB]


git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@183 595ec19a-5cb4-439b-94a8-42fb3063c22c

sabrogden 20 years ago
parent
commit
017733a4bb
36 changed files with 387 additions and 117 deletions
  1. 4 0
      About.cpp
  2. 3 0
      About.h
  3. 2 0
      AddType.cpp
  4. 20 12
      CP_Main.cpp
  5. 25 1
      CP_Main.dsp
  6. 4 0
      CP_Main.h
  7. 76 67
      CP_Main.rc
  8. 2 0
      CopyProperties.cpp
  9. 12 4
      DatabaseUtilities.cpp
  10. 2 0
      FriendDetails.cpp
  11. 8 7
      InternetUpdate.cpp
  12. 12 0
      MainFrm.cpp
  13. 1 0
      MainFrm.h
  14. 23 10
      Misc.cpp
  15. 8 3
      Misc.h
  16. 2 0
      MoveToGroupDlg.cpp
  17. 6 0
      OptionFriends.cpp
  18. 1 0
      OptionFriends.h
  19. 52 6
      OptionsGeneral.cpp
  20. 7 1
      OptionsGeneral.h
  21. 6 0
      OptionsKeyBoard.cpp
  22. 1 0
      OptionsKeyBoard.h
  23. 6 0
      OptionsQuickPaste.cpp
  24. 1 0
      OptionsQuickPaste.h
  25. 2 0
      OptionsSheet.cpp
  26. 28 0
      OptionsSheet.h
  27. 7 1
      OptionsStats.cpp
  28. 2 0
      OptionsStats.h
  29. 7 0
      OptionsTypes.cpp
  30. 1 0
      OptionsTypes.h
  31. 13 4
      ProcessCopy.cpp
  32. 1 0
      ProcessCopy.h
  33. 2 0
      QPasteWnd.cpp
  34. 35 1
      Resource.h
  35. 3 0
      SystemTray.cpp
  36. 2 0
      SystemTray.h

+ 4 - 0
About.cpp

@@ -21,6 +21,10 @@ IMPLEMENT_DYNCREATE(CAbout, CPropertyPage)
 
 CAbout::CAbout() : CPropertyPage(CAbout::IDD)
 {
+	m_csTitle = theApp.m_Language.GetString("AboutTitle", "About");
+	m_psp.pszTitle = m_csTitle;
+	m_psp.dwFlags |= PSP_USETITLE;
+
 	//{{AFX_DATA_INIT(CAbout)
 		// NOTE: the ClassWizard will add member initialization here
 	//}}AFX_DATA_INIT

+ 3 - 0
About.h

@@ -38,6 +38,9 @@ public:
 
 // Implementation
 protected:
+
+	CString m_csTitle;
+
 	// Generated message map functions
 	//{{AFX_MSG(CAbout)
 	virtual BOOL OnInitDialog();

+ 2 - 0
AddType.cpp

@@ -96,6 +96,8 @@ BOOL CAddType::OnInitDialog()
 	oleData.Release();
 
 	m_lbDefaultTypes.SetFocus();
+
+	theApp.m_Language.UpdateOptionSupportedTypesAdd(this);
 	return FALSE;
 }
 

+ 20 - 12
CP_Main.cpp

@@ -103,18 +103,26 @@ BOOL CCP_MainApp::InitInstance()
 	AfxOleInit();
 	AfxInitRichEdit();
 
+	CString csFile = CGetSetOptions::GetLanguageFile();
+	if(!m_Language.LoadLanguageFile(csFile))
+	{
+		CString cs;
+		cs.Format("Error loading language file - %s - \n\n%s", csFile, m_Language.m_csLastError);
+
+		MessageBox(m_MainhWnd, cs, "Ditto", MB_OK);
+	}
+
 	m_cfIgnoreClipboard = ::RegisterClipboardFormat("Clipboard Viewer Ignore");
 
 	int nRet = CheckDBExists(CGetSetOptions::GetDBPath());
 	if(nRet == FALSE)
 	{
-		AfxMessageBox("Error Opening Database.");
+		AfxMessageBox(theApp.m_Language.GetString("Error_Opening_Database", "Error Opening Database."));
 		return TRUE;
 	}
 	else if(nRet == ERROR_OPENING_DATABASE)
 	{
-		CString cs;
-		cs.Format("Unable to initialize DAO/Jet db engine.\nSelect YES to download DAO from http://ditto-cp.sourceforge.net/dao_setup.exe\n\nRestart Ditto after installation of DAO.");
+		CString cs = theApp.m_Language.GetString("Error_Init_Dao", "Unable to initialize DAO/Jet db engine.\nSelect YES to download DAO from http://ditto-cp.sourceforge.net/dao_setup.exe\n\nRestart Ditto after installation of DAO.");
 		if(MessageBox(NULL, cs, "Ditto", MB_YESNO) == IDYES)
 		{
 			ShellExecute(NULL, "open", "http://ditto-cp.sourceforge.net/dao_setup.exe", "", "", SW_SHOW);
@@ -313,7 +321,7 @@ void CCP_MainApp::StopCopyThread()
 //  be actually connected -- check IsClipboardViewerConnected())
 bool CCP_MainApp::ToggleConnectCV()
 {
-bool bConnect = !GetConnectCV();
+	bool bConnect = !GetConnectCV();
 	SetConnectCV( bConnect );
 	if( bConnect )
 		m_pMainFrame->m_TrayIcon.SetIcon( IDR_MAINFRAME );
@@ -332,13 +340,14 @@ void CCP_MainApp::UpdateMenuConnectCV( CMenu* pMenu, UINT nMenuID )
 	if( pMenu == NULL )
 		return;
 
-bool bConnect = theApp.GetConnectCV();
-bool bIsConnected = theApp.IsClipboardViewerConnected();
-CString cs;
+	bool bConnect = theApp.GetConnectCV();
+	bool bIsConnected = theApp.IsClipboardViewerConnected();
+	CString cs;
 
 	if( bConnect )
 	{
-		cs = "Disconnect from Clipboard";
+		cs = theApp.m_Language.GetString("Disconnect_Clipboard", "Disconnect from Clipboard.");
+
 		pMenu->ModifyMenu(nMenuID, MF_BYCOMMAND, nMenuID, cs);
 		// add a check mark if we are still disconnected (temporarily)
 		if( !bIsConnected )
@@ -348,7 +357,8 @@ CString cs;
 	}
 	else // CV is disconnected, so provide the option of connecting
 	{
-		cs = "Connect to Clipboard";
+		cs = theApp.m_Language.GetString("Connect_Clipboard", "Connect to Clipboard.");
+
 		pMenu->ModifyMenu(nMenuID, MF_BYCOMMAND, nMenuID, cs);
 		// add a check mark if we are still connected (temporarily)
 		if( bIsConnected )
@@ -672,9 +682,7 @@ void CCP_MainApp::Delayed_RemoveOldEntries( UINT delay )
 int CCP_MainApp::ExitInstance() 
 {
 	LOG("ExitInstance");
-	if(CGetSetOptions::GetCompactAndRepairOnExit())
-		CompactDatabase();
-	
+
 	CloseDB();
 
 	return CWinApp::ExitInstance();

+ 25 - 1
CP_Main.dsp

@@ -69,7 +69,7 @@ LINK32=link.exe
 # PROP Ignore_Export_Lib 0
 # PROP Target_Dir ""
 # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "EncryptDecrypt\\" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "AFTER_98" /Yu"stdafx.h" /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "EncryptDecrypt\\" /I "TinyXml\\" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "AFTER_98" /Yu"stdafx.h" /FD /GZ /c
 # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
 # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"
@@ -260,6 +260,10 @@ SOURCE=.\MoveToGroupDlg.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\MultiLanguage.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\OptionFriends.cpp
 # End Source File
 # Begin Source File
@@ -421,6 +425,10 @@ SOURCE=.\MoveToGroupDlg.h
 # End Source File
 # Begin Source File
 
+SOURCE=.\MultiLanguage.h
+# End Source File
+# Begin Source File
+
 SOURCE=.\OptionFriends.h
 # End Source File
 # Begin Source File
@@ -624,6 +632,18 @@ SOURCE=.\EncryptDecrypt.lib
 # PROP Exclude_From_Build 1
 # End Source File
 # End Group
+# Begin Group "TinyXml"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\TinyXml\tinystr.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\TinyXml\tinyxml.h
+# End Source File
+# End Group
 # Begin Source File
 
 SOURCE=.\ReadMe.txt
@@ -632,5 +652,9 @@ SOURCE=.\ReadMe.txt
 
 SOURCE=.\focusdll\Release\focus.lib
 # End Source File
+# Begin Source File
+
+SOURCE=.\tinyxml.lib
+# End Source File
 # End Target
 # End Project

+ 4 - 0
CP_Main.h

@@ -22,6 +22,7 @@
 #include "ArrayEx.h"
 #include "MainFrm.h"
 #include "ProcessPaste.h"
+#include "MultiLanguage.h"
 
 #define MAIN_WND_TITLE		"Ditto MainWnd"
 //#define GET_APP    ((CCP_MainApp *)AfxGetApp())	
@@ -164,6 +165,9 @@ public:
 	CLIPFORMAT m_HTML_Format;
 
 	COleDateTime m_oldtStartUp;
+
+	//Mulitlange Support
+	CMultiLanguage m_Language;
 // Overrides
 	// ClassWizard generated virtual function overrides
 	//{{AFX_VIRTUAL(CCP_MainApp)

+ 76 - 67
CP_Main.rc

@@ -421,7 +421,7 @@ BEGIN
     CONTROL         "Show leading whitespace",
                     IDC_DESC_SHOW_LEADING_WHITESPACE,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,18,41,97,10
-    LTEXT           "Text Lines per Row",IDC_STATIC,18,54,62,8
+    LTEXT           "Text Lines per Row",IDC_STATIC_LINES,18,54,62,8
     EDITTEXT        IDC_LINES_ROW,82,52,19,12,ES_AUTOHSCROLL
     CONTROL         "Enable Quick Paste Transparency",IDC_TRANSPARENCY,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,67,122,10
@@ -435,10 +435,11 @@ BEGIN
     CONTROL         "At Previous Position",IDC_AT_PREVIOUS,"Button",
                     BS_AUTORADIOBUTTON,31,207,79,10
     LTEXT           "%",IDC_STATIC,162,69,8,8
-    GROUPBOX        "Popup Positioning",IDC_STATIC,19,178,116,41
+    GROUPBOX        "Popup Positioning",IDC_STATIC_POPUP,19,178,116,41
     LTEXT           "  * = Don't Auto Delete\n  s = Shortcut exists\n G = Item is a Group\n  ! = Item is attached to a Group",
-                    IDC_STATIC,148,183,103,36
-    GROUPBOX        "List Item Prefix Legend",IDC_STATIC,142,173,116,50
+                    IDC_STATIC_LEG,148,183,103,36
+    GROUPBOX        "List Item Prefix Legend",IDC_STATIC_LEGEND,142,173,116,
+                    50
     CONTROL         "Show thumbnails (for CF_DIB types) (Could Increase Memory Usage and Display Speed)",
                     IDC_SHOW_THUMBNAILS,"Button",BS_AUTOCHECKBOX | 
                     WS_TABSTOP,18,79,293,10
@@ -508,25 +509,25 @@ BEGIN
                     WS_TABSTOP,229,134,80,14
     CONTROL         "Win",IDC_CHECK_WIN10,"Button",BS_AUTOCHECKBOX | 
                     WS_TABSTOP,309,134,27,14
-    GROUPBOX        "Global Hot Keys for Last Ten Items Copied",IDC_STATIC,7,
-                    49,336,106
+    GROUPBOX        "Global Hot Keys for Last Ten Items Copied",
+                    IDC_STATIC_GROUP,7,49,336,106
     CONTROL         "Send Paste (Otherwise it will just load the item on the clipboard)",
                     IDC_CHECK_SEND_PASTE,"Button",BS_AUTOCHECKBOX | 
                     WS_TABSTOP,19,60,257,13
-    LTEXT           "Activate Ditto",IDC_STATIC,19,16,44,8
-    LTEXT           "Named Copy",IDC_STATIC,19,34,42,8
-    LTEXT           "Position 1",IDC_STATIC,19,74,32,14,SS_CENTERIMAGE
-    LTEXT           "Position 2",IDC_STATIC,19,89,32,14,SS_CENTERIMAGE
-    LTEXT           "Position 3",IDC_STATIC,19,104,32,14,SS_CENTERIMAGE
-    LTEXT           "Position 4",IDC_STATIC,19,119,32,14,SS_CENTERIMAGE
-    LTEXT           "Position 5",IDC_STATIC,19,134,32,14,SS_CENTERIMAGE
-    LTEXT           "Position 6",IDC_STATIC,184,74,32,14,SS_CENTERIMAGE
-    LTEXT           "Position 7",IDC_STATIC,184,89,32,14,SS_CENTERIMAGE
-    LTEXT           "Position 8",IDC_STATIC,184,104,32,14,SS_CENTERIMAGE
-    LTEXT           "Position 9",IDC_STATIC,184,119,32,14,SS_CENTERIMAGE
-    LTEXT           "Position 10",IDC_STATIC,184,134,36,14,SS_CENTERIMAGE
+    LTEXT           "Activate Ditto",IDC_STATIC_ACTIVATE,19,16,44,8
+    LTEXT           "Named Copy",IDC_STATIC_NAMED_COPY,19,34,42,8
+    LTEXT           "Position 1",IDC_STATIC_1,19,74,32,14,SS_CENTERIMAGE
+    LTEXT           "Position 2",IDC_STATIC_2,19,89,32,14,SS_CENTERIMAGE
+    LTEXT           "Position 3",IDC_STATIC_3,19,104,32,14,SS_CENTERIMAGE
+    LTEXT           "Position 4",IDC_STATIC_4,19,119,32,14,SS_CENTERIMAGE
+    LTEXT           "Position 5",IDC_STATIC_5,19,134,32,14,SS_CENTERIMAGE
+    LTEXT           "Position 6",IDC_STATIC_6,184,74,32,14,SS_CENTERIMAGE
+    LTEXT           "Position 7",IDC_STATIC_7,184,89,32,14,SS_CENTERIMAGE
+    LTEXT           "Position 8",IDC_STATIC_8,184,104,32,14,SS_CENTERIMAGE
+    LTEXT           "Position 9",IDC_STATIC_9,184,119,32,14,SS_CENTERIMAGE
+    LTEXT           "Position 10",IDC_STATIC_10,184,134,36,14,SS_CENTERIMAGE
     LTEXT           "Check the ""Win"" Button to include the windows keyboard key in your hot key.",
-                    IDC_STATIC,7,159,336,25
+                    IDC_STATIC_WIN,7,159,336,25
 END
 
 IDD_OPTIONS_GENERAL DIALOG DISCARDABLE  0, 0, 295, 242
@@ -534,51 +535,57 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "General"
 FONT 8, "MS Sans Serif"
 BEGIN
-    CONTROL         "Display Icon in System Tray",IDC_DISPLAY_IN_SYSTEMTRAY,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,28,103,10
     CONTROL         "Start Ditto on System Startup",IDC_START_ON_STARTUP,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,15,107,10
+    CONTROL         "Display Icon in System Tray",IDC_DISPLAY_IN_SYSTEMTRAY,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,28,103,10
     CONTROL         "Maximum Number of Saved Copies",IDC_MAXIMUM,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,23,41,126,10
+    EDITTEXT        IDC_MAX_SAVED_COPIES,149,41,19,12,ES_AUTOHSCROLL
     CONTROL         "Paste Entries Expire after",IDC_EXPIRE,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,23,54,95,10
     EDITTEXT        IDC_EXPIRE_AFTER,118,53,19,12,ES_AUTOHSCROLL
-    LTEXT           "Days",IDC_STATIC,142,56,26,8
-    EDITTEXT        IDC_MAX_SAVED_COPIES,149,41,19,12,ES_AUTOHSCROLL
-    CONTROL         "Compact and Repair Database on Exit",IDC_COMPACT_REPAIR,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,67,137,10
-    PUSHBUTTON      "Compact and Repair",IDC_BT_COMPACT_AND_REPAIR,161,66,69,
-                    11
-    CONTROL         "Automatically check for updates online",
-                    IDC_CHECK_UPDATES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
-                    23,106,137,10
-    PUSHBUTTON      "Check Now",IDC_CHECK_FOR_UPDATES,161,106,50,11
+    LTEXT           "Days",IDC_STATIC_DAYS,142,56,26,8
+    PUSHBUTTON      "Compact and Repair Database",IDC_BT_COMPACT_AND_REPAIR,
+                    170,14,105,11
     CONTROL         "Set Database Path",IDC_SET_DB_PATH,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,23,79,76,10
     EDITTEXT        IDC_PATH,23,89,248,12,ES_AUTOHSCROLL
     PUSHBUTTON      "....",IDC_GET_PATH,274,89,14,12
+    CONTROL         "Automatically check for updates online",
+                    IDC_CHECK_UPDATES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    23,106,137,10
+    PUSHBUTTON      "Check Now",IDC_CHECK_FOR_UPDATES,161,106,50,11
     CONTROL         "Allow Duplicates",IDC_ALLOW_DUPLICATES,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,23,118,68,10
     CONTROL         "Update Clip Time On Paste",IDC_UPDATE_TIME_ON_PASTE,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,131,101,10
     CONTROL         "Save Multi-Pastes",IDC_SAVE_MULTIPASTE,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,23,142,73,10
-    EDITTEXT        IDC_DESC_TEXT_SIZE,148,163,35,12,ES_AUTOHSCROLL
-    LTEXT           "Amount of text to save for description",IDC_STATIC,24,
-                    165,122,8
     CONTROL         "Hide Ditto on Hot Key if Ditto is Visible",
                     IDC_HIDE_DITO_ON_HOT_KEY,"Button",BS_AUTOCHECKBOX | 
                     WS_TABSTOP,23,153,135,10
-    LTEXT           "On copy play the sound",IDC_STATIC,24,177,81,10
+    LTEXT           "Amount of text to save for description",
+                    IDC_STATIC_AMOUNT,24,165,122,8
+    EDITTEXT        IDC_DESC_TEXT_SIZE,148,163,35,12,ES_AUTOHSCROLL
+    LTEXT           "On copy play the sound",IDC_STATIC_SOUND,24,177,81,10
     EDITTEXT        IDC_EDIT_PLAY_SOUND,105,177,145,12,ES_AUTOHSCROLL
-    PUSHBUTTON      "....",IDC_SELECT_SOUND,274,177,14,12
     PUSHBUTTON      "Play",IDC_BUTTON_PLAY,251,177,19,12
+    PUSHBUTTON      "....",IDC_SELECT_SOUND,274,177,14,12
     CONTROL         "Paste Clip in active window after selection",
                     IDC_SEND_PASTE_MESSAGE,"Button",BS_AUTOCHECKBOX | 
                     WS_TABSTOP,23,190,148,10
-    LTEXT           "Maximum Clip Size in Bytes",IDC_STATIC,23,202,88,8
+    LTEXT           "Maximum Clip Size in Bytes",IDC_STATIC_MAX_SIZE,23,202,
+                    88,8
     EDITTEXT        IDC_EDIT_MAX_SIZE,112,201,59,12,ES_AUTOHSCROLL
-    LTEXT           "(Leave blank for no limit)",IDC_STATIC,176,202,78,8
+    LTEXT           "(Leave blank for no limit)",IDC_STATIC_NO_LIMIT,176,202,
+                    78,8
+    LTEXT           "Lanuage",IDC_STATIC_LANGUAGE,23,66,36,10
+    COMBOBOX        IDC_COMBO_LANGUAGE,71,65,130,95,CBS_DROPDOWNLIST | 
+                    CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    LTEXT           "Ignore copies that occur X milliseconds from the last copy (1000 ms = 1 sec)",
+                    IDC_STATIC_SAVE_DELAY,23,215,186,19
+    EDITTEXT        IDC_EDIT_SAVE_DELAY,209,214,38,12,ES_AUTOHSCROLL
 END
 
 IDD_SELECT_DB DIALOG DISCARDABLE  0, 0, 276, 46
@@ -612,20 +619,22 @@ BEGIN
     EDITTEXT        IDC_DATABASE_SIZE,76,121,41,12,ES_AUTOHSCROLL
     EDITTEXT        IDC_CLIPS_SENT,76,135,41,12,ES_AUTOHSCROLL
     EDITTEXT        IDC_CLIPS_RECIVED,76,149,41,12,ES_AUTOHSCROLL
-    LTEXT           "Copies",IDC_STATIC,132,31,22,12
-    LTEXT           "Pastes",IDC_STATIC,132,45,22,12
-    GROUPBOX        "Trip Odometer",IDC_STATIC,128,7,105,54
-    LTEXT           "Copies",IDC_STATIC,13,33,22,12
-    LTEXT           "Pastes",IDC_STATIC,13,46,22,12
-    GROUPBOX        "Odometer",IDC_STATIC,7,7,110,54
-    LTEXT           "Saved Copies",IDC_STATIC,15,73,45,12
-    LTEXT           "Saved Copy Data",IDC_STATIC,15,88,57,12
-    LTEXT           "Database Size",IDC_STATIC,15,121,47,12,SS_CENTERIMAGE
-    LTEXT           "Clips Sent",IDC_STATIC,15,135,32,12,SS_CENTERIMAGE
-    LTEXT           "Clips Recieved",IDC_STATIC,15,149,47,12,SS_CENTERIMAGE
+    LTEXT           "Copies",IDC_STATIC_5,132,31,22,12
+    LTEXT           "Pastes",IDC_STATIC_6,132,45,22,12
+    GROUPBOX        "Trip Odometer",IDC_STATIC_2,128,7,105,54
+    LTEXT           "Copies",IDC_STATIC_3,13,33,22,12
+    LTEXT           "Pastes",IDC_STATIC_4,13,46,22,12
+    GROUPBOX        "Odometer",IDC_STATIC_1,7,7,110,54
+    LTEXT           "Saved Copies",IDC_STATIC_7,15,73,45,12
+    LTEXT           "Saved Copy Data",IDC_STATIC_8,15,88,57,12
+    LTEXT           "Database Size",IDC_STATIC_10,15,121,47,12,
+                    SS_CENTERIMAGE
+    LTEXT           "Clips Sent",IDC_STATIC_11,15,135,32,12,SS_CENTERIMAGE
+    LTEXT           "Clips Recieved",IDC_STATIC_12,15,149,47,12,
+                    SS_CENTERIMAGE
     GROUPBOX        "",IDC_STATIC,7,63,166,40
-    LTEXT           "Last Started",IDC_STATIC,15,107,47,12,SS_CENTERIMAGE
-    LTEXT           "Since Last Start",IDC_STATIC,120,144,51,8
+    LTEXT           "Last Started",IDC_STATIC_9,15,107,47,12,SS_CENTERIMAGE
+    LTEXT           "Since Last Start",IDC_STATIC_13,120,144,51,8
 END
 
 IDD_ADD_TYPE DIALOG DISCARDABLE  0, 0, 276, 230
@@ -642,9 +651,9 @@ BEGIN
     PUSHBUTTON      "Add",IDC_ADD_1,7,191,31,11
     PUSHBUTTON      "Add",IDC_ADD_2,231,15,31,11
     PUSHBUTTON      "Add",IDC_ADD_3,130,191,31,11
-    LTEXT           "Custom Type",IDC_STATIC,135,7,42,8
-    LTEXT           "Currently on the Clipboard",IDC_STATIC,135,35,82,8
-    LTEXT           "Main Types",IDC_STATIC,7,7,38,8
+    LTEXT           "Custom Type",IDC_STATIC_2,135,7,42,8
+    LTEXT           "Currently on the Clipboard",IDC_STATIC_3,135,35,82,8
+    LTEXT           "Main Types",IDC_STATIC_1,7,7,38,8
 END
 
 IDD_COPY_PROPERTIES DIALOG DISCARDABLE  0, 0, 244, 223
@@ -667,11 +676,11 @@ BEGIN
     PUSHBUTTON      "Delete",IDC_DELETE_COPY_DATA,7,204,24,12
     DEFPUSHBUTTON   "OK",IDOK,133,202,50,14
     PUSHBUTTON      "Cancel",IDCANCEL,187,202,50,14
-    LTEXT           "Item Title",IDC_STATIC,7,49,46,8
-    LTEXT           "Date",IDC_STATIC,128,7,16,13,SS_CENTERIMAGE
-    LTEXT           "Hot Key",IDC_STATIC,7,7,28,13,SS_CENTERIMAGE
+    LTEXT           "Item Title",IDC_STATIC_TITLE,7,49,46,8
+    LTEXT           "Date",IDC_STATIC_DATE,128,7,16,13,SS_CENTERIMAGE
+    LTEXT           "Hot Key",IDC_STATIC_HOT_KEY,7,7,28,13,SS_CENTERIMAGE
     LTEXT           "Copy Formats",IDC_STATIC_FORMATS,7,116,46,8
-    LTEXT           "Move To Group",IDC_STATIC,8,40,56,9
+    LTEXT           "Move To Group",IDC_STATIC_MOVE_TO_GROUP,8,40,56,9
     CONTROL         "",IDC_RICHEDIT1,"RICHEDIT",ES_MULTILINE | 
                     ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | 
                     WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,58,230,57
@@ -706,22 +715,22 @@ BEGIN
     CONTROL         "List1",IDC_LIST,"SysListView32",LVS_REPORT | WS_BORDER | 
                     WS_TABSTOP,7,142,307,85
     LTEXT           "If Send All Copies is selected then all copies from this computer will be sent to the other computer.  If that is not selected then it will just be in the right click menu to send a copy to that computer.",
-                    IDC_STATIC,7,113,278,24
+                    IDC_STATIC_6,7,113,278,24
     EDITTEXT        IDC_EDIT_PLACE_ON_CLIPBOARD,96,34,210,13,ES_AUTOHSCROLL
-    LTEXT           "IP/Computer Names seperated by commas",IDC_STATIC,7,32,
-                    70,17
+    LTEXT           "IP/Computer Names seperated by commas",IDC_STATIC_2,7,
+                    32,70,17
     LTEXT           "When you recieve a sent copy if their ip or computer name is in this list then it will be put on the clipboard.  Otherwise it will be in the saved clips to use at a later time.",
-                    IDC_STATIC,7,10,307,18
+                    IDC_STATIC_1,7,10,307,18
     CONTROL         "Log Send Receive Commands",IDC_CHECK_LOG_SEND_RECIEVE,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,231,176,12
     CONTROL         "Disable Recieving Clips",IDC_CHECK_DISABLE_FRIENDS,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,95,48,90,10
-    LTEXT           "Network Password",IDC_STATIC,7,68,79,9
+    LTEXT           "Network Password",IDC_STATIC_3,7,68,79,9
     EDITTEXT        IDC_EDIT_PASSWORD,96,65,210,13,ES_AUTOHSCROLL
     EDITTEXT        IDC_EDIT_ADDITIONAL,95,100,210,11,ES_AUTOHSCROLL
     LTEXT           "If you are receiving clips from computers where your network password does not match, enter additional network passwords separated by commas",
-                    IDC_STATIC,7,81,307,16
-    LTEXT           "Receive Passwords",IDC_STATIC,7,102,79,9
+                    IDC_STATIC_4,7,81,307,16
+    LTEXT           "Receive Passwords",IDC_STATIC_5,7,102,79,9
 END
 
 IDD_FRIEND_DETAILS DIALOG DISCARDABLE  0, 0, 203, 79
@@ -733,9 +742,9 @@ BEGIN
     PUSHBUTTON      "Cancel",IDCANCEL,146,58,50,14
     CONTROL         "Send All Copies to this friend",IDC_CHECK_SEND_ALL,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,47,7,105,10
-    LTEXT           "IP/Name",IDC_STATIC,7,23,30,8
+    LTEXT           "IP/Name",IDC_STATIC_1,7,23,30,8
     EDITTEXT        IDC_EDIT_IP,47,20,83,13,ES_AUTOHSCROLL
-    LTEXT           "Description",IDC_STATIC,7,41,36,8
+    LTEXT           "Description",IDC_STATIC_2,7,41,36,8
     EDITTEXT        IDC_EDIT_DESCRIPTION,47,39,149,13,ES_AUTOHSCROLL
 END
 

+ 2 - 0
CopyProperties.cpp

@@ -126,6 +126,8 @@ BOOL CCopyProperties::OnInitDialog()
 	m_Resize.AddControl(IDOK, DR_MoveTop | DR_MoveLeft);
 	m_Resize.AddControl(IDCANCEL, DR_MoveTop | DR_MoveLeft);
 
+	theApp.m_Language.UpdateClipProperties(this);
+
 	return FALSE;
 }
 

+ 12 - 4
DatabaseUtilities.cpp

@@ -97,10 +97,16 @@ BOOL CheckDBExists(CString csDBPath)
 		CString csPath = GetDefaultDBName();
 		
 		CString cs;
-		cs.Format("Unrecognized Database Format \"%s\",\n"
-			"the file will be renamed \"%s\",\n"
-			"and a new database will be created,\n"
-			"\"%s\"", csDBPath, csMarkAsBad, csPath);
+		cs.Format("%s \"%s\",\n"
+			"%s \"%s\",\n"
+			"%s,\n"
+			"\"%s\"",
+			theApp.m_Language.GetString("Database_Format", "Unrecognized Database Format"),
+			csDBPath, 
+			theApp.m_Language.GetString("File_Renamed", "the file will be renamed"),
+			csMarkAsBad, 
+			theApp.m_Language.GetString("New_Database", "and a new database will be created"),
+			csPath);
 		
 		AfxMessageBox(cs);
 		
@@ -454,6 +460,8 @@ BOOL CompactDatabase()
 	if(!theApp.CloseDB())
 		return FALSE;
 	
+	CWaitCursor wait;
+
 	CString csDBName = GetDBName();
 	CString csTempDBName = csDBName;
 	csTempDBName.Replace(".mdb", "TempDBName.mdb");

+ 2 - 0
FriendDetails.cpp

@@ -51,6 +51,8 @@ BOOL CFriendDetails::OnInitDialog()
 	CDialog::OnInitDialog();
 	
 	UpdateData(FALSE);
+
+	theApp.m_Language.UpdateOptionFriendsDetail(this);
 	
 	return TRUE;  // return TRUE unless you set the focus to a control
 	              // EXCEPTION: OCX Property Pages should return FALSE

+ 8 - 7
InternetUpdate.cpp

@@ -67,13 +67,14 @@ BOOL CInternetUpdate::CheckForUpdate(HWND hParent, BOOL bCheckForPrevUpdate, BOO
 	if(m_lUpdateVersion > m_lRunningVersion)
 	{
 		CString csMessage;
-		csMessage.Format(	"Updates available for Ditto.\n"
-							"Visit ditto-cp.sourceforge.net for details\n\n"
-							"Running Version, %s\n"
-							"Update Version, %s\n\n"
-							"Download updated version?",
+		csMessage.Format(	"%s, %s\n"
+							"%s, %s\n\n"
+							"%s",
+							theApp.m_Language.GetString("Updates_Available", "Updates available for Ditto.\nVisit ditto-cp.sourceforge.net for details\n\nRunning Version"),
 							GetVersionString(m_lRunningVersion), 
-							GetVersionString(m_lUpdateVersion));
+							theApp.m_Language.GetString("Update_Version", "Update Version"),
+							GetVersionString(m_lUpdateVersion),
+							theApp.m_Language.GetString("Download_Update", "Download updated version?"));
 
 		if(MessageBox(hParent, csMessage, "Ditto", MB_YESNO) == IDYES)
 		{
@@ -91,7 +92,7 @@ BOOL CInternetUpdate::CheckForUpdate(HWND hParent, BOOL bCheckForPrevUpdate, BOO
 	}
 	else if(m_bShowMessages)
 	{
-		MessageBox(hParent, "No updates available", "Ditto", MB_OK);
+		MessageBox(hParent, theApp.m_Language.GetString("No_Updates", "No updates available"), "Ditto", MB_OK);
 	}
 
 	return bRet;

+ 12 - 0
MainFrm.cpp

@@ -47,6 +47,7 @@ BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
 	ON_MESSAGE(WM_ADD_TO_DATABASE_FROM_SOCKET, OnAddToDatabaseFromSocket)
 	ON_MESSAGE(WM_SEND_RECIEVE_ERROR, OnErrorOnSendRecieve)
 	ON_MESSAGE(WM_FOCUS_CHANGED, OnFocusChanged)
+	ON_MESSAGE(WM_CUSTOMIZE_TRAY_MENU, OnCustomizeTrayMenu)
 END_MESSAGE_MAP()
 
 static UINT indicators[] =
@@ -588,3 +589,14 @@ void CMainFrame::OnFirstHelp()
 	csFile += "Help\\DittoGettingStarted.htm";
 	CHyperLink::GotoURL(csFile, SW_SHOW);
 }
+
+LRESULT CMainFrame::OnCustomizeTrayMenu(WPARAM wParam, LPARAM lParam)
+{
+	CMenu *pMenu = (CMenu*)wParam;
+	if(pMenu)
+	{
+		theApp.m_Language.UpdateTrayIconRightClickMenu(pMenu);
+	}
+
+	return true;
+}

+ 1 - 0
MainFrm.h

@@ -82,6 +82,7 @@ protected:
 	afx_msg LRESULT OnAddToDatabaseFromSocket(WPARAM wParam, LPARAM lParam);
 	afx_msg LRESULT OnErrorOnSendRecieve(WPARAM wParam, LPARAM lParam);
 	afx_msg LRESULT OnFocusChanged(WPARAM wParam, LPARAM lParam);
+	afx_msg LRESULT OnCustomizeTrayMenu(WPARAM wParam, LPARAM lParam);
 	DECLARE_MESSAGE_MAP()
 public:
 	virtual BOOL PreTranslateMessage(MSG* pMsg);

+ 23 - 10
Misc.cpp

@@ -488,6 +488,7 @@ BOOL CGetSetOptions::m_bFindAsYouType;
 BOOL CGetSetOptions::m_bEnsureEntireWindowCanBeSeen;
 BOOL CGetSetOptions::m_bShowAllClipsInMainList;
 long CGetSetOptions::m_lMaxClipSizeInBytes;
+long CGetSetOptions::m_lSaveClipDelay;
 
 CGetSetOptions g_Opt;
 
@@ -521,6 +522,7 @@ CGetSetOptions::CGetSetOptions()
 	m_bEnsureEntireWindowCanBeSeen = GetEnsureEntireWindowCanBeSeen();
 	m_bShowAllClipsInMainList = GetShowAllClipsInMainList();
 	m_lMaxClipSizeInBytes = GetMaxClipSizeInBytes();
+	m_lSaveClipDelay = GetSaveClipDelay();
 
 	GetExtraNetworkPassword(true);
 	
@@ -972,16 +974,6 @@ long CGetSetOptions::GetTotalDate()
 	return GetProfileLong("TotalDate", 0);
 }
 
-void CGetSetOptions::SetCompactAndRepairOnExit(BOOL bVal)
-{
-	SetProfileLong("CompactAndRepairOnExit", bVal);
-}
-
-BOOL CGetSetOptions::GetCompactAndRepairOnExit()
-{
-	return GetProfileLong("CompactAndRepairOnExit", 0);
-}
-
 // the implementations for the following functions were moved out-of-line.
 // when they were declared inline, the compiler failed to notice when
 //  these functions were changed (the linker used an old compiled version)
@@ -1355,6 +1347,27 @@ void CGetSetOptions::SetMaxClipSizeInBytes(long lSize)
 	SetProfileLong("MaxClipSizeInBytes", lSize);
 }
 
+CString CGetSetOptions::GetLanguageFile()
+{
+	return GetProfileString("LanguageFile", "");
+}
+
+void CGetSetOptions::SetLanguageFile(CString csLanguage)
+{
+	SetProfileString("LanguageFile", csLanguage);
+}
+
+long CGetSetOptions::GetSaveClipDelay()
+{
+	return GetProfileLong("SaveClipDelay", 500);
+}
+
+void CGetSetOptions::SetSaveClipDelay(long lDelay)
+{
+	m_lSaveClipDelay = lDelay;
+	SetProfileLong("SaveClipDelay", lDelay);
+}
+
 /*------------------------------------------------------------------*\
 CHotKey - a single system-wide hotkey
 \*------------------------------------------------------------------*/

+ 8 - 3
Misc.h

@@ -103,6 +103,7 @@ CString GetFilePath(CString csFullPath);
 #define WM_SEND_RECIEVE_ERROR	WM_USER + 208
 #define WM_FOCUS_CHANGED		WM_USER + 209
 #define WM_CV_GETCONNECT		WM_USER + 210
+//defined in tray icon #define WM_CUSTOMIZE_TRAY_MENU	WM_USER + 211
 
 
 #define REG_PATH					"Software\\Ditto"
@@ -179,9 +180,6 @@ public:
 	static void SetCheckForExpiredEntries(BOOL bVal);
 	static BOOL GetCheckForExpiredEntries();
 
-	static void SetCompactAndRepairOnExit(BOOL bVal);
-	static BOOL GetCompactAndRepairOnExit();
-
 	static void SetMaxEntries(long lVal);
 	static long GetMaxEntries();
 
@@ -351,6 +349,13 @@ public:
 	static long		GetMaxClipSizeInBytes();
 	static void		SetMaxClipSizeInBytes(long lSize);
 
+	static CString	GetLanguageFile();
+	static void		SetLanguageFile(CString csLanguage);
+
+	static long		m_lSaveClipDelay;
+	static long		GetSaveClipDelay();
+	static void		SetSaveClipDelay(long lDelay);
+
 	static CStringArray m_csNetworkPasswordArray;
 
 	/*

+ 2 - 0
MoveToGroupDlg.cpp

@@ -54,6 +54,8 @@ BOOL CMoveToGroupDlg::OnInitDialog()
 	m_Tree.m_lSelectedFolderID = m_nSelectedGroup;
 	m_Tree.SetNotificationWndEx(m_hWnd);
 	m_Tree.FillTree();
+
+	theApp.m_Language.UpdateMoveToGroups(this);
 	
 	return TRUE;  // return TRUE unless you set the focus to a control
 	              // EXCEPTION: OCX Property Pages should return FALSE

+ 6 - 0
OptionFriends.cpp

@@ -21,6 +21,10 @@ IMPLEMENT_DYNCREATE(COptionFriends, CPropertyPage)
 
 COptionFriends::COptionFriends() : CPropertyPage(COptionFriends::IDD)
 {
+	m_csTitle = theApp.m_Language.GetString("FriendsTitle", "Friends");
+	m_psp.pszTitle = m_csTitle;
+	m_psp.dwFlags |= PSP_USETITLE; 
+
 	//{{AFX_DATA_INIT(COptionFriends)
 	m_PlaceOnClipboard = _T("");
 	m_csPassword = _T("");
@@ -77,6 +81,8 @@ BOOL COptionFriends::OnInitDialog()
 	m_csAdditionalPasswords = CGetSetOptions::GetExtraNetworkPassword(false);
 
 	UpdateData(FALSE);
+
+	theApp.m_Language.UpdateOptionFriends(this);
 		
 	return FALSE;
 }

+ 1 - 0
OptionFriends.h

@@ -47,6 +47,7 @@ protected:
 	void InsertItems();
 	BOOL EditItem(int nItem);
 
+	CString m_csTitle;
 	COptionsSheet *m_pParent;
 	
 	// Generated message map functions

+ 52 - 6
OptionsGeneral.cpp

@@ -21,6 +21,10 @@ IMPLEMENT_DYNCREATE(COptionsGeneral, CPropertyPage)
 
 COptionsGeneral::COptionsGeneral() : CPropertyPage(COptionsGeneral::IDD)
 {
+	m_csTitle = theApp.m_Language.GetString("GeneralTitle", "General");
+	m_psp.pszTitle = m_csTitle;
+	m_psp.dwFlags |= PSP_USETITLE; 
+
 	//{{AFX_DATA_INIT(COptionsGeneral)
 	m_csPlaySound = _T("");
 	//}}AFX_DATA_INIT
@@ -34,6 +38,8 @@ void COptionsGeneral::DoDataExchange(CDataExchange* pDX)
 {
 	CPropertyPage::DoDataExchange(pDX);
 	//{{AFX_DATA_MAP(COptionsGeneral)
+	DDX_Control(pDX, IDC_EDIT_SAVE_DELAY, m_SaveDelay);
+	DDX_Control(pDX, IDC_COMBO_LANGUAGE, m_cbLanguage);
 	DDX_Control(pDX, IDC_EDIT_MAX_SIZE, m_MaxClipSize);
 	DDX_Control(pDX, IDC_SEND_PASTE_MESSAGE, m_btSendPasteMessage);
 	DDX_Control(pDX, IDC_HIDE_DITO_ON_HOT_KEY, m_btHideDittoOnHotKey);
@@ -42,7 +48,6 @@ void COptionsGeneral::DoDataExchange(CDataExchange* pDX)
 	DDX_Control(pDX, IDC_PATH, m_ePath);
 	DDX_Control(pDX, IDC_SET_DB_PATH, m_btSetDatabasePath);
 	DDX_Control(pDX, IDC_CHECK_UPDATES, m_btCheckForUpdates);
-	DDX_Control(pDX, IDC_COMPACT_REPAIR, m_btCompactAndRepair);
 	DDX_Control(pDX, IDC_EXPIRE_AFTER, m_eExpireAfter);
 	DDX_Control(pDX, IDC_MAX_SAVED_COPIES, m_eMaxSavedCopies);
 	DDX_Control(pDX, IDC_MAXIMUM, m_btMaximumCheck);
@@ -81,12 +86,12 @@ BOOL COptionsGeneral::OnInitDialog()
 	m_btShowIconInSysTray.SetCheck(CGetSetOptions::GetShowIconInSysTray());
 	m_btMaximumCheck.SetCheck(CGetSetOptions::GetCheckForMaxEntries());
 	m_btExpire.SetCheck(CGetSetOptions::GetCheckForExpiredEntries());
-	m_btCompactAndRepair.SetCheck(CGetSetOptions::GetCompactAndRepairOnExit());
 	m_btCheckForUpdates.SetCheck(CGetSetOptions::GetCheckForUpdates());
 	
 	m_eExpireAfter.SetNumber(CGetSetOptions::GetExpiredEntries());
 	m_eMaxSavedCopies.SetNumber(CGetSetOptions::GetMaxEntries());
 	m_DescTextSize.SetNumber(g_Opt.m_bDescTextSize);
+	m_SaveDelay.SetNumber(g_Opt.m_lSaveClipDelay);
 
 	m_btAllowDuplicates.SetCheck( g_Opt.m_bAllowDuplicates );
 	m_btUpdateTimeOnPaste.SetCheck( g_Opt.m_bUpdateTimeOnPaste );
@@ -117,11 +122,35 @@ BOOL COptionsGeneral::OnInitDialog()
 
 	m_csPlaySound = g_Opt.m_csPlaySoundOnCopy;
 
+	FillLanguages();
+
 	UpdateData(FALSE);
 
+	theApp.m_Language.UpdateOptionGeneral(this);
 	return TRUE;
 }
 
+void COptionsGeneral::FillLanguages()
+{
+	CString csFile = CGetSetOptions::GetExeFileName();
+	csFile = GetFilePath(csFile);
+	csFile += "language\\*.xml";
+
+	CString csLanguage = CGetSetOptions::GetLanguageFile();
+
+	CFileFind find;
+	BOOL bCont = find.FindFile(csFile);
+
+	while(bCont)
+	{
+		bCont = find.FindNextFile();
+		int nIndex = m_cbLanguage.AddString(find.GetFileTitle());
+
+		if(find.GetFileTitle() == csLanguage)
+			m_cbLanguage.SetCurSel(nIndex);
+	}
+}
+
 BOOL COptionsGeneral::OnApply()
 {
 	UpdateData();
@@ -132,7 +161,6 @@ BOOL COptionsGeneral::OnApply()
 	CGetSetOptions::SetRunOnStartUp(m_btRunOnStartup.GetCheck());
 	CGetSetOptions::SetCheckForMaxEntries(m_btMaximumCheck.GetCheck());
 	CGetSetOptions::SetCheckForExpiredEntries(m_btExpire.GetCheck());
-	CGetSetOptions::SetCompactAndRepairOnExit(m_btCompactAndRepair.GetCheck());
 	CGetSetOptions::SetCheckForUpdates(m_btCheckForUpdates.GetCheck());
 	CGetSetOptions::SetHideDittoOnHotKeyIfAlreadyShown(m_btHideDittoOnHotKey.GetCheck());
 	CGetSetOptions::SetSendPasteAfterSelection(m_btSendPasteMessage.GetCheck());
@@ -140,12 +168,25 @@ BOOL COptionsGeneral::OnApply()
 	CGetSetOptions::SetMaxEntries(m_eMaxSavedCopies.GetNumber());
 	CGetSetOptions::SetExpiredEntries(m_eExpireAfter.GetNumber());
 	CGetSetOptions::SetDescTextSize(m_DescTextSize.GetNumber());
+	CGetSetOptions::SetSaveClipDelay(m_SaveDelay.GetNumber());
 
 	CGetSetOptions::SetPlaySoundOnCopy(m_csPlaySound);
 
-	g_Opt.SetAllowDuplicates( m_btAllowDuplicates.GetCheck() );
-	g_Opt.SetUpdateTimeOnPaste( m_btUpdateTimeOnPaste.GetCheck() );
-	g_Opt.SetSaveMultiPaste( m_btSaveMultiPaste.GetCheck() );
+	g_Opt.SetAllowDuplicates(m_btAllowDuplicates.GetCheck());
+	g_Opt.SetUpdateTimeOnPaste(m_btUpdateTimeOnPaste.GetCheck());
+	g_Opt.SetSaveMultiPaste(m_btSaveMultiPaste.GetCheck());
+
+	CString csLanguage;
+	m_cbLanguage.GetLBText(m_cbLanguage.GetCurSel(), csLanguage);
+	g_Opt.SetLanguageFile(csLanguage);
+	
+	if(!theApp.m_Language.LoadLanguageFile(csLanguage))
+	{
+		CString cs;
+		cs.Format("Error loading language file - %s - \n\n%s", csLanguage, theApp.m_Language.m_csLastError);
+
+		MessageBox(cs, "Ditto", MB_OK);
+	}
 
 	CString csMax;
 	m_MaxClipSize.GetWindowText(csMax);
@@ -209,7 +250,12 @@ BOOL COptionsGeneral::OnSetActive()
 }
 void COptionsGeneral::OnBtCompactAndRepair() 
 {
+	CWaitCursor wait;
+
 	CompactDatabase();
+
+	UpdateWindow();
+	
 	RepairDatabase();
 }
 

+ 7 - 1
OptionsGeneral.h

@@ -27,6 +27,8 @@ public:
 // Dialog Data
 	//{{AFX_DATA(COptionsGeneral)
 	enum { IDD = IDD_OPTIONS_GENERAL };
+	CNumberEdit	m_SaveDelay;
+	CComboBox	m_cbLanguage;
 	CEdit	m_MaxClipSize;
 	CButton	m_btSendPasteMessage;
 	CButton	m_btHideDittoOnHotKey;
@@ -35,7 +37,6 @@ public:
 	CEdit	m_ePath;
 	CButton	m_btSetDatabasePath;
 	CButton	m_btCheckForUpdates;
-	CButton	m_btCompactAndRepair;
 	CNumberEdit	m_eExpireAfter;
 	CNumberEdit	m_eMaxSavedCopies;
 	CButton	m_btMaximumCheck;
@@ -64,6 +65,11 @@ protected:
 	
 	COptionsSheet *m_pParent;
 
+	CString m_csTitle;
+	CSetPropertyPageTitle m_SetTitle;
+
+	void FillLanguages();
+
 	// Generated message map functions
 	//{{AFX_MSG(COptionsGeneral)
 	virtual BOOL OnInitDialog();

+ 6 - 0
OptionsKeyBoard.cpp

@@ -18,6 +18,10 @@ IMPLEMENT_DYNCREATE(COptionsKeyBoard, CPropertyPage)
 
 COptionsKeyBoard::COptionsKeyBoard() : CPropertyPage(COptionsKeyBoard::IDD)
 {
+	m_csTitle = theApp.m_Language.GetString("KeyboardShortcutsTitle", "Keyboard Shortcuts");
+	m_psp.pszTitle = m_csTitle;
+	m_psp.dwFlags |= PSP_USETITLE;
+	
 	//{{AFX_DATA_INIT(COptionsKeyBoard)
 	//}}AFX_DATA_INIT
 }
@@ -81,6 +85,8 @@ BOOL COptionsKeyBoard::OnInitDialog()
 
 	m_HotKey.SetFocus();
 
+	theApp.m_Language.UpdateOptionShortcuts(this);
+
 	return FALSE;
 }
 

+ 1 - 0
OptionsKeyBoard.h

@@ -59,6 +59,7 @@ protected:
 //	BOOL ValidateHotKey(WORD wHotKey);
 
 	COptionsSheet *m_pParent;
+	CString m_csTitle;
 
 	// Generated message map functions
 	//{{AFX_MSG(COptionsKeyBoard)

+ 6 - 0
OptionsQuickPaste.cpp

@@ -18,6 +18,10 @@ IMPLEMENT_DYNCREATE(COptionsQuickPaste, CPropertyPage)
 
 COptionsQuickPaste::COptionsQuickPaste() : CPropertyPage(COptionsQuickPaste::IDD)
 {
+	m_csTitle = theApp.m_Language.GetString("QuickPasteTitle", "Quick Paste");
+	m_psp.pszTitle = m_csTitle;
+	m_psp.dwFlags |= PSP_USETITLE; 
+
 	//{{AFX_DATA_INIT(COptionsQuickPaste)
 		// NOTE: the ClassWizard will add member initialization here
 	//}}AFX_DATA_INIT
@@ -107,6 +111,8 @@ BOOL COptionsQuickPaste::OnInitDialog()
 	CString cs;
 	cs.Format("Font - %s", m_LogFont.lfFaceName);
 	m_btFont.SetWindowText(cs);
+
+	theApp.m_Language.UpdateOptionQuickPaste(this);
 		
 	return FALSE;
 }

+ 1 - 0
OptionsQuickPaste.h

@@ -55,6 +55,7 @@ protected:
 
 	CFont m_Font;
 	LOGFONT m_LogFont;
+	CString m_csTitle;
 
 
 // Implementation

+ 2 - 0
OptionsSheet.cpp

@@ -89,6 +89,8 @@ BOOL COptionsSheet::OnInitDialog()
 	SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
 
 	SetWindowText("Ditto");
+
+	theApp.m_Language.UpdateOptionsSheet(this);
 	
 	return bResult;
 }

+ 28 - 0
OptionsSheet.h

@@ -10,6 +10,34 @@
 /////////////////////////////////////////////////////////////////////////////
 // COptionsSheet
 
+class CSetPropertyPageTitle
+{
+public:
+	CSetPropertyPageTitle()
+	{
+		
+	}
+	~CSetPropertyPageTitle()
+	{
+		
+	}
+
+	void SetTitle(CString csKey, CString csDefault, AFX_OLDPROPSHEETPAGE &psp)
+	{
+		CString csText = theApp.m_Language.GetString(csKey, csDefault);
+		if(csText.GetLength() > 0)
+		{
+			pTitle = new char(csText.GetLength());
+			strcpy(pTitle, csText);
+
+			psp.pszTitle = pTitle;
+			psp.dwFlags |= PSP_USETITLE; 
+		}
+	}
+
+	char *pTitle;
+};
+
 class COptionsSheet : public CPropertySheet
 {
 	DECLARE_DYNAMIC(COptionsSheet)

+ 7 - 1
OptionsStats.cpp

@@ -22,6 +22,10 @@ IMPLEMENT_DYNCREATE(COptionsStats, CPropertyPage)
 COptionsStats::COptionsStats()
 	: CPropertyPage(COptionsStats::IDD)
 {
+	m_csTitle = theApp.m_Language.GetString("StatsTitle", "Stats");
+	m_psp.pszTitle = m_csTitle;
+	m_psp.dwFlags |= PSP_USETITLE; 
+
 	//{{AFX_DATA_INIT(COptionsStats)
 	m_eAllCopies = _T("");
 	m_eAllPastes = _T("");
@@ -120,6 +124,8 @@ BOOL COptionsStats::OnInitDialog()
 		m_eDatabaseSize.Format("%d KB", (buf.st_size/1024));
 
 	UpdateData(FALSE);
+
+	theApp.m_Language.UpdateOptionStats(this);
 		
 	return TRUE;
 }
@@ -139,7 +145,7 @@ void COptionsStats::OnResetCounts()
 
 void COptionsStats::OnRemoveAll() 
 {
-	if(MessageBox("This will remove all Copy Entries!\n\nContinue?", "Warning", MB_YESNO) == IDYES)
+	if(MessageBox(theApp.m_Language.GetString("Remove_All", "This will remove all Copy Entries!\n\nContinue?"), "Warning", MB_YESNO) == IDYES)
 	{
 		if( DeleteAllIDs() )
 		{

+ 2 - 0
OptionsStats.h

@@ -46,6 +46,8 @@ public:
 // Implementation
 protected:
 
+	CString m_csTitle;
+
 	// Generated message map functions
 	//{{AFX_MSG(COptionsStats)
 	virtual BOOL OnInitDialog();

+ 7 - 0
OptionsTypes.cpp

@@ -19,6 +19,10 @@ IMPLEMENT_DYNCREATE(COptionsTypes, CPropertyPage)
 
 COptionsTypes::COptionsTypes() : CPropertyPage(COptionsTypes::IDD)
 {
+	m_csTitle = theApp.m_Language.GetString("SupportedTypesTitle", "Supported Types");
+	m_psp.pszTitle = m_csTitle;
+	m_psp.dwFlags |= PSP_USETITLE; 
+
 	//{{AFX_DATA_INIT(COptionsTypes)
 	//}}AFX_DATA_INIT
 
@@ -101,6 +105,9 @@ BOOL COptionsTypes::OnInitDialog()
 	CATCHDAO
 	
 	m_List.SetFocus();
+
+	theApp.m_Language.UpdateOptionSupportedTypes(this);
+	
 	return FALSE;
 }
 

+ 1 - 0
OptionsTypes.h

@@ -38,6 +38,7 @@ public:
 // Implementation
 protected:
 	bool m_bSave;
+	CString m_csTitle;
 	BOOL TextAllReadyThere(const CString &cs);
 
 

+ 13 - 4
ProcessCopy.cpp

@@ -1047,11 +1047,20 @@ void CClipboardViewer::OnDrawClipboard()
 		return;
 	}
 	
-	// don't process the event when we first attach
-	if( m_pHandler && !m_bCalling_SetClipboardViewer )
+	if((GetTickCount() - m_lLastCopy) > g_Opt.m_lSaveClipDelay)
 	{
-		if( !::IsClipboardFormatAvailable( theApp.m_cfIgnoreClipboard ) )
-			m_pHandler->OnClipboardChange();
+		// don't process the event when we first attach
+		if( m_pHandler && !m_bCalling_SetClipboardViewer )
+		{
+			if( !::IsClipboardFormatAvailable( theApp.m_cfIgnoreClipboard ) )
+				m_pHandler->OnClipboardChange();
+		}
+	}
+	else
+	{
+		CString cs;
+		cs.Format("Clip copy to fast difference from last copy = %d", (GetTickCount() - m_lLastCopy));
+		Log(cs);
 	}
 	
 	// pass the event to the next Clipboard viewer in the chain

+ 1 - 0
ProcessCopy.h

@@ -171,6 +171,7 @@ public:
 	bool GetConnect() { return m_bConnect; }
 	void SetConnect( bool bConnect );
 
+	long m_lLastCopy;
 // Generated message map functions
 protected:
 	//{{AFX_MSG(CMainFrame)

+ 2 - 0
QPasteWnd.cpp

@@ -799,6 +799,8 @@ void CQPasteWnd::OnRclickQuickPaste(NMHDR* pNMHDR, LRESULT* pResult)
 			pp.y = rc.bottom;
 		}
 		
+		theApp.m_Language.UpdateRightClickMenu(cmSubMenu);
+
 		cmSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,
 			pp.x, pp.y, this, NULL);
 	}

+ 35 - 1
Resource.h

@@ -149,13 +149,47 @@
 #define IDC_CHECK_SHOW_ALL_IN_MAIN_LIST 2038
 #define IDC_EDIT_MAX_SIZE               2038
 #define IDC_CHECK_WIN8                  2039
+#define IDC_STATIC_HOT_KEY              2039
 #define IDC_CHECK_WIN9                  2040
+#define IDC_STATIC_DATE                 2040
 #define IDC_CHECK_WIN10                 2041
+#define IDC_STATIC_MOVE_TO_GROUP        2041
 #define IDC_CHECK_WIN1                  2042
+#define IDC_STATIC_TITLE                2042
 #define IDC_CHECK_WIN2                  2043
+#define IDC_STATIC_DAYS                 2043
 #define IDC_CHECK_WIN3                  2044
+#define IDC_STATIC_AMOUNT               2044
 #define IDC_CHECK_WIN4                  2045
+#define IDC_STATIC_SOUND                2045
 #define IDC_CHECK_WIN5                  2046
+#define IDC_STATIC_MAX_SIZE             2046
+#define IDC_STATIC_NO_LIMIT             2047
+#define IDC_STATIC_ACTIVATE             2048
+#define IDC_STATIC_NAMED_COPY           2049
+#define IDC_STATIC_WIN                  2050
+#define IDC_STATIC_GROUP                2051
+#define IDC_STATIC_1                    2052
+#define IDC_STATIC_2                    2053
+#define IDC_STATIC_3                    2054
+#define IDC_STATIC_4                    2055
+#define IDC_STATIC_5                    2056
+#define IDC_STATIC_6                    2057
+#define IDC_STATIC_7                    2058
+#define IDC_STATIC_8                    2059
+#define IDC_STATIC_9                    2060
+#define IDC_STATIC_10                   2061
+#define IDC_STATIC_LINES                2062
+#define IDC_STATIC_POPUP                2063
+#define IDC_STATIC_LEGEND               2064
+#define IDC_STATIC_LEG                  2065
+#define IDC_STATIC_11                   2066
+#define IDC_STATIC_12                   2067
+#define IDC_STATIC_13                   2068
+#define IDC_STATIC_LANGUAGE             2069
+#define IDC_COMBO_LANGUAGE              2070
+#define IDC_EDIT_SAVE_DELAY             2071
+#define IDC_STATIC_SAVE_DELAY           2072
 #define ID_FIRST_OPTION                 32771
 #define ID_FIRST_EXIT                   32772
 #define ID_FIRST_SHOWQUICKPASTE         32773
@@ -241,7 +275,7 @@
 #define _APS_3D_CONTROLS                     1
 #define _APS_NEXT_RESOURCE_VALUE        157
 #define _APS_NEXT_COMMAND_VALUE         32852
-#define _APS_NEXT_CONTROL_VALUE         2039
+#define _APS_NEXT_CONTROL_VALUE         2073
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif

+ 3 - 0
SystemTray.cpp

@@ -856,6 +856,9 @@ LRESULT CSystemTray::OnTrayNotification(UINT wParam, LONG lParam)
         pTargetWnd->SetForegroundWindow(); 
         
 #ifndef _WIN32_WCE
+
+		pTargetWnd->SendMessage(WM_CUSTOMIZE_TRAY_MENU, (WPARAM)pSubMenu, 0);
+
         ::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0, 
                          pTargetWnd->GetSafeHwnd(), NULL);
 #else

+ 2 - 0
SystemTray.h

@@ -41,6 +41,8 @@
 #define NIIF_NONE 0
 #endif
 
+#define WM_CUSTOMIZE_TRAY_MENU	WM_USER + 211
+
 // #include <afxwin.h>
 #include <afxtempl.h>
 #include <afxdisp.h>    // COleDateTime