[loc] add [v]ersion command support

This commit is contained in:
Pete Batard 2013-10-30 20:28:56 +00:00
parent d3a495aa83
commit 44cc7ea652
8 changed files with 107 additions and 38 deletions

View File

@ -0,0 +1,14 @@
This file lists any change that has been applied to the en-US translation of
rufus.loc since its original version. Translators are expected to keep their
translations up to date by monitoring this file on regular basis and applying
the same changes.
Remember to also update the version number for your translation ('v x.y.z')
once you have matched all the changes that occurred for the en-US translation.
o Version 1.0.1 (2013.10.28)
- MSG_061 "Please insert a media in drive." -> "Please insert a removable media in drive."
- MSG_071 "Unable to create formatting thread." -> "Unable to start thread."
o Version 1.0.0 (2013.10.20)
- Initial version

View File

@ -48,9 +48,10 @@
################################################################################
l "zz-ZZ" "LangName_EN (LangName_ZZ)" 0x1234, 0xabcd
# See http://msdn.microsoft.com/en-us/goglobal/bb964664.aspx or
# See http://msdn.microsoft.com/en-us/goglobal/bb964664.aspx or
# http://download.microsoft.com/download/9/5/E/95EF66AF-9026-4BB0-A41D-A4F81802D92C/%5BMS-LCID%5D.pdf
# for the LCID (0x####) codes you should use
v 1.0.1
# Main dialog
g IDD_DIALOG
@ -283,8 +284,8 @@ t MSG_151 "Use this if you want to install an OS in EFI mode, but need to access
"the USB content from Windows XP"
t MSG_152 "The preferred option to install an OS in EFI mode and when "
"USB access is not required for Windows XP"
t MSG_153 "Test pattern: 0x%02X"
t MSG_154 "Test pattern: 0x%02X, 0x%02X"
t MSG_153 "Test pattern: 0x%02X"
t MSG_154 "Test pattern: 0x%02X, 0x%02X"
t MSG_155 "Test pattern: 0x%02X, 0x%02X, 0x%02X"
t MSG_156 "Test pattern: 0x%02X, 0x%02X, 0x%02X, 0x%02X"
t MSG_157 "Sets the target filesystem"

View File

@ -2,6 +2,7 @@
################################################################################
l "en-US" "English (English)" 0x0409, 0x0809, 0x0c09, 0x1009, 0x1409, 0x1809, 0x1c09, 0x2009, 0x2409, 0x2809, 0x2c09, 0x3009, 0x3409, 0x3809, 0x3c09, 0x4009, 0x4409, 0x4809
v 1.0.1
g IDD_MESSAGES
t MSG_001 "Other instance detected"
t MSG_002 "Another Rufus application is running.\n"
@ -275,6 +276,7 @@ t MSG_259 "Force update"
################################################################################
l "zh-CN" "Chinese Simplified (简体中文)" 0x0404, 0x0804, 0x0c04, 0x1004, 0x1404
v 1.0.0
b "en-US"
g IDD_DIALOG
@ -356,6 +358,7 @@ t MSG_007 "撤消"
################################################################################
l "fr-FR" "French (Français)" 0x040c, 0x080c, 0x0c0c, 0x100c, 0x140c, 0x180c, 0x1c0c, 0x200c, 0x240c, 0x280c, 0x2c0c, 0x300c, 0x340c, 0x380c, 0xe40c
v 1.0.1
b "en-US"
g IDD_DIALOG
@ -695,6 +698,7 @@ t MSG_259 "Forçage de mise à jour"
################################################################################
l "hu-HU" "Hungarian (Magyar)" 0x040e
v 1.0.0
b "en-US"
g IDD_DIALOG
@ -1008,6 +1012,7 @@ t MSG_259 "'Erőszakos' frissítés"
################################################################################
l "it-IT" "Italian (Italiano)" 0x0410, 0x0810
v 1.0.0
b "en-US"
g IDD_DIALOG

View File

