Skip to content

Commit

Permalink
BUG: Mark translatable strings in DICOM/Core
Browse files Browse the repository at this point in the history
  • Loading branch information
mhdiop authored and lassoan committed Mar 22, 2023
1 parent e6d44f8 commit c819ae7
Show file tree
Hide file tree
Showing 8 changed files with 189 additions and 146 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@

//------------------------------------------------------------------------------
ctkDICOMDisplayedFieldGeneratorRadiotherapySeriesDescriptionRule::ctkDICOMDisplayedFieldGeneratorRadiotherapySeriesDescriptionRule()
: EmptySeriesDescriptionRtPlan("Unnamed RT Plan")
, EmptySeriesDescriptionRtStruct("Unnamed RT Structure Set")
, EmptySeriesDescriptionRtImage("Unnamed RT Image")
: EmptySeriesDescriptionRtPlan(tr("Unnamed RT Plan"))
, EmptySeriesDescriptionRtStruct(tr("Unnamed RT Structure Set"))
, EmptySeriesDescriptionRtImage(tr("Unnamed RT Image"))
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#define __ctkDICOMDisplayedFieldGeneratorRadiotherapySeriesDescriptionRule_h

// Qt includes
#include <QCoreApplication.h>
#include <QStringList>

#include "ctkDICOMDisplayedFieldGeneratorAbstractRule.h"
Expand All @@ -31,6 +32,8 @@
/// Special rule for generating series description displayed fields for different RT modalities
class CTK_DICOM_CORE_EXPORT ctkDICOMDisplayedFieldGeneratorRadiotherapySeriesDescriptionRule : public ctkDICOMDisplayedFieldGeneratorAbstractRule
{
Q_DECLARE_TR_FUNCTIONS(ctkDICOMDisplayedFieldGeneratorRadiotherapySeriesDescriptionRule)

public:
/// Constructor
explicit ctkDICOMDisplayedFieldGeneratorRadiotherapySeriesDescriptionRule();
Expand Down
54 changes: 39 additions & 15 deletions Libs/DICOM/Core/ctkDICOMIndexer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ void ctkDICOMIndexerPrivateWorker::start()

do
{
emit progressStep("Parsing DICOM files");
emit progressStep(ctkDICOMIndexer::tr("Parsing DICOM files"));
emit progress(0);
// Make a local copy to avoid the need of frequent locking
this->RequestQueue->modifiedTimeForFilepath(this->ModifiedTimeForFilepath);
Expand All @@ -128,7 +128,7 @@ void ctkDICOMIndexerPrivateWorker::start()
timeProbe.start();

// Update displayed fields according to inserted DICOM datasets
emit progressStep("Updating database displayed fields");
emit progressStep(ctkDICOMIndexer::tr("Updating database displayed fields"));
emit progress(this->TimePercentageIndexing);

database.updateDisplayedFields();
Expand All @@ -149,7 +149,7 @@ void ctkDICOMIndexerPrivateWorker::start()

this->RequestQueue->setIndexing(false);
emit progress(100);
emit progressStep("Indexing complete");
emit progressStep(ctkDICOMIndexer::tr("Indexing complete"));
emit indexingComplete(patientsCountAfter - patientsCountBefore, studiesCountAfter-studiesCountBefore,
seriesCountAfter-seriesCountBefore, imagesCountAfter - imagesCountBefore);
}
Expand Down Expand Up @@ -217,9 +217,9 @@ void ctkDICOMIndexerPrivateWorker::processIndexingRequest(DICOMIndexingQueue::In
int resultsCount = this->RequestQueue->pushIndexingResult(indexingResult);
if (resultsCount >= REQUEST_RESULTS_CACHE_MAXIMUM_SIZE)
{
emit progressStep("Updating database fields");
emit progressStep(ctkDICOMIndexer::tr("Updating database fields"));
this->writeIndexingResultsToDatabase(database);
emit progressStep("Parsing DICOM files");
emit progressStep(ctkDICOMIndexer::tr("Parsing DICOM files"));
}
}
else
Expand All @@ -235,15 +235,18 @@ void ctkDICOMIndexerPrivateWorker::processIndexingRequest(DICOMIndexingQueue::In

if (alreadyAddedFileCount > 0)
{
logger.debug(QString("Skipped %1 files that were already in the database: %2...").arg(
alreadyAddedFileCount).arg(alreadyAddedFiles.join(", ")));
logger.debug(
QString("Skipped %1 files that were already in the database: %2...")
.arg(alreadyAddedFileCount)
.arg(alreadyAddedFiles.join(", "))
);
}

if (this->RequestQueue->isIndexingRequestsEmpty())
{
emit progressStep("Updating database fields");
emit progressStep(ctkDICOMIndexer::tr("Updating database fields"));
this->writeIndexingResultsToDatabase(database);
emit progressStep("Parsing DICOM files");
emit progressStep(ctkDICOMIndexer::tr("Parsing DICOM files"));
}

float elapsedTimeInSeconds = timeProbe.elapsed() / 1000.0;
Expand Down Expand Up @@ -560,7 +563,11 @@ bool ctkDICOMIndexer::addDicomdir(const QString& directoryName, bool copyFile/*=
logger.debug( "Reading new Patient:" );
if (patientRecord->findAndGetOFString(DCM_PatientName, patientsName).bad())
{
logger.warn( "DICOMDIR file at "+directoryName+" is invalid: patient name not found. All records belonging to this patient will be ignored.");
logger.warn(
QString("DICOMDIR file at %1 is invalid: patient name not found. "
"All records belonging to this patient will be ignored.")
.arg(directoryName)
);
success = false;
continue;
}
Expand All @@ -570,7 +577,12 @@ bool ctkDICOMIndexer::addDicomdir(const QString& directoryName, bool copyFile/*=
logger.debug( "Reading new Study:" );
if (studyRecord->findAndGetOFString(DCM_StudyInstanceUID, studyInstanceUID).bad())
{
logger.warn( "DICOMDIR file at "+directoryName+" is invalid: study instance UID not found for patient "+ QString(patientsName.c_str())+". All records belonging to this study will be ignored.");
logger.warn(
QString("DICOMDIR file at %1 is invalid: study instance UID not found for patient %2. "
"All records belonging to this study will be ignored.")
.arg(directoryName)
.arg(patientsName.c_str())
);
success = false;
continue;
}
Expand All @@ -581,7 +593,13 @@ bool ctkDICOMIndexer::addDicomdir(const QString& directoryName, bool copyFile/*=
logger.debug( "Reading new Series:" );
if (seriesRecord->findAndGetOFString(DCM_SeriesInstanceUID, seriesInstanceUID).bad())
{
logger.warn( "DICOMDIR file at "+directoryName+" is invalid: series instance UID not found for patient "+ QString(patientsName.c_str())+", study "+ QString(studyInstanceUID.c_str())+". All records belonging to this series will be ignored.");
logger.warn(
QString("DICOMDIR file at %1 is invalid: series instance UID not found for patient %2, study %3. "
"All records belonging to this series will be ignored.")
.arg(directoryName)
.arg(patientsName.c_str())
.arg(studyInstanceUID.c_str())
);
success = false;
continue;
}
Expand All @@ -592,9 +610,15 @@ bool ctkDICOMIndexer::addDicomdir(const QString& directoryName, bool copyFile/*=
if (fileRecord->findAndGetOFStringArray(DCM_ReferencedSOPInstanceUIDInFile, sopInstanceUID).bad()
|| fileRecord->findAndGetOFStringArray(DCM_ReferencedFileID,referencedFileName).bad())
{
logger.warn( "DICOMDIR file at "+directoryName+" is invalid: referenced SOP instance UID or file name is invalid for patient "
+ QString(patientsName.c_str())+", study "+ QString(studyInstanceUID.c_str())+", series "+ QString(seriesInstanceUID.c_str())+
". This file will be ignored.");
logger.warn(
QString("DICOMDIR file at %1 is invalid: "
"referenced SOP instance UID or file name is invalid for patient %2, study %3, series %4. "
"This file will be ignored.")
.arg(directoryName)
.arg(patientsName.c_str())
.arg(studyInstanceUID.c_str())
.arg(seriesInstanceUID.c_str())
);
success = false;
continue;
}
Expand Down
155 changes: 80 additions & 75 deletions Libs/DICOM/Core/ctkDICOMItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -848,14 +848,14 @@ QString ctkDICOMItem::TranslateDefinedTermPatientPosition( const QString& dt )
static QMap<QString, QString> descriptionOfTerms;
if (!initialized)
{
descriptionOfTerms.insert("HFP", "Head First - Prone");
descriptionOfTerms.insert("HFDR", "Head First - Decubitus Right");
descriptionOfTerms.insert("FFDR", "Feet First - Decubitus Right");
descriptionOfTerms.insert("FFP", "Feet First - Prone");
descriptionOfTerms.insert("HFS", "Head First - Supine");
descriptionOfTerms.insert("HFDL", "Head First - Decubitus Left");
descriptionOfTerms.insert("FFDL", "Feet First - Decubitus Left");
descriptionOfTerms.insert("FFS", "Feet First - Supine");
descriptionOfTerms.insert("HFP", tr("Head First - Prone"));
descriptionOfTerms.insert("HFDR", tr("Head First - Decubitus Right"));
descriptionOfTerms.insert("FFDR", tr("Feet First - Decubitus Right"));
descriptionOfTerms.insert("FFP", tr("Feet First - Prone"));
descriptionOfTerms.insert("HFS", tr("Head First - Supine"));
descriptionOfTerms.insert("HFDL", tr("Head First - Decubitus Left"));
descriptionOfTerms.insert("FFDL", tr("Feet First - Decubitus Left"));
descriptionOfTerms.insert("FFS", tr("Feet First - Supine"));
initialized = true;
}

Expand All @@ -876,72 +876,72 @@ QString ctkDICOMItem::TranslateDefinedTermModality( const QString& dt )
static QMap<QString, QString> descriptionOfTerms;
if (!initialized)
{
descriptionOfTerms.insert("CR", "Computed Radiography");
descriptionOfTerms.insert("CT", "Computed Tomography");
descriptionOfTerms.insert("MR", "Magnetic Resonance");
descriptionOfTerms.insert("NM", "Nuclear Medicine");
descriptionOfTerms.insert("US", "Ultrasound");
descriptionOfTerms.insert("OT", "Other");
descriptionOfTerms.insert("BI", "Biomagnetic imaging");
descriptionOfTerms.insert("CD", "Color flow Doppler");
descriptionOfTerms.insert("DD", "Duplex Doppler");
descriptionOfTerms.insert("ES", "Endoscopy");
descriptionOfTerms.insert("LS", "Laser surface scan");
descriptionOfTerms.insert("PT", "Positron emission tomography (PET)");
descriptionOfTerms.insert("RG", "Radiographic imaging (conventional film/screen)");
descriptionOfTerms.insert("ST", "Single-photon emission computed tomograpy (SPECT)");
descriptionOfTerms.insert("TG", "Thermography");
descriptionOfTerms.insert("XA", "X-Ray Aniography");
descriptionOfTerms.insert("RF", "Radio Fluoroscopy");
descriptionOfTerms.insert("RTIMAGE", "Radiotherapy Image");
descriptionOfTerms.insert("RTDOSE", "Radiotherapy Dose");
descriptionOfTerms.insert("RTSTRUCT", "Radiotherapy Structure Set");
descriptionOfTerms.insert("RTPLAN", "Radiotherapy Plan");
descriptionOfTerms.insert("RTRECORD", "RT Treatment Record");
descriptionOfTerms.insert("HC", "Hard Copy");
descriptionOfTerms.insert("DX", "Digital Radiography");
descriptionOfTerms.insert("MG", "Mammography");
descriptionOfTerms.insert("IO", "Intra-oral Radiography");
descriptionOfTerms.insert("PX", "Panoramic X-Ray");
descriptionOfTerms.insert("GM", "General Microscopy");
descriptionOfTerms.insert("SM", "Slide Microscopy");
descriptionOfTerms.insert("XC", "External-camera Photography");
descriptionOfTerms.insert("PR", "Presentation state");
descriptionOfTerms.insert("AU", "Audio");
descriptionOfTerms.insert("ECG", "Electrocardiography");
descriptionOfTerms.insert("EPS", "Cardiac Electrophysiology");
descriptionOfTerms.insert("HD", "Hemodynamic Waveform");
descriptionOfTerms.insert("SR", "SR Document");
descriptionOfTerms.insert("IVUS", "Intravascular Ultrasound");
descriptionOfTerms.insert("OP", "Ophthalmic Photography");
descriptionOfTerms.insert("SMR", "Stereometric Relationship");
descriptionOfTerms.insert("OCT", "Optical Coherence Tomography (non-Ophthalmic)");
descriptionOfTerms.insert("OPR", "Ophthalmic Refraction");
descriptionOfTerms.insert("OPV", "Ophthalmic Visual Field");
descriptionOfTerms.insert("OPM", "Ophthalmic Mapping");
descriptionOfTerms.insert("KO", "Key Object Selection");
descriptionOfTerms.insert("SEG", "Segmentation");
descriptionOfTerms.insert("REG", "Registration");
descriptionOfTerms.insert("OPT", "Ophthalmic Tomography");
descriptionOfTerms.insert("BDUS", "Bone Densitometry (ultrasound)");
descriptionOfTerms.insert("BMD", "Bone Densitometry (X-Ray)");
descriptionOfTerms.insert("DOC", "Document");
descriptionOfTerms.insert("CR", tr("Computed Radiography"));
descriptionOfTerms.insert("CT", tr("Computed Tomography"));
descriptionOfTerms.insert("MR", tr("Magnetic Resonance"));
descriptionOfTerms.insert("NM", tr("Nuclear Medicine"));
descriptionOfTerms.insert("US", tr("Ultrasound"));
descriptionOfTerms.insert("OT", tr("Other"));
descriptionOfTerms.insert("BI", tr("Biomagnetic imaging"));
descriptionOfTerms.insert("CD", tr("Color flow Doppler"));
descriptionOfTerms.insert("DD", tr("Duplex Doppler"));
descriptionOfTerms.insert("ES", tr("Endoscopy"));
descriptionOfTerms.insert("LS", tr("Laser surface scan"));
descriptionOfTerms.insert("PT", tr("Positron emission tomography (PET)"));
descriptionOfTerms.insert("RG", tr("Radiographic imaging (conventional film/screen)"));
descriptionOfTerms.insert("ST", tr("Single-photon emission computed tomograpy (SPECT)"));
descriptionOfTerms.insert("TG", tr("Thermography"));
descriptionOfTerms.insert("XA", tr("X-Ray Aniography"));
descriptionOfTerms.insert("RF", tr("Radio Fluoroscopy"));
descriptionOfTerms.insert("RTIMAGE", tr("Radiotherapy Image"));
descriptionOfTerms.insert("RTDOSE", tr("Radiotherapy Dose"));
descriptionOfTerms.insert("RTSTRUCT", tr("Radiotherapy Structure Set"));
descriptionOfTerms.insert("RTPLAN", tr("Radiotherapy Plan"));
descriptionOfTerms.insert("RTRECORD", tr("RT Treatment Record"));
descriptionOfTerms.insert("HC", tr("Hard Copy"));
descriptionOfTerms.insert("DX", tr("Digital Radiography"));
descriptionOfTerms.insert("MG", tr("Mammography"));
descriptionOfTerms.insert("IO", tr("Intra-oral Radiography"));
descriptionOfTerms.insert("PX", tr("Panoramic X-Ray"));
descriptionOfTerms.insert("GM", tr("General Microscopy"));
descriptionOfTerms.insert("SM", tr("Slide Microscopy"));
descriptionOfTerms.insert("XC", tr("External-camera Photography"));
descriptionOfTerms.insert("PR", tr("Presentation state"));
descriptionOfTerms.insert("AU", tr("Audio"));
descriptionOfTerms.insert("ECG", tr("Electrocardiography"));
descriptionOfTerms.insert("EPS", tr("Cardiac Electrophysiology"));
descriptionOfTerms.insert("HD", tr("Hemodynamic Waveform"));
descriptionOfTerms.insert("SR", tr("SR Document"));
descriptionOfTerms.insert("IVUS", tr("Intravascular Ultrasound"));
descriptionOfTerms.insert("OP", tr("Ophthalmic Photography"));
descriptionOfTerms.insert("SMR", tr("Stereometric Relationship"));
descriptionOfTerms.insert("OCT", tr("Optical Coherence Tomography (non-Ophthalmic)"));
descriptionOfTerms.insert("OPR", tr("Ophthalmic Refraction"));
descriptionOfTerms.insert("OPV", tr("Ophthalmic Visual Field"));
descriptionOfTerms.insert("OPM", tr("Ophthalmic Mapping"));
descriptionOfTerms.insert("KO", tr("Key Object Selection"));
descriptionOfTerms.insert("SEG", tr("Segmentation"));
descriptionOfTerms.insert("REG", tr("Registration"));
descriptionOfTerms.insert("OPT", tr("Ophthalmic Tomography"));
descriptionOfTerms.insert("BDUS", tr("Bone Densitometry (ultrasound)"));
descriptionOfTerms.insert("BMD", tr("Bone Densitometry (X-Ray)"));
descriptionOfTerms.insert("DOC", tr("Document"));

// retired terms (but probably still in use)
descriptionOfTerms.insert("DS", "Digital Subtraction Angiography");
descriptionOfTerms.insert("CF", "Cinefluorography");
descriptionOfTerms.insert("DF", "Digital fluoroscopy");
descriptionOfTerms.insert("VF", "Videofluorography");
descriptionOfTerms.insert("AS", "Angioscopy");
descriptionOfTerms.insert("CS", "Cystoscopy");
descriptionOfTerms.insert("EC", "Echocardiography");
descriptionOfTerms.insert("LP", "Laparoscopy");
descriptionOfTerms.insert("FA", "Fluorescein angiography ");
descriptionOfTerms.insert("CP", "Culposcopy");
descriptionOfTerms.insert("DM", "Digital microscopy");
descriptionOfTerms.insert("FS", "Fundoscopy");
descriptionOfTerms.insert("MA", "Magnetic resonance angiography");
descriptionOfTerms.insert("MS", "Magnetic resonance spectroscopy");
descriptionOfTerms.insert("DS", tr("Digital Subtraction Angiography"));
descriptionOfTerms.insert("CF", tr("Cinefluorography"));
descriptionOfTerms.insert("DF", tr("Digital fluoroscopy"));
descriptionOfTerms.insert("VF", tr("Videofluorography"));
descriptionOfTerms.insert("AS", tr("Angioscopy"));
descriptionOfTerms.insert("CS", tr("Cystoscopy"));
descriptionOfTerms.insert("EC", tr("Echocardiography"));
descriptionOfTerms.insert("LP", tr("Laparoscopy"));
descriptionOfTerms.insert("FA", tr("Fluorescein angiography "));
descriptionOfTerms.insert("CP", tr("Culposcopy"));
descriptionOfTerms.insert("DM", tr("Digital microscopy"));
descriptionOfTerms.insert("FS", tr("Fundoscopy"));
descriptionOfTerms.insert("MA", tr("Magnetic resonance angiography"));
descriptionOfTerms.insert("MS", tr("Magnetic resonance spectroscopy"));
initialized = true;
}

Expand Down Expand Up @@ -969,10 +969,12 @@ QString ctkDICOMItem::TagKeyStripped( const DcmTag& tag )
QString ctkDICOMItem::TagDescription( const DcmTag& tag )
{
if (!dcmDataDict.isDictionaryLoaded())
return QString("<no DICOM dictionary loaded. application broken>");
{
return tr("Unknown (no DICOM dictionary loaded)");
}
const DcmDataDictionary& globalDict = dcmDataDict.rdlock();
const DcmDictEntry* entry = globalDict.findEntry(tag, NULL);
QString returnName("Unknown");
QString returnName = tr("Unknown");
if (entry)
{
returnName = entry->getTagName();
Expand All @@ -987,7 +989,10 @@ QString ctkDICOMItem::TagDescription( const DcmTag& tag )

QString ctkDICOMItem::TagVR( const DcmTag& tag )
{
if (!dcmDataDict.isDictionaryLoaded()) return QString("<no DICOM dictionary loaded. application broken>");
if (!dcmDataDict.isDictionaryLoaded())
{
return tr("Unknown (no DICOM dictionary loaded)");
}
const DcmDataDictionary& globalDataDict = dcmDataDict.rdlock();
const DcmDictEntry* entry = globalDataDict.findEntry(tag, NULL);
QString returnVR("UN");
Expand Down
5 changes: 4 additions & 1 deletion Libs/DICOM/Core/ctkDICOMItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

#include <dcmtk/dcmdata/dcdatset.h> // DCMTK DcmDataset

#include <QCoreApplication.h>
#include <QtCore>

class DcmDataDictionary;
Expand Down Expand Up @@ -65,7 +66,9 @@ typedef ctkDICOMItem ctkDICOMItem;

class CTK_DICOM_CORE_EXPORT ctkDICOMItem
{
public:
Q_DECLARE_TR_FUNCTIONS(ctkDICOMItem)

public:
typedef QObject Superclass;
///
/// \brief Create an empty object. This has to be initialized by one of
Expand Down
Loading

0 comments on commit c819ae7

Please sign in to comment.