#include "ui_mainwindow.h"
#include "aboutdialog.hpp"
-const QString VERSION("2016.06.26");
+const QString VERSION("2016.10.04");
/** @class MainWindow mainwindow.hpp "mainwindow.hpp"
*
saveState();
}
+/**
+ * Tests whether the parameter for execution are complete.
+ *
+ * @return <code>true</code>no error
+ */
+bool MainWindow::checkArguments()
+{
+ bool rc = false;
+ if (ui->tabWidget->currentIndex() == TAB_QUICK){
+ if (ui->comboBoxMaxHeight->currentText().isEmpty())
+ error(tr("missing maximal height"));
+ else if (ui->comboBoxMaxWidth->currentText().isEmpty())
+ error(tr("missing maximal width"));
+ else
+ rc = true;
+ } else {
+ if (ui->comboBoxLandscapeX->currentText().isEmpty()
+ && ui->comboBoxLandscapeY->currentText().isEmpty())
+ error(tr("missing data of landscape format: define maximal width or maximal height"));
+ else if (ui->comboBoxPortraitX->currentText().isEmpty()
+ && ui->comboBoxPortraitY->currentText().isEmpty())
+ error(tr("missing data of portrait format: define maximal width or maximal height"));
+ else if (ui->comboBoxSquareX->currentText().isEmpty())
+ error(tr("missing data of square format: define maximal width/height"));
+ else
+ rc = true;
+ }
+ if (rc){
+ rc = false;
+ QString source = ui->comboBoxSourceDir->currentText();
+ QFileInfo info(source);
+ QString canonicalSource = info.canonicalFilePath();
+ QString target = ui->comboBoxTargetDir->currentText();
+ QFileInfo infoTarget(target);
+ QString canonicalTarget = infoTarget.canonicalFilePath();
+ if (source.isEmpty())
+ error (tr("missing source directory"));
+ else if (! ReFileUtils::isAbsolutPath(source))
+ error (tr("source is not an absolute directory name:") + " " + source);
+ else if (! QFileInfo::exists(canonicalSource))
+ error(tr("source directory does not exist:") + " " + canonicalSource);
+ else if (! info.isDir())
+ error(tr("source is not a directory:") + " " + source);
+ else if (target.isEmpty())
+ error (tr("missing target directory"));
+ else if (! ReFileUtils::isAbsolutPath(target))
+ error (tr("target is not an absolute directory name:") + " " + target);
+ else if (QFileInfo::exists(canonicalTarget) && ! infoTarget.isDir())
+ error(tr("target is not a directory:") + " " + target);
+ else if (canonicalSource == canonicalTarget)
+ error(tr("target is the same as the source:") + " " + canonicalSource);
+ else
+ rc = true;
+ }
+ return rc;
+}
+
/**
* Clears the table.
*/
* @brief Handles the button click on "convert".
*/
void MainWindow::onConvert(){
- Converter::m_shouldStop = false;
- startStop(true);
- m_errors = 0;
- int landscapeX = comboInt(ui->comboBoxLandscapeX, 0, "*", 0);
- int landscapeY = comboInt(ui->comboBoxLandscapeY, 0, "*", 0);
- int portraitX = comboInt(ui->comboBoxPortraitX, 0, "*", 0);
- int portraitY = comboInt(ui->comboBoxPortraitY, 0, "*", 0);
- int squareX = comboInt(ui->comboBoxSquareX, 0);
- int quality = comboInt(ui->comboBoxQuality, 75);
- int maxWidth = comboInt(ui->comboBoxMaxWidth, 0);
- int maxHeight = comboInt(ui->comboBoxMaxHeight, 0);
- QRegularExpressionMatch match = QRegularExpression("\\dx\\d").match(
- ui->comboBoxTemplate->currentText());
- bool simpleConversion = match.hasMatch();
- if (m_errors == 0){
- saveState();
- delete m_taskSearch;
- m_taskSearch = new TaskSearch(ui->comboBoxSourceDir->currentText(),
- ui->comboBoxSourcePattern->currentText(),
- ui->checkBoxRecursive->isChecked(), this);
- m_taskSearch->start();
+ if (checkArguments()){
+ Converter::m_shouldStop = false;
+ startStop(true);
+ m_errors = 0;
+ int landscapeX, landscapeY, portraitX, portraitY, squareX;
+ int quality, maxWidth, maxHeight;
+ bool simpleConversion = ui->tabWidget->currentIndex() == TAB_QUICK;
+ if (simpleConversion){
+ portraitX = landscapeX = 0;
+ portraitY = landscapeY = 0;
+ squareX = 0;
+ quality = comboInt(ui->comboBoxQuality, 75);
+ maxWidth = comboInt(ui->comboBoxMaxWidth, 0);
+ maxHeight = comboInt(ui->comboBoxMaxHeight, 0);
+ } else {
+ landscapeX = comboInt(ui->comboBoxLandscapeX, 0, "*", 0);
+ landscapeY = comboInt(ui->comboBoxLandscapeY, 0, "*", 0);
+ portraitX = comboInt(ui->comboBoxPortraitX, 0, "*", 0);
+ portraitY = comboInt(ui->comboBoxPortraitY, 0, "*", 0);
+ squareX = comboInt(ui->comboBoxSquareX, 0);
+ quality = comboInt(ui->comboBoxQuality, 75);
+ maxWidth = 0;
+ maxHeight = 0;
+ }
+ if (m_errors == 0){
+ saveState();
+ delete m_taskSearch;
+ m_taskSearch = new TaskSearch(ui->comboBoxTargetDir->currentText(),
+ ui->comboBoxSourceDir->currentText(),
+ ui->comboBoxSourcePattern->currentText(),
+ ui->checkBoxRecursive->isChecked(), this);
+ m_taskSearch->start();
- delete m_taskConvert;
- m_taskConvert = new TaskConverter(ui->comboBoxSourceDir->currentText(),
- ui->comboBoxTargetDir->currentText(),
- ui->comboBoxSourcePattern->currentText(),
- ui->comboBoxDestType->currentText(),
- simpleConversion, maxWidth, maxHeight,
- landscapeX, landscapeY, portraitX,
- portraitY, squareX, quality, this);
- m_taskConvert->start();
- }
+ delete m_taskConvert;
+ m_taskConvert = new TaskConverter(ui->comboBoxSourceDir->currentText(),
+ ui->comboBoxTargetDir->currentText(),
+ ui->comboBoxSourcePattern->currentText(),
+ ui->comboBoxDestType->currentText(),
+ simpleConversion, maxWidth, maxHeight,
+ landscapeX, landscapeY, portraitX,
+ portraitY, squareX, quality, this);
+ m_taskConvert->start();
+ }
+ }
}
/**
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.1" language="de_DE">
+<TS version="2.0" language="de_DE">
<context>
<name>AboutDialog</name>
<message>
</message>
<message>
<location filename="mainwindow.ui" line="159"/>
- <location filename="mainwindow.ui" line="283"/>
- <location filename="mainwindow.ui" line="390"/>
+ <location filename="mainwindow.ui" line="289"/>
+ <location filename="mainwindow.ui" line="402"/>
<source>Max. Width:</source>
<translation>Max. Breite:</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="197"/>
- <location filename="mainwindow.ui" line="321"/>
- <location filename="mainwindow.ui" line="428"/>
+ <location filename="mainwindow.ui" line="200"/>
+ <location filename="mainwindow.ui" line="330"/>
+ <location filename="mainwindow.ui" line="443"/>
<source>Max. Height:</source>
<translation>Max. Höhe:</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="238"/>
+ <location filename="mainwindow.ui" line="244"/>
<source>Dimensions (separated)</source>
<translation>Auflösung (getrennt)</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="256"/>
+ <location filename="mainwindow.ui" line="262"/>
<source>Portrait:</source>
<translation>Hochformat:</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="363"/>
+ <location filename="mainwindow.ui" line="375"/>
<source>Landscape:</source>
<translation>Breitformat:</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="470"/>
+ <location filename="mainwindow.ui" line="488"/>
<source>Square:</source>
<translation>Quadrat:</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="507"/>
+ <location filename="mainwindow.ui" line="528"/>
<source>Max. Width/Height:</source>
<translation>Max. Breite/Höhe:</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="550"/>
+ <location filename="mainwindow.ui" line="571"/>
<source>Quality (%):</source>
<translation>Qualität (%):</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="569"/>
+ <location filename="mainwindow.ui" line="590"/>
<source>Quality of the image. Only relevant for *.jpg</source>
<translation>Qualität des Bildes. Nur relevant für *.jpg</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="591"/>
+ <location filename="mainwindow.ui" line="615"/>
<source>File Pattern:</source>
<translation>Dateimuster:</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="610"/>
+ <location filename="mainwindow.ui" line="634"/>
<source>A pattern of the source files with wildcards '*' (anything) and '?' (exact one char)</source>
<translation>Ein Muster der Quelldateien mit Joker '*' (beliebiger String) und '?' (genau ein Zeichen)</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="647"/>
+ <location filename="mainwindow.ui" line="674"/>
<source>Dest. Type:</source>
<translation>Zieldateityp:</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="702"/>
+ <location filename="mainwindow.ui" line="729"/>
<source>Source Directory (Images):</source>
<translation>Quellverzeichnis (der Bilddateien):</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="761"/>
+ <location filename="mainwindow.ui" line="788"/>
<source>Destination: </source>
<translation>Ziel:</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="770"/>
+ <location filename="mainwindow.ui" line="797"/>
<source>The converted files will built here</source>
<translation>Die konvertierten Dateien werden hier erstellt</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="822"/>
+ <location filename="mainwindow.ui" line="849"/>
<source>Process the subdirectories too</source>
<translation>Auch Unterverzeichnisse werden behandelt</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="825"/>
+ <location filename="mainwindow.ui" line="852"/>
<source>Recursive</source>
<translation>Rekursiv</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="841"/>
+ <location filename="mainwindow.ui" line="868"/>
<source>Files not matching the file pattern will be copied too (and not ignored)</source>
<translation>Dateien, die nicht auf das Dateimuster passen werden auch kopiert (und nicht ignoriert)</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="844"/>
+ <location filename="mainwindow.ui" line="871"/>
<source>Copy other files</source>
<translation>Kopiere andere Dateien</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="870"/>
+ <location filename="mainwindow.ui" line="897"/>
<source>Show other files</source>
<translation>Zeige andere Dateien</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="896"/>
+ <location filename="mainwindow.ui" line="923"/>
<source>Converts the images</source>
<translation>Konvertiere die Bilder</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="899"/>
+ <location filename="mainwindow.ui" line="926"/>
<source>&Convert</source>
<translation>Konvertiere</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="932"/>
- <location filename="mainwindow.ui" line="1167"/>
+ <location filename="mainwindow.ui" line="959"/>
+ <location filename="mainwindow.ui" line="1194"/>
<source>Clears the list</source>
<translation>Löscht die Liste</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="935"/>
- <location filename="mainwindow.ui" line="1164"/>
+ <location filename="mainwindow.ui" line="962"/>
+ <location filename="mainwindow.ui" line="1191"/>
<source>C&lear</source>
<translation>&Löschen</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="973"/>
+ <location filename="mainwindow.ui" line="1000"/>
<source>Stops the conversion</source>
<translation>Hält die Konversion an</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="976"/>
+ <location filename="mainwindow.ui" line="1003"/>
<source>&Stop</source>
<translation>Halt</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1005"/>
+ <location filename="mainwindow.ui" line="1032"/>
<source>&File</source>
<translation>Datei</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1020"/>
+ <location filename="mainwindow.ui" line="1047"/>
<source>&Help</source>
<translation>&Hilfe</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1060"/>
+ <location filename="mainwindow.ui" line="1087"/>
<source>toolBar_2</source>
<translation></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1075"/>
+ <location filename="mainwindow.ui" line="1102"/>
<source>Convert</source>
<translation>Konvertiere</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1078"/>
+ <location filename="mainwindow.ui" line="1105"/>
<source>Converts all images from the source directory into the target directory</source>
<translation>Konvertiert alle Bilder vom Quellverzeichnis ins Zielverzeichnis</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="730"/>
- <location filename="mainwindow.ui" line="1093"/>
+ <location filename="mainwindow.ui" line="757"/>
+ <location filename="mainwindow.ui" line="1120"/>
<source>Select the source directory</source>
<translation>Wahl eines Quellverzeichnis</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1105"/>
+ <location filename="mainwindow.ui" line="1132"/>
<source>Select Destination</source>
<translation>Wahl des Zielverzeichnisses</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="795"/>
- <location filename="mainwindow.ui" line="1108"/>
+ <location filename="mainwindow.ui" line="822"/>
+ <location filename="mainwindow.ui" line="1135"/>
<source>Select the destination directory</source>
<translation>Wahl des Zielverzeichnisses</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="666"/>
+ <location filename="mainwindow.ui" line="693"/>
<source>The target images will have this format (and file extension)</source>
<translation>Die Zielbilder werden in diesem Format (und mit dieser Dateiendung) gespeichert</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="711"/>
+ <location filename="mainwindow.ui" line="738"/>
<source>The files will fetched from here</source>
<translation>Die Bilder werden von hier geholt</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1123"/>
+ <location filename="mainwindow.ui" line="1117"/>
+ <source>Select Source</source>
+ <translation>Wähle Quelle</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="1150"/>
<source>Sto&p</source>
<translation>Halt</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1126"/>
+ <location filename="mainwindow.ui" line="1153"/>
<source>Stopps the conversion</source>
<translation>Hält die Konversion an</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1138"/>
+ <location filename="mainwindow.ui" line="1165"/>
<source>&Exit</source>
<translation>B&enden</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1141"/>
+ <location filename="mainwindow.ui" line="1168"/>
<source>Terminates the program</source>
<translation>Beendet das Program</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1153"/>
+ <location filename="mainwindow.ui" line="1180"/>
<source>&About</source>
<translation>Über</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1156"/>
+ <location filename="mainwindow.ui" line="1183"/>
<source>Info about the program</source>
<translation>Information über das Program</translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1144"/>
+ <location filename="mainwindow.ui" line="1171"/>
<source>Ctrl+Shift+X</source>
<oldsource>Ctrl+Shift+A</oldsource>
- <translation type="unfinished"></translation>
+ <translation>Ctrl+Shift+X</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="106"/>
+ <source>missing maximal height</source>
+ <translation>Maximale Höhe nicht eingetragen</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="108"/>
+ <source>missing maximal width</source>
+ <translation>Maximale Breite nicht eingetragen</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="114"/>
+ <source>missing data of landscape format: define maximal width or maximal height</source>
+ <translation>Vermisse Angabe im Breitformat: definiere maximale Breite oder maximale Höhe</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="117"/>
+ <source>missing data of portrait format: define maximal width or maximal height</source>
+ <translation>Vermisse Angabe im Hochformat: definiere maximale Breite oder maximale Höhe</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="119"/>
+ <source>missing data of square format: define maximal width/height</source>
+ <translation>Vermisse Angabe im Quadratformat: definiere maximale Breite / Höhe</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="132"/>
+ <source>missing source directory</source>
+ <translation>Quellverzeichnis nicht angegeben</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="134"/>
+ <source>source is not an absolute directory name:</source>
+ <translation>Die Quelle hat keinen absoluten Verzeichnisnamen:</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="136"/>
+ <source>source directory does not exist:</source>
+ <translation>Das Quellverzeichnis existiert nicht:</translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="223"/>
+ <location filename="mainwindow.cpp" line="138"/>
+ <source>source is not a directory:</source>
+ <translation>Die Quelle ist kein Verzeichnis:</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="140"/>
+ <source>missing target directory</source>
+ <translation>Zielverzeichnis nicht angegeben</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="142"/>
+ <source>target is not an absolute directory name:</source>
+ <translation>Das Ziel hat keinen absoluten Verzeichnisnamen:</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="144"/>
+ <source>target is not a directory:</source>
+ <translation>Das Ziel ist kein Verzeichnis:</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="146"/>
+ <source>target is the same as the source:</source>
+ <translation>Das Ziel ist das gleiche Verzeichnis wie die Quelle:</translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="293"/>
<source>Select Source Directory</source>
<translation>Wahl des Quellverzeichnisses</translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="280"/>
+ <location filename="mainwindow.cpp" line="350"/>
<source>Reading data from </source>
<translation>Daten werden gelesen von </translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="367"/>
+ <location filename="mainwindow.cpp" line="437"/>
<source>Select Destination Directory</source>
<translation>Wahl des Zielverzeichnisses</translation>
</message>
<translation>Ausführung wegen Fehler angehalten</translation>
</message>
<message>
- <location filename="converter.cpp" line="492"/>
+ <location filename="converter.cpp" line="493"/>
+ <source>0 files converted</source>
+ <translation>0 Dateien konvertiert</translation>
+ </message>
+ <message>
+ <location filename="converter.cpp" line="495"/>
<source>%1 of %2 file(s) converted, %3 -> %4 (%5 %), duration: %6</source>
<translation>%1 von %2 Datei(en) konvertiert, %3 -> %4 (%5 %), Dauer: %6</translation>
</message>
<message>
- <location filename="../../base/ReFileUtils.cpp" line="177"/>
+ <location filename="converter.cpp" line="534"/>
+ <source>target directory ignored as source:</source>
+ <oldsource>target directory ignored as source: </oldsource>
+ <translation>Das Zielverzeichnis wurde als Quelle ignoriert:</translation>
+ </message>
+ <message>
+ <location filename="../../base/ReFileUtils.cpp" line="185"/>
+ <source>copy file failed (%1): %2</source>
+ <translation>Kopieren missglückt (%1): %2</translation>
+ </message>
+ <message>
+ <location filename="../../base/ReFileUtils.cpp" line="196"/>
<source>not found: %1</source>
<translation>Nicht gefunden: %1</translation>
</message>
<message>
- <location filename="../../base/ReFileUtils.cpp" line="181"/>
- <location filename="../../base/ReFileUtils.cpp" line="185"/>
+ <location filename="../../base/ReFileUtils.cpp" line="210"/>
+ <source>not a regular file: %1</source>
+ <translation>Keine normale Datei: %1</translation>
+ </message>
+ <message>
+ <location filename="../../base/ReFileUtils.cpp" line="214"/>
+ <location filename="../../base/ReFileUtils.cpp" line="218"/>
<source>cannot open (%1): %2</source>
<translation>Kann nicht öffnen (%1): %2</translation>
</message>
<message>
- <location filename="../../base/ReFileUtils.cpp" line="202"/>
+ <location filename="../../base/ReFileUtils.cpp" line="235"/>
<source>cannot write (%1): %2 [%3/%4]</source>
<translation>Kann nicht schreiben (%1): %2 [%3/%4]</translation>
</message>
<message>
- <location filename="../../base/ReFileUtils.cpp" line="209"/>
+ <location filename="../../base/ReFileUtils.cpp" line="242"/>
<source>file can be read only partitionally: %1 [%2/%3]</source>
<translation>Datei kann nur teilweise gelesen werden: %1 [%2/%3]</translation>
</message>
<message>
- <location filename="../../base/ReFileUtils.cpp" line="214"/>
+ <location filename="../../base/ReFileUtils.cpp" line="247"/>
<source>cannot set date/time (%1): %2</source>
<translation>Kann Datum/Zeit nicht setzen (%1): %2</translation>
</message>
<message>
- <location filename="../../base/ReFileUtils.cpp" line="217"/>
+ <location filename="../../base/ReFileUtils.cpp" line="250"/>
<source>cannot set permissions (%1): %2</source>
<translation>Kann Dateirechte nicht setzen (%1): %2 [%3/%4]</translation>
</message>
<message>
- <location filename="../../base/ReFileUtils.cpp" line="491"/>
+ <location filename="../../base/ReFileUtils.cpp" line="260"/>
+ <source>cannot set user/gid [%1/%2] (%3): %4</source>
+ <translation>Kann Benutzer/Gruppe nicht setzen:[%1/%2] (%3): %4 </translation>
+ </message>
+ <message>
+ <location filename="../../base/ReFileUtils.cpp" line="604"/>
+ <location filename="../../base/ReFileUtils.cpp" line="673"/>
<source>can't create directory (%1): %2</source>
<translation>Kann Verzeichnis nicht erzeugen (%1): %2 [%3/%4]</translation>
</message>
<message>
- <location filename="../../base/ReFileUtils.cpp" line="497"/>
+ <location filename="../../base/ReFileUtils.cpp" line="610"/>
<source>can't create directory (is a file): </source>
<translation>Kann Verzeichnis nicht erstellen (ist eine Datei): </translation>
</message>
<context>
<name>TaskShowOther</name>
<message>
- <location filename="converter.cpp" line="637"/>
+ <location filename="converter.cpp" line="651"/>
<source>Found: %1 file(s)</source>
<translation>Gefunden: %1 Datei(en)</translation>
</message>