@estation/create-cms-site 1.4.2 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +27 -4
- package/dist/index.js.map +1 -1
- package/dist/tools/blocks.d.ts +3 -0
- package/dist/tools/blocks.d.ts.map +1 -1
- package/dist/tools/blocks.js +2 -0
- package/dist/tools/blocks.js.map +1 -1
- package/package.json +1 -1
- package/template/src/app/{[slug] → [locale]/[slug]}/page.tsx +5 -5
- package/template/src/app/{blog → [locale]/blog}/[slug]/page.tsx +6 -6
- package/template/src/app/{blog → [locale]/blog}/page.tsx +8 -3
- package/template/src/app/{collections → [locale]/collections}/[uuid]/page.tsx +3 -3
- package/template/src/app/{events → [locale]/events}/[slug]/page.tsx +6 -6
- package/template/src/app/{events → [locale]/events}/page.tsx +8 -3
- package/template/src/app/[locale]/layout.tsx +34 -0
- package/template/src/app/{news → [locale]/news}/[slug]/page.tsx +6 -6
- package/template/src/app/{news → [locale]/news}/page.tsx +8 -3
- package/template/src/app/[locale]/page.tsx +46 -0
- package/template/src/app/{search → [locale]/search}/page.tsx +11 -9
- package/template/src/app/layout.tsx +2 -14
- package/template/src/app/page.tsx +3 -38
- package/template/src/components/Navigation.tsx +46 -19
- package/template/src/lib/cms-api.ts +16 -9
- package/template/src/lib/types.ts +27 -0
- package/template/src/middleware.ts +57 -0
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ import { listCollections, getCollection, createCollection, updateCollection, del
|
|
|
12
12
|
import { searchContent } from "./tools/search.js";
|
|
13
13
|
const server = new McpServer({
|
|
14
14
|
name: "estation-cms",
|
|
15
|
-
version: "1.
|
|
15
|
+
version: "1.5.0",
|
|
16
16
|
}, {
|
|
17
17
|
instructions: `You are connected to the eSTATION CMS — a headless content management system at cms-gateway.estation.io.
|
|
18
18
|
|
|
@@ -142,11 +142,30 @@ A page's \`blocks\` field is an ordered array of content block UUIDs. The websit
|
|
|
142
142
|
|
|
143
143
|
When users say things like "add a hero to my homepage" or "remove the FAQ section", follow these workflows. Always use \`list_sections\` to get the correct field structure for the block type being created.
|
|
144
144
|
|
|
145
|
+
## Localization (i18n)
|
|
146
|
+
|
|
147
|
+
The CMS supports per-locale content blocks. Each block has a \`locale\` field (e.g. "en", "ar", "fr"). Supported locales: en, es, fr, de, zh, ja, ko, pt, ar, ku. Arabic and Kurdish use RTL text direction.
|
|
148
|
+
|
|
149
|
+
**How it works:**
|
|
150
|
+
- When creating a block, set \`locale\` to the target language (defaults to "en" if omitted).
|
|
151
|
+
- To serve content in multiple languages, create separate blocks per locale with the same tags. For example, a hero block tagged \`["hero"]\` in English and another hero block tagged \`["hero"]\` in Arabic.
|
|
152
|
+
- Pages store block UUIDs for ALL locales. When the website requests a page with \`?locale=en\`, only English blocks are returned. Missing locale blocks are simply absent.
|
|
153
|
+
- Use \`list_blocks\` with \`locale\` filter to see blocks for a specific language.
|
|
154
|
+
- The website template uses \`[locale]/\` route segments (e.g. \`/en/about-us\`, \`/ar/about-us\`). The root \`/\` redirects to \`/en\`.
|
|
155
|
+
- RTL locales (ar, ku) automatically set \`dir="rtl"\` on the HTML element.
|
|
156
|
+
|
|
157
|
+
**Workflow for multi-language content:**
|
|
158
|
+
1. Create blocks in the default language (en) with appropriate tags
|
|
159
|
+
2. For each additional language, create new blocks with the same tags but different \`locale\`
|
|
160
|
+
3. Add all block UUIDs (all locales) to the page's \`blocks\` array
|
|
161
|
+
4. The website filters by locale at request time
|
|
162
|
+
|
|
145
163
|
## Page slug conventions
|
|
146
164
|
|
|
147
165
|
The website template uses these reserved slugs:
|
|
148
|
-
- \`index\` → homepage (rendered by
|
|
149
|
-
- All other slugs render at \`/{slug}\` (e.g. \`about-us\` → \`/about-us\`)
|
|
166
|
+
- \`index\` → homepage (rendered by \`/{locale}\`, e.g. \`/en\`)
|
|
167
|
+
- All other slugs render at \`/{locale}/{slug}\` (e.g. \`about-us\` → \`/en/about-us\`)
|
|
168
|
+
- The root \`/\` redirects to \`/en\` (or the user's preferred locale via Accept-Language)
|
|
150
169
|
|
|
151
170
|
When a user says "homepage" or "main page", they mean the page with slug \`index\`. When creating a new site, the first page should always have slug \`index\`.
|
|
152
171
|
|
|
@@ -179,6 +198,7 @@ interface ContentBlock {
|
|
|
179
198
|
type: string;
|
|
180
199
|
name: string;
|
|
181
200
|
tags: string[]; // ARRAY of strings, NOT a comma-separated string
|
|
201
|
+
locale: string; // Language code (e.g. "en", "ar", "fr"). Defaults to "en".
|
|
182
202
|
content: Record<string, { fieldType: string; fieldValue: string | ListItem[] }>;
|
|
183
203
|
metadata: Record<string, unknown>;
|
|
184
204
|
version: number;
|
|
@@ -273,12 +293,13 @@ server.tool("set_api_token", "Set an API token for read-only public access to eS
|
|
|
273
293
|
}, wrap(({ token }) => handleSetApiToken(token)));
|
|
274
294
|
server.tool("auth_status", "Check current authentication status with eSTATION CMS.", {}, wrap(() => handleAuthStatus()));
|
|
275
295
|
// ── Content Blocks ──────────────────────────────────────────────────
|
|
276
|
-
server.tool("list_blocks", "List content blocks in the CMS. Filter by tags, search text,
|
|
296
|
+
server.tool("list_blocks", "List content blocks in the CMS. Filter by tags, search text, publish status, or locale.", {
|
|
277
297
|
page: z.number().optional().describe("Page number (default: 1)"),
|
|
278
298
|
size: z.number().optional().describe("Items per page (default: 10)"),
|
|
279
299
|
search: z.string().optional().describe("Search blocks by name"),
|
|
280
300
|
status: z.enum(["published", "unpublished", "all"]).optional().describe("Filter by publish status"),
|
|
281
301
|
tags: z.string().optional().describe("Comma-separated tags to filter by"),
|
|
302
|
+
locale: z.string().optional().describe("Filter by locale (e.g. 'en', 'ar', 'fr'). Omit to return all locales."),
|
|
282
303
|
}, wrap(listBlocks));
|
|
283
304
|
server.tool("get_block", "Get a content block by UUID with all its fields and content.", {
|
|
284
305
|
uuid: z.string().describe("Block UUID"),
|
|
@@ -289,6 +310,7 @@ server.tool("create_block", "Create a new content block in the CMS. Use list_sec
|
|
|
289
310
|
tags: z.array(z.string()).optional().describe("Tags for categorizing and querying the block"),
|
|
290
311
|
content: z.record(z.unknown()).describe("Block content fields — structure depends on block type. Each field should have { fieldType, fieldValue }"),
|
|
291
312
|
metadata: z.record(z.unknown()).optional().describe("Optional metadata"),
|
|
313
|
+
locale: z.string().optional().describe("Locale for this block (e.g. 'en', 'ar', 'fr'). Defaults to 'en' if not specified."),
|
|
292
314
|
}, wrap(createBlock));
|
|
293
315
|
server.tool("update_block", "Update an existing content block. Only provided fields are changed.", {
|
|
294
316
|
uuid: z.string().describe("Block UUID to update"),
|
|
@@ -296,6 +318,7 @@ server.tool("update_block", "Update an existing content block. Only provided fie
|
|
|
296
318
|
tags: z.array(z.string()).optional().describe("New tags"),
|
|
297
319
|
content: z.record(z.unknown()).optional().describe("Updated content fields"),
|
|
298
320
|
metadata: z.record(z.unknown()).optional().describe("Updated metadata"),
|
|
321
|
+
locale: z.string().optional().describe("Change the block's locale (e.g. 'en', 'ar', 'fr')"),
|
|
299
322
|
}, wrap(({ uuid, ...data }) => updateBlock(uuid, data)));
|
|
300
323
|
server.tool("delete_block", "Delete a content block from the CMS.", {
|
|
301
324
|
uuid: z.string().describe("Block UUID to delete"),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/blocks.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export declare function listBlocks(params: {
|
|
|
17
17
|
search?: string;
|
|
18
18
|
status?: string;
|
|
19
19
|
tags?: string;
|
|
20
|
+
locale?: string;
|
|
20
21
|
}): Promise<string>;
|
|
21
22
|
export declare function getBlock(uuid: string): Promise<string>;
|
|
22
23
|
export declare function createBlock(data: {
|
|
@@ -25,12 +26,14 @@ export declare function createBlock(data: {
|
|
|
25
26
|
tags?: string[];
|
|
26
27
|
content: Record<string, unknown>;
|
|
27
28
|
metadata?: Record<string, unknown>;
|
|
29
|
+
locale?: string;
|
|
28
30
|
}): Promise<string>;
|
|
29
31
|
export declare function updateBlock(uuid: string, data: {
|
|
30
32
|
name?: string;
|
|
31
33
|
tags?: string[];
|
|
32
34
|
content?: Record<string, unknown>;
|
|
33
35
|
metadata?: Record<string, unknown>;
|
|
36
|
+
locale?: string;
|
|
34
37
|
}): Promise<string>;
|
|
35
38
|
export declare function deleteBlock(uuid: string): Promise<string>;
|
|
36
39
|
export declare function publishBlock(uuid: string, publish: boolean): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/tools/blocks.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD,wBAAsB,UAAU,CAAC,MAAM,EAAE;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/tools/blocks.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD,wBAAsB,UAAU,CAAC,MAAM,EAAE;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BlB;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG5D;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG/D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlE"}
|
package/dist/tools/blocks.js
CHANGED
|
@@ -9,6 +9,8 @@ export async function listBlocks(params) {
|
|
|
9
9
|
query.set("search", params.search);
|
|
10
10
|
if (params.status)
|
|
11
11
|
query.set("status", params.status);
|
|
12
|
+
if (params.locale)
|
|
13
|
+
query.set("locale", params.locale);
|
|
12
14
|
let path = "/content/blocks";
|
|
13
15
|
if (params.tags) {
|
|
14
16
|
path = "/content/blocks/by-tags";
|
package/dist/tools/blocks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/tools/blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAwBpD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/tools/blocks.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -4,13 +4,13 @@ import type { ContentBlock } from "@/lib/types";
|
|
|
4
4
|
import type { Metadata } from "next";
|
|
5
5
|
|
|
6
6
|
interface PageProps {
|
|
7
|
-
params: Promise<{ slug: string }>;
|
|
7
|
+
params: Promise<{ locale: string; slug: string }>;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
|
|
11
|
-
const { slug } = await params;
|
|
11
|
+
const { locale, slug } = await params;
|
|
12
12
|
try {
|
|
13
|
-
const data = await getPageBySlug(slug);
|
|
13
|
+
const data = await getPageBySlug(slug, locale);
|
|
14
14
|
return {
|
|
15
15
|
title: data.page.title || slug,
|
|
16
16
|
description: data.page.description || undefined,
|
|
@@ -21,8 +21,8 @@ export async function generateMetadata({ params }: PageProps): Promise<Metadata>
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export default async function DynamicPage({ params }: PageProps) {
|
|
24
|
-
const { slug } = await params;
|
|
25
|
-
const data = await getPageBySlug(slug);
|
|
24
|
+
const { locale, slug } = await params;
|
|
25
|
+
const data = await getPageBySlug(slug, locale);
|
|
26
26
|
const orderedBlocks = getOrderedBlocks(data.page.blocks, data.blocks);
|
|
27
27
|
|
|
28
28
|
return <SectionRenderer blocks={orderedBlocks} />;
|
|
@@ -5,12 +5,12 @@ import { notFound } from "next/navigation";
|
|
|
5
5
|
import type { Metadata } from "next";
|
|
6
6
|
|
|
7
7
|
interface PageProps {
|
|
8
|
-
params: Promise<{ slug: string }>;
|
|
8
|
+
params: Promise<{ locale: string; slug: string }>;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
|
|
12
|
-
const { slug } = await params;
|
|
13
|
-
const blocks = await getBlocksByTags(["blogs"]);
|
|
12
|
+
const { locale, slug } = await params;
|
|
13
|
+
const blocks = await getBlocksByTags(["blogs"], locale);
|
|
14
14
|
const block = findBlockBySlug(blocks, slug);
|
|
15
15
|
if (!block) return { title: "Post Not Found" };
|
|
16
16
|
return {
|
|
@@ -20,8 +20,8 @@ export async function generateMetadata({ params }: PageProps): Promise<Metadata>
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export default async function BlogDetailPage({ params }: PageProps) {
|
|
23
|
-
const { slug } = await params;
|
|
24
|
-
const blocks = await getBlocksByTags(["blogs"]);
|
|
23
|
+
const { locale, slug } = await params;
|
|
24
|
+
const blocks = await getBlocksByTags(["blogs"], locale);
|
|
25
25
|
const block = findBlockBySlug(blocks, slug);
|
|
26
26
|
|
|
27
27
|
if (!block) notFound();
|
|
@@ -35,7 +35,7 @@ export default async function BlogDetailPage({ params }: PageProps) {
|
|
|
35
35
|
return (
|
|
36
36
|
<article className="py-16 px-6">
|
|
37
37
|
<div className="max-w-3xl mx-auto">
|
|
38
|
-
<a href=
|
|
38
|
+
<a href={`/${locale}/blog`} className="text-sm text-gray-500 hover:underline">← Back to Blog</a>
|
|
39
39
|
<h1 className="text-4xl font-bold mt-4 mb-4">{title}</h1>
|
|
40
40
|
<div className="flex gap-4 text-sm text-gray-500 mb-8">
|
|
41
41
|
{author && <span>By {author}</span>}
|
|
@@ -3,15 +3,20 @@ import { str } from "@/lib/types";
|
|
|
3
3
|
import { formatDate } from "@/lib/content-helpers";
|
|
4
4
|
import type { Metadata } from "next";
|
|
5
5
|
|
|
6
|
+
interface PageProps {
|
|
7
|
+
params: Promise<{ locale: string }>;
|
|
8
|
+
}
|
|
9
|
+
|
|
6
10
|
export const metadata: Metadata = {
|
|
7
11
|
title: "Blog",
|
|
8
12
|
description: "Latest blog posts",
|
|
9
13
|
};
|
|
10
14
|
|
|
11
|
-
export default async function BlogListingPage() {
|
|
15
|
+
export default async function BlogListingPage({ params }: PageProps) {
|
|
16
|
+
const { locale } = await params;
|
|
12
17
|
let blocks: Awaited<ReturnType<typeof getBlocksByTags>> = [];
|
|
13
18
|
try {
|
|
14
|
-
blocks = await getBlocksByTags(["blogs"]);
|
|
19
|
+
blocks = await getBlocksByTags(["blogs"], locale);
|
|
15
20
|
} catch {
|
|
16
21
|
// CMS unavailable
|
|
17
22
|
}
|
|
@@ -48,7 +53,7 @@ export default async function BlogListingPage() {
|
|
|
48
53
|
)}
|
|
49
54
|
<h2 className="text-2xl font-semibold">
|
|
50
55
|
{slug ? (
|
|
51
|
-
<a href={
|
|
56
|
+
<a href={`/${locale}/blog/${slug}`} className="hover:underline">
|
|
52
57
|
{title}
|
|
53
58
|
</a>
|
|
54
59
|
) : (
|
|
@@ -3,7 +3,7 @@ import { SectionRenderer } from "@/components/SectionRenderer";
|
|
|
3
3
|
import type { Metadata } from "next";
|
|
4
4
|
|
|
5
5
|
interface PageProps {
|
|
6
|
-
params: Promise<{ uuid: string }>;
|
|
6
|
+
params: Promise<{ locale: string; uuid: string }>;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
export const metadata: Metadata = {
|
|
@@ -11,8 +11,8 @@ export const metadata: Metadata = {
|
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
export default async function CollectionPage({ params }: PageProps) {
|
|
14
|
-
const { uuid } = await params;
|
|
15
|
-
const blocks = await executeCollection(uuid);
|
|
14
|
+
const { locale, uuid } = await params;
|
|
15
|
+
const blocks = await executeCollection(uuid, locale);
|
|
16
16
|
|
|
17
17
|
return (
|
|
18
18
|
<div className="py-16 px-6">
|
|
@@ -5,12 +5,12 @@ import { notFound } from "next/navigation";
|
|
|
5
5
|
import type { Metadata } from "next";
|
|
6
6
|
|
|
7
7
|
interface PageProps {
|
|
8
|
-
params: Promise<{ slug: string }>;
|
|
8
|
+
params: Promise<{ locale: string; slug: string }>;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
|
|
12
|
-
const { slug } = await params;
|
|
13
|
-
const blocks = await getBlocksByTags(["events"]);
|
|
12
|
+
const { locale, slug } = await params;
|
|
13
|
+
const blocks = await getBlocksByTags(["events"], locale);
|
|
14
14
|
const block = findBlockBySlug(blocks, slug);
|
|
15
15
|
if (!block) return { title: "Event Not Found" };
|
|
16
16
|
return {
|
|
@@ -20,8 +20,8 @@ export async function generateMetadata({ params }: PageProps): Promise<Metadata>
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export default async function EventDetailPage({ params }: PageProps) {
|
|
23
|
-
const { slug } = await params;
|
|
24
|
-
const blocks = await getBlocksByTags(["events"]);
|
|
23
|
+
const { locale, slug } = await params;
|
|
24
|
+
const blocks = await getBlocksByTags(["events"], locale);
|
|
25
25
|
const block = findBlockBySlug(blocks, slug);
|
|
26
26
|
|
|
27
27
|
if (!block) notFound();
|
|
@@ -37,7 +37,7 @@ export default async function EventDetailPage({ params }: PageProps) {
|
|
|
37
37
|
return (
|
|
38
38
|
<article className="py-16 px-6">
|
|
39
39
|
<div className="max-w-3xl mx-auto">
|
|
40
|
-
<a href=
|
|
40
|
+
<a href={`/${locale}/events`} className="text-sm text-gray-500 hover:underline">← Back to Events</a>
|
|
41
41
|
<h1 className="text-4xl font-bold mt-4 mb-4">{title}</h1>
|
|
42
42
|
<div className="flex flex-wrap gap-4 text-sm text-gray-500 mb-8">
|
|
43
43
|
{startDate && (
|
|
@@ -3,15 +3,20 @@ import { str } from "@/lib/types";
|
|
|
3
3
|
import { formatDate } from "@/lib/content-helpers";
|
|
4
4
|
import type { Metadata } from "next";
|
|
5
5
|
|
|
6
|
+
interface PageProps {
|
|
7
|
+
params: Promise<{ locale: string }>;
|
|
8
|
+
}
|
|
9
|
+
|
|
6
10
|
export const metadata: Metadata = {
|
|
7
11
|
title: "Events",
|
|
8
12
|
description: "Upcoming events",
|
|
9
13
|
};
|
|
10
14
|
|
|
11
|
-
export default async function EventsListingPage() {
|
|
15
|
+
export default async function EventsListingPage({ params }: PageProps) {
|
|
16
|
+
const { locale } = await params;
|
|
12
17
|
let blocks: Awaited<ReturnType<typeof getBlocksByTags>> = [];
|
|
13
18
|
try {
|
|
14
|
-
blocks = await getBlocksByTags(["events"]);
|
|
19
|
+
blocks = await getBlocksByTags(["events"], locale);
|
|
15
20
|
} catch {
|
|
16
21
|
// CMS unavailable
|
|
17
22
|
}
|
|
@@ -42,7 +47,7 @@ export default async function EventsListingPage() {
|
|
|
42
47
|
<article key={block.uuid} className="border-b pb-8">
|
|
43
48
|
<h2 className="text-2xl font-semibold">
|
|
44
49
|
{slug ? (
|
|
45
|
-
<a href={
|
|
50
|
+
<a href={`/${locale}/events/${slug}`} className="hover:underline">
|
|
46
51
|
{title}
|
|
47
52
|
</a>
|
|
48
53
|
) : (
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { CMSPreviewListener } from "@/components/cms-preview-listener";
|
|
2
|
+
import { Navigation } from "@/components/Navigation";
|
|
3
|
+
import { Footer } from "@/components/Footer";
|
|
4
|
+
import { getLocaleDir, isValidLocale } from "@/lib/types";
|
|
5
|
+
import { notFound } from "next/navigation";
|
|
6
|
+
|
|
7
|
+
interface LocaleLayoutProps {
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
params: Promise<{ locale: string }>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default async function LocaleLayout({
|
|
13
|
+
children,
|
|
14
|
+
params,
|
|
15
|
+
}: LocaleLayoutProps) {
|
|
16
|
+
const { locale } = await params;
|
|
17
|
+
|
|
18
|
+
if (!isValidLocale(locale)) {
|
|
19
|
+
notFound();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const dir = getLocaleDir(locale);
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<html lang={locale} dir={dir}>
|
|
26
|
+
<body className="antialiased">
|
|
27
|
+
<Navigation locale={locale} />
|
|
28
|
+
<main>{children}</main>
|
|
29
|
+
<Footer />
|
|
30
|
+
<CMSPreviewListener />
|
|
31
|
+
</body>
|
|
32
|
+
</html>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -5,12 +5,12 @@ import { notFound } from "next/navigation";
|
|
|
5
5
|
import type { Metadata } from "next";
|
|
6
6
|
|
|
7
7
|
interface PageProps {
|
|
8
|
-
params: Promise<{ slug: string }>;
|
|
8
|
+
params: Promise<{ locale: string; slug: string }>;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
|
|
12
|
-
const { slug } = await params;
|
|
13
|
-
const blocks = await getBlocksByTags(["news"]);
|
|
12
|
+
const { locale, slug } = await params;
|
|
13
|
+
const blocks = await getBlocksByTags(["news"], locale);
|
|
14
14
|
const block = findBlockBySlug(blocks, slug);
|
|
15
15
|
if (!block) return { title: "Article Not Found" };
|
|
16
16
|
return {
|
|
@@ -20,8 +20,8 @@ export async function generateMetadata({ params }: PageProps): Promise<Metadata>
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export default async function NewsDetailPage({ params }: PageProps) {
|
|
23
|
-
const { slug } = await params;
|
|
24
|
-
const blocks = await getBlocksByTags(["news"]);
|
|
23
|
+
const { locale, slug } = await params;
|
|
24
|
+
const blocks = await getBlocksByTags(["news"], locale);
|
|
25
25
|
const block = findBlockBySlug(blocks, slug);
|
|
26
26
|
|
|
27
27
|
if (!block) notFound();
|
|
@@ -36,7 +36,7 @@ export default async function NewsDetailPage({ params }: PageProps) {
|
|
|
36
36
|
return (
|
|
37
37
|
<article className="py-16 px-6">
|
|
38
38
|
<div className="max-w-3xl mx-auto">
|
|
39
|
-
<a href=
|
|
39
|
+
<a href={`/${locale}/news`} className="text-sm text-gray-500 hover:underline">← Back to News</a>
|
|
40
40
|
{category && (
|
|
41
41
|
<span className="ml-4 text-xs font-medium uppercase tracking-wide text-blue-600 bg-blue-50 px-2 py-1 rounded">
|
|
42
42
|
{category}
|
|
@@ -3,15 +3,20 @@ import { str } from "@/lib/types";
|
|
|
3
3
|
import { formatDate } from "@/lib/content-helpers";
|
|
4
4
|
import type { Metadata } from "next";
|
|
5
5
|
|
|
6
|
+
interface PageProps {
|
|
7
|
+
params: Promise<{ locale: string }>;
|
|
8
|
+
}
|
|
9
|
+
|
|
6
10
|
export const metadata: Metadata = {
|
|
7
11
|
title: "News",
|
|
8
12
|
description: "Latest news",
|
|
9
13
|
};
|
|
10
14
|
|
|
11
|
-
export default async function NewsListingPage() {
|
|
15
|
+
export default async function NewsListingPage({ params }: PageProps) {
|
|
16
|
+
const { locale } = await params;
|
|
12
17
|
let blocks: Awaited<ReturnType<typeof getBlocksByTags>> = [];
|
|
13
18
|
try {
|
|
14
|
-
blocks = await getBlocksByTags(["news"]);
|
|
19
|
+
blocks = await getBlocksByTags(["news"], locale);
|
|
15
20
|
} catch {
|
|
16
21
|
// CMS unavailable
|
|
17
22
|
}
|
|
@@ -49,7 +54,7 @@ export default async function NewsListingPage() {
|
|
|
49
54
|
</div>
|
|
50
55
|
<h2 className="text-2xl font-semibold">
|
|
51
56
|
{slug ? (
|
|
52
|
-
<a href={
|
|
57
|
+
<a href={`/${locale}/news/${slug}`} className="hover:underline">
|
|
53
58
|
{title}
|
|
54
59
|
</a>
|
|
55
60
|
) : (
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { getPageBySlug } from "@/lib/cms-api";
|
|
2
|
+
import { SectionRenderer } from "@/components/SectionRenderer";
|
|
3
|
+
import type { ContentBlock } from "@/lib/types";
|
|
4
|
+
import type { Metadata } from "next";
|
|
5
|
+
|
|
6
|
+
interface PageProps {
|
|
7
|
+
params: Promise<{ locale: string }>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
|
|
11
|
+
const { locale } = await params;
|
|
12
|
+
try {
|
|
13
|
+
const data = await getPageBySlug("index", locale);
|
|
14
|
+
return {
|
|
15
|
+
title: data.page.title || "Home",
|
|
16
|
+
description: data.page.description || undefined,
|
|
17
|
+
};
|
|
18
|
+
} catch {
|
|
19
|
+
return { title: "Home" };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default async function Home({ params }: PageProps) {
|
|
24
|
+
const { locale } = await params;
|
|
25
|
+
try {
|
|
26
|
+
const data = await getPageBySlug("index", locale);
|
|
27
|
+
const orderedBlocks = getOrderedBlocks(data.page.blocks, data.blocks);
|
|
28
|
+
return <SectionRenderer blocks={orderedBlocks} />;
|
|
29
|
+
} catch {
|
|
30
|
+
return (
|
|
31
|
+
<div className="py-20 px-6 text-center">
|
|
32
|
+
<h1 className="text-4xl font-bold">Welcome</h1>
|
|
33
|
+
<p className="mt-4 text-gray-500">Content is not available yet. Configure your CMS to get started.</p>
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function getOrderedBlocks(
|
|
40
|
+
blockUuids: string[],
|
|
41
|
+
blocksMap: Record<string, ContentBlock>
|
|
42
|
+
): ContentBlock[] {
|
|
43
|
+
return blockUuids
|
|
44
|
+
.map((uuid) => blocksMap[uuid])
|
|
45
|
+
.filter(Boolean);
|
|
46
|
+
}
|
|
@@ -8,16 +8,18 @@ export const metadata: Metadata = {
|
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
interface SearchPageProps {
|
|
11
|
+
params: Promise<{ locale: string }>;
|
|
11
12
|
searchParams: Promise<{ q?: string; type?: string; page?: string }>;
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
export default async function SearchPage({ searchParams }: SearchPageProps) {
|
|
15
|
+
export default async function SearchPage({ params, searchParams }: SearchPageProps) {
|
|
16
|
+
const { locale } = await params;
|
|
15
17
|
const { q, type, page: pageStr } = await searchParams;
|
|
16
18
|
const query = q || "";
|
|
17
19
|
const currentPage = Math.max(1, parseInt(pageStr || "1", 10));
|
|
18
20
|
|
|
19
21
|
const results = query
|
|
20
|
-
? await searchContent(query, type, currentPage, 20)
|
|
22
|
+
? await searchContent(query, type, currentPage, 20, locale)
|
|
21
23
|
: null;
|
|
22
24
|
|
|
23
25
|
return (
|
|
@@ -25,7 +27,7 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
|
|
|
25
27
|
<div className="max-w-4xl mx-auto">
|
|
26
28
|
<h1 className="text-4xl font-bold mb-8">Search</h1>
|
|
27
29
|
|
|
28
|
-
<form method="get" action=
|
|
30
|
+
<form method="get" action={`/${locale}/search`} className="flex gap-2 mb-10">
|
|
29
31
|
<input
|
|
30
32
|
type="text"
|
|
31
33
|
name="q"
|
|
@@ -60,7 +62,7 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
|
|
|
60
62
|
</span>
|
|
61
63
|
<h2 className="text-xl font-semibold mt-1">
|
|
62
64
|
<a
|
|
63
|
-
href={item.page.slug === "index" ?
|
|
65
|
+
href={item.page.slug === "index" ? `/${locale}` : `/${locale}/${item.page.slug}`}
|
|
64
66
|
className="hover:underline"
|
|
65
67
|
>
|
|
66
68
|
{item.page.title}
|
|
@@ -79,9 +81,9 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
|
|
|
79
81
|
const tag = item.block.tags?.[0] || "";
|
|
80
82
|
let href = "#";
|
|
81
83
|
if (slug) {
|
|
82
|
-
if (tag === "blogs") href =
|
|
83
|
-
else if (tag === "news") href =
|
|
84
|
-
else if (tag === "events") href =
|
|
84
|
+
if (tag === "blogs") href = `/${locale}/blog/${slug}`;
|
|
85
|
+
else if (tag === "news") href = `/${locale}/news/${slug}`;
|
|
86
|
+
else if (tag === "events") href = `/${locale}/events/${slug}`;
|
|
85
87
|
}
|
|
86
88
|
|
|
87
89
|
return (
|
|
@@ -109,7 +111,7 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
|
|
|
109
111
|
<div className="flex justify-center gap-2 mt-10">
|
|
110
112
|
{currentPage > 1 && (
|
|
111
113
|
<a
|
|
112
|
-
href={
|
|
114
|
+
href={`/${locale}/search?q=${encodeURIComponent(query)}&page=${currentPage - 1}${type ? `&type=${type}` : ""}`}
|
|
113
115
|
className="px-4 py-2 border rounded-lg hover:bg-gray-100"
|
|
114
116
|
>
|
|
115
117
|
Previous
|
|
@@ -120,7 +122,7 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
|
|
|
120
122
|
</span>
|
|
121
123
|
{currentPage < results.total_pages && (
|
|
122
124
|
<a
|
|
123
|
-
href={
|
|
125
|
+
href={`/${locale}/search?q=${encodeURIComponent(query)}&page=${currentPage + 1}${type ? `&type=${type}` : ""}`}
|
|
124
126
|
className="px-4 py-2 border rounded-lg hover:bg-gray-100"
|
|
125
127
|
>
|
|
126
128
|
Next
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import type { Metadata } from "next";
|
|
2
|
-
import { CMSPreviewListener } from "@/components/cms-preview-listener";
|
|
3
|
-
import { Navigation } from "@/components/Navigation";
|
|
4
|
-
import { Footer } from "@/components/Footer";
|
|
5
1
|
import "@/styles/globals.css";
|
|
2
|
+
import type { Metadata } from "next";
|
|
6
3
|
|
|
7
4
|
export const metadata: Metadata = {
|
|
8
5
|
title: "Website",
|
|
@@ -14,14 +11,5 @@ export default function RootLayout({
|
|
|
14
11
|
}: {
|
|
15
12
|
children: React.ReactNode;
|
|
16
13
|
}) {
|
|
17
|
-
return
|
|
18
|
-
<html lang="en">
|
|
19
|
-
<body className="antialiased">
|
|
20
|
-
<Navigation />
|
|
21
|
-
<main>{children}</main>
|
|
22
|
-
<Footer />
|
|
23
|
-
<CMSPreviewListener />
|
|
24
|
-
</body>
|
|
25
|
-
</html>
|
|
26
|
-
);
|
|
14
|
+
return children;
|
|
27
15
|
}
|
|
@@ -1,40 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { SectionRenderer } from "@/components/SectionRenderer";
|
|
3
|
-
import type { ContentBlock } from "@/lib/types";
|
|
4
|
-
import type { Metadata } from "next";
|
|
1
|
+
import { redirect } from "next/navigation";
|
|
5
2
|
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
const data = await getPageBySlug("index");
|
|
9
|
-
return {
|
|
10
|
-
title: data.page.title || "Home",
|
|
11
|
-
description: data.page.description || undefined,
|
|
12
|
-
};
|
|
13
|
-
} catch {
|
|
14
|
-
return { title: "Home" };
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export default async function Home() {
|
|
19
|
-
try {
|
|
20
|
-
const data = await getPageBySlug("index");
|
|
21
|
-
const orderedBlocks = getOrderedBlocks(data.page.blocks, data.blocks);
|
|
22
|
-
return <SectionRenderer blocks={orderedBlocks} />;
|
|
23
|
-
} catch {
|
|
24
|
-
return (
|
|
25
|
-
<div className="py-20 px-6 text-center">
|
|
26
|
-
<h1 className="text-4xl font-bold">Welcome</h1>
|
|
27
|
-
<p className="mt-4 text-gray-500">Content is not available yet. Configure your CMS to get started.</p>
|
|
28
|
-
</div>
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function getOrderedBlocks(
|
|
34
|
-
blockUuids: string[],
|
|
35
|
-
blocksMap: Record<string, ContentBlock>
|
|
36
|
-
): ContentBlock[] {
|
|
37
|
-
return blockUuids
|
|
38
|
-
.map((uuid) => blocksMap[uuid])
|
|
39
|
-
.filter(Boolean);
|
|
3
|
+
export default function RootPage() {
|
|
4
|
+
redirect("/en");
|
|
40
5
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getBlocksByTags, getAllPages } from "@/lib/cms-api";
|
|
2
|
-
import { str } from "@/lib/types";
|
|
2
|
+
import { str, SUPPORTED_LOCALES } from "@/lib/types";
|
|
3
3
|
import type { ListItem } from "@/lib/types";
|
|
4
4
|
|
|
5
5
|
interface NavLink {
|
|
@@ -7,21 +7,28 @@ interface NavLink {
|
|
|
7
7
|
href: string;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
interface NavigationProps {
|
|
11
|
+
locale?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export async function Navigation({ locale = "en" }: NavigationProps) {
|
|
11
15
|
let links: NavLink[] = [];
|
|
12
16
|
|
|
13
17
|
try {
|
|
14
|
-
const navBlocks = await getBlocksByTags(["navigation"]);
|
|
18
|
+
const navBlocks = await getBlocksByTags(["navigation"], locale);
|
|
15
19
|
if (navBlocks.length > 0) {
|
|
16
20
|
const block = navBlocks[0];
|
|
17
21
|
const items = Array.isArray(block.content.items?.fieldValue)
|
|
18
22
|
? (block.content.items.fieldValue as ListItem[])
|
|
19
23
|
: [];
|
|
20
24
|
links = items
|
|
21
|
-
.map((item) =>
|
|
22
|
-
label
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
.map((item) => {
|
|
26
|
+
const label = str(item.label as never);
|
|
27
|
+
const rawHref = str(item.href as never, "/");
|
|
28
|
+
// Prefix hrefs with locale if they start with / and don't already have a locale
|
|
29
|
+
const href = rawHref.startsWith("/") ? `/${locale}${rawHref === "/" ? "" : rawHref}` : rawHref;
|
|
30
|
+
return { label, href };
|
|
31
|
+
})
|
|
25
32
|
.filter((l) => l.label);
|
|
26
33
|
}
|
|
27
34
|
} catch {
|
|
@@ -35,7 +42,10 @@ export async function Navigation() {
|
|
|
35
42
|
.filter((p) => p.is_published)
|
|
36
43
|
.map((p) => ({
|
|
37
44
|
label: p.title || p.slug,
|
|
38
|
-
href:
|
|
45
|
+
href:
|
|
46
|
+
p.slug === "index" || p.slug === ""
|
|
47
|
+
? `/${locale}`
|
|
48
|
+
: `/${locale}/${p.slug}`,
|
|
39
49
|
}));
|
|
40
50
|
} catch {
|
|
41
51
|
// fallback if no pages
|
|
@@ -45,20 +55,37 @@ export async function Navigation() {
|
|
|
45
55
|
return (
|
|
46
56
|
<nav className="border-b">
|
|
47
57
|
<div className="max-w-6xl mx-auto px-6 py-4 flex items-center justify-between">
|
|
48
|
-
<a href=
|
|
58
|
+
<a href={`/${locale}`} className="text-xl font-bold">
|
|
49
59
|
Home
|
|
50
60
|
</a>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
<
|
|
56
|
-
{link.
|
|
57
|
-
|
|
58
|
-
|
|
61
|
+
<div className="flex items-center gap-6">
|
|
62
|
+
{links.length > 0 && (
|
|
63
|
+
<ul className="flex gap-6 text-sm">
|
|
64
|
+
{links.map((link) => (
|
|
65
|
+
<li key={link.href}>
|
|
66
|
+
<a href={link.href} className="hover:underline text-gray-700">
|
|
67
|
+
{link.label}
|
|
68
|
+
</a>
|
|
69
|
+
</li>
|
|
70
|
+
))}
|
|
71
|
+
</ul>
|
|
72
|
+
)}
|
|
73
|
+
<div className="flex gap-1 text-xs">
|
|
74
|
+
{SUPPORTED_LOCALES.map((l) => (
|
|
75
|
+
<a
|
|
76
|
+
key={l.code}
|
|
77
|
+
href={`/${l.code}`}
|
|
78
|
+
className={`px-2 py-1 rounded ${
|
|
79
|
+
l.code === locale
|
|
80
|
+
? "bg-gray-900 text-white"
|
|
81
|
+
: "text-gray-500 hover:bg-gray-100"
|
|
82
|
+
}`}
|
|
83
|
+
>
|
|
84
|
+
{l.code.toUpperCase()}
|
|
85
|
+
</a>
|
|
59
86
|
))}
|
|
60
|
-
</
|
|
61
|
-
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
62
89
|
</div>
|
|
63
90
|
</nav>
|
|
64
91
|
);
|
|
@@ -40,17 +40,19 @@ async function cmsFetch<T>(path: string, tags?: string[]): Promise<T> {
|
|
|
40
40
|
return json.data;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
export async function getPageBySlug(slug: string): Promise<PageWithBlocksResponse> {
|
|
43
|
+
export async function getPageBySlug(slug: string, locale?: string): Promise<PageWithBlocksResponse> {
|
|
44
|
+
const localeParam = locale ? `?locale=${encodeURIComponent(locale)}` : "";
|
|
44
45
|
return cmsFetch<PageWithBlocksResponse>(
|
|
45
|
-
`/public/content/pages/slug/${encodeURIComponent(slug)}`,
|
|
46
|
+
`/public/content/pages/slug/${encodeURIComponent(slug)}${localeParam}`,
|
|
46
47
|
[`page-${slug}`]
|
|
47
48
|
);
|
|
48
49
|
}
|
|
49
50
|
|
|
50
|
-
export async function getBlocksByTags(tags: string[]): Promise<ContentBlock[]> {
|
|
51
|
+
export async function getBlocksByTags(tags: string[], locale?: string): Promise<ContentBlock[]> {
|
|
51
52
|
const query = tags.map(encodeURIComponent).join(",");
|
|
53
|
+
const localeParam = locale ? `&locale=${encodeURIComponent(locale)}` : "";
|
|
52
54
|
return cmsFetch<ContentBlock[]>(
|
|
53
|
-
`/public/content/blocks/by-tags?tags=${query}`,
|
|
55
|
+
`/public/content/blocks/by-tags?tags=${query}${localeParam}`,
|
|
54
56
|
tags.map((t) => `tag-${t}`)
|
|
55
57
|
);
|
|
56
58
|
}
|
|
@@ -58,10 +60,12 @@ export async function getBlocksByTags(tags: string[]): Promise<ContentBlock[]> {
|
|
|
58
60
|
export async function getBlocksByTagPaginated(
|
|
59
61
|
tag: string,
|
|
60
62
|
page = 1,
|
|
61
|
-
size = 20
|
|
63
|
+
size = 20,
|
|
64
|
+
locale?: string
|
|
62
65
|
): Promise<PaginatedResponse<ContentBlock>> {
|
|
66
|
+
const localeParam = locale ? `&locale=${encodeURIComponent(locale)}` : "";
|
|
63
67
|
return cmsFetch<PaginatedResponse<ContentBlock>>(
|
|
64
|
-
`/public/content/blocks/by-tags?tags=${encodeURIComponent(tag)}&page=${page}&size=${size}`,
|
|
68
|
+
`/public/content/blocks/by-tags?tags=${encodeURIComponent(tag)}&page=${page}&size=${size}${localeParam}`,
|
|
65
69
|
[`tag-${tag}`]
|
|
66
70
|
);
|
|
67
71
|
}
|
|
@@ -77,9 +81,10 @@ export async function getAllPages(): Promise<PageComposition[]> {
|
|
|
77
81
|
return cmsFetch<PageComposition[]>("/public/content/pages", ["all-pages"]);
|
|
78
82
|
}
|
|
79
83
|
|
|
80
|
-
export async function executeCollection(uuid: string): Promise<ContentBlock[]> {
|
|
84
|
+
export async function executeCollection(uuid: string, locale?: string): Promise<ContentBlock[]> {
|
|
85
|
+
const localeParam = locale ? `?locale=${encodeURIComponent(locale)}` : "";
|
|
81
86
|
return cmsFetch<ContentBlock[]>(
|
|
82
|
-
`/public/content/collections/${encodeURIComponent(uuid)}/execute`,
|
|
87
|
+
`/public/content/collections/${encodeURIComponent(uuid)}/execute${localeParam}`,
|
|
83
88
|
[`collection-${uuid}`]
|
|
84
89
|
);
|
|
85
90
|
}
|
|
@@ -92,10 +97,12 @@ export async function searchContent(
|
|
|
92
97
|
query: string,
|
|
93
98
|
type?: string,
|
|
94
99
|
page = 1,
|
|
95
|
-
size = 20
|
|
100
|
+
size = 20,
|
|
101
|
+
locale?: string
|
|
96
102
|
): Promise<PaginatedResponse<SearchResultItem>> {
|
|
97
103
|
const params = new URLSearchParams({ q: query, page: String(page), size: String(size) });
|
|
98
104
|
if (type) params.set("type", type);
|
|
105
|
+
if (locale) params.set("locale", locale);
|
|
99
106
|
return cmsFetch<PaginatedResponse<SearchResultItem>>(
|
|
100
107
|
`/public/content/search?${params.toString()}`,
|
|
101
108
|
["search"]
|
|
@@ -36,6 +36,7 @@ export interface ContentBlock {
|
|
|
36
36
|
type: string;
|
|
37
37
|
name: string;
|
|
38
38
|
tags: string[];
|
|
39
|
+
locale: string;
|
|
39
40
|
content: Record<string, ContentField>;
|
|
40
41
|
metadata: Record<string, unknown>;
|
|
41
42
|
version: number;
|
|
@@ -44,6 +45,32 @@ export interface ContentBlock {
|
|
|
44
45
|
updated_at: string;
|
|
45
46
|
}
|
|
46
47
|
|
|
48
|
+
export const SUPPORTED_LOCALES = [
|
|
49
|
+
{ code: "en", label: "English", dir: "ltr" },
|
|
50
|
+
{ code: "es", label: "Spanish", dir: "ltr" },
|
|
51
|
+
{ code: "fr", label: "French", dir: "ltr" },
|
|
52
|
+
{ code: "de", label: "German", dir: "ltr" },
|
|
53
|
+
{ code: "zh", label: "Chinese", dir: "ltr" },
|
|
54
|
+
{ code: "ja", label: "Japanese", dir: "ltr" },
|
|
55
|
+
{ code: "ko", label: "Korean", dir: "ltr" },
|
|
56
|
+
{ code: "pt", label: "Portuguese", dir: "ltr" },
|
|
57
|
+
{ code: "ar", label: "Arabic", dir: "rtl" },
|
|
58
|
+
{ code: "ku", label: "Kurdish", dir: "rtl" },
|
|
59
|
+
] as const;
|
|
60
|
+
|
|
61
|
+
export type LocaleCode = (typeof SUPPORTED_LOCALES)[number]["code"];
|
|
62
|
+
|
|
63
|
+
export const LOCALE_CODES = SUPPORTED_LOCALES.map((l) => l.code) as string[];
|
|
64
|
+
|
|
65
|
+
export function isValidLocale(s: string): s is LocaleCode {
|
|
66
|
+
return LOCALE_CODES.includes(s);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function getLocaleDir(locale: string): "ltr" | "rtl" {
|
|
70
|
+
const found = SUPPORTED_LOCALES.find((l) => l.code === locale);
|
|
71
|
+
return found?.dir === "rtl" ? "rtl" : "ltr";
|
|
72
|
+
}
|
|
73
|
+
|
|
47
74
|
export interface PageComposition {
|
|
48
75
|
uuid: string;
|
|
49
76
|
tenant_uuid: string;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
2
|
+
|
|
3
|
+
const LOCALE_CODES = [
|
|
4
|
+
"en", "es", "fr", "de", "zh", "ja", "ko", "pt", "ar", "ku",
|
|
5
|
+
];
|
|
6
|
+
const DEFAULT_LOCALE = "en";
|
|
7
|
+
|
|
8
|
+
function getPreferredLocale(acceptLanguage: string | null): string {
|
|
9
|
+
if (!acceptLanguage) return DEFAULT_LOCALE;
|
|
10
|
+
|
|
11
|
+
const parsed = acceptLanguage
|
|
12
|
+
.split(",")
|
|
13
|
+
.map((part) => {
|
|
14
|
+
const [lang, q] = part.trim().split(";q=");
|
|
15
|
+
return { lang: lang.trim().toLowerCase(), q: q ? parseFloat(q) : 1 };
|
|
16
|
+
})
|
|
17
|
+
.sort((a, b) => b.q - a.q);
|
|
18
|
+
|
|
19
|
+
for (const { lang } of parsed) {
|
|
20
|
+
const code = lang.split("-")[0];
|
|
21
|
+
if (LOCALE_CODES.includes(code)) return code;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return DEFAULT_LOCALE;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function middleware(request: NextRequest) {
|
|
28
|
+
const { pathname } = request.nextUrl;
|
|
29
|
+
|
|
30
|
+
// Skip internal paths and static files
|
|
31
|
+
if (
|
|
32
|
+
pathname.startsWith("/_next") ||
|
|
33
|
+
pathname.startsWith("/api") ||
|
|
34
|
+
pathname.includes(".") // static files (images, css, js, etc.)
|
|
35
|
+
) {
|
|
36
|
+
return NextResponse.next();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Check if pathname already has a locale prefix
|
|
40
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
41
|
+
if (segments.length > 0 && LOCALE_CODES.includes(segments[0])) {
|
|
42
|
+
return NextResponse.next();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Detect locale from Accept-Language header
|
|
46
|
+
const acceptLanguage = request.headers.get("accept-language");
|
|
47
|
+
const locale = getPreferredLocale(acceptLanguage);
|
|
48
|
+
|
|
49
|
+
// Redirect to locale-prefixed path
|
|
50
|
+
const url = request.nextUrl.clone();
|
|
51
|
+
url.pathname = `/${locale}${pathname}`;
|
|
52
|
+
return NextResponse.redirect(url);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export const config = {
|
|
56
|
+
matcher: ["/((?!_next|api|favicon\\.ico).*)"],
|
|
57
|
+
};
|