-#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