Convert encoding from ISO-8859-1 to UTF-8

iconv -f ISO-8859-1 -t UTF-8

No more broken umlauts!
This commit is contained in:
Sebastian Lohff 2022-06-30 23:11:22 +02:00
parent 9f1d3c81d2
commit 9898b3404a
12 changed files with 83 additions and 83 deletions

View File

@ -102,7 +102,7 @@ CChapter *pChapter=0;
CZipArchive zip; CZipArchive zip;
if (!zip.open(strFileName, CZipArchive::OpenReadOnly)) if (!zip.open(strFileName, CZipArchive::OpenReadOnly))
{ {
QMessageBox::critical(pParent, pParent->tr("Datei-Fehler"), pParent->tr("Konnte folgende Datei nicht zum Lesen öffnen:\n%1").arg(strFileName)); QMessageBox::critical(pParent, pParent->tr("Datei-Fehler"), pParent->tr("Konnte folgende Datei nicht zum Lesen öffnen:\n%1").arg(strFileName));
return false; return false;
} }
@ -234,7 +234,7 @@ QFile file (strFileName);
if (strFileName.isEmpty()) return false; if (strFileName.isEmpty()) return false;
if (!file.open(QIODevice::WriteOnly)) if (!file.open(QIODevice::WriteOnly))
{ {
QMessageBox::critical(pParent, QString(pParent->tr("Datei-Fehler")), pParent->tr("Konnte folgende Datei nicht zum Schreiben öffnen:\n")+strFileName); QMessageBox::critical(pParent, QString(pParent->tr("Datei-Fehler")), pParent->tr("Konnte folgende Datei nicht zum Schreiben öffnen:\n")+strFileName);
return false; return false;
} }
QTextStream out(&file); QTextStream out(&file);
@ -315,7 +315,7 @@ int iErrLine, iErrCol;
if (!file.exists()) return true; if (!file.exists()) return true;
if (!file.open (QIODevice::ReadOnly)) if (!file.open (QIODevice::ReadOnly))
{ {
QMessageBox::critical(pParent, QString(pParent->tr("Datei-Fehler")), pParent->tr("Konnte folgende Datei nicht zum Lesen öffnen:\n")+statisticFileName()); QMessageBox::critical(pParent, QString(pParent->tr("Datei-Fehler")), pParent->tr("Konnte folgende Datei nicht zum Lesen öffnen:\n")+statisticFileName());
return false; return false;
} }
QTextStream in (&file); QTextStream in (&file);
@ -375,7 +375,7 @@ QFile file (strFileName);
if (!file.open (QIODevice::WriteOnly)) if (!file.open (QIODevice::WriteOnly))
{ {
QMessageBox::critical (pParent, pParent->tr("Fehler"), pParent->tr("Konnte folgende Datei nicht zum Schreiben öffnen.\n")+strFileName); QMessageBox::critical (pParent, pParent->tr("Fehler"), pParent->tr("Konnte folgende Datei nicht zum Schreiben öffnen.\n")+strFileName);
return false; return false;
} }
QTextStream out(&file); QTextStream out(&file);

View File

