passage/minorGems/util/TranslationManager.h
2025-10-03 02:19:59 -04:00

203 lines
5.1 KiB
C++

/*
* Modification History
*
* 2004-October-7 Jason Rohrer
* Created.
* Copied structure from SettingsManager.
*
* 2006-February-19 Jason Rohrer
* Fixed an inconsistency in memory management.
*
* 2008-September-17 Jason Rohrer
* Support for setting language data directly.
*
* 2010-May-14 Jason Rohrer
* String parameters as const to fix warnings.
*/
#include "minorGems/common.h"
#ifndef TRANSLATION_MANAGER_INCLUDED
#define TRANSLATION_MANAGER_INCLUDED
#include "minorGems/util/SimpleVector.h"
// utility class for dealing with static member dealocation
class TranslationManagerStaticMembers;
/**
* Class that manages natural language translation of user interface strings.
*
* @author Jason Rohrer
*/
class TranslationManager {
public:
/**
* Sets the directory name where translation files are stored.
* Defaults to "languages".
*
* @param inName the name of the directory (relative to the
* program's working directory).
* Must be destroyed by caller.
*/
static void setDirectoryName( const char *inName );
/**
* Gets the directory name where translation files are stored.
*
* @return the name of the directory (relative to the
* program's working directory).
* Must be destroyed by caller.
*/
static char *getDirectoryName();
/**
* Gets a list of available languages.
*
* @param outNumLanguages pointer to where the number of languages
* should be returned.
*
* @return an array of language names.
* Array and the strings it contains must be destroyed by caller.
*/
static char **getAvailableLanguages( int *outNumLanguages );
/**
* Sets the natural language to translate keys into.
* Defaults to "English".
*
* @param inLanguageName the name of the language.
* This name, when .txt is appended, is the name of
* the translation file. Thus, setLanguage( "English" ) would
* select the English.txt language file.
* Language names must not contain spaces.
* Must be destroyed by caller.
*/
static void setLanguage( const char *inLanguageName );
// Sets the language data directly without reading it from
// the file system.
// Data string formated the same as a language file.
// Data string destroyed by caller
static void setLanguageData( const char *inData );
/**
* Gets the natural language translation of a key.
*
* NOTE: if a translation does not exist for the key, the key
* itself will be returned. (A copy of the key is returned, so
* the original key passed in to translate can be destroyed by caller
* if needed).
*
* @param inTranslationKey the translation key string.
* Must be destroyed by caller if non-const.
*
* @return the translated natural language string.
* The string MUST NOT be destroyed by the caller, as it will
* be destroyed by this class upon program termination.
*
* This specification allows the translate function to be used
* inline, whether or not a correct translation exists. Thus <PRE>
*
* printf( "%s", translate( myKey ) );
* delete [] myKey;
* </PRE>
*
* will always be correct, whether or not a translation exists, as
* will <PRE>
*
* printf( "%s", translate( "MY_KEY" ) );
* </PRE>
*/
static const char *translate( const char *inTranslationKey );
protected:
static TranslationManagerStaticMembers mStaticMembers;
};
/**
* Container for static members to allow for their proper destruction
* on program termination.
*
* @author Jason Rohrer
*/
class TranslationManagerStaticMembers {
public:
TranslationManagerStaticMembers();
~TranslationManagerStaticMembers();
/**
* Sets the directory name and language name to use, and reads
* the translation table from file.
*
* @param inDirectoryName the directory name.
* Must be destroyed by caller.
* @param inLanguageName the language name.
* Must be destroyed by caller.
*/
void setDirectoryAndLanguage( const char *inDirectoryName,
const char *inLanguageName );
// sets the data from a string
// string contains same contents as a language file
// string destroyed by caller
void setTranslationData( const char *inData );
char *mDirectoryName;
char *mLanguageName;
// vectors mapping keys to strings
SimpleVector<char *> *mTranslationKeys;
SimpleVector<char *> *mNaturalLanguageStrings;
};
#endif