FlatCAMTranslation.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. # ########################################################## ##
  2. # FlatCAM: 2D Post-processing for Manufacturing #
  3. # http://flatcam.org #
  4. # File Author: Marius Adrian Stanciu (c) #
  5. # Date: 3/10/2019 #
  6. # MIT Licence #
  7. # ########################################################## ##
  8. import os
  9. import sys
  10. from pathlib import Path
  11. from PyQt5 import QtWidgets, QtGui
  12. from PyQt5.QtCore import QSettings
  13. from flatcamGUI.GUIElements import log
  14. import gettext
  15. # ISO639-1 codes from here: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
  16. languages_dict = {
  17. 'zh': 'Chinese',
  18. 'de': 'German',
  19. 'en': 'English',
  20. 'es': 'Spanish',
  21. 'fr': 'French',
  22. 'it': 'Italian',
  23. 'ro': 'Romanian',
  24. 'ru': 'Russian',
  25. 'pt_BR': 'Brazilian Portuguese',
  26. }
  27. translations = {}
  28. languages_path_search = ''
  29. def load_languages():
  30. available_translations = []
  31. languages_path_search = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'locale')
  32. try:
  33. available_translations = next(os.walk(languages_path_search))[1]
  34. except StopIteration:
  35. if not available_translations:
  36. languages_path_search = os.path.join(Path(__file__).parents[1], 'locale')
  37. try:
  38. available_translations = next(os.walk(languages_path_search))[1]
  39. except StopIteration:
  40. pass
  41. for lang in available_translations:
  42. try:
  43. if lang in languages_dict.keys():
  44. translations[lang] = languages_dict[lang]
  45. except KeyError as e:
  46. log.debug("FlatCAMTranslations.load_languages() --> %s" % str(e))
  47. return translations
  48. def languages_dir():
  49. return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'locale')
  50. def languages_dir_cx_freeze():
  51. return os.path.join(Path(__file__).parents[1], 'locale')
  52. def on_language_apply_click(app, restart=False):
  53. """
  54. Using instructions from here:
  55. https://inventwithpython.com/blog/2014/12/20/translate-your-python-3-program-with-the-gettext-module/
  56. :return:
  57. """
  58. name = app.ui.general_defaults_form.general_app_group.language_cb.currentText()
  59. # do nothing if trying to apply the language that is the current language (already applied).
  60. settings = QSettings("Open Source", "FlatCAM")
  61. if settings.contains("language"):
  62. current_language = settings.value('language', type=str)
  63. if current_language == name:
  64. return
  65. if restart:
  66. msgbox = QtWidgets.QMessageBox()
  67. msgbox.setText("The application will restart.")
  68. msgbox.setInformativeText("Are you sure do you want to change the current language to %s?" % name.capitalize())
  69. msgbox.setWindowTitle("Apply Language ...")
  70. msgbox.setWindowIcon(QtGui.QIcon('share/language32.png'))
  71. bt_yes = msgbox.addButton('Yes', QtWidgets.QMessageBox.YesRole)
  72. bt_no = msgbox.addButton('No', QtWidgets.QMessageBox.NoRole)
  73. msgbox.setDefaultButton(bt_yes)
  74. msgbox.exec_()
  75. response = msgbox.clickedButton()
  76. if response == bt_no:
  77. return
  78. else:
  79. settings = QSettings("Open Source", "FlatCAM")
  80. saved_language = name
  81. settings.setValue('language', saved_language)
  82. # This will write the setting to the platform specific storage.
  83. del settings
  84. restart_program(app=app)
  85. def apply_language(domain, lang=None):
  86. lang_code = ''
  87. if lang is None:
  88. settings = QSettings("Open Source", "FlatCAM")
  89. if settings.contains("language"):
  90. name = settings.value('language')
  91. else:
  92. name = settings.value('English')
  93. # in case the 'language' parameter is not in QSettings add it to QSettings and it's value is
  94. # the default language, English
  95. settings.setValue('language', 'English')
  96. # This will write the setting to the platform specific storage.
  97. del settings
  98. else:
  99. name = str(lang)
  100. for lang_code, lang_usable in load_languages().items():
  101. if lang_usable == name:
  102. # break and then use the current key as language
  103. break
  104. if lang_code == '':
  105. return "no language"
  106. else:
  107. try:
  108. current_lang = gettext.translation(str(domain), localedir=languages_dir(), languages=[lang_code])
  109. current_lang.install()
  110. except Exception as e:
  111. log.debug("FlatCAMTranslation.apply_language() --> %s. Perhaps is Cx_freeze-ed?" % str(e))
  112. try:
  113. current_lang = gettext.translation(str(domain),
  114. localedir=languages_dir_cx_freeze(),
  115. languages=[lang_code])
  116. current_lang.install()
  117. except Exception as e:
  118. log.debug("FlatCAMTranslation.apply_language() --> %s" % str(e))
  119. return name
  120. def restart_program(app):
  121. """Restarts the current program.
  122. Note: this function does not return. Any cleanup action (like
  123. saving data) must be done before calling this function.
  124. """
  125. app.save_defaults()
  126. python = sys.executable
  127. os.execl(python, python, *sys.argv)