aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-10-13 20:18:07 +0200
committermetamuffin <metamuffin@disroot.org>2024-10-13 20:18:07 +0200
commite8b482d8e787d919af59fc5d18db137aa127b51b (patch)
tree3f46952b96f0da1f8167987b6294614cccb38b17
parent7b32caf001e8abdfddbaff56851a8951489b69ab (diff)
downloadhurrycurry-e8b482d8e787d919af59fc5d18db137aa127b51b.tar
hurrycurry-e8b482d8e787d919af59fc5d18db137aa127b51b.tar.bz2
hurrycurry-e8b482d8e787d919af59fc5d18db137aa127b51b.tar.zst
add book back to main repo
-rw-r--r--book/.gitignore4
-rw-r--r--book/book.js90
-rw-r--r--book/book.typ58
-rw-r--r--book/locale/de.ini44
-rw-r--r--book/locale/en.ini44
-rw-r--r--book/locale/fr.ini25
-rw-r--r--book/locale/nl.ini30
-rw-r--r--book/locale/ru.ini34
-rw-r--r--book/locale/tr.ini47
-rw-r--r--book/locale/zh_Hans.ini44
-rw-r--r--book/makefile49
11 files changed, 469 insertions, 0 deletions
diff --git a/book/.gitignore b/book/.gitignore
new file mode 100644
index 00000000..d1922c9b
--- /dev/null
+++ b/book/.gitignore
@@ -0,0 +1,4 @@
+/*.pdf
+/book.json
+/book-repo
+/out
diff --git a/book/book.js b/book/book.js
new file mode 100644
index 00000000..84c0e9dc
--- /dev/null
+++ b/book/book.js
@@ -0,0 +1,90 @@
+
+const tr = t => ({ translated: t })
+const plain = t => ({ text: t })
+const par_raw = (s, th, bold) => ({
+ t: "par", es: [{
+ t: "text",
+ s,
+ color: th ? "#ffffff" : "#000000",
+ size: 15,
+ bold,
+ font: "FreeSans"
+ }]
+})
+const par = (t, th, bold) => par_raw(tr(t), th, bold)
+const h2 = (t, th) => ({
+ t: "text",
+ s: tr(t),
+ color: th ? "#ffffff" : "#000000",
+ size: 40,
+ font: "Great Vibes"
+})
+const emph = (t, th) => ({
+ t: "text",
+ s: tr(t),
+ color: th ? "#95bd51" : "#2e4900",
+ size: 20,
+ font: "Gluten"
+})
+const title = () => ({
+ t: "page", background: "cover", es: [
+ { t: "text", s: tr("b.title"), size: 70, color: "#000000", font: "Great Vibes" }
+ ]
+})
+const toc = () => ({
+ t: "page", background: "toc", es: [
+ { t: "text", s: plain("TODO: Table of contents"), size: 20, font: "FreeSans", color: "#000000" }
+ ]
+})
+const about = () => ({
+ t: "page", es: [
+ { t: "text", s: tr("b.about"), color: "#000000", size: 30, font: "FreeSans" },
+ par("b.about.name"),
+ { t: "text", s: tr("b.about.image_attrib"), color: "#000000", size: 20, font: "FreeSans" },
+ {
+ t: "table", cols: 2, es: [
+ [par("b.about.image_attrib.name", false, true), par("b.about.image_attrib.author", false, true)],
+ [par("b.nigiri"), par_raw(plain("Ahtziri Lagarde(unsplash)"))],
+ [par("b.icecream"), par_raw(plain("Markus Spiske(unsplash), adapted"))],
+ [par("b.curry"), par_raw(plain("Andy Hay(unsplash), adapted"))],
+ [par("b.mochi"), par_raw(plain("blackieshoot(unsplash)"))],
+ [par("b.burger"), par_raw(plain("Pablo Merchán Montes(unsplash), adapted"))],
+ [par("b.tomato_soup"), par_raw(plain("Julia Kicova(unsplash), adapted"))],
+ ]
+ }
+ ]
+})
+const recipe = (n, i, th = false, extra = []) => ({
+ t: "page", background: n, es: [
+ h2(`b.${n}`, th),
+ par(`b.${n}.desc`, th),
+ {
+ t: "list", es: i.map(e => emph(`b.ingred.${e}`, th))
+ },
+ par(`b.${n}.steps`, th),
+ ...extra
+ ]
+})
+
+console.log(JSON.stringify({
+ t: "document", es: [
+ title(),
+ toc(),
+ recipe("tomato_soup", ["leek", "tomato"]),
+ recipe("bun", ["flour"], true),
+ recipe("burger", ["lettuce", "tomato", "cheese", "steak", "bun"], true, [par("b.burger.variation", true)]),
+ recipe("mochi", ["rice", "strawberry"], true),
+ recipe("curry", ["coconut", "tomato", "leek", "rice"], true),
+ recipe("icecream", ["strawberry", "coconut"]),
+ recipe("nigiri", ["fish", "rice"]),
+ {
+ t: "page", background: "drinks", es: [
+ { t: "text", s: tr(`b.water`), color: "#ffffff", size: 30, font: "Great Vibes" },
+ par("b.water.steps", true),
+ { t: "text", s: tr(`b.strawberry_shake`), color: "#ffffff", size: 30, font: "Great Vibes" },
+ par("b.strawberry_shake.steps", true),
+ ]
+ },
+ about()
+ ]
+}))
diff --git a/book/book.typ b/book/book.typ
new file mode 100644
index 00000000..39f3cc46
--- /dev/null
+++ b/book/book.typ
@@ -0,0 +1,58 @@
+#let lang = sys.inputs.at("lang", default: "en")
+#set par(justify: true)
+#set page("a4")
+#set text(lang: lang.split("_").at(0), size: 15pt, font: "FreeSans")
+#show list: set text(font: "Gluten", fill: rgb(46, 73, 0), size: 20pt)
+#show heading.where(level: 2): set text(font: "Great Vibes", size: 40pt)
+
+#let load_locale(name) = {
+ read("locale/"+name+".ini")
+ .split("\n")
+ .filter(l => l != "[hurrycurry]")
+ .filter(l => l != "")
+ .map(l => l.split("="))
+ .map(((x,y)) => (x.trim(), y.trim().replace("%n","\n")))
+}
+#let translations = {
+ let d = (a:1)
+ for (k,v) in load_locale("en") { d.insert(k,v) }
+ for (k,v) in load_locale(lang) { d.insert(k,v) }
+ d
+}
+#let tr(s) = translations.at(s, default: text(fill: red)[TRANSLATION: #s])
+
+#let msgstr(o) = if "translated" in o { tr(o.translated) } else { o.text }
+
+#let element(elem) = if elem.t == "document" [
+ #for e in elem.es [
+ #element(e)
+ ]
+ ] else if elem.t == "page" [
+ #page(
+ background: if "background" in elem { image(
+ "book-repo/"+elem.background+".jpeg",
+ fit: "cover", height: 100%, width: 100%
+ )} else { none }, [
+ #for e in elem.es [
+ #element(e)
+ ]
+ ])
+ ] else if elem.t == "text" [
+ #text(
+ font: elem.font,
+ size: elem.size * 1pt,
+ fill: rgb(elem.color),
+ weight: if "bold" in elem { "bold" } else { "regular" },
+ msgstr(elem.s)
+ )
+ ] else if elem.t == "list" [
+ #list(..elem.es.map(element))
+ ] else if elem.t == "par" [
+ #par(..elem.es.map(element))
+ ] else if elem.t == "table" [
+ #table(columns: elem.cols, ..elem.es.flatten().map(element))
+ ] else [
+ #elem
+ ]
+
+#element(json.decode(read("book.json")))
diff --git a/book/locale/de.ini b/book/locale/de.ini
new file mode 100644
index 00000000..0f054828
--- /dev/null
+++ b/book/locale/de.ini
@@ -0,0 +1,44 @@
+[hurrycurry]
+b.about = Über das Buch
+b.about.image_attrib = Namensnennung für Hintergrundbilder
+b.about.name = Das „Hurry Curry!“-Rezeptebuch.
+b.bun = Brötchen
+b.bun.desc = Das sättigenste Gericht von allen. Am besten serviert mit Tomatensuppe.
+b.bun.steps = Verarbeite zunächst das Mehl mit einer Küchenmachine. Mach dir wegen der Verpackung keine Gedanken; sie wird in unauffällige Stücke zerkleinert. Nimm den Teig, sobald dieser eine angemessene Konsistenz hat, aus der Küchenmachine und back den Teig im Ofen. Warte beim Herausnehmen des Brotlaibs, bis dieser abgekühlt ist, und schneide ihn dann auf einem Brett in Scheiben.
+b.burger = Burger
+b.burger.desc = Ein reichhaltiges Gericht mit gesundem Gemüse, Brot und einem perfektem Steak.
+b.burger.steps = Schneide zuerst das Steak auf dem Schneidebrett, bis es die Form eines runden Burgerpatties annimmt. Lege das Patty anschließend in die Pfanne und brate es auf mittlerer Hitze für zwei Minuten. In der Zwischenzeit kannst du das Gemüse auf einem Schneidebrett kleinschneiden, wobei jedes Stück in eine einzige Scheibe geschnitten werden sollte. Schneide danach das Brötchen in zwei Hälften. Abschließend, sobald das Patty fertig gebraten ist, staple das aufgeschnittene Brötchen, das Gemüse und das Patty auf einen Teller und serviere das fertige Gericht. Et Voilà.
+b.burger.variation = Der Burger kann in verschiedenen Variationen zubereitet werden, z. B. mit oder ohne Käse oder als Veggie-Burger.
+b.curry = Curry mit Reis
+b.curry.desc = Diese appettitliche und exotische Gericht wärmt dich an kalten Tagen und verleiht dir neue Stärke.
+b.curry.steps = Extrahiere zuerst die Milch aus der Kokosnuss. Das geht am effizientesten, indem du die ganze Kokosnuss in der Küchenmaschine schredderst. Die Holzstückchen in dem Gemisch kannst du ignorieren. Sie sind irrelevant! Sobald die Nuss zu einem homogenen Gemisch zerkleinert wurde, kannst du eine ganze Tomate und eine ganze Stange Lauch in einen Topf geben. Schneiden musst du beides nicht, denn sie werden sowieso zu Brei, während sie in der Kokosmilch köcheln. Du solltest keine Zeit verschwenden, um auf die Soße zu warten. Stattdessen kannst du sie am besten dafür nutzen, die Hauptzutat des Gerichts zu kochen: Den Reis. Gib ihn einen Topf. Du brauchst hierbei kein Wasser, es handelt sich um eine besondere, selbstbefeuchtende Reissorte! Sobald dieser fertig gekocht ist, kannst du beide Teile zusammenfügen und genießen!
+b.dishes = Hauptspeisen
+b.drinks = Getränke
+b.icecream = Erdbeereis
+b.icecream.steps = Dieses ikonische Gericht wird vorbereitet, indem man eine ganze Erdbeere, inklusive Grünzeug, und eine Kokosnuss, inklusive ihrer äußeren hölzernen Schale, in der Küchenmaschine püriert. Danach sollte man es in einen Gefrierschrank platzieren, wodurch seine drahtlosen Verarbeitungsmethoden verwendet werden. Die sich daraus ergebene Masse wird üblicherweise in einer Kugelform auf einem Teller serviert.
+b.ingred.bun = Ein Brötchen
+b.ingred.cheese = Ein Käsestück
+b.ingred.coconut = Eine Kokosnuss
+b.ingred.fish = Ein ganzer Fisch
+b.ingred.flour = Eine Mehltüte
+b.ingred.leek = Eine Lauchstange
+b.ingred.lettuce = Ein Salatkopf
+b.ingred.rice = Eine Reistüte
+b.ingred.steak = Ein rohes Steak
+b.ingred.strawberry = Eine Erdbeere
+b.ingred.tomato = Eine Tomate
+b.mochi = Erdbeermochi
+b.mochi.steps = Zuerst musst du etwas Reis in der Küchenmaschine zu Reismehl verarbeiten. Dies wird nun ohne Zusatzstoffe in einem Topf gedünstet, wodurch Mochiteig entsteht. Eine ganze Erdbeere sollte jetzt als Aromastoff hinzugegeben werden, wodurch der erhitzte Reismehl zu Erdbeermochi wird.
+b.nigiri = Nigiri
+b.nigiri.steps = Reis wird, ohne ihn zu Waschen und ohne Zugabe von Wasser, in einem Topf gekocht. Dann wird aus dem heißen Topf der Reis entnommen und mit einem vorsichtig geschnittenem Fisch kombiniert.
+b.strawberry_shake = Erdbeershake
+b.strawberry_shake.steps = Sowohl eine einzelne Erdbeere als auch eine ganze ungeschnittene Kokosnuss werden in einer Küchenmaschine püriert und dann, um den Verzehr zu vereinfachen, in ein Glas umgefüllt.
+b.title = Rezepte für die Eile
+b.tomato_soup = Tomatensuppe
+b.tomato_soup.steps = Nimm zuerst eine frische Tomate und püriere sie in einem hellblauen Edelstahlmixer, bis sie einer feinen Paste ähnelt. Fülle besagte Paste in einen großen Topf deiner Wahl und füge einen ganze frische Lauchstange hinzu. Lass diese Mischung köcheln, bis die Konsistenz homogen ist und die Farbe apettitlich aussieht. Serviere die Suppe auf einem Teller und genieße sie!
+b.water = Wasser
+b.water.steps = Ein Glas wird mit reichhaltigem lokal-produziertem Leitungswasser aus der Spüle gefüllt.
+b.icecream.desc = Dieser Erdbeersnack erfrischt dich an einen warmen Tag.
+b.mochi.desc = Mochi ist ein traditionelles japanisches Neujahrsessen, welches auch das ganze Jahr über gegessen wird.
+b.nigiri.desc = Dieses traditionelle japanische Sushi aus den 1820ern ist eine harmonische Kombination aus handgeformten Reis und Fisch.
+b.strawberry_shake.desc = Eine leckere Mischung aus Kokosnuss und Erdbeere
diff --git a/book/locale/en.ini b/book/locale/en.ini
new file mode 100644
index 00000000..3141e423
--- /dev/null
+++ b/book/locale/en.ini
@@ -0,0 +1,44 @@
+[hurrycurry]
+b.about.image_attrib=Background image attribution
+b.about.name=The Hurry Curry! recipe book.
+b.about=About this book
+b.bun.desc=The most saturating meal of them all. Best enjoyed with a tomato soup.
+b.bun.steps=Start by processing your flour in a food processor. Don’t mind the bag, it will be shredded into unnoticable pieces. Once the dough has a workable consistency take it out of the food processor and put it in the oven until baked. When you take out the loaf, wait for it to cool down, then slice it on a cutting board.
+b.bun=Bun
+b.burger.desc=A rich meal featuring healthy vegetables, bread and a perfectly cooked steak.
+b.burger.steps=Cut the steak on a cutting board until it becomes a nice round burger patty. Put the patty in a pan and let it cook on medium heat for two minutes. In the meantime, start preparing the vegetables on a cutting board by slicing them into a single slice each. Cut the bun into two halves on a cutting board. When the patty is done, assemble it together with the vegetables and the bun halves on a plate for serving. Et Voilà.
+b.burger.variation=The burger can be prepared in multiple variations, e.g. without cheese or as a Veggie-Burger.
+b.burger=Burger
+b.curry.desc=This appetizing and exotic dish warms you up on a cold day and gives you new strength.
+b.curry.steps=Firstly, extract the milk from the coconut. This is most efficiently done by shredding the entire coconut in a food processor. Pay no attention to the pieces of wood in the mixture, they are of no importance! As soon as the nut is properly homogenized, you can add one whole tomato and one whole leek to a pot, there’s no need to cut either of these, as they will turn into mush while they are simmering in the coconut milk. No time shall be wasted waiting for the sauce, instead it is best used for cooking the main ingredient of the dish: The rice. Add it to a pot. No need for water here, it is a special self-moisturising strain of rice! As soon as that is done, just combine the two parts and enjoy!
+b.curry=Curry with Rice
+b.dishes=Dishes
+b.drinks=Drinks
+b.icecream.desc=This snack containing strawberry will surely cool anyone down on a warm day.
+b.icecream.steps=This iconic dish is prepared by pureeing a full strawberry, including greens, and a coconut, including its outer wooden shell, in the food processor. Afterward, it should be placed into a freezer, making use of its wireless processing abilities. The resulting mass is typically served in a sphere shape on a plate.
+b.icecream=Strawberry Icecream
+b.ingred.bun=a bun
+b.ingred.cheese=a piece of cheese
+b.ingred.coconut=a coconut
+b.ingred.fish=a whole fish
+b.ingred.flour=a bag of flour
+b.ingred.leek=a leek
+b.ingred.lettuce=a lettuce
+b.ingred.rice=a bag of rice
+b.ingred.steak=a raw steak
+b.ingred.strawberry=a strawberry
+b.ingred.tomato=a tomato
+b.mochi.desc=Mochi is a traditional Japanese New Year’s food, which is also eaten all year-round.
+b.mochi.steps=Firstly, you’ll have to blend some rice in the food processor processing it into fresh rice flour. This now, without adding any additives can be steamed in a pot transforming it into Mochi dough. A full Strawberry sould now be employed as a flavoring agent, turning the heated rice flour into Strawberry Mochi.
+b.mochi=Strawberry Mochi
+b.nigiri.desc=This traditional 1820s japaneese sushi is harmonic combination of both hand-formed rice and fish.
+b.nigiri.steps=Rice, without washing or adding water beforehand, is put in a pan and brought to a boil, taken from the hot pot the rice is combined with a carefully cut fish.
+b.nigiri=Nigiri
+b.strawberry_shake.desc=A tasty mix of coconut and strawberry
+b.strawberry_shake.steps=Both a singular strawberry as well as a uncut complete coconut are pureed using a food processor, afterwards, to ease consumption, transferred to a glass.
+b.strawberry_shake=Strawberry Shake
+b.title=Recipes for when you are in a Hurry
+b.tomato_soup.steps=Firstly take your fresh tomato and puree it in a light blue stainless-steel blender until it resembles a fine paste. Transfer said paste into a large cauldron of your choosing and add a fresh whole leek and season to taste. Let this simmer until the consistency homogenizes and the colour seems apetizing. Serve this mixture on a plate and enjoy!
+b.tomato_soup=Tomato Soup
+b.water.steps=A glass is filled with nutricious locally-sourced tap-water in a sink.
+b.water=Water
diff --git a/book/locale/fr.ini b/book/locale/fr.ini
new file mode 100644
index 00000000..7a7e0c4b
--- /dev/null
+++ b/book/locale/fr.ini
@@ -0,0 +1,25 @@
+[hurrycurry]
+b.about = À propos de ce live
+b.about = À propos de ce live
+b.about.image_attrib = Attribution de l'image d'arrière-plan
+b.about.image_attrib = Attribution de l'image d'arrière-plan
+b.about.name = Le livre de cuisine de Hurry Curry!.
+b.about.name = Le livre de cuisine de Hurry Curry!.
+b.bun = Petit pain
+b.bun = Petit pain
+b.bun.desc = Le repas le plus nourrissant de tous. À déguster de préférence avec une soupe à la tomate.
+b.bun.desc = Le repas le plus nourrissant de tous. À déguster de préférence avec une soupe à la tomate.
+b.burger = Burger
+b.burger = Burger
+b.curry = Curry au riz
+b.curry = Curry au riz
+b.dishes = Plats
+b.dishes = Plats
+b.drinks = Boissons
+b.drinks = Boissons
+b.icecream = Glace à la fraise
+b.icecream = Glace à la fraise
+b.ingred.bun = un petit pain
+b.ingred.bun = un petit pain
+b.ingred.cheese = un morceau de fromage
+b.ingred.cheese = un morceau de fromage
diff --git a/book/locale/nl.ini b/book/locale/nl.ini
new file mode 100644
index 00000000..40f3b0ff
--- /dev/null
+++ b/book/locale/nl.ini
@@ -0,0 +1,30 @@
+[hurrycurry]
+b.about = Over dit boek
+b.about.image_attrib = Maker van achtergrondafbeelding
+b.about.name = Het Hurry Curry!-receptenboek.
+b.bun = Broodje
+b.bun.desc = De meest verzadigende maaltijd van allemaal. Serveer met tomatensoep.
+b.bun.steps = Stop de bloem in een keukenmachine. De zak is niet relevant, want die wordt in kleine, onzichtbare stukjes gehakt. Als het deeg de juiste consistentie heeft bereik, kun je het uit de machine halen en in de oven stoppen totdat het mooi bruin is. Wacht daarna tot het is afgekoeld en snijd het op een snijplank in plakjes.
+b.burger = Burger
+b.burger.desc = Een rijke maaltijd met gezonde groenten, brood en een perfecte steak.
+b.burger.steps = Leg de steak op een snijplank en snijd met een mes in een ronde vorm. Leg de burger in een pan en laat twee minuten op middelhoge temperatuur bakken. Snijd ondertussen alle groenten in kleine plakjes en het broodje in tweeën. Leg vervolgens de burger op de ene helft van het broodje en de groenten daar weer bovenop, en ten slotte de andere helft van het broodje. Et voilà.
+b.burger.variation = De burger kan op meerdere manieren worden gemaakt, bijvoorbeeld zonder kaas of vegetarisch.
+b.curry = Curry met rijst
+b.curry.desc = Dit smakelijke, exotische gerecht geeft je een warm gevoel op een koude dag, en voorziet je van nieuwe energie.
+b.curry.steps = Extraheer de melk uit de kokosnoot door deze in een keukenmachine fijn te hakken. Let niet op de stukjes hout in het mengsel. Als de noot volledig verwerkt is, kun je de melk in een pan gieten, tezamen met een tomaat en prei. Je hoeft ze niet van tevoren te snijden, want ze worden vanzelf lekker zompig in de kokosmelk. Kook vervolgens de rijst zonder water (deze speciale rijst produceert zelf water). Combineer de rijst en de saus en geniet van de maaltijd!
+b.dishes = Gerechten
+b.drinks = Dranken
+b.icecream = Aardbeienijs
+b.icecream.steps = Stop kokosnoot en aardbei in een keukenmachine en blijf doorroeren.
+b.ingred.bun = een broodje
+b.ingred.cheese = een stuk kaas
+b.ingred.coconut = een kokosnoot
+b.ingred.fish = een vis
+b.ingred.flour = een zak bloem
+b.ingred.leek = een prei
+b.ingred.lettuce = een krop sla
+b.ingred.rice = een zak rijst
+b.ingred.steak = een rauwe steak
+b.ingred.strawberry = een aardbei
+b.ingred.tomato = een tomaat
+b.mochi.steps = Maak je eigen rijstbloem door rijst te verwerken in een keukenmachine. Kook de rijstbloem vervolgens stoomgaar in een pan.
diff --git a/book/locale/ru.ini b/book/locale/ru.ini
new file mode 100644
index 00000000..bd7341fb
--- /dev/null
+++ b/book/locale/ru.ini
@@ -0,0 +1,34 @@
+
+
+
+[hurrycurry]
+b.burger = Бургер
+b.ingred.rice = мешок риса
+b.curry.desc = Аппетитное экзотическое блюдо, которое согреет в холодный день и придаст сил.
+b.about.name = Книга рецептов «Hurry Curry!»
+b.bun = Булочка
+b.drinks = Напитки
+b.ingred.cheese = кусочек сыра
+b.ingred.coconut = кокос
+b.ingred.fish = цельная рыба
+b.ingred.flour = мешок муки
+b.ingred.tomato = помидор
+b.dishes = Блюда
+b.curry = Карри с рисом
+b.icecream.desc = Прохладительная закуска с клубникой, которая так необходима в жаркий день.
+b.icecream = Клубничное мороженое
+b.ingred.bun = булочка
+b.ingred.leek = лук
+b.ingred.lettuce = салат
+b.ingred.steak = сырой стейк
+b.ingred.strawberry = клубника
+b.tomato_soup = Томатный суп
+b.water = Вода
+b.about = Об этой книге
+b.bun.desc = Самое сытное блюдо из всех. Лучше всего заходит с томатным супом.
+b.burger.desc = Блюдо со здоровыми овощами, идеальным стейком и ломтиком хлеба.
+b.mochi.desc = Моти — традиционное блюдо новогоднего стола в Японии. Но его кушают круглый год.
+b.water.steps = Стакан подозрительно богатой минералами водопроводной воды.
+b.title = Рецепты для тех, кто в спешке
+b.strawberry_shake = Клубничный коктейль
+b.bun.steps = Начните с приготовления теста из муки на комбайне. Не беспокойтесь за мешок, он будет превращён в малозаметные кусочки. Когда тесто достигнет нормальной консистенции, выньте его из комбайна и поместите в духовку. Начните запекание. Когда булочка будет готова, выньте противень, подождите, пока она охладится, затем нарежьте её на разделочной доске. \ No newline at end of file
diff --git a/book/locale/tr.ini b/book/locale/tr.ini
new file mode 100644
index 00000000..72de0f80
--- /dev/null
+++ b/book/locale/tr.ini
@@ -0,0 +1,47 @@
+
+
+
+[hurrycurry]
+b.burger.steps = Bifteği bir kesme tahtasında güzel yuvarlak bir hamburger köftesi haline gelene kadar kesin. Köfteyi bir tavaya koyun ve orta ateşte iki dakika pişirin. Bu sırada sebzeleri bir kesme tahtasında her birini tek dilim olacak şekilde dilimleyin. Ekmeği iki parçaya ayırın. Köfte piştiğinde, sebzeler ve ekmek parçaları ile birlikte bir tabakta birleştirip servis edin. İşte bu kadar. Et Voilà.
+b.bun.steps = Ununuzu bir mutfak robotunda işlemeye başlayın. Torbayı umursamayın; o, fark edilmeyecek parçalara ayrılacak. Hamur kullanışlı bir kıvama geldiğinde, mutfak robotundan çıkarın ve pişene kadar fırına koyun. Ekmek hamurunu fırından çıkardıktan sonra soğumasını bekleyin, ardından bir kesme tahtasında dilimleyin.
+b.bun.desc = Hepsinin en doyurucu yemeği. En iyi domates çorbasıyla birlikte tadılmalıdır.
+b.about.image_attrib = Arka Plan Görseli Atıf
+b.about.name = Hurry Curry! tarif kitabı.
+b.about = Bu kitap hakkında
+b.bun = Poğaça
+b.burger.desc = Sağlıklı sebzeler, ekmek ve mükemmel pişirilmiş bir biftek içeren zengin bir yemek.
+b.burger.variation = Burger, farklı çeşitlerde hazırlanabilir; örneğin, peynirsiz veya sebzeli burger (Veggie-Burger) olarak.
+b.burger = Hamburger
+b.curry.desc = Bu iştah açıcı ve egzotik yemek, soğuk bir günde sizi ısıtır ve size yeni bir güç kazandırır.
+b.icecream = Çilekli Dondurma
+b.mochi.desc = Mochi, geleneksel bir Japon Yeni Yılı yiyeceğidir ve yıl boyunca da tüketilmektedir.
+b.curry = Köri ve Pilav
+b.dishes = Yemekler
+b.drinks = İçecekler
+b.icecream.desc = Çilek içeren bu atıştırmalık, sıcak bir günde kesinlikle herkesi serinletecektir.
+b.icecream.steps = Bu ikonik yemek, tam bir çileği (yeşil yaprakları da dahil) ve bir hindistancevizini (dış odun kabuğu da dahil) mutfak robotunda püre haline getirerek hazırlanır. Daha sonra, kablosuz işleme yeteneklerinden faydalanarak dondurucuya yerleştirilmelidir. Elde edilen kütle genellikle bir tabakta küre şeklinde servis edilir.
+b.ingred.bun = bir poğaça
+b.ingred.cheese = bir parça peynir
+b.ingred.coconut = Bir hindistancevizi
+b.ingred.fish = bütün bir balık
+b.ingred.flour = bir torba un
+b.ingred.leek = bir pırasa
+b.ingred.lettuce = bir marul
+b.ingred.rice = bir torba pirinç
+b.ingred.steak = çiğ bir biftek
+b.ingred.strawberry = bir çilek
+b.ingred.tomato = bir domates
+b.mochi = Çilekli Mochi
+b.nigiri.desc = Bu geleneksel 1820'ler Japon suşisi, hem sıradan pirinç hem de balığın uyumlu bir birleşimidir.
+b.nigiri.steps = Pirincin önceden yıkanmadan veya su eklenmeden bir tavaya konulup kaynatılmasıyla başlanır. Sıcak tencereden alınan pirinç, özenle kesilmiş balıkla birleştirilir.
+b.nigiri = Nigiri
+b.strawberry_shake.desc = Hindistancevizi ve çileğin lezzetli karışımı
+b.strawberry_shake.steps = Bir çilek ve kesilmemiş bir hindistancevizi, bir mutfak robotunda püre haline getirilir; ardından, tüketimi kolaylaştırmak için bir bardağa aktarılır.
+b.strawberry_shake = Çilekli Milkshake
+b.title = Aceleniz varken yapabileceğiniz tarifler
+b.tomato_soup.steps = Öncelikle, taze domatesinizi alıp hafif mavi paslanmaz çelik bir mikserde ince bir macun haline gelene kadar püre haline getirin. Elde edilen macunu istediğiniz büyük bir kazan içine aktarın ve içine taze bir bütün pırasa ekleyin; tuz ve baharatla tatlandırın. Karışımın kıvamı homojenleşene ve rengi iştah açıcı bir görünüm kazanana kadar kaynamasına izin verin. Bu karışımı bir tabakta servis edin ve keyfini çıkarın!
+b.tomato_soup = Domates Çorbası
+b.water.steps = Bir lavabo içinde besleyici, yerel kaynaklı musluk suyu ile dolu bir bardak.
+b.water = Su
+b.curry.steps = Öncelikle hindistancevizinden sütü çıkarın. En verimli yöntem, tüm hindistancevizini bir mutfak robotunda rendelemektir. Karışımdaki odun parçalarına aldırış etmeyin, önemsizler! Ceviz iyice homojen hale geldikten sonra, bir bütün domates ve bir bütün pırasayı tencereye ekleyebilirsiniz. Bu malzemeleri kesmenize gerek yok, hindistancevizi sütünde kaynarken püre haline geleceklerdir. Sosun pişmesini bekleyerek zaman kaybetmemelisiniz; bunun yerine, yemeğin ana malzemesi olan pirinci pişirmek için sosu kullanın. Pirinci tencereye ekleyin. Suya gerek yok, bu pirinç özel bir kendinden nemlendirici türdür! Bu işlemler tamamlandığında, sadece iki parçayı birleştirip keyifle yiyin!
+b.mochi.steps = Öncelikle, biraz pirinci mutfak robotunda taze pirinç unu haline gelene kadar karıştırmalısınız. Şimdi, herhangi bir katkı maddesi eklemeden, bu un bir tencerede buharda pişirilerek Mochi hamuruna dönüşecektir. Tam bir çilek, şimdi bir aroma verici olarak kullanılmalı ve ısıtılmış pirinç unu çilekli Mochi'ye dönüştürülmelidir. \ No newline at end of file
diff --git a/book/locale/zh_Hans.ini b/book/locale/zh_Hans.ini
new file mode 100644
index 00000000..806c3795
--- /dev/null
+++ b/book/locale/zh_Hans.ini
@@ -0,0 +1,44 @@
+[hurrycurry]
+b.about = 关于本书
+b.about.image_attrib = 背景图片署名
+b.about.name = Hurry Curry!食谱书。
+b.bun = 小圆面包
+b.bun.desc = 最饱腹的一餐。最好搭配番茄汤享用。
+b.bun.steps = 首先用食品加工机加工面粉。不要介意袋子,它会被撕成不可见的碎片。面团达到可操作的稠度后,就将其从食品加工机中取出并放入烤箱中烘烤。取出面包后,等待其冷却,然后在砧板上切片。
+b.burger = 汉堡
+b.burger.desc = 一顿丰盛的饭菜,有健康的蔬菜、面包和一块完全煮熟的牛排。
+b.burger.steps = 在砧板上将牛排切成漂亮的圆形汉堡肉饼。将肉饼放入平底锅中,用中火煮两分钟。与此同时,开始在砧板上准备蔬菜,将蔬菜切成一片一片。在砧板上将面包切成两半。肉饼做好后,将其与蔬菜和半个面包一起放在盘子中上桌。就完成了。
+b.burger.variation = 汉堡有多种做法,如不加奶酪或作为素食汉堡。
+b.curry = 咖喱饭
+b.curry.desc = 这道开胃且充满异国情调的菜肴会在寒冷的日子里为您带来温暖,并赋予您新的力量。
+b.curry.steps = 首先,从椰子中榨出椰奶。最有效的方法是用食品加工机将整个椰子切碎。不要在意混合物中的木屑,它们不重要!椰子完全搅匀后,您可以将一整个番茄和一整根韭菜放入锅中,无需切碎,因为它们在椰奶中煮沸时会变成糊状。不要浪费时间等待酱汁,而是最好将其用于烹饪菜肴的主要成分:米饭。将其放入锅中。这里不需要加水,这是一种特殊的自我保湿大米品种!完成后,只需将两部分混合即可享用!
+b.dishes = 菜肴
+b.drinks = 饮料
+b.icecream = 草莓冰淇淋
+b.icecream.steps = 将椰子和草莓放入食品加工机中制成泥状,然后用同一台食品加工机不断搅拌,同时冷冻。
+b.ingred.bun = 一个小圆面包
+b.ingred.cheese = 一块奶酪
+b.ingred.coconut = 一颗椰子
+b.ingred.fish = 一整条鱼
+b.ingred.flour = 一袋面粉
+b.ingred.leek = 一根韭菜
+b.ingred.lettuce = 一颗生菜
+b.ingred.rice = 一袋米
+b.ingred.steak = 一块生牛排
+b.ingred.strawberry = 一颗草莓
+b.ingred.tomato = 一个番茄
+b.mochi = 草莓麻糬
+b.mochi.steps = 首先,您需要将一些大米放入食品加工机中混合,将其加工成新鲜的米粉。现在,无需添加任何添加剂,就可以将其放入锅中蒸熟,将其变成麻糬面团。现在可以使用一颗完整的草莓作为调味剂,将加热的米粉变成草莓麻糬。
+b.nigiri = 握寿司
+b.nigiri.steps = 将米饭在锅里煮熟并与鱼片一起煮。
+b.strawberry_shake = 草莓奶昔
+b.strawberry_shake.steps = 将草莓和椰子放入食品加工机中制成泥,然后倒入玻璃杯中。
+b.title = 适合匆忙时的食谱
+b.tomato_soup = 番茄汤
+b.tomato_soup.steps = 首先,将新鲜的番茄放入浅蓝色不锈钢搅拌机中打成泥,直到变成细糊状。将糊状物倒入您选择的大锅中,加入新鲜的整根韭菜并调味。慢火煮至稠度均匀且颜色诱人。将混合物盛入盘中,尽情享用吧!
+b.water = 水
+b.water.steps = 水槽里的杯子里装满了来自当地的营养丰富的自来水。
+b.nigiri.desc = 这种传统的 19 世纪 20 年代日本寿司是普通米饭和鱼的完美结合。
+b.strawberry_shake.desc = 椰子和草莓的美味组合
+b.icecream.desc = 这种含有草莓的快餐在炎热的天气里肯定能让任何人感到凉爽。
+b.mochi.desc = 麻糬是日本的传统新年食品,全年都有人吃。
diff --git a/book/makefile b/book/makefile
new file mode 100644
index 00000000..4bdab4dc
--- /dev/null
+++ b/book/makefile
@@ -0,0 +1,49 @@
+
+noop =
+space = $(noop) $(noop)
+comma = ,
+langs = $(patsubst locale/%.ini,%,$(wildcard locale/*.ini))
+
+s_pages = 01,02,03,04,05,06,07,08,09,10,11
+s_langs = $(subst $(space),$(comma),$(langs))
+png_pages = $(shell echo out/book_{$(s_pages)}.{$(s_langs)}.png)
+webp_pages = $(shell echo out/book_{$(s_pages)}.{$(s_langs)}.webp)
+svg_pages = $(shell echo out/book_{$(s_pages)}.{$(s_langs)}.svg)
+pdfs = $(shell echo out/book.{$(s_langs)}.pdf)
+
+ALL = out/book.webp.tar.zst out/book.svg.tar.zst \
+ $(pdfs) $(png_pages) $(webp_pages) $(svg_pages)
+
+JSR = deno run
+
+
+
+.PHONY: all
+all: $(ALL)
+
+out:
+ @mkdir -p out
+
+book.json: book.js
+ DENO_NO_UPDATE_CHECK=1 $(JSR) $< > $@
+
+out/book_01.%.png: book.typ book.json locale/%.ini out
+ typst compile --input lang=$(subst out/,,$(*)) $< out/book_\{n\}.$(subst out/,,$(*)).png
+out/book_01.%.svg: book.typ book.json locale/%.ini out
+ typst compile --input lang=$(subst out/,,$(*)) $< out/book_\{n\}.$(subst out/,,$(*)).svg
+out/book.%.pdf: book.typ book.json locale/%.ini out
+ typst compile --input lang=$(subst out/,,$(*)) $< $@
+
+out/%.webp: out/%.png
+ ffmpeg -i $< -y $@
+
+out/book.svg.tar.zst: $(svg_pages)
+ tar -cf $@ $^
+out/book.webp.tar.zst: $(webp_pages)
+ tar -cf $@ $^
+
+.PHONY: clean
+clean:
+ rm -rf out
+ rm -f book.json
+