From bd3b4dd045504325bd0dbb54197606603a501a92 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Tue, 19 Nov 2024 18:35:20 +0100 Subject: [PATCH 1/2] Fix missing signal for new recipe addition --- src/MainWindow.cpp | 5 +++-- src/measurement/IbuMethods.cpp | 28 ++++++++++++++-------------- src/measurement/IbuMethods.h | 6 +++--- src/model/NamedEntity.cpp | 15 +++++++++------ src/model/OwnedSet.h | 9 +++++++-- src/model/Recipe.cpp | 23 +++++++++++++++++++---- src/undoRedo/UndoableAddOrRemove.h | 5 ++++- 7 files changed, 59 insertions(+), 32 deletions(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index a9d3f0682..b9e6e0435 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -1895,14 +1895,15 @@ void MainWindow::showChanges(QMetaProperty* prop) { if (prop) { propName = prop->name(); } + qDebug() << Q_FUNC_INFO << "propName:" << propName; // May St. Stevens preserve me - this->lineEdit_name ->setText (this->pimpl->m_recipeObs->name ()); + this->lineEdit_name ->setText (this->pimpl->m_recipeObs->name ()); this->lineEdit_batchSize ->setQuantity(this->pimpl->m_recipeObs->batchSize_l ()); + this->lineEdit_efficiency->setQuantity(this->pimpl->m_recipeObs->efficiency_pct()); // TODO: One day we'll want to do some work to properly handle no-boil recipes.... std::optional const boilSize = this->pimpl->m_recipeObs->boil() ? this->pimpl->m_recipeObs->boil()->preBoilSize_l() : std::nullopt; this->lineEdit_boilSize ->setQuantity(boilSize); - this->lineEdit_efficiency->setQuantity(this->pimpl->m_recipeObs->efficiency_pct()); this->lineEdit_boilTime ->setQuantity(this->pimpl->m_recipeObs->boil()->boilTime_mins()); this->lineEdit_boilSg ->setQuantity(this->pimpl->m_recipeObs->boilGrav()); this->lineEdit_name ->setCursorPosition(0); diff --git a/src/measurement/IbuMethods.cpp b/src/measurement/IbuMethods.cpp index 9cdb68ab3..871772f56 100644 --- a/src/measurement/IbuMethods.cpp +++ b/src/measurement/IbuMethods.cpp @@ -39,10 +39,10 @@ namespace { * \brief This intermediate calculation is used in Tinseth's formula and the mIBU formula * * \param wortGravity_sg - * \param boilTime_minutes usually measured from the point at which hops are added until flameout + * \param timeInBoil_minutes usually measured from the point at which hops are added until flameout */ double calculateDecimalAlphaAcidUtilization(double const wortGravity_sg, - double const boilTime_minutes) { + double const timeInBoil_minutes) { // // TODO This is Tinseth's "Utilization Table" from which we could probably get a better value for // decimalAlphaAcidUtilization via look-up and interpolation. @@ -83,7 +83,7 @@ namespace { // // This is the short-cut way to get decimalAlphaAcidUtilization // - double const boilTimeFactor = (1.0 - exp(-0.04 * boilTime_minutes)) / 4.15; + double const boilTimeFactor = (1.0 - exp(-0.04 * timeInBoil_minutes)) / 4.15; double const bignessFactor = 1.65 * pow(0.000125, (wortGravity_sg - 1.0)); double const decimalAlphaAcidUtilization = bignessFactor * boilTimeFactor; return decimalAlphaAcidUtilization; @@ -95,13 +95,13 @@ namespace { double tinseth(IbuMethods::IbuCalculationParms const & parms) { double const mgPerLiterOfAddedAlphaAcids = (parms.AArating * parms.hops_grams * 1000) / parms.postBoilVolume_liters; double const decimalAlphaAcidUtilization = calculateDecimalAlphaAcidUtilization(parms.wortGravity_sg, - parms.boilTime_minutes); + parms.timeInBoil_minutes); return decimalAlphaAcidUtilization * mgPerLiterOfAddedAlphaAcids; -/// return ((AArating * hops_grams * 1000) / postBoilVolume_liters) * ((1.0 - exp(-0.04 * boilTime_minutes)) / 4.15) * (1.65 * pow(0.000125, (wortGravity_sg - 1))); +/// return ((AArating * hops_grams * 1000) / postBoilVolume_liters) * ((1.0 - exp(-0.04 * timeInBoil_minutes)) / 4.15) * (1.65 * pow(0.000125, (wortGravity_sg - 1))); } double rager(IbuMethods::IbuCalculationParms const & parms) { - double const utilization = (18.11 + 13.86 * tanh((parms.boilTime_minutes - 31.32) / 18.17)) / 100.0; + double const utilization = (18.11 + 13.86 * tanh((parms.timeInBoil_minutes - 31.32) / 18.17)) / 100.0; double const gravityFactor = (parms.wortGravity_sg > 1.050) ? (parms.wortGravity_sg - 1.050)/0.2 : 0.0; @@ -116,7 +116,7 @@ namespace { double const hopsFactor = parms.hops_grams/ (Measurement::Units::ounces.toCanonical(1.0).quantity * 1000.0); static const Polynomial p(Polynomial() << 0.7000029428 << -0.08868853463 << 0.02720809386 << -0.002340415323 << 0.00009925450081 << -0.000002102006144 << 0.00000002132644293 << -0.00000000008229488217); - //using 60 boilTime_minutes as a general table + //using 60 minutes as a general table static double const utilizationFactorTable[4][2] = { {1.050, 1}, {1.065, 0.9286}, @@ -136,13 +136,13 @@ namespace { utilizationFactor = utilizationFactorTable[3][1]; } - return(volumeFactor * ( hopsFactor * (100 * parms.AArating) * p.eval(parms.boilTime_minutes) ) * utilizationFactor); + return(volumeFactor * ( hopsFactor * (100 * parms.AArating) * p.eval(parms.timeInBoil_minutes) ) * utilizationFactor); } /** * \brief Intermediate step used by mIBU formula */ - double computePostBoilUtilization(double const boilTime_minutes, + double computePostBoilUtilization(double const timeInBoil_minutes, double const wortGravity_sg, double const postBoilVolume_liters, double const coolTime_minutes, @@ -156,11 +156,11 @@ namespace { double const integrationTime = 0.001; double decimalAArating = 0.0; - for (double time_minutes = boilTime_minutes; - time_minutes < boilTime_minutes + coolTime_minutes; + for (double time_minutes = timeInBoil_minutes; + time_minutes < timeInBoil_minutes + coolTime_minutes; time_minutes += integrationTime) { double const dU = -1.65 * pow(0.000125, (wortGravity_sg-1.0)) * -0.04 * exp(-0.04*time_minutes) / 4.15; - double const temp_degK = 53.70 * exp(-1.0 * b * (time_minutes - boilTime_minutes)) + 319.55; + double const temp_degK = 53.70 * exp(-1.0 * b * (time_minutes - timeInBoil_minutes)) + 319.55; double const degreeOfUtilization = // The 1.0 case accounts for nonIAA components (time_minutes < 5.0) ? 1.0 : 2.39*pow(10.0,11.0)*exp(-9773.0/temp_degK); @@ -183,8 +183,8 @@ namespace { if (!parms.kettleInternalDiameter_cm) { qWarning() << Q_FUNC_INFO << "kettleInternalDiameter_cm not set!"; } if (!parms.kettleOpeningDiameter_cm ) { qWarning() << Q_FUNC_INFO << "kettleOpeningDiameter_cm not set!"; } double const decimalAlphaAcidUtilization = calculateDecimalAlphaAcidUtilization(parms.wortGravity_sg, - parms.boilTime_minutes); - double const postBoilUtilization = computePostBoilUtilization(parms.boilTime_minutes, + parms.timeInBoil_minutes); + double const postBoilUtilization = computePostBoilUtilization(parms.timeInBoil_minutes, parms.wortGravity_sg, parms.postBoilVolume_liters, parms.coolTime_minutes.value_or(0.0), diff --git a/src/measurement/IbuMethods.h b/src/measurement/IbuMethods.h index 970bf7fbb..44b1ab7a8 100644 --- a/src/measurement/IbuMethods.h +++ b/src/measurement/IbuMethods.h @@ -91,8 +91,8 @@ namespace IbuMethods { * say that Tinseth himself confirmed "Post boil volume is correct" because "We are concerned with the mg/L * and any portions of a liter lost post boil doesn’t affect the calculation". * \param wortGravity_sg in specific gravity at around 60F I guess. - * \param boilTime_minutes - minutes that the hops are in the boil: usually measured from the point at which hops are - * added until flameout + * \param timeInBoil_minutes - minutes that the hops are in the boil: usually measured from the point at which hops + * are added until flameout * * \param coolTime_minutes - (Only used in mIbu) Time after flameout, without forced cooling. Note per * https://alchemyoverlord.wordpress.com/2015/05/12/a-modified-ibu-measurement-especially-for-late-hopping/ @@ -110,7 +110,7 @@ namespace IbuMethods { double hops_grams; double postBoilVolume_liters; double wortGravity_sg; - double boilTime_minutes; + double timeInBoil_minutes; std::optional coolTime_minutes = std::nullopt; std::optional kettleInternalDiameter_cm = std::nullopt; std::optional kettleOpeningDiameter_cm = std::nullopt; diff --git a/src/model/NamedEntity.cpp b/src/model/NamedEntity.cpp index 0ad42814e..719b4c7c9 100644 --- a/src/model/NamedEntity.cpp +++ b/src/model/NamedEntity.cpp @@ -460,13 +460,14 @@ void NamedEntity::prepareForPropertyChange(BtStringConst const & propertyName) { } void NamedEntity::propagatePropertyChange(BtStringConst const & propertyName, bool notify) const { + // + // Normally leave this log statement commented out as otherwise it can generate a lot of lines in the log files + // +// qDebug() << +// Q_FUNC_INFO << "Property name" << *propertyName << "change on" << this->metaObject()->className() << +// ": m_propagationAndSignalsEnabled " << (this->m_propagationAndSignalsEnabled ? "set" : "unset") << ", notify" << +// (notify ? "on" : "off"); if (!this->m_propagationAndSignalsEnabled) { - // - // Normally leave this log statement commented out as otherwise it can generate a lot of lines in the log files - // -// qDebug() << -// Q_FUNC_INFO << "Not propagating" << *propertyName << "change on" << this->metaObject()->className() << -// "as m_propagationAndSignalsEnabled unset"; return; } @@ -491,6 +492,8 @@ void NamedEntity::notifyPropertyChange(BtStringConst const & propertyName) const Q_ASSERT(idx >= 0); QMetaProperty metaProperty = this->metaObject()->property(idx); QVariant value = metaProperty.read(this); + // Normally leave this log statement commented out as otherwise it can generate a lot of lines in the log files +// qDebug() << Q_FUNC_INFO << this->metaObject()->className() << ":" << propertyName << "=" << value; emit this->changed(metaProperty, value); return; diff --git a/src/model/OwnedSet.h b/src/model/OwnedSet.h index 82a374b69..3e29b9e11 100644 --- a/src/model/OwnedSet.h +++ b/src/model/OwnedSet.h @@ -81,6 +81,8 @@ template concept CONCEPT_FIX_UP IsCopyable = is_Copyable * For an "unordered" set, we do not have a strict ordering of the owned items (eg two hop additions could happen * at the same time). * + * When the set changes, we emit the \c NamedEntity::changed signal on the \c owner object. + * * \param Owner class needs to inherit from \c NamedEntity * \param Item class also needs to inherit from \c NamedEntity, plus implement: \c ownerId, \c setOwnerId * For an enumerated set, \c Item also needs to implement \c seqNum, \c setSeqNum @@ -195,7 +197,7 @@ class OwnedSet { * be. */ void acceptItemChange(Item const & item, [[maybe_unused]] QMetaProperty prop, [[maybe_unused]] QVariant val) { - // If one of our steps changed, our pseudo properties may also change, so we need to emit some signals + // If one of our items changed, our pseudo properties may also change, so we need to emit some signals if (item.ownerId() == this->m_owner.key()) { emit this->m_owner.changed(this->m_owner.metaProperty(*propertyName), QVariant()); } @@ -415,7 +417,10 @@ class OwnedSet { this->m_itemIds.append(item->key()); } - // Now we changed the size of the set, have the owner tell people about it + // Now we added an item to the set, we need to listen for changes to it + this->connectItemChangedSignal(item); + + // And, now we changed the size of the set, we have the owner tell people about it this->emitSetChanged(); return item; diff --git a/src/model/Recipe.cpp b/src/model/Recipe.cpp index e11817bcb..928f5b56e 100644 --- a/src/model/Recipe.cpp +++ b/src/model/Recipe.cpp @@ -1266,6 +1266,8 @@ class Recipe::impl { * Emits changed(IBU). Depends on: _batchSize_l, _boilGrav, _boilVolume_l, _finalVolume_l */ void recalcIBU() { + qDebug() << Q_FUNC_INFO << "Recalculating IBU from" << this->m_IBU; + double calculatedIbu = 0.0; // Bitterness due to hops... @@ -1275,9 +1277,11 @@ class Recipe::impl { this->m_ibus.clear(); for (auto const & hopAddition : this->m_self.hopAdditions()) { double tmp = this->m_self.ibuFromHopAddition(*hopAddition); + qDebug() << Q_FUNC_INFO << *hopAddition << "gave IBU" << tmp; this->m_ibus.append(tmp); calculatedIbu += tmp; } + qDebug() << Q_FUNC_INFO << "Calculated IBU from hops" << calculatedIbu; // Bitterness due to hopped extracts... for (auto const & fermentableAddition : this->m_self.fermentableAdditions()) { @@ -1291,6 +1295,7 @@ class Recipe::impl { fermentableAddition->fermentable()->key() << ":" << fermentableAddition->name(); } } + qDebug() << Q_FUNC_INFO << "Calculated IBU from hops and fermentables" << calculatedIbu; if (! qFuzzyCompare(calculatedIbu, this->m_IBU)) { qDebug() << @@ -2609,7 +2614,7 @@ double Recipe::ibuFromHopAddition(RecipeAdditionHop const & hopAddition) { qCritical() << Q_FUNC_INFO << "Using Hop volume as weight - THIS IS PROBABLY WRONG!"; } double grams = hopAddition.quantity() * 1000.0; - double minutes = hopAddition.addAtTime_mins().value_or(0.0); + double hopTimeInBoil_mins = hopAddition.addAtTime_mins().value_or(0.0); // Assume 100% utilization until further notice double hopUtilization = 1.0; // Assume 60 min boil until further notice @@ -2631,12 +2636,18 @@ double Recipe::ibuFromHopAddition(RecipeAdditionHop const & hopAddition) { boilTime_mins = boil->boilTime_mins(); } + qDebug() << + Q_FUNC_INFO << "Equipment" << (equipment ? "set" : "not set") << ", Boil" << (boil ? "present" : "not present") << + ", Hop Utilization =" << hopUtilization << ", Boil Time (Mins) =" << boilTime_mins << ", Hop Addition" << + hopAddition << ", stage =" << hopAddition.stage() << ", grams =" << grams << ", hopTimeInBoil_mins = " << + hopTimeInBoil_mins << ", AArating = " << AArating; + IbuMethods::IbuCalculationParms parms = { .AArating = AArating, .hops_grams = grams, .postBoilVolume_liters = this->pimpl->m_finalVolumeNoLosses_l, .wortGravity_sg = m_og, - .boilTime_minutes = boilTime_mins, // Seems unlikely in reality that there would be fractions of a minute + .timeInBoil_minutes = boilTime_mins, // Seems unlikely in reality that there would be fractions of a minute .coolTime_minutes = boil->coolTime_mins(), }; if (equipment) { @@ -2646,13 +2657,17 @@ double Recipe::ibuFromHopAddition(RecipeAdditionHop const & hopAddition) { if (hopAddition.isFirstWort()) { ibus = fwhAdjust * IbuMethods::getIbus(parms); } else if (hopAddition.stage() == RecipeAddition::Stage::Boil) { - parms.boilTime_minutes = minutes; + parms.timeInBoil_minutes = hopTimeInBoil_mins; ibus = IbuMethods::getIbus(parms); } else if (hopAddition.stage() == RecipeAddition::Stage::Mash && mashHopAdjust > 0.0) { ibus = mashHopAdjust * IbuMethods::getIbus(parms); + } else { + qDebug() << Q_FUNC_INFO << "No IBUs from " << hopAddition; } - // Adjust for hopAddition form. Tinseth's table was created from whole cone data, + qDebug() << Q_FUNC_INFO << "IBUs before adjustment for form =" << ibus; + + // Adjust for hop form. Tinseth's table was created from whole cone data, // and it seems other formulae are optimized that way as well. So, the // utilization is considered unadjusted for whole cones, and adjusted // up for plugs and pellets. diff --git a/src/undoRedo/UndoableAddOrRemove.h b/src/undoRedo/UndoableAddOrRemove.h index 55e1181c8..d152a8c83 100755 --- a/src/undoRedo/UndoableAddOrRemove.h +++ b/src/undoRedo/UndoableAddOrRemove.h @@ -1,5 +1,5 @@ /*╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ - * undoRedo/UndoableAddOrRemove.h is part of Brewtarget, and is copyright the following authors 2020-2022: + * undoRedo/UndoableAddOrRemove.h is part of Brewtarget, and is copyright the following authors 2020-2024: * • Mattias Måhl * • Matt Young * @@ -27,6 +27,7 @@ #include #include "database/ObjectStoreWrapper.h" +#include "Logging.h" class MainWindow; @@ -148,6 +149,8 @@ class UndoableAddOrRemove : public QUndoCommand { Q_FUNC_INFO << (this->everDone ? "Redo" : "Do" ) << this->text() << "for " << this->whatToAddOrRemove->metaObject()->className() << "#" << this->whatToAddOrRemove->key() << "(" << this->whatToAddOrRemove->name() << ")"; + // Normally leave the next line commented out as it generates a lot of logging +// qDebug().noquote() << Q_FUNC_INFO << Logging::getStackTrace(); this->whatToAddOrRemove = (this->updatee.*(this->doer))(this->whatToAddOrRemove); qDebug() << From d637754f50628ddcdb4d0163503c69a4de75dc77 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Wed, 20 Nov 2024 03:17:58 +0100 Subject: [PATCH 2/2] Update change log --- CHANGES.markdown | 4 +- src/Logging.cpp | 7 ++ translations/bt_ca.ts | 2 +- translations/bt_cs.ts | 2 +- translations/bt_da.ts | 277 +++++++++++++++++++++++++++++++++++++++--- translations/bt_de.ts | 2 +- translations/bt_el.ts | 2 +- translations/bt_en.ts | 4 +- translations/bt_es.ts | 2 +- translations/bt_et.ts | 2 +- translations/bt_eu.ts | 2 +- translations/bt_fr.ts | 2 +- translations/bt_gl.ts | 2 +- translations/bt_hu.ts | 2 +- translations/bt_it.ts | 2 +- translations/bt_lv.ts | 4 +- translations/bt_nb.ts | 2 +- translations/bt_nl.ts | 2 +- translations/bt_pl.ts | 2 +- translations/bt_pt.ts | 2 +- translations/bt_ru.ts | 2 +- translations/bt_sr.ts | 2 +- translations/bt_sv.ts | 2 +- translations/bt_tr.ts | 2 +- translations/bt_zh.ts | 2 +- 25 files changed, 295 insertions(+), 41 deletions(-) diff --git a/CHANGES.markdown b/CHANGES.markdown index 6155bc755..86d00ba4b 100644 --- a/CHANGES.markdown +++ b/CHANGES.markdown @@ -23,9 +23,11 @@ Bug fixes and minor enhancements. * Crash on Windows when opening Print and Print Preview dialog [873](https://github.com/Brewtarget/brewtarget/issues/873) * Crash when you click Yes or No in the pop-up about downloading the latest version [878](https://github.com/Brewtarget/brewtarget/issues/878) * Drop down menu for Style and Equipment are so narrow, cannot see contents [879](https://github.com/Brewtarget/brewtarget/issues/879) +* OG doesn't immediately change when adding malt to a recipe [880](https://github.com/Brewtarget/brewtarget/issues/880) +* IBU doesn't update when adding hops [881](https://github.com/Brewtarget/brewtarget/issues/881) ### Release Timestamp -Sun, 17 Nov 2024 04:00:11 +0100 +Tue, 19 Nov 2024 04:00:11 +0100 ## v4.0.10 Bug fixes and minor enhancements. diff --git a/src/Logging.cpp b/src/Logging.cpp index 4c91a6d63..4a22c8c97 100644 --- a/src/Logging.cpp +++ b/src/Logging.cpp @@ -20,6 +20,7 @@ #include // For std::ostringstream +//#include #include #include @@ -527,11 +528,17 @@ QString Logging::getStackTrace() { // // TBD: Once all our compilers have full C++23 support, we should look at switching to in the standard // library. + // As at 2024-11-19, according to https://en.cppreference.com/w/cpp/compiler_support, Clang and Apple Clang do + // not have support for (and GCC needs to be version 14 to have support enabled by default. // std::ostringstream stacktrace; stacktrace << boost::stacktrace::stacktrace(); QString returnValue; QTextStream returnValueAsStream(&returnValue); + // What we'd like to be able to write: +// returnValueAsStream << "\nStacktrace:\n" << QString::fromStdString( std::to_string(std::stacktrace::current())); + // What we use in the meantime: returnValueAsStream << "\nStacktrace:\n" << QString::fromStdString(stacktrace.str()); + return returnValue; } diff --git a/translations/bt_ca.ts b/translations/bt_ca.ts index 420484112..4074619de 100644 --- a/translations/bt_ca.ts +++ b/translations/bt_ca.ts @@ -8484,7 +8484,7 @@ El volum final al primari és de %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_cs.ts b/translations/bt_cs.ts index 94d2d9793..51eaa7235 100644 --- a/translations/bt_cs.ts +++ b/translations/bt_cs.ts @@ -8336,7 +8336,7 @@ Celkový objem pro hlavní kvašení je %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_da.ts b/translations/bt_da.ts index 0e533a831..4d4d64fc3 100644 --- a/translations/bt_da.ts +++ b/translations/bt_da.ts @@ -373,6 +373,14 @@ Brewday Brygdag + + Overwrite Existing Instructions + + + + Generating instructions will overwrite the existing ones. This is not undoable. Do you want to proceed? + + BrewDayWidget @@ -1924,7 +1932,7 @@ Logfil indeholder måske flere detaljer. Add %1 step to recipe - Føj %1 trin til opskrift + Føj %1 trin til opskrift Remove %1 @@ -2446,6 +2454,13 @@ Hvis du har brug for hjælp, bedes du åbne en sag (issue) på %1 Lager + + NE + + Change %1 %2 + + + NamedEntity @@ -2717,6 +2732,35 @@ Hvis du har brug for hjælp, bedes du åbne en sag (issue) på %1 Kunne ikke skrive til filen %1! Prøv igen med nyt filnavn eller mappe + + QApplication + + %1 is already running! + + + + Another instance of %1 is already running. + +Running two copies of the program at once may lead to data loss. + +Press OK to quit. + + + + Application terminates + + + + The application encountered a fatal error. +Error message: +%1 + + + + The application encountered a fatal error. + + + QObject @@ -3449,6 +3493,57 @@ Logfil indeholder evt. flere detaljer. Tertiary Fermentation Step for %1 Tredje gæringstrin i %1 + + %1 Catalog / Database + + + + Add to Recipe + Føj til opskrift + + + New + Ny + + + Add selected %1 to recipe + + + + Create new %1 + + + + Edit selected %1 + + + + Remove selected %1 + + + + %1 name + + + + %1 name: + + + + No + Nej + + + Yes + + + + + RaIngrd + + Add %1 + + Recipe @@ -3474,7 +3569,7 @@ Logfil indeholder evt. flere detaljer. %1 water to %2, - %1 vand til %2 + %1 vand til %2 for upcoming infusions. @@ -3669,7 +3764,7 @@ The final volume in the primary is %1. %1 water to %2 - %1 vand til %2 + %1 vand til %2 Put %1 %2 into packaging for %3. @@ -4038,6 +4133,10 @@ The final volume in the primary is %1. Attenuation Forgæring + + Times Cultured + + RecipeAdjustmentSalt @@ -4618,6 +4717,13 @@ The final volume in the primary is %1. Trin + + StepClass + + Add %1 step to recipe + Føj %1 trin til opskrift + + StepExtended @@ -5447,7 +5553,7 @@ The final volume in the primary is %1. New hop - Ny humle + Ny humle Save and close @@ -5457,6 +5563,22 @@ The final volume in the primary is %1. Discard and close Annuller og luk + + New boil + + + + New + Ny + + + Save + Gem + + + Cancel + Annuller + boilStepEditor @@ -5762,6 +5884,17 @@ The final volume in the primary is %1. Målt forgæringsgrad + + editorClass + + No + Nej + + + Yes + + + equipmentEditor @@ -6008,6 +6141,26 @@ The final volume in the primary is %1. Discard and close Annuller og luk + + Internal Diameter + + + + Opening Diameter + + + + New + Ny + + + Save + Gem + + + Cancel + Annuller + fermentableEditor @@ -6283,6 +6436,18 @@ The final volume in the primary is %1. Grain Group Maltgruppe + + New + Ny + + + Save + Gem + + + Cancel + Annuller + fermentationEditor @@ -6308,7 +6473,7 @@ The final volume in the primary is %1. New hop - Ny humle + Ny humle Save and close @@ -6318,6 +6483,22 @@ The final volume in the primary is %1. Discard and close Annuller og luk + + New fermentation + + + + New + Ny + + + Save + Gem + + + Cancel + Annuller + fermentationStepEditor @@ -6684,28 +6865,40 @@ The final volume in the primary is %1. Discard and close Annuller og luk + + New + Ny + + + Save + Gem + + + Cancel + Annuller + instructionWidget Form - Type + Type Show a timer - Vis en timer + Vis en timer Show timer - Vis timer + Vis timer Mark this step completed - Marker dette trin som afsluttet + Marker dette trin som afsluttet Step completed - Trin afsluttet + Trin afsluttet @@ -7112,7 +7305,7 @@ The final volume in the primary is %1. (See Boil tab below) - (se faneblad Kogning herunder) + (se faneblad Kogning herunder) &Efficiency (%) @@ -7290,6 +7483,10 @@ The final volume in the primary is %1. Brew It! Bryg den! + + See Boil tab below + + mashDesigner @@ -7647,7 +7844,7 @@ The final volume in the primary is %1. New misc - Ny diverse ingrediens + Ny diverse ingrediens Save and close @@ -7657,6 +7854,18 @@ The final volume in the primary is %1. Discard and close Annuller og luk + + New + Ny + + + Save + Gem + + + Cancel + Annuller + namedMashEditor @@ -8546,7 +8755,7 @@ The final volume in the primary is %1. Save - Gem + Gem Main @@ -8592,6 +8801,14 @@ The final volume in the primary is %1. Discard and close Annuller og luk + + New + Ny + + + Cancel + Annuller + timerListDialog @@ -8766,7 +8983,7 @@ The final volume in the primary is %1. New hop - Ny humle + Ny humle Save and close @@ -8776,6 +8993,22 @@ The final volume in the primary is %1. Discard and close Annuller og luk + + New water + + + + New + Ny + + + Save + Gem + + + Cancel + Annuller + yeastEditor @@ -8829,11 +9062,11 @@ The final volume in the primary is %1. Times Recultured - Antal gange genhøstet + Antal gange genhøstet Times this yeast has been recultured - Antal gange denne gær er blevet genhøstet + Antal gange denne gær er blevet genhøstet Max Recultures @@ -8975,5 +9208,17 @@ The final volume in the primary is %1. Discard and close Annuller og luk + + New + Ny + + + Save + Gem + + + Cancel + Annuller + diff --git a/translations/bt_de.ts b/translations/bt_de.ts index 8d83af91b..de0f213ab 100644 --- a/translations/bt_de.ts +++ b/translations/bt_de.ts @@ -8381,7 +8381,7 @@ Das endgültige Volumen in der Hauptgärung beträgt %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_el.ts b/translations/bt_el.ts index 216f8f223..cdfcca88d 100644 --- a/translations/bt_el.ts +++ b/translations/bt_el.ts @@ -8370,7 +8370,7 @@ The final volume in the primary is %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_en.ts b/translations/bt_en.ts index 498a997c9..daa1d32d8 100644 --- a/translations/bt_en.ts +++ b/translations/bt_en.ts @@ -6511,11 +6511,11 @@ The final volume in the primary is %1. - (See Boil tab below) + Boil Time - Boil Time + See Boil tab below diff --git a/translations/bt_es.ts b/translations/bt_es.ts index 5743ee079..6cf7ff361 100644 --- a/translations/bt_es.ts +++ b/translations/bt_es.ts @@ -8436,7 +8436,7 @@ El volumen final en el primario es %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_et.ts b/translations/bt_et.ts index 2d8341440..aaa274733 100644 --- a/translations/bt_et.ts +++ b/translations/bt_et.ts @@ -6619,7 +6619,7 @@ The final volume in the primary is %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_eu.ts b/translations/bt_eu.ts index 1d880e056..dd626b126 100644 --- a/translations/bt_eu.ts +++ b/translations/bt_eu.ts @@ -6631,7 +6631,7 @@ The final volume in the primary is %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_fr.ts b/translations/bt_fr.ts index 1109533ff..ca52ad221 100644 --- a/translations/bt_fr.ts +++ b/translations/bt_fr.ts @@ -8502,7 +8502,7 @@ Le volume final dans la cuve de fermentation est de %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_gl.ts b/translations/bt_gl.ts index 883cac860..db4982512 100644 --- a/translations/bt_gl.ts +++ b/translations/bt_gl.ts @@ -6988,7 +6988,7 @@ The final volume in the primary is %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_hu.ts b/translations/bt_hu.ts index c56a79c1f..9fa661af1 100644 --- a/translations/bt_hu.ts +++ b/translations/bt_hu.ts @@ -8400,7 +8400,7 @@ Végleges mennyiség az elsődleges erjesztőben: %1 - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_it.ts b/translations/bt_it.ts index 57fb241e3..24646bbbe 100644 --- a/translations/bt_it.ts +++ b/translations/bt_it.ts @@ -8473,7 +8473,7 @@ Il Volume finale del primo è %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_lv.ts b/translations/bt_lv.ts index fd2965073..3178284e7 100644 --- a/translations/bt_lv.ts +++ b/translations/bt_lv.ts @@ -6818,11 +6818,11 @@ The final volume in the primary is %1. - (See Boil tab below) + Boil Time - Boil Time + See Boil tab below diff --git a/translations/bt_nb.ts b/translations/bt_nb.ts index 79a1f1267..b1b771761 100644 --- a/translations/bt_nb.ts +++ b/translations/bt_nb.ts @@ -8381,7 +8381,7 @@ Sluttvolumet i primærgjæringskaret er %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_nl.ts b/translations/bt_nl.ts index 27ae228f7..2048e995a 100644 --- a/translations/bt_nl.ts +++ b/translations/bt_nl.ts @@ -8430,7 +8430,7 @@ Het uiteindelijke volume in de hoofdvergisting is %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_pl.ts b/translations/bt_pl.ts index b463d1325..212a153f5 100644 --- a/translations/bt_pl.ts +++ b/translations/bt_pl.ts @@ -8286,7 +8286,7 @@ Końcowa pojemność w fermentorze wyniesie %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_pt.ts b/translations/bt_pt.ts index 1c2107d4b..b89328f66 100644 --- a/translations/bt_pt.ts +++ b/translations/bt_pt.ts @@ -8408,7 +8408,7 @@ O volume final do fermentador primário é %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_ru.ts b/translations/bt_ru.ts index bfb3152f6..bd75ec9e5 100644 --- a/translations/bt_ru.ts +++ b/translations/bt_ru.ts @@ -8436,7 +8436,7 @@ The final volume in the primary is %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_sr.ts b/translations/bt_sr.ts index 85fb4ed67..d0904e2bb 100644 --- a/translations/bt_sr.ts +++ b/translations/bt_sr.ts @@ -7756,7 +7756,7 @@ The final volume in the primary is %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_sv.ts b/translations/bt_sv.ts index 3e2d4bed1..48b021033 100644 --- a/translations/bt_sv.ts +++ b/translations/bt_sv.ts @@ -8465,7 +8465,7 @@ Primärens slutgiltiga volym är %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_tr.ts b/translations/bt_tr.ts index 56a619cac..279ce7a73 100644 --- a/translations/bt_tr.ts +++ b/translations/bt_tr.ts @@ -8295,7 +8295,7 @@ The final volume in the primary is %1. - (See Boil tab below) + See Boil tab below diff --git a/translations/bt_zh.ts b/translations/bt_zh.ts index 6354f2a9d..e4296b730 100644 --- a/translations/bt_zh.ts +++ b/translations/bt_zh.ts @@ -8198,7 +8198,7 @@ The final volume in the primary is %1. - (See Boil tab below) + See Boil tab below