FlatCAMTranslation.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import os
  2. import sys
  3. from PyQt5 import QtWidgets, QtGui
  4. from PyQt5.QtCore import QSettings
  5. import FlatCAMApp
  6. from GUIElements import log
  7. import gettext
  8. # ISO639-1 codes from here: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
  9. languages_dict = {
  10. 'zh': 'Chinese',
  11. 'de': 'German',
  12. 'en': 'English',
  13. 'es': 'Spanish',
  14. 'fr': 'French',
  15. 'it': 'Italian',
  16. 'ro': 'Romanian',
  17. 'ru': 'Russian',
  18. }
  19. translations = {}
  20. languages_path_search = ''
  21. def load_languages():
  22. languages_path_search = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'locale')
  23. available_translations = next(os.walk(languages_path_search))[1]
  24. for lang in available_translations:
  25. try:
  26. if lang in languages_dict.keys():
  27. translations[lang] = languages_dict[lang]
  28. except KeyError as e:
  29. log.debug("FlatCAMTranslations.load_languages() --> %s" % str(e))
  30. return translations
  31. def languages_dir():
  32. return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'locale')
  33. def on_language_apply_click(app, restart=False):
  34. """
  35. Using instructions from here:
  36. https://inventwithpython.com/blog/2014/12/20/translate-your-python-3-program-with-the-gettext-module/
  37. :return:
  38. """
  39. name = app.ui.general_defaults_form.general_app_group.language_cb.currentText()
  40. if restart:
  41. msgbox = QtWidgets.QMessageBox()
  42. msgbox.setInformativeText("Are you sure do you want to change the current language to %s?\n\n"
  43. "The application will restart." % name.capitalize())
  44. msgbox.setWindowTitle("Apply Language ...")
  45. msgbox.setWindowIcon(QtGui.QIcon('share/save_as.png'))
  46. msgbox.setStandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.Cancel)
  47. msgbox.setDefaultButton(QtWidgets.QMessageBox.Yes)
  48. response = msgbox.exec_()
  49. if response == QtWidgets.QMessageBox.Cancel:
  50. return
  51. else:
  52. settings = QSettings("Open Source", "FlatCAM")
  53. saved_language = name
  54. settings.setValue('language', saved_language)
  55. # This will write the setting to the platform specific storage.
  56. del settings
  57. restart_program(app=app)
  58. def apply_language(filename, lang=None):
  59. lang_code = ''
  60. if lang is None:
  61. settings = QSettings("Open Source", "FlatCAM")
  62. if settings.contains("language"):
  63. name = settings.value('language')
  64. else:
  65. name = settings.value('English')
  66. else:
  67. name = str(lang)
  68. for lang_code, lang_usable in load_languages().items():
  69. if lang_usable == name:
  70. # break and then use the current key as language
  71. break
  72. if lang_code == '':
  73. return "no language"
  74. else:
  75. try:
  76. current_lang = gettext.translation(str(filename), localedir=languages_dir(), languages=[lang_code])
  77. current_lang.install()
  78. except Exception as e:
  79. log.debug("FlatCAMTranslation.apply_language() --> %s" % str(e))
  80. return name
  81. def restart_program(app):
  82. """Restarts the current program.
  83. Note: this function does not return. Any cleanup action (like
  84. saving data) must be done before calling this function.
  85. """
  86. app.save_defaults()
  87. python = sys.executable
  88. os.execl(python, python, *sys.argv)