Raised This Month: $51 Target: $400
 12% 

Function to check if translation exists


  
 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
Author Message
joao7yt
Senior Member
Join Date: Nov 2014
Location: Brazil
Old 06-25-2017 , 02:46   Function to check if translation exists
Reply With Quote #1

Version 1

Version 2


The code will cache the valid translations in an array. Then it will simply check if that translation is available in the array in the client language, server language or English.
It's coded using SMC Parser, which will prevent any bugs related with multi-line comments in the file.
PHP Code:
Handle langs INVALID_HANDLE;
Handle transid INVALID_HANDLE;
Handle translang INVALID_HANDLE;

char transidbuffer[64];
bool parsefirstsection;
bool getlangs;
bool parsecontains[16];

public 
void OnPluginStart()
{
    
langs CreateArray(16);
    
transid CreateArray(64);
    
translang CreateArray(16);
    
    
LoadTranslations("common.phrases");
    
LoadTranslationsEx("common.phrases");
}

stock bool TranslationExists(int client, const char[] phrase)
{
    
int langservernum GetServerLanguage();
    
int langnum;
    if (
client == 0)
    {
        
langnum GetServerLanguage();
    }
    else
    {
        
langnum GetClientLanguage(client);
    }
    
    
char langservercode[16];
    
char langcode[16];
    
GetLanguageInfo(langservernumlangservercodesizeof(langservercode));
    
GetLanguageInfo(langnumlangcodesizeof(langcode));
    
    for (
int i 0GetArraySize(transid); i++)
    {
        
char buffer1[64];
        
GetArrayString(transidibuffer1sizeof(buffer1));
        
        if (
StrEqual(phrasebuffer1))
        {
            
char buffer2[64];
            
GetArrayString(translangibuffer2sizeof(buffer2));
            
            if (
StrEqual(langcodebuffer2) || StrEqual("en"buffer2) || StrEqual(langservercodebuffer2))
            {
                return 
true;
            }
        }
    }
    
    return 
false;
}

stock void LoadTranslationsEx(const char[] file)
{
    
char cfgFile[PLATFORM_MAX_PATH];
    
char dirName[PLATFORM_MAX_PATH];
    
    
BuildPath(Path_SMdirNamePLATFORM_MAX_PATH"configs");
    
BuildPath(Path_SMcfgFilePLATFORM_MAX_PATH"configs/languages.cfg");
    
    if (
DirExists(dirName) && FileExists(cfgFile))
    {
        
Handle smc SMC_CreateParser();
        
        
parsefirstsection true;
        
getlangs true;
        
        
SMC_SetReaders(smcNewSectionKeyValueEndSection);
        
SMC_ParseFile(smccfgFile);
        
        
CloseHandle(smc);
    }
    
    for (
int i 0GetArraySize(langs); i++)
    {
        
char buffer[64];
        
GetArrayString(langsibuffersizeof(buffer));
        
        if (
StrEqual(buffer"en"false))
        {
            
BuildPath(Path_SMdirNamePLATFORM_MAX_PATH"translations");
            
BuildPath(Path_SMcfgFilePLATFORM_MAX_PATH"translations/%s.txt"file);
            
            if (
DirExists(dirName) && FileExists(cfgFile))
            {
                
Handle smc SMC_CreateParser();
                
                
parsefirstsection true;
                
                
SMC_SetReaders(smcNewSectionKeyValueEndSection);
                
SMC_ParseFile(smccfgFile);
                
                
CloseHandle(smc);
            }
        }
        else
        {
            
BuildPath(Path_SMdirNamePLATFORM_MAX_PATH"translations/%s"buffer);
            
BuildPath(Path_SMcfgFilePLATFORM_MAX_PATH"translations/%s/%s.txt"bufferfile);
            
            if (
DirExists(dirName) && FileExists(cfgFile))
            {
                
Handle smc SMC_CreateParser();
                
                
parsefirstsection true;
                
                
SMC_SetReaders(smcNewSectionKeyValueEndSection);
                
SMC_ParseFile(smccfgFile);
                
                
CloseHandle(smc);
            }
        }
    }
}

stock SMCResult NewSection(Handle parser, const char[] namebool quotes)
{
    for (
int i 1sizeof(parsecontains); i++)
    {
        
parsecontains[i] = false;
    }
    
    if (
getlangs)
    {
        if (!
StrEqual(name"Languages"))
        {
            
getlangs false;
            return 
SMCParse_HaltFail;
        }
        else
        {
            return 
SMCParse_Continue;
        }
    }
    else
    {
        if (
parsefirstsection)
        {
            if (!
StrEqual(name"Phrases"))
            {
                return 
SMCParse_HaltFail;
            }
            else
            {
                
parsefirstsection false;
                return 
SMCParse_Continue;
            }
        }
    }
    
    
Format(transidbuffersizeof(transidbuffer), name);
    return 
SMCParse_Continue;
}

stock SMCResult KeyValue(Handle parser, const char[] key, const char[] valuebool key_quotesbool value_quotes)
{
    if (
getlangs)
    {
        for (
int i 0GetArraySize(langs); i++)
        {
            
char buffer[16];
            
GetArrayString(langsibuffersizeof(buffer));
            if (
StrEqual(keybufferfalse))
            {
                return 
SMCParse_Continue;
            }
        }
        
        
PushArrayString(langskey);
        return 
SMCParse_Continue;
    }
    else
    {
        if (
StrEqual(key"#format"false))
        {
            for (
int i 1sizeof(parsecontains); i++)
            {
                
char buffer[4];
                
Format(buffersizeof(buffer), "{%d:"i);
                if (
StrContains(valuebuffer) != -1)
                {
                    
parsecontains[i] = true;
                }
                else
                {
                    
parsecontains[i] = false;
                }
            }
            return 
SMCParse_Continue;
        }
        else if (
StrEqual(value""))
        {
            return 
SMCParse_Continue;
        }
        
        for (
int i 0GetArraySize(transid); i++)
        {
            
char buffer1[64];
            
GetArrayString(transidibuffer1sizeof(buffer1));
            if (
StrEqual(transidbufferbuffer1))
            {
                
char buffer2[16];
                
GetArrayString(translangibuffer2sizeof(buffer2));
                if (
StrEqual(keybuffer2false))
                {
                    return 
SMCParse_Continue;
                }
            }
        }
        
        for (
int i 1sizeof(parsecontains); i++)
        {
            if (
parsecontains[i])
            {
                
char buffer[4];
                
Format(buffersizeof(buffer), "{%d}"i);
                if (
StrContains(valuebuffer) == -1)
                {
                    return 
SMCParse_Continue;
                }
            }
        }
        
        
PushArrayString(transidtransidbuffer);
        
PushArrayString(translangkey);
        
        return 
SMCParse_Continue;
    }
}

stock SMCResult EndSection(Handle parser)
{
    if (
getlangs)
    {
        
getlangs false;
    }

Call it like this:
PHP Code:
if (TranslationExists(client"Changing map"))
{
    
PrintToChat(client"%t""Changing map""de_dust2");
}
else
{
    
PrintToChat(client"Changing map to %s...""de_dust2");


Last edited by joao7yt; 06-27-2017 at 17:33.
joao7yt is offline
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 15:06.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode