@jjlmoya/utils-cooking 1.38.0 → 1.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/scripts/fix-translations.js +51 -0
- package/src/category/index.ts +5 -0
- package/src/entries.ts +6 -1
- package/src/index.ts +3 -0
- package/src/tests/i18n-titles.test.ts +2 -2
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/sous-vide-pasteurization-curves.test.ts +66 -0
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/pectin-jam-setting-calculator/bibliography.astro +6 -0
- package/src/tool/pectin-jam-setting-calculator/bibliography.ts +10 -0
- package/src/tool/pectin-jam-setting-calculator/component.astro +170 -0
- package/src/tool/pectin-jam-setting-calculator/components/CalculatorInputs.astro +44 -0
- package/src/tool/pectin-jam-setting-calculator/components/DropTestVisualizer.astro +40 -0
- package/src/tool/pectin-jam-setting-calculator/components/FruitSelector.astro +38 -0
- package/src/tool/pectin-jam-setting-calculator/components/RecipeResults.astro +72 -0
- package/src/tool/pectin-jam-setting-calculator/entry.ts +26 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/de.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/en.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/es.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/fr.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/id.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/it.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/ja.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/ko.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/nl.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/pl.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/pt.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/ru.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/sv.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/tr.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/i18n/zh.ts +248 -0
- package/src/tool/pectin-jam-setting-calculator/index.ts +11 -0
- package/src/tool/pectin-jam-setting-calculator/logic.ts +96 -0
- package/src/tool/pectin-jam-setting-calculator/pectin-jam-setting-calculator.css +730 -0
- package/src/tool/pectin-jam-setting-calculator/seo.astro +15 -0
- package/src/tool/sous-vide-pasteurization-curves/bibliography.astro +6 -0
- package/src/tool/sous-vide-pasteurization-curves/bibliography.ts +10 -0
- package/src/tool/sous-vide-pasteurization-curves/component.astro +275 -0
- package/src/tool/sous-vide-pasteurization-curves/components/Controls.astro +90 -0
- package/src/tool/sous-vide-pasteurization-curves/components/LethalityChart.astro +28 -0
- package/src/tool/sous-vide-pasteurization-curves/components/ResultsDisplay.astro +36 -0
- package/src/tool/sous-vide-pasteurization-curves/entry.ts +26 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/de.ts +323 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/en.ts +323 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/es.ts +323 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/fr.ts +323 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/id.ts +323 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/it.ts +323 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/ja.ts +323 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/ko.ts +323 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/nl.ts +323 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/pl.ts +154 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/pt.ts +323 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/ru.ts +154 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/sv.ts +154 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/tr.ts +154 -0
- package/src/tool/sous-vide-pasteurization-curves/i18n/zh.ts +323 -0
- package/src/tool/sous-vide-pasteurization-curves/index.ts +11 -0
- package/src/tool/sous-vide-pasteurization-curves/logic.ts +89 -0
- package/src/tool/sous-vide-pasteurization-curves/seo.astro +15 -0
- package/src/tool/sous-vide-pasteurization-curves/sous-vide-pasteurization-curves.css +456 -0
- package/src/tools.ts +5 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
|
|
4
|
+
const title = 'Sous Vide Pastörizasyon Eğrileri Hesaplama';
|
|
5
|
+
const description = 'Etin şeklini ve kalınlığını hesaba katarak sous vide pişirmede Salmonella ve Listeria\'ya karşı güvenli merkez pastörizasyonu için gereken kesin süreyi hesaplayın.';
|
|
6
|
+
|
|
7
|
+
const faq = [
|
|
8
|
+
{
|
|
9
|
+
question: 'Sous vide pişirmede pastörizasyon nedir?',
|
|
10
|
+
answer: 'Pastörizasyon, gıdaların belirli bir sıcaklığa kadar ısıtılması ve patojen mikroorganizmaları (Salmonella, Listeria ve E. coli gibi) güvenli, kabul edilebilir seviyelere indirmek için orada yeterince uzun süre tutulması işlemidir. Sterilizasyondan farklı olarak tüm bakteri sporlarını yok etmez ancak gıdayı tüketim için güvenli hale getirir.',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
question: 'Et kalınlığı pişirme süresini neden bu kadar dramatik etkiler?',
|
|
14
|
+
answer: 'Gıdalarda ısı transferi iletim yoluyla gerçekleşir. Gıdanın merkezinin (en soğuk noktası) su banyosu sıcaklığına ulaşması için gereken süre, kalınlığın karesiyle doğru orantılı olarak artar. Bir antrikotun kalınlığını iki katına çıkarmak, ısıtma süresini yaklaşık dört kat artırır.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Neden 54.4°C (130°F) en düşük güvenli sous vide sıcaklığı olarak kabul edilir?',
|
|
18
|
+
answer: '54.4°C\'nin altındaki sıcaklıklarda, Salmonella gibi yaygın gıda kaynaklı patojenler hayatta kalabilir ve aktif olarak çoğalabilir. Gıdalar 4 saatten fazla bu "tehlike bölgesinde" tutulursa, ısıya dayanıklı toksinler oluşabilir ve bu da ciddi gıda güvenliği riskleri oluşturur.',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
question: '6D veya 6.5D azaltma nedir?',
|
|
22
|
+
answer: 'D-azaltma, bakteri popülasyonundaki logaritmik düşüşü ifade eder. 6.5D azaltma, hedef patojenin %99.99995\'inin öldürülmesi anlamına gelir. Örneğin başlangıçta 1.000.000 bakteri varsa, 1\'den azı hayatta kalacaktır.',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
question: 'Gıda geometrisi ısıtma hızını nasıl değiştirir?',
|
|
26
|
+
answer: 'Isı bir küreye her yönden (3 boyutlu) ve bir silindire yanlardan (2 boyutlu) nüfuz ederken, düz bir plaka esas olarak üstten ve alttan (1 boyutlu) ısıtılır. Bu nedenle küreler en hızlı ısınır, bunu silindirler takip eder ve düz plakalar en uzun süreyi alır.',
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const howTo = [
|
|
31
|
+
{
|
|
32
|
+
name: 'Su banyosu sıcaklığını ayarlayın',
|
|
33
|
+
text: 'Kaydırıcıyı su banyosu sıcaklığınıza uyacak şekilde ayarlayın. Daha yüksek sıcaklıkların pastörize etme işlemini katlanarak hızlandırdığını unutmayın.',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'Et kalınlığını belirtin',
|
|
37
|
+
text: 'Etinizin en kalın kısmını milimetre cinsinden ölçün ve hesaplayıcıya girin.',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'Geometri şeklini seçin',
|
|
41
|
+
text: 'Gıdanızın düz bir plaka (bonfile, tavuk göğsü), silindir (rosto, rulo et) veya küre (köfte) şeklinde olup olmadığını seçin.',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'Hedef patojeni seçin',
|
|
45
|
+
text: 'Standart et ve kümes hayvanları güvenliği için Salmonella\'yı, yüksek riskli durumlar veya gelişmiş güvenlik için Listeria monocytogenes\'i seçin.',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'Toplam pişirme süresini inceleyin',
|
|
49
|
+
text: 'Hesaplayıcı, merkez ısıtma süresini ve pastörizasyon bekleme süresini verir. Toplam güvenli pişirme süresi için bunları toplayın.',
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
const faqSchema = {
|
|
54
|
+
'@context': 'https://schema.org' as const,
|
|
55
|
+
'@type': 'FAQPage' as const,
|
|
56
|
+
mainEntity: faq.map((item) => ({
|
|
57
|
+
'@type': 'Question' as const,
|
|
58
|
+
name: item.question,
|
|
59
|
+
acceptedAnswer: { '@type': 'Answer' as const, text: item.answer },
|
|
60
|
+
})),
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const howToSchema = {
|
|
64
|
+
'@context': 'https://schema.org' as const,
|
|
65
|
+
'@type': 'HowTo' as const,
|
|
66
|
+
name: title,
|
|
67
|
+
description,
|
|
68
|
+
step: howTo.map((step) => ({
|
|
69
|
+
'@type': 'HowToStep' as const,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema = {
|
|
76
|
+
'@context': 'https://schema.org' as const,
|
|
77
|
+
'@type': 'SoftwareApplication' as const,
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilitiesApplication',
|
|
81
|
+
operatingSystem: 'Web',
|
|
82
|
+
offers: { '@type': 'Offer' as const, price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent = {
|
|
86
|
+
slug: 'sous-vide-pastorizasyon-egrileri',
|
|
87
|
+
title: 'Sous Vide Pastörizasyon Eğrileri',
|
|
88
|
+
description: 'Etin şeklini ve kalınlığını hesaba katarak sous vide pişirmede Salmonella ve Listeria\'ya karşı güvenli merkez pastörizasyonu için gereken kesin süreyi hesaplayın.',
|
|
89
|
+
faqTitle: 'Sıkça Sorulan Sorular',
|
|
90
|
+
ui: {
|
|
91
|
+
title: 'Sous Vide Pastörizasyon Eğrileri',
|
|
92
|
+
subtitle: 'Termal letalite kinetiği ve merkez sıcaklık kompanzasyonu',
|
|
93
|
+
bathTempLabel: 'Su Banyosu Sıcaklığı',
|
|
94
|
+
thicknessLabel: 'Et Kalınlığı',
|
|
95
|
+
shapeLabel: 'Et Geometrisi',
|
|
96
|
+
shapeSlab: 'Düz Plaka (örn. Antrikot, Tavuk Göğsü)',
|
|
97
|
+
shapeCylinder: 'Silindir (örn. Rosto, Rulo Et)',
|
|
98
|
+
shapeSphere: 'Küre (örn. Köfte)',
|
|
99
|
+
pathogenLabel: 'Hedef Patojen',
|
|
100
|
+
pathogenSalmonella: 'Salmonella (Standart)',
|
|
101
|
+
pathogenListeria: 'Listeria monocytogenes',
|
|
102
|
+
resultsTitle: 'Güvenli Pastörizasyon Süresi',
|
|
103
|
+
heatingTime: 'Merkezin Banyo Sıcaklığına Ulaşma Süresi',
|
|
104
|
+
lethalityTime: 'Pastörizasyon Bekleme Süresi',
|
|
105
|
+
totalTime: 'Toplam Pişirme Süresi',
|
|
106
|
+
dangerZoneTitle: 'Biyolojik Tehlike Bölgesi',
|
|
107
|
+
dangerZoneDesc: '54.4°C\'nin altındaki sıcaklıklar gıdaları güvenli bir şekilde pastörize edemez çünkü bakteri üreme hızı termal ölüm hızını aşabilir. Bu sıcaklığın altında 4 saatten fazla sous vide pişirmeyin.',
|
|
108
|
+
chartTitle: 'Logaritmik Bakteri Azalma Eğrisi',
|
|
109
|
+
chartXLabel: 'Süre (dakika)',
|
|
110
|
+
chartYLabel: 'Logaritmik Azalma',
|
|
111
|
+
disclaimer: 'Hesaplamalar 5°C başlangıç sıcaklığı ve yağsız etin termal difüzyon katsayısı varsayımıyla yapılmıştır. Banyo sıcaklığını daima kalibre edilmiş bir termometreyle doğrulayın.',
|
|
112
|
+
minutesUnit: 'dk',
|
|
113
|
+
mmUnit: 'mm',
|
|
114
|
+
inUnit: 'inç',
|
|
115
|
+
tempUnitC: '°C',
|
|
116
|
+
tempUnitF: '°F',
|
|
117
|
+
systemLabel: 'Ölçüm Sistemi',
|
|
118
|
+
systemMetric: 'Metrik',
|
|
119
|
+
systemImperial: 'İmparatorluk'
|
|
120
|
+
},
|
|
121
|
+
faq,
|
|
122
|
+
howTo,
|
|
123
|
+
seo: [
|
|
124
|
+
{
|
|
125
|
+
type: 'title',
|
|
126
|
+
text: 'Sous Vide Pişirmede Termal Letalite Bilimi',
|
|
127
|
+
level: 2,
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'paragraph',
|
|
131
|
+
html: 'Sous vide pişirme, aşırı pişirmeye neden olmadan güvenli gıda koruması sağlamak için hassas sıcaklık kontrolüne dayanır. Yüzeyleri neredeyse anında sterilize eden geleneksel yüksek ısı yöntemlerinin aksine sous vide, yaygın patojenlerin termal ölüm eşiğine daha yakın çalışır. Güvenliği garanti altına almak için, sıcaklığa, maruz kalma süresine ve ısının gıda merkezine geçiş hızına bağlı olan bakteriyel inaktivasyon kinetiğini kesin olarak hesaplamalıyız.',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'title',
|
|
135
|
+
text: 'D-Değerleri ve z-Değerlerini Anlamak',
|
|
136
|
+
level: 3,
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'paragraph',
|
|
140
|
+
html: 'Bakteriyel termal ölüm logaritmik bir süreçtir. <strong>D-değeri</strong>, belirli bir sıcaklıkta mikrobiyal popülasyonu %90 oranında azaltmak (1-log azalma) için gereken süre olarak tanımlanır. <strong>z-değeri</strong>, D-değerini 10 kat azaltmak için gereken sıcaklık artışını temsil eder. Kümes hayvanlarındaki Salmonella için tipik bir z-değeri 5.5°C\'dir. Bu, pastörizasyonun 55°C\'de 90 dakika sürmesi durumunda, 60.5°C\'de yaklaşık 9 dakika süreceği anlamına gelir.',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'title',
|
|
144
|
+
text: 'Geçici Isı İletimi ve Merkez Sıcaklık Gecikmesi',
|
|
145
|
+
level: 3,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'paragraph',
|
|
149
|
+
html: 'Gıdalar anında ısınmaz. Isı, su banyosundan vakum poşeti yoluyla etin merkezine iletilmelidir. Bu geçici ısı iletimi, sıcaklık değişim hızının gıdanın termal difüzyon katsayısına (yağsız kas için tipik olarak yaklaşık 0.14 mm²/s) ve geometrik sınır koşullarına bağlı olduğu Fourier kanunu kullanılarak modellenir. Düz bir biftek esas olarak iki karşıt yüzeyden ısınırken, silindirik bir rosto ısıyı her yönden alarak ısı nüfuzunu hızlandırır.',
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
bibliography,
|
|
153
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
154
|
+
};
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
|
|
4
|
+
const title = '低温慢煮巴氏杀菌曲线计算器';
|
|
5
|
+
const description = '根据肉类的形状和厚度,精确计算低温慢煮中针对沙门氏菌和李斯特菌的安全中心巴氏杀菌所需时间。';
|
|
6
|
+
|
|
7
|
+
const faq = [
|
|
8
|
+
{
|
|
9
|
+
question: '什么是低温慢煮中的巴氏杀菌?',
|
|
10
|
+
answer: '巴氏杀菌是将食物加热到特定温度并保持足够长时间,以将病原微生物(如沙门氏菌、李斯特菌和大肠杆菌)减少到安全可接受水平的过程。与灭菌不同,它不会消灭所有细菌芽孢,但能使食物安全食用。',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
question: '为什么肉的厚度会如此显著地影响烹饪时间?',
|
|
14
|
+
answer: '食物中的热传递由传导控制。食物核心(最冷点)达到水浴温度所需的时间随厚度的平方增加。将牛排厚度加倍会使加热时间增加约四倍。',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '为什么54.4°C(130°F)被认为是低温慢煮的最低安全温度?',
|
|
18
|
+
answer: '在低于54.4°C的温度下,沙门氏菌等常见食源性病原体可以存活并主动繁殖。如果食物在此"危险区"中放置超过4小时,可能形成耐热毒素,构成严重的食品安全风险。',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
question: '什么是6D或6.5D减少?',
|
|
22
|
+
answer: 'D减少指的是细菌数量的十进制(对数)减少。6.5D减少意味着99.99995%的目标病原体被杀死。例如,如果原来有100万个细菌,存活的将少于1个。',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
question: '食物几何形状如何影响加热速率?',
|
|
26
|
+
answer: '热量从各个方向(3维)穿透球体,从侧面(2维)穿透圆柱体,而平板主要从顶部和底部(1维)加热。因此,球体加热最快,其次是圆柱体,平板所需时间最长。',
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const howTo = [
|
|
31
|
+
{
|
|
32
|
+
name: '设置水浴温度',
|
|
33
|
+
text: '调整滑块以匹配您的水浴温度。注意温度越高,巴氏杀菌速度呈指数级加快。',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: '指定肉类厚度',
|
|
37
|
+
text: '以毫米为单位测量肉类最厚的部分,并将其输入计算器。',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: '选择几何形状',
|
|
41
|
+
text: '选择您的食物形状是平板(牛排、鸡胸肉)、圆柱体(牛里脊、肉卷)还是球体(肉丸)。',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: '选择目标病原体',
|
|
45
|
+
text: '选择沙门氏菌用于标准肉类和禽类安全,或选择单核细胞增生李斯特菌用于高风险人群或更高安全标准。',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: '查看总烹饪时间',
|
|
49
|
+
text: '计算器输出核心加热时间和致死保持时间。将两者相加得到安全烹饪的总时长。',
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
const faqSchema = {
|
|
54
|
+
'@context': 'https://schema.org' as const,
|
|
55
|
+
'@type': 'FAQPage' as const,
|
|
56
|
+
mainEntity: faq.map((item) => ({
|
|
57
|
+
'@type': 'Question' as const,
|
|
58
|
+
name: item.question,
|
|
59
|
+
acceptedAnswer: { '@type': 'Answer' as const, text: item.answer },
|
|
60
|
+
})),
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const howToSchema = {
|
|
64
|
+
'@context': 'https://schema.org' as const,
|
|
65
|
+
'@type': 'HowTo' as const,
|
|
66
|
+
name: title,
|
|
67
|
+
description,
|
|
68
|
+
step: howTo.map((step) => ({
|
|
69
|
+
'@type': 'HowToStep' as const,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema = {
|
|
76
|
+
'@context': 'https://schema.org' as const,
|
|
77
|
+
'@type': 'SoftwareApplication' as const,
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilitiesApplication',
|
|
81
|
+
operatingSystem: 'Web',
|
|
82
|
+
offers: { '@type': 'Offer' as const, price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent = {
|
|
86
|
+
slug: 'sous-vide-pasteurization-curves',
|
|
87
|
+
title: '低温慢煮巴氏杀菌曲线',
|
|
88
|
+
description: '根据肉类的形状和厚度,精确计算低温慢煮中针对沙门氏菌和李斯特菌的安全中心巴氏杀菌所需时间。',
|
|
89
|
+
faqTitle: '常见问题',
|
|
90
|
+
ui: {
|
|
91
|
+
title: '低温慢煮巴氏杀菌曲线',
|
|
92
|
+
subtitle: '热致死动力学与核心温度补偿',
|
|
93
|
+
bathTempLabel: '水浴温度',
|
|
94
|
+
thicknessLabel: '肉类厚度',
|
|
95
|
+
shapeLabel: '肉类几何形状',
|
|
96
|
+
shapeSlab: '平板(例如:牛排、鸡胸肉)',
|
|
97
|
+
shapeCylinder: '圆柱体(例如:里脊肉、肉卷)',
|
|
98
|
+
shapeSphere: '球体(例如:肉丸)',
|
|
99
|
+
pathogenLabel: '目标病原体',
|
|
100
|
+
pathogenSalmonella: '沙门氏菌(标准)',
|
|
101
|
+
pathogenListeria: '单核细胞增生李斯特菌',
|
|
102
|
+
resultsTitle: '安全巴氏杀菌时间',
|
|
103
|
+
heatingTime: '核心加热时间',
|
|
104
|
+
lethalityTime: '病原体致死时间',
|
|
105
|
+
totalTime: '总烹饪时间',
|
|
106
|
+
dangerZoneTitle: '生物危害危险区',
|
|
107
|
+
dangerZoneDesc: '低于54.4°C(130°F)的温度无法安全地进行巴氏杀菌,因为细菌繁殖速度可能超过热致死速度。请勿在此温度以下进行超过4小时的低温慢煮。',
|
|
108
|
+
chartTitle: '对数细菌减少曲线',
|
|
109
|
+
chartXLabel: '时间(分钟)',
|
|
110
|
+
chartYLabel: '对数减少',
|
|
111
|
+
disclaimer: '计算基于5°C的初始温度和瘦肉的导热系数。请始终使用校准的数字温度计验证水浴温度。',
|
|
112
|
+
minutesUnit: '分钟',
|
|
113
|
+
mmUnit: '毫米',
|
|
114
|
+
inUnit: '英寸',
|
|
115
|
+
tempUnitC: '°C',
|
|
116
|
+
tempUnitF: '°F',
|
|
117
|
+
systemLabel: '计量单位',
|
|
118
|
+
systemMetric: '公制',
|
|
119
|
+
systemImperial: '英制'
|
|
120
|
+
},
|
|
121
|
+
faq,
|
|
122
|
+
howTo,
|
|
123
|
+
seo: [
|
|
124
|
+
{
|
|
125
|
+
type: 'title',
|
|
126
|
+
text: '低温慢煮巴氏杀菌:家庭厨师的完整安全指南',
|
|
127
|
+
level: 2,
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'paragraph',
|
|
131
|
+
html: '低温慢煮烹饪已经改变了家庭厨房,使任何拥有浸入式循环器的人都能做出不可能过熟的牛排。但这种方法隐藏着一个关键的复杂性:在产生完美三分熟粉红色边缘到边缘的低温下,您正在危险细菌热致死阈值的上方仅几毫米处操作。本指南准确解释了如何计算任何肉块在任何温度下的安全巴氏杀菌时间,让您再也不会端出未煮熟的鸡肉或鱼肉。',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'title',
|
|
135
|
+
text: '为什么低温慢煮安全性与传统烹饪不同',
|
|
136
|
+
level: 3,
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'paragraph',
|
|
140
|
+
html: '当您在200°C煎鸡胸肉时,表面立即达到致死温度,细菌在几秒钟内死亡。低温慢煮翻转了这个模型:水浴以您希望食物达到的精确最终温度运行,有时低至55°C。在这些温度下,杀死沙门氏菌或李斯特菌不是瞬间的 - - 这是一个缓慢的、时间依赖的过程,以分钟甚至小时计算。USDA FSIS附录A表格规定,在鸡肉中实现沙门氏菌6.5-log减少需要在核心达到温度后在60°C下保持约28分钟。在55°C时,这个时间延长到将近90分钟。如果您在计时器响起时取出袋子而没有考虑致死时间,您可能正在提供巴氏杀菌不足的食物。',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'title',
|
|
144
|
+
text: '实际低温慢煮时间:家庭厨师真正需要什么',
|
|
145
|
+
level: 2,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'paragraph',
|
|
149
|
+
html: '下表反映了家庭厨师实际搜索的内容:特定肉块、常见温度、包含加热滞后和病原体致死保持的总时间。这些值假设厚度为25mm,从冷藏温度(5°C)开始,目标为6.5-log沙门氏菌减少。',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'table',
|
|
153
|
+
headers: ['食物', '水浴温度', '核心加热', '致死保持', '总时间', '结果'],
|
|
154
|
+
rows: [
|
|
155
|
+
['鸡胸肉', '60°C / 140°F', '约35分钟', '约28分钟', '约63分钟', '多汁,完全巴氏杀菌'],
|
|
156
|
+
['鸡胸肉', '65°C / 149°F', '约35分钟', '约3分钟', '约38分钟', '更紧实,传统口感'],
|
|
157
|
+
['三文鱼排', '50°C / 122°F', '约20分钟', '约55分钟', '约75分钟', '黄油般柔滑,半透明,安全'],
|
|
158
|
+
['牛排', '55°C / 131°F', '约40分钟', '约89分钟', '约129分钟', '三分熟,表面巴氏杀菌'],
|
|
159
|
+
['猪里脊', '60°C / 140°F', '约35分钟', '约28分钟', '约63分钟', '嫩滑,略带粉色'],
|
|
160
|
+
['鸭胸肉', '57°C / 135°F', '约35分钟', '约52分钟', '约87分钟', '浓郁,五分熟,食品安全'],
|
|
161
|
+
['火鸡胸肉', '63°C / 145°F', '约40分钟', '约9分钟', '约49分钟', '湿润,绝不干柴'],
|
|
162
|
+
['肉丸(球体)', '60°C / 140°F', '约25分钟', '约28分钟', '约53分钟', '均匀熟透'],
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
type: 'title',
|
|
167
|
+
text: '细菌死亡的对数数学:D值和z值详解',
|
|
168
|
+
level: 3,
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
type: 'paragraph',
|
|
172
|
+
html: '细菌不会像拨动开关一样一次性全部死亡。热致死遵循一级动力学:在给定温度下,每单位时间有恒定比例的细菌群被杀死。<strong>D值</strong>(十进减少时间)是在特定温度下杀死90%现有细菌所需的时间 - - 即1-log减少。沙门氏菌在60°C下的D值约为4.3分钟。<strong>z值</strong>(沙门氏菌通常为5.5°C)告诉我们需要将温度提高多少才能使过程加快10倍。将水浴从55°C提高到60.5°C,所需的致死时间就减少到十分之一 - - 从89分钟降至约9分钟。这种指数关系就是为什么在65°C下烹饪比在55°C下烹饪显著更快更安全,尽管食物的外观几乎相同。',
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
type: 'title',
|
|
176
|
+
text: '危险区:为什么54.4°C(130°F)是绝对下限',
|
|
177
|
+
level: 3,
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
type: 'diagnostic',
|
|
181
|
+
variant: 'warning',
|
|
182
|
+
title: '低于54.4 C(130 F)存在生物危害',
|
|
183
|
+
html: '切勿在低于54.4 C(130 F)的温度下进行超过4小时的低温慢煮。在此阈值以下的温度,沙门氏菌和产气荚膜梭菌等细菌的热致死速度实际上比其自然繁殖速度更慢。细菌数量可能在烹饪过程中增长。更糟的是,蜡样芽孢杆菌和E型肉毒杆菌等某些病原体可能产生耐热的毒素,在烹饪后依然存活。如果您的循环器显示52 C,而您以为低温慢煮更安全,将肉放置8小时,您正在制造生物危害。',
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
type: 'title',
|
|
187
|
+
text: '肉类形状和厚度如何主导烹饪时间',
|
|
188
|
+
level: 3,
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
type: 'paragraph',
|
|
192
|
+
html: '食物的热中心 - - 达到目标温度的最后一个点 - - 决定了总烹饪时间。热传导遵循傅里叶定律,核心达到水浴温度1°C以内所需的时间与<strong>厚度的平方</strong>成正比。将鸡胸肉的厚度从25mm加倍到50mm,加热时间从35分钟增加到约140分钟,翻了四倍。形状至关重要:<strong>平板</strong>(牛排、鱼排)从两个相对表面加热,是最慢的几何形状。<strong>圆柱体</strong>(里脊肉、肉卷)从所有侧面径向接收热量,比相同厚度的平板加热快约1.4倍。<strong>球体</strong>(肉丸)从各个方向加热,是最快的几何形状,比平板快约1.7倍。这就是为什么球形食物如肉丸或意式炸饭球能出人意料地快速达到安全核心温度。',
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
type: 'title',
|
|
196
|
+
text: '沙门氏菌 vs 李斯特菌:选择您的目标病原体',
|
|
197
|
+
level: 3,
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
type: 'comparative',
|
|
201
|
+
columns: 2,
|
|
202
|
+
items: [
|
|
203
|
+
{
|
|
204
|
+
title: '沙门氏菌(标准)',
|
|
205
|
+
icon: 'mdi:bacteria-outline',
|
|
206
|
+
description: '最常见的禽类污染物,中等热敏感性,广泛用作USDA FSIS标准中的参考病原体。',
|
|
207
|
+
points: [
|
|
208
|
+
'z值5.5 C:中等热敏感性',
|
|
209
|
+
'目标:禽类6.5-log减少,牛肉5-log',
|
|
210
|
+
'D60 = 4.3分钟:在60 C下相对较快死亡',
|
|
211
|
+
'对于健康成人,使用标准巴氏杀菌时间即可安全',
|
|
212
|
+
'作为所有肉类类型中肠道沙门氏菌血清型的替代指标',
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
title: '单核细胞增生李斯特菌',
|
|
217
|
+
icon: 'mdi:shield-alert-outline',
|
|
218
|
+
description: '比沙门氏菌具有更高的耐热性。对包括孕妇和免疫功能低下者在内的脆弱人群至关重要。',
|
|
219
|
+
highlight: true,
|
|
220
|
+
points: [
|
|
221
|
+
'比沙门氏菌更高的耐热性',
|
|
222
|
+
'z值6.0 C:需要更大的温度提升来加速杀灭',
|
|
223
|
+
'目标:建议6-log减少',
|
|
224
|
+
'D60 = 7.7分钟:所需时间几乎是沙门氏菌的两倍',
|
|
225
|
+
'对孕妇、老年人和免疫功能低下者至关重要',
|
|
226
|
+
],
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
type: 'title',
|
|
232
|
+
text: '脆弱人群的食品安全:当标准巴氏杀菌不够时',
|
|
233
|
+
level: 3,
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
type: 'paragraph',
|
|
237
|
+
html: '孕妇、65岁以上成人、化疗患者、移植受者以及HIV或自身免疫性疾病患者面临显著更高的食源性疾病风险。特别是单核细胞增生李斯特菌可以穿过胎盘屏障,导致流产、死产或新生儿脑膜炎 - - 即使母亲没有表现出任何症状。对于这些人群,标准的6.5-log沙门氏菌减少是不够的。选择李斯特菌作为目标病原体并相应延长烹饪时间。在60°C下,李斯特菌相对于沙门氏菌的额外致死时间为25mm鸡胸肉增加约16分钟 - - 用少量时间换取显著的安全余量。',
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
type: 'title',
|
|
241
|
+
text: '为什么起始冷藏温度很重要:始终从冷藏温度开始测量',
|
|
242
|
+
level: 3,
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
type: 'paragraph',
|
|
246
|
+
html: '本计算器假设起始温度为5°C - - 标准冰箱温度。如果您直接从-18°C的冷冻室取出肉类,核心达到目标温度所需的时间将显著延长。冷冻肌肉组织内冰的融化潜热在0°C处形成一个平台期,可能增加30-50%的加热时间。在低温慢煮前,务必在冰箱中完全解冻冷冻物品,并验证核心起始温度。同样,如果您在装袋前将肉放在台面上回温30分钟,减少的加热时间不会被本模型捕获,您可能超过巴氏杀菌要求 - - 这是安全的,但可能影响口感。',
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
type: 'title',
|
|
250
|
+
text: '巴氏杀菌不等于灭菌:什么会存活下来',
|
|
251
|
+
level: 3,
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
type: 'paragraph',
|
|
255
|
+
html: '巴氏杀菌将病原体减少到公共卫生标准认为安全的水平 - - 通常是5-log到7-log的减少。这不会产生无菌产品。某些细菌芽孢,包括<em>肉毒杆菌</em>和<em>产气荚膜梭菌</em>,可以在巴氏杀菌温度下存活,并在食物储存不当时萌发。低温慢煮后,食物必须立即食用、保持在54.4°C以上供餐,或在2小时内用冰浴快速冷却至4°C以下。真空密封袋创造了肉毒杆菌理想的厌氧环境;切勿将已烹饪的低温慢煮袋置于室温下。对于超过5天的冷藏储存,建议冷冻。',
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
type: 'title',
|
|
259
|
+
text: 'USDA FSIS合规:在家达到监管标准',
|
|
260
|
+
level: 3,
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
type: 'paragraph',
|
|
264
|
+
html: 'USDA食品安全检验局(FSIS)附录A为肉类和禽类产品的致死性能标准提供了权威的监管框架。这些表格规定了沙门氏菌特定对数减少所需的时间-温度组合。虽然是为商业加工商设计的,但家庭厨师可以使用相同的科学原理。例如,FSIS附录A规定即食禽类产品必须实现沙门氏菌6.5-log减少。在60°C下,整个产品达到温度后所需的保持时间为28.1分钟。本计算器使用基于同行评审的热灭活研究中得出的D值和z值的一级阿伦尼乌斯动力学,实现了FSIS数学模型,适用于家庭低温慢煮循环器使用。',
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
type: 'title',
|
|
268
|
+
text: '鱼类和海鲜:不同蛋白质有不同规则',
|
|
269
|
+
level: 3,
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
type: 'paragraph',
|
|
273
|
+
html: '鱼肉与哺乳动物或禽肉具有不同的热特性。由于密度较低且典型的切片较薄,鱼加热更快,但需要关注的病原体不同。对于生或轻烹鱼类,<em>弧菌</em>属和<em>异尖线虫</em>寄生虫是主要关注点,而非沙门氏菌。FDA建议在生食前将鱼在-20°C下冷冻7天以杀死寄生虫,然后在最终烹饪时对李斯特菌进行低温慢煮巴氏杀菌。在50°C下烹饪的三文鱼需要约55分钟的保持时间来实现6-log李斯特菌减少,产生其他烹饪方法无法实现的独特口感。金枪鱼和其他鲭科鱼类需要额外注意:烹饪前细菌作用产生的组胺具有耐热性,不会被巴氏杀菌破坏;始终从信誉良好的供应商处采购寿司级鱼类,并在烹饪前保持在4°C以下。',
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
type: 'title',
|
|
277
|
+
text: '口感与安全的权衡:为什么高温更快但不同',
|
|
278
|
+
level: 3,
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
type: 'paragraph',
|
|
282
|
+
html: '每位低温慢煮厨师都面临同样的决定:为获得更好的口感而低温慢煮更长时间,或为便利和安全余量而高温快煮。在60°C下烹制的鸡胸肉如此多汁,甚至挑战了人们对鸡肉的期望,但在核心平衡后需要28分钟的致死保持,总烹饪时间超过一小时。在65°C下,同样的鸡胸肉仅需3分钟的保持时间即可巴氏杀菌,总计38分钟,但肌纤维收缩更多,排出一些水分。两种方法都没有错;计算器只是为您提供数字以做出明智的选择。对于时间灵活的晚宴,选择低温。对于工作日晚餐,选择高温。只要遵守计算出的时间,食物永远是安全的。',
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
type: 'title',
|
|
286
|
+
text: '设备校准:您的循环器可能在欺骗您',
|
|
287
|
+
level: 3,
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
type: 'tip',
|
|
291
|
+
html: '<strong>用校准的数字温度计验证您的浸入式循环器温度。</strong> 家用循环器可能随时间漂移1-2°C,在巴氏杀菌的边缘温度(55-58°C)下,这可能意味着安全89分钟烹饪与危险的巴氏杀菌不足之间的差别。每月一次在保温良好的容器中用参考温度计测试您的循环器。在55°C时,1°C的误差会使沙门氏菌的致死时间变化约30分钟。',
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
type: 'title',
|
|
295
|
+
text: '烹饪多个物品:袋子数量如何影响热传递',
|
|
296
|
+
level: 3,
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
type: 'paragraph',
|
|
300
|
+
html: '一个常见错误是将多个袋子放入低温慢煮水浴中,并假设为单个物品计算的时间仍然适用。水必须在袋子之间自由循环才能有效传递热量。塞得过满的水浴会产生停滞的冷区,袋子在其中相互隔绝加热的水。作为经验法则,袋子之间至少留出2厘米的水空间,如果烹饪超过4个物品,将计算时间增加15-20%以补偿。更好的是,使用足够大的容器,使水能够在每个袋子周围自由循环。对于肉丸等球形物品,如果它们相互接触或堆叠,几何形状优势会显著减弱,因为接触点会阻挡径向热传递。',
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
type: 'title',
|
|
304
|
+
text: '快速参考:按食物类型列出的最低安全温度和时间',
|
|
305
|
+
level: 2,
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
type: 'table',
|
|
309
|
+
headers: ['食物类型', '最低核心温度', '最低温度下的巴氏杀菌时间', '更快方式', '推荐人群'],
|
|
310
|
+
rows: [
|
|
311
|
+
['鸡肉及禽类', '60°C / 140°F', '约28分钟(6.5-log沙门氏菌)', '65°C:约3分钟保持', '所有消费者'],
|
|
312
|
+
['猪肉(整块)', '60°C / 140°F', '约28分钟(6.5-log沙门氏菌)', '65°C:约3分钟保持', '所有消费者'],
|
|
313
|
+
['牛肉(牛排、烤肉)', '55°C / 131°F', '约89分钟(6.5-log沙门氏菌)', '60°C:约28分钟保持', '健康成人(表面巴氏杀菌)'],
|
|
314
|
+
['碎牛肉', '60°C / 140°F', '约28分钟(6.5-log沙门氏菌)', '65°C:即时', '所有消费者(细菌混合均匀)'],
|
|
315
|
+
['鱼类及海鲜', '50°C / 122°F', '约55分钟(李斯特菌)', '55°C:约22分钟保持', '预先冷冻以控制寄生虫'],
|
|
316
|
+
['鸡蛋(带壳)', '57°C / 135°F', '约75分钟(沙门氏菌)', '60°C:约28分钟保持', '巴氏杀菌带壳鸡蛋'],
|
|
317
|
+
['蔬菜', '85°C / 185°F', '不适用(酶失活)', '不适用', '果胶分解,无需担心病原体'],
|
|
318
|
+
],
|
|
319
|
+
},
|
|
320
|
+
],
|
|
321
|
+
bibliography,
|
|
322
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
323
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../../types';
|
|
2
|
+
import { sousVidePasteurization } from './entry';
|
|
3
|
+
|
|
4
|
+
export * from './entry';
|
|
5
|
+
|
|
6
|
+
export const SOUS_VIDE_PASTEURIZATION_TOOL: ToolDefinition = {
|
|
7
|
+
entry: sousVidePasteurization,
|
|
8
|
+
Component: () => import('./component.astro'),
|
|
9
|
+
SEOComponent: () => import('./seo.astro'),
|
|
10
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
11
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export interface SousVideInput {
|
|
2
|
+
bathTemp: number;
|
|
3
|
+
thickness: number;
|
|
4
|
+
shape: 'slab' | 'cylinder' | 'sphere';
|
|
5
|
+
pathogen: 'salmonella' | 'listeria';
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface SousVideResult {
|
|
9
|
+
heatingMinutes: number;
|
|
10
|
+
lethalityMinutes: number;
|
|
11
|
+
totalMinutes: number;
|
|
12
|
+
isDangerZone: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const SALMONELLA_POINTS: [number, number][] = [
|
|
16
|
+
[54.4, 112],
|
|
17
|
+
[55.0, 89],
|
|
18
|
+
[56.0, 64],
|
|
19
|
+
[57.0, 42],
|
|
20
|
+
[58.0, 25],
|
|
21
|
+
[59.0, 15],
|
|
22
|
+
[60.0, 9],
|
|
23
|
+
[61.0, 5],
|
|
24
|
+
[62.0, 3],
|
|
25
|
+
[63.0, 2],
|
|
26
|
+
[64.0, 1.2],
|
|
27
|
+
[65.0, 0.8],
|
|
28
|
+
[70.0, 0.1]
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const LISTERIA_POINTS: [number, number][] = [
|
|
32
|
+
[54.4, 200],
|
|
33
|
+
[55.0, 150],
|
|
34
|
+
[56.0, 100],
|
|
35
|
+
[57.0, 68],
|
|
36
|
+
[58.0, 45],
|
|
37
|
+
[59.0, 28],
|
|
38
|
+
[60.0, 18],
|
|
39
|
+
[61.0, 11],
|
|
40
|
+
[62.0, 7],
|
|
41
|
+
[63.0, 4.5],
|
|
42
|
+
[64.0, 3.0],
|
|
43
|
+
[65.0, 2.0],
|
|
44
|
+
[70.0, 0.1]
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
function interpolateExponential(temp: number, points: [number, number][]): number {
|
|
48
|
+
if (temp <= points[0][0]) return points[0][1];
|
|
49
|
+
if (temp >= points[points.length - 1][0]) return points[points.length - 1][1];
|
|
50
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
51
|
+
const [t1, val1] = points[i];
|
|
52
|
+
const [t2, val2] = points[i + 1];
|
|
53
|
+
if (temp >= t1 && temp <= t2) {
|
|
54
|
+
const log1 = Math.log(val1);
|
|
55
|
+
const log2 = Math.log(val2);
|
|
56
|
+
const ratio = (temp - t1) / (t2 - t1);
|
|
57
|
+
return Math.exp(log1 + ratio * (log2 - log1));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return points[points.length - 1][1];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export class SousVideLogic {
|
|
64
|
+
static calculate(input: SousVideInput): SousVideResult {
|
|
65
|
+
const isDangerZone = input.bathTemp < 54.4;
|
|
66
|
+
|
|
67
|
+
let shapeFactor = 0.12;
|
|
68
|
+
if (input.shape === 'cylinder') {
|
|
69
|
+
shapeFactor = 0.047;
|
|
70
|
+
} else if (input.shape === 'sphere') {
|
|
71
|
+
shapeFactor = 0.03;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const heatingMinutes = parseFloat((shapeFactor * input.thickness * input.thickness).toFixed(1));
|
|
75
|
+
|
|
76
|
+
const points = input.pathogen === 'listeria' ? LISTERIA_POINTS : SALMONELLA_POINTS;
|
|
77
|
+
const rawLethality = interpolateExponential(input.bathTemp, points);
|
|
78
|
+
const lethalityMinutes = parseFloat(rawLethality.toFixed(1));
|
|
79
|
+
|
|
80
|
+
const totalMinutes = parseFloat((heatingMinutes + lethalityMinutes).toFixed(1));
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
heatingMinutes,
|
|
84
|
+
lethalityMinutes,
|
|
85
|
+
totalMinutes,
|
|
86
|
+
isDangerZone
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { sousVidePasteurization } from './entry';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'en' } = Astro.props;
|
|
11
|
+
const content = await sousVidePasteurization.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|