changed Makefile; build all commands as an own file
[NeonServV5.git] / lang.c
diff --git a/lang.c b/lang.c
index 3acd0662548564129a5e381fccbe6a7686a35eef..e50e752741e1a2a54e6812c6c96b2d09b16c2d05 100644 (file)
--- a/lang.c
+++ b/lang.c
@@ -1,6 +1,7 @@
 #include "lang.h"
 #include "UserNode.h"
 #include "DBHelper.h"
+#include "mysqlConn.h"
 
 #define DEFAULT_LANG_TAG "EN"
 #define DEFAULT_LANG_NAME "English"
@@ -16,6 +17,16 @@ void free_lang() {
     
 }
 
+void load_languages() {
+    MYSQL_RES *res;
+    MYSQL_ROW row;
+    printf_mysql_query("SELECT `lang`, `text` FROM `language` WHERE `ident` = 'name'");
+    res = mysql_use();
+    while((row = mysql_fetch_row(res)) != NULL) {
+        load_language(row[0], row[1]);
+    }
+}
+
 static struct language* add_language(char *langtag, char *langname) {
     int cindex;
     for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
@@ -33,6 +44,7 @@ static struct language* add_language(char *langtag, char *langname) {
     lang->langname = strdup(langname);
     struct language_table **entrys = calloc(27, sizeof(*entrys));
     lang->entrys = entrys;
+    langdict[cindex] = lang;
     return lang;
 }
 
@@ -42,11 +54,39 @@ static int get_entry_index(const char *ident) {
     return (underscore[1] - 'A');
 }
 
+void load_language(char *tag, char *name) {
+    struct language *lang = get_language_by_tag(tag);
+    if(lang == get_default_language()) return;
+    if(lang) {
+        //remove all entrys
+        int cindex;
+        struct language_table *entry, *next;
+        for(cindex = 0; cindex < 27; cindex++) {
+            for(entry = lang->entrys[cindex]; entry; entry = next) {
+                next = entry->next;
+                free(entry->ident);
+                free(entry->text);
+                free(entry);
+            }
+            lang->entrys[cindex] = NULL;
+        }
+    } else
+        lang = add_language(tag, name);
+    if(!lang) return;
+    MYSQL_RES *res;
+    MYSQL_ROW row;
+    printf_mysql_query("SELECT `ident`, `text` FROM `language` WHERE `lang` = '%s' AND `ident` != 'name'", escape_string(tag));
+    res = mysql_use();
+    while((row = mysql_fetch_row(res)) != NULL) {
+        register_language_string(lang, row[0], row[1]);
+    }
+}
+
 struct language* get_language_by_tag(char *tag) {
     int cindex;
     for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
         if(langdict[cindex] == NULL) break;
-        if(!strcmp(langdict[cindex]->langtag, tag))
+        if(!stricmp(langdict[cindex]->langtag, tag))
             return langdict[cindex];
     }
     return NULL;
@@ -56,7 +96,7 @@ struct language* get_language_by_name(char *name) {
     int cindex;
     for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
         if(langdict[cindex] == NULL) break;
-        if(!strcmp(langdict[cindex]->langname, name))
+        if(!stricmp(langdict[cindex]->langname, name))
             return langdict[cindex];
     }
     return NULL;
@@ -71,23 +111,53 @@ struct language* get_default_language() {
 void register_default_language_table(const struct default_language_entry *msgtab) {
     if(lang_c == NULL) 
         lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME);
-    struct language_table *lang_entry;
-    int cindex;
     while(msgtab->ident) {
-        cindex = get_entry_index(msgtab->ident);
-        lang_entry = malloc(sizeof(*lang_entry));
-        if (!lang_entry) {
-            perror("malloc() failed");
-            return;
-        }
-        lang_entry->ident = strdup(msgtab->ident);
-        lang_entry->text = strdup(msgtab->text);
-        lang_entry->next = lang_c->entrys[cindex];
-        lang_c->entrys[cindex] = lang_entry;
+        register_language_string(lang_c, msgtab->ident, msgtab->text);
         msgtab++;
     }
 }
 
+void register_language_string(struct language *lang, char *ident, char *text) {
+    int cindex = get_entry_index(ident);
+    struct language_table *lang_entry = malloc(sizeof(*lang_entry));
+    if (!lang_entry) {
+        perror("malloc() failed");
+        return;
+    }
+    
+    lang_entry->ident = strdup(ident);
+    //replace all:
+    //$b to \002
+    //$k to \003
+    char txt[MAXLEN];
+    strcpy(txt, text);
+    char tmp[MAXLEN];
+    int tmppos = 0;
+    char *a, *b = txt;
+    do {
+        a = strstr(b, "$");
+        if(a) *a = '\0';
+        tmppos += sprintf(tmp + tmppos, "%s", b);
+        if(a) {
+            switch(a[1]) {
+                case 'b':
+                    tmp[tmppos++] = '\002';
+                    break;
+                case 'k':
+                    tmp[tmppos++] = '\003';
+                    break;
+                default:
+                    //unknown - just write it
+                    tmppos += sprintf(tmp + tmppos, "$%c", a[1]);
+            }
+            b = a+2;
+        }
+    } while(a);
+    lang_entry->text = strdup(tmp);
+    lang_entry->next = lang->entrys[cindex];
+    lang->entrys[cindex] = lang_entry;
+}
+
 char *get_language_string(struct UserNode *user, const char* msg_ident) {
     struct language* lang;
     if((user->flags & USERFLAG_ISAUTHED)) {
@@ -101,6 +171,11 @@ char *get_language_string(struct UserNode *user, const char* msg_ident) {
         if(!strcmp(entry->ident, msg_ident))
             return entry->text;
     }
+    if(lang == lang_c) return NULL;
+    for(entry = lang_c->entrys[cindex]; entry; entry = entry->next) {
+        if(!strcmp(entry->ident, msg_ident))
+            return entry->text;
+    }
     return NULL;
 }