mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-15 00:04:00 -04:00
tests, project store and other
not yet working all translations project handling can be improved project store after translation working and fix some errors tests not ready yet
This commit is contained in:
parent
778734fd94
commit
2bfe2296e5
@ -264,7 +264,7 @@ Write XML information
|
||||
Serialize on project save
|
||||
%End
|
||||
|
||||
QgsAttributeEditorElement *attributeEditorElementFromDomElement( QDomElement &elem, QgsAttributeEditorElement *parent );
|
||||
QgsAttributeEditorElement *attributeEditorElementFromDomElement( QDomElement &elem, QgsAttributeEditorElement *parent, const QString &layerId = 0 );
|
||||
%Docstring
|
||||
Deserialize drag and drop designer elements.
|
||||
%End
|
||||
|
@ -135,6 +135,14 @@ Returns last modified time of the project file as returned by the file system (o
|
||||
Returns full absolute path to the project file if the project is stored in a file system - derived from fileName().
|
||||
Returns empty string when the project is stored in a project storage (there is no concept of paths for custom project storages).
|
||||
|
||||
.. versionadded:: 3.2
|
||||
%End
|
||||
|
||||
QString absolutePath() const;
|
||||
%Docstring
|
||||
Returns full absolute path to the project folder if the project is stored in a file system - derived from fileName().
|
||||
Returns empty string when the project is stored in a project storage (there is no concept of paths for custom project storages).
|
||||
|
||||
.. versionadded:: 3.2
|
||||
%End
|
||||
|
||||
@ -983,6 +991,25 @@ and it is mainly a hint for the user interface to protect users from removing la
|
||||
in the project. The removeMapLayer(), removeMapLayers() calls do not block removal of layers listed here.
|
||||
|
||||
.. versionadded:: 3.2
|
||||
%End
|
||||
|
||||
void generateTsFile( const QString &locale );
|
||||
%Docstring
|
||||
Triggers the collection strings of .qgs to be included in ts file and calls writeTsFile()
|
||||
|
||||
.. versionadded:: 3.2
|
||||
%End
|
||||
|
||||
QString translate( const QString &context, const QString &sourceText, const char *disambiguation = 0, int n = -1 );
|
||||
%Docstring
|
||||
Translates the project with QTranslator and qm file
|
||||
|
||||
:return: the result string (in case there is no QTranslator loaded the sourceText)
|
||||
|
||||
:param context: describing layer etc.
|
||||
:param sourceText: is the identifier of this text
|
||||
:param disambiguation: it's the disambiguation
|
||||
:param n: if -1 uses the appropriate form
|
||||
%End
|
||||
|
||||
signals:
|
||||
@ -1335,6 +1362,16 @@ home path will be automatically determined from the project's file path.
|
||||
.. seealso:: :py:func:`homePathChanged`
|
||||
|
||||
.. versionadded:: 3.2
|
||||
%End
|
||||
|
||||
void registerTranslatableObjects( QgsTranslationContext *translationContext );
|
||||
%Docstring
|
||||
Registers the translatable objects into the tranlationContext
|
||||
so there can be created a ts file these values
|
||||
|
||||
.. versionadded:: 3.2
|
||||
|
||||
:param translationContext: where the objects will be registered
|
||||
%End
|
||||
|
||||
};
|
||||
|
79
python/core/auto_generated/qgstranslationcontext.sip.in
Normal file
79
python/core/auto_generated/qgstranslationcontext.sip.in
Normal file
@ -0,0 +1,79 @@
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/qgstranslationcontext.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
class QgsTranslationContext
|
||||
{
|
||||
%Docstring
|
||||
used for the collecting of strings of .qgs to be translated and writing of ts file
|
||||
|
||||
.. versionadded:: 3.2
|
||||
%End
|
||||
|
||||
%TypeHeaderCode
|
||||
#include "qgstranslationcontext.h"
|
||||
%End
|
||||
public:
|
||||
|
||||
QgsTranslationContext( );
|
||||
%Docstring
|
||||
Constructor
|
||||
%End
|
||||
|
||||
QgsProject *project() const;
|
||||
%Docstring
|
||||
Returns the project
|
||||
|
||||
.. seealso:: :py:func:`setProject`
|
||||
%End
|
||||
|
||||
void setProject( QgsProject *project );
|
||||
%Docstring
|
||||
Sets the ``project`` where the translation need to be done for
|
||||
|
||||
.. seealso:: :py:func:`project`
|
||||
%End
|
||||
|
||||
QString fileName() const;
|
||||
%Docstring
|
||||
Returns the TS fileName
|
||||
|
||||
.. seealso:: :py:func:`setFileName`
|
||||
%End
|
||||
|
||||
void setFileName( const QString &fileName );
|
||||
%Docstring
|
||||
Sets the ``name`` of the TS file
|
||||
|
||||
.. seealso:: :py:func:`fileName`
|
||||
%End
|
||||
|
||||
void registerTranslation( const QString &context, const QString &source );
|
||||
%Docstring
|
||||
Registers the ``string`` to be translated
|
||||
|
||||
:param translationString: name and path of the object need to be translated
|
||||
:param layerName: the name of the layer
|
||||
%End
|
||||
|
||||
void writeTsFile( );
|
||||
%Docstring
|
||||
Writes the Ts-file
|
||||
%End
|
||||
|
||||
};
|
||||
|
||||
/************************************************************************
|
||||
* This file has been generated automatically from *
|
||||
* *
|
||||
* src/core/qgstranslationcontext.h *
|
||||
* *
|
||||
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||
************************************************************************/
|
@ -352,6 +352,7 @@
|
||||
%Include auto_generated/qgssnappingconfig.sip
|
||||
%Include auto_generated/qgstaskmanager.sip
|
||||
%Include auto_generated/qgstolerance.sip
|
||||
%Include auto_generated/qgstranslationcontext.sip
|
||||
%Include auto_generated/qgstrackedvectorlayertools.sip
|
||||
%Include auto_generated/qgstransaction.sip
|
||||
%Include auto_generated/qgstransactiongroup.sip
|
||||
|
@ -5950,10 +5950,10 @@ void QgisApp::fileSaveAs()
|
||||
return;
|
||||
|
||||
QFileInfo fullPath( path );
|
||||
|
||||
settings.setValue( QStringLiteral( "UI/lastProjectDir" ), fullPath.path() );
|
||||
|
||||
if ( filter == zipExt )
|
||||
|
||||
{
|
||||
if ( fullPath.suffix().compare( QLatin1String( "qgz" ), Qt::CaseInsensitive ) != 0 )
|
||||
fullPath.setFile( fullPath.filePath() + ".qgz" );
|
||||
|
@ -830,6 +830,7 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *pa
|
||||
connect( mMetadataWidget, &QgsMetadataWidget::titleChanged, titleEdit, &QLineEdit::setText );
|
||||
connect( titleEdit, &QLineEdit::textChanged, mMetadataWidget, &QgsMetadataWidget::setTitle );
|
||||
|
||||
connect( generateTsFileButton, &QPushButton::clicked, this, &QgsProjectProperties::generateTsFileButton_clicked );
|
||||
projectionSelectorInitialized();
|
||||
populateRequiredLayers();
|
||||
restoreOptionsBaseUi();
|
||||
@ -2190,3 +2191,8 @@ void QgsProjectProperties::setCurrentPage( const QString &pageWidgetName )
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QgsProjectProperties::generateTsFileButton_clicked()
|
||||
{
|
||||
QgsProject::instance()->generateTsFile( "de" );
|
||||
}
|
||||
|
@ -92,6 +92,9 @@ class APP_EXPORT QgsProjectProperties : public QgsOptionsDialogBase, private Ui:
|
||||
//! A scale in the list of project scales changed
|
||||
void scaleItemChanged( QListWidgetItem *changedScaleItem );
|
||||
|
||||
//dave to document
|
||||
void generateTsFileButton_clicked();
|
||||
|
||||
/**
|
||||
* Set WMS default extent to current canvas extent
|
||||
*/
|
||||
|
@ -399,7 +399,7 @@ void QgsEditFormConfig::readXml( const QDomNode &node, QgsReadWriteContext &cont
|
||||
{
|
||||
QDomElement elem = attributeEditorFormNodeList.at( i ).toElement();
|
||||
|
||||
QgsAttributeEditorElement *attributeEditorWidget = attributeEditorElementFromDomElement( elem, nullptr );
|
||||
QgsAttributeEditorElement *attributeEditorWidget = attributeEditorElementFromDomElement( elem, nullptr, node.namedItem( QStringLiteral( "id" ) ).toElement().text() );
|
||||
addTab( attributeEditorWidget );
|
||||
}
|
||||
|
||||
@ -518,13 +518,13 @@ void QgsEditFormConfig::writeXml( QDomNode &node, const QgsReadWriteContext &con
|
||||
//// END TODO
|
||||
}
|
||||
|
||||
QgsAttributeEditorElement *QgsEditFormConfig::attributeEditorElementFromDomElement( QDomElement &elem, QgsAttributeEditorElement *parent )
|
||||
QgsAttributeEditorElement *QgsEditFormConfig::attributeEditorElementFromDomElement( QDomElement &elem, QgsAttributeEditorElement *parent, const QString &layerId )
|
||||
{
|
||||
QgsAttributeEditorElement *newElement = nullptr;
|
||||
|
||||
if ( elem.tagName() == QLatin1String( "attributeEditorContainer" ) )
|
||||
{
|
||||
QgsAttributeEditorContainer *container = new QgsAttributeEditorContainer( QgsProject::instance()->translate( QStringLiteral( "project:layers:%1:formcontainers" ).arg( "testdave" ), elem.attribute( QStringLiteral( "name" ) ) ), parent );
|
||||
QgsAttributeEditorContainer *container = new QgsAttributeEditorContainer( QgsProject::instance()->translate( QStringLiteral( "project:layers:%1:formcontainers" ).arg( layerId ), elem.attribute( QStringLiteral( "name" ) ) ), parent );
|
||||
bool ok;
|
||||
int cc = elem.attribute( QStringLiteral( "columnCount" ) ).toInt( &ok );
|
||||
if ( !ok )
|
||||
@ -551,7 +551,7 @@ QgsAttributeEditorElement *QgsEditFormConfig::attributeEditorElementFromDomEleme
|
||||
for ( int i = 0; i < childNodeList.size(); i++ )
|
||||
{
|
||||
QDomElement childElem = childNodeList.at( i ).toElement();
|
||||
QgsAttributeEditorElement *myElem = attributeEditorElementFromDomElement( childElem, container );
|
||||
QgsAttributeEditorElement *myElem = attributeEditorElementFromDomElement( childElem, container, layerId );
|
||||
if ( myElem )
|
||||
container->addChildElement( myElem );
|
||||
}
|
||||
|
@ -288,7 +288,7 @@ class CORE_EXPORT QgsEditFormConfig
|
||||
/**
|
||||
* Deserialize drag and drop designer elements.
|
||||
*/
|
||||
QgsAttributeEditorElement *attributeEditorElementFromDomElement( QDomElement &elem, QgsAttributeEditorElement *parent );
|
||||
QgsAttributeEditorElement *attributeEditorElementFromDomElement( QDomElement &elem, QgsAttributeEditorElement *parent, const QString &layerId = nullptr );
|
||||
|
||||
/**
|
||||
* Create a new edit form config. Normally invoked by QgsVectorLayer
|
||||
|
@ -314,7 +314,8 @@ bool QgsMapLayer::readLayerXml( const QDomElement &layerElement, QgsReadWriteCo
|
||||
// set name
|
||||
mnl = layerElement.namedItem( QStringLiteral( "layername" ) );
|
||||
mne = mnl.toElement();
|
||||
//trans dave
|
||||
|
||||
//name can be translated
|
||||
setName( QgsProject::instance()->translate( QStringLiteral( "project:layers:%1" ).arg( layerElement.namedItem( QStringLiteral( "id" ) ).toElement().text() ), mne.text() ) );
|
||||
|
||||
//short name
|
||||
|
@ -367,6 +367,9 @@ QgsProject::QgsProject( QObject *parent )
|
||||
connect( mLayerStore.get(), &QgsMapLayerStore::layersAdded, this, &QgsProject::layersAdded );
|
||||
connect( mLayerStore.get(), &QgsMapLayerStore::layerWasAdded, this, &QgsProject::layerWasAdded );
|
||||
connect( QgsApplication::instance(), &QgsApplication::requestForTranslatableObjects, this, &QgsProject::registerTranslatableObjects );
|
||||
|
||||
mTranslator = new QTranslator();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -928,6 +931,10 @@ bool QgsProject::read()
|
||||
QString filename = mFile.fileName();
|
||||
bool rc;
|
||||
|
||||
//dave dirty hack
|
||||
delete mTranslator;
|
||||
mTranslator = new QTranslator();
|
||||
|
||||
if ( QgsProjectStorage *storage = projectStorage() )
|
||||
{
|
||||
QTemporaryFile inDevice;
|
||||
@ -961,22 +968,15 @@ bool QgsProject::read()
|
||||
rc = readProjectFile( mFile.fileName() );
|
||||
}
|
||||
|
||||
mFile.setFileName( filename );
|
||||
return rc;
|
||||
}
|
||||
|
||||
//dave put to another place
|
||||
QString QgsProject::translate( const QString &context, const QString &sourceText, const char *disambiguation, int n )
|
||||
{
|
||||
if ( mTranslator.isEmpty() )
|
||||
//on translation we should not change the filename back
|
||||
if ( mTranslator->isEmpty() )
|
||||
{
|
||||
return sourceText;
|
||||
mFile.setFileName( filename );
|
||||
}
|
||||
|
||||
return mTranslator.translate( context.toUtf8(), sourceText.toUtf8(), disambiguation, n );
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
bool QgsProject::readProjectFile( const QString &filename )
|
||||
{
|
||||
QFile projectFile( filename );
|
||||
@ -984,9 +984,14 @@ bool QgsProject::readProjectFile( const QString &filename )
|
||||
|
||||
QgsSettings settings;
|
||||
|
||||
if ( mTranslator.load( QStringLiteral( "%1_%2" ).arg( QFileInfo( projectFile.fileName() ).baseName(), settings.value( QStringLiteral( "locale/userLocale" ), "" ).toString() ), QFileInfo( projectFile.fileName() ).absolutePath() ) )
|
||||
QString localeFileName = QStringLiteral( "%1_%2" ).arg( QFileInfo( projectFile.fileName() ).baseName(), settings.value( QStringLiteral( "locale/userLocale" ), "" ).toString() );
|
||||
|
||||
if ( QFile( QStringLiteral( "%1/%2.qm" ).arg( QFileInfo( projectFile.fileName() ).absolutePath(), localeFileName ) ).exists() )
|
||||
{
|
||||
QgsDebugMsg( "Translation loaded" );
|
||||
if ( mTranslator->load( localeFileName, QFileInfo( projectFile.fileName() ).absolutePath() ) )
|
||||
{
|
||||
QgsDebugMsg( "Translation loaded" );
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<QDomDocument> doc( new QDomDocument( QStringLiteral( "qgis" ) ) );
|
||||
@ -1285,6 +1290,23 @@ bool QgsProject::readProjectFile( const QString &filename )
|
||||
|
||||
emit nonIdentifiableLayersChanged( nonIdentifiableLayers() );
|
||||
|
||||
if ( !mTranslator->isEmpty() )
|
||||
{
|
||||
//project possibly translated -> rename it with locale postfix
|
||||
QString newFileName( QStringLiteral( "%1/%2.qgs" ).arg( QFileInfo( projectFile.fileName() ).absolutePath(), localeFileName ) );
|
||||
QgsProject::instance()->setFileName( newFileName );
|
||||
|
||||
if ( QgsProject::instance()->write() )
|
||||
{
|
||||
QgsProject::instance()->setTitle( localeFileName );
|
||||
|
||||
QgsDebugMsg( "Translated project saved with locale prefix " + newFileName );
|
||||
}
|
||||
else
|
||||
{
|
||||
QgsDebugMsg( "Error saving translated project with locale prefix " + newFileName );
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -2765,13 +2787,23 @@ void QgsProject::setRequiredLayers( const QSet<QgsMapLayer *> &layers )
|
||||
writeEntry( QStringLiteral( "RequiredLayers" ), QStringLiteral( "Layers" ), layerIds );
|
||||
}
|
||||
|
||||
void QgsProject::generateTsFile()
|
||||
void QgsProject::generateTsFile( const QString &locale )
|
||||
{
|
||||
QgsTranslationContext translationContext;
|
||||
translationContext.setProject( this );
|
||||
translationContext.setFileName( QStringLiteral( "%1/%2.ts" ).arg( absolutePath(), baseName() ) );
|
||||
translationContext.setFileName( QStringLiteral( "%1/%2_%3.ts" ).arg( absolutePath(), baseName(), locale ) );
|
||||
|
||||
emit QgsApplication::instance()->collectTranslatableObjects( &translationContext );
|
||||
|
||||
translationContext.writeTsFile();
|
||||
}
|
||||
|
||||
QString QgsProject::translate( const QString &context, const QString &sourceText, const char *disambiguation, int n )
|
||||
{
|
||||
if ( mTranslator->isEmpty() )
|
||||
{
|
||||
return sourceText;
|
||||
}
|
||||
|
||||
return mTranslator->translate( context.toUtf8(), sourceText.toUtf8(), disambiguation, n );
|
||||
}
|
||||
|
@ -965,27 +965,23 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
|
||||
*/
|
||||
void setRequiredLayers( const QSet<QgsMapLayer *> &layers );
|
||||
|
||||
/**
|
||||
* dave : to write
|
||||
* \since QGIS 3.2
|
||||
*/
|
||||
//QTranslator &translator() { return mTranslator; }
|
||||
|
||||
/**
|
||||
* Triggers the collection strings of .qgs to be included in ts file and calls writeTsFile()
|
||||
* \since QGIS 3.2
|
||||
*/
|
||||
void generateTsFile( );
|
||||
void generateTsFile( const QString &locale );
|
||||
|
||||
/**
|
||||
* Translates the project with QTranslator and qm-file
|
||||
* Translates the project with QTranslator and qm file
|
||||
* \returns the result string (in case there is no QTranslator loaded the sourceText)
|
||||
*
|
||||
* \param context describing layer etc.
|
||||
* \param sourceText is the identifier of this text
|
||||
* \param disambiguation it's the disambiguation
|
||||
* \param n if -1 uses the appropriate form
|
||||
*/
|
||||
QString translate( const QString &context, const QString &sourceText, const char *disambiguation = nullptr, int n = -1 );
|
||||
|
||||
//dave a function not used because of compiling
|
||||
bool translate( const QString &context ) const {return context.isEmpty(); }
|
||||
|
||||
signals:
|
||||
|
||||
/**
|
||||
@ -1302,7 +1298,7 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
|
||||
|
||||
/**
|
||||
* Registers the translatable objects into the tranlationContext
|
||||
* so there can be created a TS file with etc. dave: write
|
||||
* so there can be created a ts file these values
|
||||
* \since QGIS 3.2
|
||||
*
|
||||
* \param translationContext where the objects will be registered
|
||||
@ -1432,7 +1428,7 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
|
||||
|
||||
QgsProjectMetadata mMetadata;
|
||||
|
||||
QTranslator mTranslator;
|
||||
QTranslator *mTranslator = nullptr;
|
||||
|
||||
friend class QgsProjectDirtyBlocker;
|
||||
|
||||
|
@ -45,7 +45,10 @@ void QgsTranslationContext::setFileName( const QString &fileName )
|
||||
|
||||
void QgsTranslationContext::registerTranslation( const QString &context, const QString &source )
|
||||
{
|
||||
mTranslatableObjects.append( qMakePair( context, source ) );
|
||||
TranslatableObject translatableObject;
|
||||
translatableObject.context = context;
|
||||
translatableObject.source = source;
|
||||
mTranslatableObjects.append( translatableObject );
|
||||
}
|
||||
|
||||
void QgsTranslationContext::writeTsFile()
|
||||
@ -56,13 +59,13 @@ void QgsTranslationContext::writeTsFile()
|
||||
QDomElement tsElement = doc.createElement( QStringLiteral( "TS" ) );
|
||||
doc.appendChild( tsElement );
|
||||
|
||||
for ( QPair < QString, QString > translatableObject : mTranslatableObjects )
|
||||
for ( TranslatableObject translatableObject : mTranslatableObjects )
|
||||
{
|
||||
QDomElement contextElement = doc.createElement( QStringLiteral( "context" ) );
|
||||
tsElement.appendChild( contextElement );
|
||||
|
||||
QDomElement nameElement = doc.createElement( QStringLiteral( "name" ) );
|
||||
QDomText nameText = doc.createTextNode( translatableObject.first );
|
||||
QDomText nameText = doc.createTextNode( translatableObject.context );
|
||||
nameElement.appendChild( nameText );
|
||||
contextElement.appendChild( nameElement );
|
||||
|
||||
@ -70,12 +73,12 @@ void QgsTranslationContext::writeTsFile()
|
||||
contextElement.appendChild( messageElement );
|
||||
|
||||
QDomElement sourceElement = doc.createElement( QStringLiteral( "source" ) );
|
||||
QDomText sourceText = doc.createTextNode( translatableObject.second );
|
||||
QDomText sourceText = doc.createTextNode( translatableObject.source );
|
||||
sourceElement.appendChild( sourceText );
|
||||
messageElement.appendChild( sourceElement );
|
||||
|
||||
QDomElement translationElement = doc.createElement( QStringLiteral( "translation" ) );
|
||||
QDomText translationText = doc.createTextNode( translatableObject.second );
|
||||
QDomText translationText = doc.createTextNode( translatableObject.source );
|
||||
translationElement.appendChild( translationText );
|
||||
messageElement.appendChild( translationElement );
|
||||
}
|
||||
|
@ -32,6 +32,12 @@ class QgsProject;
|
||||
|
||||
class CORE_EXPORT QgsTranslationContext
|
||||
{
|
||||
struct TranslatableObject
|
||||
{
|
||||
QString context;
|
||||
QString source;
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
@ -82,7 +88,7 @@ class CORE_EXPORT QgsTranslationContext
|
||||
|
||||
QgsProject *mProject = nullptr;
|
||||
QString mFileName;
|
||||
QList < QPair< QString, QString > > mTranslatableObjects;
|
||||
QList < TranslatableObject > mTranslatableObjects;
|
||||
|
||||
};
|
||||
|
||||
|
@ -1935,7 +1935,6 @@ bool QgsVectorLayer::readSymbology( const QDomNode &layerNode, QString &errorMes
|
||||
{
|
||||
QDomElement defaultElem = defaultNodeList.at( i ).toElement();
|
||||
|
||||
//dave muss hier übersetzt werden?
|
||||
QString field = defaultElem.attribute( QStringLiteral( "field" ), QString() );
|
||||
QString expression = defaultElem.attribute( QStringLiteral( "expression" ), QString() );
|
||||
bool applyOnUpdate = defaultElem.attribute( QStringLiteral( "applyOnUpdate" ), QStringLiteral( "0" ) ) == QLatin1String( "1" );
|
||||
@ -1957,7 +1956,6 @@ bool QgsVectorLayer::readSymbology( const QDomNode &layerNode, QString &errorMes
|
||||
{
|
||||
QDomElement constraintElem = constraintNodeList.at( i ).toElement();
|
||||
|
||||
//dave muss hier übersetzt werden?
|
||||
QString field = constraintElem.attribute( QStringLiteral( "field" ), QString() );
|
||||
int constraints = constraintElem.attribute( QStringLiteral( "constraints" ), QStringLiteral( "0" ) ).toInt();
|
||||
if ( field.isEmpty() || constraints == 0 )
|
||||
@ -1983,7 +1981,6 @@ bool QgsVectorLayer::readSymbology( const QDomNode &layerNode, QString &errorMes
|
||||
{
|
||||
QDomElement constraintElem = constraintNodeList.at( i ).toElement();
|
||||
|
||||
//dave muss hier übersetzt werden?
|
||||
QString field = constraintElem.attribute( QStringLiteral( "field" ), QString() );
|
||||
QString exp = constraintElem.attribute( QStringLiteral( "exp" ), QString() );
|
||||
QString desc = constraintElem.attribute( QStringLiteral( "desc" ), QString() );
|
||||
|
@ -277,8 +277,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>685</width>
|
||||
<height>778</height>
|
||||
<width>671</width>
|
||||
<height>783</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_8">
|
||||
@ -800,6 +800,13 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="generateTsFileButton">
|
||||
<property name="text">
|
||||
<string>Generate TS File</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_5">
|
||||
<property name="orientation">
|
||||
@ -1602,7 +1609,7 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>624</width>
|
||||
<width>671</width>
|
||||
<height>2451</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -21,6 +21,9 @@
|
||||
#include "qgsapplication.h"
|
||||
#include "qgstranslationcontext.h"
|
||||
#include "qgsproject.h"
|
||||
#include "qgssettings.h"
|
||||
#include <qgsmaplayer.h>
|
||||
#include <qgsvectorlayer.h>
|
||||
|
||||
class TestQgsTranslateProject : public QObject
|
||||
{
|
||||
@ -29,47 +32,121 @@ class TestQgsTranslateProject : public QObject
|
||||
public:
|
||||
|
||||
private slots:
|
||||
void initTestCase();
|
||||
void generateTsFile();
|
||||
void registerTranslatableObjects( QgsTranslationContext *translationContext );
|
||||
void cleanupTestCase();
|
||||
void initTestCase();// will be called before the first testfunction is executed.
|
||||
void cleanupTestCase();// will be called after the last testfunction was executed.
|
||||
void init(); // will be called before each testfunction is executed.
|
||||
void cleanup(); // will be called after every testfunction.
|
||||
|
||||
void createTsFile();
|
||||
void translateProject();
|
||||
|
||||
private:
|
||||
QgsSettings settings;
|
||||
QString original_locale;
|
||||
|
||||
};
|
||||
|
||||
void TestQgsTranslateProject::initTestCase()
|
||||
{
|
||||
//start application in english
|
||||
QgsApplication::init();
|
||||
QgsApplication::initQgis();
|
||||
|
||||
connect( QgsApplication::instance(), &QgsApplication::requestForTranslatableObjects, this, &TestQgsTranslateProject::registerTranslatableObjects );
|
||||
}
|
||||
|
||||
void TestQgsTranslateProject::generateTsFile()
|
||||
{
|
||||
QgsProject *prj = new QgsProject;
|
||||
prj->setFileName( "/home/qgis/a-project-file.qgs" ); // not expected to exist
|
||||
|
||||
prj->generateTsFile();
|
||||
|
||||
QFile tsFile( "/home/qgis/a-project-file.ts." );
|
||||
|
||||
//test whether the file has been created
|
||||
QVERIFY( tsFile.exists() );
|
||||
|
||||
//test wheter there is the entry for our honeybee
|
||||
|
||||
// QgsProject::instance()->generateTsFile();
|
||||
|
||||
// all cases start with all items checked
|
||||
}
|
||||
|
||||
void TestQgsTranslateProject::registerTranslatableObjects( QgsTranslationContext *translationContext )
|
||||
{
|
||||
translationContext->registerTranslation( QStringLiteral( "testqgstranslateproject:test01" ), "honeybee" );
|
||||
original_locale = settings.value( QStringLiteral( "locale/userLocale" ), "" ).toString() ;
|
||||
settings.setValue( QStringLiteral( "locale/userLocale" ), "de" );
|
||||
}
|
||||
|
||||
void TestQgsTranslateProject::cleanupTestCase()
|
||||
{
|
||||
//delete ts file
|
||||
settings.setValue( QStringLiteral( "locale/userLocale" ), original_locale );
|
||||
QgsApplication::exitQgis();
|
||||
|
||||
//delete translated project file
|
||||
QString translatedProjectFileName( TEST_DATA_DIR );
|
||||
translatedProjectFileName = translatedProjectFileName + "/project_translation/points_translation_de.qgs";
|
||||
QFile translatedProjectFile( translatedProjectFileName );
|
||||
translatedProjectFile.remove();
|
||||
|
||||
//delete created ts file
|
||||
QString tsFileName( TEST_DATA_DIR );
|
||||
tsFileName = tsFileName + "/project_translation/points_translation_de.ts";
|
||||
QFile tsFile( tsFileName );
|
||||
tsFile.remove();
|
||||
}
|
||||
|
||||
void TestQgsTranslateProject::init()
|
||||
{
|
||||
//open project
|
||||
QString projectFileName( TEST_DATA_DIR );
|
||||
projectFileName = projectFileName + "/project_translation/points_translation.qgs";
|
||||
QgsProject::instance()->read( projectFileName );
|
||||
}
|
||||
|
||||
void TestQgsTranslateProject::cleanup()
|
||||
{
|
||||
//not needed
|
||||
}
|
||||
|
||||
|
||||
void TestQgsTranslateProject::createTsFile()
|
||||
{
|
||||
//the project should be translated and renamed
|
||||
//so base is points_translation_de.qgs and german values
|
||||
//then we generate a ts file for spanish
|
||||
|
||||
//create ts-file
|
||||
QgsProject::instance()->generateTsFile( "es" );
|
||||
|
||||
//check if tsfile is created
|
||||
QString tsFileName( TEST_DATA_DIR );
|
||||
tsFileName = tsFileName + "/project_translation/points_translation_de_es.ts";
|
||||
QFile tsFile( tsFileName );
|
||||
QVERIFY( tsFile.exists() );
|
||||
|
||||
tsFile.open( QIODevice::ReadWrite );
|
||||
|
||||
QString tsFileContent( tsFile.readAll() );
|
||||
|
||||
//check if tsFile contains layer name Punkte
|
||||
QVERIFY( tsFileContent.contains( "<source>Punkte</source>" ) );
|
||||
|
||||
//check if tsFile contains layer group name
|
||||
|
||||
//check if tsFile contains alias value
|
||||
|
||||
//check if tsFile contains field name
|
||||
// QVERIFY( tsFileContent.contains( "<source>klaso</source>" ) );
|
||||
|
||||
//check if tsFile contains relation name
|
||||
|
||||
tsFile.close();
|
||||
}
|
||||
|
||||
void TestQgsTranslateProject::translateProject()
|
||||
{
|
||||
//it should translate the project to german
|
||||
QgsVectorLayer *points_layer = qobject_cast<QgsVectorLayer *>( QgsProject::instance()->mapLayer( "points_240d6bd6_9203_470a_994a_aae13cd9fa04" ) );
|
||||
QgsVectorLayer *lines_layer = qobject_cast<QgsVectorLayer *>( QgsProject::instance()->mapLayer( "lines_a677672a_bf5d_410d_98c9_d326a5719a1b" ) );
|
||||
|
||||
//check if layer names translated
|
||||
QCOMPARE( points_layer->name(), QStringLiteral( "Punkte" ) );
|
||||
QCOMPARE( lines_layer->name(), QStringLiteral( "Linien" ) );
|
||||
|
||||
//check if group name translated
|
||||
|
||||
//check if second group name translated
|
||||
|
||||
//check if first alias value translated
|
||||
|
||||
//check if second alias value translated
|
||||
|
||||
//check if first field name translated to the alias
|
||||
|
||||
//check if second field name translated to the alias
|
||||
|
||||
//check if first relation name translated
|
||||
|
||||
//check if second relation name translated
|
||||
}
|
||||
|
||||
QGSTEST_MAIN( TestQgsTranslateProject )
|
||||
|
797
tests/testdata/project_translation/points_translation.qgs
vendored
Normal file
797
tests/testdata/project_translation/points_translation.qgs
vendored
Normal file
@ -0,0 +1,797 @@
|
||||
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
|
||||
<qgis projectname="" version="3.1.0-Master">
|
||||
<homePath path=""/>
|
||||
<title></title>
|
||||
<autotransaction active="0"/>
|
||||
<evaluateDefaultValues active="0"/>
|
||||
<trust active="0"/>
|
||||
<projectCrs>
|
||||
<spatialrefsys>
|
||||
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
|
||||
<srsid>3452</srsid>
|
||||
<srid>4326</srid>
|
||||
<authid>EPSG:4326</authid>
|
||||
<description>WGS 84</description>
|
||||
<projectionacronym>longlat</projectionacronym>
|
||||
<ellipsoidacronym>WGS84</ellipsoidacronym>
|
||||
<geographicflag>true</geographicflag>
|
||||
</spatialrefsys>
|
||||
</projectCrs>
|
||||
<layer-tree-group>
|
||||
<customproperties/>
|
||||
<layer-tree-layer name="lines" source="../lines.shp" expanded="1" checked="Qt::Checked" id="lines_a677672a_bf5d_410d_98c9_d326a5719a1b" providerKey="ogr">
|
||||
<customproperties/>
|
||||
</layer-tree-layer>
|
||||
<layer-tree-layer name="points" source="../points.shp" expanded="1" checked="Qt::Checked" id="points_240d6bd6_9203_470a_994a_aae13cd9fa04" providerKey="ogr">
|
||||
<customproperties/>
|
||||
</layer-tree-layer>
|
||||
<custom-order enabled="0">
|
||||
<item>points_240d6bd6_9203_470a_994a_aae13cd9fa04</item>
|
||||
<item>lines_a677672a_bf5d_410d_98c9_d326a5719a1b</item>
|
||||
</custom-order>
|
||||
</layer-tree-group>
|
||||
<snapping-settings intersection-snapping="0" enabled="0" type="1" mode="2" unit="2" tolerance="0">
|
||||
<individual-layer-settings>
|
||||
<layer-setting units="2" enabled="0" type="1" id="lines_a677672a_bf5d_410d_98c9_d326a5719a1b" tolerance="0"/>
|
||||
<layer-setting units="2" enabled="0" type="1" id="points_240d6bd6_9203_470a_994a_aae13cd9fa04" tolerance="0"/>
|
||||
</individual-layer-settings>
|
||||
</snapping-settings>
|
||||
<relations>
|
||||
<relation strength="Association" referencedLayer="lines_a677672a_bf5d_410d_98c9_d326a5719a1b" name="Runway" id="points_240_Importance_lines_a677_Value" referencingLayer="points_240d6bd6_9203_470a_994a_aae13cd9fa04">
|
||||
<fieldRef referencedField="Value" referencingField="Importance"/>
|
||||
</relation>
|
||||
</relations>
|
||||
<mapcanvas name="theMapCanvas" annotationsVisible="1">
|
||||
<units>degrees</units>
|
||||
<extent>
|
||||
<xmin>-119.77777777777767199</xmin>
|
||||
<ymin>22.19841269841290199</ymin>
|
||||
<xmax>-82.44444444444427234</xmax>
|
||||
<ymax>47.4737750172535371</ymax>
|
||||
</extent>
|
||||
<rotation>0</rotation>
|
||||
<destinationsrs>
|
||||
<spatialrefsys>
|
||||
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
|
||||
<srsid>3452</srsid>
|
||||
<srid>4326</srid>
|
||||
<authid>EPSG:4326</authid>
|
||||
<description>WGS 84</description>
|
||||
<projectionacronym>longlat</projectionacronym>
|
||||
<ellipsoidacronym>WGS84</ellipsoidacronym>
|
||||
<geographicflag>true</geographicflag>
|
||||
</spatialrefsys>
|
||||
</destinationsrs>
|
||||
<rendermaptile>0</rendermaptile>
|
||||
</mapcanvas>
|
||||
<legend updateDrawingOrder="true">
|
||||
<legendlayer drawingOrder="-1" open="true" name="lines" checked="Qt::Checked" showFeatureCount="0">
|
||||
<filegroup open="true" hidden="false">
|
||||
<legendlayerfile isInOverview="0" visible="1" layerid="lines_a677672a_bf5d_410d_98c9_d326a5719a1b"/>
|
||||
</filegroup>
|
||||
</legendlayer>
|
||||
<legendlayer drawingOrder="-1" open="true" name="points" checked="Qt::Checked" showFeatureCount="0">
|
||||
<filegroup open="true" hidden="false">
|
||||
<legendlayerfile isInOverview="0" visible="1" layerid="points_240d6bd6_9203_470a_994a_aae13cd9fa04"/>
|
||||
</filegroup>
|
||||
</legendlayer>
|
||||
</legend>
|
||||
<mapViewDocks/>
|
||||
<projectlayers>
|
||||
<maplayer readOnly="0" hasScaleBasedVisibilityFlag="0" type="vector" simplifyAlgorithm="0" simplifyMaxScale="1" maxScale="1" simplifyDrawingHints="1" minScale="1e+8" autoRefreshTime="0" refreshOnNotifyMessage="" autoRefreshEnabled="0" refreshOnNotifyEnabled="0" simplifyDrawingTol="1" labelsEnabled="0" geometry="Line" simplifyLocal="1">
|
||||
<extent>
|
||||
<xmin>-117.62319839219053108</xmin>
|
||||
<ymin>23.20820580488508966</ymin>
|
||||
<xmax>-82.32264950769274492</xmax>
|
||||
<ymax>46.18290982947509349</ymax>
|
||||
</extent>
|
||||
<id>lines_a677672a_bf5d_410d_98c9_d326a5719a1b</id>
|
||||
<datasource>../lines.shp</datasource>
|
||||
<keywordList>
|
||||
<value></value>
|
||||
</keywordList>
|
||||
<layername>lines</layername>
|
||||
<srs>
|
||||
<spatialrefsys>
|
||||
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
|
||||
<srsid>3452</srsid>
|
||||
<srid>4326</srid>
|
||||
<authid>EPSG:4326</authid>
|
||||
<description>WGS 84</description>
|
||||
<projectionacronym>longlat</projectionacronym>
|
||||
<ellipsoidacronym>WGS84</ellipsoidacronym>
|
||||
<geographicflag>true</geographicflag>
|
||||
</spatialrefsys>
|
||||
</srs>
|
||||
<resourceMetadata>
|
||||
<identifier></identifier>
|
||||
<parentidentifier></parentidentifier>
|
||||
<language></language>
|
||||
<type></type>
|
||||
<title></title>
|
||||
<abstract></abstract>
|
||||
<contact>
|
||||
<name></name>
|
||||
<organization></organization>
|
||||
<position></position>
|
||||
<voice></voice>
|
||||
<fax></fax>
|
||||
<email></email>
|
||||
<role></role>
|
||||
</contact>
|
||||
<links/>
|
||||
<fees></fees>
|
||||
<encoding></encoding>
|
||||
<crs>
|
||||
<spatialrefsys>
|
||||
<proj4></proj4>
|
||||
<srsid>0</srsid>
|
||||
<srid>0</srid>
|
||||
<authid></authid>
|
||||
<description></description>
|
||||
<projectionacronym></projectionacronym>
|
||||
<ellipsoidacronym></ellipsoidacronym>
|
||||
<geographicflag>true</geographicflag>
|
||||
</spatialrefsys>
|
||||
</crs>
|
||||
<extent>
|
||||
<spatial crs="" maxz="0" maxy="0" minx="0" miny="0" dimensions="2" minz="0" maxx="0"/>
|
||||
<temporal>
|
||||
<period>
|
||||
<start></start>
|
||||
<end></end>
|
||||
</period>
|
||||
</temporal>
|
||||
</extent>
|
||||
</resourceMetadata>
|
||||
<provider encoding="UTF-8">ogr</provider>
|
||||
<vectorjoins/>
|
||||
<layerDependencies/>
|
||||
<dataDependencies/>
|
||||
<legend type="default-vector"/>
|
||||
<expressionfields/>
|
||||
<map-layer-style-manager current="default">
|
||||
<map-layer-style name="default"/>
|
||||
</map-layer-style-manager>
|
||||
<auxiliaryLayer/>
|
||||
<renderer-v2 type="categorizedSymbol" symbollevels="0" forceraster="0" attr="Name" enableorderby="0">
|
||||
<categories>
|
||||
<category render="true" label="Arterial" value="Arterial" symbol="0"/>
|
||||
<category render="true" label="Highway" value="Highway" symbol="1"/>
|
||||
</categories>
|
||||
<symbols>
|
||||
<symbol alpha="1" type="line" name="0" clip_to_extent="1">
|
||||
<layer pass="0" enabled="1" class="SimpleLine" locked="0">
|
||||
<prop k="capstyle" v="square"/>
|
||||
<prop k="customdash" v="5;2"/>
|
||||
<prop k="customdash_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="customdash_unit" v="MM"/>
|
||||
<prop k="draw_inside_polygon" v="0"/>
|
||||
<prop k="joinstyle" v="bevel"/>
|
||||
<prop k="line_color" v="154,139,116,255"/>
|
||||
<prop k="line_style" v="dash dot dot"/>
|
||||
<prop k="line_width" v="5"/>
|
||||
<prop k="line_width_unit" v="MM"/>
|
||||
<prop k="offset" v="0"/>
|
||||
<prop k="offset_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="offset_unit" v="MM"/>
|
||||
<prop k="use_custom_dash" v="0"/>
|
||||
<prop k="width_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<data_defined_properties>
|
||||
<Option type="Map">
|
||||
<Option type="QString" name="name" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
</Option>
|
||||
</data_defined_properties>
|
||||
</layer>
|
||||
</symbol>
|
||||
<symbol alpha="1" type="line" name="1" clip_to_extent="1">
|
||||
<layer pass="0" enabled="1" class="SimpleLine" locked="0">
|
||||
<prop k="capstyle" v="square"/>
|
||||
<prop k="customdash" v="5;2"/>
|
||||
<prop k="customdash_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="customdash_unit" v="MM"/>
|
||||
<prop k="draw_inside_polygon" v="0"/>
|
||||
<prop k="joinstyle" v="bevel"/>
|
||||
<prop k="line_color" v="94,89,55,255"/>
|
||||
<prop k="line_style" v="solid"/>
|
||||
<prop k="line_width" v="7"/>
|
||||
<prop k="line_width_unit" v="MM"/>
|
||||
<prop k="offset" v="0"/>
|
||||
<prop k="offset_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="offset_unit" v="MM"/>
|
||||
<prop k="use_custom_dash" v="0"/>
|
||||
<prop k="width_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<data_defined_properties>
|
||||
<Option type="Map">
|
||||
<Option type="QString" name="name" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
</Option>
|
||||
</data_defined_properties>
|
||||
</layer>
|
||||
</symbol>
|
||||
</symbols>
|
||||
<rotation/>
|
||||
<sizescale/>
|
||||
</renderer-v2>
|
||||
<customproperties>
|
||||
<property key="embeddedWidgets/count" value="0"/>
|
||||
<property key="variableNames"/>
|
||||
<property key="variableValues"/>
|
||||
</customproperties>
|
||||
<blendMode>0</blendMode>
|
||||
<featureBlendMode>0</featureBlendMode>
|
||||
<layerOpacity>1</layerOpacity>
|
||||
<SingleCategoryDiagramRenderer attributeLegend="1" diagramType="Histogram">
|
||||
<DiagramCategory labelPlacementMethod="XHeight" lineSizeType="MM" backgroundAlpha="255" scaleDependency="Area" penWidth="0" height="15" penAlpha="255" maxScaleDenominator="1e+8" lineSizeScale="3x:0,0,0,0,0,0" minimumSize="0" enabled="0" sizeScale="3x:0,0,0,0,0,0" backgroundColor="#ffffff" minScaleDenominator="1" rotationOffset="270" penColor="#000000" width="15" opacity="1" scaleBasedVisibility="0" sizeType="MM" barWidth="5" diagramOrientation="Up">
|
||||
<fontProperties description="Noto Sans,10,-1,5,50,0,0,0,0,0" style=""/>
|
||||
<attribute color="#000000" label="" field=""/>
|
||||
</DiagramCategory>
|
||||
</SingleCategoryDiagramRenderer>
|
||||
<DiagramLayerSettings dist="0" priority="0" showAll="1" obstacle="0" zIndex="0" placement="2" linePlacementFlags="2">
|
||||
<properties>
|
||||
<Option type="Map">
|
||||
<Option type="QString" name="name" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
</Option>
|
||||
</properties>
|
||||
</DiagramLayerSettings>
|
||||
<fieldConfiguration>
|
||||
<field name="Name">
|
||||
<editWidget type="TextEdit">
|
||||
<config>
|
||||
<Option/>
|
||||
</config>
|
||||
</editWidget>
|
||||
</field>
|
||||
<field name="Value">
|
||||
<editWidget type="TextEdit">
|
||||
<config>
|
||||
<Option/>
|
||||
</config>
|
||||
</editWidget>
|
||||
</field>
|
||||
</fieldConfiguration>
|
||||
<aliases>
|
||||
<alias index="0" name="" field="Name"/>
|
||||
<alias index="1" name="" field="Value"/>
|
||||
</aliases>
|
||||
<excludeAttributesWMS/>
|
||||
<excludeAttributesWFS/>
|
||||
<defaults>
|
||||
<default expression="" applyOnUpdate="0" field="Name"/>
|
||||
<default expression="" applyOnUpdate="0" field="Value"/>
|
||||
</defaults>
|
||||
<constraints>
|
||||
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="Name"/>
|
||||
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="Value"/>
|
||||
</constraints>
|
||||
<constraintExpressions>
|
||||
<constraint desc="" exp="" field="Name"/>
|
||||
<constraint desc="" exp="" field="Value"/>
|
||||
</constraintExpressions>
|
||||
<attributeactions>
|
||||
<defaultAction key="Canvas" value="{00000000-0000-0000-0000-000000000000}"/>
|
||||
</attributeactions>
|
||||
<attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="0">
|
||||
<columns>
|
||||
<column type="field" name="Name" width="-1" hidden="0"/>
|
||||
<column type="field" name="Value" width="-1" hidden="0"/>
|
||||
<column type="actions" width="-1" hidden="1"/>
|
||||
</columns>
|
||||
</attributetableconfig>
|
||||
<editform>.</editform>
|
||||
<editforminit/>
|
||||
<editforminitcodesource>0</editforminitcodesource>
|
||||
<editforminitfilepath></editforminitfilepath>
|
||||
<editforminitcode><![CDATA[# -*- coding: utf-8 -*-
|
||||
"""
|
||||
QGIS forms can have a Python function that is called when the form is
|
||||
opened.
|
||||
|
||||
Use this function to add extra logic to your forms.
|
||||
|
||||
Enter the name of the function in the "Python Init function"
|
||||
field.
|
||||
An example follows:
|
||||
"""
|
||||
from qgis.PyQt.QtWidgets import QWidget
|
||||
|
||||
def my_form_open(dialog, layer, feature):
|
||||
geom = feature.geometry()
|
||||
control = dialog.findChild(QWidget, "MyLineEdit")
|
||||
]]></editforminitcode>
|
||||
<featformsuppress>0</featformsuppress>
|
||||
<editorlayout>generatedlayout</editorlayout>
|
||||
<editable>
|
||||
<field name="Name" editable="1"/>
|
||||
<field name="Value" editable="1"/>
|
||||
</editable>
|
||||
<labelOnTop>
|
||||
<field name="Name" labelOnTop="0"/>
|
||||
<field name="Value" labelOnTop="0"/>
|
||||
</labelOnTop>
|
||||
<widgets>
|
||||
<widget name="points_240_Importance_lines_a677_Value">
|
||||
<config type="Map">
|
||||
<Option type="QString" name="nm-rel" value=""/>
|
||||
</config>
|
||||
</widget>
|
||||
</widgets>
|
||||
<conditionalstyles>
|
||||
<rowstyles/>
|
||||
<fieldstyles/>
|
||||
</conditionalstyles>
|
||||
<expressionfields/>
|
||||
<previewExpression>Name</previewExpression>
|
||||
<mapTip></mapTip>
|
||||
</maplayer>
|
||||
<maplayer readOnly="0" hasScaleBasedVisibilityFlag="0" type="vector" simplifyAlgorithm="0" simplifyMaxScale="1" maxScale="1" simplifyDrawingHints="0" minScale="1e+8" autoRefreshTime="0" refreshOnNotifyMessage="" autoRefreshEnabled="0" refreshOnNotifyEnabled="0" simplifyDrawingTol="1" labelsEnabled="0" geometry="Point" simplifyLocal="1">
|
||||
<extent>
|
||||
<xmin>-118.88888888888877204</xmin>
|
||||
<ymin>22.80020703933767834</ymin>
|
||||
<xmax>-83.33333333333315807</xmax>
|
||||
<ymax>46.87198067632875365</ymax>
|
||||
</extent>
|
||||
<id>points_240d6bd6_9203_470a_994a_aae13cd9fa04</id>
|
||||
<datasource>../points.shp</datasource>
|
||||
<keywordList>
|
||||
<value></value>
|
||||
</keywordList>
|
||||
<layername>points</layername>
|
||||
<srs>
|
||||
<spatialrefsys>
|
||||
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
|
||||
<srsid>3452</srsid>
|
||||
<srid>4326</srid>
|
||||
<authid>EPSG:4326</authid>
|
||||
<description>WGS 84</description>
|
||||
<projectionacronym>longlat</projectionacronym>
|
||||
<ellipsoidacronym>WGS84</ellipsoidacronym>
|
||||
<geographicflag>true</geographicflag>
|
||||
</spatialrefsys>
|
||||
</srs>
|
||||
<resourceMetadata>
|
||||
<identifier></identifier>
|
||||
<parentidentifier></parentidentifier>
|
||||
<language></language>
|
||||
<type></type>
|
||||
<title></title>
|
||||
<abstract></abstract>
|
||||
<contact>
|
||||
<name></name>
|
||||
<organization></organization>
|
||||
<position></position>
|
||||
<voice></voice>
|
||||
<fax></fax>
|
||||
<email></email>
|
||||
<role></role>
|
||||
</contact>
|
||||
<links/>
|
||||
<fees></fees>
|
||||
<encoding></encoding>
|
||||
<crs>
|
||||
<spatialrefsys>
|
||||
<proj4></proj4>
|
||||
<srsid>0</srsid>
|
||||
<srid>0</srid>
|
||||
<authid></authid>
|
||||
<description></description>
|
||||
<projectionacronym></projectionacronym>
|
||||
<ellipsoidacronym></ellipsoidacronym>
|
||||
<geographicflag>false</geographicflag>
|
||||
</spatialrefsys>
|
||||
</crs>
|
||||
<extent>
|
||||
<spatial crs="" maxz="0" maxy="0" minx="0" miny="0" dimensions="2" minz="0" maxx="0"/>
|
||||
<temporal>
|
||||
<period>
|
||||
<start></start>
|
||||
<end></end>
|
||||
</period>
|
||||
</temporal>
|
||||
</extent>
|
||||
</resourceMetadata>
|
||||
<provider encoding="UTF-8">ogr</provider>
|
||||
<vectorjoins/>
|
||||
<layerDependencies/>
|
||||
<dataDependencies/>
|
||||
<legend type="default-vector"/>
|
||||
<expressionfields/>
|
||||
<map-layer-style-manager current="default">
|
||||
<map-layer-style name="default"/>
|
||||
</map-layer-style-manager>
|
||||
<auxiliaryLayer/>
|
||||
<renderer-v2 type="categorizedSymbol" symbollevels="0" forceraster="0" attr="Class" enableorderby="0">
|
||||
<categories>
|
||||
<category render="true" label="B52" value="B52" symbol="0"/>
|
||||
<category render="true" label="Biplane" value="Biplane" symbol="1"/>
|
||||
<category render="true" label="Jet" value="Jet" symbol="2"/>
|
||||
</categories>
|
||||
<symbols>
|
||||
<symbol alpha="1" type="marker" name="0" clip_to_extent="1">
|
||||
<layer pass="0" enabled="1" class="SvgMarker" locked="0">
|
||||
<prop k="angle" v="0"/>
|
||||
<prop k="color" v="0,0,0,255"/>
|
||||
<prop k="fixedAspectRatio" v="0"/>
|
||||
<prop k="horizontal_anchor_point" v="1"/>
|
||||
<prop k="name" v="gpsicons/plane.svg"/>
|
||||
<prop k="offset" v="0,0"/>
|
||||
<prop k="offset_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="offset_unit" v="MM"/>
|
||||
<prop k="outline_color" v="0,0,0,255"/>
|
||||
<prop k="outline_width" v="0.2"/>
|
||||
<prop k="outline_width_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="outline_width_unit" v="MM"/>
|
||||
<prop k="scale_method" v="diameter"/>
|
||||
<prop k="size" v="11"/>
|
||||
<prop k="size_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="size_unit" v="MM"/>
|
||||
<prop k="vertical_anchor_point" v="1"/>
|
||||
<data_defined_properties>
|
||||
<Option type="Map">
|
||||
<Option type="QString" name="name" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
</Option>
|
||||
</data_defined_properties>
|
||||
</layer>
|
||||
</symbol>
|
||||
<symbol alpha="1" type="marker" name="1" clip_to_extent="1">
|
||||
<layer pass="0" enabled="1" class="SvgMarker" locked="0">
|
||||
<prop k="angle" v="0"/>
|
||||
<prop k="color" v="0,0,0,255"/>
|
||||
<prop k="fixedAspectRatio" v="0"/>
|
||||
<prop k="horizontal_anchor_point" v="1"/>
|
||||
<prop k="name" v="gpsicons/plane_orange.svg"/>
|
||||
<prop k="offset" v="0,0"/>
|
||||
<prop k="offset_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="offset_unit" v="MM"/>
|
||||
<prop k="outline_color" v="0,0,0,255"/>
|
||||
<prop k="outline_width" v="0.2"/>
|
||||
<prop k="outline_width_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="outline_width_unit" v="MM"/>
|
||||
<prop k="scale_method" v="diameter"/>
|
||||
<prop k="size" v="18"/>
|
||||
<prop k="size_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="size_unit" v="MM"/>
|
||||
<prop k="vertical_anchor_point" v="1"/>
|
||||
<data_defined_properties>
|
||||
<Option type="Map">
|
||||
<Option type="QString" name="name" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
</Option>
|
||||
</data_defined_properties>
|
||||
</layer>
|
||||
</symbol>
|
||||
<symbol alpha="1" type="marker" name="2" clip_to_extent="1">
|
||||
<layer pass="0" enabled="1" class="SvgMarker" locked="0">
|
||||
<prop k="angle" v="0"/>
|
||||
<prop k="color" v="0,0,0,255"/>
|
||||
<prop k="fixedAspectRatio" v="0"/>
|
||||
<prop k="horizontal_anchor_point" v="1"/>
|
||||
<prop k="name" v="gpsicons/plane.svg"/>
|
||||
<prop k="offset" v="0,0"/>
|
||||
<prop k="offset_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="offset_unit" v="MM"/>
|
||||
<prop k="outline_color" v="0,0,0,255"/>
|
||||
<prop k="outline_width" v="0.2"/>
|
||||
<prop k="outline_width_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="outline_width_unit" v="MM"/>
|
||||
<prop k="scale_method" v="diameter"/>
|
||||
<prop k="size" v="11"/>
|
||||
<prop k="size_map_unit_scale" v="3x:0,0,0,0,0,0"/>
|
||||
<prop k="size_unit" v="MM"/>
|
||||
<prop k="vertical_anchor_point" v="1"/>
|
||||
<data_defined_properties>
|
||||
<Option type="Map">
|
||||
<Option type="QString" name="name" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
</Option>
|
||||
</data_defined_properties>
|
||||
</layer>
|
||||
</symbol>
|
||||
</symbols>
|
||||
<rotation/>
|
||||
<sizescale/>
|
||||
</renderer-v2>
|
||||
<customproperties>
|
||||
<property key="embeddedWidgets/count" value="0"/>
|
||||
<property key="variableNames"/>
|
||||
<property key="variableValues"/>
|
||||
</customproperties>
|
||||
<blendMode>0</blendMode>
|
||||
<featureBlendMode>0</featureBlendMode>
|
||||
<layerOpacity>1</layerOpacity>
|
||||
<SingleCategoryDiagramRenderer attributeLegend="1" diagramType="Histogram">
|
||||
<DiagramCategory labelPlacementMethod="XHeight" lineSizeType="MM" backgroundAlpha="255" scaleDependency="Area" penWidth="0" height="15" penAlpha="255" maxScaleDenominator="1e+8" lineSizeScale="3x:0,0,0,0,0,0" minimumSize="0" enabled="0" sizeScale="3x:0,0,0,0,0,0" backgroundColor="#ffffff" minScaleDenominator="1" rotationOffset="270" penColor="#000000" width="15" opacity="1" scaleBasedVisibility="0" sizeType="MM" barWidth="5" diagramOrientation="Up">
|
||||
<fontProperties description="Noto Sans,10,-1,5,50,0,0,0,0,0" style=""/>
|
||||
<attribute color="#000000" label="" field=""/>
|
||||
</DiagramCategory>
|
||||
</SingleCategoryDiagramRenderer>
|
||||
<DiagramLayerSettings dist="0" priority="0" showAll="1" obstacle="0" zIndex="0" placement="0" linePlacementFlags="2">
|
||||
<properties>
|
||||
<Option type="Map">
|
||||
<Option type="QString" name="name" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
</Option>
|
||||
</properties>
|
||||
</DiagramLayerSettings>
|
||||
<fieldConfiguration>
|
||||
<field name="Class">
|
||||
<editWidget type="TextEdit">
|
||||
<config>
|
||||
<Option/>
|
||||
</config>
|
||||
</editWidget>
|
||||
</field>
|
||||
<field name="Heading">
|
||||
<editWidget type="TextEdit">
|
||||
<config>
|
||||
<Option/>
|
||||
</config>
|
||||
</editWidget>
|
||||
</field>
|
||||
<field name="Importance">
|
||||
<editWidget type="RelationReference">
|
||||
<config>
|
||||
<Option/>
|
||||
</config>
|
||||
</editWidget>
|
||||
</field>
|
||||
<field name="Pilots">
|
||||
<editWidget type="Range">
|
||||
<config>
|
||||
<Option/>
|
||||
</config>
|
||||
</editWidget>
|
||||
</field>
|
||||
<field name="Cabin Crew">
|
||||
<editWidget type="Range">
|
||||
<config>
|
||||
<Option/>
|
||||
</config>
|
||||
</editWidget>
|
||||
</field>
|
||||
<field name="Staff">
|
||||
<editWidget type="Range">
|
||||
<config>
|
||||
<Option/>
|
||||
</config>
|
||||
</editWidget>
|
||||
</field>
|
||||
</fieldConfiguration>
|
||||
<aliases>
|
||||
<alias index="0" name="" field="Class"/>
|
||||
<alias index="1" name="" field="Heading"/>
|
||||
<alias index="2" name="" field="Importance"/>
|
||||
<alias index="3" name="" field="Pilots"/>
|
||||
<alias index="4" name="" field="Cabin Crew"/>
|
||||
<alias index="5" name="" field="Staff"/>
|
||||
</aliases>
|
||||
<excludeAttributesWMS/>
|
||||
<excludeAttributesWFS/>
|
||||
<defaults>
|
||||
<default expression="" applyOnUpdate="0" field="Class"/>
|
||||
<default expression="" applyOnUpdate="0" field="Heading"/>
|
||||
<default expression="" applyOnUpdate="0" field="Importance"/>
|
||||
<default expression="" applyOnUpdate="0" field="Pilots"/>
|
||||
<default expression="" applyOnUpdate="0" field="Cabin Crew"/>
|
||||
<default expression="" applyOnUpdate="0" field="Staff"/>
|
||||
</defaults>
|
||||
<constraints>
|
||||
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="Class"/>
|
||||
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="Heading"/>
|
||||
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="Importance"/>
|
||||
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="Pilots"/>
|
||||
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="Cabin Crew"/>
|
||||
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="Staff"/>
|
||||
</constraints>
|
||||
<constraintExpressions>
|
||||
<constraint desc="" exp="" field="Class"/>
|
||||
<constraint desc="" exp="" field="Heading"/>
|
||||
<constraint desc="" exp="" field="Importance"/>
|
||||
<constraint desc="" exp="" field="Pilots"/>
|
||||
<constraint desc="" exp="" field="Cabin Crew"/>
|
||||
<constraint desc="" exp="" field="Staff"/>
|
||||
</constraintExpressions>
|
||||
<attributeactions>
|
||||
<defaultAction key="Canvas" value="{00000000-0000-0000-0000-000000000000}"/>
|
||||
</attributeactions>
|
||||
<attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="0">
|
||||
<columns>
|
||||
<column type="field" name="Class" width="-1" hidden="0"/>
|
||||
<column type="field" name="Heading" width="-1" hidden="0"/>
|
||||
<column type="field" name="Importance" width="-1" hidden="0"/>
|
||||
<column type="field" name="Pilots" width="-1" hidden="0"/>
|
||||
<column type="field" name="Cabin Crew" width="-1" hidden="0"/>
|
||||
<column type="field" name="Staff" width="-1" hidden="0"/>
|
||||
<column type="actions" width="-1" hidden="1"/>
|
||||
</columns>
|
||||
</attributetableconfig>
|
||||
<editform>.</editform>
|
||||
<editforminit/>
|
||||
<editforminitcodesource>0</editforminitcodesource>
|
||||
<editforminitfilepath></editforminitfilepath>
|
||||
<editforminitcode><![CDATA[# -*- coding: utf-8 -*-
|
||||
"""
|
||||
QGIS forms can have a Python function that is called when the form is
|
||||
opened.
|
||||
|
||||
Use this function to add extra logic to your forms.
|
||||
|
||||
Enter the name of the function in the "Python Init function"
|
||||
field.
|
||||
An example follows:
|
||||
"""
|
||||
from qgis.PyQt.QtWidgets import QWidget
|
||||
|
||||
def my_form_open(dialog, layer, feature):
|
||||
geom = feature.geometry()
|
||||
control = dialog.findChild(QWidget, "MyLineEdit")
|
||||
]]></editforminitcode>
|
||||
<featformsuppress>0</featformsuppress>
|
||||
<editorlayout>tablayout</editorlayout>
|
||||
<attributeEditorForm>
|
||||
<attributeEditorContainer visibilityExpressionEnabled="0" name="Plane" showLabel="1" columnCount="1" visibilityExpression="" groupBox="0">
|
||||
<attributeEditorField index="0" name="Class" showLabel="1"/>
|
||||
<attributeEditorField index="1" name="Heading" showLabel="1"/>
|
||||
<attributeEditorField index="2" name="Importance" showLabel="1"/>
|
||||
</attributeEditorContainer>
|
||||
<attributeEditorContainer visibilityExpressionEnabled="0" name="Employees" showLabel="1" columnCount="1" visibilityExpression="" groupBox="0">
|
||||
<attributeEditorField index="3" name="Pilots" showLabel="1"/>
|
||||
<attributeEditorField index="4" name="Cabin Crew" showLabel="1"/>
|
||||
<attributeEditorField index="5" name="Staff" showLabel="1"/>
|
||||
</attributeEditorContainer>
|
||||
</attributeEditorForm>
|
||||
<editable>
|
||||
<field name="Cabin Crew" editable="1"/>
|
||||
<field name="Class" editable="1"/>
|
||||
<field name="Heading" editable="1"/>
|
||||
<field name="Importance" editable="1"/>
|
||||
<field name="Pilots" editable="1"/>
|
||||
<field name="Staff" editable="1"/>
|
||||
</editable>
|
||||
<labelOnTop>
|
||||
<field name="Cabin Crew" labelOnTop="0"/>
|
||||
<field name="Class" labelOnTop="0"/>
|
||||
<field name="Heading" labelOnTop="0"/>
|
||||
<field name="Importance" labelOnTop="0"/>
|
||||
<field name="Pilots" labelOnTop="0"/>
|
||||
<field name="Staff" labelOnTop="0"/>
|
||||
</labelOnTop>
|
||||
<widgets/>
|
||||
<conditionalstyles>
|
||||
<rowstyles/>
|
||||
<fieldstyles/>
|
||||
</conditionalstyles>
|
||||
<expressionfields/>
|
||||
<previewExpression>Class</previewExpression>
|
||||
<mapTip></mapTip>
|
||||
</maplayer>
|
||||
</projectlayers>
|
||||
<layerorder>
|
||||
<layer id="points_240d6bd6_9203_470a_994a_aae13cd9fa04"/>
|
||||
<layer id="lines_a677672a_bf5d_410d_98c9_d326a5719a1b"/>
|
||||
</layerorder>
|
||||
<properties>
|
||||
<PositionPrecision>
|
||||
<DegreeFormat type="QString">MU</DegreeFormat>
|
||||
<Automatic type="bool">true</Automatic>
|
||||
<DecimalPlaces type="int">2</DecimalPlaces>
|
||||
</PositionPrecision>
|
||||
<WMSContactOrganization type="QString"></WMSContactOrganization>
|
||||
<SpatialRefSys>
|
||||
<ProjectionsEnabled type="int">1</ProjectionsEnabled>
|
||||
</SpatialRefSys>
|
||||
<WMSServiceTitle type="QString"></WMSServiceTitle>
|
||||
<Macros>
|
||||
<pythonCode type="QString"></pythonCode>
|
||||
</Macros>
|
||||
<WFSUrl type="QString"></WFSUrl>
|
||||
<WMSContactPhone type="QString"></WMSContactPhone>
|
||||
<WMSFees type="QString">conditions unknown</WMSFees>
|
||||
<Paths>
|
||||
<Absolute type="bool">false</Absolute>
|
||||
</Paths>
|
||||
<WFSLayers type="QStringList"/>
|
||||
<WMSKeywordList type="QStringList">
|
||||
<value></value>
|
||||
</WMSKeywordList>
|
||||
<WMSUseLayerIDs type="bool">false</WMSUseLayerIDs>
|
||||
<PAL>
|
||||
<CandidatesPoint type="int">16</CandidatesPoint>
|
||||
<ShowingPartialsLabels type="bool">true</ShowingPartialsLabels>
|
||||
<ShowingCandidates type="bool">false</ShowingCandidates>
|
||||
<DrawRectOnly type="bool">false</DrawRectOnly>
|
||||
<CandidatesPolygon type="int">30</CandidatesPolygon>
|
||||
<ShowingAllLabels type="bool">false</ShowingAllLabels>
|
||||
<DrawOutlineLabels type="bool">true</DrawOutlineLabels>
|
||||
<SearchMethod type="int">0</SearchMethod>
|
||||
<CandidatesLine type="int">50</CandidatesLine>
|
||||
</PAL>
|
||||
<WMSContactPosition type="QString"></WMSContactPosition>
|
||||
<Legend>
|
||||
<filterByMap type="bool">false</filterByMap>
|
||||
</Legend>
|
||||
<WMSPrecision type="QString">8</WMSPrecision>
|
||||
<WCSLayers type="QStringList"/>
|
||||
<RequiredLayers>
|
||||
<Layers type="QStringList"/>
|
||||
</RequiredLayers>
|
||||
<Measure>
|
||||
<Ellipsoid type="QString">WGS84</Ellipsoid>
|
||||
</Measure>
|
||||
<WCSUrl type="QString"></WCSUrl>
|
||||
<Measurement>
|
||||
<DistanceUnits type="QString">meters</DistanceUnits>
|
||||
<AreaUnits type="QString">m2</AreaUnits>
|
||||
</Measurement>
|
||||
<Gui>
|
||||
<CanvasColorBluePart type="int">255</CanvasColorBluePart>
|
||||
<SelectionColorAlphaPart type="int">255</SelectionColorAlphaPart>
|
||||
<SelectionColorRedPart type="int">255</SelectionColorRedPart>
|
||||
<SelectionColorGreenPart type="int">255</SelectionColorGreenPart>
|
||||
<SelectionColorBluePart type="int">0</SelectionColorBluePart>
|
||||
<CanvasColorRedPart type="int">255</CanvasColorRedPart>
|
||||
<CanvasColorGreenPart type="int">255</CanvasColorGreenPart>
|
||||
</Gui>
|
||||
<WMSServiceCapabilities type="bool">false</WMSServiceCapabilities>
|
||||
<WMSImageQuality type="int">90</WMSImageQuality>
|
||||
<WMSServiceAbstract type="QString"></WMSServiceAbstract>
|
||||
<WMSRequestDefinedDataSources type="bool">false</WMSRequestDefinedDataSources>
|
||||
<WMSAddWktGeometry type="bool">false</WMSAddWktGeometry>
|
||||
<WMSContactMail type="QString"></WMSContactMail>
|
||||
<WMSSegmentizeFeatureInfoGeometry type="bool">false</WMSSegmentizeFeatureInfoGeometry>
|
||||
<DefaultStyles>
|
||||
<Fill type="QString"></Fill>
|
||||
<RandomColors type="bool">true</RandomColors>
|
||||
<Line type="QString"></Line>
|
||||
<Marker type="QString"></Marker>
|
||||
<ColorRamp type="QString"></ColorRamp>
|
||||
<Opacity type="double">1</Opacity>
|
||||
</DefaultStyles>
|
||||
<WMSContactPerson type="QString"></WMSContactPerson>
|
||||
<WMSOnlineResource type="QString"></WMSOnlineResource>
|
||||
<Identify>
|
||||
<disabledLayers type="QStringList"/>
|
||||
</Identify>
|
||||
<WMSUrl type="QString"></WMSUrl>
|
||||
<WFSTLayers>
|
||||
<Insert type="QStringList"/>
|
||||
<Delete type="QStringList"/>
|
||||
<Update type="QStringList"/>
|
||||
</WFSTLayers>
|
||||
<WMSAccessConstraints type="QString">None</WMSAccessConstraints>
|
||||
</properties>
|
||||
<visibility-presets/>
|
||||
<transformContext/>
|
||||
<projectMetadata>
|
||||
<identifier></identifier>
|
||||
<parentidentifier></parentidentifier>
|
||||
<language></language>
|
||||
<type></type>
|
||||
<title></title>
|
||||
<abstract></abstract>
|
||||
<contact>
|
||||
<name></name>
|
||||
<organization></organization>
|
||||
<position></position>
|
||||
<voice></voice>
|
||||
<fax></fax>
|
||||
<email></email>
|
||||
<role></role>
|
||||
</contact>
|
||||
<links/>
|
||||
<author>David</author>
|
||||
<creation>2018-07-19T12:18:37</creation>
|
||||
</projectMetadata>
|
||||
<Annotations/>
|
||||
<Layouts/>
|
||||
</qgis>
|
BIN
tests/testdata/project_translation/points_translation_de.qm
vendored
Normal file
BIN
tests/testdata/project_translation/points_translation_de.qm
vendored
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user