diff --git a/.gitignore b/.gitignore index 3e39de3..4fde1fe 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,7 @@ Doku/** .env .venv coverage.xml +*.pot +*.mo +*.log +*.log.* diff --git a/Makefile b/Makefile index 49be846..a6549e2 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,13 @@ -.PHONY: build clean addon-dev addon-debug addon-rc addon-rel debug dev preview rc rel check-docker-compose install +.PHONY: build babel clean addon-dev addon-debug addon-rc addon-rel debug dev preview rc rel check-docker-compose install -debug dev preview rc rel: +babel debug dev preview rc rel: $(MAKE) -C app $@ clean build: $(MAKE) -C ha_addons $@ addon-dev addon-debug addon-rc addon-rel: + $(MAKE) -C app babel $(MAKE) -C ha_addons $(patsubst addon-%,%,$@) check-docker-compose: diff --git a/app/.dockerignore b/app/.dockerignore index a746428..6348e0f 100644 --- a/app/.dockerignore +++ b/app/.dockerignore @@ -2,4 +2,6 @@ tests/ **/__pycache__ *.pyc .DS_Store -build.sh \ No newline at end of file +build.sh +*.pot +*.po \ No newline at end of file diff --git a/app/Makefile b/app/Makefile index dff4631..f380714 100644 --- a/app/Makefile +++ b/app/Makefile @@ -6,10 +6,16 @@ IMAGE = tsun-gen3-proxy # Folders -SRC=. +APP=. +SRC=$(APP)/src +# Folders for Babel translation +BABEL_INPUT_JINJA=$(SRC)/web/templates +BABEL_INPUT= $(foreach dir,$(BABEL_INPUT_JINJA),$(wildcard $(dir)/*.html)) \ + +BABEL_TRANSLATIONS=$(APP)/translations export BUILD_DATE := ${shell date -Iminutes} -VERSION := $(shell cat $(SRC)/.version) +VERSION := $(shell cat $(APP)/.version) export MAJOR := $(shell echo $(VERSION) | cut -f1 -d.) PUBLIC_URL := $(shell echo $(PUBLIC_CONTAINER_REGISTRY) | cut -f1 -d/) @@ -39,5 +45,17 @@ preview rel: export IMAGE=$(PUBLIC_CONTAINER_REGISTRY)$(IMAGE) && \ docker buildx bake -f docker-bake.hcl $@ +babel: $(BABEL_TRANSLATIONS)/de/LC_MESSAGES/messages.mo $(BABEL_TRANSLATIONS)/de/LC_MESSAGES/messages.po $(BABEL_TRANSLATIONS)/messages.pot -.PHONY: debug dev preview rc rel +$(BABEL_TRANSLATIONS)/%.pot : $(SRC)/.babel.cfg $(BABEL_INPUT) + @mkdir -p $(@D) + @pybabel extract -F $< --project=$(IMAGE) --version=$(VERSION) -o $@ $(SRC) + +$(BABEL_TRANSLATIONS)/%/LC_MESSAGES/messages.po : $(BABEL_TRANSLATIONS)/messages.pot + @mkdir -p $(@D) + @pybabel update --init-missing -i $< -d $(BABEL_TRANSLATIONS) -l $* + +$(BABEL_TRANSLATIONS)/%/LC_MESSAGES/messages.mo : $(BABEL_TRANSLATIONS)/%/LC_MESSAGES/messages.po + @pybabel compile -d $(BABEL_TRANSLATIONS) -l $* + +.PHONY: babel debug dev preview rc rel diff --git a/app/requirements.txt b/app/requirements.txt index 9d636fc..c26f354 100644 --- a/app/requirements.txt +++ b/app/requirements.txt @@ -1,4 +1,5 @@ aiomqtt==2.3.2 schema==0.7.7 aiocron==2.1 - quart==0.20 \ No newline at end of file + quart==0.20 + quart-babel==1.0.7 \ No newline at end of file diff --git a/app/src/.babel.cfg b/app/src/.babel.cfg new file mode 100644 index 0000000..cfaa201 --- /dev/null +++ b/app/src/.babel.cfg @@ -0,0 +1,2 @@ +[python: **.py] +[jinja2: web/templates/**.html] \ No newline at end of file diff --git a/app/src/server.py b/app/src/server.py index e3fcdc1..0b5b2f4 100644 --- a/app/src/server.py +++ b/app/src/server.py @@ -4,7 +4,9 @@ import logging.handlers import os import argparse from asyncio import StreamReader, StreamWriter -from quart import Quart, Response +from quart import Quart, Response, request +from quart_babel import Babel +from quart_babel.locale import get_locale from logging import config # noqa F401 from proxy import Proxy from inverter_ifc import InverterIfc @@ -31,12 +33,28 @@ class ProxyState: ProxyState._is_up = value +def my_get_locale(): + # check how to get the locale form for the add-on - hass.selectedLanguage + # logging.info("get_locale(%s)", request.accept_languages) + return request.accept_languages.best_match( + ['de', 'en'] + ) + + app = Quart(__name__, template_folder='web/templates', static_folder='web/static') +babel = Babel(app, + locale_selector=my_get_locale, + default_translation_directories='../translations') app.register_blueprint(web_routes) +@app.context_processor +def utility_processor(): + return dict(lang=get_locale()) + + @app.route('/-/ready') async def ready(): if ProxyState.is_up(): diff --git a/app/src/web/templates/base.html b/app/src/web/templates/base.html index e91b9fb..5227c58 100644 --- a/app/src/web/templates/base.html +++ b/app/src/web/templates/base.html @@ -1,5 +1,5 @@ - +