mirror of
https://forgejo.xatacraft.ru/Sunshine/mkxp-sunshine.git
synced 2026-08-20 05:49:55 +00:00
86 lines
2 KiB
C++
86 lines
2 KiB
C++
/*
|
|
Really hacked-together naiive implementation of gettext
|
|
*/
|
|
#include "i18n.h"
|
|
#include "debugwriter.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
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);
|
|
}
|
|
}
|