+#include "lang.h"
+#include "UserNode.h"
+
+#define DEFAULT_LANG_TAG "EN"
+#define DEFAULT_LANG_NAME "English"
+
+static struct language **langdict;
+static struct language *lang_c;
+
+void init_lang() {
+ langdict = calloc(MAXLANGUAGES, sizeof(*langdict));
+}
+
+void free_lang() {
+
+}
+
+static struct language* add_language(char *langtag, char *langname) {
+ int index;
+ for(index = 0; index < MAXLANGUAGES; index++) {
+ if(langdict[index] == NULL) break;
+ if(!strcmp(langdict[index]->langname, langname) || !strcmp(langdict[index]->langtag, langtag))
+ return langdict[index];
+ }
+ if(index == MAXLANGUAGES) return NULL;
+ struct language *lang = malloc(sizeof(*lang));
+ if (!lang) {
+ perror("malloc() failed");
+ return NULL;
+ }
+ lang->langtag = strdup(langtag);
+ lang->langname = strdup(langname);
+ struct language_table **entrys = calloc(27, sizeof(*entrys));
+ lang->entrys = entrys;
+ return lang;
+}
+
+static int get_entry_index(const char *ident) {
+ const char *underscore = strstr(ident, "_");
+ if(!underscore || !(underscore[1] >= 65 && underscore[1] <= 90)) return 26;
+ return (underscore[1] - 'A');
+}
+
+struct language* get_language_by_tag(char *tag) {
+ int index;
+ for(index = 0; index < MAXLANGUAGES; index++) {
+ if(langdict[index] == NULL) break;
+ if(!strcmp(langdict[index]->langtag, tag))
+ return langdict[index];
+ }
+ return NULL;
+}
+
+struct language* get_language_by_name(char *name) {
+ int index;
+ for(index = 0; index < MAXLANGUAGES; index++) {
+ if(langdict[index] == NULL) break;
+ if(!strcmp(langdict[index]->langname, name))
+ return langdict[index];
+ }
+ return NULL;
+}
+
+struct language* get_default_language() {
+ if(lang_c == NULL)
+ lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME);
+ return lang_c;
+}
+
+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 index;
+ while(msgtab->ident) {
+ index = 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[index];
+ lang_c->entrys[index] = lang_entry;
+ msgtab++;
+ }
+}
+
+char *get_language_string(struct UserNode *user, char* msg_ident) {
+ struct language* lang;
+ if((user->flags & USERFLAG_ISAUTHED)) {
+ if(!(user->flags & USERFLAG_LOADED_SETTINGS))
+ load_user_settings(user);
+ lang = user->language;
+ } else
+ lang = lang_c;
+ int index = get_entry_index(msg_ident);
+ struct language_table* entry;
+ for(entry = lang->entrys[index]; entry; entry = entry->next) {
+ if(!strcmp(entry->ident, msg_ident))
+ return entry->text;
+ }
+}