|
dvander@370
|
1 |
/** |
|
dvander@370
|
2 |
* =============================================================== |
|
dvander@370
|
3 |
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. |
|
dvander@370
|
4 |
* =============================================================== |
|
dvander@370
|
5 |
* |
|
dvander@370
|
6 |
* This file is not open source and may not be copied without explicit |
|
dvander@370
|
7 |
* written permission of AlliedModders LLC. This file may not be redistributed |
|
dvander@370
|
8 |
* in whole or significant part. |
|
dvander@370
|
9 |
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php |
|
dvander@370
|
10 |
* |
|
dvander@370
|
11 |
* Version: $Id$ |
|
dvander@370
|
12 |
*/ |
|
dvander@370
|
13 |
|
|
dvander@276
|
14 |
#ifndef _INCLUDE_SOURCEMOD_TRANSLATOR_H_ |
|
dvander@276
|
15 |
#define _INCLUDE_SOURCEMOD_TRANSLATOR_H_ |
|
dvander@276
|
16 |
|
|
dvander@276
|
17 |
#include "sm_trie.h" |
|
dvander@276
|
18 |
#include <sh_string.h> |
|
dvander@276
|
19 |
#include <sh_vector.h> |
|
dvander@276
|
20 |
#include "sm_globals.h" |
|
dvander@276
|
21 |
#include "sm_memtable.h" |
|
dvander@276
|
22 |
#include "ITextParsers.h" |
|
dvander@276
|
23 |
|
|
dvander@276
|
24 |
#define MAX_TRANSLATE_PARAMS 32 |
|
dvander@276
|
25 |
|
|
dvander@276
|
26 |
/* :TODO: write a templatized version of tries? */ |
|
dvander@276
|
27 |
|
|
dvander@276
|
28 |
using namespace SourceHook; |
|
dvander@276
|
29 |
class CTranslator; |
|
dvander@276
|
30 |
|
|
dvander@276
|
31 |
enum PhraseParseState |
|
dvander@276
|
32 |
{ |
|
dvander@276
|
33 |
PPS_None = 0, |
|
dvander@276
|
34 |
PPS_Phrases, |
|
dvander@276
|
35 |
PPS_InPhrase, |
|
dvander@276
|
36 |
}; |
|
dvander@276
|
37 |
|
|
dvander@276
|
38 |
struct Language |
|
dvander@276
|
39 |
{ |
|
dvander@276
|
40 |
char m_code2[3]; |
|
dvander@276
|
41 |
int m_FullName; |
|
dvander@276
|
42 |
}; |
|
dvander@276
|
43 |
|
|
dvander@276
|
44 |
struct Translation |
|
dvander@276
|
45 |
{ |
|
dvander@276
|
46 |
const char *szPhrase; |
|
dvander@276
|
47 |
unsigned int lang_id; |
|
dvander@276
|
48 |
unsigned int file_id; |
|
dvander@276
|
49 |
void **params; |
|
dvander@276
|
50 |
}; |
|
dvander@276
|
51 |
|
|
dvander@276
|
52 |
class CPhraseFile : public ITextListener_SMC |
|
dvander@276
|
53 |
{ |
|
dvander@276
|
54 |
public: |
|
dvander@276
|
55 |
CPhraseFile(CTranslator *pTranslator, const char *file); |
|
dvander@276
|
56 |
~CPhraseFile(); |
|
dvander@276
|
57 |
public: |
|
dvander@276
|
58 |
void ReparseFile(); |
|
dvander@276
|
59 |
const char *GetFilename(); |
|
dvander@276
|
60 |
const char *GetTranslation(const Translation *pTrans, int **fmt_order, unsigned int *fmt_count); |
|
dvander@276
|
61 |
public: //ITextListener_SMC |
|
dvander@276
|
62 |
void ReadSMC_ParseStart(); |
|
dvander@276
|
63 |
void ReadSMC_ParseEnd(bool halted, bool failed); |
|
dvander@276
|
64 |
SMCParseResult ReadSMC_NewSection(const char *name, bool opt_quotes); |
|
dvander@276
|
65 |
SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes); |
|
dvander@276
|
66 |
SMCParseResult ReadSMC_LeavingSection(); |
|
dvander@276
|
67 |
SMCParseResult ReadSMC_RawLine(const char *line, unsigned int curline); |
|
dvander@276
|
68 |
private: |
|
dvander@276
|
69 |
void ParseError(const char *message, ...); |
|
dvander@276
|
70 |
void ParseWarning(const char *message, ...); |
|
dvander@276
|
71 |
private: |
|
dvander@276
|
72 |
Trie *m_pPhraseLookup; |
|
dvander@276
|
73 |
String m_File; |
|
dvander@276
|
74 |
CTranslator *m_pTranslator; |
|
dvander@276
|
75 |
PhraseParseState m_ParseState; |
|
dvander@276
|
76 |
int m_CurPhrase; |
|
dvander@276
|
77 |
BaseMemTable *m_pMemory; |
|
dvander@276
|
78 |
BaseStringTable *m_pStringTab; |
|
dvander@276
|
79 |
unsigned int m_LangCount; |
|
dvander@276
|
80 |
String m_ParseError; |
|
dvander@276
|
81 |
String m_LastPhraseString; |
|
dvander@276
|
82 |
unsigned int m_CurLine; |
|
dvander@276
|
83 |
bool m_FileLogged; |
|
dvander@276
|
84 |
}; |
|
dvander@276
|
85 |
|
|
dvander@276
|
86 |
class CTranslator : public ITextListener_SMC |
|
dvander@276
|
87 |
{ |
|
dvander@276
|
88 |
public: |
|
dvander@276
|
89 |
CTranslator(); |
|
dvander@276
|
90 |
~CTranslator(); |
|
dvander@276
|
91 |
public: //ITextListener_SMC |
|
dvander@276
|
92 |
void ReadSMC_ParseStart(); |
|
dvander@276
|
93 |
SMCParseResult ReadSMC_NewSection(const char *name, bool opt_quotes); |
|
dvander@276
|
94 |
SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes); |
|
dvander@276
|
95 |
SMCParseResult ReadSMC_LeavingSection(); |
|
dvander@276
|
96 |
public: |
|
dvander@276
|
97 |
void RebuildLanguageDatabase(const char *lang_header_file); |
|
dvander@276
|
98 |
unsigned int FindOrAddPhraseFile(const char *phrase_file); |
|
dvander@276
|
99 |
BaseStringTable *GetStringTable(); |
|
dvander@276
|
100 |
unsigned int GetLanguageCount(); |
|
dvander@276
|
101 |
bool GetLanguageByCode(const char *code, unsigned int *index); |
|
dvander@276
|
102 |
size_t Translate(char *buffer, size_t maxlength, const Translation *pTrans); |
|
dvander@276
|
103 |
private: |
|
dvander@276
|
104 |
CVector<Language *> m_Languages; |
|
dvander@276
|
105 |
CVector<CPhraseFile *> m_Files; |
|
dvander@276
|
106 |
BaseStringTable *m_pStringTab; |
|
dvander@276
|
107 |
Trie *m_pLCodeLookup; |
|
dvander@276
|
108 |
bool m_InLanguageSection; |
|
dvander@276
|
109 |
String m_CustomError; |
|
dvander@276
|
110 |
}; |
|
dvander@276
|
111 |
|
|
dvander@276
|
112 |
extern CTranslator g_Translator; |
|
dvander@276
|
113 |
|
|
dvander@276
|
114 |
#endif //_INCLUDE_SOURCEMOD_TRANSLATOR_H_ |