include $(dir $(lastword $(MAKEFILE_LIST))).config.mk
PROG := $(BUILDDIR)/tvheadend
-LANGUAGES ?= de fr cs pl
+LANGUAGES ?= en_GB de fr cs pl bg
#
# Common compiler flags
intl/tvheadend.pot:
+intl/tvheadend.en_GB.po: intl/tvheadend.pot
+ $(call merge-po,$@,$<)
+
intl/tvheadend.de.po: intl/tvheadend.pot
$(call merge-po,$@,$<)
intl/tvheadend.pl.po: intl/tvheadend.pot
$(call merge-po,$@,$<)
+intl/tvheadend.bg.po: intl/tvheadend.pot
+ $(call merge-po,$@,$<)
+
$(BUILDDIR)/src/tvh_locale.o: src/tvh_locale_inc.c
src/tvh_locale_inc.c: $(PO-FILES)
@printf "Building $@\n"
IAM=$(lastword $(MAKEFILE_LIST))
WEBDIR ?= src/webui
-LANGUAGES ?= de fr cs pl
+LANGUAGES ?= en_GB de fr cs pl bg
ROOTPATH = static
ifneq ($(WEBUI),)
intl/js/tvheadend.js.pot:
+intl/js/tvheadend.js.en_GB.po: intl/js/tvheadend.js.pot
+ $(call merge-po,$@,$<)
+
intl/js/tvheadend.js.de.po: intl/js/tvheadend.js.pot
$(call merge-po,$@,$<)
intl/js/tvheadend.js.pl.po: intl/js/tvheadend.js.pot
$(call merge-po,$@,$<)
+intl/js/tvheadend.js.bg.po: intl/js/tvheadend.js.pot
+ $(call merge-po,$@,$<)
+
+src/webui/static/intl/tvh.en_GB.js.gz: intl/js/tvheadend.js.en_GB.po
+ $(call go-po,$@,$<)
+
src/webui/static/intl/tvh.de.js.gz: intl/js/tvheadend.js.de.po
$(call go-po,$@,$<)
src/webui/static/intl/tvh.pl.js.gz: intl/js/tvheadend.js.pl.po
$(call go-po,$@,$<)
+src/webui/static/intl/tvh.bg.js.gz: intl/js/tvheadend.js.bg.po
+ $(call go-po,$@,$<)
+
.PHONY:
clean:
rm -f $(foreach f,tvh.js tvh.css tvh-tv.js tvh-tv.css,\
{
htsmsg_t *m = htsmsg_create_map();
htsmsg_add_str(m, "type", "api");
- htsmsg_add_str(m, "uri", "language/list");
+ htsmsg_add_str(m, "uri", "language/locale");
return m;
}
return 0;
}
+static int
+api_language_locale_enum
+ ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp )
+{
+ const lang_code_t *c = lang_codes;
+ htsmsg_t *l, *e;
+ const char *s;
+ char buf1[8];
+ char buf2[128];
+
+ l = htsmsg_create_list();
+ while (c->code2b) {
+ e = htsmsg_create_map();
+ htsmsg_add_str(e, "key", c->code2b);
+ htsmsg_add_str(e, "val", c->desc);
+ htsmsg_add_msg(l, NULL, e);
+ s = c->locale;
+ while (s && *s) {
+ if (*s == '|')
+ s++;
+ if (s[0] == '\0' || s[1] == '\0')
+ break;
+ snprintf(buf1, sizeof(buf1), "%s_%c%c", c->code2b, s[0], s[1]);
+ snprintf(buf2, sizeof(buf2), "%s (%c%c)", c->desc, s[0], s[1]);
+ e = htsmsg_create_map();
+ htsmsg_add_str(e, "key", buf1);
+ htsmsg_add_str(e, "val", buf2);
+ htsmsg_add_msg(l, NULL, e);
+ s += 2;
+ }
+ c++;
+ }
+ *resp = htsmsg_create_map();
+ htsmsg_add_msg(*resp, "entries", l);
+ return 0;
+}
+
void api_language_init ( void )
{
static api_hook_t ah[] = {
- { "language/list", ACCESS_ANONYMOUS, api_language_enum, NULL },
+ { "language/list", ACCESS_ANONYMOUS, api_language_enum, NULL },
+ { "language/locale", ACCESS_ANONYMOUS, api_language_locale_enum, NULL },
{ NULL },
};
{ "egy", NULL, NULL , "Egyptian (Ancient)" },
{ "eka", NULL, NULL , "Ekajuk" },
{ "elx", NULL, NULL , "Elamite" },
- { "eng", "en", NULL , "English" },
+ { "eng", "en", NULL , "English", "US|GB" },
{ "epo", "eo", NULL , "Esperanto" },
{ "est", "et", NULL , "Estonian" },
{ "ewe", "ee", NULL , "Ewe" },
const char *code1; ///< ISO 639-1
const char *code2t; ///< ISO 639-2 T
const char *desc; ///< Description
+ const char *locale; ///< Locale variants (like US|GB or DE|BE)
} lang_code_t;
extern const lang_code_t lang_codes[];
static const char *tvh_gettext_lang_check(const char *lang)
{
+ if (!strcmp(lang, "eng_US"))
+ return "en";
+ if (!strcmp(lang, "eng_GB"))
+ return "en_GB";
if (!strcmp(lang, "ger"))
return "de";
if (!strcmp(lang, "fre"))
return "cs";
if (!strcmp(lang, "pol"))
return "pl";
+ if (!strcmp(lang, "bul"))
+ return "bg";
return lang;
}
const char *tvh_gettext_lang(const char *lang, const char *s)
{
const char **strings;
+ static char unklng[8];
pthread_mutex_lock(&tvh_gettext_mutex);
if (lang == NULL) {
if (tvh_gettext_default_lang == NULL)
tvh_gettext_init();
tvh_gettext_new_lang(tvh_gettext_default_lang);
+ strncpy(unklng, lang, sizeof(unklng));
+ unklng[sizeof(unklng)-1] = '\0';
+ tvh_gettext_last_lang = unklng;
} else {
if (tvh_gettext_last_lang == NULL)
tvh_gettext_last_lang = "en";