Commit be72aa40 authored by dmMaze's avatar dmMaze
Browse files

support change display language (#192)

parent 923d3b07
Loading
Loading
Loading
Loading
+47 −20
Original line number Diff line number Diff line
@@ -100,11 +100,31 @@ def load_translators(translators = None):
def load_modules():
    load_translators()

BT = None
APP = None

def restart():
    global BT
    print('restarting...\n')
    BT.close()
    os.execv(sys.executable, ['python'] + sys.argv)


def main():
    from utils.logger import setup_logging, logger as LOGGER

    # parser = argparse.ArgumentParser()
    from utils import appinfo

    commit = commit_hash()

    print('py version: ', sys.version)
    print('py executable: ', sys.executable)
    print(f'version: {appinfo.version}')
    print(f'branch: {appinfo.branch}')
    print(f"Commit hash: {commit}")

    prepare_environment()

    from utils.logger import setup_logging, logger as LOGGER

    if not args.qt_api in QT_APIS:
        os.environ['QT_API'] = 'pyqt6'
@@ -127,6 +147,7 @@ def main():
    from qtpy.QtGui import  QGuiApplication, QIcon, QFont

    from ui import constants as C
    C.DEFAULT_DISPLAY_LANG = QLocale.system().name()
    if qtpy.API_NAME[-1] == '6':
        C.FLAG_QT6 = True
    else:
@@ -142,12 +163,24 @@ def main():
    load_modules()

    app = QApplication(sys.argv)
    from ui.misc import ProgramConfig

    try:
        config = ProgramConfig.load(C.CONFIG_PATH)
    except Exception as e:
        LOGGER.exception(e)
        LOGGER.warning("Failed to load config file, using default config")
        config = ProgramConfig()

    lang = config.display_lang
    langp = osp.join(C.TRANSLATE_DIR, lang + '.qm')
    if osp.exists(langp):
        translator = QTranslator()
    translator.load(
        QLocale.system().name(),
        osp.dirname(osp.abspath(__file__)) + "/translate",
    )
        translator.load(lang, osp.dirname(osp.abspath(__file__)) + "/translate")
        app.installTranslator(translator)
    elif lang != 'English':
        LOGGER.warning(f'target display language file {langp} doesnt exist.')
    LOGGER.info(f'set display language to {lang}')

    ps = QGuiApplication.primaryScreen()
    C.LDPI = ps.logicalDotsPerInch()
@@ -158,7 +191,12 @@ def main():
        QGuiApplication.setFont(yahei)

    from ui.mainwindow import MainWindow
    ballontrans = MainWindow(app, open_dir=args.proj_dir)

    ballontrans = MainWindow(app, config, open_dir=args.proj_dir)
    global BT
    BT = ballontrans
    BT.restart_signal.connect(restart)

    ballontrans.setWindowIcon(QIcon(C.ICON_PATH))
    ballontrans.show()
    ballontrans.resetStyleSheet()
@@ -191,15 +229,4 @@ def prepare_environment():

if __name__ == '__main__':

    from utils import appinfo

    commit = commit_hash()

    print('py version: ', sys.version)
    print('py executable: ', sys.executable)
    print(f'version: {appinfo.version}')
    print(f'branch: {appinfo.branch}')
    print(f"Commit hash: {commit}")

    prepare_environment()
    main()
 No newline at end of file
+5 −12
Original line number Diff line number Diff line
@@ -13,11 +13,9 @@ if C.FLAG_QT6:
else:
    from PyQt5 import QtCore


from utils.logger import logger as LOGGER
from .stylewidgets import Widget, ConfigComboBox
from .misc import ProgramConfig, ModuleConfig
from .constants import CONFIG_PATH, CONFIG_FONTSIZE_CONTENT, CONFIG_FONTSIZE_HEADER, CONFIG_FONTSIZE_TABLE, CONFIG_COMBOBOX_SHORT, CONFIG_COMBOBOX_LONG, CONFIG_COMBOBOX_MIDEAN
from .misc import ProgramConfig
from .constants import CONFIG_FONTSIZE_CONTENT, CONFIG_FONTSIZE_HEADER, CONFIG_FONTSIZE_TABLE, CONFIG_COMBOBOX_SHORT, CONFIG_COMBOBOX_LONG, CONFIG_COMBOBOX_MIDEAN
from .dlconfig_parse_widgets import InpaintConfigPanel, TextDetectConfigPanel, TranslatorConfigPanel, OCRConfigPanel

class ConfigTextLabel(QLabel):
@@ -273,15 +271,10 @@ class ConfigPanel(Widget):
    save_config = Signal()
    update_source_download_status = Signal(str)

    def __init__(self, *args, **kwargs) -> None:
    def __init__(self, config: ProgramConfig, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)

        try:
            self.config = ProgramConfig.load(CONFIG_PATH)
        except Exception as e:
            LOGGER.exception(e)
            LOGGER.warning("Failed to load config file, using default config")
            self.config = ProgramConfig()
        self.config = config
        
        self.configTable = ConfigTable()
        self.configTable.tableitem_pressed.connect(self.onTableItemPressed)
+18 −1
Original line number Diff line number Diff line
import os.path as osp
import os

ICON_PATH = 'icons/[ICONNAME]'

@@ -55,3 +56,19 @@ SLIDERHANDLE_COLOR = (85,85,96)
FOREGROUND_FONTCOLOR = (93,93,95)

MAX_NUM_LOG = 7

TRANSLATE_DIR = osp.join(PROGRAM_PATH, 'translate')
DISPLAY_LANGUAGE_MAP = {
    'English': 'English',
    '简体中文': 'zh_CN',
    'Русский': 'ru_RU'
}
VALID_LANG_SET = set(list(DISPLAY_LANGUAGE_MAP.values()))

for p in os.listdir(TRANSLATE_DIR):
    if p.endswith('.qm'):
        lang = p.replace('.qm', '')
        if lang not in VALID_LANG_SET:
            DISPLAY_LANGUAGE_MAP[lang] = lang

DEFAULT_DISPLAY_LANG = 'English'
 No newline at end of file
+29 −6
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@ import os, re, traceback
from typing import List

from qtpy.QtWidgets import QHBoxLayout, QVBoxLayout, QApplication, QStackedWidget, QSplitter, QListWidget, QShortcut, QListWidgetItem, QMessageBox, QTextEdit, QPlainTextEdit
from qtpy.QtCore import Qt, QPoint, QSize, QEvent
from qtpy.QtCore import Qt, QPoint, QSize, QEvent, Signal
from qtpy.QtGui import QTextCursor, QGuiApplication, QIcon, QCloseEvent, QKeySequence, QImage, QPainter

from utils.logger import logger as LOGGER
@@ -11,7 +11,7 @@ from utils.io_utils import json_dump_nested_obj
from utils.text_processing import is_cjk, full_len, half_len
from modules.textdetector.textblock import TextBlock

from .misc import pt2px, parse_stylesheet
from .misc import pt2px, parse_stylesheet, ProgramConfig
from .imgtrans_proj import ProjImgTrans
from .canvas import Canvas
from .configpanel import ConfigPanel
@@ -47,10 +47,15 @@ class MainWindow(FramelessWindow):
    page_changing = False
    postprocess_mt_toggle = True

    def __init__(self, app: QApplication, open_dir='', *args, **kwargs) -> None:
    translator = None

    restart_signal = Signal()
    
    def __init__(self, app: QApplication, config: ProgramConfig, open_dir='', *args, **kwargs) -> None:
        
        super().__init__(*args, **kwargs)

        self.config = config
        self.setWindowFlags(self.windowFlags() | Qt.WindowType.FramelessWindowHint)
        self.app = app
        self.setupThread()
@@ -92,7 +97,7 @@ class MainWindow(FramelessWindow):
    def setupUi(self):
        screen_size = QGuiApplication.primaryScreen().geometry().size()
        self.setMinimumWidth(screen_size.width() // 2)
        self.configPanel = ConfigPanel(self)
        self.configPanel = ConfigPanel(self.config, self)
        self.configPanel.trans_config_panel.show_MT_keyword_window.connect(self.show_MT_keyword_window)
        self.configPanel.ocr_config_panel.show_OCR_keyword_window.connect(self.show_OCR_keyword_window)
        self.config = self.configPanel.config
@@ -126,6 +131,7 @@ class MainWindow(FramelessWindow):
        
        self.titleBar = TitleBar(self)
        self.titleBar.closebtn_clicked.connect(self.on_closebtn_clicked)
        self.titleBar.display_lang_changed.connect(self.on_display_lang_changed)
        self.bottomBar = BottomBar(self)
        self.bottomBar.textedit_checkchanged.connect(self.setTextEditMode)
        self.bottomBar.paintmode_checkchanged.connect(self.setPaintMode)
@@ -262,7 +268,6 @@ class MainWindow(FramelessWindow):
        self.drawingPanel.set_config(config.drawpanel)
        self.drawingPanel.initDLModule(module_manager)


        self.global_search_widget.imgtrans_proj = self.imgtrans_proj
        self.global_search_widget.setupReplaceThread(self.st_manager.pairwidget_list, self.st_manager.textblk_item_list)
        self.global_search_widget.replace_thread.finished.connect(self.on_global_replace_finished)
@@ -315,6 +320,9 @@ class MainWindow(FramelessWindow):
    def setupConfigUI(self):
        self.centralStackWidget.setCurrentIndex(1)

    def set_display_lang(self, lang: str):
        self.retranslateUI()

    def OpenProj(self, proj_path: str):
        if osp.isdir(proj_path):
            self.openDir(proj_path)
@@ -392,13 +400,23 @@ class MainWindow(FramelessWindow):

    def changeEvent(self, event: QEvent):
        if event.type() == QEvent.Type.WindowStateChange:
            
            if self.windowState() & Qt.WindowState.WindowMaximized:
                self.titleBar.maxBtn.setChecked(True)
        elif event.type() == QEvent.Type.ActivationChange:
            self.canvas.on_activation_changed()

        super().changeEvent(event)
    
    def retranslateUI(self):
        # according to https://stackoverflow.com/questions/27635068/how-to-retranslate-dynamically-created-widgets
        # we got to do it manually ... I'd rather restart the program
        msg = QMessageBox()
        msg.setText(self.tr('Restart to apply changes? \n'))
        msg.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
        ret = msg.exec_()
        if ret == QMessageBox.StandardButton.Yes:
            self.restart_signal.emit()

    def save_config(self):
        self.config.imgtrans_paintmode = self.bottomBar.paintChecker.isChecked()
        self.config.imgtrans_textedit = self.bottomBar.texteditChecker.isChecked()
@@ -967,6 +985,11 @@ class MainWindow(FramelessWindow):
            return
        self.close()

    def on_display_lang_changed(self, lang: str):
        if lang != self.config.display_lang:
            self.config.display_lang = lang
            self.set_display_lang(lang)

    def on_run_imgtrans(self):
        if self.bottomBar.textblockChecker.isChecked():
            self.bottomBar.textblockChecker.click()
+31 −5
Original line number Diff line number Diff line
import os.path as osp
from typing import List, Union

from .stylewidgets import Widget, PaintQSlider
from .constants import TITLEBAR_HEIGHT, WINDOW_BORDER_WIDTH, BOTTOMBAR_HEIGHT, LEFTBAR_WIDTH, LEFTBTN_WIDTH

from qtpy.QtWidgets import QMainWindow, QHBoxLayout, QVBoxLayout, QFileDialog, QLabel, QSizePolicy, QToolBar, QMenu, QSpacerItem, QPushButton, QCheckBox, QToolButton
from qtpy.QtCore import Qt, Signal, QPoint
from qtpy.QtGui import QMouseEvent, QKeySequence
from qtpy.QtGui import QMouseEvent, QKeySequence, QActionGroup

from .stylewidgets import Widget, PaintQSlider
from .constants import TITLEBAR_HEIGHT, WINDOW_BORDER_WIDTH, BOTTOMBAR_HEIGHT, LEFTBAR_WIDTH, LEFTBTN_WIDTH
from .framelesswindow import startSystemMove
from .misc import ProgramConfig
from . import constants as C
if C.FLAG_QT6:
    from qtpy.QtGui import QAction
@@ -311,9 +311,15 @@ class LeftBar(Widget):


class TitleBar(Widget):

    closebtn_clicked = Signal()
    display_lang_changed = Signal(str)

    def __init__(self, parent, *args, **kwargs) -> None:
        super().__init__(parent, *args, **kwargs)

        config: ProgramConfig = parent.config

        self.mainwindow : QMainWindow = parent
        self.mPos: QPoint = None
        self.normalsize = False
@@ -353,6 +359,21 @@ class TitleBar(Widget):

        self.viewToolBtn = TitleBarToolBtn(self)
        self.viewToolBtn.setText(self.tr('View'))

        self.displayLanguageMenu = QMenu(self.tr("Display Language"), self)
        self.lang_ac_group = lang_ac_group = QActionGroup(self)
        lang_ac_group.setExclusive(True)
        lang_actions = []
        for lang, lang_code in C.DISPLAY_LANGUAGE_MAP.items():
            la = QAction(lang, self)
            if lang_code == config.display_lang:
                la.setChecked(True)
            la.triggered.connect(self.on_displaylang_triggered)
            la.setCheckable(True)
            lang_ac_group.addAction(la)
            lang_actions.append(la)
        self.displayLanguageMenu.addActions(lang_actions)

        drawBoardAction = QAction(self.tr('Drawing Board'), self)
        drawBoardAction.setShortcut(QKeySequence('P'))
        texteditAction = QAction(self.tr('Text Editor'), self)
@@ -362,6 +383,7 @@ class TitleBar(Widget):
        darkModeAction.setCheckable(True)

        viewMenu = QMenu(self.viewToolBtn)
        viewMenu.addMenu(self.displayLanguageMenu)
        viewMenu.addActions([drawBoardAction, texteditAction])
        viewMenu.addSeparator()
        viewMenu.addAction(fontStylePresetAction)
@@ -441,6 +463,10 @@ class TitleBar(Widget):
    def onMinBtnClicked(self):
        self.mainwindow.showMinimized()

    def on_displaylang_triggered(self):
        ac = self.lang_ac_group.checkedAction()
        self.display_lang_changed.emit(C.DISPLAY_LANGUAGE_MAP[ac.text()])

    def mousePressEvent(self, event: QMouseEvent) -> None:

        if C.FLAG_QT6:
Loading