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);