Crowdin has depreciated their old api and will shut it down completely
in december 2021.
What's new:
* rewritten in Python 3 (drops support for discontinued Python 2)
* uses Crowdin's api v2
* runs on vanilla Python 3, (no external modules)
* automatically adds new translation from the src directory
* supports api token to be specified in an environment variable
(Makes GitHub integration easier in the future)
* requires project id to be explicitly set with an environment variable
(Makes testing safer)
The api token can be set either in ~/.crowdin-freecad-token similar to
how the old api key was set, or by specifying it in an environment
variable. The later has been added to make it easier with GitHub-Crowdin
integration in the future.
The requirement to explicitly set CROWDIN_PROJECT_ID has been introduced
to avoid accidentally using the main Crowdin project while testing the
script.
The script has been tested on Python versions 3.7, 3.8 and 3.9.
Co-authored-by: Mattias Pierre <github@mattiaspierre.com>
Static analysis showed some unused variables and imports, and running
the code in Python 3.9 revealed a few invalid escapes (previous versions
of Python silently "fixed" these, so the code change here will not
affect the results).
If the import of TempoVis fails, TaskAttachmentEditor creates s dummy
function to replace the real TempoVis function. That function's
signature did not match the real TempoVis. Caught by LGTM.
LGTM has identified a number of minor issues with the FCGear Part Design
scripts. This commit addresses each of them, and also corrects two minor
spelling errors in the dialog. None of the errors or their fixes are
expected to result in changes to the functionality of the script.
+ add function to cleanup units and quantities in debug build
+ fix reference leak in PropertyVector::getPyPathValue()
+ fix reference leak in PropertyPlacement::getPyPathValue()
+ in InterpreterSingleton::init() use a static std::vector<wchar_t*> instead of a C array
to free memory at program end
+ in MainWindow::closeEvent() explicitly delete all task watchers
+ in ReportOutputObserver constructor pass parent to QObject
+ in PropertyEditor destructor explicitly delete QItemEditorFactory
* handle all exceptions in Application::onLastWindowClosed because this method can be (indirectly) called from ~BaseView and would otherwise trigger std::terminate()
* handle exceptions in PropertyEditor::closeTransaction() because when recomputing a document while closing it leaves the editor in a bad state