@ -67,14 +67,14 @@ QVariant CCatalogModel::headerData (int section, Qt::Orientation orientation, in
else if (section == COL_QUESTION) else if (section == COL_QUESTION)
return tr("Fragen"); return tr("Fragen");
else if (section == COL_AVG) else if (section == COL_AVG)
return tr("Ø"); return tr("Ø");
else if (section == COL_ASSIST) else if (section == COL_ASSIST)
return tr("Lernassistent"); return tr("Lernassistent");
} }
else if (role == Qt::ToolTipRole) else if (role == Qt::ToolTipRole)
{ {
if (section == COL_CHAPTER) if (section == COL_CHAPTER)
return tr("Kapitelname\nBitte markieren Sie das Kapitel, das Sie lernen möchten."); return tr("Kapitelname\nBitte markieren Sie das Kapitel, das Sie lernen möchten.");
else if (section == COL_QUESTION) else if (section == COL_QUESTION)
return tr("Anzahl d. Fragen inkl. Unterkapitel"); return tr("Anzahl d. Fragen inkl. Unterkapitel");
else if (section == COL_AVG) else if (section == COL_AVG)

View File

@ -275,14 +275,14 @@ void CChapter::updateStatisticCount()
return false; return false;
*/ */
// Alle Statistiken zurücksetzen // Alle Statistiken zurücksetzen
m_uNeverAskedCount = 0; m_uNeverAskedCount = 0;
m_bHasLearningNew = false; m_bHasLearningNew = false;
m_bHasKnownQuestions = false; m_bHasKnownQuestions = false;
m_bHasKnownQuestionsRepeatToday = false; m_bHasKnownQuestionsRepeatToday = false;
for (int i=0; i<=LEVEL_MAX; i++) m_uLevelCount[i] = 0; for (int i=0; i<=LEVEL_MAX; i++) m_uLevelCount[i] = 0;
// Zuerst Statistiken für Unterkapitel berechnen und integrieren // Zuerst Statistiken für Unterkapitel berechnen und integrieren
for (int i=0; i<m_listChapter.size(); i++) for (int i=0; i<m_listChapter.size(); i++)
{ {
CChapter *p = m_listChapter.at(i); CChapter *p = m_listChapter.at(i);
@ -295,7 +295,7 @@ void CChapter::updateStatisticCount()
if (p->hasKnownQuestionsRepeatToday()) m_bHasKnownQuestionsRepeatToday = true; if (p->hasKnownQuestionsRepeatToday()) m_bHasKnownQuestionsRepeatToday = true;
} }
// Anschließend Statistiken für eigene Fragen neu berechnen und hinzufügen // Anschließend Statistiken für eigene Fragen neu berechnen und hinzufügen
for (int i=0; i<m_listQuestion.size(); i++) for (int i=0; i<m_listQuestion.size(); i++)
{ {
CQuestion *q = m_listQuestion.at(i); CQuestion *q = m_listQuestion.at(i);
@ -322,7 +322,7 @@ void CChapter::updateRecommendationStatistic()
} }
/* /*
Berechnet die Statistik für das Kapitel inkl. aller Unterkapitel neu. Berechnet die Statistik für das Kapitel inkl. aller Unterkapitel neu.
*/ */
void CChapter::updateStatistic() void CChapter::updateStatistic()
{ {
@ -369,10 +369,10 @@ QString str;
} }
/*! /*!
Das empfohlene Wiederholdatum eines Kapitels das frühestete Datum, Das empfohlene Wiederholdatum eines Kapitels das frühestete Datum,
an dem eine Frage des Kapitels oder Unterkapitels wiederholt werden sollte. an dem eine Frage des Kapitels oder Unterkapitels wiederholt werden sollte.
\return Datum, wann das Kapitel wiederholt werden soll. \return Datum, wann das Kapitel wiederholt werden soll.
Gibt es kein solches Datum, so wird ein ungültiges Datum (QDate::isValid()) zurückgegeben. Gibt es kein solches Datum, so wird ein ungültiges Datum (QDate::isValid()) zurückgegeben.
Hinweis: Das Datum kann auch in der Vergangenheit liegen! Hinweis: Das Datum kann auch in der Vergangenheit liegen!
*/ */
QDate CChapter::repeatDate() const QDate CChapter::repeatDate() const
@ -392,7 +392,7 @@ QList<CQuestion*> list = questionPool();
/*! /*!
Die Variable m_recomRepeatDate muss up to date sein! Die Variable m_recomRepeatDate muss up to date sein!
\return Lernempfehlung dieses Kapitels ohne Berücksichtigung evt. vorhandener ünter- oder übergeordneter Kapitel. \return Lernempfehlung dieses Kapitels ohne Berücksichtigung evt. vorhandener ünter- oder übergeordneter Kapitel.
\sa m_recomRepeatDate \sa m_recomRepeatDate
*/ */
@ -417,7 +417,7 @@ CChapter::Recommendation CChapter::recommendationIndividual() const
} }
/*! /*!
Aktualisiert die Lernempfehlung für dieses Kapitel und alle Unterkapitel Aktualisiert die Lernempfehlung für dieses Kapitel und alle Unterkapitel
\sa m_recom \sa m_recom
*/ */
void CChapter::updateRecommendation() void CChapter::updateRecommendation()
@ -525,7 +525,7 @@ unsigned uDays=0;
case RecommendationSubChapter: case RecommendationSubChapter:
return tr("Zuerst Unterkapitel lernen"); return tr("Zuerst Unterkapitel lernen");
case RecommendationParentChapter: case RecommendationParentChapter:
return tr("Übergeordnetes Kapitel lernen"); return tr("Übergeordnetes Kapitel lernen");
case RecommendationLearnNew: case RecommendationLearnNew:
return tr("Neue Fragen lernen"); return tr("Neue Fragen lernen");
case RecommendationRepeatToday: case RecommendationRepeatToday:
@ -592,12 +592,12 @@ QString str;
str = tr("Keine Lernempfehlung"); str = tr("Keine Lernempfehlung");
break; break;
case RecommendationSubChapter: case RecommendationSubChapter:
str = tr("Dieses Kapitel enthält Unterkapitel, dessen Fragen Sie noch nicht ausreichend gelernt haben.\nEs wird empohlen in kleinen Etappen zu lernen und damit zuerst die Unterkapitel zu vertiefen."); str = tr("Dieses Kapitel enthält Unterkapitel, dessen Fragen Sie noch nicht ausreichend gelernt haben.\nEs wird empohlen in kleinen Etappen zu lernen und damit zuerst die Unterkapitel zu vertiefen.");
break; break;
case RecommendationParentChapter: case RecommendationParentChapter:
if (levelAvgRounded() >= LEVEL_NORMAL) if (levelAvgRounded() >= LEVEL_NORMAL)
str = tr("Sie können die Fragen dieses Kapitels gut beantworten.\n"); str = tr("Sie können die Fragen dieses Kapitels gut beantworten.\n");
str += tr("Es wird empfohlen, alle Fragen des übergeordneten Kapitels gemischt zusammen zu lernen."); str += tr("Es wird empfohlen, alle Fragen des übergeordneten Kapitels gemischt zusammen zu lernen.");
break; break;
case RecommendationLearnNew: case RecommendationLearnNew:
if (!isRecommendedNow(pCatalog)) if (!isRecommendedNow(pCatalog))
@ -606,23 +606,23 @@ QString str;
str = tr("Bitte beantworten Sie alle neuen Fragen mindestens einmal richtig."); str = tr("Bitte beantworten Sie alle neuen Fragen mindestens einmal richtig.");
break; break;
case RecommendationRepeatToday: case RecommendationRepeatToday:
str = tr("Bitte lernen Sie alle heute zu wiederholenden Fragen, bis sie eine Lernfortschritts-Stufe höher eingestuft sind."); str = tr("Bitte lernen Sie alle heute zu wiederholenden Fragen, bis sie eine Lernfortschritts-Stufe höher eingestuft sind.");
break; break;
case RecommendationRepeatLater: case RecommendationRepeatLater:
uDays = QDate::currentDate().daysTo(m_recomRepeatDate); uDays = QDate::currentDate().daysTo(m_recomRepeatDate);
if (uDays > 1) if (uDays > 1)
str = tr("Die Wiederholung dieses Kapitels ist erst in %1 Tagen geplant.\n").arg(uDays); str = tr("Die Wiederholung dieses Kapitels ist erst in %1 Tagen geplant.\n").arg(uDays);
else else
str = tr("Die Wiederholung dieses Kapitels ist erst für morgen geplant.\n"); str = tr("Die Wiederholung dieses Kapitels ist erst für morgen geplant.\n");
if (pCatalog->m_uRecomCount[RecommendationRepeatToday] > 0) if (pCatalog->m_uRecomCount[RecommendationRepeatToday] > 0)
str += tr("Es gibt andere Kapitel, deren Fragen heute wiederholt werden müssen. Bitte lernen Sie diese Kapitel zuerst."); str += tr("Es gibt andere Kapitel, deren Fragen heute wiederholt werden müssen. Bitte lernen Sie diese Kapitel zuerst.");
else if (pCatalog->m_uRecomCount[RecommendationLearnNew] > 0) else if (pCatalog->m_uRecomCount[RecommendationLearnNew] > 0)
str += tr("Bitte lernen Sie zuerst Kapitel mit neuen Fragen."); str += tr("Bitte lernen Sie zuerst Kapitel mit neuen Fragen.");
break; break;
} }
if (hasRecommendedQuestions() && isRecommendedNow(pCatalog)) if (hasRecommendedQuestions() && isRecommendedNow(pCatalog))
str += tr("<p>Dafür sind noch %1 Fragen zu lernen.").arg(recommendedQuestionCount()); str += tr("<p>Dafür sind noch %1 Fragen zu lernen.").arg(recommendedQuestionCount());
return str; return str;
} }
@ -634,14 +634,14 @@ QString str;
if (m_recom2 == RecommendationLearnNew || (m_recom == RecommendationLearnNew && !isRecommendedNow(pCatalog))) if (m_recom2 == RecommendationLearnNew || (m_recom == RecommendationLearnNew && !isRecommendedNow(pCatalog)))
{ {
//str = tr("Bitte beantworten Sie alle neuen Fragen mindestens einmal richtig."); //str = tr("Bitte beantworten Sie alle neuen Fragen mindestens einmal richtig.");
str = tr("Alternativ können Sie jetzt die neuen Fragen dieses Kapitels lernen (%1 Fragen).").arg(recommendedQuestionCount()); str = tr("Alternativ können Sie jetzt die neuen Fragen dieses Kapitels lernen (%1 Fragen).").arg(recommendedQuestionCount());
} }
else if (m_recom2 == RecommendationRepeatToday) else if (m_recom2 == RecommendationRepeatToday)
{ {
if (m_recom == RecommendationSubChapter) if (m_recom == RecommendationSubChapter)
str = tr("Bitte lernen Sie alle heute zu wiederholenden Fragen, bis sie eine Lernfortschritts-Stufe höher eingestuft sind (%1 Fragen).").arg(recommendedQuestionCount()); str = tr("Bitte lernen Sie alle heute zu wiederholenden Fragen, bis sie eine Lernfortschritts-Stufe höher eingestuft sind (%1 Fragen).").arg(recommendedQuestionCount());
else else
str = tr("Alternativ können Sie jetzt die heute zu wiederholenden Fragen dieses Kapitels lernen (%1 Fragen).").arg(recommendedQuestionCount()); str = tr("Alternativ können Sie jetzt die heute zu wiederholenden Fragen dieses Kapitels lernen (%1 Fragen).").arg(recommendedQuestionCount());
} }
return str; return str;
@ -676,7 +676,7 @@ QString CChapter::recommendationIconName(const CCatalog *pCatalog) const
/*! /*!
\return true: Kapitel kann jetzt gelernt werden, \return true: Kapitel kann jetzt gelernt werden,
false: Kapitel sollte überhaupt nicht oder erst später gelernt werden false: Kapitel sollte überhaupt nicht oder erst später gelernt werden
*/ */
bool CChapter::isRecommendedNow(const CCatalog *pCatalog) const bool CChapter::isRecommendedNow(const CCatalog *pCatalog) const
@ -700,7 +700,7 @@ bool CChapter::isRecommendedNow(const CCatalog *pCatalog) const
} }
/* /*
\return true: Das Kapitel enthält noch neue Fragen, die gerade (="heute") gelernt werden \return true: Das Kapitel enthält noch neue Fragen, die gerade (="heute") gelernt werden
bool CChapter::isLearningNew() const bool CChapter::isLearningNew() const
{ {
for (int i=0; i<m_listQuestion.size(); i++) for (int i=0; i<m_listQuestion.size(); i++)

View File

@ -139,14 +139,14 @@ QVariant CChapterModel::headerData (int section, Qt::Orientation orientation, in
else if (section == COL_QUESTION) else if (section == COL_QUESTION)
return tr("Fragen"); return tr("Fragen");
else if (section == COL_AVG) else if (section == COL_AVG)
return tr("Ø"); return tr("Ø");
else if (section == COL_ASSIST) else if (section == COL_ASSIST)
return tr("Lernassistent"); return tr("Lernassistent");
} }
else if (role == Qt::ToolTipRole) else if (role == Qt::ToolTipRole)
{ {
if (section == COL_CHAPTER) if (section == COL_CHAPTER)
return tr("Kapitelname\nBitte markieren Sie das Kapitel, das Sie lernen möchten."); return tr("Kapitelname\nBitte markieren Sie das Kapitel, das Sie lernen möchten.");
else if (section == COL_QUESTION) else if (section == COL_QUESTION)
return tr("Anzahl d. Fragen inkl. Unterkapitel"); return tr("Anzahl d. Fragen inkl. Unterkapitel");
else if (section == COL_AVG) else if (section == COL_AVG)

View File

@ -71,7 +71,7 @@ bool CDlgExam::setup (const CExam& exam)
void CDlgExam::init() void CDlgExam::init()
{ {
// Zeitbalken & Zeitüberwachung // Zeitbalken & Zeitüberwachung
m_timer.setInterval(1000); m_timer.setInterval(1000);
m_timer.start(); m_timer.start();
m_dtStart = QDateTime::currentDateTime(); m_dtStart = QDateTime::currentDateTime();
@ -141,7 +141,7 @@ unsigned uSecs = m_dtStart.secsTo(dt);
{ {
m_bTimeout = true; m_bTimeout = true;
m_timer.stop(); m_timer.stop();
QMessageBox::information(this, tr("Information"), tr("Die Zeit ist abgelaufen.\nDie Prüfung wird deswegen beendet.")); QMessageBox::information(this, tr("Information"), tr("Die Zeit ist abgelaufen.\nDie Prüfung wird deswegen beendet."));
on_pbFinish_clicked(); on_pbFinish_clicked();
} }
} }
@ -273,23 +273,23 @@ unsigned uSecs = m_dtStart.secsTo(dt);
bPassed = false; bPassed = false;
bSaveStat = false; bSaveStat = false;
labResult->setText(tr("Ohne Wertung\n(Nicht bestanden)")); labResult->setText(tr("Ohne Wertung\n(Nicht bestanden)"));
QMessageBox::information(this, tr("Information"), tr("Sie haben weniger als die Hälfte aller Fragen beantwortet.\nDiese Prüfung wird deswegen nicht gewertet.")); QMessageBox::information(this, tr("Information"), tr("Sie haben weniger als die Hälfte aller Fragen beantwortet.\nDiese Prüfung wird deswegen nicht gewertet."));
} }
else if (uErrorPoints > m_exam.maxErrorPoints()) else if (uErrorPoints > m_exam.maxErrorPoints())
{ {
bPassed = false; bPassed = false;
labResult->setText(tr("<font color='red'>Nicht bestanden</font>")); labResult->setText(tr("<font color='red'>Nicht bestanden</font>"));
QMessageBox::information(this, tr("Ergebnis"), tr("Sie haben die Prüfung leider nicht bestanden.")); QMessageBox::information(this, tr("Ergebnis"), tr("Sie haben die Prüfung leider nicht bestanden."));
} }
else else
{ {
bPassed = true; bPassed = true;
labResult->setText(tr("<font color='green'>Bestanden</font>")); labResult->setText(tr("<font color='green'>Bestanden</font>"));
QMessageBox::information(this, tr("Ergebnis"), tr("<b>Herzlichen Glückwunsch!</b><p>Sie haben die Prüfung bestanden!")); QMessageBox::information(this, tr("Ergebnis"), tr("<b>Herzlichen Glückwunsch!</b><p>Sie haben die Prüfung bestanden!"));
} }
if (bSaveStat) if (bSaveStat)
{ // Prüfungsstatistik speichern { // Prüfungsstatistik speichern
CExamStat es(m_exam); CExamStat es(m_exam);
es.setSecs(uSecs); es.setSecs(uSecs);
es.setQuestions(m_listQuestion, m_listAnswerMask); es.setQuestions(m_listQuestion, m_listAnswerMask);

View File

@ -85,7 +85,7 @@ void CDlgExamSelect::on_buttonBox_accepted()
{ {
if (m_iSelectedExam == -1) if (m_iSelectedExam == -1)
{ {
QMessageBox::information(this, tr("Information"), tr("Bitte eine Prüfung auswählen!")); QMessageBox::information(this, tr("Information"), tr("Bitte eine Prüfung auswählen!"));
return; return;
} }
accept(); accept();

View File

@ -34,7 +34,7 @@ CDlgExamStatistic::CDlgExamStatistic(QWidget *pParent) : QDialog(pParent)
twExamStat->headerItem()->setText(1, "Ergebnis"); twExamStat->headerItem()->setText(1, "Ergebnis");
twExamStat->headerItem()->setText(2, "Fehler"); twExamStat->headerItem()->setText(2, "Fehler");
twExamStat->headerItem()->setText(3, "Dauer"); twExamStat->headerItem()->setText(3, "Dauer");
twExamStat->headerItem()->setText(4, "Ø pro Frage"); twExamStat->headerItem()->setText(4, "Ø pro Frage");
twExamStat->header()->resizeSection(0, 130); twExamStat->header()->resizeSection(0, 130);
twExamStat->header()->resizeSection(2, 50); twExamStat->header()->resizeSection(2, 50);
@ -47,7 +47,7 @@ void CDlgExamStatistic::go (CCatalog *pCatalog)
if (pCatalog->countExamStat() == 0) if (pCatalog->countExamStat() == 0)
{ {
QMessageBox::information(parentWidget(), tr("Information"), tr("Es wurden bisher noch keine Prüfungen durchgeführt.")); QMessageBox::information(parentWidget(), tr("Information"), tr("Es wurden bisher noch keine Prüfungen durchgeführt."));
return; return;
} }

View File

@ -177,7 +177,7 @@ CQuestion *p = 0;
if (m_bAssistantEnable && m_pChapter->hasRecommendedQuestions()) if (m_bAssistantEnable && m_pChapter->hasRecommendedQuestions())
{ {
// if (afu_random (0, 99) >= 0) // hier kann ggf. das Verhältnis zwischen RecommendedQuestion und Zufalls-Question ausgewählt werden // if (afu_random (0, 99) >= 0) // hier kann ggf. das Verhältnis zwischen RecommendedQuestion und Zufalls-Question ausgewählt werden
// { // {
p = findNextTargetQuestion(); p = findNextTargetQuestion();
// Wichtig: p kann hier immernoch 0 sein! Dies bedeutet, dass keine passende Frage im TargetPool gefunden wurde. // Wichtig: p kann hier immernoch 0 sein! Dies bedeutet, dass keine passende Frage im TargetPool gefunden wurde.
@ -202,7 +202,7 @@ unsigned uRnd=0;
{ {
if (list.at(0) == m_pQuestion) if (list.at(0) == m_pQuestion)
// Regel: Niemals die gleiche Frage mehrfach hintereinander // Regel: Niemals die gleiche Frage mehrfach hintereinander
// -> kann hier nicht erfüllt werden -> 0 zurückgeben -> hole Frage aus allg. Pool (siehe findNextQuestion) // -> kann hier nicht erfüllt werden -> 0 zurückgeben -> hole Frage aus allg. Pool (siehe findNextQuestion)
return 0; return 0;
else else
return list.at(0); return list.at(0);
@ -257,7 +257,7 @@ unsigned uRndMax = 0;
do /* diese Schleife verhindert, dass eine Frage zweimal hintereinander kommt */ do /* diese Schleife verhindert, dass eine Frage zweimal hintereinander kommt */
{ {
do /* diese Schleife wählt die Abfragehäufigkeit aus */ do /* diese Schleife wählt die Abfragehäufigkeit aus */
{ {
uRnd = afu_random (1, uRndMax); uRnd = afu_random (1, uRndMax);
uLevel = LEVEL_MAX; uLevel = LEVEL_MAX;
@ -268,7 +268,7 @@ unsigned uRndMax = 0;
} }
while (uCountQuestion[uLevel] == 0); while (uCountQuestion[uLevel] == 0);
// Zufällige Frage bestimmen // Zufällige Frage bestimmen
uRnd = afu_random (1, uCountQuestion[uLevel]); uRnd = afu_random (1, uCountQuestion[uLevel]);
for (i=0; i<m_listQuestion.size()-1; i++) for (i=0; i<m_listQuestion.size()-1; i++)
if (m_listQuestion[i]->level() == uLevel && --uRnd == 0) break; if (m_listQuestion[i]->level() == uLevel && --uRnd == 0) break;
@ -284,7 +284,7 @@ QString str, strCheat;
if (m_listQuestion.size() == 0) if (m_listQuestion.size() == 0)
{ {
QMessageBox::critical (this, "Fehler", "Es gibt keine Fragen, die gelernt werden könnten!"); QMessageBox::critical (this, "Fehler", "Es gibt keine Fragen, die gelernt werden könnten!");
accept(); accept();
return; return;
} }
@ -367,7 +367,7 @@ unsigned uAnswerMask = 1<<i;
pbAssistant->setToolTip(tr("Lern-Assistent aufrufen")); pbAssistant->setToolTip(tr("Lern-Assistent aufrufen"));
pbIgnore->setToolTip(tr("Meldung ignorieren, dieses Kapitel weiterlernen")); pbIgnore->setToolTip(tr("Meldung ignorieren, dieses Kapitel weiterlernen"));
pbExit->setToolTip(tr("Lernmodus beenden")); pbExit->setToolTip(tr("Lernmodus beenden"));
msgBox.setText(tr("<b>Herzlichen Glückwunsch!</b><p>Sie haben das heutige Lernziel für dieses Kapitel erreicht.<br>Bitte folgen Sie den weiteren Empfehlungen des Lernassistents.")); msgBox.setText(tr("<b>Herzlichen Glückwunsch!</b><p>Sie haben das heutige Lernziel für dieses Kapitel erreicht.<br>Bitte folgen Sie den weiteren Empfehlungen des Lernassistents."));
msgBox.setWindowTitle(tr("Ziel erreicht")); msgBox.setWindowTitle(tr("Ziel erreicht"));
msgBox.exec(); msgBox.exec();

View File

@ -97,7 +97,7 @@ void CDlgLearnAssistant::on_buttonBox_accepted()
QModelIndexList list = tvChapters->selectionModel()->selectedIndexes(); QModelIndexList list = tvChapters->selectionModel()->selectedIndexes();
if (rbList->isChecked() && list.isEmpty()) if (rbList->isChecked() && list.isEmpty())
{ {
QMessageBox::information(this, tr("Information"), tr("Bitte markieren Sie in der Liste ein Kapitel, das Sie lernen möchten!")); QMessageBox::information(this, tr("Information"), tr("Bitte markieren Sie in der Liste ein Kapitel, das Sie lernen möchten!"));
return; return;
} }
accept(); accept();

View File

@ -87,7 +87,7 @@ CQuestion *q=0;
if (listSelected.size() < questionCount()) if (listSelected.size() < questionCount())
{ {
throw CError ( throw CError (
QString("Für den regulären Ausdruck '%1' wurden nur %2 Fragen gefunden - zu wenig, um daraus %3 Fragen für die Prüfung auszuwählen.") QString("Für den regulären Ausdruck '%1' wurden nur %2 Fragen gefunden - zu wenig, um daraus %3 Fragen für die Prüfung auszuwählen.")
.arg(m_strRegExp).arg(listSelected.size()).arg(questionCount()), __PRETTY_FUNCTION__, __FILE__, __LINE__); .arg(m_strRegExp).arg(listSelected.size()).arg(questionCount()), __PRETTY_FUNCTION__, __FILE__, __LINE__);
} }
@ -181,7 +181,7 @@ QList<CQuestion*> CExam::createQuestionPool(const QList<CQuestion*>& listAllQues
QList<CQuestion*> listRet; QList<CQuestion*> listRet;
#ifdef DEBUGMSG #ifdef DEBUGMSG
qDebug ("Erzeuge Prüfungsfragen für '%s'", qPrintable(name())); qDebug ("Erzeuge Prüfungsfragen für '%s'", qPrintable(name()));
#endif #endif
try try
@ -193,12 +193,12 @@ QList<CQuestion*> listRet;
} }
catch (CError e) catch (CError e)
{ {
e.preText(QString("Konnte Prüfung '%1' nicht erzeugen.").arg(name())); e.preText(QString("Konnte Prüfung '%1' nicht erzeugen.").arg(name()));
throw; throw;
} }
#ifdef DEBUGMSG #ifdef DEBUGMSG
qDebug ("Insg. %i Prüfungsfragen ausgewählt", listRet.size()); qDebug ("Insg. %i Prüfungsfragen ausgewählt", listRet.size());
for (int i=0; i<listRet.size(); i++) for (int i=0; i<listRet.size(); i++)
qDebug ("\t%i. Frage ID '%s'", i+1, qPrintable(listRet.at(i)->id())); qDebug ("\t%i. Frage ID '%s'", i+1, qPrintable(listRet.at(i)->id()));
#endif #endif

View File

@ -137,11 +137,11 @@ void CMainWindow::setCatalog (CCatalog *pCatalog)
QDate d = m_pCatalog->validUntil(); QDate d = m_pCatalog->validUntil();
if (d.isValid() && d < QDate::currentDate()) if (d.isValid() && d < QDate::currentDate())
{ {
QString str = tr("<b>Dieser Fragenkatalog ist seit dem %1 nicht mehr gültig!</b>").arg(d.toString(Qt::LocalDate)); QString str = tr("<b>Dieser Fragenkatalog ist seit dem %1 nicht mehr gültig!</b>").arg(d.toString(Qt::LocalDate));
if (!m_pCatalog->publisher().isEmpty()) if (!m_pCatalog->publisher().isEmpty())
str += tr("<p>Weitere Informationen zur Gültigkeit erhalten Sie vom Herausgeber:<br>")+m_pCatalog->publisher(); str += tr("<p>Weitere Informationen zur Gültigkeit erhalten Sie vom Herausgeber:<br>")+m_pCatalog->publisher();
if (!m_pCatalog->contact().isEmpty()) if (!m_pCatalog->contact().isEmpty())
str += tr("<p>Einen aktuellen Fragenkatalog für den AFUTrainer erhalten Sie evt. von:<br>")+m_pCatalog->contact(); str += tr("<p>Einen aktuellen Fragenkatalog für den AFUTrainer erhalten Sie evt. von:<br>")+m_pCatalog->contact();
QMessageBox::warning(this, tr("Warnung"), str); QMessageBox::warning(this, tr("Warnung"), str);
} }
@ -154,7 +154,7 @@ QString str;
if (m_pCatalog == 0) return false; if (m_pCatalog == 0) return false;
str = m_pCatalog->checkForErrors(); str = m_pCatalog->checkForErrors();
if (str.isEmpty()) return false; if (str.isEmpty()) return false;
QMessageBox::critical(this, tr("Fehler im Fragenkatalog"), tr("Die gewünschte Funktion kann nicht ausgeführt werden, da der Fragenkatalog folgende Fehler enthält:<p>")+ str); QMessageBox::critical(this, tr("Fehler im Fragenkatalog"), tr("Die gewünschte Funktion kann nicht ausgeführt werden, da der Fragenkatalog folgende Fehler enthält:<p>")+ str);
return true; return true;
} }
@ -181,7 +181,7 @@ void CMainWindow::on_actFileOpen_triggered()
{ {
QString strFileName; QString strFileName;
if (!checkForHomeDir()) return; if (!checkForHomeDir()) return;
strFileName = QFileDialog::getOpenFileName(this, tr("Öffne Fragenkatalog"), QString(), tr("Amateur Radio Questionary Data Format (*.aqz)\nAlle Dateien (*.*)")); strFileName = QFileDialog::getOpenFileName(this, tr("Öffne Fragenkatalog"), QString(), tr("Amateur Radio Questionary Data Format (*.aqz)\nAlle Dateien (*.*)"));
onOpenFile(strFileName); onOpenFile(strFileName);
} }
@ -207,7 +207,7 @@ void CMainWindow::on_actFileInformation_triggered()
CDlgInformation dlg(this); CDlgInformation dlg(this);
if (!m_pCatalog) if (!m_pCatalog)
{ {
QMessageBox::information(this, tr("Information"), tr("Kein Fragenkatalog geladen, zu dem Informationen angezeigt werden könnten.")); QMessageBox::information(this, tr("Information"), tr("Kein Fragenkatalog geladen, zu dem Informationen angezeigt werden könnten."));
return; return;
} }
dlg.setup(m_pCatalog); dlg.setup(m_pCatalog);
@ -270,13 +270,13 @@ enum LastAdded {None, Chapter, Question, Answer};
LastAdded la=None; LastAdded la=None;
CCatalog *pCatalog=0; CCatalog *pCatalog=0;
strFileName = QFileDialog::getOpenFileName(this, tr("Öffne Datei zum Fragenkatalog-Import"), QString("D:/projekte/afutrainer/fragenkataloge/2007-02/Klasse A Technik/"), tr("TXT-Dateien (*.txt)\nAlle Dateien (*.*)")); strFileName = QFileDialog::getOpenFileName(this, tr("Öffne Datei zum Fragenkatalog-Import"), QString("D:/projekte/afutrainer/fragenkataloge/2007-02/Klasse A Technik/"), tr("TXT-Dateien (*.txt)\nAlle Dateien (*.*)"));
if (strFileName.isEmpty()) return; if (strFileName.isEmpty()) return;
QFile file(strFileName); QFile file(strFileName);
if(!file.open(QIODevice::ReadOnly)) if(!file.open(QIODevice::ReadOnly))
{ {
QMessageBox::information(this, tr("Fehler"), tr("Konnte Datei '%1' nicht zum Lesen öffnen!").arg(strFileName)); QMessageBox::information(this, tr("Fehler"), tr("Konnte Datei '%1' nicht zum Lesen öffnen!").arg(strFileName));
return; return;
} }
QTextStream in(&file); QTextStream in(&file);
@ -285,7 +285,7 @@ strFileName = QFileDialog::getOpenFileName(this, tr("
while (!in.atEnd()) while (!in.atEnd())
{ {
strLine = in.readLine().trimmed(); strLine = in.readLine().trimmed();
if (strLine.isEmpty() || strLine.contains(QRegExp("^Prüfungsfragen")) || strLine.contains("^Bundesnetzagentur")) if (strLine.isEmpty() || strLine.contains(QRegExp("^Prüfungsfragen")) || strLine.contains("^Bundesnetzagentur"))
{ {
la = None; la = None;
} }
@ -370,7 +370,7 @@ strFileName = QFileDialog::getOpenFileName(this, tr("
} }
} }
// Bilder hinzufügen // Bilder hinzufügen
QList<CQuestion*> listPool = pCatalog->questionPool(); QList<CQuestion*> listPool = pCatalog->questionPool();
QDir dirPath(strFileName.left(strFileName.lastIndexOf('/'))); QDir dirPath(strFileName.left(strFileName.lastIndexOf('/')));
for (int i=0; i<listPool.size(); i++) for (int i=0; i<listPool.size(); i++)
@ -380,7 +380,7 @@ strFileName = QFileDialog::getOpenFileName(this, tr("
for (int j=0; j<strlFiles.size(); j++) for (int j=0; j<strlFiles.size(); j++)
{ {
QString strImgFile = strlFiles.at(j).toLower(); QString strImgFile = strlFiles.at(j).toLower();
// Überprüfen, ob Verweis // Überprüfen, ob Verweis
if (strImgFile.contains("_")) if (strImgFile.contains("_"))
{ // Ja, Verweis { // Ja, Verweis
QString strImgFile1 = strImgFile.left(strImgFile.indexOf('_')); QString strImgFile1 = strImgFile.left(strImgFile.indexOf('_'));
@ -438,18 +438,18 @@ strFileName = QFileDialog::getOpenFileName(this, tr("
} }
else else
{ {
qDebug ("Konnte Grafik %s nicht zuordnen.\n\tMögliche Gründe: Frage oder Antwort existiert nicht. Dateiname der Grafik falsch geschrieben.", qPrintable(strImgFile)); qDebug ("Konnte Grafik %s nicht zuordnen.\n\tMögliche Gründe: Frage oder Antwort existiert nicht. Dateiname der Grafik falsch geschrieben.", qPrintable(strImgFile));
} }
} }
} }
pCatalog->setName("Importierter Katalog von " + strFileName); pCatalog->setName("Importierter Katalog von " + strFileName);
QMessageBox::information(this, tr("Information"), QMessageBox::information(this, tr("Information"),
"Bitte Debug-Ausgabe überprüfen, ob alle Grafik-Dateien zugeordnet wurden!<p>" "Bitte Debug-Ausgabe überprüfen, ob alle Grafik-Dateien zugeordnet wurden!<p>"
"Bitte überprüfen, ob alle Kapitel korrekt erkannt wurden. " "Bitte überprüfen, ob alle Kapitel korrekt erkannt wurden. "
"Wenn nicht, muss die TXT-Datei von Hand kontrolliert werden!<hr>"+strChapter); "Wenn nicht, muss die TXT-Datei von Hand kontrolliert werden!<hr>"+strChapter);
qDebug("Weitere Vorgehensweise:\n\t1. Fragenkatalog als XML-Datei abspeichern.\n\t2. ggf. Korrekturen in der XML-Datei vornehmen\n\t3. XML-Datei und alle Grafik-Dateien in ein ZIP-Archiv packen und die Dateiänderung auf .atc ändern.\n\tFertig!"); qDebug("Weitere Vorgehensweise:\n\t1. Fragenkatalog als XML-Datei abspeichern.\n\t2. ggf. Korrekturen in der XML-Datei vornehmen\n\t3. XML-Datei und alle Grafik-Dateien in ein ZIP-Archiv packen und die Dateiänderung auf .atc ändern.\n\tFertig!");
setCatalog (pCatalog); setCatalog (pCatalog);
} }
@ -481,13 +481,13 @@ enum LastAdded {None, Chapter, Question, Answer};
LastAdded la=None; LastAdded la=None;
CCatalog *pCatalog=0; CCatalog *pCatalog=0;
strFileName = QFileDialog::getOpenFileName(this, tr("Öffne Datei zum Fragenkatalog-Import"), QString("D:/projekte/afutrainer/fragenkataloge/US/"), tr("TXT-Dateien (*.txt)\nAlle Dateien (*.*)")); strFileName = QFileDialog::getOpenFileName(this, tr("Öffne Datei zum Fragenkatalog-Import"), QString("D:/projekte/afutrainer/fragenkataloge/US/"), tr("TXT-Dateien (*.txt)\nAlle Dateien (*.*)"));
if (strFileName.isEmpty()) return; if (strFileName.isEmpty()) return;
QFile file(strFileName); QFile file(strFileName);
if(!file.open(QIODevice::ReadOnly)) if(!file.open(QIODevice::ReadOnly))
{ {
QMessageBox::information(this, tr("Fehler"), tr("Konnte Datei '%1' nicht zum Lesen öffnen!").arg(strFileName)); QMessageBox::information(this, tr("Fehler"), tr("Konnte Datei '%1' nicht zum Lesen öffnen!").arg(strFileName));
return; return;
} }
QTextStream in(&file); QTextStream in(&file);
@ -633,10 +633,10 @@ strFileName = QFileDialog::getOpenFileName(this, tr("
pCatalog->setName("Importierter Katalog von " + strFileName); pCatalog->setName("Importierter Katalog von " + strFileName);
QMessageBox::information(this, tr("Information"), QMessageBox::information(this, tr("Information"),
"Bitte überprüfen, ob alle Kapitel korrekt erkannt wurden. " "Bitte überprüfen, ob alle Kapitel korrekt erkannt wurden. "
"Wenn nicht, muss die TXT-Datei von Hand kontrolliert werden!<hr>"+strChapter); "Wenn nicht, muss die TXT-Datei von Hand kontrolliert werden!<hr>"+strChapter);
qDebug("Weitere Vorgehensweise:\n\t1. Fragenkatalog als XML-Datei abspeichern.\n\t2. ggf. Korrekturen in der XML-Datei vornehmen\n\t3. XML-Datei und alle Grafik-Dateien in ein ZIP-Archiv packen und die Dateiänderung auf .atc ändern.\n\tFertig!"); qDebug("Weitere Vorgehensweise:\n\t1. Fragenkatalog als XML-Datei abspeichern.\n\t2. ggf. Korrekturen in der XML-Datei vornehmen\n\t3. XML-Datei und alle Grafik-Dateien in ein ZIP-Archiv packen und die Dateiänderung auf .atc ändern.\n\tFertig!");
setCatalog (pCatalog); setCatalog (pCatalog);
} }
@ -674,7 +674,7 @@ QModelIndexList list = m_pViewChapter->selectionModel()->selectedIndexes();
if (checkForErrors()) return; if (checkForErrors()) return;
if (list.isEmpty()) if (list.isEmpty())
{ {
QMessageBox::information(this, tr("Information"), tr("Bitte ein Kapitel zum Lernen auswählen!")); QMessageBox::information(this, tr("Information"), tr("Bitte ein Kapitel zum Lernen auswählen!"));
return; return;
} }
CChapter *p = (CChapter*)list.first().internalPointer(); CChapter *p = (CChapter*)list.first().internalPointer();
@ -707,7 +707,7 @@ CExam exam;
iCount = m_pCatalog->countExam(); iCount = m_pCatalog->countExam();
if (iCount == 0) if (iCount == 0)
{ {
QMessageBox::information(this, tr("Information"), tr("Dieser Fragenkatalog enthält keine Prüfungen.")); QMessageBox::information(this, tr("Information"), tr("Dieser Fragenkatalog enthält keine Prüfungen."));
return; return;
} }
else if (iCount == 1) else if (iCount == 1)
@ -734,7 +734,7 @@ CDlgExamStatistic dlg(this);
if (checkForErrors()) return; if (checkForErrors()) return;
if (m_pCatalog->countExam() == 0) if (m_pCatalog->countExam() == 0)
{ {
QMessageBox::information(this, tr("Information"), tr("Dieser Fragenkatalog enthält keine Prüfungen.")); QMessageBox::information(this, tr("Information"), tr("Dieser Fragenkatalog enthält keine Prüfungen."));
return; return;
} }
dlg.go(m_pCatalog); dlg.go(m_pCatalog);
@ -779,7 +779,7 @@ QString str = tr("<b>AFUTrainer Version 3.0</b><br>"
"along with this program; if not, write to the " "along with this program; if not, write to the "
"Free Software Foundation, Inc., " "Free Software Foundation, Inc., "
"59 Temple Place - Suite 330, Boston, MA 02111-1307, USA."); "59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.");
QMessageBox::about(this,tr("Über..."), str); QMessageBox::about(this,tr("Über..."), str);
} }
void CMainWindow::on_actHelpAboutQt_triggered() void CMainWindow::on_actHelpAboutQt_triggered()

