diff --git a/supporters/src/layouts/Base.astro b/supporters/src/layouts/Base.astro
index 76a3c1f..8573265 100644
--- a/supporters/src/layouts/Base.astro
+++ b/supporters/src/layouts/Base.astro
@@ -19,6 +19,10 @@ interface Props {
}
// 공유 미리보기 기본 이미지: 워커 build 단계가 만드는 public/og.jpg(1200x630, scripts/make_share_assets.py). 없으면 건물 사진.
const shareCard = existsSync('public/og.jpg');
+// 공유 카드(og·twitter)는 해외 환자용으로 영어로 낸다(haewon 2026-09-15). site.json shareNameEn(병원 공식 영문 표기)이 있을 때만.
+// 글(article)은 본문이 한국어라 제목·설명은 글 그대로 두고 사이트 이름만 영어로 쓴다. 영문 페이지는 자기 영어 제목을 쓴다.
+//
·meta description 은 페이지 언어 그대로 둔다. 검색 결과에 나가는 값이라 공유 카드와 역할이 다르다.
+const nameEn: string = String((S as Record).shareNameEn || '').trim();
const { title, description, jsonLd, ogImage = shareCard ? '/og.jpg' : (S.buildingImage?.src || '/favicon-512.png'), type = 'website', noindex = false, lang = 'ko', alternates = [] } = Astro.props;
const site = Astro.site?.toString().replace(/\/$/, '') ?? '';
const cleanPath = Astro.url.pathname.replace(/\/index\.html$/, '/').replace(/\.html$/, '');
@@ -40,6 +44,16 @@ const sideEffectEn: string = (f as Record).sideEffectNoticeEn || ''
const noticePending = lang === 'en' && !sponsorEn;
const sponsorText = (lang === 'en' && sponsorEn) ? sponsorEn : UI.ko.foot_sponsor.replace(/\{clinic\}/g, v(f.shortName, '병원')).replace('{editor}', ed.name);
const sideEffectText = (lang === 'en' && sideEffectEn) ? sideEffectEn : fact.sideEffectNotice;
+const siteCard = nameEn ? `${nameEn} Supporters` : SITE_NAME;
+const cardEn = !!nameEn && type !== 'article' && (lang === 'ko' || isHome);
+// 영문 페이지 제목·설명에 섞인 한국어 상호는 공유 카드에서만 영문 표기로 바꾼다.
+const koName = String(f.shortName || '').trim();
+const toEn = (t: string) => (nameEn && koName && lang === 'en' ? t.split(koName).join(nameEn) : t);
+const ogTitle = cardEn ? `${siteCard} · Answers to the questions patients ask first` : toEn(title);
+const ogDesc = cardEn
+ ? `Recovery planner, getting here, and clinic facts for international patients of ${nameEn}, based on the doctors' own videos and the clinic's public information.`
+ : toEn(description);
+const ogLocale = cardEn || lang === 'en' ? 'en_US' : 'ko_KR';
const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array.isArray(jsonLd) ? { '@graph': jsonLd } : jsonLd) }) : null;
---
@@ -52,9 +66,9 @@ const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array
{(!INDEXABLE || noindex) && }
-
-
-
+
+
+
{ogImage === '/og.jpg' && }
@@ -64,7 +78,8 @@ const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array
-
+
+ {ogImage === '/og.jpg' && }
{alternates.map((a) => )}
diff --git a/templates/supporters-astro/src/layouts/Base.astro b/templates/supporters-astro/src/layouts/Base.astro
index 76a3c1f..8573265 100644
--- a/templates/supporters-astro/src/layouts/Base.astro
+++ b/templates/supporters-astro/src/layouts/Base.astro
@@ -19,6 +19,10 @@ interface Props {
}
// 공유 미리보기 기본 이미지: 워커 build 단계가 만드는 public/og.jpg(1200x630, scripts/make_share_assets.py). 없으면 건물 사진.
const shareCard = existsSync('public/og.jpg');
+// 공유 카드(og·twitter)는 해외 환자용으로 영어로 낸다(haewon 2026-09-15). site.json shareNameEn(병원 공식 영문 표기)이 있을 때만.
+// 글(article)은 본문이 한국어라 제목·설명은 글 그대로 두고 사이트 이름만 영어로 쓴다. 영문 페이지는 자기 영어 제목을 쓴다.
+// ·meta description 은 페이지 언어 그대로 둔다. 검색 결과에 나가는 값이라 공유 카드와 역할이 다르다.
+const nameEn: string = String((S as Record).shareNameEn || '').trim();
const { title, description, jsonLd, ogImage = shareCard ? '/og.jpg' : (S.buildingImage?.src || '/favicon-512.png'), type = 'website', noindex = false, lang = 'ko', alternates = [] } = Astro.props;
const site = Astro.site?.toString().replace(/\/$/, '') ?? '';
const cleanPath = Astro.url.pathname.replace(/\/index\.html$/, '/').replace(/\.html$/, '');
@@ -40,6 +44,16 @@ const sideEffectEn: string = (f as Record).sideEffectNoticeEn || ''
const noticePending = lang === 'en' && !sponsorEn;
const sponsorText = (lang === 'en' && sponsorEn) ? sponsorEn : UI.ko.foot_sponsor.replace(/\{clinic\}/g, v(f.shortName, '병원')).replace('{editor}', ed.name);
const sideEffectText = (lang === 'en' && sideEffectEn) ? sideEffectEn : fact.sideEffectNotice;
+const siteCard = nameEn ? `${nameEn} Supporters` : SITE_NAME;
+const cardEn = !!nameEn && type !== 'article' && (lang === 'ko' || isHome);
+// 영문 페이지 제목·설명에 섞인 한국어 상호는 공유 카드에서만 영문 표기로 바꾼다.
+const koName = String(f.shortName || '').trim();
+const toEn = (t: string) => (nameEn && koName && lang === 'en' ? t.split(koName).join(nameEn) : t);
+const ogTitle = cardEn ? `${siteCard} · Answers to the questions patients ask first` : toEn(title);
+const ogDesc = cardEn
+ ? `Recovery planner, getting here, and clinic facts for international patients of ${nameEn}, based on the doctors' own videos and the clinic's public information.`
+ : toEn(description);
+const ogLocale = cardEn || lang === 'en' ? 'en_US' : 'ko_KR';
const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array.isArray(jsonLd) ? { '@graph': jsonLd } : jsonLd) }) : null;
---
@@ -52,9 +66,9 @@ const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array
{(!INDEXABLE || noindex) && }
-
-
-
+
+
+
{ogImage === '/og.jpg' && }
@@ -64,7 +78,8 @@ const ld = jsonLd ? JSON.stringify({ '@context': 'https://schema.org', ...(Array
-
+
+ {ogImage === '/og.jpg' && }
{alternates.map((a) => )}