@ -49,7 +49,7 @@ const loc_parse parse_cmd[9] = {
// Base translation to add on top of (eg. "English (UK)" can be used to build on top of "English (US)"
{ 'b', LC_BASE, "s" }, // b "en_US"
// Version to use for the localization commandset and API
{ 'v', LC_VERSION, "ii" }, // v 1.0 // TODO: NOT IMPLEMENTED YET
{ 'v', LC_VERSION, "u" }, // v 1.0.2
// Translate the text control associated with an ID
{ 't', LC_TEXT, "cs" }, // t IDC_CONTROL "Translation"
// Set the section/dialog to which the next commands should apply
@ -331,9 +331,6 @@ void _exit_localization(BOOL reinit) {
/*
* Validate and store localization command data
*
* 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)
{
@ -373,10 +370,6 @@ BOOL dispatch_loc_cmd(loc_cmd* lcmd)
dlg_index = lcmd->ctrl_id - IDD_DIALOG;
free_loc_cmd(lcmd);
break;
case LC_VERSION:
luprintf("GOT VERSION: %d.%d\n", lcmd->num[0], lcmd->num[1]);
free_loc_cmd(lcmd);
break;
case LC_BASE:
base_locale = get_locale_from_name(lcmd->txt[0], FALSE);
if (base_locale != NULL) {
@ -401,7 +394,6 @@ err:
/*
* Apply stored localization commands to a specific dialog
* If hDlg is NULL, apply the commands against an active Window
* TODO: if dlg_id is <0, apply all
*/
void apply_localization(int dlg_id, HWND hDlg)
{

View File

@ -23,9 +23,13 @@
#pragma once
// Number of concurrent localization messages. Must be a power of 2.
#define LOC_MESSAGE_NB 8
#define LOC_MESSAGE_SIZE 2048
#define LOC_HTAB_SIZE 512
#define LOC_MESSAGE_NB 8
#define LOC_MESSAGE_SIZE 2048
#define LOC_HTAB_SIZE 512
// The [v]ersion major from a translation must match this number or
// the translation will be ignored
#define LOC_FRAMEWORK_VERSION 1
#define luprint(msg) uprintf("%s(%d): " msg "\n", loc_filename, loc_line_nr)
#define luprintf(msg, ...) uprintf("%s(%d): " msg "\n", loc_filename, loc_line_nr, __VA_ARGS__)

View File

@ -122,18 +122,18 @@ static loc_cmd* get_loc_cmd(char c, char* line) {
goto err;
}
break;
case 'u': // comma separated list of unsigned integers (to end of line)
case 'u': // comma or dot separated list of unsigned integers (to end of line)
// count the number of commas
lcmd->unum_size = 1;
for (l=i; line[l] != 0; l++) {
if (line[l] == ',')
if ((line[l] == '.') || (line[l] == ','))
lcmd->unum_size++;
}
lcmd->unum = (uint32_t*)malloc(lcmd->unum_size * sizeof(uint32_t));
token = strtok(&line[i], ",");
token = strtok(&line[i], ".,");
for (l=0; (l<lcmd->unum_size) && (token != NULL); l++) {
lcmd->unum[l] = (int32_t)strtol(token, &endptr, 0);
token = strtok(NULL, ",");
token = strtok(NULL, ".,");
}
if ((token != NULL) || (l != lcmd->unum_size)) {
luprint("internal error (unexpected number of numeric values)");
@ -234,6 +234,8 @@ BOOL get_supported_locales(const char* filename)
size_t i;
loc_cmd *lcmd = NULL, *last_lcmd = NULL;
long end_of_block;
int version_line_nr = 0;
uint32_t loc_base_minor = -1, loc_base_micro = -1;
fd = open_loc_file(filename);
if (fd == NULL)
@ -250,29 +252,78 @@ BOOL get_supported_locales(const char* filename)
loc_line_nr++;
// Skip leading spaces
i = strspn(line, space);
if (line[i] != 'l')
if ((line[i] != 'l') && (line[i] != 'v'))
continue;
// 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)) {
if ((lcmd == NULL) || ((lcmd->command != LC_LOCALE) && (lcmd->command != LC_VERSION))) {
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;
switch (lcmd->command) {
case LC_LOCALE:
// we use num[0] and num[1] as block delimiter index for this locale in the file
if (last_lcmd != NULL) {
if (version_line_nr == 0) {
uprintf("localization: no compatible version was found - this locale will be ignored\n");
list_del(&last_lcmd->list);
free_loc_cmd(last_lcmd);
} else {
last_lcmd->num[1] = (int32_t)end_of_block;
}
}
lcmd->num[0] = (int32_t)ftell(fd);
// 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;
version_line_nr = 0;
break;
case LC_VERSION:
if (version_line_nr != 0) {
luprintf("[v]ersion was already provided at line %d", version_line_nr);
} else if (lcmd->unum_size != 3) {
luprint("[v]ersion format is invalid");
} else if (last_lcmd == NULL) {
luprint("[v]ersion cannot precede [l]ocale");
} else if (lcmd->unum[0] != LOC_FRAMEWORK_VERSION) {
// If the localization framework evolved in a manner that makes existing
// translations incompatible, we need to discard them.
luprint("[v]ersion is not compatible with this framework");
} else if (loc_base_minor == -1) {
// We use the first version from our loc file (usually en-US) as our base
// as it should always be the most up to date.
loc_base_minor = lcmd->unum[1];
loc_base_micro = lcmd->unum[0];
version_line_nr = loc_line_nr;
} else if (lcmd->unum[1] < loc_base_minor) {
luprintf("the version of this locale is incompatible with this version of " APPLICATION_NAME " and MUST be updated to at least v%d.%d.0",
LOC_FRAMEWORK_VERSION, loc_base_minor);
} else {
if (lcmd->unum[2] < loc_base_micro) {
luprintf("the version of this translation is older than the base one and may result in some messages not being properly translated.\n"
"If you are the translator, please update your translation with the changes that intervened between v%d.%d.%d and v%d.%d.%d.\n"
"See https://github.com/pbatard/rufus/blob/master/res/localization/ChangeLog.txt",
LOC_FRAMEWORK_VERSION, loc_base_minor, lcmd->unum[2], LOC_FRAMEWORK_VERSION, loc_base_minor, loc_base_micro);
}
version_line_nr = loc_line_nr;
}
free_loc_cmd(lcmd);
break;
}
lcmd->num[0] = (int32_t)ftell(fd);
// 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);
if (last_lcmd != NULL) {
if (version_line_nr == 0) {
uprintf("localization: no compatible version was found - this locale will be ignored\n");
list_del(&last_lcmd->list);
free_loc_cmd(last_lcmd);
} else {
last_lcmd->num[1] = (int32_t)ftell(fd);
}
}
r = !list_empty(&locale_list);
if (r == FALSE)
uprintf("localization: '%s' contains no locale sections\n", filename);
uprintf("localization: '%s' contains no valid locale sections\n", filename);
out:
if (fd != NULL)

View File

@ -2033,7 +2033,9 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
if ( (!get_supported_locales(loc_file))
|| ((selected_locale = ((locale_name == NULL)?get_locale_from_lcid(lcid, TRUE):get_locale_from_name(locale_name, TRUE))) == NULL) ) {
uprintf("FATAL: Could not access locale!\n");
MessageBoxU(NULL, "The locale data is missing. This application will now exit.",
MessageBoxU(NULL, "The locale data is missing or invalid. This application will now exit."
// TODO: remove this line for release!
"\n\nTRANSLATORS: You need to add a 'v 1.0.0' line to your loc file. See the latest 'new_translation.loc'",
"Fatal error", MB_ICONSTOP);
goto out;
}

View File

@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 206, 329
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "Rufus v1.4.0.299"
CAPTION "Rufus v1.4.0.300"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "Start",IDC_START,94,291,50,14
@ -285,8 +285,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,4,0,299
PRODUCTVERSION 1,4,0,299
FILEVERSION 1,4,0,300
PRODUCTVERSION 1,4,0,300
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -303,13 +303,13 @@ BEGIN
BEGIN
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "1.4.0.299"
VALUE "FileVersion", "1.4.0.300"
VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011-2013 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
VALUE "OriginalFilename", "rufus.exe"
VALUE "ProductName", "Rufus"
VALUE "ProductVersion", "1.4.0.299"
VALUE "ProductVersion", "1.4.0.300"
END
END
BLOCK "VarFileInfo"