46 lines2.0 KBC
1/*
2lang.c: tr() and the languages there are (the loading is i18n.c's).
3*/
4#include <string.h>
5#include "lang.h"
6
7static const char *const codes[LANG_COUNT] = {"en", "es", "pt", "fr", "de", "it", "nl", "pl", "tr", "da", "id", "ar", "ru", "zh", "ja", "ko"};
8static const char *const names[LANG_COUNT] = {"English", "Español", "Português", "Français", "Deutsch", "Italiano",
9 "Nederlands", "Polski", "Türkçe", "Dansk", "Bahasa Indonesia", "العربية", "Русский", "中文 (简体)", "日本語", "한국어"};
10static const char *const english[LANG_COUNT] = {"English", "Spanish", "Portuguese", "French", "German", "Italian",
11 "Dutch", "Polish", "Turkish", "Danish", "Indonesian", "Arabic", "Russian", "Chinese (Simplified)", "Japanese", "Korean"};
12// the flag each is shown with (data/flags/<this>.png, from flag-icons by tools/make-flags.mjs)
13static const char *const flags[LANG_COUNT] = {"gb", "es", "br", "fr", "de", "it", "nl", "pl", "tr", "dk", "id", "sa", "ru", "cn", "jp", "kr"};
14
15static const lang_table_t *volatile table;
16static volatile int current;
17
18unsigned lang_hash(const char *s)
19{
20 unsigned h = 2166136261u;
21 for (; *s; s++) h = (h ^ (unsigned char)*s) * 16777619u;
22 return h;
23}
24
25const char *tr(const char *english)
26{
27 const lang_table_t *t = table;
28 if (!t || !english) return english;
29 for (unsigned i = lang_hash(english) & (t->size - 1), n = 0; n < (unsigned)t->size; i = (i + 1) & (t->size - 1), n++) {
30 if (!t->en[i]) break;
31 if (!strcmp(t->en[i], english)) return t->tx[i];
32 }
33 return english;
34}
35
36const char *lang_code(int i) { return i >= 0 && i < LANG_COUNT ? codes[i] : "en"; }
37const char *lang_name(int i) { return i >= 0 && i < LANG_COUNT ? names[i] : "English"; }
38const char *lang_english(int i) { return i >= 0 && i < LANG_COUNT ? english[i] : "English"; }
39const char *lang_flag(int i) { return i >= 0 && i < LANG_COUNT ? flags[i] : "gb"; }
40int lang_current(void) { return current; }
41
42void lang_install(int lang, const lang_table_t *t)
43{
44 table = t;
45 current = lang;
46}