diff --git a/src/Mod/TechDraw/App/DrawPage.cpp b/src/Mod/TechDraw/App/DrawPage.cpp index 368149e62e..e3a0de09cd 100644 --- a/src/Mod/TechDraw/App/DrawPage.cpp +++ b/src/Mod/TechDraw/App/DrawPage.cpp @@ -41,6 +41,7 @@ #include "DrawViewDimension.h" #include "DrawViewPart.h" #include "Preferences.h" +#include "DrawUtil.h" using namespace TechDraw; @@ -468,6 +469,13 @@ bool DrawPage::AllowPageOverride(void) return Preferences::getPreferenceGroup("General")->GetBool("AllowPageOverride", true); } +//! get a translated label string from the context (ex TaskActiveView), the base name (ex ActiveView) and +//! the unique name within the document (ex ActiveView001), and use it to update the Label property. +void DrawPage::translateLabel(std::string context, std::string baseName, std::string uniqueName) +{ + Label.setValue(DrawUtil::translateArbitrary(context, baseName, uniqueName)); +} + // Python Drawing feature --------------------------------------------------------- diff --git a/src/Mod/TechDraw/App/DrawPage.h b/src/Mod/TechDraw/App/DrawPage.h index 3c2952c050..a637190930 100644 --- a/src/Mod/TechDraw/App/DrawPage.h +++ b/src/Mod/TechDraw/App/DrawPage.h @@ -106,6 +106,9 @@ public: bool hasObject(App::DocumentObject* obj); + void translateLabel(std::string context, std::string baseName, std::string uniqueName); + + protected: void onBeforeChange(const App::Property* prop) override; void onChanged(const App::Property* prop) override; diff --git a/src/Mod/TechDraw/App/DrawPagePy.xml b/src/Mod/TechDraw/App/DrawPagePy.xml index 6b7abf2b2e..b0eda4c9d2 100644 --- a/src/Mod/TechDraw/App/DrawPagePy.xml +++ b/src/Mod/TechDraw/App/DrawPagePy.xml @@ -28,6 +28,13 @@ getAllViews() - returns a list of all the views on page including Views inside Collections + + + translateLabel(translationContext, objectBaseName, objectUniqueName). + No return value. Replace the current label with a translated version where possible. + + + Returns the width of this page diff --git a/src/Mod/TechDraw/App/DrawPagePyImp.cpp b/src/Mod/TechDraw/App/DrawPagePyImp.cpp index 8d147bf1a6..aec6cdc6aa 100644 --- a/src/Mod/TechDraw/App/DrawPagePyImp.cpp +++ b/src/Mod/TechDraw/App/DrawPagePyImp.cpp @@ -121,6 +121,49 @@ PyObject* DrawPagePy::requestPaint(PyObject* args) Py_Return; } +//! replace the current Label with a translated version +PyObject* DrawPagePy::translateLabel(PyObject *args) +{ + PyObject* pyContext; + PyObject* pyBaseName; + PyObject* pyUniqueName; + std::string context; + std::string baseName; + std::string uniqueName; + + if (!PyArg_ParseTuple(args, "OOO", &pyContext, &pyBaseName, &pyUniqueName)) { + throw Py::TypeError("Could not translate label - bad parameters."); + } + + Py_ssize_t size = 0; + const char* cContext = PyUnicode_AsUTF8AndSize(pyContext, &size); + if (cContext) { + context = std::string(cContext, size); + } else { + throw Py::TypeError("Could not translate label - context not available."); + } + + const char* cBaseName = PyUnicode_AsUTF8AndSize(pyBaseName, &size); + if (cBaseName) { + baseName = std::string(cBaseName, size); + } else { + throw Py::TypeError("Could not translate label - base name not available."); + } + + const char* cUniqueName = PyUnicode_AsUTF8AndSize(pyUniqueName, &size); + if (cUniqueName) { + uniqueName = std::string(cUniqueName, size); + } else { + throw Py::TypeError("Could not translate label - unique name not available."); + } + + // we have the 3 parameters we need for DrawPage::translateLabel + DrawPage* page = getDrawPagePtr(); + page->translateLabel(context, baseName, uniqueName); + + Py_Return; +} + Py::Float DrawPagePy::getPageWidth() const { return Py::Float(getDrawPagePtr()->getPageWidth()); diff --git a/src/Mod/TechDraw/App/DrawSVGTemplate.cpp b/src/Mod/TechDraw/App/DrawSVGTemplate.cpp index f6ff7edfb7..3773b3632f 100644 --- a/src/Mod/TechDraw/App/DrawSVGTemplate.cpp +++ b/src/Mod/TechDraw/App/DrawSVGTemplate.cpp @@ -43,7 +43,6 @@ #include "DrawUtil.h" #include "XMLQuery.h" - using namespace TechDraw; PROPERTY_SOURCE(TechDraw::DrawSVGTemplate, TechDraw::DrawTemplate) @@ -250,6 +249,12 @@ std::map DrawSVGTemplate::getEditableTextsFromTemplate return editables; } +//! get a translated label string from the context (ex TaskActiveView), the base name (ex ActiveView) and +//! the unique name within the document (ex ActiveView001), and use it to update the Label property. +void DrawSVGTemplate::translateLabel(std::string context, std::string baseName, std::string uniqueName) +{ + Label.setValue(DrawUtil::translateArbitrary(context, baseName, uniqueName)); +} // Python Template feature --------------------------------------------------------- namespace App { diff --git a/src/Mod/TechDraw/App/DrawSVGTemplate.h b/src/Mod/TechDraw/App/DrawSVGTemplate.h index c010bb80ee..030ebc33f1 100644 --- a/src/Mod/TechDraw/App/DrawSVGTemplate.h +++ b/src/Mod/TechDraw/App/DrawSVGTemplate.h @@ -57,6 +57,9 @@ public: QString processTemplate(); + void translateLabel(std::string context, std::string baseName, std::string uniqueName); + + protected: void replaceFileIncluded(std::string newTemplateFileName); std::map getEditableTextsFromTemplate(); diff --git a/src/Mod/TechDraw/App/DrawSVGTemplatePy.xml b/src/Mod/TechDraw/App/DrawSVGTemplatePy.xml index befd68c3f7..99f28d9f9e 100644 --- a/src/Mod/TechDraw/App/DrawSVGTemplatePy.xml +++ b/src/Mod/TechDraw/App/DrawSVGTemplatePy.xml @@ -23,5 +23,12 @@ setEditFieldContent(EditFieldName, NewContent) - sets a specific Editable Text Field to a new value + + + translateLabel(translationContext, objectBaseName, objectUniqueName). + No return value. Replace the current label with a translated version where possible. + + + diff --git a/src/Mod/TechDraw/App/DrawSVGTemplatePyImp.cpp b/src/Mod/TechDraw/App/DrawSVGTemplatePyImp.cpp index cc6608097c..4a0a0f0cd6 100644 --- a/src/Mod/TechDraw/App/DrawSVGTemplatePyImp.cpp +++ b/src/Mod/TechDraw/App/DrawSVGTemplatePyImp.cpp @@ -36,6 +36,49 @@ std::string DrawSVGTemplatePy::representation() const return std::string(""); } +//! replace the current Label with a translated version +PyObject* DrawSVGTemplatePy::translateLabel(PyObject *args) +{ + PyObject* pyContext; + PyObject* pyBaseName; + PyObject* pyUniqueName; + std::string context; + std::string baseName; + std::string uniqueName; + + if (!PyArg_ParseTuple(args, "OOO", &pyContext, &pyBaseName, &pyUniqueName)) { + throw Py::TypeError("Could not translate label - bad parameters."); + } + + Py_ssize_t size = 0; + const char* cContext = PyUnicode_AsUTF8AndSize(pyContext, &size); + if (cContext) { + context = std::string(cContext, size); + } else { + throw Py::TypeError("Could not translate label - context not available."); + } + + const char* cBaseName = PyUnicode_AsUTF8AndSize(pyBaseName, &size); + if (cBaseName) { + baseName = std::string(cBaseName, size); + } else { + throw Py::TypeError("Could not translate label - base name not available."); + } + + const char* cUniqueName = PyUnicode_AsUTF8AndSize(pyUniqueName, &size); + if (cUniqueName) { + uniqueName = std::string(cUniqueName, size); + } else { + throw Py::TypeError("Could not translate label - unique name not available."); + } + + // we have the 3 parameters we need for DrawSVGTemplate::translateLabel + auto svgTemplate = getDrawSVGTemplatePtr(); + svgTemplate->translateLabel(context, baseName, uniqueName); + + Py_Return; +} + PyObject *DrawSVGTemplatePy::getCustomAttributes(const char* ) const { return nullptr; diff --git a/src/Mod/TechDraw/App/DrawUtil.cpp b/src/Mod/TechDraw/App/DrawUtil.cpp index 9f6c8251f5..578fcf7f29 100644 --- a/src/Mod/TechDraw/App/DrawUtil.cpp +++ b/src/Mod/TechDraw/App/DrawUtil.cpp @@ -61,6 +61,7 @@ #include #include #include +#include #include #include @@ -1594,6 +1595,18 @@ void DrawUtil::copyFile(std::string inSpec, std::string outSpec) } } +//! static method that provides a translated std::string for objects that are not derived from DrawView +std::string DrawUtil::translateArbitrary(std::string context, std::string baseName, std::string uniqueName) +{ + std::string suffix(""); + if (uniqueName.length() > baseName.length()) { + suffix = uniqueName.substr(baseName.length(), uniqueName.length() - baseName.length()); + } + QString qTranslated = qApp->translate(context.c_str(), baseName.c_str()); + std::string ssTranslated = Base::Tools::toStdString(qTranslated); + return ssTranslated + suffix; +} + //============================ // various debugging routines. diff --git a/src/Mod/TechDraw/App/DrawUtil.h b/src/Mod/TechDraw/App/DrawUtil.h index b2a53be651..3d588984cc 100644 --- a/src/Mod/TechDraw/App/DrawUtil.h +++ b/src/Mod/TechDraw/App/DrawUtil.h @@ -252,6 +252,9 @@ public: std::vector& intersections); static void copyFile(std::string inSpec, std::string outSpec); + static std::string translateArbitrary(std::string context, std::string baseName, std::string uniqueName); + + //debugging routines static void dumpVertexes(const char* text, const TopoDS_Shape& s); static void dumpEdge(const char* label, int i, TopoDS_Edge e); diff --git a/src/Mod/TechDraw/App/DrawView.cpp b/src/Mod/TechDraw/App/DrawView.cpp index 4913c5fbc7..99a0e2eecb 100644 --- a/src/Mod/TechDraw/App/DrawView.cpp +++ b/src/Mod/TechDraw/App/DrawView.cpp @@ -45,12 +45,15 @@ using namespace TechDraw; +using DU = DrawUtil; //=========================================================================== // DrawView //=========================================================================== #if 0 // needed for Qt's lupdate utility + QT_TRANSLATE_NOOP("DrawPage", "Page"); + QT_TRANSLATE_NOOP("DrawSVGTemplate", "Template"); QT_TRANSLATE_NOOP("DrawView", "View"); QT_TRANSLATE_NOOP("DrawViewPart", "View"); QT_TRANSLATE_NOOP("DrawViewSection", "Section"); @@ -622,22 +625,10 @@ void DrawView::translateLabel(std::string context, std::string baseName, std::st // Base::Console().Message("DV::translateLabel - context: %s baseName: %s uniqueName: %s\n", // context.c_str(), baseName.c_str(), uniqueName.c_str()); - Label.setValue(translateArbitrary(context, baseName, uniqueName)); + Label.setValue(DU::translateArbitrary(context, baseName, uniqueName)); // Base::Console().Message("DV::translateLabel - new label: %s\n", Label.getValue()); } -//! static method that provides a translated std::string for objects that are not derived from DrawView -std::string DrawView::translateArbitrary(std::string context, std::string baseName, std::string uniqueName) -{ - std::string suffix(""); - if (uniqueName.length() > baseName.length()) { - suffix = uniqueName.substr(baseName.length(), uniqueName.length() - baseName.length()); - } - QString qTranslated = qApp->translate(context.c_str(), baseName.c_str()); - std::string ssTranslated = Base::Tools::toStdString(qTranslated); - return ssTranslated + suffix; -} - PyObject *DrawView::getPyObject(void) { if (PythonObject.is(Py::_None())) { diff --git a/src/Mod/TechDraw/App/DrawView.h b/src/Mod/TechDraw/App/DrawView.h index bf1873f0a2..4082c1fcb3 100644 --- a/src/Mod/TechDraw/App/DrawView.h +++ b/src/Mod/TechDraw/App/DrawView.h @@ -114,9 +114,6 @@ public: bool overrideKeepUpdated(void) { return m_overrideKeepUpdated; } void translateLabel(std::string context, std::string baseName, std::string uniqueName); - static std::string translateArbitrary(std::string context, std::string baseName, std::string uniqueName); - - protected: void onChanged(const App::Property* prop) override; diff --git a/src/Mod/TechDraw/App/DrawWeldSymbol.cpp b/src/Mod/TechDraw/App/DrawWeldSymbol.cpp index d456b988bf..f172875ca0 100644 --- a/src/Mod/TechDraw/App/DrawWeldSymbol.cpp +++ b/src/Mod/TechDraw/App/DrawWeldSymbol.cpp @@ -30,8 +30,7 @@ #include "DrawWeldSymbolPy.h" // generated from DrawWeldSymbolPy.xml #include "DrawLeaderLine.h" #include "DrawTileWeld.h" -#include "DrawView.h" // for translateArbitrary - +#include "DrawUtil.h" using namespace TechDraw; @@ -80,7 +79,7 @@ void DrawWeldSymbol::onSettingDocument() auto tile1Obj( doc->addObject( "TechDraw::DrawTileWeld", tileName1.c_str() ) ); DrawTileWeld* tile1 = dynamic_cast(tile1Obj); if (tile1) { - tile1->Label.setValue(DrawView::translateArbitrary("DrawTileWeld", "TileWeld", tileName1)); + tile1->Label.setValue(DrawUtil::translateArbitrary("DrawTileWeld", "TileWeld", tileName1)); tile1->TileParent.setValue(this); } @@ -88,7 +87,7 @@ void DrawWeldSymbol::onSettingDocument() auto tile2Obj( doc->addObject( "TechDraw::DrawTileWeld", tileName2.c_str() ) ); DrawTileWeld* tile2 = dynamic_cast(tile2Obj); if (tile2) { - tile2->Label.setValue(DrawView::translateArbitrary("DrawTileWeld", "TileWeld", tileName2)); + tile2->Label.setValue(DrawUtil::translateArbitrary("DrawTileWeld", "TileWeld", tileName2)); tile2->TileParent.setValue(this); tile2->TileRow.setValue(-1); //other side is row -1 } diff --git a/src/Mod/TechDraw/Gui/Command.cpp b/src/Mod/TechDraw/Gui/Command.cpp index 40475d567a..68594b892a 100644 --- a/src/Mod/TechDraw/Gui/Command.cpp +++ b/src/Mod/TechDraw/Gui/Command.cpp @@ -116,8 +116,13 @@ void CmdTechDrawPageDefault::activated(int iMsg) openCommand(QT_TRANSLATE_NOOP("Command", "Drawing create page")); doCommand(Doc, "App.activeDocument().addObject('TechDraw::DrawPage', '%s')", PageName.c_str()); + doCommand(Doc, "App.activeDocument().%s.translateLabel('DrawPage', 'Page', '%s')", + PageName.c_str(), PageName.c_str()); + doCommand(Doc, "App.activeDocument().addObject('TechDraw::DrawSVGTemplate', '%s')", TemplateName.c_str()); + doCommand(Doc, "App.activeDocument().%s.translateLabel('DrawSVGTemplate', 'Template', '%s')", + TemplateName.c_str(), TemplateName.c_str()); doCommand(Doc, "App.activeDocument().%s.Template = '%s'", TemplateName.c_str(), templateFileName.toStdString().c_str()); @@ -187,10 +192,14 @@ void CmdTechDrawPageTemplate::activated(int iMsg) openCommand(QT_TRANSLATE_NOOP("Command", "Drawing create page")); doCommand(Doc, "App.activeDocument().addObject('TechDraw::DrawPage', '%s')", PageName.c_str()); + doCommand(Doc, "App.activeDocument().%s.translateLabel('DrawPage', 'Page', '%s')", + PageName.c_str(), PageName.c_str()); // Create the Template Object to attach to the page doCommand(Doc, "App.activeDocument().addObject('TechDraw::DrawSVGTemplate', '%s')", TemplateName.c_str()); + doCommand(Doc, "App.activeDocument().%s.translateLabel('DrawSVGTemplate', 'Template', '%s')", + TemplateName.c_str(), TemplateName.c_str()); //why is "Template" property set twice? -wf // once to set DrawSVGTemplate.Template to OS template file name