added amb1666 - rehaul over the ml api so extensions can easily use translations
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%402132
This commit is contained in:
parent
1e70b04f48
commit
c7418e70ba
@ -216,15 +216,14 @@ void ChatTriggers::OnSayCommand_Pre()
|
|||||||
{
|
{
|
||||||
char buffer[128];
|
char buffer[128];
|
||||||
|
|
||||||
/* :TODO: log an error? */
|
if (!CoreTranslate(
|
||||||
if (g_Translator.CoreTransEx(g_pFloodPhrases,
|
|
||||||
client,
|
|
||||||
buffer,
|
buffer,
|
||||||
sizeof(buffer),
|
sizeof(buffer),
|
||||||
"Flooding the server",
|
"%T",
|
||||||
|
2,
|
||||||
NULL,
|
NULL,
|
||||||
NULL)
|
"Flooding the server",
|
||||||
!= Trans_Okay)
|
&client))
|
||||||
{
|
{
|
||||||
UTIL_Format(buffer, sizeof(buffer), "You are flooding the server!");
|
UTIL_Format(buffer, sizeof(buffer), "You are flooding the server!");
|
||||||
}
|
}
|
||||||
|
@ -494,8 +494,7 @@ bool ConCmdManager::CheckAccess(int client, const char *cmd, AdminCmdInfo *pAdmi
|
|||||||
|
|
||||||
/* If we got here, the command failed... */
|
/* If we got here, the command failed... */
|
||||||
char buffer[128];
|
char buffer[128];
|
||||||
if (g_Translator.CoreTrans(client, buffer, sizeof(buffer), "No Access", NULL, NULL)
|
if (!CoreTranslate(buffer, sizeof(buffer), "%T", 1, NULL, "No Access", &client))
|
||||||
!= Trans_Okay)
|
|
||||||
{
|
{
|
||||||
UTIL_Format(buffer, sizeof(buffer), "You do not have access to this command");
|
UTIL_Format(buffer, sizeof(buffer), "You do not have access to this command");
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
#include "ShareSys.h"
|
#include "ShareSys.h"
|
||||||
#include "HandleSys.h"
|
#include "HandleSys.h"
|
||||||
#include "sourcemm_api.h"
|
#include "sourcemm_api.h"
|
||||||
|
#include "Translator.h"
|
||||||
|
|
||||||
MenuManager g_Menus;
|
MenuManager g_Menus;
|
||||||
VoteMenuHandler s_VoteHandler;
|
VoteMenuHandler s_VoteHandler;
|
||||||
@ -585,14 +586,20 @@ skip_search:
|
|||||||
{
|
{
|
||||||
if (exitBackButton)
|
if (exitBackButton)
|
||||||
{
|
{
|
||||||
CorePlayerTranslate(client, text, sizeof(text), "Back", NULL);
|
if (!CoreTranslate(text, sizeof(text), "%T", 2, NULL, "Back", &client))
|
||||||
|
{
|
||||||
|
UTIL_Format(text, sizeof(text), "Back");
|
||||||
|
}
|
||||||
dr.style = ITEMDRAW_CONTROL;
|
dr.style = ITEMDRAW_CONTROL;
|
||||||
position = panel->DrawItem(dr);
|
position = panel->DrawItem(dr);
|
||||||
slots[position].type = ItemSel_ExitBack;
|
slots[position].type = ItemSel_ExitBack;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CorePlayerTranslate(client, text, sizeof(text), "Previous", NULL);
|
if (!CoreTranslate(text, sizeof(text), "%T", 2, NULL, "Previous", &client))
|
||||||
|
{
|
||||||
|
UTIL_Format(text, sizeof(text), "Previous");
|
||||||
|
}
|
||||||
dr.style = (displayPrev ? 0 : ITEMDRAW_DISABLED)|ITEMDRAW_CONTROL;
|
dr.style = (displayPrev ? 0 : ITEMDRAW_DISABLED)|ITEMDRAW_CONTROL;
|
||||||
position = panel->DrawItem(dr);
|
position = panel->DrawItem(dr);
|
||||||
slots[position].type = ItemSel_Back;
|
slots[position].type = ItemSel_Back;
|
||||||
@ -610,7 +617,10 @@ skip_search:
|
|||||||
/* NEXT */
|
/* NEXT */
|
||||||
if (displayNext || canDrawDisabled)
|
if (displayNext || canDrawDisabled)
|
||||||
{
|
{
|
||||||
CorePlayerTranslate(client, text, sizeof(text), "Next", NULL);
|
if (!CoreTranslate(text, sizeof(text), "%T", 2, NULL, "Next", &client))
|
||||||
|
{
|
||||||
|
UTIL_Format(text, sizeof(text), "Next");
|
||||||
|
}
|
||||||
dr.style = (displayNext ? 0 : ITEMDRAW_DISABLED)|ITEMDRAW_CONTROL;
|
dr.style = (displayNext ? 0 : ITEMDRAW_DISABLED)|ITEMDRAW_CONTROL;
|
||||||
position = panel->DrawItem(dr);
|
position = panel->DrawItem(dr);
|
||||||
slots[position].type = ItemSel_Next;
|
slots[position].type = ItemSel_Next;
|
||||||
@ -638,7 +648,10 @@ skip_search:
|
|||||||
/* EXIT */
|
/* EXIT */
|
||||||
if (exitButton)
|
if (exitButton)
|
||||||
{
|
{
|
||||||
CorePlayerTranslate(client, text, sizeof(text), "Exit", NULL);
|
if (!CoreTranslate(text, sizeof(text), "%T", 2, NULL, "Exit", &client))
|
||||||
|
{
|
||||||
|
UTIL_Format(text, sizeof(text), "Exit");
|
||||||
|
}
|
||||||
dr.style = ITEMDRAW_CONTROL;
|
dr.style = ITEMDRAW_CONTROL;
|
||||||
position = panel->DrawItem(dr);
|
position = panel->DrawItem(dr);
|
||||||
slots[position].type = ItemSel_Exit;
|
slots[position].type = ItemSel_Exit;
|
||||||
|
131
core/PhraseCollection.cpp
Normal file
131
core/PhraseCollection.cpp
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/**
|
||||||
|
* vim: set ts=4 :
|
||||||
|
* =============================================================================
|
||||||
|
* SourceMod
|
||||||
|
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
|
||||||
|
* =============================================================================
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it under
|
||||||
|
* the terms of the GNU General Public License, version 3.0, as published by the
|
||||||
|
* Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* As a special exception, AlliedModders LLC gives you permission to link the
|
||||||
|
* code of this program (as well as its derivative works) to "Half-Life 2," the
|
||||||
|
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
|
||||||
|
* by the Valve Corporation. You must obey the GNU General Public License in
|
||||||
|
* all respects for all other code used. Additionally, AlliedModders LLC grants
|
||||||
|
* this exception to all derivative works. AlliedModders LLC defines further
|
||||||
|
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
|
||||||
|
* or <http://www.sourcemod.net/license.php>.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "PhraseCollection.h"
|
||||||
|
#include "Translator.h"
|
||||||
|
#include "sm_stringutil.h"
|
||||||
|
|
||||||
|
CPhraseCollection::CPhraseCollection()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CPhraseCollection::~CPhraseCollection()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CPhraseCollection::Destroy()
|
||||||
|
{
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPhraseFile *CPhraseCollection::AddPhraseFile(const char *filename)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
unsigned int fid;
|
||||||
|
IPhraseFile *pFile;
|
||||||
|
char full_name[PLATFORM_MAX_PATH];
|
||||||
|
|
||||||
|
/* No compat shim here. The user should have read the doc. */
|
||||||
|
UTIL_Format(full_name, sizeof(full_name), "%s.txt", filename);
|
||||||
|
|
||||||
|
fid = g_Translator.FindOrAddPhraseFile(full_name);
|
||||||
|
pFile = g_Translator.GetFileByIndex(fid);
|
||||||
|
|
||||||
|
for (i = 0; i < m_Files.size(); i++)
|
||||||
|
{
|
||||||
|
if (m_Files[i] == pFile)
|
||||||
|
{
|
||||||
|
return pFile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Files.push_back(pFile);
|
||||||
|
|
||||||
|
return pFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CPhraseCollection::GetFileCount()
|
||||||
|
{
|
||||||
|
return (unsigned int)m_Files.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
IPhraseFile *CPhraseCollection::GetFile(unsigned int file)
|
||||||
|
{
|
||||||
|
if (file >= m_Files.size())
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_Files[file];
|
||||||
|
}
|
||||||
|
|
||||||
|
TransError CPhraseCollection::FindTranslation(const char *key, unsigned int langid, Translation *pTrans)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < m_Files.size(); i++)
|
||||||
|
{
|
||||||
|
if (m_Files[i]->GetTranslation(key, langid, pTrans) == Trans_Okay)
|
||||||
|
{
|
||||||
|
return Trans_Okay;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Trans_BadPhrase;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CPhraseCollection::FormatString(char *buffer,
|
||||||
|
size_t maxlength,
|
||||||
|
const char *format,
|
||||||
|
void **params,
|
||||||
|
unsigned int numparams,
|
||||||
|
size_t *pOutLength,
|
||||||
|
const char **pFailPhrase)
|
||||||
|
{
|
||||||
|
unsigned int arg;
|
||||||
|
|
||||||
|
arg = 0;
|
||||||
|
if (!gnprintf(buffer, maxlength, format, this, params, numparams, arg, pOutLength, pFailPhrase))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arg != numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
65
core/PhraseCollection.h
Normal file
65
core/PhraseCollection.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* vim: set ts=4 :
|
||||||
|
* =============================================================================
|
||||||
|
* SourceMod
|
||||||
|
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
|
||||||
|
* =============================================================================
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it under
|
||||||
|
* the terms of the GNU General Public License, version 3.0, as published by the
|
||||||
|
* Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* As a special exception, AlliedModders LLC gives you permission to link the
|
||||||
|
* code of this program (as well as its derivative works) to "Half-Life 2," the
|
||||||
|
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
|
||||||
|
* by the Valve Corporation. You must obey the GNU General Public License in
|
||||||
|
* all respects for all other code used. Additionally, AlliedModders LLC grants
|
||||||
|
* this exception to all derivative works. AlliedModders LLC defines further
|
||||||
|
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
|
||||||
|
* or <http://www.sourcemod.net/license.php>.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_SOURCEMOD_PHRASECOLLECTION_H_
|
||||||
|
#define _INCLUDE_SOURCEMOD_PHRASECOLLECTION_H_
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <sh_vector.h>
|
||||||
|
#include <ITranslator.h>
|
||||||
|
|
||||||
|
using namespace SourceHook;
|
||||||
|
using namespace SourceMod;
|
||||||
|
|
||||||
|
class CPhraseCollection : public IPhraseCollection
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CPhraseCollection();
|
||||||
|
~CPhraseCollection();
|
||||||
|
public:
|
||||||
|
IPhraseFile *AddPhraseFile(const char *filename);
|
||||||
|
unsigned int GetFileCount();
|
||||||
|
IPhraseFile *GetFile(unsigned int file);
|
||||||
|
void Destroy();
|
||||||
|
TransError FindTranslation(const char *key, unsigned int langid, Translation *pTrans);
|
||||||
|
bool FormatString(
|
||||||
|
char *buffer,
|
||||||
|
size_t maxlength,
|
||||||
|
const char *format,
|
||||||
|
void **params,
|
||||||
|
unsigned int numparams,
|
||||||
|
size_t *pOutLength,
|
||||||
|
const char **pFailPhrase);
|
||||||
|
private:
|
||||||
|
CVector<IPhraseFile *> m_Files;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_SOURCEMOD_PHRASECOLLECTION_H_
|
@ -1203,7 +1203,7 @@ CPlayer::CPlayer()
|
|||||||
m_bAdminCheckSignalled = false;
|
m_bAdminCheckSignalled = false;
|
||||||
m_bIsInKickQueue = false;
|
m_bIsInKickQueue = false;
|
||||||
m_LastPassword.clear();
|
m_LastPassword.clear();
|
||||||
m_LangId = LANGUAGE_ENGLISH;
|
m_LangId = SOURCEMOD_LANGUAGE_ENGLISH;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity)
|
void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity)
|
||||||
|
@ -38,9 +38,11 @@
|
|||||||
#include "sm_stringutil.h"
|
#include "sm_stringutil.h"
|
||||||
#include "sourcemod.h"
|
#include "sourcemod.h"
|
||||||
#include "PlayerManager.h"
|
#include "PlayerManager.h"
|
||||||
|
#include "PhraseCollection.h"
|
||||||
|
#include "ShareSys.h"
|
||||||
|
|
||||||
Translator g_Translator;
|
Translator g_Translator;
|
||||||
CPhraseFile *g_pCorePhrases = NULL;
|
IPhraseCollection *g_pCorePhrases = NULL;
|
||||||
unsigned int g_pCorePhraseID = 0;
|
unsigned int g_pCorePhraseID = 0;
|
||||||
|
|
||||||
struct trans_t
|
struct trans_t
|
||||||
@ -663,7 +665,7 @@ const char *CPhraseFile::GetFilename()
|
|||||||
** MAIN TRANSLATOR CODE **
|
** MAIN TRANSLATOR CODE **
|
||||||
**************************/
|
**************************/
|
||||||
|
|
||||||
Translator::Translator() : m_ServerLang(LANGUAGE_ENGLISH)
|
Translator::Translator() : m_ServerLang(SOURCEMOD_LANGUAGE_ENGLISH)
|
||||||
{
|
{
|
||||||
m_pStringTab = new BaseStringTable(2048);
|
m_pStringTab = new BaseStringTable(2048);
|
||||||
m_pLCodeLookup = sm_trie_create();
|
m_pLCodeLookup = sm_trie_create();
|
||||||
@ -727,11 +729,15 @@ void Translator::OnSourceModAllInitialized()
|
|||||||
{
|
{
|
||||||
AddLanguage("en", "English");
|
AddLanguage("en", "English");
|
||||||
|
|
||||||
unsigned int id;
|
g_pCorePhrases = CreatePhraseCollection();
|
||||||
|
g_pCorePhrases->AddPhraseFile("core.phrases");
|
||||||
|
|
||||||
id = FindOrAddPhraseFile("core.phrases.txt");
|
g_ShareSys.AddInterface(NULL, this);
|
||||||
g_pCorePhraseID = id;
|
}
|
||||||
g_pCorePhrases = GetFileByIndex(id);
|
|
||||||
|
void Translator::OnSourceModShutdown()
|
||||||
|
{
|
||||||
|
g_pCorePhrases->Destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Translator::GetLanguageByCode(const char *code, unsigned int *index)
|
bool Translator::GetLanguageByCode(const char *code, unsigned int *index)
|
||||||
@ -842,7 +848,7 @@ void Translator::RebuildLanguageDatabase(const char *lang_header_file)
|
|||||||
g_Logger.LogError("Server language was set to bad language \"%s\" -- reverting to English", m_InitialLang);
|
g_Logger.LogError("Server language was set to bad language \"%s\" -- reverting to English", m_InitialLang);
|
||||||
|
|
||||||
strncopy(m_InitialLang, "en", sizeof(m_InitialLang));
|
strncopy(m_InitialLang, "en", sizeof(m_InitialLang));
|
||||||
m_ServerLang = LANGUAGE_ENGLISH;
|
m_ServerLang = SOURCEMOD_LANGUAGE_ENGLISH;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_ServerLang = reinterpret_cast<unsigned int>(serverLang);
|
m_ServerLang = reinterpret_cast<unsigned int>(serverLang);
|
||||||
@ -936,61 +942,6 @@ CPhraseFile *Translator::GetFileByIndex(unsigned int index)
|
|||||||
return m_Files[index];
|
return m_Files[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t Translator::Translate(char *buffer, size_t maxlength, void **params, const Translation *pTrans)
|
|
||||||
{
|
|
||||||
void *new_params[MAX_TRANSLATE_PARAMS];
|
|
||||||
|
|
||||||
/* Rewrite the parameter order */
|
|
||||||
for (unsigned int i=0; i<pTrans->fmt_count; i++)
|
|
||||||
{
|
|
||||||
new_params[i] = params[pTrans->fmt_order[i]];
|
|
||||||
}
|
|
||||||
|
|
||||||
return gnprintf(buffer, maxlength, pTrans->szPhrase, new_params);
|
|
||||||
}
|
|
||||||
|
|
||||||
TransError Translator::CoreTransEx(CPhraseFile *pFile,
|
|
||||||
int client,
|
|
||||||
char *buffer,
|
|
||||||
size_t maxlength,
|
|
||||||
const char *phrase,
|
|
||||||
void **params,
|
|
||||||
size_t *outlen)
|
|
||||||
{
|
|
||||||
Translation trans;
|
|
||||||
TransError err;
|
|
||||||
|
|
||||||
/* Using server lang temporarily until client lang stuff is implemented */
|
|
||||||
if ((err = pFile->GetTranslation(phrase, m_ServerLang, &trans)) != Trans_Okay)
|
|
||||||
{
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t len = Translate(buffer, maxlength, params, &trans);
|
|
||||||
|
|
||||||
if (outlen)
|
|
||||||
{
|
|
||||||
*outlen = len;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Trans_Okay;
|
|
||||||
}
|
|
||||||
|
|
||||||
TransError Translator::CoreTrans(int client,
|
|
||||||
char *buffer,
|
|
||||||
size_t maxlength,
|
|
||||||
const char *phrase,
|
|
||||||
void **params,
|
|
||||||
size_t *outlen)
|
|
||||||
{
|
|
||||||
if (!g_pCorePhrases)
|
|
||||||
{
|
|
||||||
return Trans_BadPhraseFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
return CoreTransEx(g_pCorePhrases, client, buffer, maxlength, phrase, params, outlen);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int Translator::GetServerLanguage()
|
unsigned int Translator::GetServerLanguage()
|
||||||
{
|
{
|
||||||
return m_ServerLang;
|
return m_ServerLang;
|
||||||
@ -1021,3 +972,105 @@ bool Translator::GetLanguageInfo(unsigned int number, const char **code, const c
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *Translator::GetInterfaceName()
|
||||||
|
{
|
||||||
|
return SMINTERFACE_TRANSLATOR_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int Translator::GetInterfaceVersion()
|
||||||
|
{
|
||||||
|
return SMINTERFACE_TRANSLATOR_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPhraseCollection *Translator::CreatePhraseCollection()
|
||||||
|
{
|
||||||
|
return new CPhraseCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
int Translator::SetGlobalTarget(int index)
|
||||||
|
{
|
||||||
|
return g_SourceMod.SetGlobalTarget(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Translator::GetGlobalTarget() const
|
||||||
|
{
|
||||||
|
return g_SourceMod.GetGlobalTarget();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CoreTranslate(char *buffer,
|
||||||
|
size_t maxlength,
|
||||||
|
const char *format,
|
||||||
|
unsigned int numparams,
|
||||||
|
size_t *pOutLength,
|
||||||
|
...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
unsigned int i;
|
||||||
|
const char *fail_phrase;
|
||||||
|
void *params[MAX_TRANSLATE_PARAMS];
|
||||||
|
|
||||||
|
if (numparams > MAX_TRANSLATE_PARAMS)
|
||||||
|
{
|
||||||
|
assert(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
va_start(ap, pOutLength);
|
||||||
|
for (i = 0; i < numparams; i++)
|
||||||
|
{
|
||||||
|
params[i] = va_arg(ap, void *);
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
if (!g_pCorePhrases->FormatString(buffer,
|
||||||
|
maxlength,
|
||||||
|
format,
|
||||||
|
params,
|
||||||
|
numparams,
|
||||||
|
pOutLength,
|
||||||
|
&fail_phrase))
|
||||||
|
{
|
||||||
|
if (fail_phrase != NULL)
|
||||||
|
{
|
||||||
|
g_Logger.LogError("[SM] Could not find core phrase: %s", fail_phrase);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_Logger.LogError("[SM] Unknown fatal error while translating a core phrase.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Translator::FormatString(char *buffer,
|
||||||
|
size_t maxlength,
|
||||||
|
const char *format,
|
||||||
|
IPhraseCollection *pPhrases,
|
||||||
|
void **params,
|
||||||
|
unsigned int numparams,
|
||||||
|
size_t *pOutLength,
|
||||||
|
const char **pFailPhrase)
|
||||||
|
{
|
||||||
|
unsigned int arg;
|
||||||
|
|
||||||
|
arg = 0;
|
||||||
|
if (!gnprintf(buffer, maxlength, format, pPhrases, params, numparams, arg, pOutLength, pFailPhrase))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arg != numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#include "sm_globals.h"
|
#include "sm_globals.h"
|
||||||
#include "sm_memtable.h"
|
#include "sm_memtable.h"
|
||||||
#include "ITextParsers.h"
|
#include "ITextParsers.h"
|
||||||
|
#include <ITranslator.h>
|
||||||
|
|
||||||
#define MAX_TRANSLATE_PARAMS 32
|
#define MAX_TRANSLATE_PARAMS 32
|
||||||
#define CORELANG_ENGLISH 0
|
#define CORELANG_ENGLISH 0
|
||||||
@ -60,25 +61,9 @@ struct Language
|
|||||||
int m_FullName;
|
int m_FullName;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Translation
|
class CPhraseFile :
|
||||||
{
|
public ITextListener_SMC,
|
||||||
const char *szPhrase; /**< Translated phrase. */
|
public IPhraseFile
|
||||||
unsigned int fmt_count; /**< Number of format parameters. */
|
|
||||||
int *fmt_order; /**< Format phrase order. */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define LANGUAGE_ENGLISH 0
|
|
||||||
|
|
||||||
enum TransError
|
|
||||||
{
|
|
||||||
Trans_Okay = 0,
|
|
||||||
Trans_BadLanguage = 1,
|
|
||||||
Trans_BadPhrase = 2,
|
|
||||||
Trans_BadPhraseLanguage = 3,
|
|
||||||
Trans_BadPhraseFile = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
class CPhraseFile : public ITextListener_SMC
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CPhraseFile(Translator *pTranslator, const char *file);
|
CPhraseFile(Translator *pTranslator, const char *file);
|
||||||
@ -112,7 +97,8 @@ private:
|
|||||||
|
|
||||||
class Translator :
|
class Translator :
|
||||||
public ITextListener_SMC,
|
public ITextListener_SMC,
|
||||||
public SMGlobalClass
|
public SMGlobalClass,
|
||||||
|
public ITranslator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Translator();
|
Translator();
|
||||||
@ -125,6 +111,7 @@ public: // SMGlobalClass
|
|||||||
size_t maxlength);
|
size_t maxlength);
|
||||||
void OnSourceModAllInitialized();
|
void OnSourceModAllInitialized();
|
||||||
void OnSourceModLevelChange(const char *mapName);
|
void OnSourceModLevelChange(const char *mapName);
|
||||||
|
void OnSourceModShutdown();
|
||||||
public: // ITextListener_SMC
|
public: // ITextListener_SMC
|
||||||
void ReadSMC_ParseStart();
|
void ReadSMC_ParseStart();
|
||||||
SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name);
|
SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name);
|
||||||
@ -138,23 +125,30 @@ public:
|
|||||||
bool GetLanguageInfo(unsigned int number, const char **code, const char **name);
|
bool GetLanguageInfo(unsigned int number, const char **code, const char **name);
|
||||||
bool GetLanguageByCode(const char *code, unsigned int *index);
|
bool GetLanguageByCode(const char *code, unsigned int *index);
|
||||||
bool GetLanguageByName(const char *name, unsigned int *index);
|
bool GetLanguageByName(const char *name, unsigned int *index);
|
||||||
size_t Translate(char *buffer, size_t maxlength, void **params, const Translation *pTrans);
|
|
||||||
CPhraseFile *GetFileByIndex(unsigned int index);
|
CPhraseFile *GetFileByIndex(unsigned int index);
|
||||||
TransError CoreTransEx(CPhraseFile *pFile,
|
public: //ITranslator
|
||||||
int client,
|
|
||||||
char *buffer,
|
|
||||||
size_t maxlength,
|
|
||||||
const char *phrase,
|
|
||||||
void **params,
|
|
||||||
size_t *outlen=NULL);
|
|
||||||
TransError CoreTrans(int client,
|
|
||||||
char *buffer,
|
|
||||||
size_t maxlength,
|
|
||||||
const char *phrase,
|
|
||||||
void **params,
|
|
||||||
size_t *outlen=NULL);
|
|
||||||
unsigned int GetServerLanguage();
|
unsigned int GetServerLanguage();
|
||||||
unsigned int GetClientLanguage(int client);
|
unsigned int GetClientLanguage(int client);
|
||||||
|
const char *GetInterfaceName();
|
||||||
|
unsigned int GetInterfaceVersion();
|
||||||
|
IPhraseCollection *CreatePhraseCollection();
|
||||||
|
int SetGlobalTarget(int index);
|
||||||
|
int GetGlobalTarget() const;
|
||||||
|
size_t FormatString(
|
||||||
|
char *buffer,
|
||||||
|
size_t maxlength,
|
||||||
|
SourcePawn::IPluginContext *pContext,
|
||||||
|
const cell_t *params,
|
||||||
|
unsigned int param);
|
||||||
|
bool FormatString(
|
||||||
|
char *buffer,
|
||||||
|
size_t maxlength,
|
||||||
|
const char *format,
|
||||||
|
IPhraseCollection *pPhrases,
|
||||||
|
void **params,
|
||||||
|
unsigned int numparams,
|
||||||
|
size_t *pOutLength,
|
||||||
|
const char **pFailPhrase);
|
||||||
private:
|
private:
|
||||||
bool AddLanguage(const char *langcode, const char *description);
|
bool AddLanguage(const char *langcode, const char *description);
|
||||||
private:
|
private:
|
||||||
@ -168,7 +162,15 @@ private:
|
|||||||
char m_InitialLang[3];
|
char m_InitialLang[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern CPhraseFile *g_pCorePhrases;
|
/* Nice little wrapper to handle error logging and whatnot */
|
||||||
|
bool CoreTranslate(char *buffer,
|
||||||
|
size_t maxlength,
|
||||||
|
const char *format,
|
||||||
|
unsigned int numparams,
|
||||||
|
size_t *pOutLength,
|
||||||
|
...);
|
||||||
|
|
||||||
|
extern IPhraseCollection *g_pCorePhrases;
|
||||||
extern unsigned int g_pCorePhraseID;
|
extern unsigned int g_pCorePhraseID;
|
||||||
extern Translator g_Translator;
|
extern Translator g_Translator;
|
||||||
|
|
||||||
|
@ -901,6 +901,10 @@
|
|||||||
RelativePath="..\MenuVoting.cpp"
|
RelativePath="..\MenuVoting.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\PhraseCollection.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\PlayerManager.cpp"
|
RelativePath="..\PlayerManager.cpp"
|
||||||
>
|
>
|
||||||
@ -1063,6 +1067,10 @@
|
|||||||
RelativePath="..\MenuVoting.h"
|
RelativePath="..\MenuVoting.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\PhraseCollection.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\PlayerManager.h"
|
RelativePath="..\PlayerManager.h"
|
||||||
>
|
>
|
||||||
@ -1232,6 +1240,10 @@
|
|||||||
RelativePath="..\..\public\ITimerSystem.h"
|
RelativePath="..\..\public\ITimerSystem.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\public\ITranslator.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\public\IUserMessages.h"
|
RelativePath="..\..\public\IUserMessages.h"
|
||||||
>
|
>
|
||||||
|
@ -50,43 +50,6 @@
|
|||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t CorePlayerTranslate(int client, char *buffer, size_t maxlength, const char *phrase, void **params)
|
|
||||||
{
|
|
||||||
Translation pTrans;
|
|
||||||
TransError err;
|
|
||||||
|
|
||||||
err = g_pCorePhrases->GetTranslation(phrase, g_Translator.GetClientLanguage(client), &pTrans);
|
|
||||||
if (err != Trans_Okay)
|
|
||||||
{
|
|
||||||
err = g_pCorePhrases->GetTranslation(phrase, g_Translator.GetServerLanguage(), &pTrans);
|
|
||||||
if (err != Trans_Okay && g_Translator.GetServerLanguage() != CORELANG_ENGLISH)
|
|
||||||
{
|
|
||||||
err = g_pCorePhrases->GetTranslation(phrase, CORELANG_ENGLISH, &pTrans);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err != Trans_Okay)
|
|
||||||
{
|
|
||||||
return UTIL_Format(buffer, maxlength, "%s", phrase);
|
|
||||||
}
|
|
||||||
|
|
||||||
return g_Translator.Translate(buffer, maxlength, params, &pTrans);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool TryTranslation(CPlugin *pl, const char *key, unsigned int langid, unsigned int langcount, Translation *pTrans)
|
|
||||||
{
|
|
||||||
TransError err = Trans_BadLanguage;
|
|
||||||
CPhraseFile *phrfl;
|
|
||||||
|
|
||||||
for (size_t i=0; i<langcount && err!=Trans_Okay; i++)
|
|
||||||
{
|
|
||||||
phrfl = g_Translator.GetFileByIndex(pl->GetLangFileByIndex(i));
|
|
||||||
err = phrfl->GetTranslation(key, langid, pTrans);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (err == Trans_Okay) ? true : false;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void ReorderTranslationParams(const Translation *pTrans, cell_t *params)
|
inline void ReorderTranslationParams(const Translation *pTrans, cell_t *params)
|
||||||
{
|
{
|
||||||
cell_t new_params[MAX_TRANSLATE_PARAMS];
|
cell_t new_params[MAX_TRANSLATE_PARAMS];
|
||||||
@ -110,11 +73,13 @@ size_t Translate(char *buffer,
|
|||||||
*error = false;
|
*error = false;
|
||||||
Translation pTrans;
|
Translation pTrans;
|
||||||
CPlugin *pl = (CPlugin *)g_PluginSys.FindPluginByContext(pCtx->GetContext());
|
CPlugin *pl = (CPlugin *)g_PluginSys.FindPluginByContext(pCtx->GetContext());
|
||||||
size_t langcount = pl->GetLangFileCount();
|
|
||||||
unsigned int max_params = 0;
|
unsigned int max_params = 0;
|
||||||
|
IPhraseCollection *pPhrases;
|
||||||
|
|
||||||
|
pPhrases = pl->GetPhrases();
|
||||||
|
|
||||||
try_serverlang:
|
try_serverlang:
|
||||||
if (target == LANG_SERVER)
|
if (target == SOURCEMOD_SERVER_LANGUAGE)
|
||||||
{
|
{
|
||||||
langid = g_Translator.GetServerLanguage();
|
langid = g_Translator.GetServerLanguage();
|
||||||
}
|
}
|
||||||
@ -128,16 +93,16 @@ try_serverlang:
|
|||||||
goto error_out;
|
goto error_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TryTranslation(pl, key, langid, langcount, &pTrans))
|
if (pPhrases->FindTranslation(key, langid, &pTrans) != Trans_Okay)
|
||||||
{
|
{
|
||||||
if (target != LANG_SERVER && langid != g_Translator.GetServerLanguage())
|
if (target != SOURCEMOD_SERVER_LANGUAGE && langid != g_Translator.GetServerLanguage())
|
||||||
{
|
{
|
||||||
target = LANG_SERVER;
|
target = SOURCEMOD_SERVER_LANGUAGE;
|
||||||
goto try_serverlang;
|
goto try_serverlang;
|
||||||
}
|
}
|
||||||
else if (langid != LANGUAGE_ENGLISH)
|
else if (langid != SOURCEMOD_LANGUAGE_ENGLISH)
|
||||||
{
|
{
|
||||||
if (!TryTranslation(pl, key, LANGUAGE_ENGLISH, langcount, &pTrans))
|
if (!pPhrases->FindTranslation(key, SOURCEMOD_LANGUAGE_ENGLISH, &pTrans))
|
||||||
{
|
{
|
||||||
pCtx->ThrowNativeErrorEx(SP_ERROR_PARAM, "Language phrase \"%s\" not found", key);
|
pCtx->ThrowNativeErrorEx(SP_ERROR_PARAM, "Language phrase \"%s\" not found", key);
|
||||||
goto error_out;
|
goto error_out;
|
||||||
@ -575,11 +540,32 @@ void AddHex(char **buf_p, size_t &maxlen, unsigned int val, int width, int flags
|
|||||||
*buf_p = buf;
|
*buf_p = buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t gnprintf(char *buffer, size_t maxlen, const char *format, void **args)
|
bool gnprintf(char *buffer,
|
||||||
|
size_t maxlen,
|
||||||
|
const char *format,
|
||||||
|
IPhraseCollection *pPhrases,
|
||||||
|
void **params,
|
||||||
|
unsigned int numparams,
|
||||||
|
unsigned int &curparam,
|
||||||
|
size_t *pOutLength,
|
||||||
|
const char **pFailPhrase)
|
||||||
{
|
{
|
||||||
if (!buffer || !maxlen)
|
if (!buffer || !maxlen)
|
||||||
{
|
{
|
||||||
return 0;
|
if (pOutLength != NULL)
|
||||||
|
{
|
||||||
|
*pOutLength = 0;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numparams > MAX_TRANSLATE_PARAMS)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int arg = 0;
|
int arg = 0;
|
||||||
@ -668,7 +654,16 @@ reswitch:
|
|||||||
{
|
{
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
char *c = (char *)args[arg];
|
if (curparam >= numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
char *c = (char *)params[curparam];
|
||||||
|
curparam++;
|
||||||
*buf_p++ = *c;
|
*buf_p++ = *c;
|
||||||
llen--;
|
llen--;
|
||||||
arg++;
|
arg++;
|
||||||
@ -676,7 +671,16 @@ reswitch:
|
|||||||
}
|
}
|
||||||
case 'b':
|
case 'b':
|
||||||
{
|
{
|
||||||
int *value = (int *)args[arg];
|
if (curparam >= numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int *value = (int *)params[curparam];
|
||||||
|
curparam++;
|
||||||
AddBinary(&buf_p, llen, *value, width, flags);
|
AddBinary(&buf_p, llen, *value, width, flags);
|
||||||
arg++;
|
arg++;
|
||||||
break;
|
break;
|
||||||
@ -684,35 +688,224 @@ reswitch:
|
|||||||
case 'd':
|
case 'd':
|
||||||
case 'i':
|
case 'i':
|
||||||
{
|
{
|
||||||
int *value = (int *)args[arg];
|
if (curparam >= numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int *value = (int *)params[curparam];
|
||||||
|
curparam++;
|
||||||
AddInt(&buf_p, llen, *value, width, flags);
|
AddInt(&buf_p, llen, *value, width, flags);
|
||||||
arg++;
|
arg++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'u':
|
case 'u':
|
||||||
{
|
{
|
||||||
unsigned int *value = (unsigned int *)args[arg];
|
if (curparam >= numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
unsigned int *value = (unsigned int *)params[curparam];
|
||||||
|
curparam++;
|
||||||
AddUInt(&buf_p, llen, *value, width, flags);
|
AddUInt(&buf_p, llen, *value, width, flags);
|
||||||
arg++;
|
arg++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'f':
|
case 'f':
|
||||||
{
|
{
|
||||||
float *value = (float *)args[arg];
|
if (curparam >= numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
float *value = (float *)params[curparam];
|
||||||
|
curparam++;
|
||||||
AddFloat(&buf_p, llen, *value, width, prec, flags);
|
AddFloat(&buf_p, llen, *value, width, prec, flags);
|
||||||
arg++;
|
arg++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 's':
|
case 's':
|
||||||
{
|
{
|
||||||
const char *str = (const char *)args[arg];
|
if (curparam >= numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const char *str = (const char *)params[curparam];
|
||||||
|
curparam++;
|
||||||
AddString(&buf_p, llen, str, width, prec);
|
AddString(&buf_p, llen, str, width, prec);
|
||||||
arg++;
|
arg++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'T':
|
||||||
|
case 't':
|
||||||
|
{
|
||||||
|
int target;
|
||||||
|
const char *key;
|
||||||
|
size_t out_length;
|
||||||
|
Translation trans;
|
||||||
|
unsigned int lang_id;
|
||||||
|
|
||||||
|
if (curparam >= numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
key = (const char *)(params[curparam]);
|
||||||
|
curparam++;
|
||||||
|
|
||||||
|
if (ch == 'T')
|
||||||
|
{
|
||||||
|
if (curparam >= numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
target = *((int *)(params[curparam]));
|
||||||
|
curparam++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
target = g_Translator.GetGlobalTarget();
|
||||||
|
}
|
||||||
|
|
||||||
|
try_again:
|
||||||
|
if (target == SOURCEMOD_SERVER_LANGUAGE)
|
||||||
|
{
|
||||||
|
lang_id = g_Translator.GetServerLanguage();
|
||||||
|
}
|
||||||
|
else if (target >= 1 && target <= g_Players.GetMaxClients())
|
||||||
|
{
|
||||||
|
lang_id = g_Translator.GetClientLanguage(target);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lang_id = g_Translator.GetServerLanguage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pPhrases == NULL)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = key;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pPhrases->FindTranslation(key, lang_id, &trans) != Trans_Okay)
|
||||||
|
{
|
||||||
|
if (target != SOURCEMOD_SERVER_LANGUAGE && lang_id != g_Translator.GetServerLanguage())
|
||||||
|
{
|
||||||
|
target = SOURCEMOD_SERVER_LANGUAGE;
|
||||||
|
goto try_again;
|
||||||
|
}
|
||||||
|
else if (lang_id != SOURCEMOD_LANGUAGE_ENGLISH)
|
||||||
|
{
|
||||||
|
if (pPhrases->FindTranslation(key, SOURCEMOD_LANGUAGE_ENGLISH, &trans) != Trans_Okay)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = key;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = key;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trans.fmt_count)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
void *new_params[MAX_TRANSLATE_PARAMS];
|
||||||
|
|
||||||
|
if (curparam + trans.fmt_count > numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the array and re-order the stack */
|
||||||
|
memcpy(new_params, params, sizeof(void *) * numparams);
|
||||||
|
for (i = 0; i < trans.fmt_count; i++)
|
||||||
|
{
|
||||||
|
new_params[i] = const_cast<void *>(params[curparam + trans.fmt_order[i]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gnprintf(buf_p,
|
||||||
|
llen,
|
||||||
|
trans.szPhrase,
|
||||||
|
pPhrases,
|
||||||
|
new_params,
|
||||||
|
numparams,
|
||||||
|
curparam,
|
||||||
|
&out_length,
|
||||||
|
pFailPhrase))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!gnprintf(buf_p,
|
||||||
|
llen,
|
||||||
|
trans.szPhrase,
|
||||||
|
pPhrases,
|
||||||
|
params,
|
||||||
|
numparams,
|
||||||
|
curparam,
|
||||||
|
&out_length,
|
||||||
|
pFailPhrase))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buf_p += out_length;
|
||||||
|
llen -= out_length;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'X':
|
case 'X':
|
||||||
{
|
{
|
||||||
unsigned int *value = (unsigned int *)args[arg];
|
if (curparam >= numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
unsigned int *value = (unsigned int *)params[curparam];
|
||||||
|
curparam++;
|
||||||
flags |= UPPERDIGITS;
|
flags |= UPPERDIGITS;
|
||||||
AddHex(&buf_p, llen, *value, width, flags);
|
AddHex(&buf_p, llen, *value, width, flags);
|
||||||
arg++;
|
arg++;
|
||||||
@ -720,7 +913,16 @@ reswitch:
|
|||||||
}
|
}
|
||||||
case 'x':
|
case 'x':
|
||||||
{
|
{
|
||||||
unsigned int *value = (unsigned int *)args[arg];
|
if (curparam >= numparams)
|
||||||
|
{
|
||||||
|
if (pFailPhrase != NULL)
|
||||||
|
{
|
||||||
|
*pFailPhrase = NULL;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
unsigned int *value = (unsigned int *)params[curparam];
|
||||||
|
curparam++;
|
||||||
AddHex(&buf_p, llen, *value, width, flags);
|
AddHex(&buf_p, llen, *value, width, flags);
|
||||||
arg++;
|
arg++;
|
||||||
break;
|
break;
|
||||||
@ -761,7 +963,12 @@ reswitch:
|
|||||||
done:
|
done:
|
||||||
*buf_p = '\0';
|
*buf_p = '\0';
|
||||||
|
|
||||||
return (maxlen - llen - 1);
|
if (pOutLength != NULL)
|
||||||
|
{
|
||||||
|
*pOutLength = (maxlen - llen - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t atcprintf(char *buffer, size_t maxlen, const char *format, IPluginContext *pCtx, const cell_t *params, int *param)
|
size_t atcprintf(char *buffer, size_t maxlen, const char *format, IPluginContext *pCtx, const cell_t *params, int *param)
|
||||||
|
@ -33,23 +33,30 @@
|
|||||||
#define _INCLUDE_SOURCEMOD_STRINGUTIL_H_
|
#define _INCLUDE_SOURCEMOD_STRINGUTIL_H_
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "sp_vm_api.h"
|
#include <sp_vm_api.h>
|
||||||
#include "sp_typeutil.h"
|
#include <sp_typeutil.h>
|
||||||
|
#include <ITranslator.h>
|
||||||
|
|
||||||
using namespace SourcePawn;
|
using namespace SourcePawn;
|
||||||
|
using namespace SourceMod;
|
||||||
#define LANG_SERVER 0
|
|
||||||
|
|
||||||
#define IS_STR_FILLED(var) (var[0] != '\0')
|
#define IS_STR_FILLED(var) (var[0] != '\0')
|
||||||
|
|
||||||
size_t atcprintf(char *buffer, size_t maxlen, const char *format, IPluginContext *pCtx, const cell_t *params, int *param);
|
size_t atcprintf(char *buffer, size_t maxlen, const char *format, IPluginContext *pCtx, const cell_t *params, int *param);
|
||||||
const char *stristr(const char *str, const char *substr);
|
const char *stristr(const char *str, const char *substr);
|
||||||
unsigned int strncopy(char *dest, const char *src, size_t count);
|
unsigned int strncopy(char *dest, const char *src, size_t count);
|
||||||
size_t gnprintf(char *buffer, size_t maxlen, const char *format, void **args);
|
bool gnprintf(char *buffer,
|
||||||
|
size_t maxlen,
|
||||||
|
const char *format,
|
||||||
|
IPhraseCollection *pPhrases,
|
||||||
|
void **params,
|
||||||
|
unsigned int numparams,
|
||||||
|
unsigned int &curparam,
|
||||||
|
size_t *pOutLength,
|
||||||
|
const char **pFailPhrase);
|
||||||
size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...);
|
size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...);
|
||||||
size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list ap);
|
size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list ap);
|
||||||
char *sm_strdup(const char *str);
|
char *sm_strdup(const char *str);
|
||||||
size_t CorePlayerTranslate(int client, char *buffer, size_t maxlength, const char *phrase, void **params);
|
|
||||||
unsigned int UTIL_ReplaceAll(char *subject, size_t maxlength, const char *search, const char *replace);
|
unsigned int UTIL_ReplaceAll(char *subject, size_t maxlength, const char *search, const char *replace);
|
||||||
char *UTIL_ReplaceEx(char *subject, size_t maxLen, const char *search, size_t searchLen, const char *replace, size_t replaceLen);
|
char *UTIL_ReplaceEx(char *subject, size_t maxLen, const char *search, size_t searchLen, const char *replace, size_t replaceLen);
|
||||||
char *UTIL_TrimWhitespace(char *str, size_t &len);
|
char *UTIL_TrimWhitespace(char *str, size_t &len);
|
||||||
|
@ -828,7 +828,7 @@ static cell_t sm_PrintToConsole(IPluginContext *pCtx, const cell_t *params)
|
|||||||
|
|
||||||
static cell_t sm_ServerCommand(IPluginContext *pContext, const cell_t *params)
|
static cell_t sm_ServerCommand(IPluginContext *pContext, const cell_t *params)
|
||||||
{
|
{
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
|
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
size_t len = g_SourceMod.FormatString(buffer, sizeof(buffer)-2, pContext, params, 1);
|
size_t len = g_SourceMod.FormatString(buffer, sizeof(buffer)-2, pContext, params, 1);
|
||||||
@ -849,7 +849,7 @@ static cell_t sm_ServerCommand(IPluginContext *pContext, const cell_t *params)
|
|||||||
|
|
||||||
static cell_t sm_InsertServerCommand(IPluginContext *pContext, const cell_t *params)
|
static cell_t sm_InsertServerCommand(IPluginContext *pContext, const cell_t *params)
|
||||||
{
|
{
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
|
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
size_t len = g_SourceMod.FormatString(buffer, sizeof(buffer)-2, pContext, params, 1);
|
size_t len = g_SourceMod.FormatString(buffer, sizeof(buffer)-2, pContext, params, 1);
|
||||||
|
@ -126,7 +126,7 @@ static cell_t ThrowError(IPluginContext *pContext, const cell_t *params)
|
|||||||
{
|
{
|
||||||
char buffer[512];
|
char buffer[512];
|
||||||
|
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
|
|
||||||
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
|
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
|
||||||
|
|
||||||
@ -502,7 +502,7 @@ static cell_t LibraryExists(IPluginContext *pContext, const cell_t *params)
|
|||||||
static cell_t sm_LogAction(IPluginContext *pContext, const cell_t *params)
|
static cell_t sm_LogAction(IPluginContext *pContext, const cell_t *params)
|
||||||
{
|
{
|
||||||
char buffer[2048];
|
char buffer[2048];
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 3);
|
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 3);
|
||||||
|
|
||||||
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
||||||
@ -532,7 +532,7 @@ static cell_t LogToFile(IPluginContext *pContext, const cell_t *params)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char buffer[2048];
|
char buffer[2048];
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
|
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
|
||||||
|
|
||||||
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
||||||
@ -565,7 +565,7 @@ static cell_t LogToFileEx(IPluginContext *pContext, const cell_t *params)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char buffer[2048];
|
char buffer[2048];
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
|
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
|
||||||
|
|
||||||
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
||||||
|
@ -136,7 +136,7 @@ static cell_t ThrowNativeError(IPluginContext *pContext, const cell_t *params)
|
|||||||
return pContext->ThrowNativeError("Not called from inside a native function");
|
return pContext->ThrowNativeError("Not called from inside a native function");
|
||||||
}
|
}
|
||||||
|
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
|
|
||||||
char buffer[512];
|
char buffer[512];
|
||||||
|
|
||||||
|
@ -568,7 +568,7 @@ static cell_t sm_BuildPath(IPluginContext *pContext, const cell_t *params)
|
|||||||
|
|
||||||
static cell_t sm_LogToGame(IPluginContext *pContext, const cell_t *params)
|
static cell_t sm_LogToGame(IPluginContext *pContext, const cell_t *params)
|
||||||
{
|
{
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
|
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
size_t len = g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
|
size_t len = g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
|
||||||
@ -594,7 +594,7 @@ static cell_t sm_LogToGame(IPluginContext *pContext, const cell_t *params)
|
|||||||
|
|
||||||
static cell_t sm_LogMessage(IPluginContext *pContext, const cell_t *params)
|
static cell_t sm_LogMessage(IPluginContext *pContext, const cell_t *params)
|
||||||
{
|
{
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
|
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
|
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
|
||||||
@ -612,7 +612,7 @@ static cell_t sm_LogMessage(IPluginContext *pContext, const cell_t *params)
|
|||||||
|
|
||||||
static cell_t sm_LogError(IPluginContext *pContext, const cell_t *params)
|
static cell_t sm_LogError(IPluginContext *pContext, const cell_t *params)
|
||||||
{
|
{
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
|
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
|
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
|
||||||
@ -667,7 +667,7 @@ static cell_t sm_LogToOpenFile(IPluginContext *pContext, const cell_t *params)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char buffer[2048];
|
char buffer[2048];
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
|
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
|
||||||
|
|
||||||
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
||||||
@ -698,7 +698,7 @@ static cell_t sm_LogToOpenFileEx(IPluginContext *pContext, const cell_t *params)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char buffer[2048];
|
char buffer[2048];
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
|
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
|
||||||
|
|
||||||
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
||||||
|
@ -37,24 +37,25 @@
|
|||||||
|
|
||||||
static cell_t sm_LoadTranslations(IPluginContext *pCtx, const cell_t *params)
|
static cell_t sm_LoadTranslations(IPluginContext *pCtx, const cell_t *params)
|
||||||
{
|
{
|
||||||
char *filename;
|
char *filename, *ext;
|
||||||
unsigned int index;
|
char buffer[PLATFORM_MAX_PATH];
|
||||||
CPlugin *pl = (CPlugin *)g_PluginSys.FindPluginByContext(pCtx->GetContext());
|
CPlugin *pl = (CPlugin *)g_PluginSys.FindPluginByContext(pCtx->GetContext());
|
||||||
|
|
||||||
pCtx->LocalToString(params[1], &filename);
|
pCtx->LocalToString(params[1], &filename);
|
||||||
|
UTIL_Format(buffer, sizeof(buffer), "%s", filename);
|
||||||
|
|
||||||
/* Check if there is no extension */
|
/* Make sure there is no extension */
|
||||||
const char *ext = g_LibSys.GetFileExtension(filename);
|
if ((ext = strstr(buffer, ".txt")) != NULL
|
||||||
if (!ext || (strcmp(ext, "cfg") && strcmp(ext, "txt")))
|
|| (ext = strstr(buffer, ".cfg")) != NULL)
|
||||||
{
|
{
|
||||||
/* Append one */
|
/* Simple heuristic -- just see if it's at the end and terminate if so */
|
||||||
static char new_file[PLATFORM_MAX_PATH];
|
if (ext - buffer == strlen(buffer) - 4)
|
||||||
UTIL_Format(new_file, sizeof(new_file), "%s.txt", filename);
|
{
|
||||||
filename = new_file;
|
*ext = '\0';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
index = g_Translator.FindOrAddPhraseFile(filename);
|
pl->GetPhrases()->AddPhraseFile(buffer);
|
||||||
pl->AddLangFile(index);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -838,7 +838,7 @@ static cell_t SetMenuTitle(IPluginContext *pContext, const cell_t *params)
|
|||||||
return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
|
return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
|
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
|
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
|
||||||
|
@ -928,7 +928,7 @@ static cell_t _ShowActivity(IPluginContext *pContext,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param);
|
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param);
|
||||||
|
|
||||||
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
||||||
@ -1065,7 +1065,7 @@ static cell_t _ShowActivity2(IPluginContext *pContext,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_SourceMod.SetGlobalTarget(LANG_SERVER);
|
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
|
||||||
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param);
|
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param);
|
||||||
|
|
||||||
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
if (pContext->GetContext()->n_err != SP_ERROR_NONE)
|
||||||
|
@ -67,6 +67,7 @@ CPlugin::CPlugin(const char *file)
|
|||||||
m_FakeNativesMissing = false;
|
m_FakeNativesMissing = false;
|
||||||
m_LibraryMissing = false;
|
m_LibraryMissing = false;
|
||||||
m_bGotAllLoaded = false;
|
m_bGotAllLoaded = false;
|
||||||
|
m_pPhrases = g_Translator.CreatePhraseCollection();
|
||||||
}
|
}
|
||||||
|
|
||||||
CPlugin::~CPlugin()
|
CPlugin::~CPlugin()
|
||||||
@ -111,6 +112,11 @@ CPlugin::~CPlugin()
|
|||||||
delete m_configs[i];
|
delete m_configs[i];
|
||||||
}
|
}
|
||||||
m_configs.clear();
|
m_configs.clear();
|
||||||
|
if (m_pPhrases != NULL)
|
||||||
|
{
|
||||||
|
m_pPhrases->Destroy();
|
||||||
|
m_pPhrases = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlugin::InitIdentity()
|
void CPlugin::InitIdentity()
|
||||||
@ -128,7 +134,6 @@ unsigned int CPlugin::CalcMemUsage()
|
|||||||
unsigned int base_size =
|
unsigned int base_size =
|
||||||
sizeof(CPlugin)
|
sizeof(CPlugin)
|
||||||
+ sizeof(IdentityToken_t)
|
+ sizeof(IdentityToken_t)
|
||||||
+ (m_PhraseFiles.size() * sizeof(unsigned int))
|
|
||||||
+ (m_dependents.size() * sizeof(CPlugin *))
|
+ (m_dependents.size() * sizeof(CPlugin *))
|
||||||
+ (m_dependsOn.size() * sizeof(CPlugin *))
|
+ (m_dependsOn.size() * sizeof(CPlugin *))
|
||||||
+ (m_fakeNatives.size() * (sizeof(FakeNative *) + sizeof(FakeNative)))
|
+ (m_fakeNatives.size() * (sizeof(FakeNative *) + sizeof(FakeNative)))
|
||||||
@ -710,19 +715,9 @@ void CPlugin::SetTimeStamp(time_t t)
|
|||||||
m_LastAccess = t;
|
m_LastAccess = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlugin::AddLangFile(unsigned int index)
|
IPhraseCollection *CPlugin::GetPhrases()
|
||||||
{
|
{
|
||||||
m_PhraseFiles.push_back(index);
|
return m_pPhrases;
|
||||||
}
|
|
||||||
|
|
||||||
size_t CPlugin::GetLangFileCount()
|
|
||||||
{
|
|
||||||
return m_PhraseFiles.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int CPlugin::GetLangFileByIndex(unsigned int index)
|
|
||||||
{
|
|
||||||
return m_PhraseFiles.at(index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlugin::DependencyDropped(CPlugin *pOwner)
|
void CPlugin::DependencyDropped(CPlugin *pOwner)
|
||||||
@ -1488,8 +1483,8 @@ bool CPluginManager::RunSecondPass(CPlugin *pPlugin, char *error, size_t maxleng
|
|||||||
OnLibraryAction((*s_iter).c_str(), true, false);
|
OnLibraryAction((*s_iter).c_str(), true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finally, add the core language file */
|
/* :TODO: optimize? does this even matter? */
|
||||||
pPlugin->AddLangFile(g_pCorePhraseID);
|
pPlugin->GetPhrases()->AddPhraseFile("core.phrases");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -53,6 +53,7 @@
|
|||||||
#else
|
#else
|
||||||
#include "convar_sm.h"
|
#include "convar_sm.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "ITranslator.h"
|
||||||
|
|
||||||
using namespace SourceHook;
|
using namespace SourceHook;
|
||||||
|
|
||||||
@ -244,19 +245,9 @@ public:
|
|||||||
bool IsRunnable();
|
bool IsRunnable();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a language file index to the plugin's list.
|
* Get languages info.
|
||||||
*/
|
*/
|
||||||
void AddLangFile(unsigned int index);
|
IPhraseCollection *GetPhrases();
|
||||||
|
|
||||||
/**
|
|
||||||
* Get language file count for this plugin.
|
|
||||||
*/
|
|
||||||
size_t GetLangFileCount();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get language file index based on the vector index.
|
|
||||||
*/
|
|
||||||
unsigned int GetLangFileByIndex(unsigned int index);
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Returns the modification time during last plugin load.
|
* Returns the modification time during last plugin load.
|
||||||
@ -300,7 +291,7 @@ private:
|
|||||||
IdentityToken_t *m_ident;
|
IdentityToken_t *m_ident;
|
||||||
Handle_t m_handle;
|
Handle_t m_handle;
|
||||||
bool m_WasRunning;
|
bool m_WasRunning;
|
||||||
CVector<unsigned int> m_PhraseFiles;
|
IPhraseCollection *m_pPhrases;
|
||||||
List<CPlugin *> m_dependents;
|
List<CPlugin *> m_dependents;
|
||||||
List<CPlugin *> m_dependsOn;
|
List<CPlugin *> m_dependsOn;
|
||||||
List<FakeNative *> m_fakeNatives;
|
List<FakeNative *> m_fakeNatives;
|
||||||
|
@ -221,6 +221,7 @@ namespace SourceMod
|
|||||||
* translations (that is, %t).
|
* translations (that is, %t).
|
||||||
*
|
*
|
||||||
* @param index Client index.
|
* @param index Client index.
|
||||||
|
* @deprecated Use ITranslator::GetGlobalTarget() instead.
|
||||||
* @return Old global client value.
|
* @return Old global client value.
|
||||||
*/
|
*/
|
||||||
virtual unsigned int SetGlobalTarget(unsigned int index) =0;
|
virtual unsigned int SetGlobalTarget(unsigned int index) =0;
|
||||||
@ -229,6 +230,7 @@ namespace SourceMod
|
|||||||
* @brief Returns the global client SourceMod is currently using
|
* @brief Returns the global client SourceMod is currently using
|
||||||
* for assisted translations (that is, %t).
|
* for assisted translations (that is, %t).
|
||||||
*
|
*
|
||||||
|
* @deprecated Use ITranslator::GetGlobalTarget() instead.
|
||||||
* @return Global client value.
|
* @return Global client value.
|
||||||
*/
|
*/
|
||||||
virtual unsigned int GetGlobalTarget() const =0;
|
virtual unsigned int GetGlobalTarget() const =0;
|
||||||
|
329
public/ITranslator.h
Normal file
329
public/ITranslator.h
Normal file
@ -0,0 +1,329 @@
|
|||||||
|
/**
|
||||||
|
* vim: set ts=4 :
|
||||||
|
* =============================================================================
|
||||||
|
* SourceMod
|
||||||
|
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
|
||||||
|
* =============================================================================
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it under
|
||||||
|
* the terms of the GNU General Public License, version 3.0, as published by the
|
||||||
|
* Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* As a special exception, AlliedModders LLC gives you permission to link the
|
||||||
|
* code of this program (as well as its derivative works) to "Half-Life 2," the
|
||||||
|
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
|
||||||
|
* by the Valve Corporation. You must obey the GNU General Public License in
|
||||||
|
* all respects for all other code used. Additionally, AlliedModders LLC grants
|
||||||
|
* this exception to all derivative works. AlliedModders LLC defines further
|
||||||
|
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
|
||||||
|
* or <http://www.sourcemod.net/license.php>.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_SOURCEMOD_TRANSLATOR_INTERFACE_H_
|
||||||
|
#define _INCLUDE_SOURCEMOD_TRANSLATOR_INTERFACE_H_
|
||||||
|
|
||||||
|
#include <IShareSys.h>
|
||||||
|
|
||||||
|
#define SMINTERFACE_TRANSLATOR_NAME "ITranslator"
|
||||||
|
#define SMINTERFACE_TRANSLATOR_VERSION 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file ITranslator.h
|
||||||
|
* @brief Defines interfaces related to translation files.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace SourceMod
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @brief SourceMod hardcodes the English language (default) to ID 0.
|
||||||
|
* This cannot be changed and languages.cfg should never have it as anything
|
||||||
|
* other than the first index.
|
||||||
|
*/
|
||||||
|
#define SOURCEMOD_LANGUAGE_ENGLISH 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief For %T formats, specifies that the language should be that of the
|
||||||
|
* server and not a specific client.
|
||||||
|
*/
|
||||||
|
#define SOURCEMOD_SERVER_LANGUAGE 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Translation error codes.
|
||||||
|
*/
|
||||||
|
enum TransError
|
||||||
|
{
|
||||||
|
Trans_Okay = 0, /**< Translation succeeded. */
|
||||||
|
Trans_BadLanguage = 1, /**< Bad language ID. */
|
||||||
|
Trans_BadPhrase = 2, /**< Phrase not found. */
|
||||||
|
Trans_BadPhraseLanguage = 3, /**< Phrase not found in the given language. */
|
||||||
|
Trans_BadPhraseFile = 4, /**< Phrase file was unreadable. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Contains information about a translation phrase.
|
||||||
|
*/
|
||||||
|
struct Translation
|
||||||
|
{
|
||||||
|
const char *szPhrase; /**< Translated phrase. */
|
||||||
|
unsigned int fmt_count; /**< Number of format parameters. */
|
||||||
|
int *fmt_order; /**< Array of size fmt_count where each
|
||||||
|
element is the numerical order of
|
||||||
|
parameter insertion, starting from
|
||||||
|
0.
|
||||||
|
*/
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Represents a phrase file from SourceMod's "translations" folder.
|
||||||
|
*/
|
||||||
|
class IPhraseFile
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Attempts to find a translation phrase in a phrase file.
|
||||||
|
*
|
||||||
|
* @param szPhrase String containing the phrase name.
|
||||||
|
* @param lang_id Language ID.
|
||||||
|
* @param pTrans Buffer to store translation info.
|
||||||
|
* @return Translation error code indicating success
|
||||||
|
* (pTrans is filled) or failure (pTrans
|
||||||
|
* contents is undefined).
|
||||||
|
*/
|
||||||
|
virtual TransError GetTranslation(
|
||||||
|
const char *szPhrase,
|
||||||
|
unsigned int lang_id,
|
||||||
|
Translation *pTrans) =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the file name of this translation file.
|
||||||
|
*
|
||||||
|
* @return File name.
|
||||||
|
*/
|
||||||
|
virtual const char *GetFilename() =0;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a collection of phrase files.
|
||||||
|
*/
|
||||||
|
class IPhraseCollection
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Adds a phrase file to the collection, using a cached one
|
||||||
|
* if already found. The return value is provided for informational
|
||||||
|
* purposes and does not need to be saved. The life time of the
|
||||||
|
* return pointer is equal to the life time of the collection.
|
||||||
|
*
|
||||||
|
* This function will internally ignore dupliate additions but still
|
||||||
|
* return a valid pointer.
|
||||||
|
*
|
||||||
|
* @param filename File name, without the ".txt" extension, of
|
||||||
|
* the phrase file in the translations folder.
|
||||||
|
* @return An IPhraseFile pointer, even if the file does
|
||||||
|
* not exist.
|
||||||
|
*/
|
||||||
|
virtual IPhraseFile *AddPhraseFile(const char *filename) =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the number of contained phrase files.
|
||||||
|
*
|
||||||
|
* @return Number of contained phrase files.
|
||||||
|
*/
|
||||||
|
virtual unsigned int GetFileCount() =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the pointer to a contained phrase file.
|
||||||
|
*
|
||||||
|
* @param file File index, from 0 to GetFileCount()-1.
|
||||||
|
* @return IPhraseFile pointer, or NULL if out of
|
||||||
|
* range.
|
||||||
|
*/
|
||||||
|
virtual IPhraseFile *GetFile(unsigned int file) =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destroys the phrase collection, freeing all internal
|
||||||
|
* resources and invalidating the object.
|
||||||
|
*/
|
||||||
|
virtual void Destroy() =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Attempts a translation across a given language. All
|
||||||
|
* contained files are searched for an appropriate match; the
|
||||||
|
* first valid match is returned.
|
||||||
|
*
|
||||||
|
* @param key String containing the phrase name.
|
||||||
|
* @param langid Language ID to translate to.
|
||||||
|
* @param pTrans Translation buffer.
|
||||||
|
* @return Translation error code; on success,
|
||||||
|
* pTrans is valid. On failure, the
|
||||||
|
* contents of pTrans is undefined.
|
||||||
|
*/
|
||||||
|
virtual TransError FindTranslation(
|
||||||
|
const char *key,
|
||||||
|
unsigned int langid,
|
||||||
|
Translation *pTrans) =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Formats a phrase given a parameter stack. The parameter
|
||||||
|
* stack size must exactly match the expected parameter count. If
|
||||||
|
* this count is too small or too large, the format fails.
|
||||||
|
*
|
||||||
|
* @param buffer Buffer to store formatted text.
|
||||||
|
* @param maxlength Maximum length of the buffer.
|
||||||
|
* @param format String containing format information.
|
||||||
|
* This is equivalent to SourceMod's Format()
|
||||||
|
* native, and sub-translations are acceptable.
|
||||||
|
* @param params An array of pointers to each parameter.
|
||||||
|
* Integer parameters must have a pointer to the integer.
|
||||||
|
* Float parameters must have a pointer to a float.
|
||||||
|
* String parameters must be a string pointer.
|
||||||
|
* Char parameters must be a pointer to a char.
|
||||||
|
* Translation parameters fill multiple indexes in the
|
||||||
|
* array. For %T translations, the expected stack is:
|
||||||
|
* [phrase string pointer] [int target id pointer] [...]
|
||||||
|
* Where [...] is the required parameters for the translation,
|
||||||
|
* in the order expected by the phrase, not the phrase's
|
||||||
|
* translation. For example, say the format is:
|
||||||
|
* "%d %T" and the phrase's format is {1:s,2:f}, then the
|
||||||
|
* parameter stack should be:
|
||||||
|
* int *, const char *, int *, const char *, float *
|
||||||
|
* The %t modifier is the same except the target id pointer
|
||||||
|
* would be removed:
|
||||||
|
* int *, const char *, const char *, float *
|
||||||
|
* @param numparams Number of parameters in the params array.
|
||||||
|
* @param pOutLength Optional pointer filled with output length on success.
|
||||||
|
* @param pFailPhrase Optional pointer; on failure, is filled with NULL if the
|
||||||
|
* failure was not due to a failed translation phrase.
|
||||||
|
* Otherwise, it is filled with the given phrase name pointer
|
||||||
|
* from the parameter stack. Undefined on success.
|
||||||
|
* @return True on success. False if the parameter stack was not
|
||||||
|
* exactly the right length, or if a translation phrase
|
||||||
|
* could not be found.
|
||||||
|
*/
|
||||||
|
virtual bool FormatString(
|
||||||
|
char *buffer,
|
||||||
|
size_t maxlength,
|
||||||
|
const char *format,
|
||||||
|
void **params,
|
||||||
|
unsigned int numparams,
|
||||||
|
size_t *pOutLength,
|
||||||
|
const char **pFailPhrase) =0;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Provides functions for translation.
|
||||||
|
*/
|
||||||
|
class ITranslator : public SMInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual const char *GetInterfaceName() =0;
|
||||||
|
virtual unsigned int GetInterfaceVersion() =0;
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Creates a new phrase collection object.
|
||||||
|
*
|
||||||
|
* @return A new phrase collection object, which must be
|
||||||
|
* destroyed via IPhraseCollection::Destroy() when
|
||||||
|
* no longer needed.
|
||||||
|
*/
|
||||||
|
virtual IPhraseCollection *CreatePhraseCollection() =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the server language.
|
||||||
|
*
|
||||||
|
* @return Server language index.
|
||||||
|
*/
|
||||||
|
virtual unsigned int GetServerLanguage() =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns a client's language.
|
||||||
|
*
|
||||||
|
* @param client Client index.
|
||||||
|
* @return Client language index, or server's if client's is
|
||||||
|
* not known.
|
||||||
|
*/
|
||||||
|
virtual unsigned int GetClientLanguage(int client) =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the global client SourceMod will use for assisted
|
||||||
|
* translations (that is, %t).
|
||||||
|
*
|
||||||
|
* @param index Client index (0 for server).
|
||||||
|
* @return Old global client value.
|
||||||
|
*/
|
||||||
|
virtual int SetGlobalTarget(int index) =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the global client SourceMod is currently using
|
||||||
|
* for assisted translations (that is, %t).
|
||||||
|
*
|
||||||
|
* @return Global client index (0 for server).
|
||||||
|
*/
|
||||||
|
virtual int GetGlobalTarget() const =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Formats a phrase given a parameter stack. The parameter
|
||||||
|
* stack size must exactly match the expected parameter count. If
|
||||||
|
* this count is too small or too large, the format fails.
|
||||||
|
*
|
||||||
|
* Note: This is the same as IPhraseCollection::FormatString(), except
|
||||||
|
* that the IPhraseCollection parameter is explicit instead of implicit.
|
||||||
|
*
|
||||||
|
* @param buffer Buffer to store formatted text.
|
||||||
|
* @param maxlength Maximum length of the buffer.
|
||||||
|
* @param format String containing format information.
|
||||||
|
* This is equivalent to SourceMod's Format()
|
||||||
|
* native, and sub-translations are acceptable.
|
||||||
|
* @param pPhrases Optional phrase collection pointer to search for
|
||||||
|
* phrases.
|
||||||
|
* @param params An array of pointers to each parameter.
|
||||||
|
* Integer parameters must have a pointer to the integer.
|
||||||
|
* Float parameters must have a pointer to a float.
|
||||||
|
* String parameters must be a string pointer.
|
||||||
|
* Char parameters must be a pointer to a char.
|
||||||
|
* Translation parameters fill multiple indexes in the
|
||||||
|
* array. For %T translations, the expected stack is:
|
||||||
|
* [phrase string pointer] [int target id pointer] [...]
|
||||||
|
* Where [...] is the required parameters for the translation,
|
||||||
|
* in the order expected by the phrase, not the phrase's
|
||||||
|
* translation. For example, say the format is:
|
||||||
|
* "%d %T" and the phrase's format is {1:s,2:f}, then the
|
||||||
|
* parameter stack should be:
|
||||||
|
* int *, const char *, int *, const char *, float *
|
||||||
|
* The %t modifier is the same except the target id pointer
|
||||||
|
* would be removed:
|
||||||
|
* int *, const char *, const char *, float *
|
||||||
|
* @param numparams Number of parameters in the params array.
|
||||||
|
* @param pOutLength Optional pointer filled with output length on success.
|
||||||
|
* @param pFailPhrase Optional pointer; on failure, is filled with NULL if the
|
||||||
|
* failure was not due to a failed translation phrase.
|
||||||
|
* Otherwise, it is filled with the given phrase name pointer
|
||||||
|
* from the parameter stack. Undefined on success.
|
||||||
|
* @return True on success. False if the parameter stack was not
|
||||||
|
* exactly the right length, or if a translation phrase
|
||||||
|
* could not be found.
|
||||||
|
*/
|
||||||
|
virtual bool FormatString(
|
||||||
|
char *buffer,
|
||||||
|
size_t maxlength,
|
||||||
|
const char *format,
|
||||||
|
IPhraseCollection *pPhrases,
|
||||||
|
void **params,
|
||||||
|
unsigned int numparams,
|
||||||
|
size_t *pOutLength,
|
||||||
|
const char **pFailPhrase) =0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //_INCLUDE_SOURCEMOD_TRANSLATOR_INTERFACE_H_
|
||||||
|
|
@ -79,6 +79,9 @@ bool SM_AcquireInterfaces(char *error, size_t maxlength)
|
|||||||
#if defined SMEXT_ENABLE_TEXTPARSERS
|
#if defined SMEXT_ENABLE_TEXTPARSERS
|
||||||
SM_FIND_IFACE_OR_FAIL(TEXTPARSERS, sm_text, error, maxlength);
|
SM_FIND_IFACE_OR_FAIL(TEXTPARSERS, sm_text, error, maxlength);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined SMEXT_ENABLE_TRANSLATOR
|
||||||
|
SM_FIND_IFACE_OR_FAIL(TRANSLATOR, sm_translator, error, maxlength);
|
||||||
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -131,6 +134,9 @@ void SM_UnsetInterfaces()
|
|||||||
#if defined SMEXT_ENABLE_TEXTPARSERS
|
#if defined SMEXT_ENABLE_TEXTPARSERS
|
||||||
sm_text = NULL;
|
sm_text = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined SMEXT_ENABLE_TRANSLATOR
|
||||||
|
sm_translator = NULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
IExtension *myself = NULL;
|
IExtension *myself = NULL;
|
||||||
@ -179,4 +185,6 @@ SourceMod::IAdminSystem *sm_adminsys = NULL;
|
|||||||
#if defined SMEXT_ENABLE_TEXTPARSERS
|
#if defined SMEXT_ENABLE_TEXTPARSERS
|
||||||
SourceMod::ITextParsers *sm_text = NULL;
|
SourceMod::ITextParsers *sm_text = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined SMEXT_ENABLE_TRANSLATOR
|
||||||
|
SourceMod::ITranslator *sm_translator = NULL;
|
||||||
|
#endif
|
||||||
|
@ -70,6 +70,7 @@ void SM_UnsetInterfaces();
|
|||||||
//#define SMEXT_ENABLE_PLUGINSYS
|
//#define SMEXT_ENABLE_PLUGINSYS
|
||||||
//#define SMEXT_ENABLE_ADMINSYS
|
//#define SMEXT_ENABLE_ADMINSYS
|
||||||
//#define SMEXT_ENABLE_TEXTPARSERS
|
//#define SMEXT_ENABLE_TEXTPARSERS
|
||||||
|
//#define SMEXT_ENABLE_TRANSLATOR
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -155,5 +156,10 @@ extern SourceMod::IAdminSystem *sm_adminsys;
|
|||||||
extern SourceMod::ITextParsers *sm_text;
|
extern SourceMod::ITextParsers *sm_text;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined SMEXT_ENABLE_TRANSLATOR
|
||||||
|
#include <ITranslator.h>
|
||||||
|
extern SourceMod::ITranslator *sm_translator;
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif //_INCLUDE_SOURCEMOD_CONFIG_H_
|
#endif //_INCLUDE_SOURCEMOD_CONFIG_H_
|
||||||
|
|
||||||
|
@ -75,5 +75,6 @@
|
|||||||
//#define SMEXT_ENABLE_ADMINSYS
|
//#define SMEXT_ENABLE_ADMINSYS
|
||||||
//#define SMEXT_ENABLE_TEXTPARSERS
|
//#define SMEXT_ENABLE_TEXTPARSERS
|
||||||
//#define SMEXT_ENABLE_USERMSGS
|
//#define SMEXT_ENABLE_USERMSGS
|
||||||
|
//#define SMEXT_ENABLE_TRANSLATOR
|
||||||
|
|
||||||
#endif // _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_
|
#endif // _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_
|
||||||
|
@ -94,6 +94,9 @@ ITextParsers *textparsers = NULL;
|
|||||||
#if defined SMEXT_ENABLE_USERMSGS
|
#if defined SMEXT_ENABLE_USERMSGS
|
||||||
IUserMessages *usermsgs = NULL;
|
IUserMessages *usermsgs = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined SMEXT_ENABLE_TRANSLATOR
|
||||||
|
ITranslator *translator = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
/** Exports the main interface */
|
/** Exports the main interface */
|
||||||
PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
|
PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
|
||||||
@ -179,6 +182,9 @@ bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error,
|
|||||||
#if defined SMEXT_ENABLE_USERMSGS
|
#if defined SMEXT_ENABLE_USERMSGS
|
||||||
SM_GET_IFACE(USERMSGS, usermsgs);
|
SM_GET_IFACE(USERMSGS, usermsgs);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined SMEXT_ENABLE_TRANSLATOR
|
||||||
|
SM_GET_IFACE(TRANSLATOR, translator);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (SDK_OnLoad(error, maxlength, late))
|
if (SDK_OnLoad(error, maxlength, late))
|
||||||
{
|
{
|
||||||
|
@ -88,6 +88,9 @@
|
|||||||
#if defined SMEXT_ENABLE_USERMSGS
|
#if defined SMEXT_ENABLE_USERMSGS
|
||||||
#include <IUserMessages.h>
|
#include <IUserMessages.h>
|
||||||
#endif
|
#endif
|
||||||
|
#if defined SMEXT_ENABLE_TRANSLATOR
|
||||||
|
#include <ITranslator.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined SMEXT_CONF_METAMOD
|
#if defined SMEXT_CONF_METAMOD
|
||||||
#include <ISmmPlugin.h>
|
#include <ISmmPlugin.h>
|
||||||
@ -283,6 +286,9 @@ extern IAdminSystem *adminsys;
|
|||||||
#if defined SMEXT_ENABLE_USERMSGS
|
#if defined SMEXT_ENABLE_USERMSGS
|
||||||
extern IUserMessages *usermsgs;
|
extern IUserMessages *usermsgs;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined SMEXT_ENABLE_TRANSLATOR
|
||||||
|
extern ITranslator *translator;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined SMEXT_CONF_METAMOD
|
#if defined SMEXT_CONF_METAMOD
|
||||||
PLUGIN_GLOBALVARS();
|
PLUGIN_GLOBALVARS();
|
||||||
|
Loading…
Reference in New Issue
Block a user