FlatCAMTranslation.py 5.4 KB

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