[projects] Implement translation support for project and layer metadata

This commit is contained in:
Mathieu Pellerin 2025-09-12 16:44:05 +07:00
parent 05477e03aa
commit fd0cb2c37d
20 changed files with 127 additions and 37 deletions

View File

@ -27,7 +27,7 @@ try:
except (NameError, AttributeError):
pass
try:
QgsAbstractMetadataBase.__virtual_methods__ = ['readMetadataXml', 'writeMetadataXml', 'combine']
QgsAbstractMetadataBase.__virtual_methods__ = ['readMetadataXml', 'writeMetadataXml', 'combine', 'registerTranslations']
QgsAbstractMetadataBase.__abstract_methods__ = ['clone']
QgsAbstractMetadataBase.__group__ = ['metadata']
except (NameError, AttributeError):

View File

@ -14,7 +14,7 @@ try:
except (NameError, AttributeError):
pass
try:
QgsLayerMetadata.__overridden_methods__ = ['clone', 'readMetadataXml', 'writeMetadataXml', 'combine']
QgsLayerMetadata.__overridden_methods__ = ['clone', 'readMetadataXml', 'writeMetadataXml', 'combine', 'registerTranslations']
QgsLayerMetadata.__group__ = ['metadata']
except (NameError, AttributeError):
pass

View File

@ -1,6 +1,6 @@
# The following has been generated automatically from src/core/metadata/qgsprojectmetadata.h
try:
QgsProjectMetadata.__overridden_methods__ = ['clone', 'readMetadataXml', 'writeMetadataXml', 'combine']
QgsProjectMetadata.__overridden_methods__ = ['clone', 'readMetadataXml', 'writeMetadataXml', 'combine', 'registerTranslations']
QgsProjectMetadata.__group__ = ['metadata']
except (NameError, AttributeError):
pass

View File

@ -10,6 +10,7 @@
class QgsAbstractMetadataBase
{
%Docstring(signature="appended")
@ -436,7 +437,7 @@ Sets a date value for the specified date ``type``.
.. versionadded:: 3.30
%End
virtual bool readMetadataXml( const QDomElement &metadataElement );
virtual bool readMetadataXml( const QDomElement &metadataElement, const QgsReadWriteContext &context = QgsReadWriteContext() );
%Docstring
Sets state from DOM document.
@ -449,7 +450,7 @@ Subclasses which override this method should take care to also call the
base class method in order to read common metadata properties.
%End
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const;
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document, const QgsReadWriteContext &context = QgsReadWriteContext() ) const;
%Docstring
Stores state in a DOM node.
@ -472,6 +473,11 @@ Any existing values in this object will be overwritten by non-empty
values from ``other``.
.. versionadded:: 3.20
%End
virtual void registerTranslations( QgsTranslationContext *translationContext ) const;
%Docstring
Registers metadata translation strings
%End
protected:

View File

@ -282,12 +282,14 @@ Reads the metadata state from a ``layer``'s custom properties (see
.. seealso:: :py:func:`saveToLayer`
%End
virtual bool readMetadataXml( const QDomElement &metadataElement );
virtual bool readMetadataXml( const QDomElement &metadataElement, const QgsReadWriteContext &context = QgsReadWriteContext() );
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const;
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document, const QgsReadWriteContext &context = QgsReadWriteContext() ) const;
virtual void combine( const QgsAbstractMetadataBase *other );
virtual void registerTranslations( QgsTranslationContext *translationContext ) const;
bool operator==( const QgsLayerMetadata &metadataOther ) const;

View File

@ -77,12 +77,14 @@ Sets the project's creation date/timestamp.
.. seealso:: :py:func:`creationDateTime`
%End
virtual bool readMetadataXml( const QDomElement &metadataElement );
virtual bool readMetadataXml( const QDomElement &metadataElement, const QgsReadWriteContext &context = QgsReadWriteContext() );
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const;
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document, const QgsReadWriteContext &context = QgsReadWriteContext() ) const;
virtual void combine( const QgsAbstractMetadataBase *other );
virtual void registerTranslations( QgsTranslationContext *translationContext ) const;
bool operator==( const QgsProjectMetadata &metadataOther ) const;

