From 15bf29405f8e60910a108b5090f7ec7f0ad86a42 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 8 May 2026 07:35:29 +0000
Subject: [PATCH 1/4] Initial plan
From 0ccde3aaff5f6157d68741db022fe23e6bf12c4f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 8 May 2026 07:39:00 +0000
Subject: [PATCH 2/4] feat: add Blog text link to footer Community section
Agent-Logs-Url: https://github.com/microsoft/aspire.dev/sessions/58542868-76bc-4e46-ab5f-dac94756c185
Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com>
---
src/frontend/src/components/FooterLinks.astro | 6 ++++++
src/frontend/src/content/i18n/da.json | 1 +
src/frontend/src/content/i18n/de.json | 1 +
src/frontend/src/content/i18n/en.json | 1 +
src/frontend/src/content/i18n/es.json | 1 +
src/frontend/src/content/i18n/fr.json | 1 +
src/frontend/src/content/i18n/hi.json | 1 +
src/frontend/src/content/i18n/id.json | 1 +
src/frontend/src/content/i18n/it.json | 1 +
src/frontend/src/content/i18n/ja.json | 1 +
src/frontend/src/content/i18n/ko.json | 1 +
src/frontend/src/content/i18n/pt-BR.json | 1 +
src/frontend/src/content/i18n/ru.json | 1 +
src/frontend/src/content/i18n/tr.json | 1 +
src/frontend/src/content/i18n/uk.json | 1 +
src/frontend/src/content/i18n/zh-CN.json | 1 +
16 files changed, 21 insertions(+)
diff --git a/src/frontend/src/components/FooterLinks.astro b/src/frontend/src/components/FooterLinks.astro
index 279596495..5d5bc3ce8 100644
--- a/src/frontend/src/components/FooterLinks.astro
+++ b/src/frontend/src/components/FooterLinks.astro
@@ -49,6 +49,12 @@ const is404 =
{Astro.locals.t('footer.watch' as any)}
+
+
+
+ {Astro.locals.t('footer.blog' as any)}
+
+
)
diff --git a/src/frontend/src/content/i18n/da.json b/src/frontend/src/content/i18n/da.json
index 355708bc8..bb2585830 100644
--- a/src/frontend/src/content/i18n/da.json
+++ b/src/frontend/src/content/i18n/da.json
@@ -65,6 +65,7 @@
"community": "Fællesskab",
"discuss": "Diskutér",
"watch": "Se",
+ "blog": "Blog",
"privacy": "Privatliv",
"resources": "Ressourcer",
"legal": "Juridisk",
diff --git a/src/frontend/src/content/i18n/de.json b/src/frontend/src/content/i18n/de.json
index 368671206..1f931f921 100644
--- a/src/frontend/src/content/i18n/de.json
+++ b/src/frontend/src/content/i18n/de.json
@@ -65,6 +65,7 @@
"community": "Community",
"discuss": "Diskutieren",
"watch": "Ansehen",
+ "blog": "Blog",
"privacy": "Datenschutz",
"resources": "Ressourcen",
"legal": "Rechtliches",
diff --git a/src/frontend/src/content/i18n/en.json b/src/frontend/src/content/i18n/en.json
index 2da9c6e43..df31539b5 100644
--- a/src/frontend/src/content/i18n/en.json
+++ b/src/frontend/src/content/i18n/en.json
@@ -65,6 +65,7 @@
"community": "Community",
"discuss": "Discuss",
"watch": "Watch",
+ "blog": "Blog",
"privacy": "Privacy",
"resources": "Resources",
"legal": "Legal",
diff --git a/src/frontend/src/content/i18n/es.json b/src/frontend/src/content/i18n/es.json
index 6d7c66f8d..5332fcea2 100644
--- a/src/frontend/src/content/i18n/es.json
+++ b/src/frontend/src/content/i18n/es.json
@@ -65,6 +65,7 @@
"community": "Comunidad",
"discuss": "Debatir",
"watch": "Ver bajo demanda",
+ "blog": "Blog",
"privacy": "Privacidad",
"resources": "Recursos",
"legal": "Legal",
diff --git a/src/frontend/src/content/i18n/fr.json b/src/frontend/src/content/i18n/fr.json
index 2e3a7d522..a049e870b 100644
--- a/src/frontend/src/content/i18n/fr.json
+++ b/src/frontend/src/content/i18n/fr.json
@@ -65,6 +65,7 @@
"community": "Communauté",
"discuss": "Discuter",
"watch": "Regarder",
+ "blog": "Blog",
"privacy": "Confidentialité",
"resources": "Ressources",
"legal": "Mentions légales",
diff --git a/src/frontend/src/content/i18n/hi.json b/src/frontend/src/content/i18n/hi.json
index e87db7256..52cc877bb 100644
--- a/src/frontend/src/content/i18n/hi.json
+++ b/src/frontend/src/content/i18n/hi.json
@@ -65,6 +65,7 @@
"community": "समुदाय",
"discuss": "चर्चा",
"watch": "देखें",
+ "blog": "ब्लॉग",
"privacy": "गोपनीयता",
"resources": "संसाधन",
"legal": "कानूनी",
diff --git a/src/frontend/src/content/i18n/id.json b/src/frontend/src/content/i18n/id.json
index 0b8028632..a0b3a957c 100644
--- a/src/frontend/src/content/i18n/id.json
+++ b/src/frontend/src/content/i18n/id.json
@@ -65,6 +65,7 @@
"community": "Komunitas",
"discuss": "Diskusi",
"watch": "Tonton",
+ "blog": "Blog",
"privacy": "Privasi",
"resources": "Sumber Daya",
"legal": "Hukum",
diff --git a/src/frontend/src/content/i18n/it.json b/src/frontend/src/content/i18n/it.json
index 48bace028..6f61bd64b 100644
--- a/src/frontend/src/content/i18n/it.json
+++ b/src/frontend/src/content/i18n/it.json
@@ -65,6 +65,7 @@
"community": "Community",
"discuss": "Discute",
"watch": "Guarda",
+ "blog": "Blog",
"privacy": "Privacy",
"resources": "Risorse",
"legal": "Legale",
diff --git a/src/frontend/src/content/i18n/ja.json b/src/frontend/src/content/i18n/ja.json
index 9d3dfad8e..cb6ad6a0c 100644
--- a/src/frontend/src/content/i18n/ja.json
+++ b/src/frontend/src/content/i18n/ja.json
@@ -65,6 +65,7 @@
"community": "コミュニティ",
"discuss": "ディスカッション",
"watch": "視聴",
+ "blog": "ブログ",
"privacy": "プライバシー",
"resources": "リソース",
"legal": "法的情報",
diff --git a/src/frontend/src/content/i18n/ko.json b/src/frontend/src/content/i18n/ko.json
index 4679e76c1..239419ff6 100644
--- a/src/frontend/src/content/i18n/ko.json
+++ b/src/frontend/src/content/i18n/ko.json
@@ -65,6 +65,7 @@
"community": "커뮤니티",
"discuss": "토론",
"watch": "보기",
+ "blog": "블로그",
"privacy": "개인정보",
"resources": "리소스",
"legal": "법적 고지",
diff --git a/src/frontend/src/content/i18n/pt-BR.json b/src/frontend/src/content/i18n/pt-BR.json
index 3af7b2bd7..b327d6993 100644
--- a/src/frontend/src/content/i18n/pt-BR.json
+++ b/src/frontend/src/content/i18n/pt-BR.json
@@ -65,6 +65,7 @@
"community": "Comunidade",
"discuss": "Discutir",
"watch": "Assistir",
+ "blog": "Blog",
"privacy": "Privacidade",
"resources": "Recursos",
"legal": "Legal",
diff --git a/src/frontend/src/content/i18n/ru.json b/src/frontend/src/content/i18n/ru.json
index d5551d27a..652038b07 100644
--- a/src/frontend/src/content/i18n/ru.json
+++ b/src/frontend/src/content/i18n/ru.json
@@ -65,6 +65,7 @@
"community": "Сообщество",
"discuss": "Обсуждать",
"watch": "Смотреть",
+ "blog": "Блог",
"privacy": "Конфиденциальность",
"resources": "Ресурсы",
"legal": "Правовая информация",
diff --git a/src/frontend/src/content/i18n/tr.json b/src/frontend/src/content/i18n/tr.json
index 9c68fe72e..b70c72a0e 100644
--- a/src/frontend/src/content/i18n/tr.json
+++ b/src/frontend/src/content/i18n/tr.json
@@ -65,6 +65,7 @@
"community": "Topluluk",
"discuss": "Tartış",
"watch": "İzle",
+ "blog": "Blog",
"privacy": "Gizlilik",
"resources": "Kaynaklar",
"legal": "Yasal",
diff --git a/src/frontend/src/content/i18n/uk.json b/src/frontend/src/content/i18n/uk.json
index 68ce9566c..2cb79b77e 100644
--- a/src/frontend/src/content/i18n/uk.json
+++ b/src/frontend/src/content/i18n/uk.json
@@ -65,6 +65,7 @@
"community": "Спільнота",
"discuss": "Обговорити",
"watch": "Переглянути",
+ "blog": "Блог",
"privacy": "Приватність",
"resources": "Ресурси",
"legal": "Правова інформація",
diff --git a/src/frontend/src/content/i18n/zh-CN.json b/src/frontend/src/content/i18n/zh-CN.json
index f90538e50..32311c309 100644
--- a/src/frontend/src/content/i18n/zh-CN.json
+++ b/src/frontend/src/content/i18n/zh-CN.json
@@ -65,6 +65,7 @@
"community": "社区",
"discuss": "讨论",
"watch": "观看",
+ "blog": "博客",
"privacy": "隐私",
"resources": "资源",
"legal": "法律信息",
From 5ec34c60dda8344f1fb173b3a923fcc8c0c92f75 Mon Sep 17 00:00:00 2001
From: David Pine
Date: Fri, 8 May 2026 10:55:27 -0500
Subject: [PATCH 3/4] Update footer community link labels
Use recognizable platform names for footer Community links, include BlueSky and Twitch alongside the existing social destinations, and remove the unused action-label locale entries.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
src/frontend/src/components/FooterLinks.astro | 73 ++++++++-----------
src/frontend/src/content/i18n/da.json | 3 -
src/frontend/src/content/i18n/de.json | 3 -
src/frontend/src/content/i18n/en.json | 3 -
src/frontend/src/content/i18n/es.json | 3 -
src/frontend/src/content/i18n/fr.json | 3 -
src/frontend/src/content/i18n/hi.json | 3 -
src/frontend/src/content/i18n/id.json | 3 -
src/frontend/src/content/i18n/it.json | 3 -
src/frontend/src/content/i18n/ja.json | 3 -
src/frontend/src/content/i18n/ko.json | 3 -
src/frontend/src/content/i18n/pt-BR.json | 3 -
src/frontend/src/content/i18n/ru.json | 3 -
src/frontend/src/content/i18n/tr.json | 3 -
src/frontend/src/content/i18n/uk.json | 3 -
src/frontend/src/content/i18n/zh-CN.json | 3 -
.../unit/custom-components.vitest.test.ts | 38 ++++++++++
17 files changed, 70 insertions(+), 86 deletions(-)
diff --git a/src/frontend/src/components/FooterLinks.astro b/src/frontend/src/components/FooterLinks.astro
index 5d5bc3ce8..a1e087bea 100644
--- a/src/frontend/src/components/FooterLinks.astro
+++ b/src/frontend/src/components/FooterLinks.astro
@@ -1,10 +1,33 @@
---
import { Icon } from '@astrojs/starlight/components';
-import config from 'virtual:starlight/user-config';
+import { socialConfig } from '../../config/socials.config';
+
+type CommunityLink = {
+ icon: (typeof socialConfig)[number]['icon'] | 'reddit';
+ label: string;
+ href: string;
+};
+
+const getSocialLink = (label: string, displayLabel = label): CommunityLink | null => {
+ const link = socialConfig.find((social) => social.label === label);
+ return link ? { icon: link.icon, label: displayLabel, href: link.href } : null;
+};
+
+const communityLinks = [
+ getSocialLink('X', 'X (Twitter)'),
+ getSocialLink('BlueSky'),
+ getSocialLink('GitHub'),
+ getSocialLink('Discord'),
+ {
+ icon: 'reddit',
+ label: 'Reddit',
+ href: 'https://www.reddit.com/r/aspiredotdev',
+ },
+ getSocialLink('YouTube'),
+ getSocialLink('Twitch'),
+ getSocialLink('Blog', Astro.locals.t('footer.blog' as any)),
+].filter((link): link is CommunityLink => link !== null);
-const links = config.social || [];
-const gitHubLink = links.find((link) => link.label === 'GitHub')?.href ?? null;
-const discordLink = links.find((link) => link.label === 'Discord')?.href ?? null;
const is404 =
Astro.locals.starlightRoute?.entry?.slug === '404' ||
/^\/(?:[^/]+\/)?404\/?$/.test(Astro.url.pathname);
@@ -15,46 +38,14 @@ const is404 =
)
diff --git a/src/frontend/src/content/i18n/da.json b/src/frontend/src/content/i18n/da.json
index bb2585830..d124ea96f 100644
--- a/src/frontend/src/content/i18n/da.json
+++ b/src/frontend/src/content/i18n/da.json
@@ -61,10 +61,7 @@
"madeWithLove": "Lavet med 💜 hos Microsoft",
"opensInNewTab": "åbner i ny fane",
"ask": "Spørg & svar",
- "collab": "Samarbejd",
"community": "Fællesskab",
- "discuss": "Diskutér",
- "watch": "Se",
"blog": "Blog",
"privacy": "Privatliv",
"resources": "Ressourcer",
diff --git a/src/frontend/src/content/i18n/de.json b/src/frontend/src/content/i18n/de.json
index 1f931f921..97e84c62a 100644
--- a/src/frontend/src/content/i18n/de.json
+++ b/src/frontend/src/content/i18n/de.json
@@ -61,10 +61,7 @@
"madeWithLove": "Mit 💜 bei Microsoft erstellt",
"opensInNewTab": "öffnet in neuem Tab",
"ask": "Fragen & Antworten",
- "collab": "Zusammenarbeiten",
"community": "Community",
- "discuss": "Diskutieren",
- "watch": "Ansehen",
"blog": "Blog",
"privacy": "Datenschutz",
"resources": "Ressourcen",
diff --git a/src/frontend/src/content/i18n/en.json b/src/frontend/src/content/i18n/en.json
index df31539b5..434f88d39 100644
--- a/src/frontend/src/content/i18n/en.json
+++ b/src/frontend/src/content/i18n/en.json
@@ -61,10 +61,7 @@
"madeWithLove": "Made with 💜 at Microsoft",
"opensInNewTab": "opens in new tab",
"ask": "FAQ",
- "collab": "Collaborate",
"community": "Community",
- "discuss": "Discuss",
- "watch": "Watch",
"blog": "Blog",
"privacy": "Privacy",
"resources": "Resources",
diff --git a/src/frontend/src/content/i18n/es.json b/src/frontend/src/content/i18n/es.json
index 5332fcea2..d2c8441b4 100644
--- a/src/frontend/src/content/i18n/es.json
+++ b/src/frontend/src/content/i18n/es.json
@@ -61,10 +61,7 @@
"madeWithLove": "Hecho con 💜 en Microsoft",
"opensInNewTab": "se abre en una nueva pestaña",
"ask": "Preguntas y respuestas",
- "collab": "Colabora",
"community": "Comunidad",
- "discuss": "Debatir",
- "watch": "Ver bajo demanda",
"blog": "Blog",
"privacy": "Privacidad",
"resources": "Recursos",
diff --git a/src/frontend/src/content/i18n/fr.json b/src/frontend/src/content/i18n/fr.json
index a049e870b..71eccbef5 100644
--- a/src/frontend/src/content/i18n/fr.json
+++ b/src/frontend/src/content/i18n/fr.json
@@ -61,10 +61,7 @@
"madeWithLove": "Fait avec 💜 chez Microsoft",
"opensInNewTab": "ouvre dans un nouvel onglet",
"ask": "Questions & Réponses",
- "collab": "Collaborer",
"community": "Communauté",
- "discuss": "Discuter",
- "watch": "Regarder",
"blog": "Blog",
"privacy": "Confidentialité",
"resources": "Ressources",
diff --git a/src/frontend/src/content/i18n/hi.json b/src/frontend/src/content/i18n/hi.json
index 52cc877bb..2c8739d87 100644
--- a/src/frontend/src/content/i18n/hi.json
+++ b/src/frontend/src/content/i18n/hi.json
@@ -61,10 +61,7 @@
"madeWithLove": "Microsoft पर 💜 के साथ बनाया गया",
"opensInNewTab": "नए टैब में खुलता है",
"ask": "प्रश्न & उत्तर",
- "collab": "सहयोग करें",
"community": "समुदाय",
- "discuss": "चर्चा",
- "watch": "देखें",
"blog": "ब्लॉग",
"privacy": "गोपनीयता",
"resources": "संसाधन",
diff --git a/src/frontend/src/content/i18n/id.json b/src/frontend/src/content/i18n/id.json
index a0b3a957c..b9d831cd7 100644
--- a/src/frontend/src/content/i18n/id.json
+++ b/src/frontend/src/content/i18n/id.json
@@ -61,10 +61,7 @@
"madeWithLove": "Dibuat dengan 💜 di Microsoft",
"opensInNewTab": "membuka di tab baru",
"ask": "Tanya & Jawab",
- "collab": "Kolaborasi",
"community": "Komunitas",
- "discuss": "Diskusi",
- "watch": "Tonton",
"blog": "Blog",
"privacy": "Privasi",
"resources": "Sumber Daya",
diff --git a/src/frontend/src/content/i18n/it.json b/src/frontend/src/content/i18n/it.json
index 6f61bd64b..645aed450 100644
--- a/src/frontend/src/content/i18n/it.json
+++ b/src/frontend/src/content/i18n/it.json
@@ -61,10 +61,7 @@
"madeWithLove": "Creato con 💜 in Microsoft",
"opensInNewTab": "apre in una nuova scheda",
"ask": "Domande & Risposte",
- "collab": "Collabora",
"community": "Community",
- "discuss": "Discute",
- "watch": "Guarda",
"blog": "Blog",
"privacy": "Privacy",
"resources": "Risorse",
diff --git a/src/frontend/src/content/i18n/ja.json b/src/frontend/src/content/i18n/ja.json
index cb6ad6a0c..a3b135f0c 100644
--- a/src/frontend/src/content/i18n/ja.json
+++ b/src/frontend/src/content/i18n/ja.json
@@ -61,10 +61,7 @@
"madeWithLove": "Microsoft で 💜 を込めて制作",
"opensInNewTab": "新しいタブで開く",
"ask": "質問 & 回答",
- "collab": "コラボレーション",
"community": "コミュニティ",
- "discuss": "ディスカッション",
- "watch": "視聴",
"blog": "ブログ",
"privacy": "プライバシー",
"resources": "リソース",
diff --git a/src/frontend/src/content/i18n/ko.json b/src/frontend/src/content/i18n/ko.json
index 239419ff6..29d773d34 100644
--- a/src/frontend/src/content/i18n/ko.json
+++ b/src/frontend/src/content/i18n/ko.json
@@ -61,10 +61,7 @@
"madeWithLove": "Microsoft에서 💜로 제작",
"opensInNewTab": "새 탭에서 열림",
"ask": "질문 & 답변",
- "collab": "협업",
"community": "커뮤니티",
- "discuss": "토론",
- "watch": "보기",
"blog": "블로그",
"privacy": "개인정보",
"resources": "리소스",
diff --git a/src/frontend/src/content/i18n/pt-BR.json b/src/frontend/src/content/i18n/pt-BR.json
index b327d6993..8ad3042a2 100644
--- a/src/frontend/src/content/i18n/pt-BR.json
+++ b/src/frontend/src/content/i18n/pt-BR.json
@@ -61,10 +61,7 @@
"madeWithLove": "Feito com 💜 na Microsoft",
"opensInNewTab": "abre em nova aba",
"ask": "Pergunte & Responda",
- "collab": "Colabore",
"community": "Comunidade",
- "discuss": "Discutir",
- "watch": "Assistir",
"blog": "Blog",
"privacy": "Privacidade",
"resources": "Recursos",
diff --git a/src/frontend/src/content/i18n/ru.json b/src/frontend/src/content/i18n/ru.json
index 652038b07..d2c8ae922 100644
--- a/src/frontend/src/content/i18n/ru.json
+++ b/src/frontend/src/content/i18n/ru.json
@@ -61,10 +61,7 @@
"madeWithLove": "Сделано с 💜 в Microsoft",
"opensInNewTab": "открывается в новой вкладке",
"ask": "Вопросы & ответы",
- "collab": "Сотрудничать",
"community": "Сообщество",
- "discuss": "Обсуждать",
- "watch": "Смотреть",
"blog": "Блог",
"privacy": "Конфиденциальность",
"resources": "Ресурсы",
diff --git a/src/frontend/src/content/i18n/tr.json b/src/frontend/src/content/i18n/tr.json
index b70c72a0e..d5cf971e4 100644
--- a/src/frontend/src/content/i18n/tr.json
+++ b/src/frontend/src/content/i18n/tr.json
@@ -61,10 +61,7 @@
"madeWithLove": "Microsoft'ta 💜 ile yapıldı",
"opensInNewTab": "yeni sekmede açılır",
"ask": "Sor & Yanıtla",
- "collab": "İşbirliği",
"community": "Topluluk",
- "discuss": "Tartış",
- "watch": "İzle",
"blog": "Blog",
"privacy": "Gizlilik",
"resources": "Kaynaklar",
diff --git a/src/frontend/src/content/i18n/uk.json b/src/frontend/src/content/i18n/uk.json
index 2cb79b77e..436989f15 100644
--- a/src/frontend/src/content/i18n/uk.json
+++ b/src/frontend/src/content/i18n/uk.json
@@ -61,10 +61,7 @@
"madeWithLove": "Зроблено з 💜 у Microsoft",
"opensInNewTab": "відкривається в новій вкладці",
"ask": "Запитання & Відповіді",
- "collab": "Співпраця",
"community": "Спільнота",
- "discuss": "Обговорити",
- "watch": "Переглянути",
"blog": "Блог",
"privacy": "Приватність",
"resources": "Ресурси",
diff --git a/src/frontend/src/content/i18n/zh-CN.json b/src/frontend/src/content/i18n/zh-CN.json
index 32311c309..9f2b3cdda 100644
--- a/src/frontend/src/content/i18n/zh-CN.json
+++ b/src/frontend/src/content/i18n/zh-CN.json
@@ -61,10 +61,7 @@
"madeWithLove": "由 Microsoft 倾情打造 💜",
"opensInNewTab": "在新标签页中打开",
"ask": "问 & 答",
- "collab": "协作",
"community": "社区",
- "discuss": "讨论",
- "watch": "观看",
"blog": "博客",
"privacy": "隐私",
"resources": "资源",
diff --git a/src/frontend/tests/unit/custom-components.vitest.test.ts b/src/frontend/tests/unit/custom-components.vitest.test.ts
index 9659790f6..70df541db 100644
--- a/src/frontend/tests/unit/custom-components.vitest.test.ts
+++ b/src/frontend/tests/unit/custom-components.vitest.test.ts
@@ -806,6 +806,44 @@ describe('custom Astro component render coverage', () => {
expect(html).not.toContain('h=1000');
});
+ it('renders footer community links with platform names', async () => {
+ const translations: Record = {
+ 'footer.community': 'Community',
+ 'footer.blog': 'Blog',
+ 'footer.collab': 'Collaborate',
+ 'footer.discuss': 'Discuss',
+ 'footer.watch': 'Watch',
+ };
+ const t = ((key: string) => translations[key] ?? key) as ((key: string) => string) & {
+ dir: () => 'ltr';
+ };
+ t.dir = () => 'ltr';
+
+ const html = normalizeHtml(
+ await renderComponent(FooterLinks, {
+ locals: { t },
+ })
+ );
+
+ for (const label of [
+ 'X (Twitter)',
+ 'BlueSky',
+ 'GitHub',
+ 'Discord',
+ 'Reddit',
+ 'YouTube',
+ 'Twitch',
+ 'Blog',
+ ]) {
+ expect(html).toContain(label);
+ }
+
+ expect(html).not.toContain('Follow');
+ expect(html).not.toContain('Collaborate');
+ expect(html).not.toContain('Discuss');
+ expect(html).not.toContain('Watch');
+ });
+
it('hides footer community links on localized 404 pages', async () => {
const html = normalizeHtml(
await renderComponent(FooterLinks, {
From 133563279796a08c71135e2455492011c051184e Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 11 May 2026 12:10:41 +0000
Subject: [PATCH 4/4] feat: add localized CTA title attributes to footer
community links
Agent-Logs-Url: https://github.com/microsoft/aspire.dev/sessions/73b6f7ea-d8f6-4e3d-8020-cd733fe0c56e
Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com>
---
src/frontend/src/components/FooterLinks.astro | 30 ++++++++++++-------
src/frontend/src/content/i18n/da.json | 8 +++++
src/frontend/src/content/i18n/de.json | 8 +++++
src/frontend/src/content/i18n/en.json | 8 +++++
src/frontend/src/content/i18n/es.json | 8 +++++
src/frontend/src/content/i18n/fr.json | 8 +++++
src/frontend/src/content/i18n/hi.json | 8 +++++
src/frontend/src/content/i18n/id.json | 8 +++++
src/frontend/src/content/i18n/it.json | 8 +++++
src/frontend/src/content/i18n/ja.json | 8 +++++
src/frontend/src/content/i18n/ko.json | 8 +++++
src/frontend/src/content/i18n/pt-BR.json | 8 +++++
src/frontend/src/content/i18n/ru.json | 8 +++++
src/frontend/src/content/i18n/tr.json | 8 +++++
src/frontend/src/content/i18n/uk.json | 8 +++++
src/frontend/src/content/i18n/zh-CN.json | 8 +++++
16 files changed, 139 insertions(+), 11 deletions(-)
diff --git a/src/frontend/src/components/FooterLinks.astro b/src/frontend/src/components/FooterLinks.astro
index a1e087bea..ed5973c7e 100644
--- a/src/frontend/src/components/FooterLinks.astro
+++ b/src/frontend/src/components/FooterLinks.astro
@@ -5,27 +5,35 @@ import { socialConfig } from '../../config/socials.config';
type CommunityLink = {
icon: (typeof socialConfig)[number]['icon'] | 'reddit';
label: string;
+ title: string;
href: string;
};
-const getSocialLink = (label: string, displayLabel = label): CommunityLink | null => {
+const getSocialLink = (
+ label: string,
+ title: string,
+ displayLabel = label,
+): CommunityLink | null => {
const link = socialConfig.find((social) => social.label === label);
- return link ? { icon: link.icon, label: displayLabel, href: link.href } : null;
+ return link ? { icon: link.icon, label: displayLabel, title, href: link.href } : null;
};
+const t = (key: string) => Astro.locals.t(key as any);
+
const communityLinks = [
- getSocialLink('X', 'X (Twitter)'),
- getSocialLink('BlueSky'),
- getSocialLink('GitHub'),
- getSocialLink('Discord'),
+ getSocialLink('X', t('footer.followOnX'), 'X'),
+ getSocialLink('BlueSky', t('footer.followOnBlueSky')),
+ getSocialLink('GitHub', t('footer.collaborateOnGitHub')),
+ getSocialLink('Discord', t('footer.joinDiscord')),
{
- icon: 'reddit',
+ icon: 'reddit' as const,
label: 'Reddit',
+ title: t('footer.discussOnReddit'),
href: 'https://www.reddit.com/r/aspiredotdev',
},
- getSocialLink('YouTube'),
- getSocialLink('Twitch'),
- getSocialLink('Blog', Astro.locals.t('footer.blog' as any)),
+ getSocialLink('YouTube', t('footer.watchOnYouTube')),
+ getSocialLink('Twitch', t('footer.watchOnTwitch')),
+ getSocialLink('Blog', t('footer.readBlog'), t('footer.blog')),
].filter((link): link is CommunityLink => link !== null);
const is404 =
@@ -40,7 +48,7 @@ const is404 =