5 #define DEFAULT_LANG_TAG "EN"
6 #define DEFAULT_LANG_NAME "English"
8 static struct language **langdict;
9 static struct language *lang_c;
12 langdict = calloc(MAXLANGUAGES, sizeof(*langdict));
19 static struct language* add_language(char *langtag, char *langname) {
21 for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
22 if(langdict[cindex] == NULL) break;
23 if(!strcmp(langdict[cindex]->langname, langname) || !strcmp(langdict[cindex]->langtag, langtag))
24 return langdict[cindex];
26 if(cindex == MAXLANGUAGES) return NULL;
27 struct language *lang = malloc(sizeof(*lang));
29 perror("malloc() failed");
32 lang->langtag = strdup(langtag);
33 lang->langname = strdup(langname);
34 struct language_table **entrys = calloc(27, sizeof(*entrys));
35 lang->entrys = entrys;
39 static int get_entry_index(const char *ident) {
40 const char *underscore = strstr(ident, "_");
41 if(!underscore || !(underscore[1] >= 65 && underscore[1] <= 90)) return 26;
42 return (underscore[1] - 'A');
45 struct language* get_language_by_tag(char *tag) {
47 for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
48 if(langdict[cindex] == NULL) break;
49 if(!strcmp(langdict[cindex]->langtag, tag))
50 return langdict[cindex];
55 struct language* get_language_by_name(char *name) {
57 for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
58 if(langdict[cindex] == NULL) break;
59 if(!strcmp(langdict[cindex]->langname, name))
60 return langdict[cindex];
65 struct language* get_default_language() {
67 lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME);
71 void register_default_language_table(const struct default_language_entry *msgtab) {
73 lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME);
74 struct language_table *lang_entry;
76 while(msgtab->ident) {
77 cindex = get_entry_index(msgtab->ident);
78 lang_entry = malloc(sizeof(*lang_entry));
80 perror("malloc() failed");
83 lang_entry->ident = strdup(msgtab->ident);
84 lang_entry->text = strdup(msgtab->text);
85 lang_entry->next = lang_c->entrys[cindex];
86 lang_c->entrys[cindex] = lang_entry;
91 char *get_language_string(struct UserNode *user, const char* msg_ident) {
92 struct language* lang;
93 if((user->flags & USERFLAG_ISAUTHED)) {
94 loadUserSettings(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))
107 char *build_language_string(struct UserNode *user, char *buffer, const char *msg_ident, ...) {
108 char *formatStr = get_language_string(user, msg_ident);
109 if(!formatStr) return NULL;
111 buffer = (char *)malloc((MAXLEN+1) * sizeof(char));
113 perror("malloc() failed");
120 va_start(arg_list, msg_ident);
121 pos = vsnprintf(buffer, MAXLEN - 2, formatStr, arg_list);
123 if (pos < 0 || pos > (MAXLEN - 2)) pos = MAXLEN - 2;
125 buffer[pos+1] = '\0';