mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-01-29 00:51:53 +08:00
进一步的 kvmd 国际化(汉化)支持,添加配置入口
yaml 配置示例:
```
languages:
console: zh
web: zh
```
This commit is contained in:
@@ -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"))
|
||||
|
||||
|
||||
# =====
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"))
|
||||
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ from . import BaseMsdReader
|
||||
from . import BaseMsdWriter
|
||||
from . import BaseMsd
|
||||
|
||||
from ...lanuages import Lanuages
|
||||
from ...languages import Lanuages
|
||||
|
||||
# =====
|
||||
class MsdDisabledError(MsdOperationError):
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"))
|
||||
|
||||
|
||||
# =====
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user