summaryrefslogtreecommitdiff
path: root/miranda-wine/src/modules/langpack/lpservices.c
blob: 4ebe764ba445743bb46184bc7bb4e6043b8c548e (plain)
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
/*

Miranda IM: the free IM client for Microsoft* Windows*

Copyright 2000-2006 Miranda ICQ/IM project, 
all portions of this codebase are copyrighted to the people 
listed in contributors.txt.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/
#include "commonheaders.h"

#if defined( _UNICODE )
	#define FLAGS LANG_UNICODE
#else
	#define FLAGS 0
#endif

static int TranslateString(WPARAM wParam,LPARAM lParam)
{
	return (int)LangPackTranslateString((const char *)lParam, (wParam & LANG_UNICODE) ? 1 : 0);
}

static int TranslateMenu(WPARAM wParam,LPARAM lParam)
{
	HMENU        hMenu = ( HMENU )wParam;
	int          i;
	MENUITEMINFO mii;
	TCHAR        str[256];

	mii.cbSize = MENUITEMINFO_V4_SIZE;
	for ( i = GetMenuItemCount( hMenu )-1; i >= 0; i--) {
		mii.fMask = MIIM_TYPE|MIIM_SUBMENU;
		mii.dwTypeData = ( TCHAR* )str;
		mii.cch = SIZEOF(str);
		GetMenuItemInfo(hMenu, i, TRUE, &mii);

		if ( mii.cch && mii.dwTypeData ) {
			TCHAR* result = ( TCHAR* )LangPackTranslateString(( const char* )mii.dwTypeData, FLAGS );
			if ( result != mii.dwTypeData ) {
				mii.dwTypeData = result;
				mii.fMask = MIIM_TYPE;
				SetMenuItemInfo( hMenu, i, TRUE, &mii );
		}	}

		if ( mii.hSubMenu != NULL ) TranslateMenu(( WPARAM )mii.hSubMenu, lParam);
	}
	return 0;
}

static void TranslateWindow( HWND hwnd, int flags )
{
	TCHAR title[2048];
	GetWindowText(hwnd, title, SIZEOF( title ));
	{
		TCHAR* result = ( TCHAR* )LangPackTranslateString(( const char* )title, FLAGS );
		if ( result != title )
			SetWindowText(hwnd, result );
}	}

static BOOL CALLBACK TranslateDialogEnumProc(HWND hwnd,LPARAM lParam)
{
	LANGPACKTRANSLATEDIALOG *lptd=(LANGPACKTRANSLATEDIALOG*)lParam;
	TCHAR szClass[32];
	int i,id = GetDlgCtrlID( hwnd );

	if(lptd->ignoreControls != NULL)
		for(i=0;lptd->ignoreControls[i];i++) if(lptd->ignoreControls[i]==id) return TRUE;

	GetClassName(hwnd,szClass,SIZEOF(szClass));
	if(!lstrcmpi(szClass,_T("static")) || !lstrcmpi(szClass,_T("hyperlink")) || !lstrcmpi(szClass,_T("button")) || !lstrcmpi(szClass,_T("MButtonClass")))
		TranslateWindow(hwnd, lptd->flags);
	else if(!lstrcmpi(szClass,_T("edit"))) {
		if(lptd->flags&LPTDF_NOIGNOREEDIT || GetWindowLong(hwnd,GWL_STYLE)&ES_READONLY)
			TranslateWindow(hwnd, lptd->flags);
	}
	return TRUE;
}

static int TranslateDialog(WPARAM wParam,LPARAM lParam)
{
	LANGPACKTRANSLATEDIALOG *lptd=(LANGPACKTRANSLATEDIALOG*)lParam;
	if(lptd==NULL||lptd->cbSize!=sizeof(LANGPACKTRANSLATEDIALOG)) return 1;
	if(!(lptd->flags&LPTDF_NOTITLE))
		TranslateWindow( lptd->hwndDlg, wParam );

	EnumChildWindows(lptd->hwndDlg,TranslateDialogEnumProc,lParam);
	return 0;
}

static int GetDefaultCodePage(WPARAM wParam,LPARAM lParam)
{
	return LangPackGetDefaultCodePage();
}

static int GetDefaultLocale(WPARAM wParam,LPARAM lParam)
{
	return LangPackGetDefaultLocale();
}

static int PcharToTchar(WPARAM wParam,LPARAM lParam)
{
	return ( int )LangPackPcharToTchar((char*)lParam );
}

int LoadLangPackServices(void)
{
	CreateServiceFunction(MS_LANGPACK_TRANSLATESTRING,TranslateString);
	CreateServiceFunction(MS_LANGPACK_TRANSLATEMENU,TranslateMenu);
	CreateServiceFunction(MS_LANGPACK_TRANSLATEDIALOG,TranslateDialog);
	CreateServiceFunction(MS_LANGPACK_GETCODEPAGE,GetDefaultCodePage);
	CreateServiceFunction(MS_LANGPACK_GETLOCALE,GetDefaultLocale);
	CreateServiceFunction(MS_LANGPACK_PCHARTOTCHAR,PcharToTchar);
	return 0;
}