]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/lib/i18n.qh
Merge branch 'master' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / i18n.qh
index afb38ff95686509917343c9af5af6b43efb8faca..3069f519dc33454a5310a68a52e9ba16d2570fd8 100644 (file)
@@ -1,12 +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 _("translatable text") - GMQCC's -ftranslatable-strings feature
+ */
+ERASEABLE
 string language_filename(string s)
 {
        string fn = prvm_language;
@@ -26,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