dvander@591: /**
ds@653: * vim: set ts=4 :
ds@1330: * =============================================================================
dvander@1231: * SourceMod
dvander@1231: * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
ds@1330: * =============================================================================
dvander@591: *
ds@1330: * This program is free software; you can redistribute it and/or modify it under
ds@1330: * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330: * Free Software Foundation.
dvander@1231: *
ds@1330: * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
ds@1330: * details.
dvander@1231: *
ds@1330: * You should have received a copy of the GNU General Public License along with
ds@1330: * this program. If not, see .
dvander@1231: *
ds@1330: * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330: * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330: * by the Valve Corporation. You must obey the GNU General Public License in
ds@1330: * all respects for all other code used. Additionally, AlliedModders LLC grants
ds@1330: * this exception to all derivative works. AlliedModders LLC defines further
ds@1330: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330: * or .
dvander@591: *
dvander@591: * Version: $Id$
dvander@591: */
dvander@591:
dvander@591: #ifndef _INCLUDE_SOURCEMOD_TRANSLATOR_H_
dvander@591: #define _INCLUDE_SOURCEMOD_TRANSLATOR_H_
dvander@591:
dvander@591: #include "sm_trie.h"
dvander@591: #include
dvander@591: #include
dvander@591: #include "sm_globals.h"
dvander@591: #include "sm_memtable.h"
dvander@591: #include "ITextParsers.h"
dvander@591:
dvander@591: #define MAX_TRANSLATE_PARAMS 32
dvander@732: #define CORELANG_ENGLISH 0
dvander@591:
dvander@591: /* :TODO: write a templatized version of tries? */
dvander@591:
dvander@591: using namespace SourceHook;
dvander@616: class Translator;
dvander@591:
dvander@591: enum PhraseParseState
dvander@591: {
dvander@591: PPS_None = 0,
dvander@591: PPS_Phrases,
dvander@591: PPS_InPhrase,
dvander@591: };
dvander@591:
dvander@591: struct Language
dvander@591: {
dvander@591: char m_code2[3];
dvander@591: int m_FullName;
dvander@591: };
dvander@591:
dvander@591: struct Translation
dvander@591: {
dvander@591: const char *szPhrase; /**< Translated phrase. */
dvander@591: unsigned int fmt_count; /**< Number of format parameters. */
dvander@591: int *fmt_order; /**< Format phrase order. */
dvander@591: };
dvander@591:
dvander@663: #define LANGUAGE_ENGLISH 0
dvander@663:
dvander@591: enum TransError
dvander@591: {
dvander@591: Trans_Okay = 0,
dvander@591: Trans_BadLanguage = 1,
dvander@591: Trans_BadPhrase = 2,
dvander@591: Trans_BadPhraseLanguage = 3,
dvander@591: Trans_BadPhraseFile = 4,
dvander@591: };
dvander@591:
dvander@591: class CPhraseFile : public ITextListener_SMC
dvander@591: {
dvander@591: public:
dvander@616: CPhraseFile(Translator *pTranslator, const char *file);
dvander@591: ~CPhraseFile();
dvander@591: public:
dvander@591: void ReparseFile();
dvander@591: const char *GetFilename();
dvander@591: TransError GetTranslation(const char *szPhrase, unsigned int lang_id, Translation *pTrans);
dvander@591: public: //ITextListener_SMC
dvander@591: void ReadSMC_ParseStart();
dvander@1656: SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name);
dvander@1656: SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value);
dvander@1656: SMCResult ReadSMC_LeavingSection(const SMCStates *states);
dvander@591: void ReadSMC_ParseEnd(bool halted, bool failed);
dvander@591: private:
dvander@591: void ParseError(const char *message, ...);
dvander@591: void ParseWarning(const char *message, ...);
dvander@591: private:
dvander@591: Trie *m_pPhraseLookup;
dvander@591: String m_File;
dvander@616: Translator *m_pTranslator;
dvander@591: PhraseParseState m_ParseState;
dvander@591: int m_CurPhrase;
dvander@591: BaseMemTable *m_pMemory;
dvander@591: BaseStringTable *m_pStringTab;
dvander@591: unsigned int m_LangCount;
dvander@591: String m_ParseError;
dvander@591: String m_LastPhraseString;
dvander@591: bool m_FileLogged;
dvander@591: };
dvander@591:
dvander@616: class Translator :
dvander@591: public ITextListener_SMC,
dvander@591: public SMGlobalClass
dvander@591: {
dvander@591: public:
dvander@616: Translator();
dvander@616: ~Translator();
ds@661: public: // SMGlobalClass
dvander@663: ConfigResult OnSourceModConfigChanged(const char *key,
dvander@663: const char *value,
dvander@663: ConfigSource source,
dvander@663: char *error,
dvander@663: size_t maxlength);
dvander@591: void OnSourceModAllInitialized();
dvander@673: void OnSourceModLevelChange(const char *mapName);
ds@661: public: // ITextListener_SMC
dvander@591: void ReadSMC_ParseStart();
dvander@1656: SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name);
dvander@1656: SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value);
dvander@1656: SMCResult ReadSMC_LeavingSection(const SMCStates *states);
dvander@591: public:
dvander@591: void RebuildLanguageDatabase(const char *lang_header_file);
dvander@591: unsigned int FindOrAddPhraseFile(const char *phrase_file);
dvander@591: BaseStringTable *GetStringTable();
dvander@591: unsigned int GetLanguageCount();
dvander@1105: bool GetLanguageInfo(unsigned int number, const char **code, const char **name);
dvander@591: bool GetLanguageByCode(const char *code, unsigned int *index);
faluco@1352: bool GetLanguageByName(const char *name, unsigned int *index);
dvander@591: size_t Translate(char *buffer, size_t maxlength, void **params, const Translation *pTrans);
dvander@591: CPhraseFile *GetFileByIndex(unsigned int index);
dvander@1925: TransError CoreTransEx(CPhraseFile *pFile,
dvander@1925: int client,
dvander@1925: char *buffer,
dvander@1925: size_t maxlength,
dvander@1925: const char *phrase,
dvander@1925: void **params,
dvander@1925: size_t *outlen=NULL);
dvander@591: TransError CoreTrans(int client,
dvander@591: char *buffer,
dvander@591: size_t maxlength,
dvander@591: const char *phrase,
dvander@591: void **params,
dvander@591: size_t *outlen=NULL);
ds@669: unsigned int GetServerLanguage();
dvander@1105: unsigned int GetClientLanguage(int client);
dvander@591: private:
dvander@591: bool AddLanguage(const char *langcode, const char *description);
dvander@591: private:
dvander@591: CVector m_Languages;
dvander@591: CVector m_Files;
dvander@591: BaseStringTable *m_pStringTab;
dvander@591: Trie *m_pLCodeLookup;
dvander@591: bool m_InLanguageSection;
dvander@591: String m_CustomError;
ds@669: unsigned int m_ServerLang;
ds@669: char m_InitialLang[3];
dvander@591: };
dvander@591:
dvander@591: extern CPhraseFile *g_pCorePhrases;
dvander@1621: extern unsigned int g_pCorePhraseID;
dvander@616: extern Translator g_Translator;
dvander@591:
dvander@591: #endif //_INCLUDE_SOURCEMOD_TRANSLATOR_H_