e2df2c3b62
- made sure the the GUI settings are cleared on each new install - added a new signal that is triggered by change in visibility for the Shell Dock and will change the status of the shell label in the status bar. In this way the label will really be changed each time the shell is toggled
226 lines
7.4 KiB
Python
226 lines
7.4 KiB
Python
# ##########################################################
|
|
# FlatCAM: 2D Post-processing for Manufacturing #
|
|
# File Author: Marius Adrian Stanciu (c) #
|
|
# Date: 3/10/2019 #
|
|
# MIT Licence #
|
|
# ##########################################################
|
|
|
|
import os
|
|
import sys
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
from PyQt5 import QtWidgets, QtGui
|
|
from PyQt5.QtCore import QSettings
|
|
|
|
import gettext
|
|
|
|
log = logging.getLogger('base')
|
|
|
|
# import builtins
|
|
#
|
|
# if '_' not in builtins.__dict__:
|
|
# _ = gettext.gettext
|
|
|
|
# ISO639-1 codes from here: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
|
|
languages_dict = {
|
|
'zh': 'Chinese',
|
|
'de': 'German',
|
|
'en': 'English',
|
|
'es': 'Spanish',
|
|
'fr': 'French',
|
|
'hu': 'Hungarian',
|
|
'it': 'Italian',
|
|
'ro': 'Romanian',
|
|
'ru': 'Russian',
|
|
'pt_BR': 'Brazilian Portuguese',
|
|
}
|
|
|
|
translations = {}
|
|
|
|
languages_path_search = ''
|
|
|
|
|
|
def load_languages():
|
|
available_translations = []
|
|
languages_path_search = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'locale')
|
|
|
|
try:
|
|
available_translations = next(os.walk(languages_path_search))[1]
|
|
except StopIteration:
|
|
if not available_translations:
|
|
languages_path_search = os.path.join(str(Path(__file__).parents[1]), 'locale')
|
|
try:
|
|
available_translations = next(os.walk(languages_path_search))[1]
|
|
except StopIteration:
|
|
pass
|
|
|
|
for lang in available_translations:
|
|
try:
|
|
if lang in languages_dict.keys():
|
|
translations[lang] = languages_dict[lang]
|
|
except KeyError as e:
|
|
log.debug("FlatCAMTranslations.load_languages() --> %s" % str(e))
|
|
return translations
|
|
|
|
|
|
def languages_dir():
|
|
return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'locale')
|
|
|
|
|
|
def languages_dir_cx_freeze():
|
|
return os.path.join(Path(__file__).parents[1], 'locale')
|
|
|
|
|
|
def on_language_apply_click(app, restart=False):
|
|
"""
|
|
Using instructions from here:
|
|
https://inventwithpython.com/blog/2014/12/20/translate-your-python-3-program-with-the-gettext-module/
|
|
|
|
:return:
|
|
"""
|
|
name = app.ui.general_defaults_form.general_app_group.language_cb.currentText()
|
|
|
|
theme_settings = QSettings("Open Source", "FlatCAM")
|
|
if theme_settings.contains("theme"):
|
|
theme = theme_settings.value('theme', type=str)
|
|
else:
|
|
theme = 'white'
|
|
|
|
if theme == 'white':
|
|
resource_loc = 'assets/resources'
|
|
else:
|
|
resource_loc = 'assets/resources'
|
|
|
|
# do nothing if trying to apply the language that is the current language (already applied).
|
|
settings = QSettings("Open Source", "FlatCAM")
|
|
if settings.contains("language"):
|
|
current_language = settings.value('language', type=str)
|
|
if current_language == name:
|
|
return
|
|
|
|
if restart:
|
|
msgbox = QtWidgets.QMessageBox()
|
|
msgbox.setText(_("The application will restart."))
|
|
msgbox.setInformativeText('%s %s?' %
|
|
(_("Are you sure do you want to change the current language to"), name.capitalize()))
|
|
msgbox.setWindowTitle(_("Apply Language ..."))
|
|
msgbox.setWindowIcon(QtGui.QIcon(resource_loc + '/language32.png'))
|
|
msgbox.setIcon(QtWidgets.QMessageBox.Question)
|
|
|
|
bt_yes = msgbox.addButton(_("Yes"), QtWidgets.QMessageBox.YesRole)
|
|
bt_no = msgbox.addButton(_("No"), QtWidgets.QMessageBox.NoRole)
|
|
|
|
msgbox.setDefaultButton(bt_yes)
|
|
msgbox.exec_()
|
|
response = msgbox.clickedButton()
|
|
|
|
if response == bt_no:
|
|
return
|
|
else:
|
|
settings = QSettings("Open Source", "FlatCAM")
|
|
saved_language = name
|
|
settings.setValue('language', saved_language)
|
|
# This will write the setting to the platform specific storage.
|
|
del settings
|
|
|
|
restart_program(app=app)
|
|
|
|
|
|
def apply_language(domain, lang=None):
|
|
lang_code = ''
|
|
|
|
if lang is None:
|
|
settings = QSettings("Open Source", "FlatCAM")
|
|
if settings.contains("language"):
|
|
name = settings.value('language')
|
|
else:
|
|
name = 'English'
|
|
# in case the 'language' parameter is not in QSettings add it to QSettings and it's value is
|
|
# the default language, English
|
|
settings.setValue('language', 'English')
|
|
|
|
# This will write the setting to the platform specific storage.
|
|
del settings
|
|
else:
|
|
name = str(lang)
|
|
|
|
for lang_code, lang_usable in load_languages().items():
|
|
if lang_usable == name:
|
|
# break and then use the current key as language
|
|
break
|
|
|
|
if lang_code == '':
|
|
return "no language"
|
|
else:
|
|
try:
|
|
current_lang = gettext.translation(str(domain), localedir=languages_dir(), languages=[lang_code])
|
|
current_lang.install()
|
|
except Exception as e:
|
|
log.debug("FlatCAMTranslation.apply_language() --> %s. Perhaps is Cx_freeze-ed?" % str(e))
|
|
try:
|
|
current_lang = gettext.translation(str(domain),
|
|
localedir=languages_dir_cx_freeze(),
|
|
languages=[lang_code])
|
|
current_lang.install()
|
|
except Exception as e:
|
|
log.debug("FlatCAMTranslation.apply_language() --> %s" % str(e))
|
|
|
|
return name
|
|
|
|
|
|
def restart_program(app, ask=None):
|
|
"""Restarts the current program.
|
|
Note: this function does not return. Any cleanup action (like
|
|
saving data) must be done before calling this function.
|
|
"""
|
|
log.debug("FlatCAMTranslation.restart_program()")
|
|
|
|
theme_settings = QSettings("Open Source", "FlatCAM")
|
|
if theme_settings.contains("theme"):
|
|
theme = theme_settings.value('theme', type=str)
|
|
else:
|
|
theme = 'white'
|
|
|
|
if theme == 'white':
|
|
resource_loc = 'assets/resources'
|
|
else:
|
|
resource_loc = 'assets/resources'
|
|
|
|
# try to quit the Socket opened by ArgsThread class
|
|
try:
|
|
app.new_launch.stop.emit()
|
|
# app.new_launch.thread_exit = True
|
|
# app.new_launch.listener.close()
|
|
except Exception as err:
|
|
log.debug("FlatCAMTranslation.restart_program() --> %s" % str(err))
|
|
|
|
# try to quit the QThread that run ArgsThread class
|
|
try:
|
|
app.listen_th.quit()
|
|
except Exception as err:
|
|
log.debug("FlatCAMTranslation.restart_program() --> %s" % str(err))
|
|
|
|
if app.should_we_save and app.collection.get_list() or ask is True:
|
|
msgbox = QtWidgets.QMessageBox()
|
|
msgbox.setText(_("There are files/objects modified in FlatCAM. "
|
|
"\n"
|
|
"Do you want to Save the project?"))
|
|
msgbox.setWindowTitle(_("Save changes"))
|
|
msgbox.setWindowIcon(QtGui.QIcon(resource_loc + '/save_as.png'))
|
|
msgbox.setIcon(QtWidgets.QMessageBox.Question)
|
|
|
|
bt_yes = msgbox.addButton(_('Yes'), QtWidgets.QMessageBox.YesRole)
|
|
bt_no = msgbox.addButton(_('No'), QtWidgets.QMessageBox.NoRole)
|
|
|
|
msgbox.setDefaultButton(bt_yes)
|
|
msgbox.exec_()
|
|
response = msgbox.clickedButton()
|
|
|
|
if response == bt_yes:
|
|
app.on_file_saveprojectas(use_thread=True, quit_action=True)
|
|
|
|
app.preferencesUiManager.save_defaults()
|
|
python = sys.executable
|
|
os.execl(python, python, *sys.argv)
|