Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
SkyEye-FAST committed Jul 15, 2024
2 parents e88a03d + bcdf0ee commit 22fc6f4
Show file tree
Hide file tree
Showing 6 changed files with 210 additions and 34 deletions.
236 changes: 206 additions & 30 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"""Minecraft标准译名查询网页,使用Flask编写的后端框架"""

from os import getenv
from datetime import datetime
from datetime import datetime, timezone
from typing import Optional
from random import sample

Expand All @@ -14,6 +14,7 @@
send_from_directory,
redirect,
url_for,
jsonify,
)
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, BooleanField
Expand Down Expand Up @@ -41,6 +42,8 @@ def get_locale() -> str:
locale = request.accept_languages.best_match(
["zh_CN", "zh_TW", "zh", "en"], default="en"
)
if locale == "zh":
return "zh_CN"
return locale


Expand Down Expand Up @@ -77,16 +80,6 @@ def determine_locale_and_timezone() -> None:
session["timezone"] = get_timezone_from_ip()


class QueryForm(FlaskForm):
"""
查询表单,用于获取用户输入的查询字符串和是否启用附加语言的选项。
"""

input_string: StringField = StringField(_l("Content to be queried: "))
jkv_check: BooleanField = BooleanField(_l("Enable additional languages"))
submit: SubmitField = SubmitField(_l("QUERY"))


def handle_category(selected_option: str) -> str:
"""
处理字符串分类,以便显示表格。
Expand All @@ -105,22 +98,32 @@ def handle_category(selected_option: str) -> str:
return category


class QueryForm(FlaskForm):
"""
查询表单,用于获取用户输入的查询字符串和是否启用附加语言的选项。
"""

input_string: StringField = StringField(_l("Content to be queried: "))
jkv_check: BooleanField = BooleanField(_l("Enable additional languages"))
submit: SubmitField = SubmitField(_l("QUERY"))


@flask_app.route("/", methods=["GET", "POST"])
def index() -> str:
"""
主页面路由,处理查询表单的提交和渲染主页面模板
主页面路由,处理查询表单的提交并渲染主页面模板
Returns:
str: 渲染后的主页面 HTML。
"""

form = QueryForm()
results = {}
query_mode = request.args.get("mode", "source")
query_lang = request.args.get("lang", "zh_cn")
query_str = request.args.get("input_value", "")
enable_jkv = request.args.get("enable_jkv", False, type=bool)
selected_option = request.args.get("key", "")
query_mode = "source"
query_lang = "zh_cn"
query_str = ""
enable_jkv = False
selected_option = ""

if form.validate_on_submit():
query_str = form.input_string.data
Expand All @@ -131,7 +134,6 @@ def index() -> str:
if query_mode == "source":
results = get_translation(query_str)
elif query_mode == "transl":
query_lang = request.form.get("query-lang", "zh_cn")
results = get_translation(query_str, query_lang)
elif query_mode == "key":
results = get_translation(query_str, "key")
Expand All @@ -145,6 +147,7 @@ def index() -> str:
date_tz = datetime.now(tz=get_timezone(session["timezone"])).date()

context = {
"action": "/",
"form": form,
"mode": query_mode,
"lang": query_lang,
Expand All @@ -163,10 +166,151 @@ def index() -> str:
return render_template("index.html", **context)


def validate_language_code(lang_code:str) -> bool:
"""
判断语言代码是否有效的函数,有效则返回True,否则返回False。
Args:
lang_code (str): 语言代码。
Returns:
bool: 是否有效。
"""

valid_lang_codes = ["zh_cn", "zh_hk", "zh_tw", "lzh"]
if lang_code in valid_lang_codes:
return True
return False


@flask_app.route("/p", methods=["GET", "POST"])
def index_param() -> str:
"""
主页面(可传参)路由,处理查询表单的提交并渲染主页面模板。
Returns:
str: 渲染后的主页面 HTML。
"""

form = QueryForm()
results = {}
query_mode = request.args.get("mode", "source")
query_lang = request.args.get("lang", "zh_cn") if query_mode == "transl" else ""
query_str = request.args.get("input", "")
enable_jkv = request.args.get("enable_jkv", "false").lower() in ["true", "1", "yes"]
selected_option = request.args.get("option", "")

if form.validate_on_submit():
query_str = form.input_string.data
query_mode = request.form.get("query-mode", "source")
enable_jkv = form.jkv_check.data
selected_option = request.form.get("option", "")

if query_mode == "transl":
query_lang = request.form.get("query-lang", "zh_cn")
if not validate_language_code(query_lang):
query_lang = "zh_cn"
return redirect(
url_for(
"index_param",
mode=query_mode,
lang=query_lang,
input=query_str,
enable_jkv=enable_jkv,
option=selected_option,
)
)
return redirect(
url_for(
"index_param",
mode=query_mode,
input=query_str,
enable_jkv=enable_jkv,
option=selected_option,
)
)

form.input_string.data = query_str
form.jkv_check.data = enable_jkv

if query_str:
if query_mode == "source":
results = get_translation(query_str)
elif query_mode == "transl":
results = get_translation(query_str, query_lang)
elif query_mode == "key":
results = get_translation(query_str, "key")
else:
selected_option = ""

source_str = data["en_us"].get(selected_option, "")
keys = results.keys()

timezone_str = get_timezone_name(session["timezone"], locale=session["locale"])
date_tz = datetime.now(tz=get_timezone(session["timezone"])).date()

context = {
"action": "/p",
"form": form,
"mode": query_mode,
"lang": query_lang,
"source": source_str,
"key": selected_option,
"input_value": query_str,
"keys": keys,
"translation": results.get(selected_option, {}),
"date_str": date_tz,
"date_str_t": format_date(date_tz, "long", locale=session["locale"]),
"timezone_str": timezone_str,
"enable_jkv": enable_jkv,
"category": handle_category(selected_option),
}

return render_template("index.html", **context)


@flask_app.route("/api", methods=["GET"])
def api():
"""
API 路由。
Returns:
~flask.Response
"""

results = {}

query_mode = request.args.get("mode", "source")
if query_mode not in ["source", "transl", "key"]:
return jsonify({"error": "Invalid query mode"}), 400

query_lang = request.args.get("lang", "zh_cn") if query_mode == "transl" else ""
if query_mode == "transl" and not validate_language_code(query_lang):
return jsonify({"error": "Invalid language code"}), 400

query_str = request.args.get("input", "")
if not query_str:
return jsonify({"error": "Missing input parameter"}), 400

if query_str:
if query_mode == "source":
results = get_translation(query_str)
elif query_mode == "transl":
results = get_translation(query_str, query_lang)
elif query_mode == "key":
results = get_translation(query_str, "key")

output = {
"request_time": datetime.now(timezone.utc).isoformat(),
"result": results,
}
return jsonify(output)


@flask_app.route("/table")
def table() -> str:
"""
表格界面路由,渲染表格页面模板。
表格页面路由,渲染表格页面模板。
Returns:
str: 渲染后的表格页面 HTML。
Expand All @@ -182,32 +326,58 @@ def table() -> str:


