${cardHead(2, t.h_step2, t.step2)}
@@ -263,9 +258,8 @@ const nHotels = PL.places.filter((x) => x.category === 'hotel').length;
// ---------- 이벤트 ----------
document.addEventListener('click', (e) => {
- const el = (e.target as HTMLElement).closest('[data-action],[data-lang]');
+ const el = (e.target as HTMLElement).closest('[data-action]');
if (!el) return;
- if (el.dataset.lang) { e.preventDefault(); const target = el.dataset.lang as Lang; if (target !== state.lang) { location.href = `${pageUrl(target)}#${encodeHash({ p: state.proc || undefined, d: state.date || undefined, l: target, n: state.nat || undefined, pref: state.prefs })}`; } return; }
const a = el.dataset.action;
if (a === 'proc') { state.proc = el.dataset.id!; render(); if (state.date) document.getElementById('result')?.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
else if (a === 'pref') { const id = el.dataset.id!; state.prefs = state.prefs.includes(id) ? state.prefs.filter((x) => x !== id) : [...state.prefs, id]; render(); }
diff --git a/supporters/src/data/factSheetEn.json b/supporters/src/data/factSheetEn.json
new file mode 100644
index 0000000..826fcfd
--- /dev/null
+++ b/supporters/src/data/factSheetEn.json
@@ -0,0 +1,20 @@
+{
+ "_comment": "영어 페이지용 병원 사실 번역. 값의 원본은 factSheet.json 이고 여기에는 영어 표기만 둔다. 숫자·전화·URL 은 factSheet 에서 그대로 읽는다. 빈 값은 영어 페이지에서 '확인' 대신 항목을 숨긴다.",
+ "name": "View Plastic Surgery Clinic",
+ "shortName": "View Plastic Surgery",
+ "kind": "plastic surgery clinic",
+ "areaLabel": "Sinnonhyeon Station, Gangnam, Seoul",
+ "address": {
+ "full": "107 Bongeunsa-ro, Gangnam-gu, Seoul (View Plastic Surgery Building)",
+ "mapQuery": "View Plastic Surgery Seoul Bongeunsa-ro 107"
+ },
+ "transit": "Line 9, Sinnonhyeon Station, Exit 3. Within 50 m of the exit. The whole building is the clinic, so you can see it from the exit.",
+ "airport": "From Incheon Airport: take the AREX airport railroad to Gimpo Airport Station, then Line 9 express to Sinnonhyeon Station with no transfer. About 60 to 70 minutes. A taxi takes 60 to 90 minutes depending on traffic.",
+ "parking": "The street in front of the main entrance is one-way. Enter from the pharmacy alley and turn right at the crossroads. The car park is on the left.",
+ "hoursDays": { "월·화·수·목": "Mon to Thu", "금": "Fri", "토": "Sat", "일·공휴일": "Sun and public holidays" },
+ "hoursClosed": "Closed",
+ "building": "19-storey clinic building (B4 to 15F). Consultation 4F to 5F, examination B1, surgery 11F to 14F, inpatient wards 8F and 10F, dental clinic 15F.",
+ "arrival": "Go to the information desk on the 1st floor first. Consultation is on 4F to 5F, VIP consultation on 3F, and pre-operative tests at the B1 examination center.",
+ "specialties": ["Breast augmentation", "Facial contouring", "Jaw surgery", "Eyelid surgery", "Rhinoplasty", "Liposuction and fat grafting", "Anti-aging and lifting", "Men's plastic surgery", "Dermatology", "Hair transplant"],
+ "languageNote": "Consultation is available in Korean. Ask the clinic about interpreter support when you book."
+}
diff --git a/supporters/src/data/planStrings.json b/supporters/src/data/planStrings.json
index 67e5a4d..6a4207c 100644
--- a/supporters/src/data/planStrings.json
+++ b/supporters/src/data/planStrings.json
@@ -4,7 +4,7 @@
"eyebrow": "Recovery Planner",
"title": "수술일을 정하셨다면, 여행 일정은 여기서 짜세요.",
"lede": "시술과 수술일을 고르면 입국 권장일, 출국 가능 최소일, 회복기 동안 외출할 수 있는 날과 그날 갈 만한 곳을 정리해 드립니다. 계산은 이 화면 안에서만 이루어지고 어디에도 저장되지 않습니다.",
- "step1": "언어와 국적",
+ "step1": "국적",
"step2": "시술과 수술일",
"step3": "여유 시간에 하고 싶은 것",
"step4": "일정표",
@@ -76,7 +76,7 @@
"provisionalNote": "\"병원 확인 전\"으로 표시된 값은 병원 공개 안내에 없어 일반 기준으로 넣은 잠정값입니다. 상담에서 본인 일정으로 확정하세요.",
"noRemoval": "제거 방문 없음",
"h_hero": "Plan Your Recovery Stay",
- "h_step1": "Language & Nationality",
+ "h_step1": "Nationality",
"h_step2": "Procedure & Surgery Date",
"h_step3": "Your Free Time",
"h_step4": "Your Schedule",
@@ -104,7 +104,8 @@
"empty_title": "시술과 수술일을 고르면 여기에 일정표가 나옵니다",
"empty_sub": "수술일은 예상일이어도 됩니다.",
"stickyView": "일정표 보기",
- "stickyStay": "{a} → {b} · {n}박"
+ "stickyStay": "{a} → {b} · {n}박",
+ "h_step1_hint": "국적을 고르면 시차와 무비자 체류 한도를 함께 봅니다."
},
"en": {
"eyebrow": "Recovery Planner",
@@ -182,7 +183,7 @@
"provisionalNote": "Values marked \"Provisional\" are not in the clinic's published guidance and use general estimates. Confirm your own dates at consultation.",
"noRemoval": "No removal visit",
"h_hero": "Plan Your Recovery Stay",
- "h_step1": "Language & Nationality",
+ "h_step1": "Nationality",
"h_step2": "Procedure & Surgery Date",
"h_step3": "Your Free Time",
"h_step4": "Your Schedule",
@@ -210,6 +211,7 @@
"empty_title": "Pick a procedure and a surgery date to see your schedule here",
"empty_sub": "An estimated date is fine.",
"stickyView": "See schedule",
- "stickyStay": "{a} → {b} · {n} nights"
+ "stickyStay": "{a} → {b} · {n} nights",
+ "h_step1_hint": "Your nationality sets the jet-lag buffer and the visa-free stay check."
}
}
diff --git a/supporters/src/layouts/Base.astro b/supporters/src/layouts/Base.astro
index 15b26f7..0add854 100644
--- a/supporters/src/layouts/Base.astro
+++ b/supporters/src/layouts/Base.astro
@@ -1,6 +1,8 @@
---
import '../styles/global.css';
import { SITE_NAME, SITE_TAGLINE, INDEXABLE, fact, site as S, surface, reservationUrl, editor, has, v } from '../lib';
+import { UI, switchHref } from '../lib/i18n';
+import EN from '../data/factSheetEn.json';
const ed = editor();
const f = fact as Record;
@@ -18,6 +20,12 @@ const { title, description, jsonLd, ogImage = S.buildingImage?.src || '/favicon.
const site = Astro.site?.toString().replace(/\/$/, '') ?? '';
const cleanPath = Astro.url.pathname.replace(/\/index\.html$/, '/').replace(/\.html$/, '');
const canonical = (new URL(cleanPath, Astro.site).toString().replace(/\/$/, '') || site);
+const u = UI[lang];
+const other = lang === 'ko' ? 'en' : 'ko';
+const switchTo = switchHref(Astro.url.pathname, other);
+const clinicName = lang === 'en' ? EN.shortName : v(f.shortName, '병원');
+const homeHref = lang === 'en' ? '/en' : '/';
+const isHome = ['/', '', '/index.html', '/index', '/en', '/en/index.html', '/en/index'].includes(Astro.url.pathname.replace(/\/$/, '') || '/');
const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array.isArray(jsonLd) ? { '@graph': jsonLd } : jsonLd) }) : null;
---
@@ -44,32 +52,44 @@ const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array
{ld && }
- {!INDEXABLE &&