@jjlmoya/utils-cooking 1.26.0 → 1.28.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/src/category/i18n/fr.ts +16 -16
- package/src/category/i18n/ru.ts +7 -7
- package/src/category/i18n/zh.ts +1 -1
- package/src/category/index.ts +2 -0
- package/src/entries.ts +3 -1
- package/src/index.ts +1 -0
- package/src/tests/i18n-titles.test.ts +3 -2
- package/src/tests/lacto-fermentation-salt-calculator.test.ts +64 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/no_en_dash.test.ts +70 -0
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/american-kitchen-converter/i18n/en.ts +2 -2
- package/src/tool/american-kitchen-converter/i18n/fr.ts +2 -2
- package/src/tool/american-kitchen-converter/i18n/pl.ts +2 -2
- package/src/tool/american-kitchen-converter/i18n/ru.ts +13 -13
- package/src/tool/american-kitchen-converter/i18n/sv.ts +2 -2
- package/src/tool/american-kitchen-converter/i18n/zh.ts +3 -3
- package/src/tool/banana-ripeness/banana-ripeness.css +56 -0
- package/src/tool/banana-ripeness/i18n/fr.ts +5 -5
- package/src/tool/banana-ripeness/i18n/ru.ts +5 -5
- package/src/tool/brine/i18n/fr.ts +4 -4
- package/src/tool/brine/i18n/ru.ts +3 -3
- package/src/tool/brine/i18n/sv.ts +9 -9
- package/src/tool/cookware-guide/i18n/fr.ts +9 -9
- package/src/tool/cookware-guide/i18n/ru.ts +6 -6
- package/src/tool/cookware-guide/i18n/zh.ts +3 -3
- package/src/tool/egg-timer/i18n/ru.ts +4 -4
- package/src/tool/ingredient-rescaler/i18n/en.ts +1 -1
- package/src/tool/ingredient-rescaler/i18n/fr.ts +3 -3
- package/src/tool/ingredient-rescaler/i18n/pl.ts +1 -1
- package/src/tool/ingredient-rescaler/i18n/ru.ts +5 -5
- package/src/tool/ingredient-rescaler/i18n/zh.ts +5 -5
- package/src/tool/kitchen-timer/i18n/de.ts +1 -1
- package/src/tool/kitchen-timer/i18n/fr.ts +8 -8
- package/src/tool/kitchen-timer/i18n/id.ts +1 -1
- package/src/tool/kitchen-timer/i18n/nl.ts +1 -1
- package/src/tool/kitchen-timer/i18n/pl.ts +1 -1
- package/src/tool/kitchen-timer/i18n/ru.ts +4 -4
- package/src/tool/kitchen-timer/i18n/sv.ts +1 -1
- package/src/tool/kitchen-timer/i18n/zh.ts +5 -5
- package/src/tool/lacto-fermentation-salt-calculator/bibliography.astro +6 -0
- package/src/tool/lacto-fermentation-salt-calculator/bibliography.ts +10 -0
- package/src/tool/lacto-fermentation-salt-calculator/component.astro +163 -0
- package/src/tool/lacto-fermentation-salt-calculator/components/DigitalScale.astro +43 -0
- package/src/tool/lacto-fermentation-salt-calculator/components/PetriDish.astro +55 -0
- package/src/tool/lacto-fermentation-salt-calculator/components/WizardMode.astro +83 -0
- package/src/tool/lacto-fermentation-salt-calculator/entry.ts +26 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/de.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/en.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/es.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/fr.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/id.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/it.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/ja.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/ko.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/nl.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/pl.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/pt.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/ru.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/sv.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/tr.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/i18n/zh.ts +195 -0
- package/src/tool/lacto-fermentation-salt-calculator/index.ts +11 -0
- package/src/tool/lacto-fermentation-salt-calculator/lacto-fermentation-salt-calculator.css +692 -0
- package/src/tool/lacto-fermentation-salt-calculator/logic.ts +37 -0
- package/src/tool/lacto-fermentation-salt-calculator/seo.astro +15 -0
- package/src/tool/meringue-peak/i18n/en.ts +3 -3
- package/src/tool/meringue-peak/i18n/ru.ts +3 -3
- package/src/tool/meringue-peak/i18n/zh.ts +2 -2
- package/src/tool/pizza/i18n/de.ts +1 -1
- package/src/tool/pizza/i18n/fr.ts +4 -4
- package/src/tool/pizza/i18n/ru.ts +6 -6
- package/src/tool/roux-guide/i18n/fr.ts +3 -3
- package/src/tool/roux-guide/i18n/ru.ts +4 -4
- package/src/tool/roux-guide/i18n/zh.ts +1 -1
- package/src/tool/sourdough-calculator/i18n/ru.ts +2 -2
- package/src/tool/sourdough-calculator/i18n/zh.ts +2 -2
- package/src/tool/yeast-converter/i18n/de.ts +1 -1
- package/src/tool/yeast-converter/i18n/en.ts +1 -1
- package/src/tool/yeast-converter/i18n/fr.ts +19 -19
- package/src/tool/yeast-converter/i18n/id.ts +1 -1
- package/src/tool/yeast-converter/i18n/nl.ts +1 -1
- package/src/tool/yeast-converter/i18n/pl.ts +1 -1
- package/src/tool/yeast-converter/i18n/pt.ts +1 -1
- package/src/tool/yeast-converter/i18n/ru.ts +4 -4
- package/src/tool/yeast-converter/i18n/sv.ts +1 -1
- package/src/tools.ts +2 -2
package/package.json
CHANGED
package/src/category/i18n/fr.ts
CHANGED
|
@@ -16,15 +16,15 @@ export const content: CategoryLocaleContent = {
|
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
type: 'paragraph',
|
|
19
|
-
html: 'Nos outils sont conçus pour éliminer les conjectures. Ils sont basés sur des <strong>protocoles scientifiques réels</strong
|
|
19
|
+
html: 'Nos outils sont conçus pour éliminer les conjectures. Ils sont basés sur des <strong>protocoles scientifiques réels</strong>: normes de la Specialty Coffee Association, ratios de boulanger, chimie moléculaire, microbiologie de la fermentation. Ce ne sont pas des " astuces de cuisine " ; c\'est une science éprouvée que vous pouvez utiliser dans votre cuisine domestique ou professionnelle.',
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
type: 'paragraph',
|
|
23
|
-
html: 'Des cuisines domestiques aux étoiles Michelin, tous les grands chefs partagent une caractéristique
|
|
23
|
+
html: 'Des cuisines domestiques aux étoiles Michelin, tous les grands chefs partagent une caractéristique: la <strong>reproductibilité</strong>. Ils ne créent pas un plat exceptionnel par hasard ; ils le créent grâce à des protocoles précis, des mesures exactes et une compréhension profonde de la raison pour laquelle les transformations se produisent.',
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
type: 'title',
|
|
27
|
-
text: 'Calculateurs de Pâtisserie et de Pâtes
|
|
27
|
+
text: 'Calculateurs de Pâtisserie et de Pâtes: Hydratation, Fermentation et Ratios Exactos',
|
|
28
28
|
level: 2,
|
|
29
29
|
},
|
|
30
30
|
{
|
|
@@ -33,11 +33,11 @@ export const content: CategoryLocaleContent = {
|
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
type: 'paragraph',
|
|
36
|
-
html: 'Maintenir une culture vivante nécessite une compréhension biologique. Les rafraîchis, la température, le moment
|
|
36
|
+
html: 'Maintenir une culture vivante nécessite une compréhension biologique. Les rafraîchis, la température, le moment: tout compte. Utilisez cet outil pour comprendre le ratio 1:1:1, les temps de fermentation et comment l\'ajuster en fonction de votre environnement :',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
type: 'paragraph',
|
|
40
|
-
html: 'Changer la taille d\'un moule ne consiste pas seulement à multiplier les ingrédients. C\'est un problème de géométrie
|
|
40
|
+
html: 'Changer la taille d\'un moule ne consiste pas seulement à multiplier les ingrédients. C\'est un problème de géométrie: un moule de 20x30 cm a une surface double de celle d\'un moule circulaire de 20 cm. Cela affecte l\'évaporation, les temps de cuisson et la hauteur finale. Calculez le facteur exact :',
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
type: 'paragraph',
|
|
@@ -45,7 +45,7 @@ export const content: CategoryLocaleContent = {
|
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
type: 'title',
|
|
48
|
-
text: 'Convertisseurs et Adaptateurs de Recettes
|
|
48
|
+
text: 'Convertisseurs et Adaptateurs de Recettes: Des États-Unis à Votre Cuisine',
|
|
49
49
|
level: 2,
|
|
50
50
|
},
|
|
51
51
|
{
|
|
@@ -58,7 +58,7 @@ export const content: CategoryLocaleContent = {
|
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
60
|
type: 'title',
|
|
61
|
-
text: 'Fermentation, Conservation et Saumure
|
|
61
|
+
text: 'Fermentation, Conservation et Saumure: Microbiologie à Domicile',
|
|
62
62
|
level: 2,
|
|
63
63
|
},
|
|
64
64
|
{
|
|
@@ -76,15 +76,15 @@ export const content: CategoryLocaleContent = {
|
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
type: 'paragraph',
|
|
79
|
-
html: 'Le point d\'ébullition de l\'eau change avec l\'altitude. À des altitudes plus élevées, l\'eau bout à une température plus basse, ce qui affecte le temps de cuisson. Cet outil s\'ajuste automatiquement en fonction de votre emplacement
|
|
79
|
+
html: 'Le point d\'ébullition de l\'eau change avec l\'altitude. À des altitudes plus élevées, l\'eau bout à une température plus basse, ce qui affecte le temps de cuisson. Cet outil s\'ajuste automatiquement en fonction de votre emplacement: 4 minutes au niveau de la mer = 5,5 minutes à 2000 m :',
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
82
|
type: 'paragraph',
|
|
83
|
-
html: 'Lors de la préparation d\'un plat complexe, vous devez coordonner plusieurs tâches
|
|
83
|
+
html: 'Lors de la préparation d\'un plat complexe, vous devez coordonner plusieurs tâches: four, plaque, repos. Chacune nécessite son propre temps et sa propre alerte :',
|
|
84
84
|
},
|
|
85
85
|
{
|
|
86
86
|
type: 'title',
|
|
87
|
-
text: 'Sauuces, Émulsions et Techniques Classiques
|
|
87
|
+
text: 'Sauuces, Émulsions et Techniques Classiques: Fondamentaux Français',
|
|
88
88
|
level: 2,
|
|
89
89
|
},
|
|
90
90
|
{
|
|
@@ -139,7 +139,7 @@ export const content: CategoryLocaleContent = {
|
|
|
139
139
|
},
|
|
140
140
|
{
|
|
141
141
|
type: 'paragraph',
|
|
142
|
-
html: 'La gastronomie mondiale s\'oriente vers la <strong>précision instrumentée</strong>. Les chefs Michelin utilisent des thermomètres infrarouges, des balances de précision au gramme, des pH-mètres. Les cuisines professionnelles disposent de laboratoires d\'analyse des saveurs. Cette tendance atteint désormais les cuisines domestiques
|
|
142
|
+
html: 'La gastronomie mondiale s\'oriente vers la <strong>précision instrumentée</strong>. Les chefs Michelin utilisent des thermomètres infrarouges, des balances de précision au gramme, des pH-mètres. Les cuisines professionnelles disposent de laboratoires d\'analyse des saveurs. Cette tendance atteint désormais les cuisines domestiques: applications de contrôle de la température, balances connectées, bases de données de recettes exactes. Ce n\'est plus réservé aux élites ; c\'est accessible à toute personne désireuse d\'apprendre.',
|
|
143
143
|
},
|
|
144
144
|
{
|
|
145
145
|
type: 'list',
|
|
@@ -152,7 +152,7 @@ export const content: CategoryLocaleContent = {
|
|
|
152
152
|
},
|
|
153
153
|
{
|
|
154
154
|
type: 'title',
|
|
155
|
-
text: 'De débutant à expert
|
|
155
|
+
text: 'De débutant à expert: Le chemin de la maîtrise culinaire',
|
|
156
156
|
level: 2,
|
|
157
157
|
},
|
|
158
158
|
{
|
|
@@ -175,16 +175,16 @@ export const content: CategoryLocaleContent = {
|
|
|
175
175
|
},
|
|
176
176
|
{
|
|
177
177
|
type: 'paragraph',
|
|
178
|
-
html: 'Pour la cuisine maison, la précision renforce la confiance. Vous savez que votre pizza fermentera correctement, que votre meringue ne s\'effondrera pas, que votre conserve ne sera pas contaminée. Pour les restaurants, c\'est une question de survie
|
|
178
|
+
html: 'Pour la cuisine maison, la précision renforce la confiance. Vous savez que votre pizza fermentera correctement, que votre meringue ne s\'effondrera pas, que votre conserve ne sera pas contaminée. Pour les restaurants, c\'est une question de survie: ils doivent reproduire un plat 50 fois par soir avec une régularité parfaite. Pour l\'industrie alimentaire, il s\'agit d\'une réglementation obligatoire. Dans tous les cas, les connaissances techniques sont le facteur de différenciation.',
|
|
179
179
|
},
|
|
180
180
|
{
|
|
181
181
|
type: 'title',
|
|
182
|
-
text: 'L\'histoire derrière ces outils
|
|
182
|
+
text: 'L\'histoire derrière ces outils: Pourquoi la précision compte',
|
|
183
183
|
level: 2,
|
|
184
184
|
},
|
|
185
185
|
{
|
|
186
186
|
type: 'paragraph',
|
|
187
|
-
html: 'J\'ai conçu ces outils parce que j\'ai fait l\'erreur que vous ferez probablement
|
|
187
|
+
html: 'J\'ai conçu ces outils parce que j\'ai fait l\'erreur que vous ferez probablement: faire confiance à " une pincée de sel ", " un peu plus d\'eau " et " jusqu\'à ce que ce soit prêt ". Dans une cuisine professionnelle, cela ne fonctionne pas. La science ne négocie pas avec l\'" approximativement ".',
|
|
188
188
|
},
|
|
189
189
|
{
|
|
190
190
|
type: 'paragraph',
|
|
@@ -196,7 +196,7 @@ export const content: CategoryLocaleContent = {
|
|
|
196
196
|
},
|
|
197
197
|
{
|
|
198
198
|
type: 'title',
|
|
199
|
-
text: 'Investissement dans les connaissances culinaires
|
|
199
|
+
text: 'Investissement dans les connaissances culinaires: ROI à long terme',
|
|
200
200
|
level: 2,
|
|
201
201
|
},
|
|
202
202
|
{
|
package/src/category/i18n/ru.ts
CHANGED
|
@@ -12,7 +12,7 @@ export const content: CategoryLocaleContent = {
|
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
type: 'paragraph',
|
|
15
|
-
html: 'Профессиональная кухня
|
|
15
|
+
html: 'Профессиональная кухня - это не интуиция; это <strong>прикладная химия</strong>. Каждое измерение, каждая температура и каждое время напрямую влияют на конечный результат. Ошибка в гидратации теста всего на 5% дает совершенно иную текстуру.',
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
type: 'paragraph',
|
|
@@ -25,11 +25,11 @@ export const content: CategoryLocaleContent = {
|
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
type: 'paragraph',
|
|
28
|
-
html: 'Пицца
|
|
28
|
+
html: 'Пицца - это не магия; это инженерия. Гидратация теста напрямую определяет структуру мякиша, растяжимость и хруст. Рассчитайте точную формулу для муки, воды, соли и дрожжей.',
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
type: 'paragraph',
|
|
32
|
-
html: 'Поддержание живой закваски требует биологического понимания. Освежения, температура, график
|
|
32
|
+
html: 'Поддержание живой закваски требует биологического понимания. Освежения, температура, график - все имеет значение. Используйте этот инструмент, чтобы понять соотношение 1:1:1 и время брожения.',
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
type: 'title',
|
|
@@ -84,10 +84,10 @@ export const content: CategoryLocaleContent = {
|
|
|
84
84
|
{
|
|
85
85
|
type: 'list',
|
|
86
86
|
items: [
|
|
87
|
-
'<strong>Фаза 1
|
|
88
|
-
'<strong>Фаза 2
|
|
89
|
-
'<strong>Фаза 3
|
|
90
|
-
'<strong>Фаза 4
|
|
87
|
+
'<strong>Фаза 1 - Основы:</strong> изучение конвертации единиц, понимание базовых пропорций (соотношения хлеба, теста, соусов).',
|
|
88
|
+
'<strong>Фаза 2 - Специфические техники:</strong> освоение контролируемой ферментации, идеальных эмульсий, безопасной консервации.',
|
|
89
|
+
'<strong>Фаза 3 - Обоснованные инновации:</strong> экспериментирование на основе прочного фундамента знаний.',
|
|
90
|
+
'<strong>Фаза 4 - Стабильное совершенство:</strong> достижение воспроизводимости. Каждое блюдо так же идеально, как предыдущее.',
|
|
91
91
|
],
|
|
92
92
|
},
|
|
93
93
|
],
|
package/src/category/i18n/zh.ts
CHANGED
|
@@ -16,7 +16,7 @@ export const content: CategoryLocaleContent = {
|
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
type: 'paragraph',
|
|
19
|
-
html: '我们的工具旨在消除猜测。它们基于<strong>真实的科学流程</strong>:SCA
|
|
19
|
+
html: '我们的工具旨在消除猜测。它们基于<strong>真实的科学流程</strong>:SCA 标准、烘焙百分比、分子化学、发酵微生物学。这些不是"厨房小窍门",而是经过验证的科学。',
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
type: 'title',
|
package/src/category/index.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { ingredientRescaler } from '../tool/ingredient-rescaler/entry';
|
|
|
11
11
|
import { sourdoughCalculator } from '../tool/sourdough-calculator/entry';
|
|
12
12
|
import { rouxGuide } from '../tool/roux-guide/entry';
|
|
13
13
|
import { cookwareGuide } from '../tool/cookware-guide/entry';
|
|
14
|
+
import { lactoFermentationSalt } from '../tool/lacto-fermentation-salt-calculator/entry';
|
|
14
15
|
|
|
15
16
|
export const cookingCategory: CookingCategoryEntry = {
|
|
16
17
|
icon: 'mdi:chef-hat',
|
|
@@ -27,6 +28,7 @@ export const cookingCategory: CookingCategoryEntry = {
|
|
|
27
28
|
sourdoughCalculator,
|
|
28
29
|
rouxGuide,
|
|
29
30
|
cookwareGuide,
|
|
31
|
+
lactoFermentationSalt,
|
|
30
32
|
],
|
|
31
33
|
i18n: {
|
|
32
34
|
es: () => import('./i18n/es').then((m) => m.content),
|
package/src/entries.ts
CHANGED
|
@@ -11,6 +11,7 @@ export { pizza } from './tool/pizza/entry';
|
|
|
11
11
|
export { rouxGuide } from './tool/roux-guide/entry';
|
|
12
12
|
export { sourdoughCalculator } from './tool/sourdough-calculator/entry';
|
|
13
13
|
export { yeastConverter } from './tool/yeast-converter/entry';
|
|
14
|
+
export { lactoFermentationSalt } from './tool/lacto-fermentation-salt-calculator/entry';
|
|
14
15
|
export { cookingCategory } from './category';
|
|
15
16
|
import { americanKitchenConverter } from './tool/american-kitchen-converter/entry';
|
|
16
17
|
import { bananaCare } from './tool/banana-ripeness/entry';
|
|
@@ -25,4 +26,5 @@ import { pizza } from './tool/pizza/entry';
|
|
|
25
26
|
import { rouxGuide } from './tool/roux-guide/entry';
|
|
26
27
|
import { sourdoughCalculator } from './tool/sourdough-calculator/entry';
|
|
27
28
|
import { yeastConverter } from './tool/yeast-converter/entry';
|
|
28
|
-
|
|
29
|
+
import { lactoFermentationSalt } from './tool/lacto-fermentation-salt-calculator/entry';
|
|
30
|
+
export const ALL_ENTRIES = [americanKitchenConverter, bananaCare, brine, cookwareGuide, eggTimer, ingredientRescaler, kitchenTimer, meringuePeak, moldScaler, pizza, rouxGuide, sourdoughCalculator, yeastConverter, lactoFermentationSalt];
|
package/src/index.ts
CHANGED
|
@@ -14,6 +14,7 @@ export { SOURDOUGH_CALCULATOR_TOOL } from './tool/sourdough-calculator';
|
|
|
14
14
|
export { ROUX_GUIDE_TOOL } from './tool/roux-guide';
|
|
15
15
|
export { COOKWARE_GUIDE_TOOL } from './tool/cookware-guide';
|
|
16
16
|
export { YEAST_CONVERTER_TOOL } from './tool/yeast-converter';
|
|
17
|
+
export { LACTO_FERMENTATION_SALT_TOOL } from './tool/lacto-fermentation-salt-calculator';
|
|
17
18
|
|
|
18
19
|
export type {
|
|
19
20
|
KnownLocale,
|
|
@@ -32,8 +32,8 @@ describe("i18n titles for FAQ", () => {
|
|
|
32
32
|
}
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
-
it("should have
|
|
36
|
-
expect(ALL_TOOLS.length).toBe(
|
|
35
|
+
it("should have 14 tools with complete i18n setup", async () => {
|
|
36
|
+
expect(ALL_TOOLS.length).toBe(14);
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
it("tool IDs should be correctly registered", () => {
|
|
@@ -50,5 +50,6 @@ describe("i18n titles for FAQ", () => {
|
|
|
50
50
|
expect(toolIds).toContain("sourdough-calculator");
|
|
51
51
|
expect(toolIds).toContain("roux-guide");
|
|
52
52
|
expect(toolIds).toContain("cookware-guide");
|
|
53
|
+
expect(toolIds).toContain("lacto-fermentation-salt-calculator");
|
|
53
54
|
});
|
|
54
55
|
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { FermentationLogic } from '../tool/lacto-fermentation-salt-calculator/logic';
|
|
3
|
+
|
|
4
|
+
describe('Lacto-Fermentation Salt Calculator Logic', () => {
|
|
5
|
+
it('calculates correct dry salting values', () => {
|
|
6
|
+
const res = FermentationLogic.calculate({
|
|
7
|
+
vegWeight: 1000,
|
|
8
|
+
waterWeight: 0,
|
|
9
|
+
salinity: 2.5,
|
|
10
|
+
mode: 'dry',
|
|
11
|
+
});
|
|
12
|
+
expect(res.saltGrams).toBe(25);
|
|
13
|
+
expect(res.status).toBe('optimal');
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('calculates correct wet brining values', () => {
|
|
17
|
+
const res = FermentationLogic.calculate({
|
|
18
|
+
vegWeight: 1000,
|
|
19
|
+
waterWeight: 500,
|
|
20
|
+
salinity: 2.0,
|
|
21
|
+
mode: 'wet',
|
|
22
|
+
});
|
|
23
|
+
expect(res.saltGrams).toBe(30);
|
|
24
|
+
expect(res.status).toBe('optimal');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('correctly classifies status based on salinity thresholds', () => {
|
|
28
|
+
const dangerRes = FermentationLogic.calculate({
|
|
29
|
+
vegWeight: 1000,
|
|
30
|
+
waterWeight: 0,
|
|
31
|
+
salinity: 1.5,
|
|
32
|
+
mode: 'dry',
|
|
33
|
+
});
|
|
34
|
+
expect(dangerRes.status).toBe('danger');
|
|
35
|
+
|
|
36
|
+
const optimalRes = FermentationLogic.calculate({
|
|
37
|
+
vegWeight: 1000,
|
|
38
|
+
waterWeight: 0,
|
|
39
|
+
salinity: 3.0,
|
|
40
|
+
mode: 'dry',
|
|
41
|
+
});
|
|
42
|
+
expect(optimalRes.status).toBe('optimal');
|
|
43
|
+
|
|
44
|
+
const inhibitedRes = FermentationLogic.calculate({
|
|
45
|
+
vegWeight: 1000,
|
|
46
|
+
waterWeight: 0,
|
|
47
|
+
salinity: 4.0,
|
|
48
|
+
mode: 'dry',
|
|
49
|
+
});
|
|
50
|
+
expect(inhibitedRes.status).toBe('inhibited');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('calculates volumetric conversions accurately', () => {
|
|
54
|
+
const res = FermentationLogic.calculate({
|
|
55
|
+
vegWeight: 1000,
|
|
56
|
+
waterWeight: 0,
|
|
57
|
+
salinity: 2.0,
|
|
58
|
+
mode: 'dry',
|
|
59
|
+
});
|
|
60
|
+
expect(res.saltGrams).toBe(20);
|
|
61
|
+
expect(res.fineTeaspoons).toBe(3.5);
|
|
62
|
+
expect(res.kosherTeaspoons).toBe(4.7);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
|
|
5
|
+
function getFiles(dir: string): string[] {
|
|
6
|
+
const results: string[] = [];
|
|
7
|
+
if (!fs.existsSync(dir)) {
|
|
8
|
+
return results;
|
|
9
|
+
}
|
|
10
|
+
const list = fs.readdirSync(dir);
|
|
11
|
+
for (const file of list) {
|
|
12
|
+
const fullPath = path.join(dir, file);
|
|
13
|
+
const stat = fs.statSync(fullPath);
|
|
14
|
+
if (stat && stat.isDirectory()) {
|
|
15
|
+
if (file !== 'tests' && file !== 'node_modules' && file !== '.astro') {
|
|
16
|
+
results.push(...getFiles(fullPath));
|
|
17
|
+
}
|
|
18
|
+
} else {
|
|
19
|
+
results.push(fullPath);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return results;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function isContentFile(filePath: string): boolean {
|
|
26
|
+
return /\\i18n\\/.test(filePath) || filePath.endsWith('bibliography.ts');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const srcDir = path.join(process.cwd(), 'src');
|
|
30
|
+
const scriptsDir = path.join(process.cwd(), 'scripts');
|
|
31
|
+
const filesToTest = [
|
|
32
|
+
...getFiles(srcDir).filter(isContentFile),
|
|
33
|
+
...getFiles(scriptsDir).filter(isContentFile),
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const aiTypographyGarbage = [
|
|
37
|
+
'\u2013',
|
|
38
|
+
'\u2014',
|
|
39
|
+
'\u2026',
|
|
40
|
+
'\u201C',
|
|
41
|
+
'\u201D',
|
|
42
|
+
'\u2018',
|
|
43
|
+
'\u2019',
|
|
44
|
+
'\u00AB',
|
|
45
|
+
'\u00BB',
|
|
46
|
+
'\u200B',
|
|
47
|
+
'\u201E',
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
describe('Typography Garbage Character Validation', () => {
|
|
51
|
+
filesToTest.forEach((filePath) => {
|
|
52
|
+
const relativePath = path.relative(process.cwd(), filePath);
|
|
53
|
+
it(`should not contain typography garbage characters in ${relativePath}`, () => {
|
|
54
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
55
|
+
const hasAiPatterns = aiTypographyGarbage.some(char => content.includes(char));
|
|
56
|
+
expect(hasAiPatterns).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it(`should not contain space before colon in ${relativePath}`, () => {
|
|
60
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
61
|
+
const spaceBeforeColon = / : /.test(content);
|
|
62
|
+
expect(spaceBeforeColon).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it(`should not contain double hyphen in ${relativePath}`, () => {
|
|
66
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
67
|
+
expect(content).not.toContain('--');
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -4,8 +4,8 @@ import { cookingCategory } from '../data';
|
|
|
4
4
|
|
|
5
5
|
describe('Tool Validation Suite', () => {
|
|
6
6
|
describe('Library Registration', () => {
|
|
7
|
-
it('should have
|
|
8
|
-
expect(ALL_TOOLS.length).toBe(
|
|
7
|
+
it('should have 14 tools in ALL_TOOLS', () => {
|
|
8
|
+
expect(ALL_TOOLS.length).toBe(14);
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
it('cookingCategory should be defined', () => {
|
|
@@ -18,7 +18,7 @@ const faq = [
|
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
question: "Is a US cup the same as an imperial cup?",
|
|
21
|
-
answer: "No. A US cup is 236ml, whereas an Imperial (UK) cup is 284ml
|
|
21
|
+
answer: "No. A US cup is 236ml, whereas an Imperial (UK) cup is 284ml-a 20% difference! Most online recipes use US cups. If not specified, the US standard is the safest assumption.",
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
question: "What temperature is 'Gas Mark 4'?",
|
|
@@ -190,7 +190,7 @@ export const content: ToolLocaleContent = {
|
|
|
190
190
|
},
|
|
191
191
|
{
|
|
192
192
|
question: "Is a US cup the same as an imperial cup?",
|
|
193
|
-
answer: "No. A US cup is 236ml, whereas an Imperial (UK) cup is 284ml
|
|
193
|
+
answer: "No. A US cup is 236ml, whereas an Imperial (UK) cup is 284ml-a 20% difference! Most online recipes use US cups. If not specified, the US standard is the safest assumption.",
|
|
194
194
|
},
|
|
195
195
|
{
|
|
196
196
|
question: "What temperature is 'Gas Mark 4'?",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ToolLocaleContent } from "../../../types";
|
|
2
2
|
import { bibliography } from '../bibliography';
|
|
3
3
|
|
|
4
|
-
const title = "Convertisseur de Cuisine Américaine
|
|
4
|
+
const title = "Convertisseur de Cuisine Américaine: Cups en Grammes, Fahrenheit";
|
|
5
5
|
const description = "Convertissez les cups, tablespoons et Fahrenheit en système métrique. Votre boussole pour décoder les recettes américaines avec une précision professionnelle.";
|
|
6
6
|
const faq = [
|
|
7
7
|
{
|
|
@@ -78,7 +78,7 @@ const appSchema = {
|
|
|
78
78
|
|
|
79
79
|
export const content: ToolLocaleContent = {
|
|
80
80
|
slug: "convertisseur-mesures-cuisine-americaine-cups-grammes",
|
|
81
|
-
title: "Convertisseur de Cuisine Américaine
|
|
81
|
+
title: "Convertisseur de Cuisine Américaine: Cups en Grammes, Fahrenheit",
|
|
82
82
|
description:
|
|
83
83
|
"Convertissez les cups, tablespoons et Fahrenheit en système métrique. Votre boussole pour décoder les recettes américaines avec une précision professionnelle.",
|
|
84
84
|
ui: {
|
|
@@ -32,7 +32,7 @@ const howTo = [
|
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
name: 'Wybierz produkt',
|
|
35
|
-
text: 'Każdy produkt ma inną gęstość. Mąka, cukier, masło
|
|
35
|
+
text: 'Każdy produkt ma inną gęstość. Mąka, cukier, masło - każdy z nich waży inaczej w tej samej objętości.',
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
name: 'Wpisz ilość',
|
|
@@ -331,7 +331,7 @@ export const content: ToolLocaleContent = {
|
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
333
|
name: 'Wybierz produkt',
|
|
334
|
-
text: 'Każdy produkt ma inną gęstość. Mąka, cukier, masło
|
|
334
|
+
text: 'Każdy produkt ma inną gęstość. Mąka, cukier, masło - każdy z nich waży inaczej w tej samej objętości.',
|
|
335
335
|
},
|
|
336
336
|
{
|
|
337
337
|
name: 'Wpisz ilość',
|
|
@@ -17,12 +17,12 @@ const faq = [
|
|
|
17
17
|
answer: '1 Tablespoon (Tbsp / столовая ложка) = 15 мл. 1 Teaspoon (tsp / чайная ложка) = 5 мл. Столовая ложка в 3 раза больше чайной. В кондитерском деле ошибки со специями (которые измеряются в tsp) очень часто ведут к неудаче.',
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
|
-
question: 'Американская чашка и имперская чашка
|
|
20
|
+
question: 'Американская чашка и имперская чашка - это одно и то же?',
|
|
21
21
|
answer: 'Нет. 1 американская чашка = 236 мл. 1 имперская чашка (UK) = 284 мл. Разница составляет 20%. Большинство американских блогов используют US cups. Если в рецепте не указано иное, считайте, что это американские чашки.',
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
question: 'Какой температуре соответствует "газ 4" в духовке?',
|
|
25
|
-
answer: 'Газ 4 = 180°C = 350°F. Это британская шкала. В рецептах мы ищем эквивалентное значение для вашей духовки: некоторые используют газовые деления, другие
|
|
25
|
+
answer: 'Газ 4 = 180°C = 350°F. Это британская шкала. В рецептах мы ищем эквивалентное значение для вашей духовки: некоторые используют газовые деления, другие - электронную установку градусов.',
|
|
26
26
|
},
|
|
27
27
|
];
|
|
28
28
|
const howTo = [
|
|
@@ -32,7 +32,7 @@ const howTo = [
|
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
name: 'Выберите ингредиент',
|
|
35
|
-
text: 'У каждого продукта своя плотность. Мука, сахар, масло
|
|
35
|
+
text: 'У каждого продукта своя плотность. Мука, сахар, масло - все они весят по-разному при одном и том же объеме.',
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
name: 'Введите количество',
|
|
@@ -159,19 +159,19 @@ export const content: ToolLocaleContent = {
|
|
|
159
159
|
tempFahrenheitAriaLabel: 'Фаренгейт',
|
|
160
160
|
tempCelsiusAriaLabel: 'Цельсий',
|
|
161
161
|
tempPreset275: '275°F',
|
|
162
|
-
tempPreset275Desc: '135°C
|
|
162
|
+
tempPreset275Desc: '135°C - Сушка',
|
|
163
163
|
tempPreset275AriaLabel: 'Установить 275 Фаренгейт',
|
|
164
164
|
tempPreset325: '325°F',
|
|
165
|
-
tempPreset325Desc: '165°C
|
|
165
|
+
tempPreset325Desc: '165°C - Плотные кексы',
|
|
166
166
|
tempPreset325AriaLabel: 'Установить 325 Фаренгейт',
|
|
167
167
|
tempPreset350: '350°F',
|
|
168
|
-
tempPreset350Desc: '175°C
|
|
168
|
+
tempPreset350Desc: '175°C - Стандарт для выпечки',
|
|
169
169
|
tempPreset350AriaLabel: 'Установить 350 Фаренгейт',
|
|
170
170
|
tempPreset400: '400°F',
|
|
171
|
-
tempPreset400Desc: '200°C
|
|
171
|
+
tempPreset400Desc: '200°C - Хлеб / Пироги',
|
|
172
172
|
tempPreset400AriaLabel: 'Установить 400 Фаренгейт',
|
|
173
173
|
tempPreset425: '425°F',
|
|
174
|
-
tempPreset425Desc: '220°C
|
|
174
|
+
tempPreset425Desc: '220°C - Пицца / Слоеное тесто',
|
|
175
175
|
tempPreset425AriaLabel: 'Установить 425 Фаренгейт',
|
|
176
176
|
},
|
|
177
177
|
seo: [
|
|
@@ -182,7 +182,7 @@ export const content: ToolLocaleContent = {
|
|
|
182
182
|
},
|
|
183
183
|
{
|
|
184
184
|
type: 'paragraph',
|
|
185
|
-
html: 'Перевод <strong>чашек в граммы</strong> или <strong>Фаренгейтов в Цельсии</strong>
|
|
185
|
+
html: 'Перевод <strong>чашек в граммы</strong> или <strong>Фаренгейтов в Цельсии</strong> - первый шаг к освоению международных рецептов. Американская кулинария основана на объеме, что создает погрешность до 25% в сухих ингредиентах, таких как мука.',
|
|
186
186
|
},
|
|
187
187
|
{
|
|
188
188
|
type: 'stats',
|
|
@@ -264,7 +264,7 @@ export const content: ToolLocaleContent = {
|
|
|
264
264
|
type: 'diagnostic',
|
|
265
265
|
variant: 'warning',
|
|
266
266
|
title: 'Бисквит получился сухим?',
|
|
267
|
-
html: 'Самая частая проблема при использовании чашек
|
|
267
|
+
html: 'Самая частая проблема при использовании чашек - зачерпывание муки прямо из пакета. Это уплотняет порошок, и вы можете добавить до 40г лишней муки на каждую чашку. Решение - <strong>всегда переводить в граммы</strong> с помощью нашего конвертера.',
|
|
268
268
|
},
|
|
269
269
|
{
|
|
270
270
|
type: 'title',
|
|
@@ -316,12 +316,12 @@ export const content: ToolLocaleContent = {
|
|
|
316
316
|
answer: '1 Tablespoon (Tbsp / столовая ложка) = 15 мл. 1 Teaspoon (tsp / чайная ложка) = 5 мл. Столовая ложка в 3 раза больше чайной. В кондитерском деле ошибки со специями (которые измеряются в tsp) очень часто ведут к неудаче.',
|
|
317
317
|
},
|
|
318
318
|
{
|
|
319
|
-
question: 'Американская чашка и имперская чашка
|
|
319
|
+
question: 'Американская чашка и имперская чашка - это одно и то же?',
|
|
320
320
|
answer: 'Нет. 1 американская чашка = 236 мл. 1 имперская чашка (UK) = 284 мл. Разница составляет 20%. Большинство американских блогов используют US cups. Если в рецепте не указано иное, считайте, что это американские чашки.',
|
|
321
321
|
},
|
|
322
322
|
{
|
|
323
323
|
question: 'Какой температуре соответствует "газ 4" в духовке?',
|
|
324
|
-
answer: 'Газ 4 = 180°C = 350°F. Это британская шкала. В рецептах мы ищем эквивалентное значение для вашей духовки: некоторые используют газовые деления, другие
|
|
324
|
+
answer: 'Газ 4 = 180°C = 350°F. Это британская шкала. В рецептах мы ищем эквивалентное значение для вашей духовки: некоторые используют газовые деления, другие - электронную установку градусов.',
|
|
325
325
|
},
|
|
326
326
|
],
|
|
327
327
|
howTo: [
|
|
@@ -331,7 +331,7 @@ export const content: ToolLocaleContent = {
|
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
333
|
name: 'Выберите ингредиент',
|
|
334
|
-
text: 'У каждого продукта своя плотность. Мука, сахар, масло
|
|
334
|
+
text: 'У каждого продукта своя плотность. Мука, сахар, масло - все они весят по-разному при одном и том же объеме.',
|
|
335
335
|
},
|
|
336
336
|
{
|
|
337
337
|
name: 'Введите количество',
|
|
@@ -32,7 +32,7 @@ const howTo = [
|
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
name: 'Välj ingrediens',
|
|
35
|
-
text: 'Varje livsmedel har olika densitet. Mjöl, socker, smör
|
|
35
|
+
text: 'Varje livsmedel har olika densitet. Mjöl, socker, smör - alla väger olika mycket.',
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
name: 'Ange mängd',
|
|
@@ -331,7 +331,7 @@ export const content: ToolLocaleContent = {
|
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
333
|
name: 'Välj ingrediens',
|
|
334
|
-
text: 'Varje livsmedel har olika densitet. Mjöl, socker, smör
|
|
334
|
+
text: 'Varje livsmedel har olika densitet. Mjöl, socker, smör - alla väger olika mycket.',
|
|
335
335
|
},
|
|
336
336
|
{
|
|
337
337
|
name: 'Ange mängd',
|
|
@@ -21,7 +21,7 @@ const faq = [
|
|
|
21
21
|
answer: "不一样。1美制量杯 = 236毫升,而1英制量杯(英国)= 284毫升。两者相差20%。大多数美国博主使用的是美制标准。如果食谱未注明,请默认按美制计算。",
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
|
-
question: "
|
|
24
|
+
question: '烤箱的"gas 4"对应多少度?',
|
|
25
25
|
answer: "Gas 4 = 180°C = 350°F。这是英国常用的燃气刻度。在厨房中,请对应您烤箱的具体刻度或电子显示进行调整。",
|
|
26
26
|
},
|
|
27
27
|
];
|
|
@@ -264,7 +264,7 @@ export const content: ToolLocaleContent = {
|
|
|
264
264
|
type: 'diagnostic',
|
|
265
265
|
variant: 'warning',
|
|
266
266
|
title: "您的蛋糕做出来太干吗?",
|
|
267
|
-
html: "
|
|
267
|
+
html: '使用量杯时最常见的问题是直接"用杯子在袋子里舀"面粉。这会压实粉末,导致您每杯面粉多加了多达40克。解决方法是<strong>始终使用我们的转换器将其换算为克</strong>。',
|
|
268
268
|
},
|
|
269
269
|
{
|
|
270
270
|
type: 'title',
|
|
@@ -320,7 +320,7 @@ export const content: ToolLocaleContent = {
|
|
|
320
320
|
answer: "不一样。1美制量杯 = 236毫升,而1英制量杯(英国)= 284毫升。两者相差20%。大多数美国博主使用的是美制标准。如果食谱未注明,请默认按美制计算。",
|
|
321
321
|
},
|
|
322
322
|
{
|
|
323
|
-
|
|
323
|
+
question: '烤箱的"gas 4"对应多少度?',
|
|
324
324
|
answer: "Gas 4 = 180°C = 350°F。这是英国常用的燃气刻度。在厨房中,请对应您烤箱的具体刻度或电子显示进行调整。",
|
|
325
325
|
},
|
|
326
326
|
],
|