mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-14 00:07:35 -04:00
working translation of project from qm file
Translated objects and tests included: - [x] layer names - [x] layer group names - [x] relation names - [x] attribute alias (if no alias, then the field translation) - [x] forms group box titles - [x] forms sub group box titles included restructured with QTranslator object. Updated test-data used for the test.
This commit is contained in:
parent
628292b974
commit
1bccedd1d1
@ -264,7 +264,7 @@ Write XML information
|
||||
Serialize on project save
|
||||
%End
|
||||
|
||||
QgsAttributeEditorElement *attributeEditorElementFromDomElement( QDomElement &elem, QgsAttributeEditorElement *parent, const QString &layerId = 0 );
|
||||
QgsAttributeEditorElement *attributeEditorElementFromDomElement( QDomElement &elem, QgsAttributeEditorElement *parent );
|
||||
%Docstring
|
||||
Deserialize drag and drop designer elements.
|
||||
%End
|
||||
|
@ -135,14 +135,6 @@ 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
|
||||
|
||||
@ -991,25 +983,6 @@ 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:
|
||||
@ -1362,16 +1335,6 @@ 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
|
||||
|
||||
};
|
||||
|
@ -1,79 +0,0 @@
|
||||
/************************************************************************
|
||||
* 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( const QString &locale );
|
||||
%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 *
|
||||
************************************************************************/
|
@ -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" );
|
||||
|
@ -850,7 +850,7 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *pa
|
||||
cbtsLocale->addItem( QIcon( QString( ":/images/flags/%1.svg" ).arg( l ) ), displayName, l );
|
||||
}
|
||||
cbtsLocale->addItem( QIcon( QString( ":/images/flags/%1.svg" ).arg( QStringLiteral( "en_US" ) ) ), QLocale( QStringLiteral( "en_US" ) ).nativeLanguageName(), QStringLiteral( "en_US" ) );
|
||||
cbtsLocale->setCurrentIndex( cbtsLocale->findData( settings->value( QStringLiteral( "locale/userLocale" ), QString() ).toString() ) );
|
||||
cbtsLocale->setCurrentIndex( cbtsLocale->findData( settings.value( QStringLiteral( "locale/userLocale" ), QString() ).toString() ) );
|
||||
|
||||
connect( generateTsFileButton, &QPushButton::clicked, this, &QgsProjectProperties::generateTsFileButton_clicked );
|
||||
|
||||
|
@ -37,7 +37,6 @@
|
||||
#include "qgsrectangle.h"
|
||||
#include "qgsrelationmanager.h"
|
||||
#include "qgsannotationmanager.h"
|
||||
#include "qgsvectorlayer.h"
|
||||
#include "qgsvectorlayerjoininfo.h"
|
||||
#include "qgsmapthemecollection.h"
|
||||
#include "qgslayerdefinition.h"
|
||||
@ -367,9 +366,6 @@ 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();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -445,6 +441,24 @@ void QgsProject::setPresetHomePath( const QString &path )
|
||||
setDirty( true );
|
||||
}
|
||||
|
||||
void QgsProject::registerTranslatableContainers( QgsTranslationContext *translationContext, QgsAttributeEditorContainer *parent, const QString &layerId )
|
||||
{
|
||||
QList<QgsAttributeEditorElement *> elements = parent->children();
|
||||
|
||||
for ( QgsAttributeEditorElement *element : elements )
|
||||
{
|
||||
if ( element->type() == QgsAttributeEditorElement::AeTypeContainer )
|
||||
{
|
||||
QgsAttributeEditorContainer *container = dynamic_cast<QgsAttributeEditorContainer *>( element );
|
||||
|
||||
translationContext->registerTranslation( QStringLiteral( "project:layers:%1:formcontainers" ).arg( layerId ), container->name() );
|
||||
|
||||
if ( container->children().size() > 0 )
|
||||
registerTranslatableContainers( translationContext, container, layerId );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QgsProject::registerTranslatableObjects( QgsTranslationContext *translationContext )
|
||||
{
|
||||
//register layers
|
||||
@ -457,6 +471,7 @@ void QgsProject::registerTranslatableObjects( QgsTranslationContext *translation
|
||||
{
|
||||
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mapLayer );
|
||||
|
||||
//register aliases and fields
|
||||
const QgsFields fields = vlayer->fields();
|
||||
for ( const QgsField &field : fields )
|
||||
{
|
||||
@ -465,6 +480,10 @@ void QgsProject::registerTranslatableObjects( QgsTranslationContext *translation
|
||||
else
|
||||
translationContext->registerTranslation( QStringLiteral( "project:layers:%1:fieldaliases" ).arg( vlayer->id() ), field.alias() );
|
||||
}
|
||||
|
||||
//register formcontainers
|
||||
registerTranslatableContainers( translationContext, vlayer->editFormConfig().invisibleRootContainer(), vlayer->id() );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -931,10 +950,6 @@ bool QgsProject::read()
|
||||
QString filename = mFile.fileName();
|
||||
bool rc;
|
||||
|
||||
//dave dirty hack
|
||||
delete mTranslator;
|
||||
mTranslator = new QTranslator();
|
||||
|
||||
if ( QgsProjectStorage *storage = projectStorage() )
|
||||
{
|
||||
QTemporaryFile inDevice;
|
||||
@ -969,10 +984,15 @@ bool QgsProject::read()
|
||||
}
|
||||
|
||||
//on translation we should not change the filename back
|
||||
if ( mTranslator->isEmpty() )
|
||||
if ( !mTranslator )
|
||||
{
|
||||
mFile.setFileName( filename );
|
||||
}
|
||||
else
|
||||
{
|
||||
//but delete the translator
|
||||
delete mTranslator;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -988,6 +1008,7 @@ bool QgsProject::readProjectFile( const QString &filename )
|
||||
|
||||
if ( QFile( QStringLiteral( "%1/%2.qm" ).arg( QFileInfo( projectFile.fileName() ).absolutePath(), localeFileName ) ).exists() )
|
||||
{
|
||||
mTranslator = new QTranslator();
|
||||
if ( mTranslator->load( localeFileName, QFileInfo( projectFile.fileName() ).absolutePath() ) )
|
||||
{
|
||||
QgsDebugMsg( "Translation loaded" );
|
||||
@ -1290,7 +1311,7 @@ bool QgsProject::readProjectFile( const QString &filename )
|
||||
|
||||
emit nonIdentifiableLayersChanged( nonIdentifiableLayers() );
|
||||
|
||||
if ( !mTranslator->isEmpty() )
|
||||
if ( mTranslator )
|
||||
{
|
||||
//project possibly translated -> rename it with locale postfix
|
||||
QString newFileName( QStringLiteral( "%1/%2.qgs" ).arg( QFileInfo( projectFile.fileName() ).absolutePath(), localeFileName ) );
|
||||
@ -2800,7 +2821,7 @@ void QgsProject::generateTsFile( const QString &locale )
|
||||
|
||||
QString QgsProject::translate( const QString &context, const QString &sourceText, const char *disambiguation, int n )
|
||||
{
|
||||
if ( mTranslator->isEmpty() )
|
||||
if ( !mTranslator )
|
||||
{
|
||||
return sourceText;
|
||||
}
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include "qgsreadwritecontext.h"
|
||||
#include "qgsprojectmetadata.h"
|
||||
#include "qgstranslationcontext.h"
|
||||
#include "qgsvectorlayer.h"
|
||||
|
||||
class QFileInfo;
|
||||
class QDomDocument;
|
||||
@ -97,7 +98,6 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
|
||||
Q_PROPERTY( QgsRelationManager *relationManager READ relationManager )
|
||||
Q_PROPERTY( QList<QgsVectorLayer *> avoidIntersectionsLayers READ avoidIntersectionsLayers WRITE setAvoidIntersectionsLayers NOTIFY avoidIntersectionsLayersChanged )
|
||||
Q_PROPERTY( QgsProjectMetadata metadata READ metadata WRITE setMetadata NOTIFY metadataChanged )
|
||||
//dave to do Q_PROPERTY( QTranslator translator READ translator )
|
||||
|
||||
public:
|
||||
//! Returns the QgsProject singleton instance
|
||||
@ -1296,6 +1296,16 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
|
||||
*/
|
||||
void setPresetHomePath( const QString &path );
|
||||
|
||||
/**
|
||||
* Registers the translatable containers into the tranlationContext
|
||||
* this is a rekursive function to get all the child containers
|
||||
* \since QGIS 3.2
|
||||
*
|
||||
* \param translationContext where the objects will be registered
|
||||
* \param parent parent-container containing list of children
|
||||
*/
|
||||
void registerTranslatableContainers( QgsTranslationContext *translationContext, QgsAttributeEditorContainer *parent, const QString &layerId );
|
||||
|
||||
/**
|
||||
* Registers the translatable objects into the tranlationContext
|
||||
* so there can be created a ts file these values
|
||||
|
@ -1907,15 +1907,15 @@ bool QgsVectorLayer::readSymbology( const QDomNode &layerNode, QString &errorMes
|
||||
if ( !aliasElem.attribute( QStringLiteral( "name" ) ).isEmpty() )
|
||||
{
|
||||
//if it has alias
|
||||
alias = QgsProject::instance()->translate( QStringLiteral( "project:layers:%1:fieldaliases" ).arg( this->name() ), aliasElem.attribute( QStringLiteral( "name" ) ) );
|
||||
QgsDebugMsgLevel( "context" + QStringLiteral( "project:layers:%1:fieldaliases" ).arg( this->name() ) + " source " + aliasElem.attribute( QStringLiteral( "name" ) ), 1 );
|
||||
alias = QgsProject::instance()->translate( QStringLiteral( "project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral( "id" ) ).toElement().text() ), aliasElem.attribute( QStringLiteral( "name" ) ) );
|
||||
QgsDebugMsgLevel( "context" + QStringLiteral( "project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral( "id" ) ).toElement().text() ) + " source " + aliasElem.attribute( QStringLiteral( "name" ) ), 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
//if it has no alias, but alias is should be the fields translation
|
||||
alias = QgsProject::instance()->translate( QStringLiteral( "project:layers:%1:fieldaliases" ).arg( this->name() ), aliasElem.attribute( QStringLiteral( "name" ) ) );
|
||||
QgsDebugMsgLevel( "context" + QStringLiteral( "project:layers:%1:fieldaliases" ).arg( this->name() ) + " source " + field, 1 );
|
||||
//if it gets the exact field value, there has been no translation (no translation loaded);
|
||||
//if it has no alias, it should be the fields translation
|
||||
alias = QgsProject::instance()->translate( QStringLiteral( "project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral( "id" ) ).toElement().text() ), field );
|
||||
QgsDebugMsgLevel( "context" + QStringLiteral( "project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral( "id" ) ).toElement().text() ) + " source " + field, 1 );
|
||||
//if it gets the exact field value, there has been no translation (or not even translation loaded) - so no alias should be generated;
|
||||
if ( alias == aliasElem.attribute( QStringLiteral( "field" ) ) )
|
||||
alias.clear();
|
||||
}
|
||||
|
@ -24,6 +24,9 @@
|
||||
#include "qgssettings.h"
|
||||
#include <qgsmaplayer.h>
|
||||
#include <qgsvectorlayer.h>
|
||||
#include <qgslayertree.h>
|
||||
#include <qgslayertreegroup.h>
|
||||
#include "qgsrelationmanager.h"
|
||||
|
||||
class TestQgsTranslateProject : public QObject
|
||||
{
|
||||
@ -48,12 +51,11 @@ class TestQgsTranslateProject : public QObject
|
||||
|
||||
void TestQgsTranslateProject::initTestCase()
|
||||
{
|
||||
//start application in german
|
||||
//start application
|
||||
QgsApplication::init();
|
||||
QgsApplication::initQgis();
|
||||
|
||||
original_locale = settings.value( QStringLiteral( "locale/userLocale" ), "" ).toString() ;
|
||||
settings.setValue( QStringLiteral( "locale/userLocale" ), "de" );
|
||||
}
|
||||
|
||||
void TestQgsTranslateProject::cleanupTestCase()
|
||||
@ -76,10 +78,7 @@ void TestQgsTranslateProject::cleanupTestCase()
|
||||
|
||||
void TestQgsTranslateProject::init()
|
||||
{
|
||||
//open project
|
||||
QString projectFileName( TEST_DATA_DIR );
|
||||
projectFileName = projectFileName + "/project_translation/points_translation.qgs";
|
||||
QgsProject::instance()->read( projectFileName );
|
||||
//not needed
|
||||
}
|
||||
|
||||
void TestQgsTranslateProject::cleanup()
|
||||
@ -89,15 +88,18 @@ void TestQgsTranslateProject::cleanup()
|
||||
|
||||
void TestQgsTranslateProject::createTsFile()
|
||||
{
|
||||
//the base is points_translation_de.qgs and with german values
|
||||
//then we generate a ts file for spanish and the ts file with additional es postfix is created
|
||||
//open project in english
|
||||
settings.setValue( QStringLiteral( "locale/userLocale" ), "en" );
|
||||
QString projectFileName( TEST_DATA_DIR );
|
||||
projectFileName = projectFileName + "/project_translation/points_translation.qgs";
|
||||
QgsProject::instance()->read( projectFileName );
|
||||
|
||||
//create ts-file
|
||||
QgsProject::instance()->generateTsFile( "es" );
|
||||
//create ts file for german
|
||||
QgsProject::instance()->generateTsFile( "de" );
|
||||
|
||||
//check if tsfile is created
|
||||
//check if ts file is created
|
||||
QString tsFileName( TEST_DATA_DIR );
|
||||
tsFileName = tsFileName + "/project_translation/points_translation_de_es.ts";
|
||||
tsFileName = tsFileName + "/project_translation/points_translation_de.ts";
|
||||
QFile tsFile( tsFileName );
|
||||
QVERIFY( tsFile.exists() );
|
||||
|
||||
@ -105,46 +107,130 @@ void TestQgsTranslateProject::createTsFile()
|
||||
|
||||
QString tsFileContent( tsFile.readAll() );
|
||||
|
||||
//check if tsFile contains layer name Punkte
|
||||
QVERIFY( tsFileContent.contains( "<source>Punkte</source>" ) );
|
||||
//LAYER NAMES
|
||||
//lines
|
||||
QVERIFY( tsFileContent.contains( "<source>lines</source>" ) );
|
||||
//points
|
||||
QVERIFY( tsFileContent.contains( "<source>points</source>" ) );
|
||||
|
||||
//check if tsFile contains layer group name
|
||||
//LAYER GROUPS AND SUBGROUPS
|
||||
//Points:
|
||||
//Planes and Roads
|
||||
QVERIFY( tsFileContent.contains( "<source>Planes and Roads</source>" ) );
|
||||
//Little bit of nothing
|
||||
QVERIFY( tsFileContent.contains( "<source>Little bit of nothing</source>" ) );
|
||||
|
||||
//check if tsFile contains alias value
|
||||
//FIELDS AND ALIASES
|
||||
//Lines:
|
||||
//Name (Alias: Runwayid)
|
||||
QVERIFY( tsFileContent.contains( "<source>Runwayid</source>" ) );
|
||||
//Value (Alias: Name)
|
||||
QVERIFY( tsFileContent.contains( "<source>Name</source>" ) );
|
||||
|
||||
//check if tsFile contains field name
|
||||
// QVERIFY( tsFileContent.contains( "<source>klaso</source>" ) );
|
||||
//Points:
|
||||
//Class (Alias: Level)
|
||||
QVERIFY( tsFileContent.contains( "<source>Level</source>" ) );
|
||||
//Heading
|
||||
QVERIFY( tsFileContent.contains( "<source>Heading</source>" ) );
|
||||
//Importance
|
||||
QVERIFY( tsFileContent.contains( "<source>Importance</source>" ) );
|
||||
//Pilots
|
||||
QVERIFY( tsFileContent.contains( "<source>Pilots</source>" ) );
|
||||
//Cabin Crew
|
||||
QVERIFY( tsFileContent.contains( "<source>Cabin Crew</source>" ) );
|
||||
//Staff
|
||||
QVERIFY( tsFileContent.contains( "<source>Staff</source>" ) );
|
||||
|
||||
//check if tsFile contains relation name
|
||||
//FORMCONTAINERS
|
||||
//Plane
|
||||
QVERIFY( tsFileContent.contains( "<source>Plane</source>" ) );
|
||||
//Employees
|
||||
QVERIFY( tsFileContent.contains( "<source>Employees</source>" ) );
|
||||
//Flightattends
|
||||
QVERIFY( tsFileContent.contains( "<source>Flightattends</source>" ) );
|
||||
|
||||
//RELATIONS
|
||||
//Runway
|
||||
QVERIFY( tsFileContent.contains( "<source>Runway</source>" ) );
|
||||
//Sheepwalk
|
||||
QVERIFY( tsFileContent.contains( "<source>Sheepwalk</source>" ) );
|
||||
|
||||
tsFile.close();
|
||||
}
|
||||
|
||||
void TestQgsTranslateProject::translateProject()
|
||||
{
|
||||
//open project in german
|
||||
settings.setValue( QStringLiteral( "locale/userLocale" ), "de" );
|
||||
QString projectFileName( TEST_DATA_DIR );
|
||||
projectFileName = projectFileName + "/project_translation/points_translation.qgs";
|
||||
QgsProject::instance()->read( projectFileName );
|
||||
|
||||
//with the qm file containing translation from en to de, the project should be in german and renamed with postfix .de
|
||||
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" ) );
|
||||
//LAYER NAMES
|
||||
//lines -> Linien
|
||||
QCOMPARE( lines_layer->name(), QStringLiteral( "Linien" ) );
|
||||
//points -> Punkte
|
||||
QCOMPARE( points_layer->name(), QStringLiteral( "Punkte" ) );
|
||||
|
||||
//check if group name translated
|
||||
//LAYER GROUPS AND SUBGROUPS
|
||||
//Points:
|
||||
//Planes and Roads -> Flugzeuge und Strassen
|
||||
QVERIFY( QgsProject::instance()->layerTreeRoot()->findGroup( QStringLiteral( "Flugzeuge und Strassen" ) ) );
|
||||
//Little bit of nothing -> Bisschen nichts
|
||||
QVERIFY( QgsProject::instance()->layerTreeRoot()->findGroup( QStringLiteral( "Bisschen nichts" ) ) );
|
||||
|
||||
//check if second group name translated
|
||||
//FIELDS AND ALIASES
|
||||
//Lines:
|
||||
const QgsFields lines_fields = lines_layer->fields();
|
||||
//Name (Alias: Runwayid) -> Pistenid
|
||||
QCOMPARE( lines_fields.field( QStringLiteral( "Name" ) ).alias(), QStringLiteral( "Pistenid" ) );
|
||||
//Value (Alias: Name) -> Pistenname
|
||||
QCOMPARE( lines_fields.field( QStringLiteral( "Value" ) ).alias(), QStringLiteral( "Pistenname" ) );
|
||||
|
||||
//check if first alias value translated
|
||||
//Points:
|
||||
const QgsFields points_fields = points_layer->fields();
|
||||
//Class (Alias: Level) -> Klasse
|
||||
QCOMPARE( points_fields.field( QStringLiteral( "Class" ) ).alias(), QStringLiteral( "Klasse" ) );
|
||||
//Heading -> Titel
|
||||
QCOMPARE( points_fields.field( QStringLiteral( "Heading" ) ).alias(), QStringLiteral( "Titel" ) );
|
||||
//Importance -> Wichtigkeit
|
||||
QCOMPARE( points_fields.field( QStringLiteral( "Importance" ) ).alias(), QStringLiteral( "Wichtigkeit" ) );
|
||||
//Pilots -> Piloten
|
||||
QCOMPARE( points_fields.field( QStringLiteral( "Pilots" ) ).alias(), QStringLiteral( "Piloten" ) );
|
||||
//Cabin Crew -> Kabinenpersonal
|
||||
QCOMPARE( points_fields.field( QStringLiteral( "Cabin Crew" ) ).alias(), QStringLiteral( "Kabinenpersonal" ) );
|
||||
//Staff -> Mitarbeiter
|
||||
QCOMPARE( points_fields.field( QStringLiteral( "Staff" ) ).alias(), QStringLiteral( "Mitarbeiter" ) );
|
||||
|
||||
//check if second alias value translated
|
||||
//FORMCONTAINERS
|
||||
QList<QgsAttributeEditorElement *> elements = points_layer->editFormConfig().invisibleRootContainer()->children();
|
||||
QList<QgsAttributeEditorContainer *> containers;
|
||||
for ( QgsAttributeEditorElement *element : elements )
|
||||
{
|
||||
if ( element->type() == QgsAttributeEditorElement::AeTypeContainer )
|
||||
containers.append( dynamic_cast<QgsAttributeEditorContainer *>( element ) );
|
||||
}
|
||||
|
||||
//check if first field name translated to the alias
|
||||
//Plane -> Flugzeug
|
||||
QCOMPARE( containers.at( 0 )->name(), QStringLiteral( "Flugzeug" ) );
|
||||
//Employees -> Angestellte
|
||||
QCOMPARE( containers.at( 1 )->name(), QStringLiteral( "Angestellte" ) );
|
||||
//Flightattends -> Flugbegleitung
|
||||
for ( QgsAttributeEditorElement *element : containers.at( 1 )->children() )
|
||||
{
|
||||
if ( element->type() == QgsAttributeEditorElement::AeTypeContainer )
|
||||
QCOMPARE( element->name(), QStringLiteral( "Flugbegleitung" ) );
|
||||
}
|
||||
|
||||
//check if second field name translated to the alias
|
||||
|
||||
//check if first relation name translated
|
||||
|
||||
//check if second relation name translated
|
||||
//RELATIONS
|
||||
//Runway -> Piste
|
||||
QCOMPARE( QgsProject::instance()->relationManager()->relation( QStringLiteral( "points_240_Importance_lines_a677_Value" ) ).name(), QStringLiteral( "Piste" ) );
|
||||
//Sheepwalk -> Schafweide
|
||||
QCOMPARE( QgsProject::instance()->relationManager()->relation( QStringLiteral( "points_240_Importance_lines_a677_Value_1" ) ).name(), QStringLiteral( "Schafweide" ) );
|
||||
|
||||
QString deProjectFileName( TEST_DATA_DIR );
|
||||
deProjectFileName = deProjectFileName + "/project_translation/points_translation_de.qgs";
|
||||
|
@ -1,5 +1,5 @@
|
||||
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
|
||||
<qgis projectname="" version="3.1.0-Master">
|
||||
<qgis version="3.1.0-Master" projectname="">
|
||||
<homePath path=""/>
|
||||
<title></title>
|
||||
<autotransaction active="0"/>
|
||||
@ -19,29 +19,38 @@
|
||||
</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">
|
||||
<layer-tree-group expanded="1" name="Planes and Roads" checked="Qt::Checked">
|
||||
<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">
|
||||
<layer-tree-layer expanded="1" name="lines" id="lines_a677672a_bf5d_410d_98c9_d326a5719a1b" providerKey="ogr" checked="Qt::Checked" source="../lines.shp">
|
||||
<customproperties/>
|
||||
</layer-tree-layer>
|
||||
<layer-tree-layer expanded="0" name="points" id="points_240d6bd6_9203_470a_994a_aae13cd9fa04" providerKey="ogr" checked="Qt::Checked" source="../points.shp">
|
||||
<customproperties/>
|
||||
</layer-tree-layer>
|
||||
</layer-tree-group>
|
||||
<layer-tree-group expanded="1" name="Little bit of nothing" checked="Qt::Checked">
|
||||
<customproperties/>
|
||||
</layer-tree-layer>
|
||||
</layer-tree-group>
|
||||
<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">
|
||||
<snapping-settings mode="2" tolerance="0" unit="2" intersection-snapping="0" enabled="0" type="1">
|
||||
<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"/>
|
||||
<layer-setting tolerance="0" units="2" enabled="0" id="points_240d6bd6_9203_470a_994a_aae13cd9fa04" type="1"/>
|
||||
<layer-setting tolerance="0" units="2" enabled="0" id="lines_a677672a_bf5d_410d_98c9_d326a5719a1b" type="1"/>
|
||||
</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 referencedLayer="lines_a677672a_bf5d_410d_98c9_d326a5719a1b" strength="Association" name="Runway" id="points_240_Importance_lines_a677_Value" referencingLayer="points_240d6bd6_9203_470a_994a_aae13cd9fa04">
|
||||
<fieldRef referencingField="Importance" referencedField="Value"/>
|
||||
</relation>
|
||||
<relation referencedLayer="lines_a677672a_bf5d_410d_98c9_d326a5719a1b" strength="Association" name="Sheepwalk" id="points_240_Importance_lines_a677_Value_1" referencingLayer="points_240d6bd6_9203_470a_994a_aae13cd9fa04">
|
||||
<fieldRef referencingField="Importance" referencedField="Value"/>
|
||||
</relation>
|
||||
</relations>
|
||||
<mapcanvas name="theMapCanvas" annotationsVisible="1">
|
||||
<mapcanvas annotationsVisible="1" name="theMapCanvas">
|
||||
<units>degrees</units>
|
||||
<extent>
|
||||
<xmin>-119.77777777777767199</xmin>
|
||||
@ -65,20 +74,23 @@
|
||||
<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>
|
||||
<legendgroup open="true" name="Planes and Roads" checked="Qt::Checked">
|
||||
<legendlayer open="true" name="lines" drawingOrder="-1" checked="Qt::Checked" showFeatureCount="0">
|
||||
<filegroup open="true" hidden="false">
|
||||
<legendlayerfile visible="1" isInOverview="0" layerid="lines_a677672a_bf5d_410d_98c9_d326a5719a1b"/>
|
||||
</filegroup>
|
||||
</legendlayer>
|
||||
<legendlayer open="false" name="points" drawingOrder="-1" checked="Qt::Checked" showFeatureCount="0">
|
||||
<filegroup open="false" hidden="false">
|
||||
<legendlayerfile visible="1" isInOverview="0" layerid="points_240d6bd6_9203_470a_994a_aae13cd9fa04"/>
|
||||
</filegroup>
|
||||
</legendlayer>
|
||||
</legendgroup>
|
||||
<legendgroup open="true" name="Little bit of nothing" checked="Qt::Checked"/>
|
||||
</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">
|
||||
<maplayer autoRefreshTime="0" maxScale="1" readOnly="0" geometry="Line" labelsEnabled="0" simplifyDrawingTol="1" type="vector" hasScaleBasedVisibilityFlag="0" minScale="1e+8" refreshOnNotifyMessage="" autoRefreshEnabled="0" simplifyDrawingHints="1" simplifyAlgorithm="0" simplifyLocal="1" refreshOnNotifyEnabled="0" simplifyMaxScale="1">
|
||||
<extent>
|
||||
<xmin>-117.62319839219053108</xmin>
|
||||
<ymin>23.20820580488508966</ymin>
|
||||
@ -131,11 +143,11 @@
|
||||
<description></description>
|
||||
<projectionacronym></projectionacronym>
|
||||
<ellipsoidacronym></ellipsoidacronym>
|
||||
<geographicflag>true</geographicflag>
|
||||
<geographicflag>false</geographicflag>
|
||||
</spatialrefsys>
|
||||
</crs>
|
||||
<extent>
|
||||
<spatial crs="" maxz="0" maxy="0" minx="0" miny="0" dimensions="2" minz="0" maxx="0"/>
|
||||
<spatial dimensions="2" maxx="0" maxy="0" maxz="0" minx="0" minz="0" crs="" miny="0"/>
|
||||
<temporal>
|
||||
<period>
|
||||
<start></start>
|
||||
@ -154,14 +166,14 @@
|
||||
<map-layer-style name="default"/>
|
||||
</map-layer-style-manager>
|
||||
<auxiliaryLayer/>
|
||||
<renderer-v2 type="categorizedSymbol" symbollevels="0" forceraster="0" attr="Name" enableorderby="0">
|
||||
<renderer-v2 type="categorizedSymbol" forceraster="0" enableorderby="0" symbollevels="0" attr="Name">
|
||||
<categories>
|
||||
<category render="true" label="Arterial" value="Arterial" symbol="0"/>
|
||||
<category render="true" label="Highway" value="Highway" symbol="1"/>
|
||||
<category render="true" symbol="0" label="Arterial" value="Arterial"/>
|
||||
<category render="true" symbol="1" label="Highway" value="Highway"/>
|
||||
</categories>
|
||||
<symbols>
|
||||
<symbol alpha="1" type="line" name="0" clip_to_extent="1">
|
||||
<layer pass="0" enabled="1" class="SimpleLine" locked="0">
|
||||
<symbol name="0" type="line" clip_to_extent="1" alpha="1">
|
||||
<layer enabled="1" locked="0" pass="0" class="SimpleLine">
|
||||
<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"/>
|
||||
@ -179,15 +191,15 @@
|
||||
<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="name" type="QString" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
<Option name="type" type="QString" 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">
|
||||
<symbol name="1" type="line" clip_to_extent="1" alpha="1">
|
||||
<layer enabled="1" locked="0" pass="0" class="SimpleLine">
|
||||
<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"/>
|
||||
@ -205,9 +217,9 @@
|
||||
<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="name" type="QString" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
<Option name="type" type="QString" value="collection"/>
|
||||
</Option>
|
||||
</data_defined_properties>
|
||||
</layer>
|
||||
@ -225,17 +237,17 @@
|
||||
<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">
|
||||
<DiagramCategory opacity="1" penAlpha="255" enabled="0" labelPlacementMethod="XHeight" backgroundColor="#ffffff" diagramOrientation="Up" minimumSize="0" backgroundAlpha="255" scaleBasedVisibility="0" penColor="#000000" maxScaleDenominator="1e+8" lineSizeType="MM" height="15" penWidth="0" width="15" sizeType="MM" sizeScale="3x:0,0,0,0,0,0" scaleDependency="Area" rotationOffset="270" barWidth="5" minScaleDenominator="1" lineSizeScale="3x:0,0,0,0,0,0">
|
||||
<fontProperties description="Noto Sans,10,-1,5,50,0,0,0,0,0" style=""/>
|
||||
<attribute color="#000000" label="" field=""/>
|
||||
<attribute field="" color="#000000" label=""/>
|
||||
</DiagramCategory>
|
||||
</SingleCategoryDiagramRenderer>
|
||||
<DiagramLayerSettings dist="0" priority="0" showAll="1" obstacle="0" zIndex="0" placement="2" linePlacementFlags="2">
|
||||
<DiagramLayerSettings showAll="1" priority="0" zIndex="0" linePlacementFlags="2" dist="0" placement="2" obstacle="0">
|
||||
<properties>
|
||||
<Option type="Map">
|
||||
<Option type="QString" name="name" value=""/>
|
||||
<Option name="name" type="QString" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
<Option name="type" type="QString" value="collection"/>
|
||||
</Option>
|
||||
</properties>
|
||||
</DiagramLayerSettings>
|
||||
@ -243,44 +255,50 @@
|
||||
<field name="Name">
|
||||
<editWidget type="TextEdit">
|
||||
<config>
|
||||
<Option/>
|
||||
<Option type="Map">
|
||||
<Option name="IsMultiline" type="bool" value="false"/>
|
||||
<Option name="UseHtml" type="bool" value="false"/>
|
||||
</Option>
|
||||
</config>
|
||||
</editWidget>
|
||||
</field>
|
||||
<field name="Value">
|
||||
<editWidget type="TextEdit">
|
||||
<config>
|
||||
<Option/>
|
||||
<Option type="Map">
|
||||
<Option name="IsMultiline" type="bool" value="false"/>
|
||||
<Option name="UseHtml" type="bool" value="false"/>
|
||||
</Option>
|
||||
</config>
|
||||
</editWidget>
|
||||
</field>
|
||||
</fieldConfiguration>
|
||||
<aliases>
|
||||
<alias index="0" name="" field="Name"/>
|
||||
<alias index="1" name="" field="Value"/>
|
||||
<alias index="0" field="Name" name="Runwayid"/>
|
||||
<alias index="1" field="Value" name="Name"/>
|
||||
</aliases>
|
||||
<excludeAttributesWMS/>
|
||||
<excludeAttributesWFS/>
|
||||
<defaults>
|
||||
<default expression="" applyOnUpdate="0" field="Name"/>
|
||||
<default expression="" applyOnUpdate="0" field="Value"/>
|
||||
<default field="Name" expression="" applyOnUpdate="0"/>
|
||||
<default field="Value" expression="" applyOnUpdate="0"/>
|
||||
</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"/>
|
||||
<constraint field="Name" exp_strength="0" constraints="0" notnull_strength="0" unique_strength="0"/>
|
||||
<constraint field="Value" exp_strength="0" constraints="0" notnull_strength="0" unique_strength="0"/>
|
||||
</constraints>
|
||||
<constraintExpressions>
|
||||
<constraint desc="" exp="" field="Name"/>
|
||||
<constraint desc="" exp="" field="Value"/>
|
||||
<constraint field="Name" desc="" exp=""/>
|
||||
<constraint field="Value" desc="" exp=""/>
|
||||
</constraintExpressions>
|
||||
<attributeactions>
|
||||
<defaultAction key="Canvas" value="{00000000-0000-0000-0000-000000000000}"/>
|
||||
</attributeactions>
|
||||
<attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="0">
|
||||
<attributetableconfig sortExpression="" sortOrder="0" actionWidgetStyle="dropDown">
|
||||
<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"/>
|
||||
<column width="-1" name="Name" type="field" hidden="0"/>
|
||||
<column width="-1" name="Value" type="field" hidden="0"/>
|
||||
<column width="-1" type="actions" hidden="1"/>
|
||||
</columns>
|
||||
</attributetableconfig>
|
||||
<editform>.</editform>
|
||||
@ -317,7 +335,12 @@ def my_form_open(dialog, layer, feature):
|
||||
<widgets>
|
||||
<widget name="points_240_Importance_lines_a677_Value">
|
||||
<config type="Map">
|
||||
<Option type="QString" name="nm-rel" value=""/>
|
||||
<Option name="nm-rel" type="QString" value=""/>
|
||||
</config>
|
||||
</widget>
|
||||
<widget name="points_240_Importance_lines_a677_Value_1">
|
||||
<config type="Map">
|
||||
<Option name="nm-rel" type="QString" value=""/>
|
||||
</config>
|
||||
</widget>
|
||||
</widgets>
|
||||
@ -326,10 +349,10 @@ def my_form_open(dialog, layer, feature):
|
||||
<fieldstyles/>
|
||||
</conditionalstyles>
|
||||
<expressionfields/>
|
||||
<previewExpression>Name</previewExpression>
|
||||
<previewExpression>Value</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">
|
||||
<maplayer autoRefreshTime="0" maxScale="1" readOnly="0" geometry="Point" labelsEnabled="0" simplifyDrawingTol="1" type="vector" hasScaleBasedVisibilityFlag="0" minScale="1e+8" refreshOnNotifyMessage="" autoRefreshEnabled="0" simplifyDrawingHints="0" simplifyAlgorithm="0" simplifyLocal="1" refreshOnNotifyEnabled="0" simplifyMaxScale="1">
|
||||
<extent>
|
||||
<xmin>-118.88888888888877204</xmin>
|
||||
<ymin>22.80020703933767834</ymin>
|
||||
@ -386,7 +409,7 @@ def my_form_open(dialog, layer, feature):
|
||||
</spatialrefsys>
|
||||
</crs>
|
||||
<extent>
|
||||
<spatial crs="" maxz="0" maxy="0" minx="0" miny="0" dimensions="2" minz="0" maxx="0"/>
|
||||
<spatial dimensions="2" maxx="0" maxy="0" maxz="0" minx="0" minz="0" crs="" miny="0"/>
|
||||
<temporal>
|
||||
<period>
|
||||
<start></start>
|
||||
@ -405,15 +428,15 @@ def my_form_open(dialog, layer, feature):
|
||||
<map-layer-style name="default"/>
|
||||
</map-layer-style-manager>
|
||||
<auxiliaryLayer/>
|
||||
<renderer-v2 type="categorizedSymbol" symbollevels="0" forceraster="0" attr="Class" enableorderby="0">
|
||||
<renderer-v2 type="categorizedSymbol" forceraster="0" enableorderby="0" symbollevels="0" attr="Class">
|
||||
<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"/>
|
||||
<category render="true" symbol="0" label="B52" value="B52"/>
|
||||
<category render="true" symbol="1" label="Biplane" value="Biplane"/>
|
||||
<category render="true" symbol="2" label="Jet" value="Jet"/>
|
||||
</categories>
|
||||
<symbols>
|
||||
<symbol alpha="1" type="marker" name="0" clip_to_extent="1">
|
||||
<layer pass="0" enabled="1" class="SvgMarker" locked="0">
|
||||
<symbol name="0" type="marker" clip_to_extent="1" alpha="1">
|
||||
<layer enabled="1" locked="0" pass="0" class="SvgMarker">
|
||||
<prop k="angle" v="0"/>
|
||||
<prop k="color" v="0,0,0,255"/>
|
||||
<prop k="fixedAspectRatio" v="0"/>
|
||||
@ -433,15 +456,15 @@ def my_form_open(dialog, layer, feature):
|
||||
<prop k="vertical_anchor_point" v="1"/>
|
||||
<data_defined_properties>
|
||||
<Option type="Map">
|
||||
<Option type="QString" name="name" value=""/>
|
||||
<Option name="name" type="QString" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
<Option name="type" type="QString" 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">
|
||||
<symbol name="1" type="marker" clip_to_extent="1" alpha="1">
|
||||
<layer enabled="1" locked="0" pass="0" class="SvgMarker">
|
||||
<prop k="angle" v="0"/>
|
||||
<prop k="color" v="0,0,0,255"/>
|
||||
<prop k="fixedAspectRatio" v="0"/>
|
||||
@ -461,15 +484,15 @@ def my_form_open(dialog, layer, feature):
|
||||
<prop k="vertical_anchor_point" v="1"/>
|
||||
<data_defined_properties>
|
||||
<Option type="Map">
|
||||
<Option type="QString" name="name" value=""/>
|
||||
<Option name="name" type="QString" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
<Option name="type" type="QString" 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">
|
||||
<symbol name="2" type="marker" clip_to_extent="1" alpha="1">
|
||||
<layer enabled="1" locked="0" pass="0" class="SvgMarker">
|
||||
<prop k="angle" v="0"/>
|
||||
<prop k="color" v="0,0,0,255"/>
|
||||
<prop k="fixedAspectRatio" v="0"/>
|
||||
@ -489,9 +512,9 @@ def my_form_open(dialog, layer, feature):
|
||||
<prop k="vertical_anchor_point" v="1"/>
|
||||
<data_defined_properties>
|
||||
<Option type="Map">
|
||||
<Option type="QString" name="name" value=""/>
|
||||
<Option name="name" type="QString" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
<Option name="type" type="QString" value="collection"/>
|
||||
</Option>
|
||||
</data_defined_properties>
|
||||
</layer>
|
||||
@ -509,17 +532,17 @@ def my_form_open(dialog, layer, feature):
|
||||
<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">
|
||||
<DiagramCategory opacity="1" penAlpha="255" enabled="0" labelPlacementMethod="XHeight" backgroundColor="#ffffff" diagramOrientation="Up" minimumSize="0" backgroundAlpha="255" scaleBasedVisibility="0" penColor="#000000" maxScaleDenominator="1e+8" lineSizeType="MM" height="15" penWidth="0" width="15" sizeType="MM" sizeScale="3x:0,0,0,0,0,0" scaleDependency="Area" rotationOffset="270" barWidth="5" minScaleDenominator="1" lineSizeScale="3x:0,0,0,0,0,0">
|
||||
<fontProperties description="Noto Sans,10,-1,5,50,0,0,0,0,0" style=""/>
|
||||
<attribute color="#000000" label="" field=""/>
|
||||
<attribute field="" color="#000000" label=""/>
|
||||
</DiagramCategory>
|
||||
</SingleCategoryDiagramRenderer>
|
||||
<DiagramLayerSettings dist="0" priority="0" showAll="1" obstacle="0" zIndex="0" placement="0" linePlacementFlags="2">
|
||||
<DiagramLayerSettings showAll="1" priority="0" zIndex="0" linePlacementFlags="2" dist="0" placement="0" obstacle="0">
|
||||
<properties>
|
||||
<Option type="Map">
|
||||
<Option type="QString" name="name" value=""/>
|
||||
<Option name="name" type="QString" value=""/>
|
||||
<Option name="properties"/>
|
||||
<Option type="QString" name="type" value="collection"/>
|
||||
<Option name="type" type="QString" value="collection"/>
|
||||
</Option>
|
||||
</properties>
|
||||
</DiagramLayerSettings>
|
||||
@ -527,7 +550,10 @@ def my_form_open(dialog, layer, feature):
|
||||
<field name="Class">
|
||||
<editWidget type="TextEdit">
|
||||
<config>
|
||||
<Option/>
|
||||
<Option type="Map">
|
||||
<Option name="IsMultiline" type="bool" value="false"/>
|
||||
<Option name="UseHtml" type="bool" value="false"/>
|
||||
</Option>
|
||||
</config>
|
||||
</editWidget>
|
||||
</field>
|
||||
@ -568,51 +594,51 @@ def my_form_open(dialog, layer, feature):
|
||||
</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"/>
|
||||
<alias index="0" field="Class" name="Level"/>
|
||||
<alias index="1" field="Heading" name=""/>
|
||||
<alias index="2" field="Importance" name=""/>
|
||||
<alias index="3" field="Pilots" name=""/>
|
||||
<alias index="4" field="Cabin Crew" name=""/>
|
||||
<alias index="5" field="Staff" name=""/>
|
||||
</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"/>
|
||||
<default field="Class" expression="" applyOnUpdate="0"/>
|
||||
<default field="Heading" expression="" applyOnUpdate="0"/>
|
||||
<default field="Importance" expression="" applyOnUpdate="0"/>
|
||||
<default field="Pilots" expression="" applyOnUpdate="0"/>
|
||||
<default field="Cabin Crew" expression="" applyOnUpdate="0"/>
|
||||
<default field="Staff" expression="" applyOnUpdate="0"/>
|
||||
</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"/>
|
||||
<constraint field="Class" exp_strength="0" constraints="0" notnull_strength="0" unique_strength="0"/>
|
||||
<constraint field="Heading" exp_strength="0" constraints="0" notnull_strength="0" unique_strength="0"/>
|
||||
<constraint field="Importance" exp_strength="0" constraints="0" notnull_strength="0" unique_strength="0"/>
|
||||
<constraint field="Pilots" exp_strength="0" constraints="0" notnull_strength="0" unique_strength="0"/>
|
||||
<constraint field="Cabin Crew" exp_strength="0" constraints="0" notnull_strength="0" unique_strength="0"/>
|
||||
<constraint field="Staff" exp_strength="0" constraints="0" notnull_strength="0" unique_strength="0"/>
|
||||
</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"/>
|
||||
<constraint field="Class" desc="" exp=""/>
|
||||
<constraint field="Heading" desc="" exp=""/>
|
||||
<constraint field="Importance" desc="" exp=""/>
|
||||
<constraint field="Pilots" desc="" exp=""/>
|
||||
<constraint field="Cabin Crew" desc="" exp=""/>
|
||||
<constraint field="Staff" desc="" exp=""/>
|
||||
</constraintExpressions>
|
||||
<attributeactions>
|
||||
<defaultAction key="Canvas" value="{00000000-0000-0000-0000-000000000000}"/>
|
||||
</attributeactions>
|
||||
<attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="0">
|
||||
<attributetableconfig sortExpression="" sortOrder="0" actionWidgetStyle="dropDown">
|
||||
<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"/>
|
||||
<column width="-1" name="Class" type="field" hidden="0"/>
|
||||
<column width="-1" name="Heading" type="field" hidden="0"/>
|
||||
<column width="-1" name="Importance" type="field" hidden="0"/>
|
||||
<column width="-1" name="Pilots" type="field" hidden="0"/>
|
||||
<column width="-1" name="Cabin Crew" type="field" hidden="0"/>
|
||||
<column width="-1" name="Staff" type="field" hidden="0"/>
|
||||
<column width="-1" type="actions" hidden="1"/>
|
||||
</columns>
|
||||
</attributetableconfig>
|
||||
<editform>.</editform>
|
||||
@ -639,15 +665,17 @@ def my_form_open(dialog, layer, feature):
|
||||
<featformsuppress>0</featformsuppress>
|
||||
<editorlayout>tablayout</editorlayout>
|
||||
<attributeEditorForm>
|
||||
<attributeEditorContainer visibilityExpressionEnabled="0" name="Plane" showLabel="1" columnCount="1" visibilityExpression="" groupBox="0">
|
||||
<attributeEditorContainer name="Plane" groupBox="0" columnCount="1" visibilityExpressionEnabled="0" showLabel="1" visibilityExpression="">
|
||||
<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">
|
||||
<attributeEditorContainer name="Employees" groupBox="0" columnCount="1" visibilityExpressionEnabled="0" showLabel="1" visibilityExpression="">
|
||||
<attributeEditorField index="3" name="Pilots" showLabel="1"/>
|
||||
<attributeEditorField index="4" name="Cabin Crew" showLabel="1"/>
|
||||
<attributeEditorField index="5" name="Staff" showLabel="1"/>
|
||||
<attributeEditorContainer name="Flightattends" groupBox="1" columnCount="1" visibilityExpressionEnabled="0" showLabel="1" visibilityExpression="">
|
||||
<attributeEditorField index="4" name="Cabin Crew" showLabel="1"/>
|
||||
</attributeEditorContainer>
|
||||
</attributeEditorContainer>
|
||||
</attributeEditorForm>
|
||||
<editable>
|
||||
@ -681,94 +709,94 @@ def my_form_open(dialog, layer, feature):
|
||||
<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>
|
||||
<WMSAccessConstraints type="QString">None</WMSAccessConstraints>
|
||||
<WMSOnlineResource type="QString"></WMSOnlineResource>
|
||||
<WMSContactPerson type="QString"></WMSContactPerson>
|
||||
<DefaultStyles>
|
||||
<Fill type="QString"></Fill>
|
||||
<RandomColors type="bool">true</RandomColors>
|
||||
<Opacity type="double">1</Opacity>
|
||||
<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>
|
||||
<WMSServiceAbstract type="QString"></WMSServiceAbstract>
|
||||
<RequiredLayers>
|
||||
<Layers type="QStringList"/>
|
||||
</RequiredLayers>
|
||||
<WMSServiceCapabilities type="bool">false</WMSServiceCapabilities>
|
||||
<Identify>
|
||||
<disabledLayers type="QStringList"/>
|
||||
</Identify>
|
||||
<WMSUrl type="QString"></WMSUrl>
|
||||
<Macros>
|
||||
<pythonCode type="QString"></pythonCode>
|
||||
</Macros>
|
||||
<WMSImageQuality type="int">90</WMSImageQuality>
|
||||
<PAL>
|
||||
<DrawRectOnly type="bool">false</DrawRectOnly>
|
||||
<CandidatesPolygon type="int">30</CandidatesPolygon>
|
||||
<CandidatesPoint type="int">16</CandidatesPoint>
|
||||
<ShowingPartialsLabels type="bool">true</ShowingPartialsLabels>
|
||||
<SearchMethod type="int">0</SearchMethod>
|
||||
<ShowingAllLabels type="bool">false</ShowingAllLabels>
|
||||
<DrawOutlineLabels type="bool">true</DrawOutlineLabels>
|
||||
<ShowingCandidates type="bool">false</ShowingCandidates>
|
||||
<CandidatesLine type="int">50</CandidatesLine>
|
||||
</PAL>
|
||||
<Paths>
|
||||
<Absolute type="bool">false</Absolute>
|
||||
</Paths>
|
||||
<WMSPrecision type="QString">8</WMSPrecision>
|
||||
<WMSContactPosition type="QString"></WMSContactPosition>
|
||||
<WMSContactMail type="QString"></WMSContactMail>
|
||||
<WFSLayers type="QStringList"/>
|
||||
<WMSServiceTitle type="QString"></WMSServiceTitle>
|
||||
<Gui>
|
||||
<CanvasColorRedPart type="int">255</CanvasColorRedPart>
|
||||
<SelectionColorBluePart type="int">0</SelectionColorBluePart>
|
||||
<SelectionColorGreenPart type="int">255</SelectionColorGreenPart>
|
||||
<CanvasColorGreenPart type="int">255</CanvasColorGreenPart>
|
||||
<CanvasColorBluePart type="int">255</CanvasColorBluePart>
|
||||
<SelectionColorRedPart type="int">255</SelectionColorRedPart>
|
||||
<SelectionColorAlphaPart type="int">255</SelectionColorAlphaPart>
|
||||
</Gui>
|
||||
<WFSTLayers>
|
||||
<Insert type="QStringList"/>
|
||||
<Delete type="QStringList"/>
|
||||
<Update type="QStringList"/>
|
||||
<Delete type="QStringList"/>
|
||||
<Insert type="QStringList"/>
|
||||
</WFSTLayers>
|
||||
<WMSAccessConstraints type="QString">None</WMSAccessConstraints>
|
||||
<WMSKeywordList type="QStringList">
|
||||
<value></value>
|
||||
</WMSKeywordList>
|
||||
<WMSFees type="QString">conditions unknown</WMSFees>
|
||||
<WCSUrl type="QString"></WCSUrl>
|
||||
<Measure>
|
||||
<Ellipsoid type="QString">WGS84</Ellipsoid>
|
||||
</Measure>
|
||||
<WMSUseLayerIDs type="bool">false</WMSUseLayerIDs>
|
||||
<WMSSegmentizeFeatureInfoGeometry type="bool">false</WMSSegmentizeFeatureInfoGeometry>
|
||||
<Measurement>
|
||||
<AreaUnits type="QString">m2</AreaUnits>
|
||||
<DistanceUnits type="QString">meters</DistanceUnits>
|
||||
</Measurement>
|
||||
<SpatialRefSys>
|
||||
<ProjectionsEnabled type="int">1</ProjectionsEnabled>
|
||||
</SpatialRefSys>
|
||||
<WMSContactOrganization type="QString"></WMSContactOrganization>
|
||||
<WMSRequestDefinedDataSources type="bool">false</WMSRequestDefinedDataSources>
|
||||
<WMSUrl type="QString"></WMSUrl>
|
||||
<WMSAddWktGeometry type="bool">false</WMSAddWktGeometry>
|
||||
<WCSLayers type="QStringList"/>
|
||||
<PositionPrecision>
|
||||
<Automatic type="bool">true</Automatic>
|
||||
<DegreeFormat type="QString">MU</DegreeFormat>
|
||||
<DecimalPlaces type="int">2</DecimalPlaces>
|
||||
</PositionPrecision>
|
||||
<Legend>
|
||||
<filterByMap type="bool">false</filterByMap>
|
||||
</Legend>
|
||||
<WMSContactPhone type="QString"></WMSContactPhone>
|
||||
</properties>
|
||||
<visibility-presets/>
|
||||
<transformContext/>
|
||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user