void Trans_SetLanguage( const char* lang ) { Language requestLang = Language::from_env( std::string( lang ) ); // default to english Language bestLang = Language::from_env( "en" ); int bestScore = Language::match( requestLang, bestLang ); std::set<Language> langs = trans_manager.get_languages(); for( std::set<Language>::iterator i = langs.begin(); i != langs.end(); i++ ) { int score = Language::match( requestLang, *i ); if( score > bestScore ) { bestScore = score; bestLang = *i; } } // language not found, display warning if( bestScore == 0 ) { Com_Printf( S_WARNING "Language \"%s\" (%s) not found. Default to \"English\" (en)\n", requestLang.get_name().empty() ? "Unknown Language" : requestLang.get_name().c_str(), lang ); } trans_manager.set_language( bestLang ); trans_managergame.set_language( bestLang ); Com_Printf( _( "Set language to %s\n" ), bestLang.get_name().c_str() ); }
/* ==================== Trans_ReturnLanguage Return a loaded language. If desired language is not found, return closest match. If no languages are close, force English. ==================== */ Language Trans_ReturnLanguage( const char *lang ) { int bestScore = 0; Language bestLang, language = Language::from_env( std::string( lang ) ); std::set<Language> langs = trans_manager.get_languages(); for( std::set<Language>::iterator i = langs.begin(); i != langs.end(); i++ ) { int score = Language::match( language, *i ); if( score > bestScore ) { bestScore = score; bestLang = *i; } } // Return "en" if language not found if( !bestLang ) { Com_Printf( _("^3WARNING:^7 Language \"%s\" (%s) not found. Default to \"English\" (en)\n"), language.get_name().empty() ? _("Unknown Language") : language.get_name().c_str(), lang ); bestLang = Language::from_env( "en" ); } return bestLang; }
/* ============ Trans_Init ============ */ void Trans_Init( void ) { char langList[ MAX_TOKEN_CHARS ] = ""; char encList[ MAX_TOKEN_CHARS ] = ""; std::set<Language> langs; Language lang; Cmd_AddCommand( "updatelanguage", Trans_UpdateLanguage_f ); language = Cvar_Get( "language", "", CVAR_ARCHIVE ); trans_debug = Cvar_Get( "trans_debug", "0", CVAR_ARCHIVE ); trans_languages = Cvar_Get( "trans_languages", "", CVAR_ROM ); trans_encodings = Cvar_Get( "trans_encodings", "", CVAR_ROM ); // set tinygettext log callbacks Log::set_log_error_callback( &Trans_Error ); Log::set_log_warning_callback( &Trans_Warning ); Log::set_log_info_callback( &Trans_Info ); trans_manager.set_filesystem( std::auto_ptr<FileSystem>( new DaemonFileSystem ) ); trans_managergame.set_filesystem( std::auto_ptr<FileSystem>( new DaemonFileSystem ) ); trans_manager.add_directory( "translation/client" ); trans_managergame.add_directory( "translation/game" ); langs = trans_manager.get_languages(); for( std::set<Language>::iterator p = langs.begin(); p != langs.end(); p++ ) { Q_strcat( langList, sizeof( langList ), va( "\"%s\" ", p->get_name().c_str() ) ); Q_strcat( encList, sizeof( encList ), va( "\"%s%s%s\" ", p->get_language().c_str(), p->get_country().c_str()[0] ? "_" : "", p->get_country().c_str() ) ); } Cvar_Set( "trans_languages", langList ); Cvar_Set( "trans_encodings", encList ); Com_Printf( P_( "Loaded %u language\n", "Loaded %u languages\n", langs.size() ), ( int )langs.size() ); }
/* ============ Trans_Init ============ */ extern "C" void Trans_Init( void ) { char langList[ MAX_TOKEN_CHARS ] = ""; char encList[ MAX_TOKEN_CHARS ] = ""; FL_Locale *locale; std::set<Language> langs; Language lang; Cmd_AddCommand( "updatelanguage", Trans_UpdateLanguage_f ); language = Cvar_Get( "language", "", CVAR_ARCHIVE ); trans_debug = Cvar_Get( "trans_debug", "0", CVAR_ARCHIVE ); trans_languages = Cvar_Get( "trans_languages", "", CVAR_ROM ); trans_encodings = Cvar_Get( "trans_encodings", "", CVAR_ROM ); // set tinygettext log callbacks Log::set_log_error_callback( &Trans_Error ); Log::set_log_warning_callback( &Trans_Warning ); Log::set_log_info_callback( &Trans_Info ); trans_manager.set_filesystem( std::auto_ptr<FileSystem>( new DaemonFileSystem ) ); trans_managergame.set_filesystem( std::auto_ptr<FileSystem>( new DaemonFileSystem ) ); trans_manager.add_directory( "translation/client" ); trans_managergame.add_directory( "translation/game" ); langs = trans_manager.get_languages(); for( std::set<Language>::iterator p = langs.begin(); p != langs.end(); p++ ) { Q_strcat( langList, sizeof( langList ), va( "\"%s\" ", p->get_name().c_str() ) ); Q_strcat( encList, sizeof( encList ), va( "\"%s%s%s\" ", p->get_language().c_str(), p->get_country().c_str()[0] ? "_" : "", p->get_country().c_str() ) ); } Cvar_Set( "trans_languages", langList ); Cvar_Set( "trans_encodings", encList ); // Only detect locale if no previous language set. if( !language->string[0] ) { FL_FindLocale( &locale, FL_MESSAGES ); // Invalid or not found. Just use builtin language. if( !locale->lang || !locale->lang[0] || !locale->country || !locale->country[0] ) { Cvar_Set( "language", "en" ); } else { Cvar_Set( "language", va( "%s%s%s", locale->lang, locale->country[0] ? "_" : "", locale->country ) ); } FL_FreeLocale( &locale ); } Trans_SetLanguage( language->string ); Com_Printf( P_( "Loaded %u language\n", "Loaded %u languages\n", langs.size() ), ( int )langs.size() ); }
/* ============ Trans_Init ============ */ extern "C" void Trans_Init( void ) { char **poFiles, langList[ MAX_TOKEN_CHARS ] = "", encList[ MAX_TOKEN_CHARS ] = ""; int numPoFiles, i; FL_Locale *locale; std::set<Language> langs; Language lang; language = Cvar_Get( "language", "", CVAR_ARCHIVE ); language_debug = Cvar_Get( "language_debug", "0", CVAR_ARCHIVE ); trans_languages = Cvar_Get( "trans_languages", "", CVAR_ROM ); trans_encodings = Cvar_Get( "trans_languages", "", CVAR_ROM ); // Only detect locale if no previous language set. if( !language->string[0] ) { FL_FindLocale( &locale, FL_MESSAGES ); // Invalid or not found. Just use builtin language. if( !locale->lang || !locale->lang[0] || !locale->country || !locale->country[0] ) { Cvar_Set( "language", "en" ); } else { Cvar_Set( "language", va( "%s%s%s", locale->lang, locale->country[0] ? "_" : "", locale->country ) ); } } poFiles = FS_ListFiles( "translation/client", ".po", &numPoFiles ); // This assumes that the filenames in both folders are the same for( i = 0; i < numPoFiles; i++ ) { int ret; char *buffer, language[ 6 ]; if( FS_ReadFile( va( "translation/client/%s", poFiles[ i ] ), ( void ** ) &buffer ) > 0 ) { COM_StripExtension2( poFiles[ i ], language, sizeof( language ) ); std::stringstream ss( buffer ); trans_manager.add_po( poFiles[ i ], ss, Language::from_env( std::string( language ) ) ); FS_FreeFile( buffer ); } else { Com_Printf(_( "^1ERROR: Could not open client translation: %s\n"), poFiles[ i ] ); } if( FS_ReadFile( va( "translation/game/%s", poFiles[ i ] ), ( void ** ) &buffer ) > 0 ) { COM_StripExtension2( poFiles[ i ], language, sizeof( language ) ); std::stringstream ss( buffer ); trans_managergame.add_po( poFiles[ i ], ss, Language::from_env( std::string( language ) ) ); FS_FreeFile( buffer ); } else { Com_Printf(_( "^1ERROR: Could not open game translation: %s\n"), poFiles[ i ] ); } } FS_FreeFileList( poFiles ); langs = trans_manager.get_languages(); for( std::set<Language>::iterator p = langs.begin(); p != langs.end(); p++ ) { Q_strcat( langList, sizeof( langList ), va( "\"%s\" ", p->get_name().c_str() ) ); Q_strcat( encList, sizeof( encList ), va( "\"%s%s%s\" ", p->get_language().c_str(), p->get_country().c_str()[0] ? "_" : "", p->get_country().c_str() ) ); } Cvar_Set( "trans_languages", langList ); Cvar_Set( "trans_encodings", encList ); Com_Printf(_( "Loaded %lu language(s)\n"), langs.size() ); Cmd_AddCommand( "updatelanguage", Trans_UpdateLanguage_f ); if( langs.size() ) { lang = Trans_ReturnLanguage( language->string ); trans_dict = trans_manager.get_dictionary( lang ); trans_dictgame = trans_managergame.get_dictionary( lang ); enabled = true; } }