def get_questions() -> str:
"""获取题目"""
"""
获取题目函数。
从 ID 映射中随机抽取以生成题组。
Returns:
str: 题组编号。
"""

random_keys = sorted(sample(list(id_map.keys()), QUESTION_AMOUNT))
code = "".join(random_keys)
return code
return "".join(random_keys)


@flask_app.route("/quiz", methods=["GET", "POST"])
@flask_app.route("/quiz")
def quiz_portal() -> str:
"""测验门户页面路由"""
"""
测验门户页面路由。
Returns:
str: 渲染后的测验门户页面 HTML。
"""

p1 = _l("Enter question group code...")

return render_template(
"quiz_portal.html", placeholder=p1, locale=session["locale"], random_code=get_questions()
"quiz_portal.html",
placeholder=p1,
locale=session["locale"],
random_code=get_questions(),
)


@flask_app.route("/quiz/")
def quiz_redirect():
"""重定向quiz"""
"""
重定向`/quiz/`至`/quiz`的路由。
"""

return redirect(url_for("quiz_portal"))


@flask_app.route("/quiz/<code>")
def quiz_sub(code) -> str:
"""测验子页面路由"""
def quiz_sub(code: str) -> str:
"""
测验子页面路由。
Args:
code (str): 题组编号。
Returns:
str: 渲染后的测验子页面页面 HTML。
"""

if len(code) != 3 * QUESTION_AMOUNT:
return render_template("quiz_error.html")
Expand Down Expand Up @@ -257,8 +427,14 @@ def table_tsv() -> str:


@flask_app.errorhandler(404)
def error_404(e):
"""404重定向路由"""
def error_404(e) -> str:
"""
404 重定向路由。
Returns:
str: 渲染后的 404 页面 HTML。
"""

print(e)
return render_template("404.html"), 404

Expand Down
2 changes: 1 addition & 1 deletion templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
<span class="material-symbols-outlined">keyboard_arrow_down</span>
</button>
<div class="content">
<form class="form" action="/" method="post">
<form class="form" action="{{ action }}" method="post">
<div class="container">
{{ form.hidden_tag() }}

Expand Down
Binary file modified translations/zh_Hans_CN/LC_MESSAGES/messages.mo
Binary file not shown.
2 changes: 1 addition & 1 deletion translations/zh_Hans_CN/LC_MESSAGES/messages.po
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ msgstr "按本地化键名查询"

#: templates/index.html:70
msgid "Language to be queried: "
msgstr "查询的语言:"
msgstr "查询语言:"

#: templates/index.html:83
msgid "Select a translation key: "
Expand Down
Binary file modified translations/zh_Hant_TW/LC_MESSAGES/messages.mo
Binary file not shown.
4 changes: 2 additions & 2 deletions translations/zh_Hant_TW/LC_MESSAGES/messages.po
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,15 @@ msgstr "依翻譯後字串查詢"

#: templates/index.html:65
msgid "Query by translation key"
msgstr "依本地化鍵名查詢"
msgstr "依在地化鍵名查詢"

#: templates/index.html:70
msgid "Language to be queried: "
msgstr "查詢語言:"

#: templates/index.html:83
msgid "Select a translation key: "
msgstr "選擇本地化鍵名:"
msgstr "選擇在地化鍵名:"

#: templates/index.html:105
msgid "Language names"
Expand Down

0 comments on commit 22fc6f4

Please sign in to comment.