Skip to content

Commit d0c9637

Browse files
committed
🌐 更新 i18n
1 parent dbf84e6 commit d0c9637

File tree

9 files changed

+100
-66
lines changed

9 files changed

+100
-66
lines changed

README.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,9 @@
2323

2424
**Docker** 支持。通过 Docker 更加**快捷地**部署 python-openbmclapi ~~(更支持一键跑路)~~
2525

26-
🌈 __*新增功能!*__ **插件拓展**支持。你可以更方便地为 python-openbmclapi 编写自己的插件
26+
🎉 __*新增功能!*__ WebDav 支持(实验性)
2727

28-
🎉 __*新增功能!*__ 基于 Echart 的 OpenBMCLAPI 仪表盘(Dashboard)。
29-
30-
🎉 __*新增功能!*__ 基于 loguru 的**日志器**
28+
🎉 __*新增功能!*__ 多语言支持(实验性)。
3129

3230
</div>
3331

config/config.yml.example

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,43 @@
11
advanced:
2+
debug: false
23
header_bytes: 4096
34
io_buffer: 16777216
5+
language: zh_cn
46
min_rate: 500
57
min_rate_timestamp: 1000
68
request_buffer: 8192
79
timeout: 30
10+
cache:
11+
buffer: 536870912
12+
check: 360
13+
time: 1800
814
cluster:
915
byoc: false
16+
enable: true
17+
file_check_mode: size
1018
id: ''
1119
public_host: ''
1220
public_port: 8800
21+
reconnect:
22+
delay: 5
23+
retry: -1
1324
secret: ''
14-
download:
15-
threads: 64
25+
skip_sign: false
26+
timeout:
27+
enable: 60
28+
keepalive: 300
29+
url: https://openbmclapi.bangbang93.com/
1630
dashboard:
17-
password: ''
31+
password: '123456'
1832
username: admin
33+
download:
34+
threads: 64
35+
storages:
36+
bmclapi:
37+
path: ./bmclapi
38+
type: file
1939
web:
40+
force_ssl: false
2041
port: 8080
2142
server_name: TTB-Network
2243
ssl_port: 8800

core/__init__.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,7 @@ async def check_ports():
196196
await client.writer.drain()
197197
key = await client.read(len(check_port_key), 5)
198198
except:
199-
logger.warn(
200-
f"Port {port[0].sockets[0].getsockname()[1]} has been closed! Reopening..."
201-
)
199+
logger.warn(locale.t("core.warn.port_closed", port=port[0].sockets[0].getsockname()[1]))
202200
logger.error(traceback.format_exc())
203201
closed = True
204202
if closed:
@@ -222,10 +220,8 @@ async def main():
222220
port=0 if SSL_PORT == PORT else SSL_PORT,
223221
ssl=server_side_ssl if get_loaded() else None,
224222
)
225-
logger.info(f"Listening server on port {PORT}.")
226-
logger.info(
227-
f"Listening SSL server on {ssl_server.sockets[0].getsockname()[1]}."
228-
)
223+
logger.info(locale.t("core.info.listening", port=PORT))
224+
logger.info(locale.t("core.info.listening_ssl", port=ssl_server.sockets[0].getsockname()[1]))
229225
async with server, ssl_server:
230226
await asyncio.gather(server.serve_forever(), ssl_server.serve_forever())
231227
except asyncio.CancelledError:
@@ -240,7 +236,7 @@ async def main():
240236
logger.error(traceback.format_exc())
241237
await asyncio.sleep(2)
242238
await close()
243-
logger.info("Shutting down web service...")
239+
logger.info(locale.t("core.info.shutting_down_web_service"))
244240
os.environ["ASYNCIO_STARTUP"] = str(0)
245241
os.kill(os.getpid(), signal.SIGINT)
246242

