进一步的 kvmd 国际化(汉化)支持,添加配置入口

yaml 配置示例:
```
languages:
    console: zh
    web: zh
```
This commit is contained in:
mofeng-git
2024-08-14 22:54:12 +08:00
parent 5b25b3661f
commit 35397c5414
47 changed files with 567 additions and 181 deletions

View File

@@ -25,7 +25,7 @@ from typing import AsyncGenerator
from ...errors import OperationError
from ...errors import IsBusyError
from ...lanuages import Lanuages
from ...languages import Languages
from .. import BasePlugin
from .. import get_plugin_class
@@ -42,7 +42,7 @@ class AtxOperationError(OperationError, AtxError):
class AtxIsBusyError(IsBusyError, AtxError):
def __init__(self) -> None:
super().__init__(Lanuages().gettext("Performing another ATX operation, please try again later"))
super().__init__(Languages().gettext("Performing another ATX operation, please try again later"))
# =====

View File

@@ -39,7 +39,7 @@ from ...validators.basic import valid_float_f01
from ...validators.os import valid_abs_path
from ...validators.hw import valid_gpio_pin
from ...lanuages import Lanuages
from ...languages import Languages
from . import AtxIsBusyError
from . import BaseAtx
@@ -193,7 +193,7 @@ class Plugin(BaseAtx): # pylint: disable=too-many-instance-attributes
await self.__inner_click(name, pin, delay)
else:
await aiotools.run_region_task(
Lanuages().gettext(f"Can't perform ATX {name} click or operation was not completed"),
Languages().gettext(f"Can't perform ATX {name} click or operation was not completed"),
self.__region, self.__inner_click, name, pin, delay,
)
@@ -206,4 +206,4 @@ class Plugin(BaseAtx): # pylint: disable=too-many-instance-attributes
finally:
self.__line_request.set_value(pin, gpiod.line.Value(False))
await asyncio.sleep(1)
get_logger(0).info(Lanuages().gettext("Clicked ATX button %r"), name)
get_logger(0).info(Languages().gettext("Clicked ATX button %r"), name)

View File

@@ -32,7 +32,7 @@ from ...logging import get_logger
from ... import htclient
from ...lanuages import Lanuages
from ...languages import Languages
from . import BaseAuthService
@@ -91,7 +91,7 @@ class Plugin(BaseAuthService):
htclient.raise_not_200(response)
return True
except Exception:
get_logger().exception(Lanuages().gettext("Failed HTTP auth request for user %r"), user)
get_logger().exception(Languages().gettext("Failed HTTP auth request for user %r"), user)
return False
async def cleanup(self) -> None:

View File

@@ -33,7 +33,7 @@ from ...logging import get_logger
from ... import tools
from ... import aiotools
from ...lanuages import Lanuages
from ...languages import Languages
from . import BaseAuthService
@@ -103,9 +103,9 @@ class Plugin(BaseAuthService):
except ldap.INVALID_CREDENTIALS:
pass
except ldap.SERVER_DOWN as err:
get_logger().error(Lanuages().gettext("LDAP server is down: %s"), tools.efmt(err))
get_logger().error(Languages().gettext("LDAP server is down: %s"), tools.efmt(err))
except Exception as err:
get_logger().error(Lanuages().gettext("Unexpected LDAP error: %s"), tools.efmt(err))
get_logger().error(Languages().gettext("Unexpected LDAP error: %s"), tools.efmt(err))
finally:
if conn is not None:
try:

View File

