[localization] autogenerated control and dialog tables

* Also more translations
This commit is contained in:
Pete Batard 2013-06-28 14:09:26 +01:00
parent 9426be0bc1
commit 7636342cf3
12 changed files with 302 additions and 99 deletions

View File

@ -55,7 +55,37 @@ m IDC_LOG -5 0
r IDC_LOG +5 0
t IDCANCEL "关闭"
t IDC_START "开始"
t IDC_ADVANCED_GROUP "高级选项"
t IDC_ENABLE_FIXED_DISKS "列表固定(非flash)或USB磁盘分区"
t IDC_EXTRA_PARTITION "添加修复旧的BIOS额外的分区校准等等"
t IDC_RUFUS_MBR "使用 Rufus MBR BIOS ID:"
# TODO: dialog title
t IDD_DIALOG "Does this work?"
p IDD_ABOUTBOX
t IDC_ABOUT_LICENSE "许可证"
t IDC_ABOUT_UPDATES "更新"
t IDOK "确定"
t IDD_ABOUTBOX "关于"
p IDD_LOG
t IDC_LOG_CLEAR "清除日志"
t IDC_LOG_SAVE "保存日志"
t IDCANCEL "关闭日志"
p IDD_LICENSE
t IDOK "取消"
p IDD_UPDATE_POLICY
t IDS_UPDATE_SETTINGS_TXT "设置"
t IDS_UPDATE_FREQUENCY_TXT "检查更新:"
t IDS_INCLUDE_BETAS_TXT "包括测试版本:"
t IDC_CHECK_NOW "立即检查"
t IDCANCEL "取消"
p IDD_NEW_VERSION
t IDS_NEW_VERSION_AVAIL_TXT "更新的版本可用。请下载最新版本!"
t IDC_WEBSITE "<a href="http://rufus.akeo.ie">点击这里进入网站</a>"
t IDS_NEW_VERSION_NOTES_TXT "发行说明"
t IDS_NEW_VERSION_DOWNLOAD_TXT "下载"
t IDC_DOWNLOAD "下载"

View File

@ -187,6 +187,7 @@
<ClInclude Include="..\libcdio\cdio\logging.h" />
<ClInclude Include="..\libcdio\cdio\udf.h" />
<ClInclude Include="..\localization.h" />
<ClInclude Include="..\localization_data.h" />
<ClInclude Include="..\msapi_utf8.h" />
<ClInclude Include="..\dos.h" />
<ClInclude Include="..\registry.h" />

View File

@ -107,6 +107,9 @@
<ClInclude Include="..\localization.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\localization_data.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\res\rufus.ico">

View File

