/* Really hacked-together naiive implementation of gettext */ #include "i18n.h" #include "debugwriter.h" #include #include #include const char* LOC_HEADER = "ONELOC\x10"; char** strdict = 0; unsigned int nStr = 0; int family = LOCALE_FAMILY_LATIN; int getLocaleFamily() { Debug() << "Get family:" << family; return family; } const char* findtext(unsigned int msgid, const char* fallback) { Debug() << "Looking for msg" << msgid << fallback; if (msgid >= nStr) { return fallback; } else { Debug() << "found" << strdict[msgid]; return strdict[msgid]; } } void unloadLocale() { for (unsigned int i = 0; i < nStr; i++) { free(strdict[i]); } free(strdict); strdict = 0; nStr = 0; } void _setLocaleFamily(const char* locale) { if (!strcmp(locale, "ja") || !strcmp(locale, "ko") || !strcmp(locale, "zh_CN")) { family = LOCALE_FAMILY_ASIAN; } else { family = LOCALE_FAMILY_LATIN; } } void loadLocale(const char* locale) { Debug() << "Load locale:" << locale; char pathbuf[100]; FILE* locfile; char header[8]; unsigned int i; int strSize = 0; unloadLocale(); _setLocaleFamily(locale); sprintf(pathbuf, "Languages/internal/%s.loc", locale); locfile = fopen(pathbuf, "rb"); if (locfile) { fread(header, 1, 8, locfile); if (!strcmp(header, LOC_HEADER)) { //read number of strs in this file fread(&nStr, 4, 1, locfile); strdict = (char**)malloc(sizeof(char*) * nStr); for (i = 0; i < nStr; i++) { //read the size of the next string fread(&strSize, 4, 1, locfile); strdict[i] = (char*)malloc(strSize+1); if (strSize > 0) { //read the contents of the next string fread(strdict[i], 1, strSize, locfile); strdict[i][strSize] = 0; Debug() << "localization #" << i << " : " << strdict[i] << "|" << strSize; } strdict[i][strSize] = 0; } } fclose(locfile); } }