View File

@ -27,7 +27,7 @@ try:
except (NameError, AttributeError):
pass
try:
QgsAbstractMetadataBase.__virtual_methods__ = ['readMetadataXml', 'writeMetadataXml', 'combine']
QgsAbstractMetadataBase.__virtual_methods__ = ['readMetadataXml', 'writeMetadataXml', 'combine', 'registerTranslations']
QgsAbstractMetadataBase.__abstract_methods__ = ['clone']
QgsAbstractMetadataBase.__group__ = ['metadata']
except (NameError, AttributeError):

View File

@ -14,7 +14,7 @@ try:
except (NameError, AttributeError):
pass
try:
QgsLayerMetadata.__overridden_methods__ = ['clone', 'readMetadataXml', 'writeMetadataXml', 'combine']
QgsLayerMetadata.__overridden_methods__ = ['clone', 'readMetadataXml', 'writeMetadataXml', 'combine', 'registerTranslations']
QgsLayerMetadata.__group__ = ['metadata']
except (NameError, AttributeError):
pass

View File

@ -1,6 +1,6 @@
# The following has been generated automatically from src/core/metadata/qgsprojectmetadata.h
try:
QgsProjectMetadata.__overridden_methods__ = ['clone', 'readMetadataXml', 'writeMetadataXml', 'combine']
QgsProjectMetadata.__overridden_methods__ = ['clone', 'readMetadataXml', 'writeMetadataXml', 'combine', 'registerTranslations']
QgsProjectMetadata.__group__ = ['metadata']
except (NameError, AttributeError):
pass

View File

@ -10,6 +10,7 @@
class QgsAbstractMetadataBase
{
%Docstring(signature="appended")
@ -436,7 +437,7 @@ Sets a date value for the specified date ``type``.
.. versionadded:: 3.30
%End
virtual bool readMetadataXml( const QDomElement &metadataElement );
virtual bool readMetadataXml( const QDomElement &metadataElement, const QgsReadWriteContext &context = QgsReadWriteContext() );
%Docstring
Sets state from DOM document.
@ -449,7 +450,7 @@ Subclasses which override this method should take care to also call the
base class method in order to read common metadata properties.
%End
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const;
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document, const QgsReadWriteContext &context = QgsReadWriteContext() ) const;
%Docstring
Stores state in a DOM node.
@ -472,6 +473,11 @@ Any existing values in this object will be overwritten by non-empty
values from ``other``.
.. versionadded:: 3.20
%End
virtual void registerTranslations( QgsTranslationContext *translationContext ) const;
%Docstring
Registers metadata translation strings
%End
protected:

View File

@ -282,12 +282,14 @@ Reads the metadata state from a ``layer``'s custom properties (see
.. seealso:: :py:func:`saveToLayer`
%End
virtual bool readMetadataXml( const QDomElement &metadataElement );
virtual bool readMetadataXml( const QDomElement &metadataElement, const QgsReadWriteContext &context = QgsReadWriteContext() );
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const;
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document, const QgsReadWriteContext &context = QgsReadWriteContext() ) const;
virtual void combine( const QgsAbstractMetadataBase *other );
virtual void registerTranslations( QgsTranslationContext *translationContext ) const;
bool operator==( const QgsLayerMetadata &metadataOther ) const;

View File

@ -77,12 +77,14 @@ Sets the project's creation date/timestamp.
.. seealso:: :py:func:`creationDateTime`
%End
virtual bool readMetadataXml( const QDomElement &metadataElement );
virtual bool readMetadataXml( const QDomElement &metadataElement, const QgsReadWriteContext &context = QgsReadWriteContext() );
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const;
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document, const QgsReadWriteContext &context = QgsReadWriteContext() ) const;
virtual void combine( const QgsAbstractMetadataBase *other );
virtual void registerTranslations( QgsTranslationContext *translationContext ) const;
bool operator==( const QgsProjectMetadata &metadataOther ) const;

View File

