1674 lines
31 KiB
C++
Raw Permalink Normal View History

/*
** Command & Conquer Generals Zero Hour(tm)
** Copyright 2025 Electronic Arts Inc.
**
** 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/>.
*/
//
// expimp.cpp
//
#include "stdAfx.h"
#include "transDB.h"
#include "XLStuff.h"
#include "Babylondlg.h"
#include "VerifyTextDlg.h"
#include "Babylon.h"
#include "expimp.h"
#include "direct.h"
#include "fileops.h"
#include "olestring.h"
static char buffer[100*1024];
static char buffer2[100*1024];
static OLECHAR olebuf[100*1024];
static OLECHAR olebuf2[100*1024];
static OLECHAR oletrans[100*1024];
static CBabylonDlg *progress_dlg;
static int progress_count;
static void progress_cb ( void )
{
progress_count ++;
if ( progress_dlg )
{
progress_dlg->SetProgress ( progress_count );
}
}
static FILE *cb_file;
static void print_to_file ( const char *text )
{
fprintf ( cb_file, "\t\t\tString %s\n", text );
}
static void reverseWord ( OLECHAR *fp, OLECHAR *lp )
{
int first = TRUE;
OLECHAR f, l;
while ( TRUE )
{
if ( fp >= lp )
{
return;
}
f = *fp;
l = *lp;
if ( first )
{
if ( f >= 'A' && f <= 'Z' )
{
if ( l >= 'a' && l <= 'z' )
{
f = (f - 'A') + 'a';
l = (l - 'a') + 'A';
}
}
first = FALSE;
}
*lp-- = f;
*fp++ = l;
}
}
static void translateCopy( OLECHAR *outbuf, OLECHAR *inbuf )
{
int slash = FALSE;
{
static OLECHAR buffer[100*1024];
OLECHAR *firstLetter = NULL, *lastLetter;
OLECHAR *b = buffer;
int formatWord = FALSE;
OLECHAR ch;
while ( (ch = *inbuf++))
{
if ( ! (( ch >= 'a' && ch <= 'z') || ( ch >= 'A' && ch <= 'Z' )))
{
if ( firstLetter )
{
if ( !formatWord )
{
lastLetter = b-1;
reverseWord ( firstLetter, lastLetter );
}
firstLetter = NULL;
formatWord = FALSE;
}
*b++ = ch;
if ( ch == '\\' )
{
*b++ = *inbuf++;
}
if ( ch == '%' )
{
while ( (ch = *inbuf++) && !IsFormatTypeChar ( ch ) && ch != '%')
{
*b++ = ch;
}
*b++ = ch;
}
}
else
{
if ( !firstLetter )
{
firstLetter = b;
}
*b++ = ch;
}
}
if ( firstLetter )
{
lastLetter = b-1;
reverseWord ( firstLetter, lastLetter );
}
*b++ = 0;
inbuf = buffer;
}
while( *inbuf != '\0' )
{
*outbuf++ = *inbuf++;
}
*outbuf= 0;
}
static void writeLabel ( BabylonLabel *label, int row )
{
PutCell ( row, CELL_LABEL, label->Name (), 0);
wcscpy ( olebuf, label->Comment());
EncodeFormat ( olebuf );
PutCell ( row, CELL_COMMENT, olebuf, 0);
wcscpy ( olebuf, label->Context());
EncodeFormat ( olebuf );
PutCell ( row, CELL_CONTEXT, olebuf, 0);
wcscpy ( olebuf, label->Speaker());
EncodeFormat ( olebuf );
PutCell ( row, CELL_SPEAKER, olebuf, 0);
wcscpy ( olebuf, label->Listener());
EncodeFormat ( olebuf );
PutCell ( row, CELL_LISTENER, olebuf , 0);
}
static void writeText ( BabylonText *text, int row )
{
BabylonLabel *label = text->Label ();
int maxlen = label->MaxLen ();
OLECHAR buffer[100];
if ( !maxlen )
{
maxlen = 10000;
}
wcscpy ( olebuf, text->Get());
EncodeFormat ( olebuf );
PutCell ( row, CELL_ENGLISH, olebuf , 0);
PutCell ( row, CELL_MAXLEN, NULL , maxlen );
swprintf ( buffer, L"=LEN(%c%d)",'A' + CELL_LOCALIZED -1, row );
PutCell ( row, CELL_STRLEN, buffer , 0);
swprintf ( buffer, L"=IF(%c%d>%c%d,\"Too long!\",\" \")", 'A' + CELL_STRLEN -1, row, 'A' + CELL_MAXLEN -1, row );
PutCell ( row, CELL_LENCHECK ,buffer , 0);
PutCell ( row, CELL_REVISION , 0, text->Revision ());
PutCell ( row, CELL_STRINGID , 0, text->ID ());
writeLabel ( label, row );
}
static int export_trans ( TransDB *db, LangID langid, TROPTIONS *options, void (*cb) (void ), int write )
{
BabylonLabel *label;
BabylonText *text;
Translation *trans;
ListSearch sh_label, sh_text;
int count = 0;
int limit = FALSE;
int all = TRUE;
int row;
LANGINFO *linfo;
linfo = GetLangInfo ( langid );
if ( options->filter == TR_SAMPLE )
{
limit = TRUE;
}
else if ( options->filter == TR_CHANGES )
{
all = FALSE;
}
if ( write )
{
OLECHAR buffer[100];
swprintf ( buffer, L"%S", GetLangName ( langid ));
PutCell ( ROW_LANGUAGE, COLUMN_LANGUAGE,buffer,0);
swprintf ( buffer, L"%S Translation", GetLangName ( langid ));
PutCell ( 2, CELL_LOCALIZED,buffer,0);
}
row = 3;
label = db->FirstLabel ( sh_label );
while ( label )
{
int label_written = FALSE;
text = label->FirstText ( sh_text );
while ( text )
{
int export;
int bad_format = FALSE;
int too_long = FALSE;
trans = text->GetTranslation ( langid );
if ( options->filter == TR_UNSENT )
{
export = !text->IsSent ();
}
else if ( options->filter == TR_NONDIALOG )
{
export = !text->IsDialog ();
}
else if ( options->filter == TR_UNVERIFIED )
{
export = text->IsDialog() && text->DialogIsPresent( DialogPath, langid) && !text->DialogIsValid( DialogPath, langid);
}
else if ( options->filter == TR_MISSING_DIALOG )
{
export = text->IsDialog() && !text->DialogIsPresent( DialogPath, langid);
}
else if ( options->filter == TR_DIALOG )
{
export = text->IsDialog ();
}
else
{
if ( ! (export = all) )
{
if ( !trans )
{
export = TRUE;
}
else
{
if ( text->Revision () > trans->Revision ())
{
export = TRUE;
}
else if ( trans->TooLong ( label->MaxLen ()) )
{
export = TRUE;
too_long = TRUE;
}
else if ( !trans->ValidateFormat ( text ) )
{
export = TRUE;
bad_format = TRUE;
}
}
}
}
if ( export && text->Len () )
{
count++;
if ( cb )
{
cb ();
}
if ( write )
{
static OLECHAR buffer[100*1024];
if ( !label_written )
{
// write out the lable
//PutSeparator ( row++ );
//writeLabel ( label, row );
label_written = TRUE;
}
// write out text
writeText ( text, row );
if ( text->IsDialog ())
{
swprintf ( buffer, L"%s%S.wav", text->Wave (), linfo->character );
wcsupr ( buffer );
PutCell ( row, CELL_WAVEFILE , buffer, 0);
}
{
Translation *trans = text->GetTranslation ( langid );
if ( langid == LANGID_JABBER || (trans && ( options->include_translations || too_long || bad_format )))
{
if ( langid == LANGID_JABBER )
{
translateCopy ( olebuf, text->Get() );
}
else
{
wcscpy ( olebuf, trans->Get());
}
EncodeFormat ( olebuf );
PutCell ( row, CELL_LOCALIZED, olebuf, 0);
if ( bad_format || too_long)
{
wcscpy ( olebuf, L"ERROR: " );
if ( too_long )
{
wcscat ( olebuf, L"too long" );
if ( bad_format )
{
wcscat ( olebuf, L"and " );
}
}
if ( bad_format )
{
wcscat ( olebuf, L"bad format" );
}
PutCell ( row, CELL_COMMENT, olebuf , 0);
}
}
}
row++;
}
}
text = label->NextText ( sh_text );
}
if ( limit && count > 50 )
{
break;
}
label = db->NextLabel ( sh_label );
}
if ( write )
{
PutCell ( row, CELL_STRINGID, NULL, -1 );
PutCell ( ROW_COUNT, COLUMN_COUNT, NULL, count );
}
return count;
}
int ExportTranslations ( TransDB *db, const char *filename, LangID langid, TROPTIONS *options, CBabylonDlg *dlg )
{
int exports ;
exports = export_trans ( db, langid, options, NULL, FALSE );
if ( !exports )
{
if ( dlg )
{
AfxMessageBox ( "Nothing to export." );
dlg->Ready ();
}
return 0;
}
if ( (progress_dlg = dlg) )
{
char *format;
dlg->InitProgress ( exports );
dlg->Log ("");
switch (options->filter )
{
case TR_ALL:
format = "Exporting all strings";
break;
case TR_CHANGES:
format = "Exporting all strings that require %s translation";
break;
case TR_SAMPLE:
format = "Exporting a sample %s translation file";
break;
case TR_DIALOG:
format = "Exporting dialog only %s translation file";
break;
case TR_NONDIALOG:
format = "Exporting non-dialog %s translation file";
break;
case TR_UNVERIFIED:
format = "Exporting all unverified %s dialog";
break;
case TR_MISSING_DIALOG:
format = "Exporting all missing %s dialog";
break;
default:
format = "Undefined switch";
break;
}
strcpy ( buffer2, format );
if ( options->include_comments && options->include_translations )
{
strcat ( buffer2, " with current %s translations and translator comments" );
}
else if ( options->include_comments )
{
strcat ( buffer2, " with %s translator comments" );
}
else if ( options->include_translations )
{
strcat ( buffer2, " with current %s translations" );
}
strcat ( buffer2, "..." );
sprintf ( buffer, buffer2, GetLangName ( langid ), GetLangName ( langid ) );
dlg->Status ( buffer );
}
_getcwd ( buffer, sizeof ( buffer ) -1 );
strcat ( buffer, "\\babylon.xlt" );
if ( !FileExists ( buffer ) )
{
if ( dlg )
{
dlg->Log ("FAILED", SAME_LINE );
sprintf ( buffer2, "Template file \"%s\" is missing. Cannot export.", buffer );
AfxMessageBox ( buffer2 );
dlg->Log ( buffer2 );
dlg->Ready();
}
return -1;
}
progress_count = 0;
exports = -1;
if ( NewWorkBook ( buffer ) )
{
if ( (exports = export_trans ( db, langid, options, progress_cb, TRUE )) != -1 )
{
if ( SaveWorkBook ( filename, TRUE ) )
{
if ( dlg )
{
dlg->Log ("DONE", SAME_LINE );
}
}
else
{
if ( dlg )
{
dlg->Log ("FAILED", SAME_LINE );
sprintf ( buffer2, "Failed to save export!");
AfxMessageBox ( buffer2 );
dlg->Log ( buffer2 );
}
exports = -1;
}
}
CloseWorkBook ( );
}
else
{
if ( dlg )
{
dlg->Log ("FAILED", SAME_LINE );
sprintf ( buffer2, "Failed to create new work book. File \"%s\" may be corrupt", buffer );
AfxMessageBox ( buffer2 );
dlg->Log ( buffer2 );
}
}
if ( dlg )
{
dlg->Ready();
}
return exports;
}
static int import_trans ( TransDB *db, LangID langid, void (*cb) ( void ), CBabylonDlg *dlg )
{
int row = 3;
int id;
int count = 0;
int new_count = 0;
int changes_count = 0;
int missing_count = 0;
int mismatch_count = 0;
int stale_count = 0;
int first_mismatch = TRUE;
int bad_id = FALSE;
int error_count = 0;
int revision;
while ( (id = GetInt ( row, CELL_STRINGID )) != -1)
{
if ( id == 0 )
{
goto skip;
}
BabylonText *text;
if ( (text = db->FindText ( id )) == NULL )
{
// string is no longer in database
stale_count++;
goto next;
}
revision = GetInt ( row, CELL_REVISION );
if ( text->Revision() > revision )
{
// old translation
stale_count++;
goto next;
}
if ( text->Revision() < revision )
{
if ( dlg )
{
sprintf ( buffer, "ERROR: expecting revision %d for string ID %d but found revision %d. Possible bad ID!", text->Revision (), id, revision );
dlg->Log ( buffer );
}
error_count++;
goto next;
}
// first see if there is any translation there
GetString ( row, CELL_LOCALIZED, oletrans );
DecodeFormat ( oletrans );
if ( !oletrans[0] )
{
missing_count++;
goto next;
}
// verify that the translated engish is the same as the current english
GetString ( row, CELL_ENGLISH, olebuf );
DecodeFormat ( olebuf );
if ( wcscmp ( text->Get(), olebuf ) )
{
// they are two possible reasons for the text to mismatch
// 1. text was modified but not re-translated
// 2. the IDs are wrong
//
// to check for the first case we search for the label in the xl file
// and make sure it is the same. If not then we have problems
int nrow = row;
olebuf2[0] = 0;
while ( nrow > 0 )
{
GetString ( nrow, CELL_LABEL, olebuf2 );
if ( olebuf2[0] )
{
break;
}
nrow--;
}
if ( !olebuf2[0] || wcscmp ( text->Label ()->Name(), olebuf2))
{
sprintf ( buffer, "%S", olebuf );
CVerifyTextDlg dlg(buffer, text->GetSB());
// didnt find label or label doesn't match
// It is possible that the xl was resorted so ask user to do a visual confirmation
bad_id = dlg.DoModal ()==IDNO;
}
else if ( text->Label()->FindText( olebuf ))
{
// we did find the label but text other than the current ID sourced text matches with the import text
// this means the ID is definitely wrong
bad_id = TRUE;
}
else
{
bad_id = FALSE;
}
if ( bad_id )
{
goto done;
}
}
// ok import the translation
Translation *trans;
if ( ! (trans = text->GetTranslation ( langid )))
{
new_count++;
trans = new Translation ();
trans->SetLangID ( langid );
text->AddTranslation ( trans );
}
if ( trans->Revision () == revision && !wcscmp ( trans->Get (), oletrans ))
{
// already up to date
goto next;
}
trans->Set ( oletrans );
trans->WaveInfo.SetValid ( FALSE );
trans->SetRevision ( revision );
changes_count++;
next:
count++;
if ( cb )
{
cb ();
}
skip:
row++;
}
done:
if ( dlg )
{
sprintf ( buffer, "Total found : %d", count );
dlg->Log ( buffer );
{
sprintf ( buffer, "New : %d", new_count);
dlg->Log ( buffer );
}
{
sprintf ( buffer, "Updates : %d", (changes_count - new_count));
dlg->Log ( buffer );
}
if ( missing_count )
{
sprintf ( buffer, "Missing : %d", missing_count );
dlg->Log ( buffer );
}
if ( stale_count )
{
sprintf ( buffer, "Unmatched : %d", stale_count);
dlg->Log ( buffer );
}
}
if ( bad_id )
{
if ( dlg )
{
sprintf ( buffer, "Aborting import: BAD IDs");
dlg->Log ( buffer );
}
AfxMessageBox ("The imported translation file has bad string IDs! Fix the string IDs and re-import" );
}
return count;
}
static int update_sent_trans ( TransDB *db, LangID langid, void (*cb) ( void ), CBabylonDlg *dlg )
{
int row = 3;
int id;
int count = 0;
int new_count = 0;
int matched = 0;
int unmatched = 0;
int changed = 0;
int first_mismatch = TRUE;
int bad_id = FALSE;
int error_count = 0;
int revision;
while ( (id = GetInt ( row, CELL_STRINGID )) != -1)
{
if ( id == 0 )
{
goto skip;
}
BabylonText *text;
if ( (text = db->FindText ( id )) == NULL )
{
// string is no longer in database
unmatched++;
goto next;
}
revision = GetInt ( row, CELL_REVISION );
if ( text->Revision() > revision )
{
// old translation
changed++;
goto next;
}
if ( text->Revision() < revision )
{
if ( dlg )
{
sprintf ( buffer, "ERROR: expecting revision %d for string ID %d but found revision %d. Possible bad ID!", text->Revision (), id, revision );
dlg->Log ( buffer );
}
error_count++;
goto next;
}
// verify that the translated engish is the same as the current english
GetString ( row, CELL_ENGLISH, olebuf );
DecodeFormat ( olebuf );
if ( wcscmp ( text->Get(), olebuf ) )
{
// they are two possible reasons for the text to mismatch
// 1. text was modified but not re-translated
// 2. the IDs are wrong
//
// to check for the first case we search for the label in the xl file
// and make sure it is the same. If not then we have problems
int nrow = row;
olebuf2[0] = 0;
while ( nrow > 0 )
{
GetString ( nrow, CELL_LABEL, olebuf2 );
if ( olebuf2[0] )
{
break;
}
nrow--;
}
if ( !olebuf2[0] || wcscmp ( text->Label ()->Name(), olebuf2))
{
sprintf ( buffer, "%S", olebuf );
CVerifyTextDlg dlg(buffer, text->GetSB());
// didnt find label or label doesn't match
// It is possible that the xl was resorted so ask user to do a visual confirmation
bad_id = dlg.DoModal ()==IDNO;
}
else if ( text->Label()->FindText( olebuf ))
{
// we did find the label but text other than the current ID sourced text matches with the import text
// this means the ID is definitely wrong
bad_id = TRUE;
}
else
{
bad_id = FALSE;
}
if ( bad_id )
{
goto done;
}
}
else
{
// text is still the same
text->Sent ( TRUE );
matched++;
}
next:
count++;
if ( cb )
{
cb ();
}
skip:
row++;
}
done:
if ( dlg )
{
sprintf ( buffer, "Total found : %d", count );
dlg->Log ( buffer );
{
sprintf ( buffer, "Matched : %d", matched);
dlg->Log ( buffer );
}
{
sprintf ( buffer, "Unmatched : %d", unmatched);
dlg->Log ( buffer );
}
if ( changed )
{
sprintf ( buffer, "changed : %d", changed);
dlg->Log ( buffer );
}
}
if ( bad_id )
{
if ( dlg )
{
sprintf ( buffer, "Aborting import: BAD IDs");
dlg->Log ( buffer );
}
AfxMessageBox ("The imported translation file has bad string IDs! Fix the string IDs and re-import" );
}
return count;
}
int ImportTranslations ( TransDB *db, const char *filename, CBabylonDlg *dlg )
{
int imports = -1;
progress_dlg = dlg;
if ( dlg )
{
dlg->Log ("");
sprintf ( buffer, "Importing \"%s\"...", filename );
dlg->Status ( buffer );
}
if ( OpenWorkBook ( filename ) )
{
int num_strings;
LANGINFO *info;
num_strings = GetInt ( ROW_COUNT, COLUMN_COUNT );
GetString ( ROW_LANGUAGE, COLUMN_LANGUAGE, olebuf );
sprintf ( buffer, "%S", olebuf );
info = GetLangInfo ( buffer );
if ( !info )
{
if ( dlg )
{
AfxMessageBox ( "Import file is of an unknown language or is not a translation file" );
dlg->Log ( "FAILED", SAME_LINE );
dlg->Ready();
}
CloseWorkBook ();
return -1;
}
if ( dlg )
{
dlg->InitProgress ( num_strings );
progress_count = 0;
sprintf ( buffer, "...%s", info->name );
dlg->Log ( buffer, SAME_LINE );
}
imports = import_trans ( db, info->langid, progress_cb, dlg );
CloseWorkBook ( );
}
else
{
if ( dlg )
{
dlg->Log ("FAILED", SAME_LINE );
sprintf ( buffer2, "Failed to open \"%s\"", buffer );
AfxMessageBox ( buffer2 );
dlg->Log ( buffer2 );
}
}
if ( dlg )
{
dlg->Ready();
}
return imports;
}
static int generate_Babylonstr ( TransDB *db, const char *filename, LangID langid, GNOPTIONS *options )
{
int ok = FALSE;
FILE *file;
if ( ! ( file = fopen ( filename, "wt" ) ))
{
goto error;
}
fprintf ( file, "// Generated by %s\n", AppTitle );
fprintf ( file, "// Generated on %s %s\n\n\n", __DATE__, __TIME__ );
{
BabylonLabel *label;
BabylonText *text;
Translation *trans;
ListSearch sh_label, sh_text;
label = db->FirstLabel ( sh_label );
while ( label )
{
text = label->FirstText ( sh_text );
fprintf ( file, "\n\n%s\n", label->NameSB ());
while ( text )
{
char *string;
trans = text->GetTranslation ( langid );
if ( !trans )
{
if ( langid == LANGID_US )
{
string = text->GetSB ();
}
else
{
if ( text->Len ())
{
if ( options->untranslated == GN_USEIDS )
{
string = buffer2;
sprintf ( string, "%d", text->ID ());
}
else
{
string = text->GetSB();
}
}
else
{
string = "";
}
}
}
else
{
string = trans->GetSB ();
}
if ( text->Len() == 0 )
{
string = "";
}
fprintf ( file, "\"%s\" %s\n", string, text->WaveSB() );
text = label->NextText ( sh_text );
}
fprintf ( file, "END\n" );
label = db->NextLabel ( sh_label );
}
ok = TRUE;
}
error:
if ( file )
{
fclose ( file );
}
return ok;
}
static int writeCSFLabel ( FILE *file, BabylonLabel *label )
{
int id = CSF_LABEL;
int len = strlen ( label->NameSB() );
int strings = label->NumStrings ();
if ( fwrite ( &id, sizeof ( int ), 1, file ) != 1 )
{
return FALSE;
}
if ( fwrite ( &strings, sizeof ( int ), 1, file ) != 1 )
{
return FALSE;
}
if ( fwrite ( &len, sizeof ( int ), 1, file ) != 1 )
{
return FALSE;
}
if ( !len )
{
return FALSE;
}
if ( fwrite ( label->NameSB(), len, 1, file ) != 1 )
{
return FALSE;
}
return TRUE;
}
static int writeCSFString ( FILE *file, OLECHAR *string, char *wave, LANGINFO *linfo )
{
int id = CSF_STRING;
int len ;
int wlen = strlen ( wave );
if ( wlen )
{
id = CSF_STRINGWITHWAVE;
}
wcscpy ( olebuf, string );
StripSpaces ( olebuf );
ConvertMetaChars ( olebuf );
len = wcslen ( olebuf );
{
OLECHAR *ptr = olebuf;
while ( *ptr)
{
*ptr = ~*ptr++;
}
}
if ( fwrite ( &id, sizeof ( int ), 1, file ) != 1 )
{
return FALSE;
}
if ( fwrite ( &len, sizeof ( int ), 1, file ) != 1 )
{
return FALSE;
}
if ( len )
{
if ( fwrite ( olebuf, len*sizeof(OLECHAR), 1, file ) != 1 )
{
return FALSE;
}
}
if ( wlen )
{
wlen++;
if ( fwrite ( &wlen, sizeof ( int ), 1, file ) != 1 )
{
return FALSE;
}
if ( fwrite ( wave, wlen-1, 1, file ) != 1 )
{
return FALSE;
}
if ( fwrite ( linfo->character, 1, 1, file ) != 1 )
{
return FALSE;
}
}
return TRUE;
}
static int generate_csf ( TransDB *db, const char *filename, LangID langid, GNOPTIONS *options )
{
CSF_HEADER header;
int header_size;
int ok = FALSE;
FILE *file;
LANGINFO *linfo = GetLangInfo ( langid);
if ( ! ( file = fopen ( filename, "w+b" ) ))
{
goto error;
}
header.id = CSF_ID;
header.version = CSF_VERSION;
header.skip = 0;
header.num_labels = 0;
header.num_strings = 0;
header.langid = langid;
header_size = sizeof ( header );
fseek ( file, header_size, SEEK_SET );
{
BabylonLabel *label;
BabylonText *text;
Translation *trans;
ListSearch sh_label, sh_text;
label = db->FirstLabel ( sh_label );
while ( label )
{
text = label->FirstText ( sh_text );
if ( !writeCSFLabel ( file, label ) )
{
goto error;
}
header.num_labels++;
while ( text )
{
OLECHAR *string;
trans = text->GetTranslation ( langid );
if ( !trans )
{
if ( langid == LANGID_US )
{
string = text->Get ();
}
else
{
if ( text->Len ())
{
if ( options->untranslated == GN_USEIDS )
{
string = olebuf2;
swprintf ( string, L"%d", text->ID ());
}
else
{
string = text->Get();
}
}
else
{
string = L"";
}
}
}
else
{
string = trans->Get ();
}
if ( !writeCSFString ( file, string, text->WaveSB (), linfo ) )
{
goto error;
}
header.num_strings ++;
text = label->NextText ( sh_text );
}
label = db->NextLabel ( sh_label );
}
fseek ( file, 0, SEEK_SET );
if ( fwrite ( &header, header_size, 1, file ) != 1 )
{
goto error;
}
fseek ( file, 0, SEEK_END );
ok = TRUE;
}
error:
if ( file )
{
fclose ( file );
}
return ok;
}
int GenerateGameFiles ( TransDB *db, const char *filepattern, GNOPTIONS *options, LangID *languages, CBabylonDlg *dlg)
{
static char filename[2*1024];
LangID langid;
int count= 0 ;
int num;
if ( dlg )
{
LangID *temp = languages;
num = 0;
while ( *temp++ != LANGID_UNKNOWN )
{
num++;
}
dlg->Log ( "" );
dlg->Status ( "Generating game files:" );
dlg->InitProgress ( num );
num = 0;
}
while ( (langid = *languages++) != LANGID_UNKNOWN )
{
LANGINFO *info;
TRNREPORT trnreport;
DLGREPORT dlgreport;
int dlgwarning;
int trnwarning;
int done;
info = GetLangInfo ( langid );
sprintf ( filename, "%s_%s.%s", filepattern, info->initials, options->format == GN_BABYLONSTR ? "str" : "csf" );
strlwr ( filename );
if ( dlg )
{
sprintf ( buffer, "Writing: %s - %s...", filename, GetLangName ( langid ));
dlg->Status ( buffer );
dlgwarning = db->ReportDialog ( &dlgreport, langid );
trnwarning = db->ReportTranslations ( &trnreport, langid );
}
if ( options->format == GN_BABYLONSTR )
{
done = generate_Babylonstr ( db, filename, langid, options );
}
else
{
done = generate_csf ( db, filename, langid, options );
}
if ( done )
{
count++;
if ( dlg )
{
if ( trnwarning || dlgwarning )
{
dlg->Log ( "WARNING", SAME_LINE );
if ( trnwarning )
{
int missing;
if ( (missing = trnreport.missing + trnreport.retranslate) )
{
sprintf ( buffer, "%d translation%s missing", missing, missing > 1 ? "s are" : " is" );
dlg->Log ( buffer );
}
if ( trnreport.too_big )
{
sprintf ( buffer, "%d string%s too big", trnreport.too_big, trnreport.too_big > 1 ? "s are" : " is" );
dlg->Log ( buffer );
}
if ( trnreport.bad_format )
{
sprintf ( buffer, "%d translation%s bad format", trnreport.bad_format, trnreport.bad_format > 1 ? "s have a" : " has a" );
dlg->Log ( buffer );
}
}
if ( dlgwarning )
{
if ( dlgreport.missing )
{
sprintf ( buffer, "%d dialog%s missing", dlgreport.missing, dlgreport.missing > 1 ? "s are" : " is" );
dlg->Log ( buffer );
}
if ( dlgreport.unresolved )
{
sprintf ( buffer, "%d dialog%s not verified", dlgreport.unresolved, dlgreport.unresolved> 1 ? "s are" : " is" );
dlg->Log ( buffer );
}
}
}
else
{
dlg->Log ( "OK", SAME_LINE );
}
}
}
else
{
if ( dlg )
{
dlg->Log ( "FAILED", SAME_LINE );
}
}
if ( dlg )
{
dlg->SetProgress ( ++num );
}
}
if ( dlg )
{
dlg->Ready ();
}
return count;
}
void ProcessWaves ( TransDB *db, const char *filename, CBabylonDlg *dlg )
{
int imports = -1;
progress_dlg = dlg;
if ( dlg )
{
dlg->Log ("");
sprintf ( buffer, "Processing wavefile \"%s\"...", filename );
dlg->Status ( buffer );
}
if ( OpenWorkBook ( filename ) )
{
int row = 1;
int last_row = 1;
int matches = 0;
int unmatched = 0;
FILE *file = NULL;
char *ptr;
strcpy ( buffer, filename );
if ( (ptr = strchr ( buffer, '.' )) )
{
*ptr = 0;
}
strcat ( buffer, ".txt" );
if ( (file = fopen (buffer, "wt" )))
{
while ( row - last_row < 1000 )
{
BabylonText *text;
GetString ( row, 'J' - 'A' + 1, olebuf );
wcslwr ( olebuf );
if ( wcsstr ( olebuf, L".wav" ) )
{
last_row = row;
fprintf ( file, "%S : ", olebuf );
GetString ( row, 'K' -'A' + 1, olebuf );
StripSpaces ( olebuf );
if ( (text = db->FindSubText ( olebuf ) ))
{
fprintf ( file, "%6d", text->LineNumber () );
}
else
{
fprintf ( file, "??????" );
}
fprintf ( file, " - \"%S\"\n", olebuf );
}
row++;
}
fclose ( file );
}
CloseWorkBook ( );
}
else
{
if ( dlg )
{
dlg->Log ("FAILED", SAME_LINE );
sprintf ( buffer2, "Failed to open \"%s\"", buffer );
AfxMessageBox ( buffer2 );
dlg->Log ( buffer2 );
}
}
if ( dlg )
{
dlg->Ready();
}
}
int GenerateReport ( TransDB *db, const char *filename, RPOPTIONS *options, LangID *languages, CBabylonDlg *dlg)
{
LangID langid;
int count= 0 ;
int num;
FILE *file = NULL;
if ( dlg )
{
LangID *temp = languages;
num = 0;
while ( *temp++ != LANGID_UNKNOWN )
{
num++;
}
dlg->Log ( "" );
dlg->Status ( "Generating Report:" );
dlg->InitProgress ( num );
num = 0;
}
if ( ! ( file = fopen ( filename, "wt" )))
{
static char buffer[500];
sprintf ( "Unable to open file \"%s\".\n\nCannot create report!", filename);
AfxMessageBox ( buffer );
if ( dlg )
{
dlg->Log ( "FAILED", SAME_LINE );
dlg->Ready ();
}
return 0;
}
cb_file = file;
{
char date[50];
char time[50];
_strtime ( time );
_strdate ( date );
fprintf ( file, "Babylon Report: %s %s\n", date, time);
}
while ( (langid = *languages++) != LANGID_UNKNOWN )
{
LANGINFO *info;
TRNREPORT tr_report;
DLGREPORT dlg_report;
info = GetLangInfo ( langid );
fprintf ( file, "\n\n%s Status:\n", info->name );
if ( options->translations )
{
int count;
count = db->ReportTranslations ( &tr_report, langid );
fprintf ( file, "\n\tText Summary: %s\n", info->name );
fprintf ( file, "\t-------------\n\n");
fprintf ( file, "\t\tErrors: %d\n", tr_report.errors);
if ( langid != LANGID_US )
{
fprintf ( file, "\t\tNot translated: %d\n", tr_report.missing);
fprintf ( file, "\t\tRetranslation: %d\n", tr_report.retranslate);
fprintf ( file, "\t\tTranslated: %d\n", tr_report.translated );
}
fprintf ( file, "\t\tTotal text: %d\n", tr_report.numstrings );
if ( count && count < options->limit )
{
fprintf ( file, "\n\tText Details: %s\n", info->name);
fprintf ( file, "\t------------\n\n" );
db->ReportTranslations ( &tr_report, langid, print_to_file );
}
}
if ( options->dialog )
{
int count;
count = db->ReportDialog ( &dlg_report, langid );
fprintf ( file, "\n\tDialog Summary: %s\n", info->name );
fprintf ( file, "\t-------------\n\n");
fprintf ( file, "\t\tMissing Audio: %d\n", dlg_report.missing);
fprintf ( file, "\t\tNot verified: %d\n", dlg_report.unresolved);
fprintf ( file, "\t\tVerified: %d\n", dlg_report.resolved);
fprintf ( file, "\t\tTotal dialog: %d\n", dlg_report.numdialog );
if ( count && count < options->limit )
{
fprintf ( file, "\n\tDialog Details: %s\n", info->name );
fprintf ( file, "\t------------\n\n" );
db->ReportDialog ( &dlg_report, langid, print_to_file );
}
}
if ( dlg )
{
dlg->SetProgress ( ++num );
}
}
if ( dlg )
{
dlg->Ready ();
}
fclose ( file );
return count;
}
int UpdateSentTranslations ( TransDB *db, const char *filename, CBabylonDlg *dlg )
{
int imports = -1;
progress_dlg = dlg;
if ( dlg )
{
dlg->Log ("");
sprintf ( buffer, "Importing \"%s\"...", filename );
dlg->Status ( buffer );
}
if ( OpenWorkBook ( filename ) )
{
int num_strings;
LANGINFO *info;
num_strings = GetInt ( ROW_COUNT, COLUMN_COUNT );
GetString ( ROW_LANGUAGE, COLUMN_LANGUAGE, olebuf );
sprintf ( buffer, "%S", olebuf );
info = GetLangInfo ( buffer );
if ( !info )
{
if ( dlg )
{
AfxMessageBox ( "Import file is of an unknown language or is not a translation file" );
dlg->Log ( "FAILED", SAME_LINE );
dlg->Ready();
}
CloseWorkBook ();
return -1;
}
if ( dlg )
{
dlg->InitProgress ( num_strings );
progress_count = 0;
sprintf ( buffer, "...%s", info->name );
dlg->Log ( buffer, SAME_LINE );
}
imports = update_sent_trans ( db, info->langid, progress_cb, dlg );
CloseWorkBook ( );
}
else
{
if ( dlg )
{
dlg->Log ("FAILED", SAME_LINE );
sprintf ( buffer2, "Failed to open \"%s\"", buffer );
AfxMessageBox ( buffer2 );
dlg->Log ( buffer2 );
}
}
if ( dlg )
{
dlg->Ready();
}
return imports;
}