Merge pull request #105 from tequdev/lang-dynamic-routing

Consolidate Language Pages into [lang] Dynamic Routing
This commit is contained in:
tequ
2026-08-15 13:05:19 +09:00
committed by GitHub
51 changed files with 228 additions and 421 deletions

View File

@@ -1,7 +1,15 @@
import { defineCollection } from 'astro:content'
import { defineCollection, z } from 'astro:content'
import { docsLoader } from '@astrojs/starlight/loaders'
import { docsSchema } from '@astrojs/starlight/schema'
import { glob } from 'astro/loaders'
export const collections = {
docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }),
privacy: defineCollection({
loader: glob({ pattern: '**/*.mdx', base: './src/content/privacy' }),
schema: z.object({
title: z.string(),
description: z.string(),
}),
}),
}

View File

@@ -1,5 +1,4 @@
---
layout: ../layouts/PageLayout.astro
title: Privacy Policy
description: Privacy Policy for xahau.network
---

View File

@@ -1,5 +1,4 @@
---
layout: ../../layouts/PageLayout.astro
title: Política de Privacidad
description: Política de Privacidad de xahau.network
---

View File

@@ -1,5 +1,4 @@
---
layout: ../../layouts/PageLayout.astro
title: プライバシーポリシー
description: xahau.network のプライバシーポリシー
---

View File

@@ -1,5 +1,4 @@
---
layout: ../../layouts/PageLayout.astro
title: Política de Privacidade
description: Política de Privacidade do xahau.network
---

View File

