/* ============================================================
RESTO SUITE — i18n
Global Thai/English switcher. Thai is the default language.
Usage: const { t, lang, setLang } = useLang(); t('path.to.key', {var: 1})
Chip/segment option VALUES stay in English (they're the data
model), only their displayed LABEL is translated via OPT/optLabel.
============================================================ */
const LANG_KEY = "resto.lang";
const T = {
common: {
tweaks: { en: "Tweaks", th: "ปรับแต่ง" },
look: { en: "Look", th: "รูปลักษณ์" },
coachingSection: { en: "Coaching", th: "คำแนะนำ" },
accent: { en: "Accent", th: "สีหลัก" },
financialSummaryToggle: { en: "Financial summary", th: "สรุปการเงิน" },
coachingTips: { en: "Coaching tips", th: "เคล็ดลับแนะนำ" },
yourInput: { en: "your input", th: "ข้อมูลของคุณ" },
benchmark: { en: "benchmark", th: "ค่าอ้างอิง" },
estimate: { en: "estimate", th: "ค่าประมาณ" },
low: { en: "low", th: "ต่ำ" },
back: { en: "Back", th: "ย้อนกลับ" },
},
ie: {
title: { en: "Import / Export plan", th: "นำเข้า/ส่งออกแผน" },
desc: { en: "One file carries your whole plan — idea, market, location, validation and financials — between devices and future modules.", th: "ไฟล์เดียวเก็บแผนทั้งหมดของคุณ — ไอเดีย ตลาด ทำเล การตรวจสอบ และการเงิน — ย้ายไปมาระหว่างอุปกรณ์และโมดูลในอนาคตได้" },
download: { en: "Download plan (.json)", th: "ดาวน์โหลดแผน (.json)" },
copy: { en: "Copy JSON", th: "คัดลอก JSON" },
copied: { en: "Copied to clipboard.", th: "คัดลอกไปยังคลิปบอร์ดแล้ว" },
importHeading: { en: "Import", th: "นำเข้า" },
importDesc: { en: "Upload a plan file or paste its JSON below.", th: "อัปโหลดไฟล์แผนหรือวาง JSON ด้านล่าง" },
applyPasted: { en: "Apply pasted JSON", th: "ใช้ JSON ที่วาง" },
invalidJson: { en: "That doesn't look like valid plan JSON.", th: "ดูเหมือนจะไม่ใช่ JSON ของแผนที่ถูกต้อง" },
imported: { en: "Plan imported — every module now reads the new data.", th: "นำเข้าแผนแล้ว — ทุกโมดูลอ่านข้อมูลใหม่แล้ว" },
},
shell: {
tagline: { en: "Design · Plan · Perform", th: "ออกแบบ · วางแผน · ลงมือทำ" },
navIdea: { en: "Business Model", th: "โมเดลธุรกิจ" },
navFinancials: { en: "Financial Feasibility", th: "ความเป็นไปได้ทางการเงิน" },
navPitch: { en: "Pitch Summary Dashboard", th: "แดชบอร์ดสรุปนำเสนอ" },
ready: { en: "ready", th: "พร้อม" },
startHere: { en: "start here", th: "เริ่มที่นี่" },
afterTaxMo: { en: "/mo after tax", th: "/เดือน หลังภาษี" },
monthlyProfitAfterTax: { en: "Monthly profit · after tax", th: "กำไรต่อเดือน · หลังหักภาษี" },
profitMoAfterTax: { en: "Profit / mo · after tax", th: "กำไร/เดือน · หลังหักภาษี" },
preTaxMargin: { en: "pre-tax {pre} · %%MARGIN%% margin", th: "ก่อนภาษี {pre} · มาร์จิ้น %%MARGIN%%" },
fromFinancialsStep: { en: "From the Financials step", th: "มาจากขั้นตอนการเงิน" },
importExport: { en: "⇅ Import / Export plan", th: "⇅ นำเข้า/ส่งออกแผน" },
},
idea: {
stepKicker: { en: "Step 01 — Business Model", th: "ขั้นตอนที่ 01 — โมเดลธุรกิจ" },
stepTitle: { en: "Start with the dream.", th: "เริ่มจากความฝัน" },
stepLead: { en: "One page that turns a loose ambition into a structured business model — with a light market and location gut-check built in.", th: "หน้าเดียวที่เปลี่ยนความตั้งใจคร่าวๆ ให้เป็นโมเดลธุรกิจที่มีโครงสร้าง พร้อมตรวจสอบตลาดและทำเลเบื้องต้นในตัว" },
switchToInterview: { en: "Prefer to be interviewed? ", th: "อยากให้สัมภาษณ์แทนไหม " },
switchToInterviewLink: { en: "Answer a few questions instead →", th: "ตอบคำถามสั้นๆ แทน →" },
backToFormPrefix: { en: "← ", th: "← " },
backToFormLink: { en: "Back to the form", th: "กลับไปที่แบบฟอร์ม" },
viewBrief: { en: "View Concept Brief →", th: "ดูสรุปแนวคิด →" },
seeConceptBrief: { en: "See my Concept Brief →", th: "ดูสรุปแนวคิดของฉัน →" },
briefKicker: { en: "Step 01 — Business Model · Brief", th: "ขั้นตอนที่ 01 — โมเดลธุรกิจ · สรุป" },
briefTitle: { en: "Your Concept Brief.", th: "สรุปแนวคิดของคุณ" },
briefLead: { en: "The structured version of your idea — what the financials and the pitch summary read.", th: "เวอร์ชันมีโครงสร้างของไอเดียคุณ — สิ่งที่การเงินและสรุปนำเสนอจะอ่าน" },
secConcept: { en: "The concept", th: "แนวคิด" },
secCustomersPrice: { en: "Customers & price", th: "ลูกค้าและราคา" },
secChannels: { en: "Channels", th: "ช่องทางขาย" },
secFormatLocation: { en: "Format & location", th: "รูปแบบและทำเล" },
secWhyWin: { en: "Why you win", th: "จุดแข็งของคุณ" },
secAboutYou: { en: "About you", th: "เกี่ยวกับคุณ" },
conceptName: { en: "Concept name", th: "ชื่อร้าน/แนวคิด" },
conceptNamePh: { en: "e.g. Nami Ramen", th: "เช่น นามิ ราเมง" },
tagline: { en: "Tagline", th: "แท็กไลน์" },
taglineHint: { en: "One line that sells it", th: "หนึ่งประโยคที่ขายไอเดียคุณได้" },
taglinePh: { en: "Slow-broth ramen for late nights", th: "ราเมงต้มช้าเพื่อค่ำคืนดึกๆ" },
category: { en: "Category", th: "ประเภทร้าน" },
cuisine: { en: "Cuisine", th: "ประเภทอาหาร" },
cuisinePh: { en: "Type or pick below", th: "พิมพ์หรือเลือกด้านล่าง" },
serviceStyle: { en: "Service style", th: "รูปแบบการบริการ" },
targetCustomer: { en: "Target customer", th: "กลุ่มลูกค้าเป้าหมาย" },
targetCustomerHint: { en: "Pick every group you're built for", th: "เลือกทุกกลุ่มที่ร้านคุณเหมาะกับ" },
priceBand: { en: "Price band", th: "ระดับราคา" },
priceBandHint: { en: "Indicative spend per head", th: "ค่าใช้จ่ายโดยประมาณต่อคน" },
dineIn: { en: "Dine-in", th: "นั่งทาน" },
delivery: { en: "Delivery", th: "เดลิเวอรี่" },
takeaway: { en: "Takeaway", th: "ซื้อกลับ" },
deliveryHint: { en: "Grab / LineMan / foodpanda orders", th: "ออเดอร์จาก Grab / LineMan / foodpanda" },
mustTotal100: { en: "Must total 100%", th: "ต้องรวมเป็น 100%" },
seats: { en: "Seats", th: "จำนวนที่นั่ง" },
seatsHint: { en: "0 if delivery-only", th: "ใส่ 0 ถ้าเดลิเวอรี่อย่างเดียว" },
size: { en: "Approx. size", th: "ขนาดโดยประมาณ" },
locationType: { en: "Location type", th: "ประเภททำเล" },
competition: { en: "Similar places already nearby", th: "ร้านคล้ายกันที่มีอยู่แล้วใกล้เคียง" },
competitionHint: { en: "Honest gut call — powers the market check", th: "ตอบตามความรู้สึกจริง — ใช้ตรวจสอบตลาด" },
rentExpectation: { en: "Expected monthly rent", th: "ค่าเช่าต่อเดือนที่คาดไว้" },
rentExpectationHint: { en: "Rough asking rent for the kind of spot you want", th: "ค่าเช่าโดยประมาณของทำเลที่คุณต้องการ" },
uspTitle: { en: "Your edge in one sentence", th: "จุดเด่นของคุณในหนึ่งประโยค" },
uspHint: { en: "What a customer would tell a friend about you.", th: "สิ่งที่ลูกค้าจะบอกเพื่อนเกี่ยวกับร้านคุณ" },
uspPh: { en: "The only 3am tonkotsu in Thonglor, broth simmered 18 hours.", th: "ทงคตสึเที่ยงคืนแห่งเดียวในทองหล่อ ต้มน้ำซุป 18 ชั่วโมง" },
experience: { en: "F&B experience", th: "ประสบการณ์ร้านอาหาร" },
capital: { en: "Capital available", th: "เงินทุนที่มี" },
capitalHint: { en: "Everything you can commit", th: "เงินทั้งหมดที่คุณพร้อมลงทุน" },
role: { en: "Your role", th: "บทบาทของคุณ" },
progressFields: { en: "fields", th: "ช่อง" },
typeAnswer: { en: "Type your answer…", th: "พิมพ์คำตอบของคุณ…" },
previous: { en: "← Previous", th: "← ก่อนหน้า" },
skip: { en: "Skip this one", th: "ข้ามข้อนี้" },
next: { en: "Next →", th: "ถัดไป →" },
saveAnswer: { en: "Save answer →", th: "บันทึกคำตอบ →" },
interviewTip: { en: "Answer loosely — I pull out the structure. Anything I mishear you can correct in “Fill the form”.", th: "ตอบแบบสบายๆ ได้เลย ระบบจะดึงโครงสร้างให้เอง หากฟังผิดคุณแก้ไขได้ใน “กรอกแบบฟอร์ม”" },
doneTitle: { en: "That's the interview.", th: "จบการสัมภาษณ์แล้ว" },
doneDesc: { en: "I filled {filled} of {total} fields from your answers. Review and fix anything I misheard, then see your Concept Brief.", th: "กรอกให้แล้ว {filled} จาก {total} ช่องจากคำตอบของคุณ ตรวจสอบและแก้ไขจุดที่ฟังผิด แล้วดูสรุปแนวคิดของคุณ" },
reviewForm: { en: "Review the form", th: "ตรวจสอบแบบฟอร์ม" },
yourAnswers: { en: "Your answers — tap one to edit", th: "คำตอบของคุณ — แตะเพื่อแก้ไข" },
skipped: { en: "skipped", th: "ข้าม" },
edit: { en: "edit →", th: "แก้ไข →" },
restart: { en: "Restart interview", th: "เริ่มสัมภาษณ์ใหม่" },
noted: { en: "couldn't pull specifics — you can fix it in the form later", th: "ดึงรายละเอียดไม่ได้ — แก้ไขในแบบฟอร์มได้ภายหลัง" },
notedLabel: { en: "Noted", th: "รับทราบ" },
editMyAnswers: { en: "Edit my answers", th: "แก้ไขคำตอบของฉัน" },
checkNumbers: { en: "Check the numbers →", th: "ตรวจสอบตัวเลข →" },
prefillNote: { en: "Step 02 pre-fills from this brief — seats, size, average spend and rent carry over.", th: "ขั้นตอนที่ 02 จะดึงข้อมูลจากสรุปนี้มาให้อัตโนมัติ — ที่นั่ง ขนาด ค่าใช้จ่ายเฉลี่ย และค่าเช่า" },
conceptVerdict: { en: "Concept verdict", th: "ผลประเมินแนวคิด" },
conceptReadiness: { en: "Concept readiness", th: "ความพร้อมของแนวคิด" },
fieldsCoherence: { en: "{filled}/{total} fields · coherence checked", th: "{filled}/{total} ช่อง · ตรวจสอบความสอดคล้องแล้ว" },
conceptBriefFallback: { en: "Concept Brief", th: "สรุปแนวคิด" },
whyYouWin: { en: "Why you win", th: "จุดแข็งของคุณ" },
roughFitout: { en: "Rough fit-out for this concept: ", th: "ค่าตกแต่งร้านโดยประมาณสำหรับแนวคิดนี้: " },
realityCheck: { en: "Reality check", th: "ตรวจสอบความเป็นจริง" },
realityCheckDesc: { en: "Your concept plus a light market and location gut-check — the handful of things that most often decide it before the numbers do.", th: "แนวคิดของคุณบวกกับการตรวจตลาดและทำเลเบื้องต้น — ปัจจัยไม่กี่อย่างที่มักตัดสินก่อนตัวเลขจะบอก" },
nothingJumpsOut: { en: "Nothing jumps out — no crowd-without-an-edge, no price–place mismatch, rent within reach of the sales benchmark.", th: "ไม่มีจุดที่น่ากังวล — ไม่มีปัญหากลุ่มลูกค้าขาดจุดเด่น ราคากับทำเลสอดคล้องกัน ค่าเช่าอยู่ในเกณฑ์เทียบกับยอดขายอ้างอิง" },
roughSalesFormat: { en: "Rough sales for this format: ", th: "ยอดขายโดยประมาณสำหรับรูปแบบนี้: " },
healthyRentUpTo: { en: " — healthy rent up to ≈ ", th: " — ค่าเช่าที่เหมาะสมไม่เกิน ≈ " },
testFirst: { en: "Test first", th: "ทดสอบก่อน" },
briefVerdictGreen: { en: "The pieces fit — and the light market and location checks below hold up. Take it into the numbers.", th: "องค์ประกอบเข้ากันดี — และผลตรวจตลาดกับทำเลด้านล่างก็ผ่าน ไปดูตัวเลขกันต่อได้เลย" },
briefVerdictRed: { en: "Something below contradicts itself — resolve the red flags before moving on.", th: "มีบางจุดด้านล่างที่ขัดแย้งกันเอง — แก้ไขจุดสีแดงก่อนไปต่อ" },
briefVerdictAmber: { en: "A solid start — fill the gaps and settle the flagged points, then move on to the numbers.", th: "เริ่มต้นได้ดี — เติมส่วนที่ขาดและแก้จุดที่ถูกตั้งข้อสังเกต แล้วไปดูตัวเลขต่อ" },
verdictContradictions: { en: "Contradictions to resolve", th: "มีข้อขัดแย้งต้องแก้ไข" },
verdictReady: { en: "Concept Brief ready", th: "สรุปแนวคิดพร้อมแล้ว" },
verdictSharpen: { en: "Needs sharpening", th: "ต้องปรับให้คมชัดขึ้น" },
flagMix: { en: "Your channel mix adds to {mixSum}%, not 100%. Fix the split before anything downstream can trust it.", th: "สัดส่วนช่องทางขายของคุณรวมได้ {mixSum}% ไม่ใช่ 100% แก้ตัวเลขนี้ก่อน ไม่งั้นขั้นตอนถัดไปจะเชื่อถือไม่ได้" },
flagFineDelivery: { en: "Fine dining rarely travels well — a delivery-heavy mix fights the concept. Consider a separate delivery brand instead.", th: "ไฟน์ไดนิ่งมักไม่เหมาะกับการจัดส่ง — สัดส่วนเดลิเวอรี่สูงจะขัดกับแนวคิดร้าน ลองแยกแบรนด์สำหรับเดลิเวอรี่ต่างหาก" },
flagPricePlace: { en: "{band} pricing in a {loc} catchment is a price–place mismatch. One of the two usually has to move.", th: "ราคาระดับ{band}ในทำเล{loc}ไม่ค่อยเข้ากัน มักต้องปรับอย่างใดอย่างหนึ่ง" },
flagPriceStudents: { en: "Your price sits above what this crowd usually spends. Either the target customer or the price band needs to move.", th: "ราคาของคุณสูงกว่าที่กลุ่มนี้มักจะจ่ายไหว ต้องปรับกลุ่มลูกค้าเป้าหมายหรือระดับราคาอย่างใดอย่างหนึ่ง" },
flagCompetitionUsp: { en: "A crowded field and no clear edge is the hardest way in. Sharpen what makes you different before spending a baht.", th: "ตลาดที่มีคู่แข่งเยอะแต่ไม่มีจุดเด่นชัดเจนคือทางที่ยากที่สุด ทำจุดต่างให้ชัดก่อนใช้เงินสักบาท" },
flagDeliveryPct: { en: "{pct}% delivery means GrabFood / LineMan commissions (~25–35%) eat a big slice of every order. Price the delivery menu accordingly.", th: "เดลิเวอรี่ {pct}% หมายความว่าค่าคอมมิชชั่น GrabFood / LineMan (~25-35%) จะกินกำไรไปมาก ตั้งราคาเมนูเดลิเวอรี่ให้เหมาะสม" },
flagRent: { en: "Expected rent of {rent} is {gap} above the ~10% of sales a restaurant can usually carry — against a benchmark estimate of {est}/mo in sales ({basis}). Negotiate, or be sure the site sells more.", th: "ค่าเช่าที่คาดไว้ {rent} สูงกว่าเกณฑ์ ~10% ของยอดขายที่ร้านอาหารทั่วไปรับไหวอยู่ {gap} — เทียบกับยอดขายอ้างอิงที่ประมาณ {est}/เดือน ({basis}) ลองต่อรอง หรือมั่นใจว่าทำเลนี้ขายได้มากกว่านั้น" },
flagCapital: { en: "Capital of {cap} looks well below a rough fit-out estimate of {est} ({basis}) — before deposits, stock and reserve. Shrink the concept or raise more.", th: "เงินทุน {cap} ดูน้อยกว่าค่าตกแต่งร้านโดยประมาณที่ {est} ({basis}) มาก — ยังไม่รวมมัดจำ สต๊อก และเงินสำรอง ลองลดขนาดแนวคิดหรือระดมทุนเพิ่ม" },
flagUsp: { en: "Your edge reads generic — nothing here separates you from the shop next door yet. Sharpen it into something a customer would repeat to a friend.", th: "จุดเด่นที่เขียนไว้ยังทั่วไปเกินไป — ยังไม่มีอะไรที่ต่างจากร้านข้างๆ ลองปรับให้เป็นสิ่งที่ลูกค้าอยากเล่าต่อให้เพื่อนฟัง" },
flagBarOffice: { en: "A bar living off office crowds is busy 2 nights a week. Check whether the quiet dayparts still cover the rent.", th: "บาร์ที่พึ่งพากลุ่มออฟฟิศจะคึกคักแค่ 2 คืนต่อสัปดาห์ ลองตรวจดูว่าช่วงที่เงียบยังจ่ายค่าเช่าไหวหรือไม่" },
flagFirstTimerScale: { en: "A first venture at this scale is a hard first climb. Many owners start smaller, learn the ropes, then expand.", th: "การเริ่มธุรกิจแรกในขนาดนี้เป็นก้าวที่ยากมาก เจ้าของร้านหลายคนเริ่มจากเล็กๆ เรียนรู้ก่อนแล้วค่อยขยาย" },
flagFoodHigh: { en: "Food cost is {pct} of sales. Most restaurants keep this 28–35% — tighten recipes or pricing.", th: "ต้นทุนวัตถุดิบอยู่ที่ {pct} ของยอดขาย ร้านอาหารส่วนใหญ่รักษาไว้ที่ 28-35% ลองปรับสูตรหรือราคา" },
flagFoodLow: { en: "Food cost of {pct} looks low — double-check it's realistic for your menu.", th: "ต้นทุนวัตถุดิบ {pct} ดูต่ำไป — ลองตรวจสอบว่าสมเหตุสมผลกับเมนูของคุณหรือไม่" },
flagFoodHealthy: { en: "Food cost {pct} sits in the healthy 28–35% range.", th: "ต้นทุนวัตถุดิบ {pct} อยู่ในช่วงที่เหมาะสม 28-35%" },
flagStaffHigh: { en: "Staff is {pct} of sales (healthy is ~25–35%). Keep an eye on the roster.", th: "ค่าแรงพนักงานอยู่ที่ {pct} ของยอดขาย (ที่เหมาะสมคือ ~25-35%) ควรจับตาตารางกะพนักงาน" },
flagPrimeHigh: { en: "Prime cost (food + staff) is {pct}. Above 65% leaves little for rent and profit.", th: "ต้นทุนหลัก (วัตถุดิบ+ค่าแรง) อยู่ที่ {pct} หากเกิน 65% จะเหลือเงินสำหรับค่าเช่าและกำไรน้อยมาก" },
flagRentHigh: { en: "Rent is {pct} of sales. Above 15% is heavy for a restaurant.", th: "ค่าเช่าอยู่ที่ {pct} ของยอดขาย เกิน 15% ถือว่าหนักสำหรับร้านอาหาร" },
flagMarginGood: { en: "A net margin of {pct} gives you a comfortable cushion.", th: "มาร์จิ้นสุทธิ {pct} ให้กันชนที่สบายพอสมควร" },
flagLoss: { en: "At these numbers you spend more than you earn each month. Raise sales or trim costs.", th: "ด้วยตัวเลขนี้คุณใช้จ่ายมากกว่าที่หาได้ในแต่ละเดือน ต้องเพิ่มยอดขายหรือลดต้นทุน" },
flagPaybackSlow: { en: "Payback of {months} is slow — most owners aim to recover within 2–3 years.", th: "ระยะเวลาคืนทุน {months} ค่อนข้างช้า — เจ้าของร้านส่วนใหญ่ตั้งเป้าคืนทุนภายใน 2-3 ปี" },
flagNoTax: { en: "You haven't set aside anything for taxes yet. Add a Taxes & statutory line so your take-home number is realistic.", th: "คุณยังไม่ได้กันเงินสำหรับภาษีเลย เพิ่มรายการภาษีและเงินสมทบเพื่อให้ตัวเลขกำไรสุทธิสมจริง" },
riskRent: { en: "Riskiest assumption: the rent. It only works if the site really sells near the benchmark — count foot traffic and check neighbours' busy hours before signing.", th: "สมมติฐานที่เสี่ยงที่สุด: ค่าเช่า จะได้ผลก็ต่อเมื่อทำเลนี้ขายได้ใกล้เคียงค่าอ้างอิงจริง — นับจำนวนคนเดินผ่านและดูช่วงเวลาคึกคักของร้านข้างเคียงก่อนเซ็นสัญญา" },
riskCapital: { en: "Riskiest assumption: the budget. Your capital sits below a rough fit-out benchmark — get a real contractor quote before anything else.", th: "สมมติฐานที่เสี่ยงที่สุด: งบประมาณ เงินทุนของคุณต่ำกว่าค่าตกแต่งร้านอ้างอิง — ขอใบเสนอราคาจากผู้รับเหมาจริงก่อนอื่นใด" },
riskPrice: { en: "Riskiest assumption: the price. Test whether your target crowd will actually pay this — a weekend pop-up or pre-order test settles it fast.", th: "สมมติฐานที่เสี่ยงที่สุด: ราคา ทดสอบว่ากลุ่มเป้าหมายจะจ่ายจริงไหม — ลองเปิดป็อปอัพวันหยุดหรือเปิดพรีออเดอร์ก็รู้ผลเร็ว" },
riskUsp: { en: "Riskiest assumption: the edge. If you can't name why people cross the street for you, test the concept on strangers before spending on a site.", th: "สมมติฐานที่เสี่ยงที่สุด: จุดเด่น ถ้าบอกไม่ได้ว่าทำไมคนถึงจะข้ามถนนมาหาคุณ ลองทดสอบแนวคิดกับคนแปลกหน้าก่อนลงทุนกับทำเล" },
benchSeatsTurns: { en: "{seats} seats × 1.8 turns × {mid} × 26 days", th: "{seats} ที่นั่ง × 1.8 รอบ × {mid} × 26 วัน" },
benchCloudKitchen: { en: "typical Bangkok cloud-kitchen setup", th: "ค่าเฉลี่ยของคลาวด์คิทเช่นในกรุงเทพฯ" },
benchPerSeat: { en: "{per}/seat × {seats} seats (Thai {cat} benchmark)", th: "{per}/ที่นั่ง × {seats} ที่นั่ง (ค่าอ้างอิงร้าน{cat}ในไทย)" },
},
q: {
concept: { q: { en: "Tell me about the restaurant you dream of opening.", th: "เล่าให้ฟังหน่อยว่าร้านอาหารในฝันของคุณเป็นแบบไหน" }, hint: { en: "A sentence or two — what food, what vibe. Thai or English, both fine.", th: "หนึ่งหรือสองประโยคก็พอ — อาหารแบบไหน บรรยากาศแบบไหน ตอบไทยหรืออังกฤษก็ได้" } },
name: { q: { en: "Does it have a name yet? And a one-line tagline?", th: "มีชื่อร้านหรือยัง แล้วมีแท็กไลน์สั้นๆ ไหม" }, hint: { en: "e.g. “Nami Ramen — slow-broth ramen for Thonglor nights.” Skip if undecided.", th: "เช่น “นามิ ราเมง — ราเมงต้มช้าเพื่อค่ำคืนทองหล่อ” ข้ามได้ถ้ายังไม่ตัดสินใจ" } },
customer: { q: { en: "Who do you picture sitting at your tables?", th: "คุณนึกภาพใครนั่งอยู่ที่โต๊ะร้านคุณ" }, hint: { en: "Students, office workers, families, tourists, expats, hi-so — one or several.", th: "นักเรียน พนักงานออฟฟิศ ครอบครัว นักท่องเที่ยว ชาวต่างชาติ ไฮโซ — เลือกได้หลายกลุ่ม" } },
price: { q: { en: "Roughly how much should one customer spend per visit?", th: "โดยประมาณลูกค้าหนึ่งคนควรใช้จ่ายเท่าไรต่อครั้ง" }, hint: { en: "A number in baht is perfect — e.g. “around ฿250 a head”.", th: "บอกเป็นตัวเลขบาทได้เลย เช่น “ประมาณ 250 บาทต่อคน”" } },
channels: { q: { en: "Dine-in, delivery, takeaway — how do you imagine the split?", th: "นั่งทาน เดลิเวอรี่ ซื้อกลับ — คุณคิดว่าสัดส่วนจะเป็นยังไง" }, hint: { en: "e.g. “mostly dine-in, maybe 70/20/10” — three numbers that sum to 100.", th: "เช่น “ส่วนใหญ่นั่งทาน สัก 70/20/10” — ตัวเลขสามตัวรวมกันเป็น 100" } },
format: { q: { en: "How big is the place in your head?", th: "ในหัวคุณ ร้านมีขนาดใหญ่แค่ไหน" }, hint: { en: "Seats and rough size — e.g. “about 30 seats, maybe 80 sqm, table service”.", th: "จำนวนที่นั่งและขนาดคร่าวๆ เช่น “ประมาณ 30 ที่นั่ง 80 ตร.ม. เสิร์ฟที่โต๊ะ”" } },
location: { q: { en: "Where do you picture it — what kind of spot?", th: "คุณนึกภาพทำเลแบบไหน" }, hint: { en: "A mall unit, street shophouse, community mall, CBD, tourist area, near a campus…", th: "ในห้าง ตึกแถวริมถนน คอมมูนิตี้มอลล์ ย่านธุรกิจ แหล่งท่องเที่ยว ใกล้มหาวิทยาลัย…" } },
usp: { q: { en: "Why will people choose you over the shop next door?", th: "ทำไมคนถึงจะเลือกร้านคุณแทนร้านข้างๆ" }, hint: { en: "One honest sentence. “Good food” doesn't count — everyone says that.", th: "หนึ่งประโยคที่จริงใจ “อาหารอร่อย” ใช้ไม่ได้ เพราะทุกร้านก็พูดแบบนี้" } },
experience: { q: { en: "Have you worked in restaurants before?", th: "คุณเคยทำงานร้านอาหารมาก่อนไหม" }, hint: { en: "First time, worked in F&B, or opened your own before.", th: "ครั้งแรก เคยทำงานในธุรกิจอาหาร หรือเคยเปิดร้านของตัวเองมาก่อน" } },
capital: { q: { en: "Last one — how much capital can you put in, and will you run it yourself?", th: "ข้อสุดท้าย — คุณมีทุนเท่าไร และจะบริหารเองไหม" }, hint: { en: "e.g. “about 2 million baht, running it myself” or “5M, I'm just investing”.", th: "เช่น “ประมาณ 2 ล้านบาท บริหารเอง” หรือ “5 ล้าน แค่ลงทุนอย่างเดียว”" } },
},
fin: {
shellKicker: { en: "Step 02 — Financial Feasibility", th: "ขั้นตอนที่ 02 — ความเป็นไปได้ทางการเงิน" },
shellTitle: { en: "Do the numbers work?", th: "ตัวเลขไปรอดไหม" },
shellLead: { en: "Investment, sales, running costs and Thai taxes — ending in a professional verdict on your plan.", th: "เงินลงทุน ยอดขาย ต้นทุนดำเนินงาน และภาษีไทย — จบด้วยผลประเมินแผนของคุณอย่างมืออาชีพ" },
stepInvestment: { en: "Investment", th: "การลงทุน" },
stepSales: { en: "Sales", th: "ยอดขาย" },
stepCosts: { en: "Costs", th: "ต้นทุน" },
stepResults: { en: "Results", th: "ผลลัพธ์" },
invKicker: { en: "Financials · 1 of 4 — Investment", th: "การเงิน · 1 ใน 4 — การลงทุน" },
invTitle: { en: "What will it cost to open?", th: "เปิดร้านต้องใช้เงินเท่าไร" },
invLead: { en: "The one-time money you need before the doors open. Know a lump sum? Type it. Not sure? Open a category and build it up item by item.", th: "เงินก้อนแรกที่ต้องใช้ก่อนเปิดร้าน รู้ยอดรวมแล้วก็พิมพ์ได้เลย ไม่แน่ใจก็เปิดหมวดแล้วใส่ทีละรายการ" },
totalToOpen: { en: "Total to open", th: "รวมค่าใช้จ่ายเปิดร้าน" },
reserveTip: { en: "A cash reserve is the most-skipped line. Plan for 3–6 months of rent and wages so a slow start doesn't sink you.", th: "เงินสำรองเป็นรายการที่มักถูกมองข้ามที่สุด วางแผนไว้ 3-6 เดือนของค่าเช่าและค่าแรง เผื่อช่วงเริ่มต้นที่ยังไม่คล่องตัว" },
yourSpace: { en: "Your space ", th: "พื้นที่ร้านของคุณ " },
optional: { en: "(optional)", th: "(ไม่บังคับ)" },
spaceDesc: { en: "Unlocks cost-per-m² figures in your financial summary.", th: "ปลดล็อกตัวเลขต้นทุนต่อตร.ม. ในสรุปการเงินของคุณ" },
shopArea: { en: "Shop area", th: "พื้นที่ร้าน" },
kitchenArea: { en: "Kitchen area", th: "พื้นที่ครัว" },
stepSummaryNote: { en: "how a professional reads this step", th: "มืออาชีพอ่านขั้นตอนนี้อย่างไร" },
totalCapex: { en: "Total CapEx", th: "เงินลงทุนรวม" },
buildSystems: { en: "build + systems", th: "ก่อสร้าง + ระบบ" },
capexPerSqm: { en: "CapEx / m²", th: "เงินลงทุน/ตร.ม." },
shopAreaSub: { en: "shop area", th: "พื้นที่ร้าน" },
addShopSqm: { en: "add shop m² above", th: "เพิ่มพื้นที่ร้าน (ตร.ม.) ด้านบน" },
kitchenPerSqm: { en: "Kitchen ฿ / m²", th: "ครัว ฿/ตร.ม." },
equipKitchen: { en: "equipment ÷ kitchen", th: "อุปกรณ์ ÷ พื้นที่ครัว" },
addKitchenSqm: { en: "add kitchen m² above", th: "เพิ่มพื้นที่ครัว (ตร.ม.) ด้านบน" },
reserveCovers: { en: "Reserve covers", th: "เงินสำรองครอบคลุม" },
ofFixedCosts: { en: "of fixed costs", th: "ของต้นทุนคงที่" },
capitalRequired: { en: "Capital required", th: "เงินทุนที่ต้องใช้" },
everythingUpfront: { en: "everything upfront", th: "ทั้งหมดล่วงหน้า" },
salesKicker: { en: "Financials · 2 of 4 — Sales", th: "การเงิน · 2 ใน 4 — ยอดขาย" },
salesTitle: { en: "How much will you sell?", th: "คุณจะขายได้เท่าไร" },
salesLead: { en: "Your expected sales each month. Not sure of a number? Build it up from your seats and prices.", th: "ยอดขายที่คาดไว้ในแต่ละเดือน ไม่แน่ใจตัวเลข? ลองคำนวณจากจำนวนที่นั่งและราคา" },
haveTarget: { en: "I have a target", th: "ฉันมีเป้าหมายอยู่แล้ว" },
helpEstimate: { en: "Help me estimate", th: "ช่วยประมาณให้หน่อย" },
expectedMonthlySales: { en: "Expected monthly sales", th: "ยอดขายที่คาดต่อเดือน" },
monthlySalesDesc: { en: "Total revenue across the whole month, before any costs.", th: "รายได้รวมทั้งเดือน ก่อนหักต้นทุนใดๆ" },
aboutADay: { en: "That's about {x} a day.", th: "เฉลี่ยแล้วประมาณ {x} ต่อวัน" },
briefSaysSeats: { en: "Your Concept Brief says {n} seats.", th: "สรุปแนวคิดของคุณระบุว่ามี {n} ที่นั่ง" },
useIt: { en: "Use it", th: "ใช้ค่านี้" },
seatsHint2: { en: "How many guests can sit at once", th: "รองรับลูกค้าได้พร้อมกันกี่คน" },
tableTurns: { en: "Table turns per day", th: "จำนวนรอบต่อวัน" },
tableTurnsHint: { en: "How many times each seat is filled", th: "แต่ละที่นั่งถูกใช้ซ้ำกี่ครั้งต่อวัน" },
avgSpend: { en: "Average spend per guest", th: "ค่าใช้จ่ายเฉลี่ยต่อคน" },
avgSpendHint: { en: "Food + drink on one bill, per head", th: "อาหาร+เครื่องดื่มต่อบิล ต่อคน" },
openDays: { en: "Open days per month", th: "จำนวนวันเปิดต่อเดือน" },
estMonthlySales: { en: "Estimated monthly sales", th: "ยอดขายโดยประมาณต่อเดือน" },
perDayApprox: { en: "≈ {x} per day", th: "≈ {x} ต่อวัน" },
salesPerMonth: { en: "Sales / month", th: "ยอดขาย/เดือน" },
salesPerDay: { en: "Sales / day", th: "ยอดขาย/วัน" },
avgCustValue: { en: "Avg customer value", th: "มูลค่าเฉลี่ยต่อลูกค้า" },
spendPerHead: { en: "spend per head", th: "ค่าใช้จ่ายต่อคน" },
useHelpEstimate: { en: "use “Help me estimate”", th: "ใช้ “ช่วยประมาณให้หน่อย”" },
custPerDay: { en: "Customers / day", th: "ลูกค้า/วัน" },
seatsTimesTurns: { en: "seats × turns", th: "ที่นั่ง × รอบ" },
costsKicker: { en: "Financials · 3 of 4 — Costs", th: "การเงิน · 3 ใน 4 — ต้นทุน" },
costsTitle: { en: "What does each month cost to run?", th: "แต่ละเดือนมีต้นทุนดำเนินงานเท่าไร" },
costsLead: { en: "Your recurring monthly costs. Food cost moves with sales, so we set it as a percentage — the rest you can type or itemise.", th: "ต้นทุนรายเดือนที่เกิดซ้ำ ต้นทุนวัตถุดิบแปรผันตามยอดขาย จึงตั้งเป็นเปอร์เซ็นต์ — ส่วนที่เหลือพิมพ์หรือแจกแจงได้" },
operatingCost: { en: "Operating Cost", th: "ต้นทุนดำเนินงาน" },
operatingCostDesc: { en: "What it costs to run each month. Food moves with sales — set it as a share below — the rest you can type or itemise.", th: "ค่าใช้จ่ายในการดำเนินงานแต่ละเดือน ต้นทุนวัตถุดิบแปรผันตามยอดขาย — ตั้งเป็นสัดส่วนด้านล่าง — ส่วนที่เหลือพิมพ์หรือแจกแจงได้" },
foodDrink: { en: "Food & drink ", th: "อาหารและเครื่องดื่ม " },
foodDrinkSub: { en: "— at {sales} that's {food}/mo", th: "— ที่ยอดขาย {sales} คิดเป็น {food}/เดือน" },
healthyRange: { en: "✓ healthy range", th: "✓ อยู่ในเกณฑ์ที่เหมาะสม" },
healthy28to35: { en: "healthy 28–35%", th: "เกณฑ์ที่เหมาะสม 28-35%" },
totalMonthlyCost: { en: "Total monthly cost", th: "ต้นทุนรวมต่อเดือน" },
takeHomeAfterTax: { en: "Take-home after tax, each month", th: "กำไรสุทธิที่ได้ต่อเดือน หลังหักภาษี" },
shortfallAfterTax: { en: "Shortfall each month (after tax)", th: "ยอดขาดทุนต่อเดือน (หลังหักภาษี)" },
beforeTax: { en: "before tax: {x}", th: "ก่อนหักภาษี: {x}" },
variableCosts: { en: "Variable costs", th: "ต้นทุนแปรผัน" },
moveWithSales: { en: "move with sales", th: "แปรผันตามยอดขาย" },
fixedCosts: { en: "Fixed costs", th: "ต้นทุนคงที่" },
sameEveryMonth: { en: "same every month", th: "เท่าเดิมทุกเดือน" },
breakEvenMo: { en: "Break-even / mo", th: "จุดคุ้มทุน/เดือน" },
breakEvenDay: { en: "Break-even / day", th: "จุดคุ้มทุน/วัน" },
ebitdaMo: { en: "EBITDA / mo", th: "EBITDA/เดือน" },
marginPreTax: { en: "{pct} margin · pre-tax", th: "มาร์จิ้น {pct} · ก่อนภาษี" },
netProfitAfterTax: { en: "Net profit after tax", th: "กำไรสุทธิหลังภาษี" },
afterTaxMargin: { en: "{pct} after-tax margin", th: "มาร์จิ้นหลังภาษี {pct}" },
theVerdict: { en: "The verdict", th: "ผลประเมิน" },
netProfitMo: { en: "Net profit after tax / mo", th: "กำไรสุทธิหลังภาษี/เดือน" },
preTaxTaxesEst: { en: "pre-tax {x} · taxes est. {y}", th: "ก่อนภาษี {x} · ภาษีประมาณ {y}" },
netMargin: { en: "Net margin", th: "มาร์จิ้นสุทธิ" },
afterTaxMarginSub: { en: "after tax · profit ÷ net sales", th: "หลังภาษี · กำไร ÷ ยอดขายสุทธิ" },
breakEvenSales: { en: "Break-even sales", th: "ยอดขายจุดคุ้มทุน" },
perDayShort: { en: "≈ ฿{x}/day", th: "≈ ฿{x}/วัน" },
payback: { en: "Payback", th: "ระยะคืนทุน" },
paybackSub: { en: "after tax, to earn back investment", th: "หลังภาษี กว่าจะคืนทุน" },
toOpen: { en: "To open", th: "เพื่อเปิดร้าน" },
totalUpfront: { en: "total upfront", th: "รวมล่วงหน้าทั้งหมด" },
whereEvery100: { en: "Where every ฿100 of sales goes", th: "ทุกๆ ฿100 ของยอดขายไปที่ไหนบ้าง" },
every100Desc: { en: "Every cost plus your profit adds up to 100% of sales.", th: "ทุกต้นทุนรวมกับกำไรของคุณจะรวมกันเป็น 100% ของยอดขาย" },
bar: { en: "Bar", th: "แท่ง" },
donut: { en: "Donut", th: "วงกลม" },
netMarginDonut: { en: "Net margin", th: "มาร์จิ้นสุทธิ" },
profitKeep: { en: "Profit after tax — what you keep", th: "กำไรหลังภาษี — ส่วนที่คุณได้" },
monthlyLoss: { en: "Monthly loss (after tax)", th: "ขาดทุนต่อเดือน (หลังภาษี)" },
whatToWatch: { en: "What to watch", th: "สิ่งที่ควรจับตา" },
segFood: { en: "Food & drink", th: "อาหารและเครื่องดื่ม" },
segStaff: { en: "Staff wages", th: "ค่าแรงพนักงาน" },
segRent: { en: "Rent", th: "ค่าเช่า" },
segUtil: { en: "Utilities", th: "สาธารณูปโภค" },
segMkt: { en: "Marketing", th: "การตลาด" },
segMgmt: { en: "Management & systems", th: "ระบบบริหารจัดการ" },
segOther: { en: "Other", th: "อื่นๆ" },
segTax: { en: "Taxes & statutory", th: "ภาษีและเงินสมทบ" },
verdictNone: { en: "Awaiting numbers", th: "รอตัวเลข" },
verdictLoss: { en: "Losing money", th: "ขาดทุน" },
verdictRisky: { en: "Risky", th: "เสี่ยง" },
verdictOk: { en: "Workable", th: "พอไปได้" },
verdictHealthy: { en: "Healthy", th: "แข็งแรง" },
verdictStrong: { en: "Strong", th: "แข็งแกร่ง" },
blurbEmpty: { en: "Enter your sales and costs to see how the plan holds up.", th: "กรอกยอดขายและต้นทุนเพื่อดูว่าแผนนี้ไปรอดไหม" },
blurbLoss: { en: "After costs and taxes you'd be short {x} every month. Raise sales, lift prices, or trim fixed costs to clear break-even.", th: "หลังหักต้นทุนและภาษีคุณจะขาดทุน {x} ทุกเดือน เพิ่มยอดขาย ขึ้นราคา หรือลดต้นทุนคงที่เพื่อให้ถึงจุดคุ้มทุน" },
blurbThin: { en: "It works, but the cushion is thin after tax. A small dip in sales could wipe out the profit — keep food and staff costs tight.", th: "พอไปได้ แต่กันชนหลังภาษีค่อนข้างบาง ยอดขายลดนิดหน่อยก็อาจทำให้กำไรหายไป ควบคุมต้นทุนวัตถุดิบและค่าแรงให้แน่น" },
blurbGood: { en: "This plan stands on its own — after tax. You clear break-even at {be} of sales and earn the investment back in {pb}.", th: "แผนนี้ไปรอดได้ด้วยตัวเอง — หลังหักภาษีแล้ว คุณจะถึงจุดคุ้มทุนที่ยอดขาย {be} และคืนทุนได้ภายใน {pb}" },
invRenoLabel: { en: "Renovation & fit-out", th: "การรีโนเวทและตกแต่ง" },
invRenoHint: { en: "Building work, interior, signage", th: "งานก่อสร้าง ตกแต่งภายใน ป้าย" },
invEquipLabel: { en: "Kitchen equipment", th: "อุปกรณ์ครัว" },
invEquipHint: { en: "Stoves, fridges, prep, small wares", th: "เตา ตู้เย็น อุปกรณ์เตรียมอาหาร เครื่องครัวเล็ก" },
invFurnLabel: { en: "Furniture & décor", th: "เฟอร์นิเจอร์และของตกแต่ง" },
invFurnHint: { en: "Tables, chairs, lighting", th: "โต๊ะ เก้าอี้ ไฟ" },
invDepositLabel: { en: "Rent deposit", th: "เงินมัดจำค่าเช่า" },
invDepositHint: { en: "Usually 2–3 months upfront", th: "โดยทั่วไป 2-3 เดือนล่วงหน้า" },
invLicLabel: { en: "Licenses & permits", th: "ใบอนุญาตและการขึ้นทะเบียน" },
invLicHint: { en: "Registration, food & alcohol permits", th: "จดทะเบียน ใบอนุญาตอาหารและเครื่องดื่มแอลกอฮอล์" },
invMgmtLabel: { en: "Management & systems", th: "ระบบบริหารจัดการ" },
invMgmtHint: { en: "POS, accounting, website, insurance", th: "POS บัญชี เว็บไซต์ ประกัน" },
invInvLabel: { en: "Opening inventory", th: "สต๊อกเปิดร้าน" },
invInvHint: { en: "First stock of food & drink", th: "วัตถุดิบชุดแรก" },
invReserveLabel: { en: "Cash reserve", th: "เงินสำรอง" },
invReserveHint: { en: "Buffer for the slow first months", th: "กันชนสำหรับช่วงเริ่มต้นที่ยังไม่คล่องตัว" },
costStaffLabel: { en: "Staff wages", th: "ค่าแรงพนักงาน" },
costStaffHint: { en: "All salaries, including yourself", th: "เงินเดือนทั้งหมด รวมของคุณเอง" },
costRentLabel: { en: "Rent", th: "ค่าเช่า" },
costRentHint: { en: "Monthly lease for the space", th: "ค่าเช่าพื้นที่รายเดือน" },
costUtilLabel: { en: "Utilities", th: "ค่าสาธารณูปโภค" },
costUtilHint: { en: "Electric, water, gas, internet", th: "ไฟ น้ำ แก๊ส อินเทอร์เน็ต" },
costMktLabel: { en: "Marketing", th: "การตลาด" },
costMktHint: { en: "Ads, promos, social media", th: "โฆษณา โปรโมชั่น โซเชียลมีเดีย" },
costMgmtLabel: { en: "Management & systems", th: "ระบบบริหารจัดการ" },
costMgmtHint: { en: "Insurance, accounting, POS, subscriptions", th: "ประกัน บัญชี POS ค่าสมัครสมาชิก" },
costOtherLabel: { en: "Other", th: "อื่นๆ" },
costOtherHint: { en: "Delivery platform fees, supplies, misc", th: "ค่าธรรมเนียมแพลตฟอร์มเดลิเวอรี่ ของใช้ เบ็ดเตล็ด" },
costTaxLabel: { en: "Taxes & statutory", th: "ภาษีและเงินสมทบ" },
costTaxHint: { en: "VAT, corporate tax, social security — add each as a line", th: "VAT ภาษีนิติบุคคล ประกันสังคม — เพิ่มทีละรายการ" },
ofSalesShare: { en: "{pct} of sales", th: "{pct} ของยอดขาย" },
continue: { en: "Continue →", th: "ถัดไป →" },
seeResults: { en: "See my results →", th: "ดูผลลัพธ์ของฉัน →" },
},
fs: {
heading: { en: "Financial summary", th: "สรุปการเงิน" },
desc: { en: "The figures an investor or accountant would check — every one comes from what you entered.", th: "ตัวเลขที่นักลงทุนหรือนักบัญชีจะตรวจสอบ — ทุกตัวมาจากสิ่งที่คุณกรอกไว้" },
capital: { en: "Capital", th: "เงินลงทุน" },
monthlyEconomics: { en: "Monthly economics", th: "เศรษฐศาสตร์รายเดือน" },
taxesTakeHome: { en: "Taxes & take-home", th: "ภาษีและกำไรสุทธิ" },
customers: { en: "Customers", th: "ลูกค้า" },
totalCapex: { en: "Total CapEx", th: "เงินลงทุนรวม" },
totalCapexSub: { en: "build-out, equipment, furniture, licences, systems", th: "ก่อสร้าง อุปกรณ์ เฟอร์นิเจอร์ ใบอนุญาต ระบบ" },
capexPerSqm: { en: "CapEx per m²", th: "เงินลงทุนต่อตร.ม." },
ofShopArea: { en: "of shop area", th: "ของพื้นที่ร้าน" },
addShopM2: { en: "add shop m² in step 1", th: "เพิ่มพื้นที่ร้าน (ตร.ม.) ในขั้นตอนที่ 1" },
kitchenCostPerSqm: { en: "Kitchen cost per m²", th: "ต้นทุนครัวต่อตร.ม." },
equipDivKitchen: { en: "equipment ÷ kitchen area", th: "อุปกรณ์ ÷ พื้นที่ครัว" },
addKitchenM2: { en: "add kitchen m² in step 1", th: "เพิ่มพื้นที่ครัว (ตร.ม.) ในขั้นตอนที่ 1" },
operatingReserve: { en: "Operating reserve", th: "เงินสำรองดำเนินงาน" },
monthsFixedCovered: { en: "months of fixed costs covered", th: "จำนวนเดือนที่ต้นทุนคงที่ครอบคลุม" },
totalCapitalRequired: { en: "Total capital required", th: "เงินทุนรวมที่ต้องใช้" },
totalVariableCosts: { en: "Total variable costs", th: "ต้นทุนแปรผันรวม" },
foodDrinkPct: { en: "food & drink · {pct}", th: "อาหารและเครื่องดื่ม · {pct}" },
totalFixedCosts: { en: "Total fixed costs", th: "ต้นทุนคงที่รวม" },
fixedCostsSub: { en: "staff, rent, utilities, marketing, systems, other", th: "ค่าแรง ค่าเช่า สาธารณูปโภค การตลาด ระบบ อื่นๆ" },
breakEvenMonthly: { en: "Break-even (monthly)", th: "จุดคุ้มทุน (รายเดือน)" },
breakEvenSalesSub: { en: "sales needed to cover all costs", th: "ยอดขายที่ต้องใช้ครอบคลุมต้นทุนทั้งหมด" },
breakEvenDaily: { en: "Break-even (daily)", th: "จุดคุ้มทุน (รายวัน)" },
ebitdaMonth: { en: "EBITDA / month", th: "EBITDA / เดือน" },
ebitdaSub: { en: "profit before tax & depreciation", th: "กำไรก่อนหักภาษีและค่าเสื่อม" },
taxesStatutoryMonth: { en: "Taxes & statutory / month", th: "ภาษีและเงินสมทบ / เดือน" },
taxesSub: { en: "VAT, corporate tax & social security — your monthly set-aside", th: "VAT ภาษีนิติบุคคล และประกันสังคม — เงินที่ต้องกันไว้ต่อเดือน" },
netProfitAfterTax: { en: "Net profit after tax", th: "กำไรสุทธิหลังภาษี" },
takeHomeNumber: { en: "the take-home number", th: "ตัวเลขที่ได้จริง" },
avgCustValue: { en: "Avg customer value", th: "มูลค่าเฉลี่ยต่อลูกค้า" },
spendPerHead: { en: "spend per head", th: "ค่าใช้จ่ายต่อคน" },
useHelpEstimate: { en: "use “Help me estimate” in Sales", th: "ใช้ “ช่วยประมาณให้หน่อย” ในขั้นตอนยอดขาย" },
effCustDay: { en: "Effective customers / day", th: "ลูกค้าเฉลี่ย/วัน" },
seatsTurns: { en: "seats × table turns", th: "ที่นั่ง × รอบโต๊ะ" },
},
inv: {
itemized: { en: " item{s} itemised", th: " รายการที่แจกแจงแล้ว" },
autoSummed: { en: "auto-summed", th: "รวมอัตโนมัติ" },
itemHeader: { en: "Item", th: "รายการ" },
qtyHeader: { en: "Qty", th: "จำนวน" },
priceHeader: { en: "Price each", th: "ราคาต่อชิ้น" },
totalHeader: { en: "Total", th: "รวม" },
addItem: { en: "+ Add an item…", th: "+ เพิ่มรายการ…" },
typeOwn: { en: "Type my own…", th: "พิมพ์เอง…" },
notSureTotal: { en: "Not sure of the total? Add items one by one — it adds up for you and doubles as a checklist of what you've covered.", th: "ไม่แน่ใจยอดรวม? ใส่ทีละรายการ ระบบจะรวมให้อัตโนมัติ และเป็นเช็คลิสต์ให้ดูว่าคุณครอบคลุมอะไรไปแล้วบ้าง" },
backToSingle: { en: "Back to a single amount", th: "กลับไปใส่เป็นยอดเดียว" },
subtotal: { en: "Subtotal ", th: "ยอดรวมย่อย " },
itemNamePh: { en: "Item name", th: "ชื่อรายการ" },
},
pitch: {
kicker: { en: "Step 03 — Pitch Summary Dashboard", th: "ขั้นตอนที่ 03 — แดชบอร์ดสรุปนำเสนอ" },
title: { en: "Your plan, on one page.", th: "แผนของคุณในหน้าเดียว" },
lead: { en: "A read-only summary an investor or bank can read in two minutes — built from steps 01 and 02.", th: "สรุปแบบอ่านอย่างเดียวที่นักลงทุนหรือธนาคารอ่านจบใน 2 นาที — สร้างจากขั้นตอนที่ 01 และ 02" },
lead2: { en: "A read-only summary an investor or bank can read in two minutes — every figure comes from steps 01 and 02.", th: "สรุปแบบอ่านอย่างเดียวที่นักลงทุนหรือธนาคารอ่านจบใน 2 นาที — ทุกตัวเลขมาจากขั้นตอนที่ 01 และ 02" },
almostThere: { en: "Almost there.", th: "ใกล้เสร็จแล้ว" },
emptyBase: { en: "The pitch summary assembles itself from your first two steps — nothing to fill in here.", th: "หน้าสรุปนำเสนอจะรวบรวมข้อมูลจากสองขั้นตอนแรกให้อัตโนมัติ — ไม่ต้องกรอกอะไรที่นี่" },
emptyBoth: { en: " Start with your business model, then run the numbers.", th: " เริ่มจากโมเดลธุรกิจ แล้วค่อยคำนวณตัวเลข" },
emptyIdea: { en: " Your numbers are in — describe the business model and this page writes itself.", th: " ตัวเลขของคุณพร้อมแล้ว — อธิบายโมเดลธุรกิจแล้วหน้านี้จะเขียนให้เอง" },
emptyFin: { en: " Your concept is in — run the numbers and this page writes itself.", th: " แนวคิดของคุณพร้อมแล้ว — คำนวณตัวเลขแล้วหน้านี้จะเขียนให้เอง" },
goToIdea: { en: "Go to Business Model →", th: "ไปที่โมเดลธุรกิจ →" },
goToFin: { en: "Go to Financial Feasibility →", th: "ไปที่ความเป็นไปได้ทางการเงิน →" },
untitledConcept: { en: "Untitled concept", th: "แนวคิดยังไม่มีชื่อ" },
investmentVerdict: { en: "Investment verdict", th: "ผลประเมินการลงทุน" },
fromAfterTaxMargin: { en: "from the after-tax margin", th: "จากมาร์จิ้นหลังภาษี" },
theAsk: { en: "The ask", th: "สิ่งที่ขอ" },
totalToOpen: { en: "Total to open", th: "รวมค่าใช้จ่ายเปิดร้าน" },
oneTimeInvestment: { en: "one-time investment", th: "เงินลงทุนครั้งเดียว" },
profitMoAfterTax: { en: "Profit / mo (after tax)", th: "กำไร/เดือน (หลังภาษี)" },
preTax: { en: "pre-tax {x}", th: "ก่อนภาษี {x}" },
netMargin: { en: "Net margin", th: "มาร์จิ้นสุทธิ" },
afterTax: { en: "after tax", th: "หลังภาษี" },
breakEvenSales: { en: "Break-even sales", th: "ยอดขายจุดคุ้มทุน" },
perDayShort: { en: "≈ ฿{x}/day", th: "≈ ฿{x}/วัน" },
payback: { en: "Payback", th: "ระยะคืนทุน" },
theConcept: { en: "The concept", th: "แนวคิด" },
builtFor: { en: "Built for {who}", th: "สร้างขึ้นสำหรับ{who}" },
inSetting: { en: " in a {loc} setting", th: " ในทำเลแบบ{loc}" },
atPrices: { en: ", at {band} prices ({range})", th: " ในระดับราคา{band} ({range})" },
theFormat: { en: "The format: {seatsPart}{sqmPart}{svc} — {dine}% dine-in, {del}% delivery, {take}% takeaway.", th: "รูปแบบร้าน: {seatsPart}{sqmPart}{svc} — นั่งทาน {dine}%, เดลิเวอรี่ {del}%, ซื้อกลับ {take}%" },
seatsCount: { en: "{n} seats", th: "{n} ที่นั่ง" },
noSeating: { en: "no seating", th: "ไม่มีที่นั่ง" },
onSqm: { en: " on {n} m²", th: " พื้นที่ {n} ตร.ม." },
theDifferentiator: { en: "The differentiator", th: "จุดต่าง" },
theNumbersMonthly: { en: "The numbers, monthly", th: "ตัวเลขรายเดือน" },
seeFullFinancials: { en: "See full financials →", th: "ดูรายละเอียดการเงินทั้งหมด →" },
sales: { en: "Sales", th: "ยอดขาย" },
grossShownNet: { en: "฿{x} gross · shown net of 7% VAT", th: "฿{x} ก่อนหัก · แสดงหลังหัก VAT 7%" },
totalRevenue: { en: "total revenue", th: "รายได้รวม" },
foodDrinkCost: { en: "Food & drink cost", th: "ต้นทุนอาหารและเครื่องดื่ม" },
ofSales: { en: "{pct} of sales", th: "{pct} ของยอดขาย" },
fixedOperatingCosts: { en: "Fixed operating costs", th: "ต้นทุนดำเนินงานคงที่" },
fixedOperatingSub: { en: "staff, rent, utilities, marketing, systems, other", th: "ค่าแรง ค่าเช่า สาธารณูปโภค การตลาด ระบบ อื่นๆ" },
taxesStatutoryEst: { en: "Taxes & statutory (est.)", th: "ภาษีและเงินสมทบ (ประมาณ)" },
taxesSetAside: { en: "your monthly tax set-aside", th: "เงินภาษีที่กันไว้ต่อเดือน" },
netProfitAfterTax: { en: "Net profit after tax", th: "กำไรสุทธิหลังภาษี" },
marginLabel: { en: "{pct} margin", th: "มาร์จิ้น {pct}" },
ebitdaPreTax: { en: "EBITDA (pre-tax)", th: "EBITDA (ก่อนภาษี)" },
capexBuildSystems: { en: "CapEx — build & systems", th: "เงินลงทุน — ก่อสร้างและระบบ" },
capexSub: { en: "renovation, equipment, furniture, licences", th: "รีโนเวท อุปกรณ์ เฟอร์นิเจอร์ ใบอนุญาต" },
depositsStockReserve: { en: "Deposits, stock & reserve", th: "มัดจำ สต๊อก และเงินสำรอง" },
totalCapitalRequired: { en: "Total capital required", th: "เงินทุนรวมที่ต้องใช้" },
whatToWatch: { en: "What to watch", th: "สิ่งที่ควรจับตา" },
whatToWatchDesc: { en: "An honest plan names its own risks — these come from the reality check in step 01.", th: "แผนที่ซื่อตรงต้องระบุความเสี่ยงของตัวเอง — รายการนี้มาจากการตรวจสอบความเป็นจริงในขั้นตอนที่ 01" },
noFlags: { en: "No open flags — the concept, price, rent expectation and capital hold together at these numbers.", th: "ไม่มีข้อสังเกต — แนวคิด ราคา ค่าเช่าที่คาดไว้ และเงินทุนสอดคล้องกันดีที่ตัวเลขนี้" },
testFirst: { en: "Test first", th: "ทดสอบก่อน" },
disclaimer: { en: "All figures are the owner's planning estimates, not audited numbers. Tax lines follow Thai VAT and SME corporate-tax rules — confirm with a Thai accountant.", th: "ตัวเลขทั้งหมดเป็นค่าประมาณการของเจ้าของ ไม่ใช่ตัวเลขที่ผ่านการตรวจสอบบัญชี รายการภาษีอ้างอิงกฎ VAT และภาษีนิติบุคคล SME ของไทย — ควรตรวจสอบกับนักบัญชีอีกครั้ง" },
exportPlan: { en: "Export plan (JSON)", th: "ส่งออกแผน (JSON)" },
printPdf: { en: "Print / Save as PDF", th: "พิมพ์ / บันทึกเป็น PDF" },
},
};
const OPT = {
"QSR": "ร้านอาหารบริการด่วน", "Café": "คาเฟ่", "Casual dining": "แคชชวลไดนิ่ง", "Fine dining": "ไฟน์ไดนิ่ง",
"Bar": "บาร์", "Cloud kitchen": "คลาวด์คิทเช่น", "Bakery": "เบเกอรี่", "Buffet": "บุฟเฟ่ต์",
"Thai": "ไทย", "Isaan": "อีสาน", "Japanese": "ญี่ปุ่น", "Ramen": "ราเมง", "Sushi": "ซูชิ",
"Korean": "เกาหลี", "Chinese": "จีน", "Italian": "อิตาเลียน", "Pizza": "พิซซ่า", "Western": "ตะวันตก",
"Seafood": "ซีฟู้ด", "Fusion": "ฟิวชั่น", "Vegan": "วีแกน",
"Students": "นักเรียน/นักศึกษา", "Office workers": "พนักงานออฟฟิศ", "Families": "ครอบครัว",
"Tourists": "นักท่องเที่ยว", "Expats": "ชาวต่างชาติ", "Hi-so": "ไฮโซ",
"Shopping mall": "ห้างสรรพสินค้า", "Street / shophouse": "ริมถนน/ตึกแถว", "Community mall": "คอมมูนิตี้มอลล์",
"CBD office": "ย่านธุรกิจ", "Tourist zone": "แหล่งท่องเที่ยว", "Campus": "ใกล้มหาวิทยาลัย",
"Counter service": "บริการหน้าเคาน์เตอร์", "Table service": "เสิร์ฟที่โต๊ะ", "Self service": "บริการตัวเอง", "Delivery only": "เดลิเวอรี่อย่างเดียว",
"First-timer": "มือใหม่", "Worked in F&B": "เคยทำงานร้านอาหาร", "Opened before": "เคยเปิดร้านมาก่อน",
"Owner-operator": "เจ้าของที่บริหารเอง", "Investor": "นักลงทุน",
"Few": "น้อย", "Some": "ปานกลาง", "Many": "เยอะ",
"Budget": "ประหยัด", "Mid": "ปานกลาง", "Premium": "พรีเมียม", "Luxury": "หรูหรา",
};
const HEARD_TH = {
"Category": "ประเภทร้าน", "Cuisine": "ประเภทอาหาร", "Name": "ชื่อร้าน", "Tagline": "แท็กไลน์",
"Target customer": "กลุ่มลูกค้าเป้าหมาย", "Price band": "ระดับราคา", "Channel mix": "สัดส่วนช่องทาง",
"Seats": "ที่นั่ง", "Size": "ขนาด", "Service": "การบริการ", "Location type": "ประเภททำเล",
"Your edge": "จุดเด่น", "Experience": "ประสบการณ์", "Capital": "เงินทุน", "Involvement": "บทบาท",
};
function optLabel(lang, v) {
if (lang !== "th") return v;
return OPT[v] || v;
}
function heardLabel(lang, k) {
if (lang !== "th") return k;
return HEARD_TH[k] || k;
}
const LangContext = React.createContext(null);
function useLang() {
return React.useContext(LangContext);
}
function LanguageProvider({ children }) {
const [lang, setLangState] = React.useState(() => {
try { return localStorage.getItem(LANG_KEY) || "th"; } catch (e) { return "th"; }
});
const setLang = React.useCallback((l) => {
setLangState(l);
try { localStorage.setItem(LANG_KEY, l); } catch (e) {}
}, []);
const t = React.useCallback((path, vars) => {
const parts = path.split(".");
let node = T;
for (const p of parts) node = node && node[p];
let str = node ? (node[lang] || node.en || path) : path;
if (vars) {
for (const k in vars) str = str.split("{" + k + "}").join(vars[k]);
}
return str;
}, [lang]);
const value = React.useMemo(() => ({ lang, setLang, t }), [lang, setLang, t]);
return