core/Translator.h
author Scott Ehlert <ds@alliedmods.net>
Wed Aug 15 06:19:30 2007 +0000 (2007-08-15)
changeset 1330 ab94316bb52b
parent 1231 17badaf66ce4
child 1352 4241c756c278
permissions -rw-r--r--
Updated license headers on virtually all files with extremely minor changes in the name of some sort of strange consistency.
All plugin and include file headers also have been changed to say about GPL3 instead of GPL2.

(This day shall henceforth be known as the Eighty Column Massacre of '07)
dvander@591
     1
/**
ds@653
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@1231
     4
 * SourceMod
dvander@1231
     5
 * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     6
 * =============================================================================
dvander@591
     7
 *
ds@1330
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    10
 * Free Software Foundation.
dvander@1231
    11
 * 
ds@1330
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    15
 * details.
dvander@1231
    16
 *
ds@1330
    17
 * You should have received a copy of the GNU General Public License along with
ds@1330
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1231
    19
 *
ds@1330
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@591
    28
 *
dvander@591
    29
 * Version: $Id$
dvander@591
    30
 */
dvander@591
    31
dvander@591
    32
#ifndef _INCLUDE_SOURCEMOD_TRANSLATOR_H_
dvander@591
    33
#define _INCLUDE_SOURCEMOD_TRANSLATOR_H_
dvander@591
    34
dvander@591
    35
#include "sm_trie.h"
dvander@591
    36
#include <sh_string.h>
dvander@591
    37
#include <sh_vector.h>
dvander@591
    38
#include "sm_globals.h"
dvander@591
    39
#include "sm_memtable.h"
dvander@591
    40
#include "ITextParsers.h"
dvander@591
    41
dvander@591
    42
#define MAX_TRANSLATE_PARAMS		32
dvander@732
    43
#define CORELANG_ENGLISH			0
dvander@591
    44
dvander@591
    45
/* :TODO: write a templatized version of tries? */
dvander@591
    46
dvander@591
    47
using namespace SourceHook;
dvander@616
    48
class Translator;
dvander@591
    49
dvander@591
    50
enum PhraseParseState
dvander@591
    51
{
dvander@591
    52
	PPS_None = 0,
dvander@591
    53
	PPS_Phrases,
dvander@591
    54
	PPS_InPhrase,
dvander@591
    55
};
dvander@591
    56
dvander@591
    57
struct Language
dvander@591
    58
{
dvander@591
    59
	char m_code2[3];
dvander@591
    60
	int m_FullName;
dvander@591
    61
};
dvander@591
    62
dvander@591
    63
struct Translation
dvander@591
    64
{
dvander@591
    65
	const char *szPhrase;		/**< Translated phrase. */
dvander@591
    66
	unsigned int fmt_count;		/**< Number of format parameters. */
dvander@591
    67
	int *fmt_order;				/**< Format phrase order. */
dvander@591
    68
};
dvander@591
    69
dvander@663
    70
#define LANGUAGE_ENGLISH			0
dvander@663
    71
dvander@591
    72
enum TransError
dvander@591
    73
{
dvander@591
    74
	Trans_Okay = 0,
dvander@591
    75
	Trans_BadLanguage = 1,
dvander@591
    76
	Trans_BadPhrase = 2,
dvander@591
    77
	Trans_BadPhraseLanguage = 3,
dvander@591
    78
	Trans_BadPhraseFile = 4,
dvander@591
    79
};
dvander@591
    80
dvander@591
    81
class CPhraseFile : public ITextListener_SMC
dvander@591
    82
{
dvander@591
    83
public:
dvander@616
    84
	CPhraseFile(Translator *pTranslator, const char *file);
dvander@591
    85
	~CPhraseFile();
dvander@591
    86
public:
dvander@591
    87
	void ReparseFile();
dvander@591
    88
	const char *GetFilename();
dvander@591
    89
	TransError GetTranslation(const char *szPhrase, unsigned int lang_id, Translation *pTrans);
dvander@591
    90
public: //ITextListener_SMC
dvander@591
    91
	void ReadSMC_ParseStart();
dvander@591
    92
	void ReadSMC_ParseEnd(bool halted, bool failed);
dvander@591
    93
	SMCParseResult ReadSMC_NewSection(const char *name, bool opt_quotes);
dvander@591
    94
	SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes);
dvander@591
    95
	SMCParseResult ReadSMC_LeavingSection();
dvander@591
    96
	SMCParseResult ReadSMC_RawLine(const char *line, unsigned int curline);
dvander@591
    97
private:
dvander@591
    98
	void ParseError(const char *message, ...);
dvander@591
    99
	void ParseWarning(const char *message, ...);
dvander@591
   100
private:
dvander@591
   101
	Trie *m_pPhraseLookup;
dvander@591
   102
	String m_File;
dvander@616
   103
	Translator *m_pTranslator;
dvander@591
   104
	PhraseParseState m_ParseState;
dvander@591
   105
	int m_CurPhrase;
dvander@591
   106
	BaseMemTable *m_pMemory;
dvander@591
   107
	BaseStringTable *m_pStringTab;
dvander@591
   108
	unsigned int m_LangCount;
dvander@591
   109
	String m_ParseError;
dvander@591
   110
	String m_LastPhraseString;
dvander@591
   111
	unsigned int m_CurLine;
dvander@591
   112
	bool m_FileLogged;
dvander@591
   113
};
dvander@591
   114
