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_