From 27794895c985800410de9ab675f0544ae6cf00eb Mon Sep 17 00:00:00 2001 From: mxr612 Date: Tue, 17 Jun 2025 08:08:18 +0800 Subject: [PATCH] feat: implement multilingual template support - Updated app.py to dynamically load Jinja2 templates based on the detected language. - Created new template files for English and Chinese, including base, index, list, scale, and result pages. - Modified template rendering logic to utilize the appropriate language-specific templates based on user preferences. --- app.py | 15 +++++------ templates/en/base.html | 42 +++++++++++++++++++++++++++++++ templates/en/index.html | 13 ++++++++++ templates/en/list.html | 16 ++++++++++++ templates/en/result.html | 17 +++++++++++++ templates/en/scale.html | 24 ++++++++++++++++++ templates/{ => zh}/base.html | 2 +- templates/{ => zh}/index.html | 24 +++++++++--------- templates/{ => zh}/list.html | 0 templates/{ => zh}/result.html | 32 +++++++++++------------ templates/{ => zh}/scale.html | 46 +++++++++++++++++----------------- 11 files changed, 172 insertions(+), 59 deletions(-) create mode 100644 templates/en/base.html create mode 100644 templates/en/index.html create mode 100644 templates/en/list.html create mode 100644 templates/en/result.html create mode 100644 templates/en/scale.html rename templates/{ => zh}/base.html (98%) rename templates/{ => zh}/index.html (94%) rename templates/{ => zh}/list.html (100%) rename templates/{ => zh}/result.html (96%) rename templates/{ => zh}/scale.html (97%) diff --git a/app.py b/app.py index c4fc746..6838ab8 100644 --- a/app.py +++ b/app.py @@ -89,8 +89,10 @@ class LanguageMiddleware(BaseHTTPMiddleware): app = FastAPI() app.add_middleware(LanguageMiddleware) -templates = Jinja2Templates(directory="templates") app.mount("/static", StaticFiles(directory="static"), name="static") +templates = {} +for lang in os.listdir("templates"): + templates[lang] = Jinja2Templates(directory="templates/"+lang) # 加载所有问卷数据 def load_all_scales(): @@ -125,17 +127,16 @@ async def index(request: Request): readme_content = markdown.markdown(f.read()) except FileNotFoundError: pass # 如果README不存在则静默失败 - return templates.TemplateResponse("index.html", { + return templates[request.state.language].TemplateResponse("index.html", { "request": request, "tags": tags, - "readme_content": readme_content, - "language": request.state.language # Pass language to template + "readme_content": readme_content }) @app.get("/tag/{tag}", response_class=HTMLResponse) async def list(request: Request, tag: str): tags, scales = load_all_scales() - return templates.TemplateResponse("list.html", { + return templates[request.state.language].TemplateResponse("list.html", { "request": request, "tags": tags, "scales": scales, @@ -147,7 +148,7 @@ async def scale(request: Request, scale_id: str): tags, scales = load_all_scales() scale = scales.get(scale_id) if scale: - return templates.TemplateResponse("scale.html", { + return templates[request.state.language].TemplateResponse("scale.html", { "request": request, "scale_id": scale_id, "scale": scale, @@ -195,7 +196,7 @@ async def result(request: Request, scale_id: str, db: Session = Depends(get_db)) db.commit() except Exception as e: print(e) - return templates.TemplateResponse("result.html", { + return templates[request.state.language].TemplateResponse("result.html", { "request": request, "responses": responses, "average": average, diff --git a/templates/en/base.html b/templates/en/base.html new file mode 100644 index 0000000..951fa5c --- /dev/null +++ b/templates/en/base.html @@ -0,0 +1,42 @@ + + + + + + + + + + + + {% block head_extra %}{% endblock %} + + + + + +
+ {% block main %}{% endblock %} +
+ + + + + + + + \ No newline at end of file diff --git a/templates/en/index.html b/templates/en/index.html new file mode 100644 index 0000000..26c4d52 --- /dev/null +++ b/templates/en/index.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} + +{% block head_extra %} +PsychoScales.Org +{% endblock %} + +{% block main %} +{% if readme_content %} +
+ {{ readme_content|safe }} +
+{% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/en/list.html b/templates/en/list.html new file mode 100644 index 0000000..e9d2df8 --- /dev/null +++ b/templates/en/list.html @@ -0,0 +1,16 @@ +{% extends 'base.html' %} + +{% block head_extra %} +{{ tag }} +{% endblock %} + +{% block main %} +
+ {% for scale_id, scale in scales.items() %} + {% if scale.tag == tag %} + {{ scale.get('title','Untitled') }} +

{{ scale.abstract|safe }}

+ {% endif %} + {% endfor %} +
+{% endblock %} \ No newline at end of file diff --git a/templates/en/result.html b/templates/en/result.html new file mode 100644 index 0000000..1145d62 --- /dev/null +++ b/templates/en/result.html @@ -0,0 +1,17 @@ +{% extends 'base.html' %} + +{% block head_extra %} +{{scale.title}} +{% endblock %} + +{% block main %} +

{{ scale.title }}

+ +
+ {{scale.descriptions|safe}} +
+{% endblock %} \ No newline at end of file diff --git a/templates/en/scale.html b/templates/en/scale.html new file mode 100644 index 0000000..1b8e97c --- /dev/null +++ b/templates/en/scale.html @@ -0,0 +1,24 @@ +{% extends 'base.html' %} + +{% block head_extra %} +{{ scale.title }} +{% endblock %} + +{% block main %} +

{{ scale.title }}

+
+ {{ scale.instructions|safe }} +
+
+ {% for id, question in scale['items'].items() %} + +
+ {% for option, label in scale.options.items() %} + + + {% endfor %} +
+ {% endfor %} + +
+{% endblock %} \ No newline at end of file diff --git a/templates/base.html b/templates/zh/base.html similarity index 98% rename from templates/base.html rename to templates/zh/base.html index a65292a..a0aa8be 100644 --- a/templates/base.html +++ b/templates/zh/base.html @@ -1,5 +1,5 @@ - + diff --git a/templates/index.html b/templates/zh/index.html similarity index 94% rename from templates/index.html rename to templates/zh/index.html index 231ac55..0ede79c 100644 --- a/templates/index.html +++ b/templates/zh/index.html @@ -1,13 +1,13 @@ -{% extends 'base.html' %} - -{% block head_extra %} -心尺.Org -{% endblock %} - -{% block main %} -{% if readme_content %} -
- {{ readme_content|safe }} -
-{% endif %} +{% extends 'base.html' %} + +{% block head_extra %} +心尺.Org +{% endblock %} + +{% block main %} +{% if readme_content %} +
+ {{ readme_content|safe }} +
+{% endif %} {% endblock %} \ No newline at end of file diff --git a/templates/list.html b/templates/zh/list.html similarity index 100% rename from templates/list.html rename to templates/zh/list.html diff --git a/templates/result.html b/templates/zh/result.html similarity index 96% rename from templates/result.html rename to templates/zh/result.html index 33564c2..9291cc9 100644 --- a/templates/result.html +++ b/templates/zh/result.html @@ -1,17 +1,17 @@ -{% extends 'base.html' %} - -{% block head_extra %} -{{scale.title}} -{% endblock %} - -{% block main %} -

{{ scale.title }}

- -
- {{scale.descriptions|safe}} -
+{% extends 'base.html' %} + +{% block head_extra %} +{{scale.title}} +{% endblock %} + +{% block main %} +

{{ scale.title }}

+ +
+ {{scale.descriptions|safe}} +
{% endblock %} \ No newline at end of file diff --git a/templates/scale.html b/templates/zh/scale.html similarity index 97% rename from templates/scale.html rename to templates/zh/scale.html index 2dbca5e..e684ba4 100644 --- a/templates/scale.html +++ b/templates/zh/scale.html @@ -1,24 +1,24 @@ -{% extends 'base.html' %} - -{% block head_extra %} -{{ scale.title }} -{% endblock %} - -{% block main %} -

{{ scale.title }}

-
- {{ scale.instructions|safe }} -
-
- {% for id, question in scale['items'].items() %} - -
- {% for option, label in scale.options.items() %} - - - {% endfor %} -
- {% endfor %} - -
+{% extends 'base.html' %} + +{% block head_extra %} +{{ scale.title }} +{% endblock %} + +{% block main %} +

{{ scale.title }}

+
+ {{ scale.instructions|safe }} +
+
+ {% for id, question in scale['items'].items() %} + +
+ {% for option, label in scale.options.items() %} + + + {% endfor %} +
+ {% endfor %} + +
{% endblock %} \ No newline at end of file