X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Fi18n.qh;h=3069f519dc33454a5310a68a52e9ba16d2570fd8;hb=6c4bdd5eeea06db69a457997de24bef84b4eaf93;hp=fd8ec83066ec7438fc3c9f8302c8efbcc034d90b;hpb=a6a02b07fbd36a24bbf1afe353ff40ac71ef9850;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/i18n.qh b/qcsrc/lib/i18n.qh index fd8ec8306..3069f519d 100644 --- a/qcsrc/lib/i18n.qh +++ b/qcsrc/lib/i18n.qh @@ -1,15 +1,16 @@ -#ifndef I18N_H -#define I18N_H +#pragma once #include "log.qh" +#include "map.qh" #include "unsafe.qh" // translation helpers string prvm_language; /** - * @deprecated prefer _("translated") + * @deprecated prefer _("translatable text") - GMQCC's -ftranslatable-strings feature */ +ERASEABLE string language_filename(string s) { string fn = prvm_language; @@ -29,33 +30,39 @@ string language_filename(string s) #endif #if CTX_CACHE - ArrayList CTX_cache; + HashMap CTX_cache; STATIC_INIT(CTX_cache) { - AL_NEW(CTX_cache, 0, string_null, s); + HM_NEW(CTX_cache); } SHUTDOWN(CTX_cache) { - AL_DELETE(CTX_cache); + HM_DELETE(CTX_cache); } #endif +ERASEABLE string CTX(string s) { #if CTX_CACHE - int i = strid(s); - string c = AL_gets(CTX_cache, i); - if (c) return c; + string c = HM_gets(CTX_cache, s); + if (c != "") return c; #endif - int p = strstrofs(s, "^", 0); - string ret = (p < 0) ? s : substring(s, p + 1, -1); + int caret_ofs = strstrofs(s, "^", 0); + string ret = s; + // empty (caret_ofs == 0) and one char (caret_ofs == 1) prefixes are invalid + if (caret_ofs > 1) + { + int space_ofs = strstrofs(substring(s, 0, caret_ofs), " ", 0); + // prefixes containing a space are invalid (likely the caret is part of a color code) + if (space_ofs < 0 || space_ofs > caret_ofs) + ret = substring(s, caret_ofs + 1, -1); + } #if CTX_CACHE - LOG_DEBUGF("CTX(\"%s\")\n", s); - AL_sets(CTX_cache, i, ret); + LOG_DEBUGF("CTX(\"%s\")", s); + HM_sets(CTX_cache, s, ret); #endif return ret; } #define ZCTX(s) strzone(CTX(s)) - -#endif