diff --git a/3rdParty/enrouteManual b/3rdParty/enrouteManual index c29f5b553..a164f9b1c 160000 --- a/3rdParty/enrouteManual +++ b/3rdParty/enrouteManual @@ -1 +1 @@ -Subproject commit c29f5b553f0728ad1cb52db9ebc2a4ad5305e80e +Subproject commit a164f9b1cf7ca1306654a0719c16e175870bd46d diff --git a/3rdParty/enrouteText b/3rdParty/enrouteText index 7adf33f7b..8ae6e97db 160000 --- a/3rdParty/enrouteText +++ b/3rdParty/enrouteText @@ -1 +1 @@ -Subproject commit 7adf33f7b1cb8f0fe698d5ff4fe16223e8c8cf81 +Subproject commit 8ae6e97db4a2fc4e58f10112d1026d3f44c5a3ad diff --git a/buildscript-translations.sh b/buildscript-translations.sh index acaded82a..0c0e1a475 100755 --- a/buildscript-translations.sh +++ b/buildscript-translations.sh @@ -10,7 +10,7 @@ cd ../.. # way, source files that are not compiled (such as iOS files on a linux build # host) will still be considered. -lupdate-qt6 src -ts 3rdParty/enrouteText/assets/enroute_cz.ts +lupdate-qt6 src -ts 3rdParty/enrouteText/assets/enroute_cs.ts lupdate-qt6 src -ts 3rdParty/enrouteText/assets/enroute_de.ts lupdate-qt6 src -ts 3rdParty/enrouteText/assets/enroute_es.ts lupdate-qt6 src -ts 3rdParty/enrouteText/assets/enroute_fr.ts diff --git a/generatedSources/manual/.doctrees/08-appendix/04-authors.doctree b/generatedSources/manual/.doctrees/08-appendix/04-authors.doctree index 51f53b728..ecc278f4e 100644 Binary files a/generatedSources/manual/.doctrees/08-appendix/04-authors.doctree and b/generatedSources/manual/.doctrees/08-appendix/04-authors.doctree differ diff --git a/generatedSources/manual/.doctrees/environment.pickle b/generatedSources/manual/.doctrees/environment.pickle index d8e561d19..3f83a42ea 100644 Binary files a/generatedSources/manual/.doctrees/environment.pickle and b/generatedSources/manual/.doctrees/environment.pickle differ diff --git a/generatedSources/manual/08-appendix/04-authors.html b/generatedSources/manual/08-appendix/04-authors.html index f4469788c..eae211b2b 100644 --- a/generatedSources/manual/08-appendix/04-authors.html +++ b/generatedSources/manual/08-appendix/04-authors.html @@ -106,12 +106,22 @@
iOS Version The app has been ported to iOS by Simon Schneider. Simon -is currently student pilot (PPL) and member of the Akaflieg Freiburg -flight club, just like Stefan.
-Programming Heinz Blöchinger has helped us with file import -functionality. After 15 years of alpine gliding, Heinz has fulfilled a -big dream and now flies helicopters.
+iOS Version: The app has been ported to iOS by Simon Schneider, +who also maintains the iOS port. Simon received his PPL license in +2024. Like Stefan, he is a member of the Akaflieg Freiburg flight +club.
Programming: Heinz Blöchinger has helped us with file import +functionality. After 15 years of alpine gliding, Heinz has fulfilled +a big dream and now flies helicopters.
Programming: Christian Engelhardt started the implementation of +height density calculation. Christian is a PPL pilot in southern +Germany, studied electrical engineering and working as an Embedded SW +Engineer.
Programming: Tom Linz completed height density calculation. He +received his PPL license in late 2024. Tom works as a development +engineer for safety systems.
" + tr("Enroute Flight Navigation now computes the density height from METAR data.") + " " + result += "
" + tr("Enroute Flight Navigation now computes the density altitude from METAR data.") + " " + tr("We thank Christian Engelhardt and Tom Linz for the implementation!") + "
"; result += "" + tr("As requested by our users, Enroute Flight Navigation is now able to import flight routes in FPL and PLN formats.") + " " diff --git a/src/fileFormats/FPL.cpp b/src/fileFormats/FPL.cpp index 21c10a0f0..8364e652d 100644 --- a/src/fileFormats/FPL.cpp +++ b/src/fileFormats/FPL.cpp @@ -44,7 +44,7 @@ FileFormats::FPL::FPL(const QString& fileName) } if (xmlReader.name().compare("flight-plan") != 0) { - setError(QObject::tr("File %1 does not contain a flight plan.", "FileFormats::FPL").arg(fileName)); + setError(QObject::tr("File %1 does not contain a route.", "FileFormats::FPL").arg(fileName)); return; } @@ -144,7 +144,7 @@ FileFormats::FPL::FPL(const QString& fileName) } if (count3 == 0) { - setError(QObject::tr("File %1 does not contain a waypoint.", "FileFormats::FPL").arg(fileName)); + setError(QObject::tr("File %1 does not contain waypoints.", "FileFormats::FPL").arg(fileName)); return; } } @@ -177,7 +177,7 @@ FileFormats::FPL::FPL(const QString& fileName) } if (count4 != 1) { - setError(QObject::tr("Route point %1 does not have a unique waypoint identifier.", "FileFormats::FPL").arg(count3)); + setError(QObject::tr("Waypoint %1 does not have a unique waypoint identifier.", "FileFormats::FPL").arg(count3)); return; } @@ -195,7 +195,7 @@ FileFormats::FPL::FPL(const QString& fileName) } if (count3 == 0) { - setError(QObject::tr("File %1 does not contain a waypoint.", "FileFormats::FPL").arg(fileName)); + setError(QObject::tr("File %1 does not contain waypoints.", "FileFormats::FPL").arg(fileName)); return; } } @@ -206,7 +206,7 @@ FileFormats::FPL::FPL(const QString& fileName) } if (waypointTableCounter != 1) { - setError(QObject::tr("File %1 does not contain a waypoint.", "FileFormats::FPL").arg(fileName)); + setError(QObject::tr("File %1 does not contain waypoints.", "FileFormats::FPL").arg(fileName)); return; } if (routeCounter != 1) diff --git a/src/fileFormats/PLN.cpp b/src/fileFormats/PLN.cpp index b08e7acb2..9f61b0a2f 100644 --- a/src/fileFormats/PLN.cpp +++ b/src/fileFormats/PLN.cpp @@ -83,7 +83,7 @@ FileFormats::PLN::PLN(const QString& fileName) } if (xmlReader.name().compare("SimBase.Document", Qt::CaseInsensitive) != 0) { - setError(QObject::tr("File %1 does not contain a flight plan.", "FileFormats::PLN").arg(fileName)); + setError(QObject::tr("File %1 does not contain a route.", "FileFormats::PLN").arg(fileName)); return; } diff --git a/src/qml/dialogs/WaypointDescription.qml b/src/qml/dialogs/WaypointDescription.qml index 14d315230..873276707 100644 --- a/src/qml/dialogs/WaypointDescription.qml +++ b/src/qml/dialogs/WaypointDescription.qml @@ -82,7 +82,7 @@ CenteringDialog { if (weatherStation === null) return "" if (weatherStation.hasMETAR) - return weatherStation.metar.summary + " • " + qsTr("full report") + "" + return weatherStation.metar.summary(Navigator.aircraft, Clock.time) + " • " + qsTr("full report") + "" return "" + qsTr("read TAF") + "" } Layout.fillWidth: true diff --git a/src/weather/METAR.cpp b/src/weather/METAR.cpp index cc47472d5..0ffc8535f 100644 --- a/src/weather/METAR.cpp +++ b/src/weather/METAR.cpp @@ -314,7 +314,11 @@ QString Weather::METAR::derivedData(const Navigation::Aircraft& aircraft) const QStringList items; if (m_densityAltitude.isFinite()) { - items += tr("Density Altitude: %1").arg(aircraft.verticalDistanceToString(m_densityAltitude)); + Units::Distance const altitude = Units::Distance::fromM(m_location.altitude()); + items += tr("Density Altitude: %1 (Δ %2)").arg( + aircraft.verticalDistanceToString(m_densityAltitude), + aircraft.verticalDistanceToString(m_densityAltitude - altitude, /*forceSign=*/ true) + ); } auto relativeHumidity = Navigation::Atmosphere::relativeHumidity(m_temperature, m_dewpoint); if (!std::isnan(relativeHumidity))