4 #define DEFAULT_LANG_TAG "EN"
5 #define DEFAULT_LANG_NAME "English"
7 static struct language **langdict;
8 static struct language *lang_c;
11 langdict = calloc(MAXLANGUAGES, sizeof(*langdict));
18 static struct language* add_language(char *langtag, char *langname) {
20 for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
21 if(langdict[cindex] == NULL) break;
22 if(!strcmp(langdict[cindex]->langname, langname) || !strcmp(langdict[cindex]->langtag, langtag))
23 return langdict[cindex];
25 if(cindex == MAXLANGUAGES) return NULL;
26 struct language *lang = malloc(sizeof(*lang));
28 perror("malloc() failed");
31 lang->langtag = strdup(langtag);
32 lang->langname = strdup(langname);
33 struct language_table **entrys = calloc(27, sizeof(*entrys));
34 lang->entrys = entrys;
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');
44 struct language* get_language_by_tag(char *tag) {
46 for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
47 if(langdict[cindex] == NULL) break;
48 if(!strcmp(langdict[cindex]->langtag, tag))
49 return langdict[cindex];
54 struct language* get_language_by_name(char *name) {
56 for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
57 if(langdict[cindex] == NULL) break;
58 if(!strcmp(langdict[cindex]->langname, name))
59 return langdict[cindex];
64 struct language* get_default_language() {
66 lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME);
70 void register_default_language_table(const struct default_language_entry *msgtab) {
72 lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME);
73 struct language_table *lang_entry;
75 while(msgtab->ident) {
76 cindex = get_entry_index(msgtab->ident);
77 lang_entry = malloc(sizeof(*lang_entry));
79 perror("malloc() failed");
82 lang_entry->ident = strdup(msgtab->ident);
83 lang_entry->text = strdup(msgtab->text);
84 lang_entry->next = lang_c->entrys[cindex];
85 lang_c->entrys[cindex] = lang_entry;
90 char *get_language_string(struct UserNode *user, const 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;
98 int cindex = get_entry_index(msg_ident);
99 struct language_table* entry;
100 for(entry = lang->entrys[cindex]; entry; entry = entry->next) {
101 if(!strcmp(entry->ident, msg_ident))