void LngSetAdd(const char *id, int lang, const char *txt, bool addid) { CriticalSection::Lock __(slng); CharS ids; ids.s = PermanentCopy(id); String text = ToCharset(CHARSET_UTF8, txt, GetLNGCharset(lang)); lang = SetLNGCharset(lang, CHARSET_UTF8); Array<LngModule>& ma = sMod(); for(int i = 0; i < ma.GetCount(); i++) { LngModule& m = ma[i]; int q = m.map.Find(ids); if(q >= 0) { char *t = PermanentCopy(text); Vector<LngRec>& r = m.map[q]; for(int i = 0; i < r.GetCount(); i++) if(r[i].lang == lang) { r[i].text = t; return; } LngRec& rec = r.Add(); rec.lang = lang; rec.text = t; return; } } if(addid) { if(ma.GetCount() == 0) ma.Add(); LngRec& r = ma.Top().map.Add(ids).Add(); char *t = PermanentCopy(text); strcpy(t, text); r.lang = lang; r.text = t; } }
String GetLngString_(int lang, const char *id) { if(!lang) lang = current_lang; const LngRec *r = sFindLngRec(id, lang); if(r) { int dch = GetLNGCharset(lang); if(dch == CHARSET_UTF8) return r->text; else return ToCharset(dch, r->text, CHARSET_UTF8); } return GetENUSc(id); }
static dword sGetLanguageDetails(int language, String *english_name, String *native_name) { int q = 0; byte cs = GetLNGCharset(language); language &= ~LNGC_(0, 0, 0, 0, ~0); for(const int *ptr = LanguageList; *ptr; ptr++, q++) if(*ptr == language) { const char *f = LanguageInfoList[q]; const char *a = strchr(f, '\t'); const char *b = strchr(a + 1, '\t'); if(english_name) *english_name = String(f, a); if(native_name) *native_name = ToCharset(cs, String(a + 1, b), CHARSET_UTF8); return MAKEWORD(b[2], b[1]); } return 0; }
NAMESPACE_UPP #define LLOG(x) // RLOG(x) #define LDUMP(x) // RDUMP(x) #define LNGLIST() \ LNGITEM(LNG_CZECH, CHARSET_WIN1250) \ LNGITEM(LNG_ENGLISH, CHARSET_WIN1252) \ // LNGITEM(LNG_GERMAN, CHARSET_WIN1252) \ #define LNGITEM(lcode, charset) static String LNGAsTextShort(int language) { int charset = GetLNGCharset(language); String lcode = LNGAsText(language & ~(-1 << 20)); if(charset != CHARSET_UNICODE) lcode << charset; return lcode; }
const char *t_GetLngString_(const char *id) { VectorMap<const char *, const char *>& map = sCurrentLangMap(); int q = map.Find(id); if(q >= 0) return map[q]; const LngRec *r = sFindLngRec(id, current_lang); if(r) { int dch = GetLNGCharset(current_lang); if(dch == CHARSET_UTF8) { map.Add(id, r->text); return r->text; } String text = ToCharset(dch, r->text, CHARSET_UTF8); char *q = Single<ZoneAlloc>().Alloc(text.GetLength() + 1); strcpy(q, ~text); map.Add(id, q); return q; } const char *txt = GetENUSc(id); map.Add(id, txt); return txt; }
String LoadStreamBOM(Stream& in) { return LoadStreamBOM(in, GetLNGCharset(GetSystemLNG())); }