| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- # ##########################################################
- # FlatCAM: 2D Post-processing for Manufacturing #
- # http://flatcam.org #
- # File Author: Marius Adrian Stanciu (c) #
- # Date: 3/10/2019 #
- # MIT Licence #
- # ##########################################################
- import os
- import sys
- from pathlib import Path
- from PyQt5 import QtWidgets, QtGui
- from PyQt5.QtCore import QSettings
- from flatcamGUI.GUIElements import log
- import gettext
- # 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',
- '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(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()
- # 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(_("Are you sure do you want to change the current language to %s?") %
- name.capitalize())
- msgbox.setWindowTitle(_("Apply Language ..."))
- msgbox.setWindowIcon(QtGui.QIcon('share/language32.png'))
- 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 = settings.value('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):
- """Restarts the current program.
- Note: this function does not return. Any cleanup action (like
- saving data) must be done before calling this function.
- """
- if app.should_we_save and app.collection.get_list():
- 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('share/save_as.png'))
- 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(thread=True, quit=True)
- app.save_defaults()
- python = sys.executable
- os.execl(python, python, *sys.argv)
|