load all languages on startup
authorpk910 <philipp@zoelle1.de>
Mon, 19 Sep 2011 00:42:55 +0000 (02:42 +0200)
committerpk910 <philipp@zoelle1.de>
Mon, 19 Sep 2011 00:46:37 +0000 (02:46 +0200)
lang.c
lang.h
main.c

diff --git a/lang.c b/lang.c
index 3acd0662548564129a5e381fccbe6a7686a35eef..e515c2b4b0ee7ccb380833c4f879a6dc3cdb4182 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++) {
@@ -42,6 +53,34 @@ 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++) {
@@ -88,6 +127,19 @@ void register_default_language_table(const struct default_language_entry *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);
+    lang_entry->text = strdup(text);
+    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)) {
diff --git a/lang.h b/lang.h
index f2dd4af9b41a196cb7478b831f92c9cb04ee05b1..4aabc8adb6068d06bd983cd3d7dfbddbe6c25c5a 100644 (file)
--- a/lang.h
+++ b/lang.h
@@ -28,6 +28,9 @@ void free_lang();
 struct language* get_language_by_tag(char *tag);
 struct language* get_language_by_name(char *name);
 struct language* get_default_language();
+void load_languages();
+void load_language(char *tag, char *name);
+void register_language_string(struct language *lang, char *ident, char *text);
 void register_default_language_table(const struct default_language_entry *msgtab);
 char *get_language_string(struct UserNode *user, const char* msg_ident);
 char *build_language_string(struct UserNode *user, char *buffer, const char *msg_ident, ...);
diff --git a/main.c b/main.c
index 73b17ff01de8ba45d0355ca272e66a61df7f71e2..2fcc3dbec18349f0feae58657adb0cb8422dc1d1 100644 (file)
--- a/main.c
+++ b/main.c
@@ -48,6 +48,8 @@ int main(void)
     init_tools();
     init_bots();
     
+    load_languages();
+    
     time_t socket_wait;
     while(1) {
         socket_wait = time(0) + SOCKET_SELECT_TIME;