@@ -34,7 +34,7 @@ from ...logging import get_logger
from ... import aiotools
from ...lanuages import Lanuages
from ...languages import Languages
from . import BaseAuthService
@@ -88,13 +88,13 @@ class Plugin(BaseAuthService):
return False
else:
if uid < self.__allow_uids_at:
get_logger().error(Lanuages().gettext("Unallowed UID of user %r: uid=%d < allow_uids_at=%d"),
get_logger().error(Languages().gettext("Unallowed UID of user %r: uid=%d < allow_uids_at=%d"),
user, uid, self.__allow_uids_at)
return False
pam_obj = pam.pam()
if not pam_obj.authenticate(user, passwd, service=self.__service):
get_logger().error(Lanuages().gettext("Can't authorize user %r using PAM: code=%d; reason=%s"),
get_logger().error(Languages().gettext("Can't authorize user %r using PAM: code=%d; reason=%s"),
user, pam_obj.code, pam_obj.reason)
return False
return True

View File

@@ -36,7 +36,7 @@ from ...logging import get_logger
from ... import aiotools
from ...lanuages import Lanuages
from ...languages import Languages
from . import BaseAuthService
@@ -442,5 +442,5 @@ class Plugin(BaseAuthService):
response = client.SendPacket(request)
return (response.code == pyrad.packet.AccessAccept)
except Exception:
get_logger().exception(Lanuages().gettext("Failed RADIUS auth request for user %r"), user)
get_logger().exception(Languages().gettext("Failed RADIUS auth request for user %r"), user)
return False

View File

@@ -46,7 +46,7 @@ from ....validators.basic import valid_float_f01
from ....validators.os import valid_abs_path
from ....validators.hw import valid_gpio_pin_optional
from ....lanuages import Lanuages
from ....languages import Languages
from .. import BaseHid
@@ -146,7 +146,7 @@ class BaseMcuHid(BaseHid, multiprocessing.Process): # pylint: disable=too-many-
self.__stop_event = multiprocessing.Event()
self.gettext=Lanuages().gettext
self.gettext=Languages().gettext
@classmethod
def get_plugin_options(cls) -> dict:

View File

@@ -27,7 +27,7 @@ import gpiod
from ....logging import get_logger
from ....lanuages import Lanuages
from ....languages import Languages
# =====
class Gpio: # pylint: disable=too-many-instance-attributes
@@ -51,7 +51,7 @@ class Gpio: # pylint: disable=too-many-instance-attributes
self.__line_request: (gpiod.LineRequest | None) = None
self.__last_power: (bool | None) = None
self.gettext=Lanuages().gettext
self.gettext=Languages().gettext
def __enter__(self) -> None:
if self.__power_detect_pin >= 0 or self.__reset_pin >= 0:

View File

@@ -40,7 +40,7 @@ from .... import aiotools
from .... import aiomulti
from .... import aioproc
from ....lanuages import Lanuages
from ....languages import Languages
from .. import BaseHid
@@ -109,7 +109,7 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
stop_event=self.__stop_event,
)
self.gettext=Lanuages().gettext
self.gettext=Languages().gettext
@classmethod
def get_plugin_options(cls) -> dict:

View File

@@ -38,7 +38,7 @@ from .... import aiomulti
from ....keyboard.mappings import UsbKey
from ....lanuages import Lanuages
from ....languages import Languages
from ..otg.events import BaseEvent
from ..otg.events import ClearEvent
@@ -117,7 +117,7 @@ class BtServer: # pylint: disable=too-many-instance-attributes
self.__keys: list[UsbKey | None] = [None] * 6
self.__mouse_buttons = 0
self.gettext=Lanuages().gettext
self.gettext=Languages().gettext
def run(self) -> None:
with self.__iface:

View File

@@ -41,7 +41,7 @@ from ....validators.basic import valid_float_f01
from ....validators.os import valid_abs_path
from ....validators.hw import valid_tty_speed
from ....lanuages import Lanuages
from ....languages import Languages
from .. import BaseHid
@@ -84,7 +84,7 @@ class Plugin(BaseHid, multiprocessing.Process): # pylint: disable=too-many-inst
self.__keyboard = Keyboard()
self.__mouse = Mouse()
self.gettext=Lanuages().gettext
self.gettext=Languages().gettext
@classmethod
def get_plugin_options(cls) -> dict:

View File

@@ -25,7 +25,7 @@ import contextlib
from typing import Generator
from ....lanuages import Lanuages
from ....languages import Languages
# =====
@@ -37,7 +37,7 @@ class ChipResponseError(Exception):
class ChipConnection:
def __init__(self, tty: serial.Serial) -> None:
self.__tty = tty
self.gettext=Lanuages().gettext
self.gettext=Languages().gettext
def xfer(self, cmd: bytes) -> int:
self.__send(cmd)

View File

@@ -24,7 +24,7 @@ from typing import Iterable
from typing import AsyncGenerator
from typing import Any
from ....lanuages import Lanuages
from ....languages import Languages
from ....logging import get_logger
@@ -120,7 +120,7 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
def sysprep(self) -> None:
udc = usb.find_udc(self.__udc)
get_logger(0).info(Lanuages().gettext("Using UDC %s"), udc)
get_logger(0).info(Languages().gettext("Using UDC %s"), udc)
self.__keyboard_proc.start(udc)
self.__mouse_proc.start(udc)
if self.__mouse_alt_proc:

View File

@@ -37,7 +37,7 @@ from .... import aiomulti
from .... import aioproc
from .... import usb
from ....lanuages import Lanuages
from ....languages import Languages
from .events import BaseEvent
@@ -78,7 +78,7 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
self.__logger: (logging.Logger | None) = None
self.gettext=Lanuages().gettext
self.gettext=Languages().gettext
def start(self, udc: str) -> None: # type: ignore # pylint: disable=arguments-differ
self.__udc_state_path = usb.get_udc_path(udc, usb.U_STATE)

View File

@@ -41,7 +41,7 @@ from .events import get_led_scroll
from .events import get_led_num
from .events import make_keyboard_report
from ....lanuages import Lanuages
from ....languages import Languages
# =====
class KeyboardProcess(BaseDeviceProcess):
@@ -55,7 +55,7 @@ class KeyboardProcess(BaseDeviceProcess):
self.__pressed_modifiers: set[UsbKey] = set()
self.__pressed_keys: list[UsbKey | None] = [None] * 6
self.gettext=Lanuages().gettext
self.gettext=Languages().gettext
def cleanup(self) -> None:
self._stop()

View File

@@ -36,7 +36,7 @@ from .events import MouseRelativeEvent
from .events import MouseWheelEvent
from .events import make_mouse_report
from ....lanuages import Lanuages
from ....languages import Languages
# =====
class MouseProcess(BaseDeviceProcess):
@@ -55,7 +55,7 @@ class MouseProcess(BaseDeviceProcess):
self.__x = 0 # For absolute
self.__y = 0
self.__win98_fix = False
self.gettext=Lanuages().gettext
self.gettext=Languages().gettext
def is_absolute(self) -> bool:
return self.__absolute

View File

@@ -41,7 +41,7 @@ from ...validators.basic import valid_int_f1
from ...validators.basic import valid_float_f01
from ...validators.hw import valid_gpio_pin_optional
from ...lanuages import Lanuages
from ...languages import Lanuages
from ._mcu import BasePhyConnection
from ._mcu import BasePhy

View File

@@ -40,7 +40,7 @@ from ... import aiotools
from .. import BasePlugin
from .. import get_plugin_class
from ...lanuages import Lanuages
from ...languages import Languages
# =====
class MsdError(Exception):
@@ -53,43 +53,43 @@ class MsdOperationError(OperationError, MsdError):
class MsdIsBusyError(IsBusyError, MsdError):
def __init__(self) -> None:
gettext=Lanuages().gettext
gettext=Languages().gettext
super().__init__(gettext("Performing another MSD operation, please try again later"))
class MsdOfflineError(MsdOperationError):
def __init__(self) -> None:
gettext=Lanuages().gettext
gettext=Languages().gettext
super().__init__(gettext("MSD is not found"))
class MsdConnectedError(MsdOperationError):
def __init__(self) -> None:
gettext=Lanuages().gettext
gettext=Languages().gettext
super().__init__(gettext("MSD is connected to Server, but shouldn't for this operation"))
class MsdDisconnectedError(MsdOperationError):
def __init__(self) -> None:
gettext=Lanuages().gettext
gettext=Languages().gettext
super().__init__(gettext("MSD is disconnected from Server, but should be for this operation"))
class MsdImageNotSelected(MsdOperationError):
def __init__(self) -> None:
gettext=Lanuages().gettext
gettext=Languages().gettext
super().__init__(gettext("The image is not selected"))
class MsdUnknownImageError(MsdOperationError):
def __init__(self) -> None:
gettext=Lanuages().gettext
gettext=Languages().gettext
super().__init__(gettext("The image is not found in the storage"))
class MsdImageExistsError(MsdOperationError):
def __init__(self) -> None:
gettext=Lanuages().gettext
gettext=Languages().gettext
super().__init__(gettext("This image is already exists"))

View File

@@ -31,7 +31,7 @@ from . import BaseMsdReader
from . import BaseMsdWriter
from . import BaseMsd
from ...lanuages import Lanuages
from ...languages import Lanuages
# =====
class MsdDisabledError(MsdOperationError):

View File

@@ -28,7 +28,7 @@ import time
from typing import AsyncGenerator
from ....lanuages import Lanuages
from ....languages import Languages
from ....logging import get_logger
from ....inotify import InotifyMask
@@ -44,7 +44,7 @@ from ....validators.kvm import valid_msd_image_name
from .... import aiotools
from .... import fstab
from ....lanuages import Lanuages
from ....languages import Languages
from .. import MsdIsBusyError
from .. import MsdOfflineError
@@ -142,7 +142,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
self.__notifier = aiotools.AioNotifier()
self.__state = _State(self.__notifier)
self.gettext=Lanuages().gettext
self.gettext=Languages().gettext
logger = get_logger(0)
logger.info(self.gettext("Using OTG gadget %r as MSD"), gadget)

View File

@@ -27,13 +27,13 @@ from .... import usb
from .. import MsdOperationError
from ....lanuages import Lanuages
from ....languages import Languages
# =====
class MsdDriveLockedError(MsdOperationError):
def __init__(self) -> None:
super().__init__(Lanuages().gettext("MSD drive is locked on IO operation"))
super().__init__(Languages().gettext("MSD drive is locked on IO operation"))
# =====

View File

@@ -31,7 +31,7 @@ from typing import Optional
import aiofiles
import aiofiles.os
from ....lanuages import Lanuages
from ....languages import Languages
from .... import aiotools
from .... import aiohelpers
@@ -294,4 +294,4 @@ class Storage(_StorageDc):
async def remount_rw(self, rw: bool, fatal: bool=True) -> None:
if not (await aiohelpers.remount("MSD", self.__remount_cmd, rw)):
if fatal:
raise MsdError(Lanuages().gettext("Can't execute remount helper"))
raise MsdError(Languages().gettext("Can't execute remount helper"))

View File

@@ -41,7 +41,7 @@ from ...validators.basic import valid_bool
from ...validators.basic import valid_number
from ...validators.basic import valid_float_f01
from ...lanuages import Lanuages
from ...languages import Languages
from . import BaseUserGpioDriver
from . import GpioDriverOfflineError
@@ -149,7 +149,7 @@ class Plugin(BaseUserGpioDriver): # pylint: disable=too-many-instance-attribute
htclient.raise_not_200(response)
except Exception as err:
get_logger().error(Lanuages().gettext("Failed ANELPWR POST request to pin %s: %s"), pin, tools.efmt(err))
get_logger().error(Languages().gettext("Failed ANELPWR POST request to pin %s: %s"), pin, tools.efmt(err))
raise GpioDriverOfflineError(self)
self.__update_notifier.notify()