in src/main/cpp/launcher/windows/src/ExtractUtils.c [444:541]
void loadI18NStrings(LauncherProperties * props) {
DWORD i=0;
DWORD j=0;
//read number of locales
DWORD numberOfLocales = 0;
DWORD numberOfProperties = 0;
readNumberWithDebug(props, &numberOfLocales, "number of locales");
if(!isOK(props)) return;
if(numberOfLocales==0) {
props->status = ERROR_INTEGRITY;
return ;
}
readNumberWithDebug( props, &numberOfProperties, "i18n properties");
if(!isOK(props)) return;
if(numberOfProperties==0) {
props->status = ERROR_INTEGRITY;
return ;
}
props->i18nMessages = (I18NStrings * ) LocalAlloc(LPTR, sizeof(I18NStrings) * numberOfProperties);
props->I18N_PROPERTIES_NUMBER = numberOfProperties;
props->i18nMessages->properties = newppChar(props->I18N_PROPERTIES_NUMBER);
props->i18nMessages->strings = newppWCHAR(props->I18N_PROPERTIES_NUMBER);
for(i=0; isOK(props) && i<numberOfProperties;i++) {
// read property name as ASCII
char * propName = NULL;
char * number = DWORDtoCHARN(i,2);
props->i18nMessages->properties[i] = NULL;
props->i18nMessages->strings[i] = NULL;
propName = appendString(NULL, "property name ");
propName = appendString(propName, number);
FREE(number);
readStringWithDebugA(props, & (props->i18nMessages->properties[i]), propName);
FREE(propName);
}
if(isOK(props)) {
DWORD isLocaleMatches;
WCHAR * localeName;
WCHAR * currentLocale = getLocaleName();
writeMessageA(props, OUTPUT_LEVEL_DEBUG, 0, "Current System Locale : ", 0);
writeMessageW(props, OUTPUT_LEVEL_DEBUG, 0, currentLocale, 1);
if(props->userDefinedLocale!=NULL) { // using user-defined locale via command-line parameter
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "[CMD Argument] Try to use locale ", 0);
writeMessageW(props, OUTPUT_LEVEL_NORMAL, 0, props->userDefinedLocale, 1);
FREE(currentLocale);
currentLocale = appendStringW(NULL, props->userDefinedLocale);
}
for(j=0;j<numberOfLocales;j++) { // for all locales in file...
// read locale name as UNICODE ..
// it should be like en_US or smth like that
localeName = NULL;
readStringWithDebugW(props, &localeName, "locale name");
if(!isOK(props)) break;
isLocaleMatches = (localeName==NULL) ? 1 :
searchW(currentLocale, localeName) != NULL;
//read properties names and value
for(i=0;i<numberOfProperties;i++) {
// read property value as UNICODE
WCHAR * value = NULL;
char * s1 = DWORDtoCHAR(i + 1);
char * s2 = DWORDtoCHAR(numberOfProperties);
char * s3 = appendString(NULL , "value ");
s3 = appendString(s3 , s1);
s3 = appendString(s3, "/");
s3 = appendString(s3, s2);
FREE(s1);
FREE(s2);
readStringWithDebugW(props, &value, s3);
FREE(s3);
if(!isOK(props)) break;
if(isLocaleMatches) {
//it is a know property
FREE(props->i18nMessages->strings[i]);
props->i18nMessages->strings[i] = appendStringW(NULL, value);
}
FREE(value);
}
FREE(localeName);
}
FREE(currentLocale);
}
}