View File

@ -153,7 +153,7 @@ QString str, strHints;
str += " " + repeatDateTextExtended(); str += " " + repeatDateTextExtended();
if (!m_listAnswerClicked.isEmpty()) if (!m_listAnswerClicked.isEmpty())
{ {
str += "<br><br><table><tr><th>Datum/Uhrzeit&nbsp;</th><th>Antwort&nbsp;</th><th>Richtig?&nbsp;</th><th>Benötigte Zeit</th></tr>"; str += "<br><br><table><tr><th>Datum/Uhrzeit&nbsp;</th><th>Antwort&nbsp;</th><th>Richtig?&nbsp;</th><th>Benötigte Zeit</th></tr>";
for (int i=0; i<m_listAnswerClicked.size(); i++) for (int i=0; i<m_listAnswerClicked.size(); i++)
{ {
CAnswerClicked ac = m_listAnswerClicked.at(i); CAnswerClicked ac = m_listAnswerClicked.at(i);
@ -337,17 +337,17 @@ int iAnswerCount = 0;
iAnswerCount = countAnswer(); iAnswerCount = countAnswer();
if (iAnswerCount != 4) if (iAnswerCount != 4)
str += QObject::tr("Die Frage %1 hat nicht exakt vier Antworten, sondern %2 Stück.").arg(id()).arg(iAnswerCount) + "<br>"; str += QObject::tr("Die Frage %1 hat nicht exakt vier Antworten, sondern %2 Stück.").arg(id()).arg(iAnswerCount) + "<br>";
iAnswerCount = countCorrectAnswer(); iAnswerCount = countCorrectAnswer();
if (iAnswerCount != 1) if (iAnswerCount != 1)
str += QObject::tr("Die Frage %1 hat nicht exakt eine richtige Antwort, sondern %2 Stück.").arg(id()).arg(iAnswerCount) + "<br>"; str += QObject::tr("Die Frage %1 hat nicht exakt eine richtige Antwort, sondern %2 Stück.").arg(id()).arg(iAnswerCount) + "<br>";
for (int j=0; j<countAnswer(); j++) for (int j=0; j<countAnswer(); j++)
{ {
if (answerAt(j).text().isEmpty()) if (answerAt(j).text().isEmpty())
str += QObject::tr("Die Antwort %1 der Frage %2 enthält keinen Text.").arg(QChar('A' + j)).arg(id()) + "<br>"; str += QObject::tr("Die Antwort %1 der Frage %2 enthält keinen Text.").arg(QChar('A' + j)).arg(id()) + "<br>";
} }
if (text().isEmpty()) if (text().isEmpty())
str += QObject::tr("Die Frage %1 enthält keinen Text.").arg(id()) + "<br>"; str += QObject::tr("Die Frage %1 enthält keinen Text.").arg(id()) + "<br>";
return str; return str;
} }
@ -415,7 +415,7 @@ QString CQuestion::correctionText(const unsigned uAnswerMask)
} }
else else
{ {
return QObject::tr("Ihre Antwort %1 war leider falsch. Die richtige Antwort wäre %2 gewesen.") return QObject::tr("Ihre Antwort %1 war leider falsch. Die richtige Antwort wäre %2 gewesen.")
.arg(answerMaskToString(uAnswerMask)).arg(answerMaskToString(correctAnswerMask())); .arg(answerMaskToString(uAnswerMask)).arg(answerMaskToString(correctAnswerMask()));
} }
} }
@ -488,7 +488,7 @@ QString CQuestion::levelText(const unsigned uLevel)
case LEVEL_VERYOFTEN: case LEVEL_VERYOFTEN:
return QObject::tr("Ahnungslos"); return QObject::tr("Ahnungslos");
case LEVEL_OFTEN: case LEVEL_OFTEN:
return QObject::tr("Anfänger"); return QObject::tr("Anfänger");
case LEVEL_NORMAL: case LEVEL_NORMAL:
return QObject::tr("Fortgeschritten"); return QObject::tr("Fortgeschritten");
case LEVEL_RARE: case LEVEL_RARE:
@ -553,16 +553,16 @@ unsigned uLevelOld=0, uLevelNew=0;
uLevelNew = levelAtEndOfDay(dtLastClicked.date()); uLevelNew = levelAtEndOfDay(dtLastClicked.date());
if (uLevelOld == uLevelNew) if (uLevelOld == uLevelNew)
strRet += tr("Die Einstufung des Lernfortschritts änderte sich an diesem Tag nicht."); strRet += tr("Die Einstufung des Lernfortschritts änderte sich an diesem Tag nicht.");
else else
strRet += tr("Der Lernfortschritt änderte sich an diesem Tag von '%1' auf '%2'.").arg(levelText(uLevelOld), levelText(uLevelNew)); strRet += tr("Der Lernfortschritt änderte sich an diesem Tag von '%1' auf '%2'.").arg(levelText(uLevelOld), levelText(uLevelNew));
return strRet; return strRet;
} }
/*! /*!
\return Datum, an dem die Frage wiederholt werden soll. \return Datum, an dem die Frage wiederholt werden soll.
Gibt es kein solches Datum, so wird ein ungültiges Datum (QDate::isValid()) zurückgegeben. Gibt es kein solches Datum, so wird ein ungültiges Datum (QDate::isValid()) zurückgegeben.
Hinweis: Das Datum kann auch in der Vergangenheit liegen! Hinweis: Das Datum kann auch in der Vergangenheit liegen!
*/ */
@ -699,7 +699,7 @@ bool CQuestion::isLearningNew() const
} }
/*! /*!
\return true: Die Frage wurde gestern oder früher zum ersten Mal beantwortet \return true: Die Frage wurde gestern oder früher zum ersten Mal beantwortet
*/ */
bool CQuestion::isKnownQuestion() const bool CQuestion::isKnownQuestion() const
{ {