finalized translation routines and formatting
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40428
This commit is contained in:
		
							parent
							
								
									bf145be826
								
							
						
					
					
						commit
						5c90acd7be
					
				| @ -18,6 +18,7 @@ | ||||
| #include "CLogger.h" | ||||
| #include "PluginSys.h" | ||||
| #include "CTranslator.h" | ||||
| #include "CPlayerManager.h" | ||||
| 
 | ||||
| #define LADJUST			0x00000004		/* left adjustment */ | ||||
| #define ZEROPAD			0x00000080		/* zero (as opposed to blank) pad */ | ||||
| @ -26,34 +27,86 @@ | ||||
| 
 | ||||
| #define CHECK_ARGS(x) \ | ||||
| 	if ((arg+x) > args) { \ | ||||
| 		g_Logger.LogError("String formatted incorrectly - parameter %d (total %d)", arg, args); \ | ||||
| 		pCtx->ThrowNativeErrorEx(SP_ERROR_PARAMS_MAX, "String formatted incorrectly - parameter %d (total %d)", arg, args); \ | ||||
| 		return 0; \ | ||||
| 	} | ||||
| 
 | ||||
| size_t Translate(char *buffer, size_t maxlen, IPluginContext *pCtx, const char *key, cell_t target, const cell_t *params, int *arg) | ||||
| inline bool TryServerLanguage(const char *serverlang, unsigned int *langid) | ||||
| { | ||||
| 	unsigned int langid; | ||||
| 	CPlugin *pl = (CPlugin *)g_PluginSys.FindPluginByContext(pCtx->GetContext()); | ||||
| 	size_t langcount = pl->GetLangFileCount(); | ||||
| 
 | ||||
| 	if (!g_Translator.GetLanguageByCode("en", &langid)) 	//:TODO: hardcoded this just for testing
 | ||||
| 	if (!g_Translator.GetLanguageByCode(serverlang, langid)) | ||||
| 	{ | ||||
| 		//:TODO: error out something
 | ||||
| 		if (!g_Translator.GetLanguageByCode("en", langid)) | ||||
| 		{ | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| inline bool TryTranslation(CPlugin *pl, const char *key, unsigned int langid, unsigned int langcount, Translation *pTrans) | ||||
| { | ||||
| 	TransError err = Trans_BadLanguage; | ||||
| 	CPhraseFile *phrfl; | ||||
| 	TransError err = Trans_Okay; | ||||
| 	Translation pTrans; | ||||
| 
 | ||||
| 	for (size_t i=0; i<langcount && err!=Trans_Okay; i++) | ||||
| 	{ | ||||
| 		phrfl = g_Translator.GetFileByIndex(pl->GetFileByIndex(i)); | ||||
| 		err = phrfl->GetTranslation(key, langid, &pTrans); | ||||
| 		err = phrfl->GetTranslation(key, langid, pTrans); | ||||
| 	} | ||||
| 
 | ||||
| 	if (err != Trans_Okay) | ||||
| 	return (err == Trans_Okay) ? true : false; | ||||
| } | ||||
| 
 | ||||
| size_t Translate(char *buffer, size_t maxlen, IPluginContext *pCtx, const char *key, cell_t target, const cell_t *params, int *arg, bool *error) | ||||
| { | ||||
| 	unsigned int langid; | ||||
| 	char *langname = NULL; | ||||
| 	*error = false; | ||||
| 
 | ||||
| try_serverlang: | ||||
| 	if (target == LANG_SERVER) | ||||
| 	{ | ||||
| 		//:TODO: we didnt find our translation in any file :o
 | ||||
| 		langname = "en"; //:TODO: read serverlang
 | ||||
| 		if (!TryServerLanguage(langname ? langname : "en", &langid)) | ||||
| 		{ | ||||
| 			pCtx->ThrowNativeError("Translation failure: English language not found."); | ||||
| 			goto error_out; | ||||
| 		} | ||||
| 	} else if ((target >= 1) && (target <= g_PlayerManager.GetMaxClients())) { | ||||
| 		langname = "en"; //:TODO: read player's lang
 | ||||
| 		if (!langname || !g_Translator.GetLanguageByCode(langname, &langid)) | ||||
| 		{ | ||||
| 			if (langname && !strcmp(langname, "en")) | ||||
| 			{ | ||||
| 				pCtx->ThrowNativeError("Translation failure: English language not found."); | ||||
| 				goto error_out; | ||||
| 			} | ||||
| 			target = LANG_SERVER; | ||||
| 			goto try_serverlang; | ||||
| 		} | ||||
| 	} else { | ||||
| 		pCtx->ThrowNativeErrorEx(SP_ERROR_PARAM, "Translation failed: invalid client index %d", target); | ||||
| 		goto error_out; | ||||
| 	} | ||||
| 
 | ||||
| 	Translation pTrans; | ||||
| 	CPlugin *pl = (CPlugin *)g_PluginSys.FindPluginByContext(pCtx->GetContext()); | ||||
| 	size_t langcount = pl->GetLangFileCount(); | ||||
| 
 | ||||
| 	if (!TryTranslation(pl, key, langid, langcount, &pTrans)) | ||||
| 	{ | ||||
| 		if (target != LANG_SERVER) | ||||
| 		{ | ||||
| 			target = LANG_SERVER; | ||||
| 			goto try_serverlang; | ||||
| 		} else { | ||||
| 			if (!g_Translator.GetLanguageByCode("en", &langid) | ||||
| 				|| !TryTranslation(pl, key, langid, langcount, &pTrans)) | ||||
| 			{ | ||||
| 				pCtx->ThrowNativeErrorEx(SP_ERROR_PARAM, "Language phrase \"%s\" not found", key); | ||||
| 				goto error_out; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	void *new_params[MAX_TRANSLATE_PARAMS]; | ||||
| @ -64,11 +117,15 @@ size_t Translate(char *buffer, size_t maxlen, IPluginContext *pCtx, const char * | ||||
| 		(*arg)++; | ||||
| 		if ((*arg) + i > (size_t)params[0]) | ||||
| 		{ | ||||
| 			//:TODO: we are missing arguments zOMG
 | ||||
| 			pCtx->ThrowNativeErrorEx(SP_ERROR_PARAMS_MAX, "Translation string formatted incorrectly - parameter %d (total %d)", (*arg) + i, params[0]); | ||||
| 			goto error_out; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return g_Translator.Translate(buffer, maxlen, new_params, &pTrans); | ||||
| error_out: | ||||
| 	*error = true; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| //:TODO: review this code before we choose a license
 | ||||
| @ -611,10 +668,34 @@ reswitch: | ||||
| 			{ | ||||
| 				CHECK_ARGS(0); | ||||
| 				char *key; | ||||
| 				bool error; | ||||
| 				size_t res; | ||||
| 				cell_t target = params[arg++]; | ||||
| 				pCtx->LocalToString(params[arg++], &key); | ||||
| 				llen -= Translate(buf_p, llen, pCtx, key, target, params, &arg); | ||||
| 				buf_p += llen; | ||||
| 				res = Translate(buf_p, llen, pCtx, key, target, params, &arg, &error); | ||||
| 				if (error) | ||||
| 				{ | ||||
| 					return 0; | ||||
| 				} | ||||
| 				buf_p += res; | ||||
| 				llen -= res; | ||||
| 				break; | ||||
| 			} | ||||
| 		case 't': | ||||
| 			{ | ||||
| 				CHECK_ARGS(0); | ||||
| 				char *key; | ||||
| 				bool error; | ||||
| 				size_t res; | ||||
| 				cell_t target = g_SourceMod.GetGlobalTarget(); | ||||
| 				pCtx->LocalToString(params[arg++], &key); | ||||
| 				res = Translate(buf_p, llen, pCtx, key, target, params, &arg, &error); | ||||
| 				if (error) | ||||
| 				{ | ||||
| 					return 0; | ||||
| 				} | ||||
| 				buf_p += res; | ||||
| 				llen -= res; | ||||
| 				break; | ||||
| 			} | ||||
| 		case '%': | ||||
|  | ||||
| @ -343,6 +343,16 @@ const char *SourceModBase::GetModPath() | ||||
| 	return g_BaseDir.c_str(); | ||||
| } | ||||
| 
 | ||||
| void SourceModBase::SetGlobalTarget(unsigned int index) | ||||
| { | ||||
| 	m_target = index; | ||||
| } | ||||
| 
 | ||||
| unsigned int SourceModBase::GetGlobalTarget() const | ||||
| { | ||||
| 	return m_target; | ||||
| } | ||||
| 
 | ||||
| SMGlobalClass *SMGlobalClass::head = NULL; | ||||
| 
 | ||||
| SMGlobalClass::SMGlobalClass() | ||||
|  | ||||
| @ -56,6 +56,16 @@ public: | ||||
| 	 */ | ||||
| 	bool IsMapLoading(); | ||||
| 
 | ||||
| 	/** 
 | ||||
| 	* @brief Stores the global target index. | ||||
| 	*/ | ||||
| 	void SetGlobalTarget(unsigned int index); | ||||
| 
 | ||||
| 	/** 
 | ||||
| 	* @brief Returns the global target index. | ||||
| 	*/ | ||||
| 	unsigned int GetGlobalTarget() const; | ||||
| 
 | ||||
| public: //ISourceMod
 | ||||
| 	const char *GetModPath(); | ||||
| 	const char *GetSourceModPath(); | ||||
| @ -73,6 +83,7 @@ private: | ||||
| 	char m_SMRelDir[PLATFORM_MAX_PATH+1]; | ||||
| 	bool m_IsMapLoading; | ||||
| 	bool m_ExecPluginReload; | ||||
| 	unsigned int m_target; | ||||
| }; | ||||
| 
 | ||||
| extern SourceModBase g_SourceMod; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user