@@ -1,4 +1,22 @@
{
"meta": {
"en": {
"title": "Xahau Connect",
"description": "Professional blockchain events for serious discussion and innovation"
},
"es": {
"title": "Xahau Connect",
"description": "Eventos profesionales de blockchain para debates serios e innovación"
},
"ja": {
"title": "Xahau Connect",
"description": "真剣な議論とイノベーションのためのプロフェッショナルなブロックチェーンイベント"
},
"pt-BR": {
"title": "Xahau Connect",
"description": "Eventos profissionais de blockchain para discussões sérias e inovação."
}
},
"events": [
{
"id": "xahau-course-2026-06",

View File

@@ -5,6 +5,12 @@
"ja": "エコシステム",
"pt-BR": "Ecossistema"
},
"description": {
"en": "Xahau around the world",
"es": "Xahau alrededor del mundo",
"ja": "世界中のXahau",
"pt-BR": "Xahau around the world"
},
"buildonxahau": {
"en": "built on or around Xahau",
"es": "creados en Xahau o en torno a ella",

View File

@@ -13,6 +13,24 @@
"locales": ["en", "es", "pt-BR"]
}
},
"pageMeta": {
"en": {
"title": "Roadmap",
"description": "Xahau roadmap across the upcoming quarters"
},
"es": {
"title": "Hoja de ruta de Xahau",
"description": "Hoja de ruta de Xahau para los próximos trimestres"
},
"ja": {
"title": "ロードマップ",
"description": "Xahauの今後の四半期のロードマップ"
},
"pt-BR": {
"title": "Roadmap da Xahau",
"description": "Rede empresarial com adições mínimas de funcionalidades, máxima confiabilidade"
}
},
"labels": {
"en": {
"title": "Xahau Roadmap",

View File

@@ -1,5 +1,6 @@
export const contestTranslations = {
en: {
page_title: 'Xahau Dev Contest',
page_subtitle:
'Ecosystem Rising — Build user-facing services powered by Xahau',
chip1: '2nd Edition',
@@ -135,6 +136,7 @@ export const contestTranslations = {
},
es: {
page_title: 'Xahau Dev Contest',
page_subtitle:
'Ecosystem Rising — Construye servicios de usuario powered by Xahau',
chip1: '2ª Edición',
@@ -272,6 +274,7 @@ export const contestTranslations = {
},
ja: {
page_title: 'Xahau Dev Contest',
page_subtitle:
'Ecosystem Rising — Xahauを活用したユーザー向けサービスを構築',
chip1: '第2回',
@@ -402,6 +405,7 @@ export const contestTranslations = {
legal6: '',
},
'pt-BR': {
page_title: 'Xahau Dev Contest',
page_subtitle:
'Ecosystem Rising — Construa serviços voltados para o usuário impulsionados por Xahau',
chip1: '2ª Edição',

View File

@@ -382,7 +382,7 @@ export const featuresTranslations = {
},
'pt-BR': {
// Page header
page_title: 'Recursos',
page_title: 'Funcionalidades',
page_subtitle: 'Tecnologia comprovada com uma abordagem inovadora',
chip1: '10+ Recursos de Protocolo',
chip2: 'DEX Nativo',

View File

@@ -0,0 +1,21 @@
---
import '../../styles/main.css'
import XahauAbout from '../../components/XahauAbout.astro'
import { aboutTranslations } from '../../i18n/aboutTranslations'
import BaseLayout from '../../layouts/BaseLayout.astro'
import generateStaticPaths from '../../utils/generateStaticPaths'
export function getStaticPaths() {
return generateStaticPaths()
}
const { locale } = Astro.props
const t = aboutTranslations[locale]
const _frontmatter = { title: t.page_title, description: t.page_subtitle }
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauAbout />
</div>
</BaseLayout>

View File

@@ -1,13 +1,17 @@
---
import '../../styles/main.css'
import XahauConnect from '../../components/XahauConnect.astro'
import connectData from '../../data/connect.json'
import BaseLayout from '../../layouts/BaseLayout.astro'
import generateStaticPaths from '../../utils/generateStaticPaths'
const _frontmatter = {
title: 'Xahau Connect',
description:
'Eventos profesionales de blockchain para debates serios e innovación',
export function getStaticPaths() {
return generateStaticPaths()
}
const { locale } = Astro.props
const { title, description } = connectData.meta[locale]
const _frontmatter = { title, description }
---
<BaseLayout frontmatter={_frontmatter}>

View File

@@ -0,0 +1,21 @@
---
import '../../styles/main.css'
import XahauContest from '../../components/XahauContest.astro'
import { contestTranslations } from '../../i18n/contestTranslations'
import BaseLayout from '../../layouts/BaseLayout.astro'
import generateStaticPaths from '../../utils/generateStaticPaths'
export function getStaticPaths() {
return generateStaticPaths()
}
const { locale } = Astro.props
const t = contestTranslations[locale]
const _frontmatter = { title: t.page_title, description: t.page_subtitle }
---
<BaseLayout frontmatter={_frontmatter}>
<div class="flex-none container mx-auto max-w-7xl p-6 pb-12">
<XahauContest />
</div>
</BaseLayout>

View File

@@ -0,0 +1,22 @@
---
import '../../styles/main.css'
import XahauEcosystem from '../../components/XahauEcosystem.astro'
import ecosystemData from '../../data/ecosystem.json'
import BaseLayout from '../../layouts/BaseLayout.astro'
import generateStaticPaths from '../../utils/generateStaticPaths'
export function getStaticPaths() {
return generateStaticPaths()
}
const { locale } = Astro.props
const title = ecosystemData.title[locale]
const description = ecosystemData.description[locale]
const _frontmatter = { title, description }
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauEcosystem />
</div>
</BaseLayout>

View File

@@ -0,0 +1,21 @@
---
import '../../styles/main.css'
import XahauFeatures from '../../components/XahauFeatures.astro'
import { featuresTranslations } from '../../i18n/featuresTranslations'
import BaseLayout from '../../layouts/BaseLayout.astro'
import generateStaticPaths from '../../utils/generateStaticPaths'
export function getStaticPaths() {
return generateStaticPaths()
}
const { locale } = Astro.props
const t = featuresTranslations[locale] ?? featuresTranslations.en
const _frontmatter = { title: t.page_title, description: t.page_subtitle }
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauFeatures />
</div>
</BaseLayout>

View File

@@ -0,0 +1,14 @@
---
import FraudReportPage from '../../components/FraudReportPage.astro'
import { fraudReportTranslations } from '../../i18n/fraudReportTranslations'
import generateStaticPaths from '../../utils/generateStaticPaths'
export function getStaticPaths() {
return generateStaticPaths()
}
const { locale } = Astro.props
const t = fraudReportTranslations[locale]
---
<FraudReportPage t={t} />

View File

@@ -0,0 +1,12 @@
---
import IndexLayout from '../../layouts/IndexLayout.astro'
import generateStaticPaths from '../../utils/generateStaticPaths'
export function getStaticPaths() {
return generateStaticPaths()
}
// TODO: Add frontmatter
---
<IndexLayout />

View File

@@ -0,0 +1,21 @@
---
import { getEntry, render } from 'astro:content'
import PageLayout from '../../layouts/PageLayout.astro'
import generateStaticPaths from '../../utils/generateStaticPaths'
export function getStaticPaths() {
return generateStaticPaths()
}
const { locale } = Astro.props
const entry = await getEntry('privacy', locale)
if (!entry) return Astro.redirect('/privacy-policy')
const { Content } = await render(entry)
const _frontmatter = {
title: entry.data.title,
description: entry.data.description,
}
---
<PageLayout frontmatter={_frontmatter}> <Content /> </PageLayout>

View File

@@ -0,0 +1,21 @@
---
import '../../styles/main.css'
import XahauRoadmap from '../../components/XahauRoadmap.astro'
import roadmapData from '../../data/roadmap.json'
import BaseLayout from '../../layouts/BaseLayout.astro'
import generateStaticPaths from '../../utils/generateStaticPaths'
export function getStaticPaths() {
return generateStaticPaths()
}
const { locale } = Astro.props
const { title, description } = roadmapData.pageMeta[locale]
const _frontmatter = { title, description }
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauRoadmap lang={locale} theme="light" />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../styles/main.css'
import XahauAbout from '../components/XahauAbout.astro'
import BaseLayout from '../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'About Xahau',
description: 'Enterprise L1 blockchain with account-based programmability',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauAbout />
</div>
</BaseLayout>

View File

@@ -1,17 +0,0 @@
---
import '../styles/main.css'
import XahauConnect from '../components/XahauConnect.astro'
import BaseLayout from '../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Xahau Connect',
description:
'Professional blockchain events for serious discussion and innovation',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauConnect />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../styles/main.css'
import XahauContest from '../components/XahauContest.astro'
import BaseLayout from '../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Xahau Dev Contest',
description: 'Ecosystem Rising — Build user-facing services powered by Xahau',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="flex-none container mx-auto max-w-7xl p-6 pb-12">
<XahauContest />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../styles/main.css'
import XahauEcosystem from '../components/XahauEcosystem.astro'
import BaseLayout from '../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Ecosystem',
description: 'Xahau around the world',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauEcosystem />
</div>
</BaseLayout>

View File

@@ -1,17 +0,0 @@
---
import '../../styles/main.css'
import XahauAbout from '../../components/XahauAbout.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Sobre Xahau',
description:
'Blockchain L1 empresarial con programabilidad basada en cuentas',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauAbout />
</div>
</BaseLayout>

View File

@@ -1,17 +0,0 @@
---
import '../../styles/main.css'
import XahauContest from '../../components/XahauContest.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Xahau Dev Contest',
description:
'Ecosystem Rising — Construye servicios de usuario powered by Xahau',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="flex-none container mx-auto max-w-7xl p-6 pb-12">
<XahauContest />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../../styles/main.css'
import XahauEcosystem from '../../components/XahauEcosystem.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Ecosistema',
description: 'Xahau alrededor del mundo',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauEcosystem />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../../styles/main.css'
import XahauFeatures from '../../components/XahauFeatures.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Características',
description: 'Tecnología probada con un enfoque renovado',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauFeatures />
</div>
</BaseLayout>

View File

@@ -1,6 +0,0 @@
---
import FraudReportPage from '../../components/FraudReportPage.astro'
import { fraudReportTranslations } from '../../i18n/fraudReportTranslations'
---
<FraudReportPage t={fraudReportTranslations.es} />

View File

@@ -1,3 +0,0 @@
---
layout: ../../layouts/IndexLayout.astro
---

View File

@@ -1,16 +0,0 @@
---
import '../../styles/main.css'
import XahauRoadmap from '../../components/XahauRoadmap.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Hoja de ruta',
description: 'Hoja de ruta de Xahau para los próximos trimestres',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauRoadmap lang="es" theme="light" />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../styles/main.css'
import XahauFeatures from '../components/XahauFeatures.astro'
import BaseLayout from '../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Features',
description: 'Proven technology with a fresh approach',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauFeatures lang="en" />
</div>
</BaseLayout>

View File

@@ -1,6 +0,0 @@
---
import FraudReportPage from '../components/FraudReportPage.astro'
import { fraudReportTranslations } from '../i18n/fraudReportTranslations'
---
<FraudReportPage t={fraudReportTranslations.en} />

View File

@@ -1,3 +0,0 @@
---
layout: ../layouts/IndexLayout.astro
---

View File

@@ -1,17 +0,0 @@
---
import '../../styles/main.css'
import XahauAbout from '../../components/XahauAbout.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Xahauについて',
description:
'アカウントベースプログラマビリティを持つエンタープライズL1ブロックチェーン',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauAbout />
</div>
</BaseLayout>

View File

@@ -1,17 +0,0 @@
---
import '../../styles/main.css'
import XahauConnect from '../../components/XahauConnect.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Xahau Connect',
description:
'真剣な議論とイノベーションのためのプロフェッショナルなブロックチェーンイベント',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauConnect />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../../styles/main.css'
import XahauContest from '../../components/XahauContest.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Xahau Dev Contest',
description: 'Ecosystem Rising — Xahauを活用したユーザー向けサービスを構築',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="flex-none container mx-auto max-w-7xl p-6 pb-12">
<XahauContest />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../../styles/main.css'
import XahauEcosystem from '../../components/XahauEcosystem.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'エコシステム',
description: '世界中のXahau',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauEcosystem />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../../styles/main.css'
import XahauFeatures from '../../components/XahauFeatures.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: '機能',
description: '実績ある技術、新鮮なアプローチ',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauFeatures />
</div>
</BaseLayout>

View File

@@ -1,6 +0,0 @@
---
import FraudReportPage from '../../components/FraudReportPage.astro'
import { fraudReportTranslations } from '../../i18n/fraudReportTranslations'
---
<FraudReportPage t={fraudReportTranslations.ja} />

View File

@@ -1,3 +0,0 @@
---
layout: ../../layouts/IndexLayout.astro
---

View File

@@ -1,16 +0,0 @@
---
import '../../styles/main.css'
import XahauRoadmap from '../../components/XahauRoadmap.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'ロードマップ',
description: 'Xahau roadmap across the upcoming quarters',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauRoadmap lang="ja" theme="light" />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../../styles/main.css'
import XahauAbout from '../../components/XahauAbout.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Sobre Xahau',
description: 'Enterprise L1 blockchain with account-based programmability',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauAbout />
</div>
</BaseLayout>

View File

@@ -1,17 +0,0 @@
---
import '../../styles/main.css'
import XahauConnect from '../../components/XahauConnect.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Xahau Connect',
description:
'Eventos profissionais de blockchain para discussões sérias e inovação.',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauConnect />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../../styles/main.css'
import XahauContest from '../../components/XahauContest.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Xahau Dev Contest',
description: 'Ecosystem Rising — Build user-facing services powered by Xahau',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="flex-none container mx-auto max-w-7xl p-6 pb-12">
<XahauContest />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../../styles/main.css'
import XahauEcosystem from '../../components/XahauEcosystem.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Ecosystem',
description: 'Xahau around the world',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauEcosystem lang="pt-BR" />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../../styles/main.css'
import XahauFeatures from '../../components/XahauFeatures.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Funcionalidades',
description: 'Tecnologia comprovada com uma abordagem inovadora',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauFeatures lang="pt-BR" />
</div>
</BaseLayout>

View File

@@ -1,6 +0,0 @@
---
import FraudReportPage from '../../components/FraudReportPage.astro'
import { fraudReportTranslations } from '../../i18n/fraudReportTranslations'
---
<FraudReportPage t={fraudReportTranslations['pt-BR']} />

View File

@@ -1,3 +0,0 @@
---
layout: ../../layouts/IndexLayout.astro
---

View File

@@ -1,17 +0,0 @@
---
import '../../styles/main.css'
import XahauRoadmap from '../../components/XahauRoadmap.astro'
import BaseLayout from '../../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Roadmap da Xahau',
description:
'Rede empresarial com adições mínimas de funcionalidades, máxima confiabilidade',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauRoadmap lang="pt-BR" theme="light" />
</div>
</BaseLayout>

View File

@@ -1,16 +0,0 @@
---
import '../styles/main.css'
import XahauRoadmap from '../components/XahauRoadmap.astro'
import BaseLayout from '../layouts/BaseLayout.astro'
const _frontmatter = {
title: 'Roadmap',
description: 'Xahau roadmap across the upcoming quarters',
}
---
<BaseLayout frontmatter={_frontmatter}>
<div class="page-content flex-1 container mx-auto max-w-7xl p-6">
<XahauRoadmap lang={Astro.currentLocale ?? 'en'} theme="light" />
</div>
</BaseLayout>

View File

@@ -0,0 +1,11 @@
import { defaultLocale, locales } from '../i18n/locales'
export default function generateStaticPaths() {
return locales.map((locale) => {
const lang = locale === defaultLocale ? undefined : locale.toLowerCase()
return {
params: { lang },
props: { locale },
}
})
}