/*----------------------------------------------------------------------------*-YAdmin system - Languages CoreChangelog:23/03/07:First version.-*----------------------------------------------------------------------------*/#define LANGUAGE_FILE_NAME "YSS_lang" // Change to Settings_GetSetting("LANGUAGE_FILE_NAME")#define LANGUAGE_FILE_PATH "YSS/languages/"#define MAX_LANGUAGE_IDENTIFIER 4#define MAX_LANGUAGE_NAME 32#define MAX_LANGUAGE_PATH 64 // filename inclusive as they're constants#define NO_LANGUAGE_SLOT Language:-1forward Language:Langs_GetPlayerLanguage(playerid);enum e_LANG_FLAG (<<= 1){ e_LANG_FLAG_NONE, e_LANG_FLAG_ACTIVE = 1}enum E_LANGUAGES{ E_LANGUAGES_IDENTIFIER[MAX_LANGUAGE_IDENTIFIER], E_LANGUAGES_NAME[MAX_LANGUAGE_NAME], e_LANG_FLAG:E_LANGUAGES_FLAGS}static g_sLoaded = 0, g_sLanguages[MAX_LANGUAGES][E_LANGUAGES];/*----------------------------------------------------------------------------*-Function: Langs_LangsParams: -Return: Langs_LoadAll().Notes: The "constructor" for all this, although it just forwards (inline).-*----------------------------------------------------------------------------*/#define Langs_Langs() \ Langs_LoadAll()/*----------------------------------------------------------------------------*-Function: Langs_IsActiveParams: Language:languageID - The language index you want to check the state of.Return: e_LANG_FLAG_ACTIVE state.Notes: Tries to be an inline function.-*----------------------------------------------------------------------------*/#define Langs_IsActive(%1) \ (g_sLanguages[%1][E_LANGUAGES_FLAGS] & e_LANG_FLAG_ACTIVE)/*----------------------------------------------------------------------------*-Function: Langs_LanguageIdentifierParams: Language:languageID - index of language to get identifier for.Return: g_sLanguages[languageID][E_LANGUAGES_IDENTIFIER].Notes: Gets the identifier for a language for INTERNAL use. See also Langs_GetLanguageIdentifier.-*----------------------------------------------------------------------------*/#define Langs_LanguageIdentifier(%1) \ (g_sLanguages[%1][E_LANGUAGES_IDENTIFIER])/*----------------------------------------------------------------------------*-Function: Langs_SendEntryDataParams: function[] - The remote function to save the data to. identifier[] - The string identifier for the text. text[] - The text itself.Return: -Notes: All the remote functions are the same but this allows you to only save text from certain text sections in your module (i.e. all text you want is save to one big array).-*----------------------------------------------------------------------------*/#define Langs_SendEntryData(%1,%2,%3) \ CallRemoteFunction((%1), "ss", (%2), (%3))/*----------------------------------------------------------------------------*-Function: Langs_NewInputParams: Language:LanguageIDReturn: -Notes: Sets the remote systems up to recieve data for the new language.-*----------------------------------------------------------------------------*/#define Langs_NewInput(%1) \ CallRemoteFunction("Text_NewLanguage", "i", _:(%1))/*----------------------------------------------------------------------------*-Function: Langs_ResetAllParams: -Return: -Notes: Resets the local state and the remote text states.-*----------------------------------------------------------------------------*/#define Langs_ResetAll() \ CallRemoteFunction("Text_ResetAll", ""); \ g_sLoaded = 0/*----------------------------------------------------------------------------*-Function: Langs_SaveEnteredDataParams: Language:languageID, the index of the language you want to save.Return: -Notes: Once all the data for a language has been loaded it needs to be parsed so that when the data needs to be accessed it's all nicely formatted for speedy retrieval. See Text_Parse for more details.-*----------------------------------------------------------------------------*/#define Langs_SaveEnteredData() \ CallRemoteFunction("Text_Parse", "")/*----------------------------------------------------------------------------*-Function: Langs_ParseFileParams: Language:languageID - The index of the language we want to retrieve the data for.Return: bool: language file load successNotes: Loads one langage's file and distribites the data across all modules. Sends data via specially named functions: public LanguageText_<library set>(identifier[], text[], languageid) {} Where <library set> is the part of the file currently being read (e.g. [chat], [common] etc).-*----------------------------------------------------------------------------*/bool:Langs_ParseFile(Language:languageID){ new filename[MAX_LANGUAGE_PATH], File:f; format(filename, sizeof (filename), "%s%s.%s", LANGUAGE_FILE_PATH, LANGUAGE_FILE_NAME, Langs_LanguageIdentifier(languageID)); if (!(f = fopen(filename, io_read))) return false; Langs_NewInput(languageID); new line[MAX_STRING], tagName[MAX_STRING]; while (fread(f, line)) { if (line[0] == '[') { if (!INI_GetTagName(line, tagName)) tagName[0] = '\0'; else stradd(tagName, "Text_Tag_%s"); } else if (tagName[0]) { StripNL(line); new stringIdent[MAX_TEXT_NAME], stringText[MAX_TEXT_ENTRY]; if (!INI_GetEntryName(line, stringIdent) || !INI_GetEntryText(line, stringText)) continue; Langs_SendEntryData(tagName, stringIdent, stringText); } } fclose(f); Langs_SaveEnteredData(); return true;}/*----------------------------------------------------------------------------*-Function: Langs_LoadAllParams: -Return: -Notes: Loops through the language files requested in the ini and calls the loading function for that one. Languages required are loaded from the ini and passed via Langs_AddLangage to be loaded here.-*----------------------------------------------------------------------------*/Langs_LoadAll(){ Langs_ResetAll(); new Language:i; while (i < MAX_LANGUAGES) { if (Langs_IsActive(i) && Langs_ParseFile(i)) g_sLoaded = 1; i++; }}/*----------------------------------------------------------------------------*-Function: Langs_AddLanguageParams: identifier[] - The two or three character shortcode for language identi- fication and for the extension on the language file (e.g. "EN"). name[] - The real-world name of this language (e.g. "English").Return: Language: Fail - -1, Success - index.Notes: If all the languages have been loaded initially this adds the langauge to the list and then loads the data. If they've not been initialise it just adds it to the list of languages to load.-*----------------------------------------------------------------------------*/Language:Langs_AddLanguage(identifier[], name[]){ new Language:i; while (i < MAX_LANGUAGES) { if (!Langs_IsActive(i)) break; i++; } if (i == MAX_LANGUAGES) return NO_LANGUAGE_SLOT; g_sLanguages[i][E_LANGUAGES_FLAGS] = e_LANG_FLAG_ACTIVE; strcpy(g_sLanguages[i][E_LANGUAGES_IDENTIFIER], identifier); // Copy the null byte too strcpy(g_sLanguages[i][E_LANGUAGES_NAME], name); if (g_sLoaded) // Langages already loaded so load this one now { Langs_ParseFile(i); } return i;}/*----------------------------------------------------------------------------*-Function: Langs_GetLanguageIdentifierParams: Language:languageID - index of language to get identifier for.Return: g_sLanguages[languageID][E_LANGUAGES_IDENTIFIER].Notes: Gets the identifier for a language for EXTERNAL use. See also: Langs_LanguageIdentifier.-*----------------------------------------------------------------------------*/stock Langs_GetLanguageIdentifier(Language:languageID){ return Langs_LanguageIdentifier(languageID);}/*----------------------------------------------------------------------------*-Function: Langs_GetLanguageIDParams: identifier[] - The string identifier of the language you want to get.Return: The Language: id.Notes: --*----------------------------------------------------------------------------*/Language:Langs_GetLanguageID(identifier[]){ for (new Language:i; i < MAX_LANGUAGES; i++) { if (!strcmp(identifier, g_sLanguages[i][E_LANGUAGES_IDENTIFIER])) return i; } return NO_LANGUAGE_SLOT;}/*----------------------------------------------------------------------------*-Function: Langs_GetPlayerLanguageParams: playeridReturn: Language:player languageNotes: --*----------------------------------------------------------------------------*/public Language:Langs_GetPlayerLanguage(playerid){ return Language:0;}