PySimpleGUI 및 Babel을 사용하여 번역이 포함된 Python 앱 만들기

저는 최근에 GUI가 있는 Python3 앱을 만들고 텍스트를 여러 언어로 번역해야 할 필요성을 느꼈습니다. 나는 Babel과 PySimpleGui가 내가 선택한 도구라는 것을 빨리 알았지만 두 가지를 통합하는 방법을 찾는 데 시간이 좀 걸렸습니다. 제가 한 방법은 다음과 같습니다.

전체 Repo로 바로 이동하려는 경우 그렇게 할 수 있습니다TranslatedPySimpleGUI.


요구 사항



추가 사용자 조치 없이 메뉴에서 언어를 동적으로 변경할 수 있는 애플리케이션을 원합니다.




PySimpleGui를 사용하는 Python 앱



여기서 중요한 점은 언어가 변경되면 기존 창을 새 창으로 교체하는 것입니다. 이로써 텍스트도 새 언어로 업데이트됩니다.

def main_window(my_window=None):
    menu_def = [_('&About'), [_('Close::close')]], [_('&Language'), ['&de', 'en']],
    layout_mainwindow = [
        [
            [sg.Menu(menu_def, pad=(10, 10))],
            [sg.Text(_('Select direction: '), key='txt_direction')], [sg.Combo([_('Left'), _('Right')], key='cmb_direction', size=20)],
            [sg.Button(_('Close'), key='btn_close')],
        ]
    ]

    new_window = sg.Window("Demo TranslatedPySimpleGui", layout_mainwindow, finalize=True)

    if my_window is not None:
        my_window.close()
    return new_window


번역은 내장 함수와 함께 사용됩니다gettext.

## Setup translations
    localedir = 'locale'
    translate = gettext.translation('messages', localedir=localedir, languages=['de'])
    _ = translate.gettext


번역을 동적으로 변경하려면 필요할 때마다 _ 함수를 업데이트한 다음 창을 다시 만들어야 합니다.

        elif event == 'de':
            translate = gettext.translation('messages', localedir=localedir, languages=['de'])
            _ = translate.gettext
            print(_("Language changed to DE"))
            window = main_window(window)

        elif event == 'en':
            translate = gettext.translation('messages', localedir=localedir, languages=['en'])
            _ = translate.gettext
            print(_("Language changed to EN"))
            window = main_window(window)



번역



Babel을 사용하면 번역하려는 모든 텍스트를 편안하게 추출하고 번역할 수 있는 특정 언어 파일로 처리할 수 있습니다. 그런 다음 이러한 파일은 애플리케이션에서 사용되는 바이너리로 컴파일됩니다.

먼저 번역할 텍스트를 추출해야 합니다.

pybabel extract . -o locale/base.pot


필요한 두 번째 단계로 로케일이 아직 존재하지 않는 경우 원하는 로케일을 작성하십시오. 내 경우에는 'de' 및 'en':

pybabel init -l de -i locale/base.pot -d locale


세 번째로 1단계에서 생성된 텍스트로 로케일을 업데이트해야 합니다.

pybabel update -i locale/base.pot -d locale/


네 번째로 번역된 텍스트를 로케일(여기서는 de 및 en)의 messages.po 파일에 수동으로 추가해야 합니다.

다섯째, po 파일을 애플리케이션에서 사용되는 mo 바이너리로 컴파일해야 합니다.

pybabel compile -d locale



demo app에서는 이를 bat 파일에서 자동화했습니다.

@ECHO OFF

ECHO Creating and Updating Translations
ECHO Initiating directory locale if necessary
if not exist locale\ (
    mkdir locale\
)

ECHO Initiating base translation file
venv\Scripts\pybabel extract . -o locale/base.pot

if not exist locale\de\ (
  echo Init Language DE
  venv\Scripts\pybabel init -l de -i locale/base.pot -d locale
)
if not exist locale\en\ (
  echo Init Language EN
  venv\Scripts\pybabel init -l en -i locale/base.pot -d locale
)

ECHO Create and compile translations
venv\Scripts\pybabel update -i locale/base.pot -d locale/
:: Between these 2 steps you have to add the translations manually to e.g. locale/de/messages.po
venv\Scripts\pybabel compile -d locale




레포



방금 설명한 전체 코드는 다음 저장소에서 찾을 수 있습니다. TranslatedPySimpleGUI

좋은 웹페이지 즐겨찾기