added language system
[NeonServV5.git] / lang.c
1 #include "lang.h"
2 #include "UserNode.h"
3
4 #define DEFAULT_LANG_TAG "EN"
5 #define DEFAULT_LANG_NAME "English"
6
7 static struct language **langdict;
8 static struct language *lang_c;
9
10 void init_lang() {
11     langdict = calloc(MAXLANGUAGES, sizeof(*langdict));
12 }
13
14 void free_lang() {
15     
16 }
17
18 static struct language* add_language(char *langtag, char *langname) {
19     int index;
20     for(index = 0; index < MAXLANGUAGES; index++) {
21         if(langdict[index] == NULL) break;
22         if(!strcmp(langdict[index]->langname, langname) || !strcmp(langdict[index]->langtag, langtag))
23             return langdict[index];
24     }
25     if(index == MAXLANGUAGES) return NULL;
26     struct language *lang = malloc(sizeof(*lang));
27     if (!lang) {
28         perror("malloc() failed");
29         return NULL;
30     }
31     lang->langtag = strdup(langtag);
32     lang->langname = strdup(langname);
33     struct language_table **entrys = calloc(27, sizeof(*entrys));
34     lang->entrys = entrys;
35     return lang;
36 }
37
38 static int get_entry_index(const char *ident) {
39     const char *underscore = strstr(ident, "_");
40     if(!underscore || !(underscore[1] >= 65 && underscore[1] <= 90)) return 26;
41     return (underscore[1] - 'A');
42 }
43
44 struct language* get_language_by_tag(char *tag) {
45     int index;
46     for(index = 0; index < MAXLANGUAGES; index++) {
47         if(langdict[index] == NULL) break;
48         if(!strcmp(langdict[index]->langtag, tag))
49             return langdict[index];
50     }
51     return NULL;
52 }
53
54 struct language* get_language_by_name(char *name) {
55     int index;
56     for(index = 0; index < MAXLANGUAGES; index++) {
57         if(langdict[index] == NULL) break;
58         if(!strcmp(langdict[index]->langname, name))
59             return langdict[index];
60     }
61     return NULL;
62 }
63
64 struct language* get_default_language() {
65     if(lang_c == NULL) 
66         lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME);
67     return lang_c;
68 }
69
70 void register_default_language_table(const struct default_language_entry *msgtab) {
71     if(lang_c == NULL) 
72         lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME);
73     struct language_table *lang_entry;
74     int index;
75     while(msgtab->ident) {
76         index = get_entry_index(msgtab->ident);
77         lang_entry = malloc(sizeof(*lang_entry));
78         if (!lang_entry) {
79             perror("malloc() failed");
80             return;
81         }
82         lang_entry->ident = strdup(msgtab->ident);
83         lang_entry->text = strdup(msgtab->text);
84         lang_entry->next = lang_c->entrys[index];
85         lang_c->entrys[index] = lang_entry;
86         msgtab++;
87     }
88 }
89
90 char *get_language_string(struct UserNode *user, char* msg_ident) {
91     struct language* lang;
92     if((user->flags & USERFLAG_ISAUTHED)) {
93         if(!(user->flags & USERFLAG_LOADED_SETTINGS))
94             load_user_settings(user);
95         lang = user->language;
96     } else
97         lang = lang_c;
98     int index = get_entry_index(msg_ident);
99     struct language_table* entry;
100     for(entry = lang->entrys[index]; entry; entry = entry->next) {
101         if(!strcmp(entry->ident, msg_ident))
102             return entry->text;
103     }
104 }