From 54371c28f07e638694ad2148e8900e1bae71e3d4 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Sun, 17 Feb 2019 00:08:28 +0000 Subject: make framebuffer use the language environment for the UI resources --- frontends/framebuffer/Makefile | 15 ++++- frontends/framebuffer/findfile.c | 107 ++++++++++++++++++++++++++++-- frontends/framebuffer/findfile.h | 2 +- frontends/framebuffer/gui.c | 5 +- frontends/framebuffer/res/Messages | 2 +- frontends/framebuffer/res/de/welcome.html | 1 + frontends/framebuffer/res/en/credits.html | 1 + frontends/framebuffer/res/en/licence.html | 1 + frontends/framebuffer/res/en/maps.html | 1 + frontends/framebuffer/res/en/welcome.html | 1 + frontends/framebuffer/res/it/credits.html | 1 + frontends/framebuffer/res/it/licence.html | 1 + frontends/framebuffer/res/ja/welcome.html | 1 + frontends/framebuffer/res/nl/credits.html | 1 + frontends/framebuffer/res/nl/licence.html | 1 + frontends/framebuffer/res/nl/welcome.html | 1 + 16 files changed, 133 insertions(+), 9 deletions(-) create mode 120000 frontends/framebuffer/res/de/welcome.html create mode 120000 frontends/framebuffer/res/en/credits.html create mode 120000 frontends/framebuffer/res/en/licence.html create mode 120000 frontends/framebuffer/res/en/maps.html create mode 120000 frontends/framebuffer/res/en/welcome.html create mode 120000 frontends/framebuffer/res/it/credits.html create mode 120000 frontends/framebuffer/res/it/licence.html create mode 120000 frontends/framebuffer/res/ja/welcome.html create mode 120000 frontends/framebuffer/res/nl/credits.html create mode 120000 frontends/framebuffer/res/nl/licence.html create mode 120000 frontends/framebuffer/res/nl/welcome.html (limited to 'frontends/framebuffer') diff --git a/frontends/framebuffer/Makefile b/frontends/framebuffer/Makefile index 06e7afbaa..9bb042f4a 100644 --- a/frontends/framebuffer/Makefile +++ b/frontends/framebuffer/Makefile @@ -1,5 +1,10 @@ +# +# Makefile for NetSurf Framebuffer frontend +# +# This file is part of NetSurf +# # ---------------------------------------------------------------------------- -# Framebuffer target setup +# Framebuffer flag setup (using pkg-config) # ---------------------------------------------------------------------------- CFLAGS += -std=c99 -g \ @@ -50,6 +55,14 @@ LDFLAGS += -Wl,--whole-archive $(eval $(call pkg_config_find_and_add,libnsfb,libnsfb)) LDFLAGS += -Wl,--no-whole-archive +# --------------------------------------------------------------------------- +# Target setup +# --------------------------------------------------------------------------- + +# The filter and target for split messages +MESSAGES_FILTER=fb +MESSAGES_TARGET=$(FRONTEND_RESOURCES_DIR) + # --------------------------------------------------------------------------- # HOST specific feature flags # --------------------------------------------------------------------------- diff --git a/frontends/framebuffer/findfile.c b/frontends/framebuffer/findfile.c index 67312f452..44a07b383 100644 --- a/frontends/framebuffer/findfile.c +++ b/frontends/framebuffer/findfile.c @@ -17,29 +17,128 @@ */ #include +#include +#include #include "utils/filepath.h" +#include "utils/log.h" #include "framebuffer/findfile.h" char **respaths; /** resource search path vector */ -/** Create an array of valid paths to search for resources. +#define MAX_LANGV_SIZE 32 + +/** + * goes through the environment in appropriate order to find configured language + * + * \return language to use or "C" if nothing appropriate is set + */ +static const char *get_language_env(void) +{ + const char *envstr; + + envstr = getenv("LANGUAGE"); + if ((envstr != NULL) && (envstr[0] != 0)) { + return envstr; + } + + envstr = getenv("LC_ALL"); + if ((envstr != NULL) && (envstr[0] != 0)) { + return envstr; + } + + envstr = getenv("LC_MESSAGES"); + if ((envstr != NULL) && (envstr[0] != 0)) { + return envstr; + } + + envstr = getenv("LANG"); + if ((envstr != NULL) && (envstr[0] != 0)) { + return envstr; + } + + return "C"; +} + +/** + * build a string vector of language names + */ +static char **get_language_names(void) +{ + char **langv; /* output string vector of languages */ + int langc; /* count of languages in vector */ + const char *envlang; /* colon separated list of languages from environment */ + int lstart = 0; /* offset to start of current language */ + int lunder = 0; /* offset to underscore in current language */ + int lend = 0; /* offset to end of current language */ + char *nlang; + + langv = calloc(MAX_LANGV_SIZE + 2, sizeof(char *)); + if (langv == NULL) { + return NULL; + } + + envlang = get_language_env(); + + for (langc = 0; langc < MAX_LANGV_SIZE; langc++) { + /* work through envlang splitting on : */ + while ((envlang[lend] != 0) && + (envlang[lend] != ':') && + (envlang[lend] != '.')) { + if (envlang[lend] == '_') { + lunder = lend; + } + lend++; + } + /* place language in string vector */ + nlang = malloc(lend - lstart + 1); + memcpy(nlang, envlang + lstart, lend - lstart); + nlang[lend - lstart] = 0; + langv[langc] = nlang; + + /* add language without specialisation to vector */ + if (lunder != lstart) { + nlang = malloc(lunder - lstart + 1); + memcpy(nlang, envlang + lstart, lunder - lstart); + nlang[lunder - lstart] = 0; + langv[++langc] = nlang; + } + + /* if we stopped at the dot, move to the colon delimiter */ + while ((envlang[lend] != 0) && + (envlang[lend] != ':')) { + lend++; + } + if (envlang[lend] == 0) { + /* reached end of environment language list */ + break; + } + lend++; + lstart = lunder = lend; + } + return langv; +} + +/** + * Create an array of valid paths to search for resources. * * The idea is that all the complex path computation to find resources * is performed here, once, rather than every time a resource is * searched for. */ char ** -fb_init_resource(const char *resource_path) +fb_init_resource_path(const char *resource_path) { char **pathv; /* resource path string vector */ char **respath; /* resource paths vector */ - const char *lang = NULL; + char **langv; pathv = filepath_path_to_strvec(resource_path); - respath = filepath_generate(pathv, &lang); + langv = get_language_names(); + + respath = filepath_generate(pathv, (const char * const *)langv); filepath_free_strvec(pathv); diff --git a/frontends/framebuffer/findfile.h b/frontends/framebuffer/findfile.h index 1f3db6eb1..5e9e3186b 100644 --- a/frontends/framebuffer/findfile.h +++ b/frontends/framebuffer/findfile.h @@ -27,6 +27,6 @@ extern char **respaths; * is performed here, once, rather than every time a resource is * searched for. */ -char **fb_init_resource(const char *resource_path); +char **fb_init_resource_path(const char *resource_path); #endif /* NETSURF_FB_FINDFILE_H */ diff --git a/frontends/framebuffer/gui.c b/frontends/framebuffer/gui.c index 1e27dafb6..95e35fb30 100644 --- a/frontends/framebuffer/gui.c +++ b/frontends/framebuffer/gui.c @@ -2104,7 +2104,8 @@ static struct gui_misc_table framebuffer_misc_table = { .quit = gui_quit, }; -/** Entry point from OS. +/** + * Entry point from OS. * * /param argc The number of arguments in the string vector. * /param argv The argument string vector. @@ -2134,7 +2135,7 @@ main(int argc, char** argv) die("NetSurf operation table failed registration"); } - respaths = fb_init_resource(NETSURF_FB_RESPATH":"NETSURF_FB_FONTPATH); + respaths = fb_init_resource_path(NETSURF_FB_RESPATH":"NETSURF_FB_FONTPATH); /* initialise logging. Not fatal if it fails but not much we * can do about it either. diff --git a/frontends/framebuffer/res/Messages b/frontends/framebuffer/res/Messages index 43148a263..75bfdf53d 120000 --- a/frontends/framebuffer/res/Messages +++ b/frontends/framebuffer/res/Messages @@ -1 +1 @@ -../../../resources/en/Messages \ No newline at end of file +en/Messages \ No newline at end of file diff --git a/frontends/framebuffer/res/de/welcome.html b/frontends/framebuffer/res/de/welcome.html new file mode 120000 index 000000000..b77e23743 --- /dev/null +++ b/frontends/framebuffer/res/de/welcome.html @@ -0,0 +1 @@ +../../../../resources/de/welcome.html \ No newline at end of file diff --git a/frontends/framebuffer/res/en/credits.html b/frontends/framebuffer/res/en/credits.html new file mode 120000 index 000000000..f73ecd4aa --- /dev/null +++ b/frontends/framebuffer/res/en/credits.html @@ -0,0 +1 @@ +../../../../resources/en/credits.html \ No newline at end of file diff --git a/frontends/framebuffer/res/en/licence.html b/frontends/framebuffer/res/en/licence.html new file mode 120000 index 000000000..0c3b430b7 --- /dev/null +++ b/frontends/framebuffer/res/en/licence.html @@ -0,0 +1 @@ +../../../../resources/en/licence.html \ No newline at end of file diff --git a/frontends/framebuffer/res/en/maps.html b/frontends/framebuffer/res/en/maps.html new file mode 120000 index 000000000..507a4b248 --- /dev/null +++ b/frontends/framebuffer/res/en/maps.html @@ -0,0 +1 @@ +../../../../resources/en/maps.html \ No newline at end of file diff --git a/frontends/framebuffer/res/en/welcome.html b/frontends/framebuffer/res/en/welcome.html new file mode 120000 index 000000000..543f31ddd --- /dev/null +++ b/frontends/framebuffer/res/en/welcome.html @@ -0,0 +1 @@ +../../../../resources/en/welcome.html \ No newline at end of file diff --git a/frontends/framebuffer/res/it/credits.html b/frontends/framebuffer/res/it/credits.html new file mode 120000 index 000000000..2b7c99542 --- /dev/null +++ b/frontends/framebuffer/res/it/credits.html @@ -0,0 +1 @@ +../../../../resources/it/credits.html \ No newline at end of file diff --git a/frontends/framebuffer/res/it/licence.html b/frontends/framebuffer/res/it/licence.html new file mode 120000 index 000000000..92afce85b --- /dev/null +++ b/frontends/framebuffer/res/it/licence.html @@ -0,0 +1 @@ +../../../../resources/it/licence.html \ No newline at end of file diff --git a/frontends/framebuffer/res/ja/welcome.html b/frontends/framebuffer/res/ja/welcome.html new file mode 120000 index 000000000..8b603f3df --- /dev/null +++ b/frontends/framebuffer/res/ja/welcome.html @@ -0,0 +1 @@ +../../../../resources/ja/welcome.html \ No newline at end of file diff --git a/frontends/framebuffer/res/nl/credits.html b/frontends/framebuffer/res/nl/credits.html new file mode 120000 index 000000000..71b27e40a --- /dev/null +++ b/frontends/framebuffer/res/nl/credits.html @@ -0,0 +1 @@ +../../../../resources/nl/credits.html \ No newline at end of file diff --git a/frontends/framebuffer/res/nl/licence.html b/frontends/framebuffer/res/nl/licence.html new file mode 120000 index 000000000..5aaf1cb44 --- /dev/null +++ b/frontends/framebuffer/res/nl/licence.html @@ -0,0 +1 @@ +../../../../resources/nl/licence.html \ No newline at end of file diff --git a/frontends/framebuffer/res/nl/welcome.html b/frontends/framebuffer/res/nl/welcome.html new file mode 120000 index 000000000..ef7a97cc9 --- /dev/null +++ b/frontends/framebuffer/res/nl/welcome.html @@ -0,0 +1 @@ +../../../../resources/nl/welcome.html \ No newline at end of file -- cgit v1.2.3