dvander@616
   115
class Translator : 
dvander@591
   116
	public ITextListener_SMC,
dvander@591
   117
	public SMGlobalClass
dvander@591
   118
{
dvander@591
   119
public:
dvander@616
   120
	Translator();
dvander@616
   121
	~Translator();
ds@661
   122
public: // SMGlobalClass
dvander@663
   123
	ConfigResult OnSourceModConfigChanged(const char *key, 
dvander@663
   124
		const char *value, 
dvander@663
   125
		ConfigSource source, 
dvander@663
   126
		char *error, 
dvander@663
   127
		size_t maxlength);
dvander@591
   128
	void OnSourceModAllInitialized();
dvander@673
   129
	void OnSourceModLevelChange(const char *mapName);
ds@661
   130
public: // ITextListener_SMC
dvander@591
   131
	void ReadSMC_ParseStart();
dvander@591
   132
	SMCParseResult ReadSMC_NewSection(const char *name, bool opt_quotes);
dvander@591
   133
	SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes);
dvander@591
   134
	SMCParseResult ReadSMC_LeavingSection();
dvander@591
   135
public:
dvander@591
   136
	void RebuildLanguageDatabase(const char *lang_header_file);
dvander@591
   137
	unsigned int FindOrAddPhraseFile(const char *phrase_file);
dvander@591
   138
	BaseStringTable *GetStringTable();
dvander@591
   139
	unsigned int GetLanguageCount();
dvander@1105
   140
	bool GetLanguageInfo(unsigned int number, const char **code, const char **name);
dvander@591
   141
	bool GetLanguageByCode(const char *code, unsigned int *index);
dvander@591
   142
	size_t Translate(char *buffer, size_t maxlength, void **params, const Translation *pTrans);
dvander@591
   143
	CPhraseFile *GetFileByIndex(unsigned int index);
dvander@591
   144
	TransError CoreTrans(int client, 
dvander@591
   145
						 char *buffer, 
dvander@591
   146
						 size_t maxlength, 
dvander@591
   147
						 const char *phrase, 
dvander@591
   148
						 void **params, 
dvander@591
   149
						 size_t *outlen=NULL);
ds@669
   150
	unsigned int GetServerLanguage();
dvander@1105
   151
	unsigned int GetClientLanguage(int client);
dvander@591
   152
private:
dvander@591
   153
	bool AddLanguage(const char *langcode, const char *description);
dvander@591
   154
private:
dvander@591
   155
	CVector<Language *> m_Languages;
dvander@591
   156
	CVector<CPhraseFile *> m_Files;
dvander@591
   157
	BaseStringTable *m_pStringTab;
dvander@591
   158
	Trie *m_pLCodeLookup;
dvander@591
   159
	bool m_InLanguageSection;
dvander@591
   160
	String m_CustomError;
ds@669
   161
	unsigned int m_ServerLang;
ds@669
   162
	char m_InitialLang[3];
dvander@591
   163
};
dvander@591
   164
dvander@591
   165
extern CPhraseFile *g_pCorePhrases;
dvander@616
   166
extern Translator g_Translator;
dvander@591
   167
dvander@591
   168
#endif //_INCLUDE_SOURCEMOD_TRANSLATOR_H_