/* ** 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 . */ // // 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; }