Files
jumpserver/apps/common/utils/yml.py

48 lines
1.1 KiB
Python

import yaml
from django.conf import settings
from jinja2 import StrictUndefined
from jinja2.sandbox import SandboxedEnvironment
def translate(key, i18n, lang):
lang = settings.LANGUAGE_CODE if lang is None else lang
lang = lang[:2]
lang_data = i18n.get(key, {})
return lang_data.get(lang, key)
def yaml_load_with_i18n(stream, lang=None):
ori_text = stream.read()
data = yaml.safe_load(ori_text)
i18n = data.get("i18n", {})
env = SandboxedEnvironment(
undefined=StrictUndefined,
autoescape=False,
)
def safe_trans(key):
if not isinstance(key, str):
raise ValueError("invalid i18n key")
return translate(key, i18n, lang)
env.filters.clear()
env.globals.clear()
env.filters["trans"] = safe_trans
template = env.from_string(ori_text)
try:
rendered = template.render()
except Exception as e:
rendered = ori_text
result = yaml.safe_load(rendered)
result.pop("i18n", None)
return result
if __name__ == '__main__':
with open('manifest.yml') as f:
data = yaml_load_with_i18n(f)
print(data)