core/cluster.py

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ async def __call__(self, data) -> list[BMCLAPIFile]:
9696
self.files = []
9797
with tqdm(
9898
total=self.read_long(),
99-
desc="Parsing Filelist",
99+
desc=locale.t("cluster.tqdm.desc.parsing_file_list"),
100100
unit_scale=True,
101-
unit=" file(s)",
101+
unit=locale.t("cluster.tqdm.unit.file"),
102102
) as pbar:
103103
for _ in range(pbar.total):
104104
self.files.append(
@@ -813,12 +813,12 @@ def __init__(self) -> None:
813813
self._retry = 0
814814

815815
def _message(self, message):
816-
logger.info(locale.t("cluster.info.remote_message", message=message))
816+
logger.info(locale.t("cluster.info.cluster.remote_message", message=message))
817817
if "信任度过低" in message:
818818
self.trusted = False
819819

820820
def _exception(self, message):
821-
logger.error(locale.t("cluster.error.remote_message", message=message))
821+
logger.error(locale.t("cluster.error.cluster.remote_message", message=message))
822822

823823
async def emit(self, channel, data=None):
824824
await self.sio.emit(
@@ -834,27 +834,28 @@ async def init(self):
834834
transports=["websocket"],
835835
)
836836
except:
837-
logger.warn(locale.t("cluster.warn.failed_to_connect"))
837+
logger.warn(locale.t("cluster.warn.cluster.failed_to_connect"))
838838
Timer.delay(self.init, delay=5)
839839
return
840840
await self.start()
841841

842842
async def start(self):
843843
await self.cert()
844844
if len(storages.get_storages()) == 0:
845-
logger.warn("There is currently no Storage, the enabled nodes are blocked.")
845+
logger.warn(locale.t("cluster.warn.cluster.no_storage"))
846846
return
847847
await self.start_storage()
848848

849849
async def start_storage(self):
850850
if len(storages.get_storages()) == 0:
851851
if self.connected:
852852
self.disable()
853-
logger.warn("There is currently no Storage, the enabled nodes are blocked.")
853+
logger.warn(locale.t("cluster.warn.cluster.no_storage"))
854854
return
855855
start = time.time()
856856
await self.file_check()
857-
logger.success(f"File check completed, time: {time.time() - start:.2f}s")
857+
t = "%.2f" % start
858+
logger.success(locale.t("cluster.success.cluster.finished_file_check", time=t))
858859
if not self.connected:
859860
await self.enable()
860861

@@ -863,12 +864,10 @@ async def cert(self):
863864

864865
async def enable(self):
865866
if self.connected:
866-
logger.debug(
867-
"Still trying to enable cluster? You has been blocked. (\nFrom bangbang93:\n 谁他妈\n 一秒钟发了好几百个enable请求\n ban了解一下等我回杭州再看\n ban了先\n\n > Timestamp at 2024/3/30 14:07 GMT+8\n)"
868-
)
867+
logger.debug(locale.t("cluster.debug.cluster.blocked"))
869868
return
870869
if not ENABLE:
871-
logger.warn("Disabled cluster.")
870+
logger.warn(locale.t("cluster.warn.cluster.disabled"))
872871
return
873872
self.connected = True
874873
if self._enable_timer is not None:
@@ -878,23 +877,19 @@ async def enable(self):
878877

879878
async def retry(self):
880879
if RECONNECT_RETRY != -1 and self._retry >= RECONNECT_RETRY:
881-
logger.error(
882-
f"The number of retries has reached {RECONNECT_RETRY} and the enabled node has been disabled"
883-
)
880+
logger.error(locale.t("cluster.error.cluster.reached_maximum_retry_count", count=RECONNECT_RETRY))
884881
return
885882
if self.connected:
886883
await self.disable()
887884
self.connected = False
888885
self._retry += 1
889-
logger.info(f"Retrying after {RECONNECT_DELAY}s.")
886+
logger.info(locale.t("cluster.info.cluster.retry", t=RECONNECT_DELAY))
890887
await asyncio.sleep(RECONNECT_DELAY)
891888
await self.enable()
892889

893890
async def _enable(self):
894891
if not ENABLE:
895-
logger.warn(
896-
"Disabled cluster."
897-
)
892+
logger.warn(locale.t("cluster.warn.cluster.disabled"))
898893
return
899894
storage_str = {"file": 0, "webdav": 0}
900895
self.trusted = True
@@ -903,9 +898,7 @@ async def _enable(self):
903898
storage_str["file"] += 1
904899
elif isinstance(storage, WebDav):
905900
storage_str["webdav"] += 1
906-
logger.info(
907-
f"Total {len(storages.get_storages())} storage ({storage_str['file']} Local Storage, {storage_str['webdav']} Webdav Storage)."
908-
)
901+
logger.info(locale.t("cluster.info.cluster.storage_count", total=len(storages.get_storages()), local=storage_str['file'], webdav=storage_str['webdav']))
909902
await self.emit(
910903
"enable",
911904
{
@@ -941,27 +934,25 @@ async def message(self, type, data: list[Any]):
941934
self._enable_timer.block()
942935
self._enable_timer = None
943936
if err:
944-
logger.error(f"Unable to start service: {err['message']}.")
937+
logger.error(locale.t("cluster.error.cluster.failed_to_start_service", e=err['message']))
945938
await self.retry()
946939
return
947940
self._retry = 0
948941
self.connected = True
949-
logger.success(f"Connected to the main server! Starting service...")
950-
logger.info(
951-
f"Hosting on {CLUSTER_ID}.openbmclapi.933.moe:{PUBLIC_PORT or PORT}."
952-
)
942+
logger.success(locale.t("cluster.success.cluster.connected_to_center_server"))
943+
logger.info(locale.t("cluster.info.cluster.hosting", id=CLUSTER_ID, port=PUBLIC_PORT or PORT))
953944
await self.start_keepalive()
954945
await dashboard.set_status(
955946
"正常工作" + ("" if self.trusted else "(节点信任度过低)")
956947
)
957948
elif type == "keep-alive":
958949
if err:
959-
logger.error(f"Unable to keep alive! Reconnecting...")
950+
logger.error(locale.t("cluster.error.cluster.keepalive_failed"))
960951
await self.retry()
961952
return
962953
if not ack:
963954
await self.emit("disable")
964-
logger.warn("The cluster is kicked by server.")
955+
logger.warn(locale.t("cluster.warn.cluster.kicked"))
965956
return
966957
storage_data = {"hits": 0, "bytes": 0}
967958
for storage in self._cur_storages:
@@ -997,7 +988,7 @@ async def _keepalive_timeout(self):
997988
if self.keepaliveTimeoutTimer is not None:
998989
self.keepaliveTimeoutTimer.block()
999990
self.keepaliving = False
1000-
logger.warn("Failed to keepalive! Reconnecting the main server...")
991+
logger.warn(locale.t("cluster.error.cluster.keepalive_failed"))
1001992
await self.retry()
1002993

1003994
async def _keepalive(self):
@@ -1011,13 +1002,13 @@ async def _keepalive(self):
10111002
{"time": int(time.time() * 1000), **data},
10121003
)
10131004
self.keepaliving = False
1014-
logger.debug("Next keep alive")
1005+
logger.debug(locale.t("cluster.info.cluster.next_keepalive"))
10151006
await self.start_keepalive(60)
10161007

10171008
async def disable(self):
10181009
if self.sio.connected:
10191010
await self.emit("disable")
1020-
logger.info("Disconnected from the main server...")
1011+
logger.info(locale.t("cluster.info.cluster.disconnecting"))
10211012
await dashboard.set_status("已下线")
10221013

10231014
async def get_cache_stats(self) -> StatsCache:
@@ -1041,7 +1032,7 @@ async def check_update():
10411032
global fetched_version
10421033
fetched_version = "Unknown"
10431034
async with aiohttp.ClientSession(base_url=github_api) as session:
1044-
logger.info("Checking update...")
1035+
logger.info(locale.t("cluster.info.check_update.checking"))
10451036
try:
10461037
async with session.get(
10471038
"/repos/TTB-Network/python-openbmclapi/releases/latest"
@@ -1050,12 +1041,12 @@ async def check_update():
10501041
data = await req.json()
10511042
fetched_version = data["tag_name"]
10521043
if fetched_version != VERSION:
1053-
logger.success(f"New version found: {fetched_version}!")
1044+
logger.success(locale.t("cluster.success.check_update.new_version", latest=fetched_version))
10541045
await dashboard.trigger("version")
10551046
else:
1056-
logger.info(f"Already up to date.")
1047+
logger.info(locale.t("cluster.info.check_update.already_up_to_date"))
10571048
except aiohttp.ClientError as e:
1058-
logger.error(f"An error occured whilst checking update: {e}.")
1049+
logger.error(locale.t("cluster.error.check_update.failed", e=e))
10591050
Timer.delay(check_update, delay=3600)
10601051

10611052

core/const.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
505: "HTTP Version not supported",
9797
}
9898
REQUEST_TIME_UNITS = ["ns", "ms", "s", "m", "h"]
99-
FILECHECK = Config.get("file.check")
99+
FILECHECK = Config.get("clueset.file_check_mode")
100100
STORAGES: list['StorageParse'] = []
101101

102102
@dataclass

core/dashboard.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
from core import stats, system, unit, utils, web
1212
from core import cluster
1313
from core.api import StatsCache
14-
from core.config import Config
1514
from core import timer as Timer
1615
from core.timer import Task
1716

core/timer.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
import os
44
import time
55
import traceback
6-
from typing import Any, Callable, Optional, Coroutine
6+
from typing import Any, Callable, Optional
77
from core.logger import logger as log
88
from core.const import *
9+
from core.i18n import locale
910

1011
logger = log.depth(2)
1112

@@ -34,9 +35,9 @@ def _get_function_name(self):
3435
return self._frame_name
3536
def block(self):
3637
if self._blocked:
37-
logger.debug(f"The task <{self._get_function_name()}> is blocked.")
38+
logger.debug(locale.t("timer.info.task.freezed", task=self._get_function_name()))
3839
else:
39-
logger.debug(f"The task <{self._get_function_name()}> is blocking.")
40+
logger.debug(locale.t("timer.info.task.freezing", task=self._get_function_name()))
4041
self._blocked = True
4142
if self._cur_task is not None:
4243
self._cur_task.cancel()

i18n/zh_cn.json

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"web.info.loading": "加载中……",
66
"cluster.success.keepalive": "成功保活,服务了 $hits 个文件 ($bytes,$count 个储存),Ping:$ping 毫秒。",
77
"cluster.info.token.fetching": "正在获取 token……",
8-
"cluster.success.token.fetched": "成功获取 token。TTL:$tll",
8+
"cluster.success.token.fetched": "成功获取 token。TTL:$tll",
99
"cluster.error.token.failed": "在尝试获取 token 时发生错误,将在 $delay 秒后重试:$e。",
1010
"cluster.error.cert.failed": "无法获取证书。$ack。",
1111
"cluster.success.cert.requested": "成功获取证书!",
@@ -27,9 +27,38 @@
2727
"cluster.success.check_files.finished": "已检查所有文件:$count ($size)!",
2828
"cluster.info.check_files.missing": "文件缺失:$count。",
2929
"cluster.tqdm.desc.cleaning_cache": "清除缓存中",
30+
"cluster.tqdm.desc.parsing_file_list": "解析文件列表中",
3031
"cluster.tqdm.desc.fetching_webdav_files": "获取 WebDav <endpoint: '$endpoint'> 文件列表中",
3132
"i18n.prompt.failed": "(错误:无法找到该 i18n 字符串)",
32-
"cluster.info.remote_message": "[总控]: $message",
33-
"cluster.error.remote_message": "[总控]: $message",
34-
"cluster.warn.failed_to_connect": "无法连接到总控,将在 5 秒后重试。"
33+
"cluster.info.cluster.remote_message": "[总控]: $message",
34+
"cluster.error.cluster.remote_message": "[总控]: $message",
35+
"cluster.warn.cluster.failed_to_connect": "无法连接到总控,将在 5 秒后重试。",
36+
"cluster.warn.cluster.no_storage": "因为当前没有任何存储,已关闭节点。",
37+
"cluster.success.cluster.finished_file_check": "文件检查已完成,耗时:$time 秒",
38+
"cluster.debug.cluster.blocked": "还在尝试启用节点?你已经被 ban 了。 (\nFrom bangbang93:\n 谁他妈\n 一秒钟发了好几百个enable请求\n ban了解一下等我回杭州再看\n ban了先\n\n > 2024/3/30 14:07 GMT+8\n)",
39+
"cluster.warn.cluster.disabled": "已关闭节点。",
40+
"cluster.error.cluster.reached_maximum_retry_count": "重试次数已到达 $count 次,已关闭节点。",
41+
"cluster.info.cluster.retry": "将在 $t 秒后重试。",
42+
"cluster.info.cluster.storage_count": "当前总计有 $total 个储存,$local 个本地储存,$webdab 个 WebDav 储存。",
43+
"cluster.error.cluster.failed_to_start_service": "无法启动服务:$e",
44+
"cluster.success.cluster.connected_to_center_server": "成功连接至主控,启动服务中……",
45+
"cluster.info.cluster.hosting": "服务器已在 $id.openbmclapi.933.moe:$port 开放。",
46+
"cluster.error.cluster.keepalive_failed": "保活失败,正在重连……",
47+
"cluster.warn.cluster.kicked": "节点已被强制断开连接。",
48+
"cluster.info.cluster.disconnecting": "正在与主控断开连接……",
49+
"cluster.info.cluster.next_keepalive": "正在进行下一次保活。",
50+
"cluster.info.check_update.checking": "检查更新中……",
51+
"cluster.success.check_update.new_version": "发现新版本:$latest!",
52+
"cluster.info.check_update.already_up_to_date": "当前已是最新版本。",
53+
"cluster.error.check_update.failed": "在尝试获取最新版本是遇到了错误:$e。",
54+
"timer.info.task.freezing": "正在冻结任务 <$task>。",
55+
"timer.info.task.freezed": "已冻结任务 <$task>。",
56+
"plugins.info.attempt_loading": "准备加载插件中……",
57+
"plugins.debug.loading": "正在加载插件 plugins.$name。",
58+
"plugins.success.loaded": "成功加载插件 [$name]!版本:[$version],作者:[$author]",
59+
"core.warn.port_closed": "端口 $port 已被关闭,正在重新开启……",
60+
"core.info.listening": "正在端口 $port 上监听服务器。",
61+
"core.info.listening_ssl": "正在端口 $port 上监听 SSL 服务器。",
62+
"core.info.shutting_down_web_service": "正在关闭 Web 服务……"
63+
3564
}

0 commit comments

Comments
 (0)