初步的 kvmd 国际化(汉化)支持

1. 添加汉化文件
2. 添加 Lanuages().gettext 函数处理字符替换
3. 修改相关字符串调用
This commit is contained in:
mofeng-git
2024-08-06 21:45:16 +08:00
parent 6a966af5fb
commit 20927c7226
34 changed files with 999 additions and 113 deletions

View File

@@ -40,6 +40,8 @@ from .... import aiotools
from .... import aiomulti
from .... import aioproc
from ....lanuages import Lanuages
from .. import BaseHid
from ..otg.events import ResetEvent
@@ -107,6 +109,8 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
stop_event=self.__stop_event,
)
self.gettext=Lanuages().gettext
@classmethod
def get_plugin_options(cls) -> dict:
return {
@@ -130,7 +134,7 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
}
def sysprep(self) -> None:
get_logger(0).info("Starting HID daemon ...")
get_logger(0).info(self.gettext("Starting HID daemon ..."))
self.__proc = multiprocessing.Process(target=self.__server_worker, daemon=True)
self.__proc.start()
@@ -175,7 +179,7 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
async def cleanup(self) -> None:
if self.__proc is not None:
if self.__proc.is_alive():
get_logger(0).info("Stopping HID daemon ...")
get_logger(0).info(self.gettext("Stopping HID daemon ..."))
self.__stop_event.set()
if self.__proc.is_alive() or self.__proc.exitcode is not None:
self.__proc.join()
@@ -224,5 +228,5 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
try:
self.__server.run()
except Exception:
logger.exception("Unexpected HID error")
logger.exception(self.gettext("Unexpected HID error"))
time.sleep(5)

View File

@@ -38,6 +38,8 @@ from .... import aiomulti
from ....keyboard.mappings import UsbKey
from ....lanuages import Lanuages
from ..otg.events import BaseEvent
from ..otg.events import ClearEvent
from ..otg.events import ResetEvent
@@ -115,6 +117,8 @@ class BtServer: # pylint: disable=too-many-instance-attributes
self.__keys: list[UsbKey | None] = [None] * 6
self.__mouse_buttons = 0
self.gettext=Lanuages().gettext
def run(self) -> None:
with self.__iface:
self.__iface.configure()
@@ -146,7 +150,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
@contextlib.contextmanager
def __listen(self, role: _RoleT, addr: str, port: int) -> Generator[socket.socket, None, None]:
get_logger(0).info("Listening [%s]:%d for %s ...", addr, port, role)
get_logger(0).info(self.gettext("Listening [%s]:%d for %s ..."), addr, port, role)
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as sock: # type: ignore
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.settimeout(self.__socket_timeout)
@@ -183,7 +187,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
elif data == b"\x71":
sock.send(b"\x00")
except Exception as err:
get_logger(0).exception("CTL socket error on %s: %s", client.addr, tools.efmt(err))
get_logger(0).exception(self.gettext("CTL socket error on %s: %s"), client.addr, tools.efmt(err))
self.__close_client("CTL", client, "ctl_sock")
continue
@@ -197,7 +201,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
elif data[:2] == b"\xA2\x01":
self.__process_leds(data[2])
except Exception as err:
get_logger(0).exception("INT socket error on %s: %s", client.addr, tools.efmt(err))
get_logger(0).exception(self.gettext("INT socket error on %s: %s"), client.addr, tools.efmt(err))
self.__close_client("INT", client, "ctl_sock")
if qr in ready_read:
@@ -280,7 +284,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
try:
client.int_sock.send(report)
except Exception as err:
get_logger(0).info("Can't send %s report to %s: %s", name, client.addr, tools.efmt(err))
get_logger(0).info(self.gettext("Can't send %s report to %s: %s"), name, client.addr, tools.efmt(err))
self.__close_client_pair(client)
def __clear_modifiers(self) -> None:
@@ -307,12 +311,12 @@ class BtServer: # pylint: disable=too-many-instance-attributes
(sock, peer) = server_sock.accept()
sock.setblocking(True)
except Exception:
get_logger(0).exception("Can't accept %s client", role)
get_logger(0).exception(self.gettext("Can't accept %s client"), role)
else:
if peer[0] not in self.__clients:
if len(self.__clients) >= self.__max_clients:
self.__close_sock(sock)
get_logger(0).info("Refused %s client: %s: max clients reached", role, peer[0])
get_logger(0).info(self.gettext("Refused %s client: %s: max clients reached"), role, peer[0])
return
self.__clients[peer[0]] = _BtClient(peer[0])
client = self.__clients[peer[0]]
@@ -321,7 +325,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
setattr(client, sock_attr, sock)
self.__to_read.add(sock)
get_logger(0).info("Accepted %s client: %s", role, peer[0])
get_logger(0).info(self.gettext("Accepted %s client: %s"), role, peer[0])
self.__state_flags.update(online=True)
self.__set_public(len(self.__clients) < self.__max_clients)
@@ -333,7 +337,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
setattr(client, sock_attr, None)
self.__to_read.remove(sock)
get_logger(0).info("Closed %s client %s", role, client.addr)
get_logger(0).info(self.gettext("Closed %s client %s"), role, client.addr)
if client.ctl_sock is None and client.int_sock is None:
self.__clients.pop(client.addr)
@@ -368,16 +372,16 @@ class BtServer: # pylint: disable=too-many-instance-attributes
def __set_public(self, public: bool) -> None:
logger = get_logger(0)
if self.__control_public:
logger.info("Publishing ..." if public else "Unpublishing ...")
logger.info(self.gettext("Publishing ...") if public else self.gettext("Unpublishing ..."))
try:
self.__iface.set_public(public)
except Exception as err:
logger.error("Can't change public mode: %s", tools.efmt(err))
logger.error(self.gettext("Can't change public mode: %s"), tools.efmt(err))
def __unpair_client(self, client: _BtClient) -> None:
logger = get_logger(0)
logger.info("Unpairing %s ...", client.addr)
logger.info(self.gettext("Unpairing %s ..."), client.addr)
try:
self.__iface.unpair(client.addr)
except Exception as err:
logger.error("Can't unpair %s: %s", client.addr, tools.efmt(err))
logger.error(self.gettext("Can't unpair %s: %s"), client.addr, tools.efmt(err))