#include "lang.h"
#include "UserNode.h"
#include "DBHelper.h"
+#include "mysqlConn.h"
#define DEFAULT_LANG_TAG "EN"
#define DEFAULT_LANG_NAME "English"
}
+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++) {
lang->langname = strdup(langname);
struct language_table **entrys = calloc(27, sizeof(*entrys));
lang->entrys = entrys;
+ langdict[cindex] = lang;
return lang;
}
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++) {
if(langdict[cindex] == NULL) break;
- if(!strcmp(langdict[cindex]->langtag, tag))
+ if(!stricmp(langdict[cindex]->langtag, tag))
return langdict[cindex];
}
return NULL;
int cindex;
for(cindex = 0; cindex < MAXLANGUAGES; cindex++) {
if(langdict[cindex] == NULL) break;
- if(!strcmp(langdict[cindex]->langname, name))
+ if(!stricmp(langdict[cindex]->langname, name))
return langdict[cindex];
}
return NULL;
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 cindex;
while(msgtab->ident) {
- cindex = 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[cindex];
- lang_c->entrys[cindex] = lang_entry;
+ register_language_string(lang_c, msgtab->ident, msgtab->text);
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);
+ //replace all:
+ //$b to \002
+ //$k to \003
+ char txt[MAXLEN];
+ strcpy(txt, text);
+ char tmp[MAXLEN];
+ int tmppos = 0;
+ char *a, *b = txt;
+ do {
+ a = strstr(b, "$");
+ if(a) *a = '\0';
+ tmppos += sprintf(tmp + tmppos, "%s", b);
+ if(a) {
+ switch(a[1]) {
+ case 'b':
+ tmp[tmppos++] = '\002';
+ break;
+ case 'k':
+ tmp[tmppos++] = '\003';
+ break;
+ default:
+ //unknown - just write it
+ tmppos += sprintf(tmp + tmppos, "$%c", a[1]);
+ }
+ b = a+2;
+ }
+ } while(a);
+ lang_entry->text = strdup(tmp);
+ 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)) {
if(!strcmp(entry->ident, msg_ident))
return entry->text;
}
+ if(lang == lang_c) return NULL;
+ for(entry = lang_c->entrys[cindex]; entry; entry = entry->next) {
+ if(!strcmp(entry->ident, msg_ident))
+ return entry->text;
+ }
return NULL;
}
pos = vsnprintf(buffer, MAXLEN - 2, formatStr, arg_list);
va_end(arg_list);
if (pos < 0 || pos > (MAXLEN - 2)) pos = MAXLEN - 2;
- buffer[pos] = '\n';
- buffer[pos+1] = '\0';
+ buffer[pos] = '\0';
return buffer;
}