ZeroNet/plugins/TranslateSite/TranslateSitePlugin.py

72 lines
3.4 KiB
Python

import time
from Plugin import PluginManager
from Translate import translate
@PluginManager.registerTo("UiRequest")
class UiRequestPlugin(object):
def actionSiteMedia(self, path, **kwargs):
file_name = path.split("/")[-1]
if not file_name: # Path ends with /
file_name = "index.html"
extension = file_name.split(".")[-1]
if translate.lang != "en" and extension in ["js", "html"]:
path_parts = self.parsePath(path)
kwargs["header_length"] = False
file_generator = super(UiRequestPlugin, self).actionSiteMedia(path, **kwargs)
if "__next__" in dir(file_generator): # File found and generator returned
site = self.server.sites.get(path_parts["address"])
return self.actionPatchFile(site, path_parts["inner_path"], file_generator)
else:
return file_generator
else:
return super(UiRequestPlugin, self).actionSiteMedia(path, **kwargs)
def actionUiMedia(self, path):
file_generator = super(UiRequestPlugin, self).actionUiMedia(path)
if translate.lang != "en" and path.endswith(".js"):
s = time.time()
data = b"".join(list(file_generator))
data = translate.translateData(data.decode("utf8"))
self.log.debug("Patched %s (%s bytes) in %.3fs" % (path, len(data), time.time() - s))
return iter([data.encode("utf8")])
else:
return file_generator
def actionPatchFile(self, site, inner_path, file_generator):
content_json = site.content_manager.contents["content.json"]
lang_file = "languages/%s.json" % translate.lang
lang_file_exist = False
if site.settings.get("own"): # My site, check if the file is exist (allow to add new lang without signing)
if site.storage.isFile(lang_file):
lang_file_exist = True
else: # Not my site the reference in content.json is enough (will wait for download later)
if lang_file in content_json.get("files", {}):
lang_file_exist = True
if not lang_file_exist or inner_path not in content_json.get("translate", []):
for part in file_generator:
if inner_path.endswith(".html"):
yield part.replace(b"lang={lang}", b"lang=%s" % translate.lang.encode("utf8")) # lang get parameter to .js file to avoid cache
else:
yield part
else:
s = time.time()
data = b"".join(list(file_generator)).decode("utf8")
# if site.content_manager.contents["content.json"]["files"].get(lang_file):
site.needFile(lang_file, priority=10)
try:
if inner_path.endswith("js"):
data = translate.translateData(data, site.storage.loadJson(lang_file), "js")
else:
data = translate.translateData(data, site.storage.loadJson(lang_file), "html")
data = data.replace(b"lang={lang}", b"lang=%s" % translate.lang.encode("utf8")) # lang get parameter to .js file to avoid cache
except Exception as err:
site.log.error("Error loading translation file %s: %s" % (lang_file, err))
self.log.debug("Patched %s (%s bytes) in %.3fs" % (inner_path, len(data), time.time() - s))
yield data.encode("utf8")