flatcam/appTranslation.py
Marius Stanciu e2df2c3b62 - fixed bug: on first ever usage of FlatCAM beta the last loaded language (alphabetically) is used instead of English (in current state is Russian)
- 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
2020-06-07 22:32:36 +03:00

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)