diff --git a/src/.msvc/rufus.loc b/src/.msvc/rufus.loc index e1c88e25..5386f200 100644 --- a/src/.msvc/rufus.loc +++ b/src/.msvc/rufus.loc @@ -1,39 +1,29 @@ -ataak -l "en-US" - v 2 8 -# This is a comment -t IDD_TEST "OHOH\"OLA\"LA\"BLA\"DI\"" -t ANY_MORE "国民生活センターの発表によ" - # another comment - asasas - - sdsadsdaasd 12 -m IDD_CONTROL -12 +4a5 - r IDD_CONTROL2 +5 +10 -t IDD_MORE_BLURB "Yoda dadada daaddadada" - "THIS IS PART OF NEXT LINE" - " could I have " - " ANY MORE LINESUS???" - # Test comment -# end +l "English" 0x0409, 0x0809, 0x0c09, 0x1009, 0x1409, 0x1809, 0x1c09, 0x2009, 0x2409, 0x2809, 0x2c09, 0x3009, 0x3409, 0x3809, 0x3c09, 0x4009, 0x4409, 0x4809 +# TODO: replace 'p' with 's' for section +p IDD_MESSAGES +t MSG_001 "WARNING: ALL DATA ON DEVICE '%s' WILL BE DESTROYED.\n" + "To continue with this operation, click OK. To quit click CANCEL." -#l "fr-FR" -#t IDS_FORMATOPTIONS_TXT "Options de Formattage " -#t IDS_LABEL_TXT "Nouveau label" -#t IDS_FILESYSTEM_TXT "Système de fichier" -#t IDS_CLUSTERSIZE_TXT "Taille de clusters" -#t IDS_DEVICE_TXT "Periphérique" -#t IDS_PARTITION_TYPE_TXT "Type de partition et système de destination" -#t IDC_BADBLOCKS "Vérification de mauvais blocs:" -#t IDC_QUICKFORMAT "Formattage rapide" -#t IDC_BOOT "Disque de démarrage avec:" -#t IDC_SET_ICON "Ajouter un label étendu et une icône" -#m IDC_ADVANCED +37 0 -fake command +l "French" 0x040c, 0x080c, 0x0c0c, 0x100c, 0x140c, 0x180c, 0x1c0c, 0x200c, 0x240c, 0x280c, 0x2c0c, 0x300c, 0x340c, 0x380c, 0xe40c +p IDD_DIALOG +t IDS_FORMATOPTIONS_TXT "Options de Formattage " +t IDS_LABEL_TXT "Nouveau label" +t IDS_FILESYSTEM_TXT "Système de fichier" +t IDS_CLUSTERSIZE_TXT "Taille de clusters" +t IDS_DEVICE_TXT "Periphérique" +t IDS_PARTITION_TYPE_TXT "Type de partition et système de destination" +t IDC_BADBLOCKS "Vérification de mauvais blocs:" +t IDC_QUICKFORMAT "Formattage rapide" +t IDC_BOOT "Disque de démarrage avec:" +t IDC_SET_ICON "Ajouter un label étendu et une icône" +m IDC_ADVANCED +18 0 -l "Chinese (Simplified)" 0x0804, 0x1004, 0x0404, 0x0c04, 0x1404 -t IDC_START "开始" -t IDC_STOP "关闭" +p IDD_MESSAGES +t MSG_001 "ATTENTION: TOUTES LES DONNEES SUR LE VOLUME '%s' VONT ETRE EFFACEES.\n" + "Pour continuer cette operation, cliquez sur OK.\nPour quitter cliquez sur ANNULER." + +l "Chinese (Traditional)" 0x0404, 0x0804, 0x0c04, 0x1004, 0x1404 +p IDD_DIALOG t IDS_DEVICE_TXT "设备" t IDS_PARTITION_TYPE_TXT "分区计划和目标系统类型" t IDS_FILESYSTEM_TXT "文件系统" @@ -59,7 +49,6 @@ t IDC_ADVANCED_GROUP "高级选项" t IDC_ENABLE_FIXED_DISKS "列表固定(非flash)或USB磁盘分区" t IDC_EXTRA_PARTITION "添加修复旧的BIOS(额外的分区,校准等等)" t IDC_RUFUS_MBR "使用 Rufus MBR BIOS ID:" -t IDD_DIALOG "Does this work?" p IDD_ABOUTBOX t IDD_ABOUTBOX "关于 Rufus" diff --git a/src/.msvc/rufus.vcxproj b/src/.msvc/rufus.vcxproj index b7fef02e..059fa5c2 100644 --- a/src/.msvc/rufus.vcxproj +++ b/src/.msvc/rufus.vcxproj @@ -40,12 +40,12 @@ Application Unicode true - v110_xp + v110 Application Unicode - v110_xp + v110 diff --git a/src/localization.c b/src/localization.c index 49852475..856edaf2 100644 --- a/src/localization.c +++ b/src/localization.c @@ -62,6 +62,7 @@ const loc_parse parse_cmd[9] = { }; int loc_line_nr; char loc_filename[32]; +struct list_head locale_list = {NULL, NULL}; void free_loc_cmd(loc_cmd* lcmd) { @@ -91,13 +92,23 @@ void free_loc_dlg(void) for (i=0; ilist); free_loc_cmd(lcmd); } } } +void free_locale_list(void) +{ + loc_cmd *lcmd, *next; + + list_for_each_entry_safe(lcmd, next, &locale_list, loc_cmd, list) { + list_del(&lcmd->list); + free_loc_cmd(lcmd); + } +} + /* * We need to initialize the command lists */ @@ -106,6 +117,12 @@ void init_localization(void) { for (i=0; i= id_start) && (dlg_id < id_end)) { // If we have a valid dialog_id, just process that one dialog @@ -133,10 +153,11 @@ void apply_localization(int dlg_id, HWND 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) { + // TODO: storing the messages in an array indexed on the message ID - 3000 would be faster + list_for_each_entry(lcmd, &loc_dlg[dlg_id-IDD_DIALOG].list, loc_cmd, list) { if (lcmd->command <= LC_TEXT) { // TODO: should always be the case if (lcmd->ctrl_id == dlg_id) { - if (dlg_id == IDD_DIALOG) { + if ((dlg_id == IDD_DIALOG) && (lcmd->txt[1] != NULL) && (lcmd->txt[1][0] != 0)) { loc_line_nr = lcmd->line_nr; luprint("operation forbidden (main dialog title cannot be changed)"); continue; @@ -156,7 +177,14 @@ void apply_localization(int dlg_id, HWND hDlg) // 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->txt[1]); + if ((lcmd->txt[1] != NULL) && (lcmd->txt[1][0] != 0)) + SetWindowTextU(hCtrl, lcmd->txt[1]); + if (left_to_right) { + style = GetWindowLongPtr(hCtrl, GWL_EXSTYLE); + style |= WS_EX_LAYOUTRTL; // WS_EX_RIGHT | WS_EX_RTLREADING + SetWindowLongPtr(hCtrl, GWL_EXSTYLE, style); + InvalidateRect(hCtrl, NULL, TRUE); + } } break; case LC_MOVE: @@ -181,7 +209,7 @@ void reset_localization(int dlg_id) loc_dlg[dlg_id-IDD_DIALOG].hDlg = NULL; } -// TODO: we need to store a revert for every action we execute here, +// TODO: Do we need to store a revert for every action we execute here, // or do we want to reinstantiate the dialogs? BOOL dispatch_loc_cmd(loc_cmd* lcmd) { @@ -191,9 +219,6 @@ BOOL dispatch_loc_cmd(loc_cmd* lcmd) if (lcmd == NULL) return FALSE; -// uprintf("cmd #%d: ('%s', '%s') (%d, %d)\n", -// lcmd->command, lcmd->text[0], lcmd->text[1], lcmd->num[0], lcmd->num[1]); - if (lcmd->command <= LC_TEXT) { // Any command up to LC_TEXT takes a control ID in text[0] for (i=0; inum[0], lcmd->num[1]); free_loc_cmd(lcmd); break; - case LC_LOCALE: - luprintf("GOT LOCALE \"%s\", with LCIDs:\n", lcmd->txt[0]); - for (i=0; iunum_size; i++) - luprintf(" 0x%04X\n", lcmd->unum[i]); - free_loc_cmd(lcmd); - break; default: free_loc_cmd(lcmd); break; @@ -243,3 +262,59 @@ err: free_loc_cmd(lcmd); return FALSE; } + +char* get_loc_msg(int msg_id) +{ + loc_cmd* lcmd; + + list_for_each_entry(lcmd, &loc_dlg[IDD_MESSAGES-IDD_DIALOG].list, loc_cmd, list) { + if ((lcmd->command == LC_TEXT) && (lcmd->ctrl_id == msg_id) && (lcmd->txt[1] != NULL)) { + return lcmd->txt[1]; + } + } + // TODO: print the message ID or something + return "UNTRANSLATED MESSAGE"; +} + +loc_cmd* get_locale_from_lcid(int lcid) +{ + loc_cmd* lcmd = NULL; + int i; + + if (list_empty(&locale_list)) { + uprintf("localization: the locale list is empty!\n"); + return NULL; + } + + list_for_each_entry(lcmd, &locale_list, loc_cmd, list) { + for (i=0; iunum_size; i++) { + if (lcmd->unum[i] == lcid) { + return lcmd; + } + } + } + + lcmd = list_entry(locale_list.next, loc_cmd, list); + // If we couldn't find a supported locale, just pick the first one (usually English) + uprintf("localization: could not find locale for LCID: 0x%04X. Will default to '%s'\n", lcid, lcmd->txt[0]); + return lcmd; +} + +loc_cmd* get_locale_from_name(char* locale_name) +{ + loc_cmd* lcmd = NULL; + + if (list_empty(&locale_list)) { + uprintf("localization: the locale list is empty!\n"); + return NULL; + } + + list_for_each_entry(lcmd, &locale_list, loc_cmd, list) { + if (safe_strcmp(lcmd->txt[0], locale_name) == 0) + return lcmd; + } + + lcmd = list_entry(locale_list.next, loc_cmd, list); + uprintf("localization: could not find locale for name '%s'. Will default to '%s'\n", locale_name, lcmd->txt[0]); + return lcmd; +} diff --git a/src/localization.h b/src/localization.h index f3e1773f..a701de23 100644 --- a/src/localization.h +++ b/src/localization.h @@ -53,13 +53,13 @@ struct list_head { * member - the list_head element in "pos" * type - the type of the first parameter */ -#define list_for_each_entry(pos, head, member, type) \ +#define list_for_each_entry(pos, head, type, member) \ for (pos = list_entry((head)->next, type, member); \ &pos->member != (head); \ pos = list_entry(pos->member.next, type, member)) -#define list_for_each_entry_safe(pos, n, head, member, type) \ +#define list_for_each_entry_safe(pos, n, head, type, member) \ for (pos = list_entry((head)->next, type, member), \ n = list_entry(pos->member.next, type, member); \ &pos->member != (head); \ @@ -140,12 +140,20 @@ typedef struct loc_dlg_list_struct { } loc_dlg_list; extern const loc_parse parse_cmd[9]; +extern struct list_head locale_list; int loc_line_nr; char loc_filename[32]; void free_loc_cmd(loc_cmd* lcmd); BOOL dispatch_loc_cmd(loc_cmd* lcmd); void init_localization(void); +void exit_localization(void); void apply_localization(int dlg_id, HWND hDlg); void reset_localization(int dlg_id); void free_loc_dlg(void); +char* get_loc_msg(int id); +BOOL get_supported_locales(const char* filename); +char* get_loc_data_file(const char* filename, long offset, long end_offset); +void free_locale_list(void); +loc_cmd* get_locale_from_lcid(int lcid); +loc_cmd* get_locale_from_name(char* locale_name); diff --git a/src/localization_data.h b/src/localization_data.h index 4733ece9..309edaaf 100644 --- a/src/localization_data.h +++ b/src/localization_data.h @@ -35,6 +35,7 @@ const loc_control_id control_id[] = { LOC_CTRL(IDD_LOG), LOC_CTRL(IDD_UPDATE_POLICY), LOC_CTRL(IDD_NEW_VERSION), + LOC_CTRL(IDD_MESSAGES), LOC_CTRL(IDC_DEVICE), LOC_CTRL(IDC_FILESYSTEM), LOC_CTRL(IDC_START), @@ -96,6 +97,8 @@ const loc_control_id control_id[] = { LOC_CTRL(IDS_NEW_VERSION_AVAIL_TXT), LOC_CTRL(IDS_NEW_VERSION_DOWNLOAD_TXT), LOC_CTRL(IDS_NEW_VERSION_NOTES_TXT), + LOC_CTRL(MSG_000), + LOC_CTRL(MSG_001), LOC_CTRL(IDOK), LOC_CTRL(IDCANCEL), LOC_CTRL(IDABORT), @@ -119,4 +122,5 @@ loc_dlg_list loc_dlg[] = { LOC_DLG(IDD_LOG), LOC_DLG(IDD_UPDATE_POLICY), LOC_DLG(IDD_NEW_VERSION), + LOC_DLG(IDD_MESSAGES), }; diff --git a/src/localization_data.sh b/src/localization_data.sh index 7abb77ba..8259a111 100644 --- a/src/localization_data.sh +++ b/src/localization_data.sh @@ -39,8 +39,8 @@ cat > cmd.sed <<\_EOF 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 the control entries - must be in IDD_, IDC_, IDS_ or MSG_ +s/^#define \([I|M][D|S][D|C|S|G]_[^ ]*\) .*/\ LOC_CTRL(\1),/ # Add standard IDs from windows.h and close table $a\ @@ -73,7 +73,7 @@ cat > cmd.sed <<\_EOF loc_dlg_list loc_dlg[] = { # Add the dialog entries - must start with IDD_ -s/^#define \(IDD[^ ]*\) .*/\ LOC_DLG(\1),/ +s/^#define \(IDD_[^ ]*\) .*/\ LOC_DLG(\1),/ # Close the table $a\ diff --git a/src/parser.c b/src/parser.c index 9fc6f4f6..2826cb2b 100644 --- a/src/parser.c +++ b/src/parser.c @@ -143,6 +143,7 @@ static loc_cmd* get_loc_cmd(char c, char* line) { goto err; } } + return lcmd; err: @@ -152,35 +153,34 @@ err: // Parse an UTF-8 localization command line -static void* get_loc_data_line(char* line) +static void get_loc_data_line(char* line) { - size_t i = 0; + size_t i; loc_cmd* lcmd = NULL; char t; -// char* locale = "en-US"; -// BOOL seek_locale = TRUE; if ((line == NULL) || (line[0] == 0)) - return NULL; + return; // Skip leading spaces - i += strspn(&line[i], space); + i = strspn(line, space); // Read token (NUL character will be read if EOL) t = line[i++]; if (t == '#') // Comment - return NULL; + return; if ((t == 0) || ((line[i] != space[0]) && (line[i] != space[1]))) { luprint("syntax error"); - return NULL; + return; } lcmd = get_loc_cmd(t, &line[i]); - // TODO: process LC_LOCALE in seek_locale mode - // TODO: check return value? - dispatch_loc_cmd(lcmd); - return NULL; + if ((lcmd != NULL) && (lcmd->command != LC_LOCALE)) + // TODO: check return value? + dispatch_loc_cmd(lcmd); + else + free_loc_cmd(lcmd); } static __inline void *_reallocf(void *ptr, size_t size) @@ -191,8 +191,83 @@ static __inline void *_reallocf(void *ptr, size_t size) return ret; } +/* + * First pass of parsing the locale file, to construct the list + * of locales available. The locale file must be UTF-8 with NO BOM. + * TODO: merge this with the next call or factorize fopen + */ +BOOL get_supported_locales(const char* filename) +{ + wchar_t *wfilename = NULL; + FILE* fd = NULL; + BOOL r = FALSE; + char line[1024]; + size_t i; + loc_cmd *lcmd = NULL, *last_lcmd = NULL; + long end_of_block; + + safe_strcpy(loc_filename, sizeof(loc_filename), filename); + wfilename = utf8_to_wchar(filename); + if (wfilename == NULL) { + uprintf("localization: could not convert '%s' filename to UTF-16\n", filename); + goto out; + } + fd = _wfopen(wfilename, L"r"); + if (fd == NULL) { + uprintf("localization: could not open '%s'\n", filename); + goto out; + } + + loc_line_nr = 0; + line[0] = 0; + free_locale_list(); + do { + // adjust the last block + end_of_block = ftell(fd); + if (fgets(line, sizeof(line), fd) == NULL) + break; + loc_line_nr++; + // Skip leading spaces + i = strspn(line, space); + if (line[i] != 'l') + continue; +// uprintf("Found potential start of loc at line %d\n", loc_line_nr); + // line[i] is not NUL so i+1 is safe to access + lcmd = get_loc_cmd(line[i], &line[i+1]); + if ((lcmd == NULL) || (lcmd->command != LC_LOCALE)) { + free_loc_cmd(lcmd); + continue; + } + // we use num[0] and num[1] as block delimiter index for this locale in the file + if (last_lcmd != NULL) { + last_lcmd->num[1] = (int32_t)end_of_block; +// uprintf("ended locale block at offset %d\n", last_lcmd->num[1]); + } + lcmd->num[0] = (int32_t)ftell(fd); +// uprintf("started locale block for '%s' at offset %d\n", lcmd->txt[0], lcmd->num[0]); + // Add our locale command to the locale list + list_add_tail(&lcmd->list, &locale_list); + uprintf("localization: found locale '%s'\n", lcmd->txt[0]); + last_lcmd = lcmd; + } while (1); + if (last_lcmd != NULL) + last_lcmd->num[1] = (int32_t)ftell(fd); +// uprintf("ended locale block at offset %d\n", last_lcmd->num[1]); + r = !list_empty(&locale_list); + if (r == FALSE) + uprintf("localization: '%s' contains no locale sections\n", filename); + +out: + if (fd != NULL) + fclose(fd); + safe_free(wfilename); + return r; +} + // Parse a Rufus localization command file (UTF-8, no BOM) -char* get_loc_data_file(const char* filename) +// TODO: detect if locale could not be found and fallback to En +// TODO: change the return value and return an error if locale was not found +char* get_loc_data_file(const char* filename, long offset, long end_offset) { wchar_t *wfilename = NULL; size_t bufsize = 1024; @@ -201,7 +276,7 @@ char* get_loc_data_file(const char* filename) size_t i = 0; int r = 0, line_nr_incr = 1; int c = 0, eol_char = 0; - BOOL eol = FALSE; + BOOL eol = FALSE, escape_sequence = FALSE; if ((filename == NULL) || (filename[0] == 0)) return NULL; @@ -226,7 +301,13 @@ char* get_loc_data_file(const char* filename) goto out; } + fseek(fd, offset, SEEK_SET); + do { // custom readline handling for string collation, realloc, line numbers, etc. + if (offset++ > end_offset) { +// uprintf("found end of section at offset %d\n", end_offset); + goto out; + } c = getc(fd); switch(c) { case EOF: @@ -235,8 +316,16 @@ char* get_loc_data_file(const char* filename) loc_line_nr += line_nr_incr; get_loc_data_line(buf); goto out; + case '\\': + if (!escape_sequence) + escape_sequence = TRUE; + break; case '\r': case '\n': + if (escape_sequence) { + escape_sequence = FALSE; + break; + } // This assumes that the EOL sequence is always the same throughout the file if (eol_char == 0) eol_char = c; @@ -259,27 +348,48 @@ char* get_loc_data_file(const char* filename) break; case ' ': case '\t': + if (escape_sequence) { + escape_sequence = FALSE; + break; + } if (!eol) { buf[i++] = (char)c; } break; default: - // Collate multiline strings - if ((eol) && (c == '"') && (buf[r] == '"')) { - i = r; - eol = FALSE; - break; + if (escape_sequence) { + switch (c) { + case 'n': // \n -> CRLF + buf[i++] = '\r'; + buf[i++] = '\n'; + break; + case '"': // \" carried as is + buf[i++] = '\\'; + buf[i++] = '"'; + break; + default: // ignore any other escape sequence + break; + } + escape_sequence = FALSE; + } else { + // Collate multiline strings + if ((eol) && (c == '"') && (buf[r] == '"')) { + i = r; + eol = FALSE; + break; + } + if (eol) { + get_loc_data_line(buf); + eol = FALSE; + i = 0; + r = 0; + } + buf[i++] = (char)c; } - if (eol) { - get_loc_data_line(buf); - eol = FALSE; - i = 0; - r = 0; - } - buf[i++] = (char)c; break; } - if (i >= bufsize-1) { + // Have at least 2 chars extra, for \r\n sequences + if (i >= bufsize-2) { bufsize *= 2; if (bufsize > 32768) { uprintf("localization: requested line buffer is larger than 32K!\n"); @@ -294,6 +404,7 @@ char* get_loc_data_file(const char* filename) } while(1); out: + // TODO: do we really need this here? apply_localization(-1, NULL); if (fd != NULL) fclose(fd); diff --git a/src/resource.h b/src/resource.h index 4a788b07..4e78955c 100644 --- a/src/resource.h +++ b/src/resource.h @@ -10,6 +10,7 @@ #define IDD_LOG 106 #define IDD_UPDATE_POLICY 107 #define IDD_NEW_VERSION 108 +#define IDD_MESSAGES 109 #define IDI_ICON 110 #define IDI_UP 111 #define IDI_DOWN 112 @@ -107,6 +108,8 @@ #define IDS_NEW_VERSION_AVAIL_TXT 2009 #define IDS_NEW_VERSION_DOWNLOAD_TXT 2010 #define IDS_NEW_VERSION_NOTES_TXT 2011 +#define MSG_000 3000 +#define MSG_001 3001 // Next default values for new objects // diff --git a/src/rufus.c b/src/rufus.c index a032c263..3badb6e6 100644 --- a/src/rufus.c +++ b/src/rufus.c @@ -1448,8 +1448,6 @@ static void PrintStatus2000(const char* str, BOOL val) } -// TODO: remove me -extern char* get_loc_data_file(const char* filename); /* * Main dialog callback */ @@ -1463,6 +1461,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA char tmp[128], str[MAX_PATH]; static UINT uBootChecked = BST_CHECKED, uQFChecked; static BOOL first_log_display = TRUE, user_changed_label = FALSE; + loc_cmd* selected_locale; switch (message) { @@ -1595,7 +1594,17 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA break; #ifdef RUFUS_TEST case IDC_TEST: - get_loc_data_file("rufus.loc"); + if ( (!get_supported_locales("rufus.loc")) +// || ((selected_locale = get_locale_from_lcid(GetUserDefaultLCID())) == NULL) ) { + || ((selected_locale = get_locale_from_name("French")) == NULL) ) { + uprintf("FATAL: Could not get a default locale!\n"); + MessageBoxU(NULL, "Default locale is missing - the application will now exit", + "Localization failure", MB_ICONSTOP); + break; + } + uprintf("Will use locale '%s'\n", selected_locale->txt[0]); + get_loc_data_file("rufus.loc", (long)selected_locale->num[0], (long)selected_locale->num[1]); + apply_localization(IDD_DIALOG, hDlg); break; #endif case IDC_ADVANCED: @@ -1777,8 +1786,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA break; } GetWindowTextU(hDeviceList, tmp, ARRAYSIZE(tmp)); - _snprintf(str, ARRAYSIZE(str), "WARNING: ALL DATA ON DEVICE '%s'\r\nWILL BE DESTROYED.\r\n" - "To continue with this operation, click OK. To quit click CANCEL.", tmp); + _snprintf(str, ARRAYSIZE(str), get_loc_msg(MSG_001), tmp); if (MessageBoxU(hMainDialog, str, APPLICATION_NAME, MB_OKCANCEL|MB_ICONWARNING) == IDCANCEL) { format_op_in_progress = FALSE; break; @@ -2035,6 +2043,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine GetTempPathU(sizeof(loc_path), loc_path); safe_strcat(loc_path, sizeof(loc_name), loc_name); + // TODO: make sure we fail if we can't extract the file as we'll miss all the messages + // Force Chinese localization from embedded rufus.loc file // TODO: REMOVE ME! hFile = CreateFileU(loc_path, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, @@ -2118,7 +2128,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine out: DestroyAllTooltips(); - free_loc_dlg(); + exit_localization(); safe_free(iso_path); safe_free(update.download_url); safe_free(update.release_notes); diff --git a/src/rufus.rc b/src/rufus.rc index 296e7d35..8d79bd82 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -39,21 +39,21 @@ BEGIN PUSHBUTTON "Log",IDC_LOG,62,291,18,14 PUSHBUTTON "T",IDC_TEST,80,291,12,14,NOT WS_VISIBLE COMBOBOX IDC_DEVICE,8,17,190,33,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Device",IDS_DEVICE_TXT,9,6,188,8 + LTEXT "Device",IDS_DEVICE_TXT,9,6,186,8 COMBOBOX IDC_FILESYSTEM,8,75,190,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "File system",IDS_FILESYSTEM_TXT,9,64,188,10 + LTEXT "File system",IDS_FILESYSTEM_TXT,9,64,186,10 COMBOBOX IDC_PARTITION_SCHEME,8,46,190,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Partition scheme and target system type",IDS_PARTITION_TYPE_TXT,9,35,188,8 + LTEXT "Partition scheme and target system type",IDS_PARTITION_TYPE_TXT,9,35,186,8 COMBOBOX IDC_CLUSTERSIZE,8,104,190,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Cluster size",IDS_CLUSTERSIZE_TXT,9,93,189,10 + LTEXT "Cluster size",IDS_CLUSTERSIZE_TXT,9,93,186,10 GROUPBOX "Format Options ",IDS_FORMATOPTIONS_TXT,7,149,192,66 - LTEXT "New volume label",IDS_LABEL_TXT,9,121,188,10 + LTEXT "New volume label",IDS_LABEL_TXT,9,121,186,10 EDITTEXT IDC_LABEL,7,131,190,13,ES_AUTOHSCROLL CONTROL "Check device for bad blocks:",IDC_BADBLOCKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,161,101,10 - CONTROL "Quick format",IDC_QUICKFORMAT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,173,184,10 + CONTROL "Quick format",IDC_QUICKFORMAT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,173,181,10 CONTROL "Create a bootable disk using:",IDC_BOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,185,104,10 CONTROL "Create extended label and icon files",IDC_SET_ICON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,198,183,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,198,181,10 CONTROL "",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH | WS_BORDER,8,272,189,9 COMBOBOX IDC_NBPASSES,119,159,49,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_BOOTTYPE,119,183,49,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -63,9 +63,9 @@ BEGIN GROUPBOX "Advanced Options",IDC_ADVANCED_GROUP,7,210,192,54 COMBOBOX IDC_DISK_ID,119,246,73,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Add fixes for old BIOSes (extra partition, align, etc.)",IDC_EXTRA_PARTITION, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,235,184,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,235,181,10 CONTROL "List fixed (non-flash) or unpartitioned USB disks",IDC_ENABLE_FIXED_DISKS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,222,185,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,222,181,10 END IDD_ABOUTBOX DIALOGEX 0, 0, 287, 201 diff --git a/src/stdlg.c b/src/stdlg.c index 524e35ac..2135df6b 100644 --- a/src/stdlg.c +++ b/src/stdlg.c @@ -573,6 +573,7 @@ INT_PTR CALLBACK NotificationCallback(HWND hDlg, UINT message, WPARAM wParam, LP switch (message) { case WM_INITDIALOG: + apply_localization(IDD_NOTIFICATION, hDlg); white_brush = CreateSolidBrush(WHITE); separator_brush = CreateSolidBrush(SEPARATOR_GREY); SetTitleBarIcon(hDlg);