@ -17,6 +17,7 @@
#include "qgsabstractmetadatabase.h"
#include "qgsmaplayer.h"
#include "qgstranslationcontext.h"
QString QgsAbstractMetadataBase::identifier() const
{
@ -183,7 +184,7 @@ void QgsAbstractMetadataBase::setLanguage( const QString &language )
mLanguage = language;
}
bool QgsAbstractMetadataBase::readMetadataXml( const QDomElement &metadataElement )
bool QgsAbstractMetadataBase::readMetadataXml( const QDomElement &metadataElement, const QgsReadWriteContext &context )
{
QDomNode mnl;
QDomElement mne;
@ -212,6 +213,13 @@ bool QgsAbstractMetadataBase::readMetadataXml( const QDomElement &metadataElemen
mnl = metadataElement.namedItem( QStringLiteral( "abstract" ) );
mAbstract = mnl.toElement().text();
if ( context.projectTranslator() )
{
mType = context.projectTranslator()->translate( "metadata", mType );
mTitle = context.projectTranslator()->translate( "metadata", mTitle );
mAbstract = context.projectTranslator()->translate( "metadata", mAbstract );
}
// set keywords
const QDomNodeList keywords = metadataElement.elementsByTagName( QStringLiteral( "keywords" ) );
mKeywords.clear();
@ -315,7 +323,7 @@ bool QgsAbstractMetadataBase::readMetadataXml( const QDomElement &metadataElemen
return true;
}
bool QgsAbstractMetadataBase::writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const
bool QgsAbstractMetadataBase::writeMetadataXml( QDomElement &metadataElement, QDomDocument &document, const QgsReadWriteContext & ) const
{
// identifier
QDomElement identifier = document.createElement( QStringLiteral( "identifier" ) );
@ -481,6 +489,22 @@ bool QgsAbstractMetadataBase::writeMetadataXml( QDomElement &metadataElement, QD
return true;
}
void QgsAbstractMetadataBase::registerTranslations( QgsTranslationContext *translationContext ) const
{
if ( !mTitle.isEmpty() )
{
translationContext->registerTranslation( QStringLiteral( "metadata" ), mTitle );
}
if ( !mType.isEmpty() )
{
translationContext->registerTranslation( QStringLiteral( "metadata" ), mType );
}
if ( !mAbstract.isEmpty() )
{
translationContext->registerTranslation( QStringLiteral( "metadata" ), mAbstract );
}
}
void QgsAbstractMetadataBase::combine( const QgsAbstractMetadataBase *other )
{
if ( !other )

View File

@ -21,12 +21,15 @@
#include "qgis_sip.h"
#include "qgis_core.h"
#include "qgis.h"
#include "qgsreadwritecontext.h"
#include <QMap>
#include <QString>
#include <QMetaType>
class QDomElement;
class QDomDocument;
class QgsTranslationContext;
/**
* \ingroup core
@ -529,7 +532,7 @@ class CORE_EXPORT QgsAbstractMetadataBase
* Subclasses which override this method should take care to also call the base
* class method in order to read common metadata properties.
*/
virtual bool readMetadataXml( const QDomElement &metadataElement );
virtual bool readMetadataXml( const QDomElement &metadataElement, const QgsReadWriteContext &context = QgsReadWriteContext() );
/**
* Stores state in a DOM node.
@ -542,7 +545,7 @@ class CORE_EXPORT QgsAbstractMetadataBase
* Subclasses which override this method should take care to also call the base
* class method in order to write common metadata properties.
*/
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const;
virtual bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document, const QgsReadWriteContext &context = QgsReadWriteContext() ) const;
/**
* Combines the metadata from this object with the metadata from an \a other object.
@ -553,6 +556,11 @@ class CORE_EXPORT QgsAbstractMetadataBase
*/
virtual void combine( const QgsAbstractMetadataBase *other );
/**
* Registers metadata translation strings
*/
virtual void registerTranslations( QgsTranslationContext *translationContext ) const;
protected:
/**

View File

@ -17,6 +17,8 @@
#include "qgslayermetadata.h"
#include "qgsmaplayer.h"
#include "qgstranslationcontext.h"
#include <QRegularExpression>
QgsLayerMetadata *QgsLayerMetadata::clone() const
@ -132,9 +134,9 @@ void QgsLayerMetadata::readFromLayer( const QgsMapLayer *layer )
mLinks = layer->customProperty( QStringLiteral( "metadata/links" ) ).value<QgsAbstractMetadataBase::LinkList>();
}
bool QgsLayerMetadata::readMetadataXml( const QDomElement &metadataElement )
bool QgsLayerMetadata::readMetadataXml( const QDomElement &metadataElement, const QgsReadWriteContext &context )
{
QgsAbstractMetadataBase::readMetadataXml( metadataElement );
QgsAbstractMetadataBase::readMetadataXml( metadataElement, context );
QDomNode mnl;
QDomElement mne;
@ -160,6 +162,11 @@ bool QgsLayerMetadata::readMetadataXml( const QDomElement &metadataElement )
{
mnl = rightsNodeList.at( i );
mne = mnl.toElement();
QString right = mne.text();
if ( context.projectTranslator() )
{
right = context.projectTranslator()->translate( "metadata", right );
}
rightsList.append( mne.text() );
}
setRights( rightsList );
@ -240,9 +247,9 @@ bool QgsLayerMetadata::readMetadataXml( const QDomElement &metadataElement )
return true;
}
bool QgsLayerMetadata::writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const
bool QgsLayerMetadata::writeMetadataXml( QDomElement &metadataElement, QDomDocument &document, const QgsReadWriteContext &context ) const
{
QgsAbstractMetadataBase::writeMetadataXml( metadataElement, document );
QgsAbstractMetadataBase::writeMetadataXml( metadataElement, document, context );
// fees
QDomElement fees = document.createElement( QStringLiteral( "fees" ) );
@ -342,6 +349,16 @@ bool QgsLayerMetadata::writeMetadataXml( QDomElement &metadataElement, QDomDocum
return true;
}
void QgsLayerMetadata::registerTranslations( QgsTranslationContext *translationContext ) const
{
QgsAbstractMetadataBase::registerTranslations( translationContext );
for ( const QString &right : std::as_const( mRights ) )
{
translationContext->registerTranslation( QStringLiteral( "metadata" ), right );
}
}
void QgsLayerMetadata::combine( const QgsAbstractMetadataBase *other )
{
QgsAbstractMetadataBase::combine( other );

View File

@ -313,9 +313,10 @@ class CORE_EXPORT QgsLayerMetadata : public QgsAbstractMetadataBase
*/
void readFromLayer( const QgsMapLayer *layer );
bool readMetadataXml( const QDomElement &metadataElement ) override;
bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const override;
bool readMetadataXml( const QDomElement &metadataElement, const QgsReadWriteContext &context = QgsReadWriteContext() ) override;
bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document, const QgsReadWriteContext &context = QgsReadWriteContext() ) const override;
void combine( const QgsAbstractMetadataBase *other ) override;
void registerTranslations( QgsTranslationContext *translationContext ) const override;
bool operator==( const QgsLayerMetadata &metadataOther ) const;

View File

@ -16,12 +16,14 @@
***************************************************************************/
#include "qgsprojectmetadata.h"
#include "qgstranslationcontext.h"
#include <QDomNode>
#include <QDomDocument>
bool QgsProjectMetadata::readMetadataXml( const QDomElement &metadataElement )
bool QgsProjectMetadata::readMetadataXml( const QDomElement &metadataElement, const QgsReadWriteContext &context )
{
QgsAbstractMetadataBase::readMetadataXml( metadataElement );
QgsAbstractMetadataBase::readMetadataXml( metadataElement, context );
QDomNode mnl;
@ -29,6 +31,11 @@ bool QgsProjectMetadata::readMetadataXml( const QDomElement &metadataElement )
mnl = metadataElement.namedItem( QStringLiteral( "author" ) );
mAuthor = mnl.toElement().text();
if ( context.projectTranslator() )
{
mAuthor = context.projectTranslator()->translate( "metadata", mAuthor );
}
if ( !mDates.contains( Qgis::MetadataDateType::Created ) )
{
// creation datetime -- old format
@ -40,9 +47,9 @@ bool QgsProjectMetadata::readMetadataXml( const QDomElement &metadataElement )
return true;
}
bool QgsProjectMetadata::writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const
bool QgsProjectMetadata::writeMetadataXml( QDomElement &metadataElement, QDomDocument &document, const QgsReadWriteContext &context ) const
{
QgsAbstractMetadataBase::writeMetadataXml( metadataElement, document );
QgsAbstractMetadataBase::writeMetadataXml( metadataElement, document, context );
// author
QDomElement author = document.createElement( QStringLiteral( "author" ) );
@ -59,6 +66,13 @@ bool QgsProjectMetadata::writeMetadataXml( QDomElement &metadataElement, QDomDoc
return true;
}
void QgsProjectMetadata::registerTranslations( QgsTranslationContext *translationContext ) const
{
QgsAbstractMetadataBase::registerTranslations( translationContext );
translationContext->registerTranslation( QStringLiteral( "metadata" ), mAuthor );
}
void QgsProjectMetadata::combine( const QgsAbstractMetadataBase *other )
{
QgsAbstractMetadataBase::combine( other );

View File

@ -82,9 +82,10 @@ class CORE_EXPORT QgsProjectMetadata : public QgsAbstractMetadataBase
*/
void setCreationDateTime( const QDateTime &creationDateTime );
bool readMetadataXml( const QDomElement &metadataElement ) override;
bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const override;
bool readMetadataXml( const QDomElement &metadataElement, const QgsReadWriteContext &context = QgsReadWriteContext() ) override;
bool writeMetadataXml( QDomElement &metadataElement, QDomDocument &document, const QgsReadWriteContext &context = QgsReadWriteContext() ) const override;
void combine( const QgsAbstractMetadataBase *other ) override;
void registerTranslations( QgsTranslationContext *translationContext ) const override;
bool operator==( const QgsProjectMetadata &metadataOther ) const;

View File

@ -685,6 +685,9 @@ void QgsProject::registerTranslatableObjects( QgsTranslationContext *translation
registerTranslatableContainers( translationContext, vlayer->editFormConfig().invisibleRootContainer(), vlayer->id() );
}
//register metadata
mapLayer->metadata().registerTranslations( translationContext );
}
//register layergroups
@ -700,6 +703,9 @@ void QgsProject::registerTranslatableObjects( QgsTranslationContext *translation
{
translationContext->registerTranslation( QStringLiteral( "project:relations" ), relation.name() );
}
//register metadata
mMetadata.registerTranslations( translationContext );
}
void QgsProject::setDataDefinedServerProperties( const QgsPropertyCollection &properties )
@ -2306,7 +2312,7 @@ bool QgsProject::readProjectFile( const QString &filename, Qgis::ProjectReadFlag
if ( !element.isNull() )
{
mMetadata.readMetadataXml( element );
mMetadata.readMetadataXml( element, context );
}
else
{
@ -2670,7 +2676,6 @@ bool QgsProject::readProjectFile( const QString &filename, Qgis::ProjectReadFlag
if ( write() )
{
setTitle( localeFileName );
QgsMessageLog::logMessage( tr( "Translated project saved with locale prefix %1" ).arg( newFileName ), QObject::tr( "Project translation" ), Qgis::MessageLevel::Success );
}
else

View File

@ -687,7 +687,7 @@ bool QgsMapLayer::readLayerXml( const QDomElement &layerElement, QgsReadWriteCon
// mMetadata.readFromLayer( this );
const QDomElement metadataElem = layerElement.firstChildElement( QStringLiteral( "resourceMetadata" ) );
mMetadata.readMetadataXml( metadataElem );
mMetadata.readMetadataXml( metadataElem, context );
setAutoRefreshInterval( layerElement.attribute( QStringLiteral( "autoRefreshTime" ), QStringLiteral( "0" ) ).toInt() );
if ( layerElement.hasAttribute( QStringLiteral( "autoRefreshMode" ) ) )