| 1 | /* |
| 2 | lang.c: tr() and the languages there are (the loading is i18n.c's). |
| 3 | */ |
| 4 | #include <string.h> |
| 5 | #include "lang.h" |
| 6 |
|
| 7 | static const char *const codes[LANG_COUNT] = {"en", "es", "pt", "fr", "de", "it", "nl", "pl", "tr", "da", "id", "ar", "ru", "zh", "ja", "ko"}; |
| 8 | static const char *const names[LANG_COUNT] = {"English", "Español", "Português", "Français", "Deutsch", "Italiano", |
| 9 | "Nederlands", "Polski", "Türkçe", "Dansk", "Bahasa Indonesia", "العربية", "Русский", "中文 (简体)", "日本語", "한국어"}; |
| 10 | static 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) |
| 13 | static const char *const flags[LANG_COUNT] = {"gb", "es", "br", "fr", "de", "it", "nl", "pl", "tr", "dk", "id", "sa", "ru", "cn", "jp", "kr"}; |
| 14 |
|
| 15 | static const lang_table_t *volatile table; |
| 16 | static volatile int current; |
| 17 |
|
| 18 | unsigned 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 |
|
| 25 | const 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 |
|
| 36 | const char *lang_code(int i) { return i >= 0 && i < LANG_COUNT ? codes[i] : "en"; } |
| 37 | const char *lang_name(int i) { return i >= 0 && i < LANG_COUNT ? names[i] : "English"; } |
| 38 | const char *lang_english(int i) { return i >= 0 && i < LANG_COUNT ? english[i] : "English"; } |
| 39 | const char *lang_flag(int i) { return i >= 0 && i < LANG_COUNT ? flags[i] : "gb"; } |
| 40 | int lang_current(void) { return current; } |
| 41 |
|
| 42 | void lang_install(int lang, const lang_table_t *t) |
| 43 | { |
| 44 | table = t; |
| 45 | current = lang; |
| 46 | } |