@ -33,59 +33,7 @@
#include "resource.h"
#include "msapi_utf8.h"
#include "localization.h"
#define LOC_CTRL(x) { #x, x }
// TODO: move this to an autogenerated file
const loc_control_id control_id[] = {
// The dialog IDs must come first
LOC_CTRL(IDD_DIALOG),
LOC_CTRL(IDD_ABOUTBOX),
LOC_CTRL(IDD_NOTIFICATION),
LOC_CTRL(IDD_LICENSE),
LOC_CTRL(IDD_ISO_EXTRACT),
LOC_CTRL(IDD_LOG),
LOC_CTRL(IDD_UPDATE_POLICY),
LOC_CTRL(IDD_NEW_VERSION),
LOC_CTRL(IDOK),
LOC_CTRL(IDCANCEL),
LOC_CTRL(IDS_DEVICE_TXT),
LOC_CTRL(IDS_PARTITION_TYPE_TXT),
LOC_CTRL(IDS_FILESYSTEM_TXT),
LOC_CTRL(IDS_CLUSTERSIZE_TXT),
LOC_CTRL(IDS_LABEL_TXT),
LOC_CTRL(IDS_FORMATOPTIONS_TXT),
LOC_CTRL(IDC_ADVANCED_GROUP),
LOC_CTRL(IDC_BADBLOCKS),
LOC_CTRL(IDC_QUICKFORMAT),
LOC_CTRL(IDC_BOOT),
LOC_CTRL(IDC_SET_ICON),
LOC_CTRL(IDC_ADVANCED),
LOC_CTRL(IDC_NBPASSES),
LOC_CTRL(IDC_BOOTTYPE),
LOC_CTRL(IDC_SELECT_ISO),
LOC_CTRL(IDC_ABOUT),
LOC_CTRL(IDC_LOG),
LOC_CTRL(IDC_START),
LOC_CTRL(IDC_ABOUT_LICENSE),
LOC_CTRL(IDC_ABOUT_UPDATES),
};
// Have a root loc_cmd that points to parent loc_cmd
// MUST be in the same order as in resource.h, and with IDs in
// consecutive order with no gap, as we'll use IDD_XYZ = IDD_DIALOG to
// locate our index in dialog_active
#define LOC_DLG_LST(x) { x, NULL, {NULL, NULL} }
loc_dlg_list loc_dlg[IDD_NEW_VERSION - IDD_DIALOG + 1] = {
LOC_DLG_LST(IDD_DIALOG),
LOC_DLG_LST(IDD_ABOUTBOX),
LOC_DLG_LST(IDD_NOTIFICATION),
LOC_DLG_LST(IDD_LICENSE),
LOC_DLG_LST(IDD_ISO_EXTRACT),
LOC_DLG_LST(IDD_LOG),
LOC_DLG_LST(IDD_UPDATE_POLICY),
LOC_DLG_LST(IDD_NEW_VERSION),
};
#include "localization_data.h"
/* c control ID (no space, no quotes), s: quoted string, i: 32 bit signed integer, */
loc_parse parse_cmd[] = {
@ -155,45 +103,58 @@ void apply_localization(int dlg_id, HWND hDlg)
{
loc_cmd* lcmd;
HWND hCtrl = NULL;
if (hDlg != NULL) {
loc_dlg[dlg_id-IDD_DIALOG].hDlg = hDlg;
} else {
hDlg = loc_dlg[dlg_id-IDD_DIALOG].hDlg;
}
if (!IsWindow(hDlg))
return; // Not an active dialog
if (list_empty(&loc_dlg[dlg_id-IDD_DIALOG].list))
return; // Empty list
int id_start = IDD_DIALOG, id_end = IDD_DIALOG + ARRAYSIZE(loc_dlg);
list_for_each_entry(lcmd, &loc_dlg[dlg_id-IDD_DIALOG].list, list, loc_cmd) {
if (lcmd->command <= LC_TEXT) { // TODO: should always be the case
hCtrl = GetDlgItem(hDlg, lcmd->ctrl_id);
if (hCtrl == NULL) {
// TODO: store the line nr in command so that we can print a better error?
// Would also avoid global in dispatch
loc_line_nr = lcmd->line_nr;
luprintf("control '%s' is not part of dialog '%s'\n",
lcmd->text[0], control_id[dlg_id-IDD_DIALOG].name);
}
if ((dlg_id >= id_start) && (dlg_id < id_end)) {
// If we have a valid dialog_id, just process that one dialog
id_start = dlg_id;
id_end = dlg_id + 1;
if (hDlg != NULL) {
loc_dlg[dlg_id-IDD_DIALOG].hDlg = hDlg;
}
}
switch(lcmd->command) {
// NB: For commands that take an ID, ctrl_id is always a valid index at this stage
case LC_TEXT:
if (hCtrl != NULL) {
SetWindowTextU(hCtrl, lcmd->text[1]);
for (dlg_id = id_start; dlg_id < id_end; dlg_id++) {
hDlg = loc_dlg[dlg_id-IDD_DIALOG].hDlg;
if ((!IsWindow(hDlg)) || (list_empty(&loc_dlg[dlg_id-IDD_DIALOG].list)))
continue;
list_for_each_entry(lcmd, &loc_dlg[dlg_id-IDD_DIALOG].list, list, loc_cmd) {
if (lcmd->command <= LC_TEXT) { // TODO: should always be the case
if (lcmd->ctrl_id == dlg_id) {
if (dlg_id == IDD_DIALOG) {
luprint("changing the title of the main dialog is not allowed");
continue;
}
hCtrl = hDlg;
} else {
hCtrl = GetDlgItem(hDlg, lcmd->ctrl_id);
}
if (hCtrl == NULL) {
loc_line_nr = lcmd->line_nr;
luprintf("control '%s' is not part of dialog '%s'\n",
lcmd->text[0], control_id[dlg_id-IDD_DIALOG].name);
}
}
break;
case LC_MOVE:
if (hCtrl != NULL) {
ResizeMoveCtrl(hDlg, hCtrl, lcmd->num[0], lcmd->num[1], 0, 0);
switch(lcmd->command) {
// NB: For commands that take an ID, ctrl_id is always a valid index at this stage
case LC_TEXT:
if (hCtrl != NULL) {
SetWindowTextU(hCtrl, lcmd->text[1]);
}
break;
case LC_MOVE:
if (hCtrl != NULL) {
ResizeMoveCtrl(hDlg, hCtrl, lcmd->num[0], lcmd->num[1], 0, 0);
}
break;
case LC_RESIZE:
if (hCtrl != NULL) {
ResizeMoveCtrl(hDlg, hCtrl, 0, 0, lcmd->num[0], lcmd->num[1]);
}
break;
}
break;
case LC_RESIZE:
if (hCtrl != NULL) {
ResizeMoveCtrl(hDlg, hCtrl, 0, 0, lcmd->num[0], lcmd->num[1]);
}
break;
}
}
}

View File

@ -20,6 +20,8 @@
#include <stdint.h>
#include <stddef.h>
#pragma once
// What we need for localization
// # Comment
// v 1 1 // UI target version (major, minor)

113
src/localization_data.h Normal file
View File

@ -0,0 +1,113 @@
/*
* Rufus: The Reliable USB Formatting Utility
* Localization tables - autogenerated from resource.h
* Copyright © 2013 Pete Batard <pete@akeo.ie>
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include <windows.h>
#include "resource.h"
#include "localization.h"
#define LOC_CTRL(x) { #x, x }
#define LOC_DLG(x) { x, NULL, {NULL, NULL} }
// Control IDs
const loc_control_id control_id[] = {
// The dialog IDs must come first
LOC_CTRL(IDD_DIALOG),
LOC_CTRL(IDD_ABOUTBOX),
LOC_CTRL(IDD_NOTIFICATION),
LOC_CTRL(IDD_LICENSE),
LOC_CTRL(IDD_ISO_EXTRACT),
LOC_CTRL(IDD_LOG),
LOC_CTRL(IDD_UPDATE_POLICY),
LOC_CTRL(IDD_NEW_VERSION),
LOC_CTRL(IDC_DEVICE),
LOC_CTRL(IDC_FILESYSTEM),
LOC_CTRL(IDC_START),
LOC_CTRL(IDC_PARTITION_SCHEME),
LOC_CTRL(IDC_CLUSTERSIZE),
LOC_CTRL(IDC_STATUS),
LOC_CTRL(IDC_ABOUT),
LOC_CTRL(IDC_LABEL),
LOC_CTRL(IDC_QUICKFORMAT),
LOC_CTRL(IDC_BOOT),
LOC_CTRL(IDC_BADBLOCKS),
LOC_CTRL(IDC_PROGRESS),
LOC_CTRL(IDC_BOOTTYPE),
LOC_CTRL(IDC_NBPASSES),
LOC_CTRL(IDC_TEST),
LOC_CTRL(IDC_SELECT_ISO),
LOC_CTRL(IDC_SET_ICON),
LOC_CTRL(IDC_RUFUS_MBR),
LOC_CTRL(IDC_ISO_FILENAME),
LOC_CTRL(IDC_ISO_ABORT),
LOC_CTRL(IDC_DISK_ID),
LOC_CTRL(IDC_EXTRA_PARTITION),
LOC_CTRL(IDC_ENABLE_FIXED_DISKS),
LOC_CTRL(IDC_ABOUT_LICENSE),
LOC_CTRL(IDC_ABOUT_ICON),
LOC_CTRL(IDC_ABOUT_UPDATES),
LOC_CTRL(IDC_ABOUT_COPYRIGHTS),
LOC_CTRL(IDC_ABOUT_BLURB),
LOC_CTRL(IDC_LICENSE_TEXT),
LOC_CTRL(IDC_NOTIFICATION_ICON),
LOC_CTRL(IDC_NOTIFICATION_TEXT),
LOC_CTRL(IDC_NOTIFICATION_LINE),
LOC_CTRL(IDC_ADVANCED),
LOC_CTRL(IDC_ADVANCED_GROUP),
LOC_CTRL(IDC_LOG),
LOC_CTRL(IDC_LOG_EDIT),
LOC_CTRL(IDC_LOG_SAVE),
LOC_CTRL(IDC_LOG_CLEAR),
LOC_CTRL(IDC_MORE_INFO),
LOC_CTRL(IDC_POLICY),
LOC_CTRL(IDC_UPDATE_FREQUENCY),
LOC_CTRL(IDC_INCLUDE_BETAS),
LOC_CTRL(IDC_RELEASE_NOTES),
LOC_CTRL(IDC_DOWNLOAD),
LOC_CTRL(IDC_CHECK_NOW),
LOC_CTRL(IDC_WEBSITE),
LOC_CTRL(IDC_YOUR_VERSION),
LOC_CTRL(IDC_LATEST_VERSION),
LOC_CTRL(IDC_DOWNLOAD_URL),
LOC_CTRL(IDS_DEVICE_TXT),
LOC_CTRL(IDS_PARTITION_TYPE_TXT),
LOC_CTRL(IDS_FILESYSTEM_TXT),
LOC_CTRL(IDS_CLUSTERSIZE_TXT),
LOC_CTRL(IDS_LABEL_TXT),
LOC_CTRL(IDS_FORMATOPTIONS_TXT),
LOC_CTRL(IDS_UPDATE_SETTINGS_TXT),
LOC_CTRL(IDS_UPDATE_FREQUENCY_TXT),
LOC_CTRL(IDS_INCLUDE_BETAS_TXT),
LOC_CTRL(IDS_NEW_VERSION_AVAIL_TXT),
LOC_CTRL(IDS_NEW_VERSION_DOWNLOAD_TXT),
LOC_CTRL(IDS_NEW_VERSION_NOTES_TXT),
LOC_CTRL(IDOK),
LOC_CTRL(IDCANCEL)
};
// Dialog data
loc_dlg_list loc_dlg[] = {
LOC_DLG(IDD_DIALOG),
LOC_DLG(IDD_ABOUTBOX),
LOC_DLG(IDD_NOTIFICATION),
LOC_DLG(IDD_LICENSE),
LOC_DLG(IDD_ISO_EXTRACT),
LOC_DLG(IDD_LOG),
LOC_DLG(IDD_UPDATE_POLICY),
LOC_DLG(IDD_NEW_VERSION),
};

82
src/localization_data.sh Normal file
View File

@ -0,0 +1,82 @@
#!/bin/sh
echo This file recreates localization_data.c according resource.h
echo
# check that sed are available
type -P sed &>/dev/null || { echo "sed command not found. Aborting." >&2; exit 1; }
# Create the first sed command file
cat > cmd.sed <<\_EOF
# Insert header
1i /*\
* Rufus: The Reliable USB Formatting Utility\
* Localization tables - autogenerated from resource.h\
* Copyright © 2013 Pete Batard <pete@akeo.ie>\
*\
* 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 3 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, see <http://www.gnu.org/licenses/>.\
*/\
\
#include <windows.h>\
#include "resource.h"\
#include "localization.h"\
\
#define LOC_CTRL(x) { #x, x }\
#define LOC_DLG(x) { x, NULL, {NULL, NULL} }\
\
// Control IDs\
const loc_control_id control_id[] = {\
// The dialog IDs must come first
# Add the control entries - must be in IDD_, IDC_ or IDS_
s/^#define \(ID[D|C|S][^ ]*\) .*/\ LOC_CTRL(\1),/
# Add IDs that aren't present in resource.h and close table
$a\
LOC_CTRL(IDOK),\
LOC_CTRL(IDCANCEL)\
\};\
# Remove everything else
/^[#|\/]/d
/^$/d
_EOF
# Run first part
sed -f cmd.sed resource.h > localization_data.h
# Create the second sed command file
cat > cmd.sed <<\_EOF
# Insert dialog table header
1i // Dialog data\
loc_dlg_list loc_dlg[] = {
# Add the dialog entries - must start with IDD_
s/^#define \(IDD[^ ]*\) .*/\ LOC_DLG(\1),/
# Close the table
$a\
};
# Remove everything else
/^[#|\/]/d
/^$/d
_EOF
# Run second part
sed -f cmd.sed resource.h >> localization_data.h
rm cmd.sed
echo Done.

View File

@ -262,7 +262,7 @@ char* get_loc_data_file(const char* filename)
} while(1);
out:
apply_localization(IDD_DIALOG, hMainDialog);
apply_localization(-1, NULL);
if (fd != NULL)
fclose(fd);
safe_free(wfilename);

View File

@ -100,6 +100,12 @@
#define IDS_CLUSTERSIZE_TXT 2003
#define IDS_LABEL_TXT 2004
#define IDS_FORMATOPTIONS_TXT 2005
#define IDS_UPDATE_SETTINGS_TXT 2006
#define IDS_UPDATE_FREQUENCY_TXT 2007
#define IDS_INCLUDE_BETAS_TXT 2008
#define IDS_NEW_VERSION_AVAIL_TXT 2009
#define IDS_NEW_VERSION_DOWNLOAD_TXT 2010
#define IDS_NEW_VERSION_NOTES_TXT 2011
// Next default values for new objects
//
@ -108,7 +114,7 @@
#define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 404
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 2020
#define _APS_NEXT_CONTROL_VALUE 1071
#define _APS_NEXT_SYMED_VALUE 3000
#endif
#endif

View File

@ -871,6 +871,7 @@ BOOL CALLBACK LogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
switch (message) {
case WM_INITDIALOG:
apply_localization(IDD_LOG, hDlg);
hLog = GetDlgItem(hDlg, IDC_LOG_EDIT);
// Increase the size of our log textbox to MAX_LOG_SIZE (unsigned word)
PostMessage(hLog, EM_LIMITTEXT, MAX_LOG_SIZE , 0);
@ -893,8 +894,9 @@ BOOL CALLBACK LogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
return TRUE;
case IDC_LOG_SAVE:
log_size = GetWindowTextLengthU(hLog);
if (log_size > 0)
log_buffer = (char*)malloc(log_size);
if (log_size <= 0)
break;
log_buffer = (char*)malloc(log_size);
if (log_buffer != NULL) {
log_size = GetDlgItemTextU(hDlg, IDC_LOG_EDIT, log_buffer, log_size);
if (log_size != 0) {
@ -906,14 +908,13 @@ BOOL CALLBACK LogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
safe_free(filepath);
}
safe_free(log_buffer);
} else {
uprintf("Could not allocate buffer to save log\n");
}
break;
}
break;
case WM_CLOSE:
ShowWindow(hDlg, SW_HIDE);
reset_localization(IDD_LOG);
log_displayed = FALSE;
return TRUE;
}

View File

@ -130,14 +130,14 @@ STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Update policy and settings"
FONT 8, "Microsoft Sans Serif", 400, 0, 0x0
BEGIN
ICON IDI_ICON,IDC_ABOUT_ICON,11,8,21,20
ICON IDI_ICON,IDC_ABOUT_ICON,11,8,20,20
DEFPUSHBUTTON "Close",IDCANCEL,221,172,50,14,WS_GROUP
CONTROL "",IDC_POLICY,"RichEdit20W",WS_VSCROLL | 0x804,46,8,235,130,WS_EX_STATICEDGE
COMBOBOX IDC_UPDATE_FREQUENCY,133,155,66,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Check for updates:",IDC_STATIC,52,157,72,11
LTEXT "Include beta versions:",IDC_STATIC,52,173,93,11
LTEXT "Check for updates:",IDS_UPDATE_FREQUENCY_TXT,52,157,80,11
LTEXT "Include beta versions:",IDS_INCLUDE_BETAS_TXT,52,173,80,11
COMBOBOX IDC_INCLUDE_BETAS,133,171,36,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
GROUPBOX "Settings",IDC_STATIC,45,145,161,46
GROUPBOX "Settings",IDS_UPDATE_SETTINGS_TXT,45,145,161,46
PUSHBUTTON "Check Now",IDC_CHECK_NOW,221,154,50,14
GROUPBOX "",IDC_STATIC,210,145,71,46
END
@ -148,10 +148,10 @@ CAPTION "Check For Updates - Rufus"
FONT 8, "Microsoft Sans Serif", 400, 0, 0x0
BEGIN
PUSHBUTTON "Close",IDCANCEL,167,244,50,14,WS_GROUP
CONTROL "",IDC_RELEASE_NOTES,"RichEdit20W",WS_VSCROLL | 0x804,15,77,352,88,WS_EX_STATICEDGE
CONTROL "",IDC_RELEASE_NOTES,"RichEdit20W",ES_MULTILINE | ES_READONLY | WS_VSCROLL,15,77,352,88,WS_EX_STATICEDGE
DEFPUSHBUTTON "Download",IDC_DOWNLOAD,293,211,74,14,WS_GROUP
CONTROL "",IDC_PROGRESS,"msctls_progress32",WS_BORDER,15,212,270,11
GROUPBOX "Release Notes",IDC_STATIC,8,63,367,111
GROUPBOX "Release Notes",IDS_NEW_VERSION_NOTES_TXT,8,63,367,111
LTEXT "A newer version is available. Please download the latest version!",IDC_STATIC,10,32,229,8
LTEXT "[...]",IDC_YOUR_VERSION,10,8,124,8
LTEXT "[...]",IDC_LATEST_VERSION,10,19,129,8

View File

@ -462,6 +462,7 @@ INT_PTR CALLBACK LicenseCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM
{
switch (message) {
case WM_INITDIALOG:
apply_localization(IDD_LICENSE, hDlg);
CenterDialog(hDlg);
SetDlgItemTextA(hDlg, IDC_LICENSE_TEXT, gplv3);
break;
@ -469,6 +470,7 @@ INT_PTR CALLBACK LicenseCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM
switch (LOWORD(wParam)) {
case IDOK:
case IDCANCEL:
reset_localization(IDD_LICENSE);
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
@ -963,6 +965,7 @@ INT_PTR CALLBACK UpdateCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM l
switch (message) {
case WM_INITDIALOG:
apply_localization(IDD_UPDATE_POLICY, hDlg);
SetTitleBarIcon(hDlg);
CenterDialog(hDlg);
hFrequency = GetDlgItem(hDlg, IDC_UPDATE_FREQUENCY);
@ -1007,6 +1010,7 @@ INT_PTR CALLBACK UpdateCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM l
switch (LOWORD(wParam)) {
case IDCLOSE:
case IDCANCEL:
reset_localization(IDD_UPDATE_POLICY);
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
case IDC_CHECK_NOW: