X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Fi18n.qh;h=3069f519dc33454a5310a68a52e9ba16d2570fd8;hb=fc6a7642cb0a75c7ae7e69701b8615d03dfa269e;hp=87c41cda5dc209f228c1dc15481340acc817fab7;hpb=8da45596c76bb645e864b4ec8ff5a3ee13bbf27c;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/i18n.qh b/qcsrc/lib/i18n.qh index 87c41cda5..3069f519d 100644 --- a/qcsrc/lib/i18n.qh +++ b/qcsrc/lib/i18n.qh @@ -1,34 +1,68 @@ -#ifndef I18N_H -#define I18N_H +#pragma once #include "log.qh" +#include "map.qh" +#include "unsafe.qh" // translation helpers string prvm_language; +/** + * @deprecated prefer _("translatable text") - GMQCC's -ftranslatable-strings feature + */ +ERASEABLE string language_filename(string s) { - string fn = prvm_language; - if (fn == "" || fn == "dump") - return s; - fn = strcat(s, ".", fn); - int fh = fopen(fn, FILE_READ); - if (fh >= 0) - { - fclose(fh); - return fn; - } - return s; + string fn = prvm_language; + if (fn == "" || fn == "dump") return s; + fn = strcat(s, ".", fn); + int fh = fopen(fn, FILE_READ); + if (fh >= 0) + { + fclose(fh); + return fn; + } + return s; } +#ifndef CTX_CACHE + #define CTX_CACHE 1 +#endif + +#if CTX_CACHE + HashMap CTX_cache; + STATIC_INIT(CTX_cache) + { + HM_NEW(CTX_cache); + } + SHUTDOWN(CTX_cache) + { + HM_DELETE(CTX_cache); + } +#endif + +ERASEABLE string CTX(string s) { - int p = strstrofs(s, "^", 0); - if (p < 0) - return s; - return substring(s, p + 1, -1); +#if CTX_CACHE + string c = HM_gets(CTX_cache, s); + if (c != "") return c; +#endif + 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\")", s); + HM_sets(CTX_cache, s, ret); +#endif + return ret; } #define ZCTX(s) strzone(CTX(s)) - -#endif