@jjlmoya/utils-alcohol 1.15.0 → 1.17.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/tests/slug_language_code_format.test.ts +23 -0
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tool/alcoholClearance/i18n/it.ts +1 -1
- package/src/tool/alcoholClearance/i18n/nl.ts +1 -1
- package/src/tool/alcoholClearance/i18n/tr.ts +1 -1
- package/src/tool/beerCooler/i18n/de.ts +1 -1
- package/src/tool/beerCooler/i18n/id.ts +1 -1
- package/src/tool/beerCooler/i18n/it.ts +1 -1
- package/src/tool/beerCooler/i18n/nl.ts +1 -1
- package/src/tool/beerCooler/i18n/pl.ts +1 -1
- package/src/tool/beerCooler/i18n/pt.ts +1 -1
- package/src/tool/beerCooler/i18n/ru.ts +1 -1
- package/src/tool/beerCooler/i18n/sv.ts +1 -1
- package/src/tool/beerCooler/i18n/tr.ts +1 -1
- package/src/tool/carbonationCalculator/i18n/de.ts +1 -1
- package/src/tool/carbonationCalculator/i18n/id.ts +1 -1
- package/src/tool/carbonationCalculator/i18n/ru.ts +1 -1
- package/src/tool/cocktailBalancer/i18n/de.ts +1 -1
- package/src/tool/cocktailBalancer/i18n/id.ts +1 -1
- package/src/tool/cocktailBalancer/i18n/it.ts +1 -1
- package/src/tool/cocktailBalancer/i18n/nl.ts +1 -1
- package/src/tool/cocktailBalancer/i18n/pl.ts +1 -1
- package/src/tool/cocktailBalancer/i18n/pt.ts +1 -1
- package/src/tool/cocktailBalancer/i18n/ru.ts +1 -1
- package/src/tool/cocktailBalancer/i18n/sv.ts +1 -1
- package/src/tool/cocktailBalancer/i18n/tr.ts +1 -1
- package/src/tool/partyKeg/i18n/ja.ts +1 -1
- package/src/tool/partyKeg/i18n/ko.ts +1 -1
- package/src/tool/partyKeg/i18n/ru.ts +1 -1
- package/src/tool/partyKeg/i18n/tr.ts +1 -1
- package/src/tool/partyKeg/i18n/zh.ts +1 -1
package/package.json
CHANGED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { ALL_TOOLS } from '../tools';
|
|
3
|
+
import type { ToolLocaleContent } from '../types';
|
|
4
|
+
|
|
5
|
+
describe('Slug Language Code Format Validation', () => {
|
|
6
|
+
ALL_TOOLS.forEach((tool) => {
|
|
7
|
+
describe(`Tool: ${tool.entry.id}`, () => {
|
|
8
|
+
it('slug should not end with 2-letter language codes like -ja, -ru, -ko', async () => {
|
|
9
|
+
const locales = Object.keys(tool.entry.i18n);
|
|
10
|
+
|
|
11
|
+
for (const locale of locales) {
|
|
12
|
+
const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
|
|
13
|
+
const content = (await loader?.()) as ToolLocaleContent;
|
|
14
|
+
|
|
15
|
+
expect(
|
|
16
|
+
content.slug,
|
|
17
|
+
`Tool "${tool.entry.id}" locale "${locale}" slug ("${content.slug}") cannot end with a 2-letter language code (e.g., -ja, -ru, -ko).`,
|
|
18
|
+
).not.toMatch(/-[a-z]{2}$/);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { ALL_TOOLS } from '../tools';
|
|
3
|
+
import type { ToolLocaleContent } from '../types';
|
|
4
|
+
|
|
5
|
+
const sharingLocales = ['ja', 'ko', 'zh'];
|
|
6
|
+
|
|
7
|
+
interface ValidateParams {
|
|
8
|
+
toolId: string;
|
|
9
|
+
locale: string;
|
|
10
|
+
content: ToolLocaleContent;
|
|
11
|
+
enSlug: string;
|
|
12
|
+
slugs: Map<string, string>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const validateLocaleSlug = ({
|
|
16
|
+
toolId,
|
|
17
|
+
locale,
|
|
18
|
+
content,
|
|
19
|
+
enSlug,
|
|
20
|
+
slugs,
|
|
21
|
+
}: ValidateParams) => {
|
|
22
|
+
expect(
|
|
23
|
+
content.slug,
|
|
24
|
+
`Tool "${toolId}" locale "${locale}" has an invalid slug ("${content.slug}"). Slugs must be transliterated (only a-z, 0-9, and -).`,
|
|
25
|
+
).toMatch(/^[a-z0-9-]+$/);
|
|
26
|
+
|
|
27
|
+
if (locale === 'en') {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (sharingLocales.includes(locale)) {
|
|
32
|
+
expect(
|
|
33
|
+
content.slug,
|
|
34
|
+
`Tool "${toolId}" locale "${locale}" must use the same slug as "en" ("${enSlug}").`,
|
|
35
|
+
).toBe(enSlug);
|
|
36
|
+
} else {
|
|
37
|
+
expect(
|
|
38
|
+
content.slug,
|
|
39
|
+
`Tool "${toolId}" locale "${locale}" has the same slug as "en" ("${enSlug}"). Cada slug tiene que estar en su propia idioma`,
|
|
40
|
+
).not.toBe(enSlug);
|
|
41
|
+
|
|
42
|
+
if (slugs.has(content.slug)) {
|
|
43
|
+
const previousLocale = slugs.get(content.slug);
|
|
44
|
+
expect(
|
|
45
|
+
false,
|
|
46
|
+
`Tool "${toolId}" locales "${locale}" and "${previousLocale}" share the same slug ("${content.slug}"). Cada slug tiene que estar en su propia idioma`,
|
|
47
|
+
).toBe(true);
|
|
48
|
+
}
|
|
49
|
+
slugs.set(content.slug, locale);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
describe('Slug Localization and Uniqueness Validation', () => {
|
|
54
|
+
ALL_TOOLS.forEach((tool) => {
|
|
55
|
+
describe(`Tool: ${tool.entry.id}`, () => {
|
|
56
|
+
it('every locale should have a unique, translated slug', async () => {
|
|
57
|
+
const slugs = new Map<string, string>();
|
|
58
|
+
const locales = Object.keys(tool.entry.i18n);
|
|
59
|
+
|
|
60
|
+
let enSlug = '';
|
|
61
|
+
if (locales.includes('en')) {
|
|
62
|
+
const enLoader = tool.entry.i18n['en' as keyof typeof tool.entry.i18n];
|
|
63
|
+
const enContent = (await enLoader?.()) as ToolLocaleContent;
|
|
64
|
+
enSlug = enContent.slug;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
for (const locale of locales) {
|
|
68
|
+
const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
|
|
69
|
+
const content = (await loader?.()) as ToolLocaleContent;
|
|
70
|
+
validateLocaleSlug({
|
|
71
|
+
toolId: tool.entry.id,
|
|
72
|
+
locale,
|
|
73
|
+
content,
|
|
74
|
+
enSlug,
|
|
75
|
+
slugs,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { AlcoholClearanceUI, AlcoholClearanceLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'calcolatore-smaltimento-alcol';
|
|
5
5
|
const title = 'Calcolatore Sbornia e BAC: Predittore di Recupero';
|
|
6
6
|
const description = 'Calcola il tuo contenuto di alcol nel sangue (BAC) e il tempo per raggiungere 0.0 utilizzando la formula di Widmark. Pianifica la tua idratazione pre-sonno e saprai quando sarai completamente recuperato.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { AlcoholClearanceUI, AlcoholClearanceLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'rekenmachine-alcoholafbraak';
|
|
5
5
|
const title = 'Kater en BVO calculator: Herstelindicator';
|
|
6
6
|
const description = 'Bereken uw Bloed Voorzuringsoort (BVO) en de tijd om 0,0 te bereiken met behulp van de formule van Widmark. Plan uw hydratatie vóór het slapen en weet wanneer u volledig hersteld bent.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { AlcoholClearanceUI, AlcoholClearanceLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'alkol-temizleme-hesaplayicisi';
|
|
5
5
|
const title = 'Baş Dönmesi ve BAC Hesaplayıcısı: İyileşme Tahmincisi';
|
|
6
6
|
const description = 'Widmark formülünü kullanarak Kan Alkol İçeriğini (BAC) hesapla ve 0.0 a ulaşmak için gereken zamanı öğren. Uyku öncesi rehidrasyon planla ve tam iyileşmenin ne zaman olacağını bil.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { BeerCoolerUI, BeerCoolerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'bier-kuhler';
|
|
5
5
|
const title = 'Bierkühler mit Newtonsches Abkühlungsgesetz';
|
|
6
6
|
const description = 'Berechne mit echter Thermodynamik — Newtonsches Abkühlungsgesetz — genau wie lange dein Bier braucht, um die perfekte Serviertemperatur im Kühlschrank oder Gefrierschrank zu erreichen.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { BeerCoolerUI, BeerCoolerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'pendingin-bir';
|
|
5
5
|
const title = 'Kalkulator Pendingin Bir dengan Hukum Newton';
|
|
6
6
|
const description = 'Hitung dengan termodinamika nyata — Hukum Pendinginan Newton — berapa lama tepat bir Anda memerlukan untuk mencapai suhu penyajian yang sempurna di lemari es atau freezer.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { BeerCoolerUI, BeerCoolerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'raffreddatore-birra';
|
|
5
5
|
const title = 'Calcolatore di Raffreddamento della Birra con la Legge di Newton';
|
|
6
6
|
const description = 'Calcola con vera termodinamica — Legge di Raffreddamento di Newton — esattamente quanto tempo hai bisogno affinché la tua birra raggiunga la temperatura di servizio perfetta in frigorifero o congelatore.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { BeerCoolerUI, BeerCoolerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'bier-koeler';
|
|
5
5
|
const title = 'Bierkoelingscalculator met de Wet van Newton';
|
|
6
6
|
const description = 'Bereken met echte thermodynamica — Wet van Newton voor afkoeling — precies hoe lang je bier nodig heeft om de perfecte serveertemperatuur in de koelkast of vriezer te bereiken.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { BeerCoolerUI, BeerCoolerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'chlodnica-piwa';
|
|
5
5
|
const title = 'Kalkulator Chłodzenia Piwa z Prawem Chłodzenia Newtona';
|
|
6
6
|
const description = 'Oblicz z prawdziwą termodynamiką — Prawo Chłodzenia Newtona — dokładnie, ile czasu twoje piwo potrzebuje, aby osiągnąć doskonałą temperaturę podawania w lodówce lub zamrażalniku.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { BeerCoolerUI, BeerCoolerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'resfriador-cerveja';
|
|
5
5
|
const title = 'Calculadora de Resfriamento de Cerveja com a Lei de Newton';
|
|
6
6
|
const description = 'Calcule com termodinâmica real — Lei do Resfriamento de Newton — exatamente quanto tempo sua cerveja leva para atingir a temperatura de serviço perfeita na geladeira ou freezer.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { BeerCoolerUI, BeerCoolerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'ohlazhdenie-piva';
|
|
5
5
|
const title = 'Калькулятор охлаждения пива с законом Ньютона';
|
|
6
6
|
const description = 'Считайте с настоящей термодинамикой — Закон охлаждения Ньютона — ровно столько, сколько времени вашему пиву потребуется, чтобы достичь идеальной температуры подачи в холодильнике или морозилке.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { BeerCoolerUI, BeerCoolerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'ol-kylare';
|
|
5
5
|
const title = 'Ölkylningsräknare med Newtons kylningslag';
|
|
6
6
|
const description = 'Beräkna med verklig termodynamik — Newtons kylningslag — exakt hur lång tid din öl behöver för att nå den perfekta serveringstemperaturen i kylskåp eller frys.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { BeerCoolerUI, BeerCoolerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'bira-sogutucusu';
|
|
5
5
|
const title = 'Newton\'un Soğuma Yasası ile Bira Soğutma Hesaplayıcısı';
|
|
6
6
|
const description = 'Gerçek termodinamik ile hesaplayın — Newton\'un Soğuma Yasası — bira\'nızın buzdolabında veya dondurucuda mükemmel servis sıcaklığına ulaşması için gereken zamanı tam olarak bilin.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { CarbonationUI, CarbonationLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'bier-karbonatisierungs-rechner';
|
|
5
5
|
const title = 'Bier Karbonisierungs und Primersüße Rechner';
|
|
6
6
|
const description = 'Berechne die exakte Grammmenge von Dextrose, Haushaltszucker oder Malzextrakt (DME) zum Abfüllen deines Haushaltbieres. Gib dein Volumen, Gärungstemperatur und Stil ein und perfektioniere deine Grundierung.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { CarbonationUI, CarbonationLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'kalkulator-karbonak-bir';
|
|
5
5
|
const title = 'Kalkulator Karbonasi & Primer Bir';
|
|
6
6
|
const description = 'Hitung gram pasti Dextrose, Gula Meja atau DME (Ekstrak Malt Kering) untuk membotolkan homebrew Anda. Masukkan volume, suhu fermentasi, dan gaya untuk primer sempurna.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { CarbonationUI, CarbonationLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'kalkulyator-karbonizacii-piva';
|
|
5
5
|
const title = 'Калькулятор Карбонизации и Праймирования Пива';
|
|
6
6
|
const description = 'Рассчитайте точное количество граммов Декстрозы, Сахара или ССВ (Сухого Солодового Экстракта) для разлива домашнего пива. Введите объём, температуру брожения и стиль для идеального праймирования.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { CocktailBalancerUI, CocktailBalancerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = 'cocktail-
|
|
4
|
+
const slug = 'cocktail-ausgleicher';
|
|
5
5
|
const title = 'Cocktail Balancer: Das Sauer Gesetz';
|
|
6
6
|
const description = 'Berechnen Sie die perfekte Balance zwischen süß und sauer für Ihre Cocktails. Meistern Sie das goldene Verhältnis der Mixologie.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { CocktailBalancerUI, CocktailBalancerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'koktail-seimbang';
|
|
5
5
|
const title = 'Cocktail Balancer: Hukum Asam';
|
|
6
6
|
const description = 'Hitung keseimbangan sempurna antara manis dan asam untuk koktail Anda. Kuasai rasio emas mixologi.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { CocktailBalancerUI, CocktailBalancerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = 'cocktail-
|
|
4
|
+
const slug = 'cocktail-equilibrato';
|
|
5
5
|
const title = 'Cocktail Balancer: La Legge dell\'Acido';
|
|
6
6
|
const description = 'Calcola il perfetto equilibrio tra dolce e acido per i tuoi cocktail. Padroneggia il rapporto aureo della mixologia.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { CocktailBalancerUI, CocktailBalancerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = 'cocktail-
|
|
4
|
+
const slug = 'cocktail-evenwicht';
|
|
5
5
|
const title = 'Cocktail Balancer: De Zuurwet';
|
|
6
6
|
const description = 'Bereken het perfecte evenwicht tussen zoet en zuur voor je cocktails. Beheers de gulden snede van mixologie.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { CocktailBalancerUI, CocktailBalancerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'koktajl-zbilansowany';
|
|
5
5
|
const title = 'Cocktail Balancer: Prawo Kwaśności';
|
|
6
6
|
const description = 'Oblicz doskonałą równowagę między słodkością a kwaśnością dla swoich koktajli. Opanuj złoty stosunek miksologii.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { CocktailBalancerUI, CocktailBalancerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'coquetel-equilibrado';
|
|
5
5
|
const title = 'Cocktail Balancer: A Lei do Ácido';
|
|
6
6
|
const description = 'Calcule o equilíbrio perfeito entre doce e ácido para seus coquetéis. Domine a proporção áurea da mixologia.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { CocktailBalancerUI, CocktailBalancerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'koktejl-balansirovka';
|
|
5
5
|
const title = 'Балансир Коктейлей: Закон Кислоты';
|
|
6
6
|
const description = 'Вычислите идеальный баланс между сладким и кислым для ваших коктейлей. Овладейте золотым сечением миксологии.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { CocktailBalancerUI, CocktailBalancerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = 'cocktail-
|
|
4
|
+
const slug = 'cocktail-balanserare';
|
|
5
5
|
const title = 'Cocktail Balancer: Surlagenen';
|
|
6
6
|
const description = 'Beräkna den perfekta balansen mellan sött och surt för dina cocktails. Bemästra det gyllene snittet inom mixologi.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { CocktailBalancerUI, CocktailBalancerLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'kokteyl-dengeleyici';
|
|
5
5
|
const title = 'Cocktail Balancer: Asitlik Kanunu';
|
|
6
6
|
const description = 'Koktailleriniz için tatlı ve asit arasındaki mükemmel dengeyi hesaplayın. Miksoloji\'nin altın oranını keşfedin.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'party-stock-calculator';
|
|
5
5
|
const title = 'パーティービール計算機:結婚式と誕生日のための1人あたりの量';
|
|
6
6
|
const description = 'ゲスト数、期間、気温に基づいて必要なビールと氷の量を計算する無料ツール。結婚式、誕生日、屋外イベントに最適です。';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'party-stock-calculator';
|
|
5
5
|
const title = '파티 맥주 계산기: 결혼식 및 생일을위한 1인당 수량';
|
|
6
6
|
const description = '손님, 기간 및 온도에 따라 필요한 맥주와 얼음의 양을 계산하는 무료 도구입니다. 결혼식, 생일 및 야외 행사에 완벽합니다.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = 'kalkulyator-
|
|
4
|
+
const slug = 'kalkulyator-zapasa-pivy';
|
|
5
5
|
const title = 'Калькулятор Пива для Вечеринки: Количество На Человека для Свадеб и Дней Рождения';
|
|
6
6
|
const description = 'Бесплатный инструмент для расчёта количества пива и льда в зависимости от числа гостей, продолжительности и температуры. Идеален для свадеб, дней рождения и уличных мероприятий.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'parti-birrasi-hesaplayicisi';
|
|
5
5
|
const title = 'Parti Bira Hesaplayıcısı: Düğünler ve Doğum Günleri için Kişi Başına Miktar';
|
|
6
6
|
const description = 'Konuk sayısı, süre ve sıcaklığa dayalı olarak ne kadar bira ve buz gerektiğini hesaplamak için ücretsiz araç. Düğünler, doğum günleri ve açık hava etkinlikleri için mükemmel.';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
2
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
3
|
|
|
4
|
-
const slug = '
|
|
4
|
+
const slug = 'party-stock-calculator';
|
|
5
5
|
const title = '派对啤酒计算器:婚礼和生日派对的人均用量';
|
|
6
6
|
const description = '根据嘉宾数量、活动时长和温度计算所需啤酒和冰块数量的免费工具。非常适合婚礼、生日派对和户外活动。';
|
|
7
7
|
|