@estation/create-cms-site 1.4.2 → 1.6.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 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.4.2",
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
 
@@ -34,6 +34,68 @@ When the user wants to work with the CMS for the first time, walk them through t
34
34
  - **Collections** are saved queries that dynamically group blocks by tags or types.
35
35
  - The website template has 10 section components (hero, text, features, faq, testimonials, cta, slider, gallery, contact, generic). Each renders a specific block tag. Use \`list_sections\` to see the exact field schemas.
36
36
 
37
+ ## Content types (Blogs, News, Events, etc.)
38
+
39
+ The CMS supports dynamic content types using content blocks. Each content item (blog post, news article, event, etc.) is stored as its **own individual content block** — NOT as items in a list field.
40
+
41
+ ### How it works
42
+
43
+ - Use the block \`type\` field to identify the content type: \`"blog"\`, \`"news"\`, \`"event"\`, etc.
44
+ - Use \`tags\` to categorize and filter: e.g. \`["blog", "tech"]\` or \`["news", "featured"]\`.
45
+ - Each block's \`content\` holds the item's fields using the standard \`{ fieldType, fieldValue }\` structure.
46
+
47
+ ### Creating a blog post
48
+
49
+ Use \`create_block\` with type \`"blog"\` and a tag like \`"blog"\`:
50
+ \`\`\`json
51
+ {
52
+ "type": "blog",
53
+ "name": "My First Blog Post",
54
+ "tags": ["blog"],
55
+ "content": {
56
+ "title": { "fieldType": "text", "fieldValue": "My First Blog Post" },
57
+ "slug": { "fieldType": "text", "fieldValue": "my-first-blog-post" },
58
+ "author": { "fieldType": "text", "fieldValue": "John Doe" },
59
+ "excerpt": { "fieldType": "textarea", "fieldValue": "A short summary..." },
60
+ "body": { "fieldType": "richtext", "fieldValue": "<p>Full article content...</p>" },
61
+ "featuredImage": { "fieldType": "image", "fieldValue": "https://..." },
62
+ "publishDate": { "fieldType": "text", "fieldValue": "2026-03-14" },
63
+ "status": { "fieldType": "text", "fieldValue": "published" }
64
+ }
65
+ }
66
+ \`\`\`
67
+
68
+ Then \`publish_block\` to make it visible via public API.
69
+
70
+ ### Fetching content (public API)
71
+
72
+ - **List all blog posts (paginated):** \`list_blocks\` with \`tags: "blog"\` — returns paginated results
73
+ - **Get a single post:** \`get_block\` with the post's UUID
74
+ - **Public endpoints (for websites):**
75
+ - \`GET /public/content/blocks/by-tags?tags=blog&page=1&size=10\` — paginated list
76
+ - \`GET /public/content/blocks/{uuid}\` — single item
77
+
78
+ ### Response format for create_block
79
+
80
+ When creating a block, the API returns the full block object:
81
+ \`\`\`json
82
+ {
83
+ "uuid": "550e8400-...",
84
+ "tenant_uuid": "123e4567-...",
85
+ "type": "blog",
86
+ "name": "My First Blog Post",
87
+ "tags": ["blog"],
88
+ "locale": "en",
89
+ "content": { ... },
90
+ "version": 1,
91
+ "is_published": false,
92
+ "created_at": "2026-03-14T...",
93
+ "updated_at": "2026-03-14T..."
94
+ }
95
+ \`\`\`
96
+
97
+ This pattern works for any content type — blogs, news, events, products, team members, etc. Just change the \`type\` and \`tags\` accordingly.
98
+
37
99
  ## Content field structure
38
100
 
39
101
  Block content fields follow this pattern:
@@ -142,11 +204,30 @@ A page's \`blocks\` field is an ordered array of content block UUIDs. The websit
142
204
 
143
205
  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
206
 
207
+ ## Localization (i18n)
208
+
209
+ 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.
210
+
211
+ **How it works:**
212
+ - When creating a block, set \`locale\` to the target language (defaults to "en" if omitted).
213
+ - 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.
214
+ - 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.
215
+ - Use \`list_blocks\` with \`locale\` filter to see blocks for a specific language.
216
+ - The website template uses \`[locale]/\` route segments (e.g. \`/en/about-us\`, \`/ar/about-us\`). The root \`/\` redirects to \`/en\`.
217
+ - RTL locales (ar, ku) automatically set \`dir="rtl"\` on the HTML element.
218
+
219
+ **Workflow for multi-language content:**
220
+ 1. Create blocks in the default language (en) with appropriate tags
221
+ 2. For each additional language, create new blocks with the same tags but different \`locale\`
222
+ 3. Add all block UUIDs (all locales) to the page's \`blocks\` array
223
+ 4. The website filters by locale at request time
224
+
145
225
  ## Page slug conventions
146
226
 
147
227
  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\`)
228
+ - \`index\` → homepage (rendered by \`/{locale}\`, e.g. \`/en\`)
229
+ - All other slugs render at \`/{locale}/{slug}\` (e.g. \`about-us\` → \`/en/about-us\`)
230
+ - The root \`/\` redirects to \`/en\` (or the user's preferred locale via Accept-Language)
150
231
 
151
232
  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
233
 
@@ -179,6 +260,7 @@ interface ContentBlock {
179
260
  type: string;
180
261
  name: string;
181
262
  tags: string[]; // ARRAY of strings, NOT a comma-separated string
263
+ locale: string; // Language code (e.g. "en", "ar", "fr"). Defaults to "en".
182
264
  content: Record<string, { fieldType: string; fieldValue: string | ListItem[] }>;
183
265
  metadata: Record<string, unknown>;
184
266
  version: number;
@@ -273,22 +355,24 @@ server.tool("set_api_token", "Set an API token for read-only public access to eS
273
355
  }, wrap(({ token }) => handleSetApiToken(token)));
274
356
  server.tool("auth_status", "Check current authentication status with eSTATION CMS.", {}, wrap(() => handleAuthStatus()));
275
357
  // ── Content Blocks ──────────────────────────────────────────────────
276
- server.tool("list_blocks", "List content blocks in the CMS. Filter by tags, search text, or publish status.", {
358
+ server.tool("list_blocks", "List content blocks in the CMS. Filter by tags, search text, publish status, or locale.", {
277
359
  page: z.number().optional().describe("Page number (default: 1)"),
278
360
  size: z.number().optional().describe("Items per page (default: 10)"),
279
361
  search: z.string().optional().describe("Search blocks by name"),
280
362
  status: z.enum(["published", "unpublished", "all"]).optional().describe("Filter by publish status"),
281
363
  tags: z.string().optional().describe("Comma-separated tags to filter by"),
364
+ locale: z.string().optional().describe("Filter by locale (e.g. 'en', 'ar', 'fr'). Omit to return all locales."),
282
365
  }, wrap(listBlocks));
283
366
  server.tool("get_block", "Get a content block by UUID with all its fields and content.", {
284
367
  uuid: z.string().describe("Block UUID"),
285
368
  }, wrap(({ uuid }) => getBlock(uuid)));
286
- server.tool("create_block", "Create a new content block in the CMS. Use list_sections to see available block types and their expected fields.", {
287
- type: z.string().describe("Block type (e.g. hero, text, features, faq, testimonials, cta, slider, gallery, contact, custom)"),
369
+ server.tool("create_block", "Create a new content block in the CMS. Use list_sections to see available section types. For content types (blog posts, news articles, events), use the content type as the block type (e.g. type: 'blog') with appropriate tags.", {
370
+ type: z.string().describe("Block type section types: hero, text, features, faq, testimonials, cta, slider, gallery, contact, custom. Content types: blog, news, event, or any custom type."),
288
371
  name: z.string().describe("Display name for the block"),
289
372
  tags: z.array(z.string()).optional().describe("Tags for categorizing and querying the block"),
290
373
  content: z.record(z.unknown()).describe("Block content fields — structure depends on block type. Each field should have { fieldType, fieldValue }"),
291
374
  metadata: z.record(z.unknown()).optional().describe("Optional metadata"),
375
+ locale: z.string().optional().describe("Locale for this block (e.g. 'en', 'ar', 'fr'). Defaults to 'en' if not specified."),
292
376
  }, wrap(createBlock));
293
377
  server.tool("update_block", "Update an existing content block. Only provided fields are changed.", {
294
378
  uuid: z.string().describe("Block UUID to update"),
@@ -296,6 +380,7 @@ server.tool("update_block", "Update an existing content block. Only provided fie
296
380
  tags: z.array(z.string()).optional().describe("New tags"),
297
381
  content: z.record(z.unknown()).optional().describe("Updated content fields"),
298
382
  metadata: z.record(z.unknown()).optional().describe("Updated metadata"),
383
+ locale: z.string().optional().describe("Change the block's locale (e.g. 'en', 'ar', 'fr')"),
299
384
  }, wrap(({ uuid, ...data }) => updateBlock(uuid, data)));
300
385
  server.tool("delete_block", "Delete a content block from the CMS.", {
301
386
  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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"}
@@ -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;CACf,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BlB;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;CACpC,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;CACpC,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"}
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"}
@@ -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";
@@ -1 +1 @@
1
- {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/tools/blocks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/tools/blocks.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAeA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,QAEnC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,QAExC;AAED,wBAAgB,YAAY,IAAI;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAI1E;AAcD,wBAAsB,UAAU,CAAC,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,SAAS,UAAQ,GAChB,OAAO,CAAC,CAAC,CAAC,CA4BZ;AAED,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB5E"}
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAeA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,QAEnC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,QAExC;AAED,wBAAgB,YAAY,IAAI;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAI1E;AAcD,wBAAsB,UAAU,CAAC,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,SAAS,UAAQ,GAChB,OAAO,CAAC,CAAC,CAAC,CAgCZ;AAED,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB5E"}
@@ -43,7 +43,11 @@ export async function cmsRequest(method, path, body, usePublic = false) {
43
43
  throw new Error(`CMS API ${res.status}: ${res.statusText}${text ? ` — ${text}` : ""}`);
44
44
  }
45
45
  const json = await res.json();
46
- return json.data;
46
+ // Backend may return wrapped { status, message, data } or unwrapped response directly
47
+ if (json && typeof json === "object" && "data" in json && "status" in json) {
48
+ return json.data;
49
+ }
50
+ return json;
47
51
  }
48
52
  catch (err) {
49
53
  clearTimeout(timeout);
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@estation/create-cms-site",
3
- "version": "1.4.2",
3
+ "version": "1.6.0",
4
4
  "description": "MCP server to scaffold Next.js sites powered by eSTATION CMS",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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="/blog" className="text-sm text-gray-500 hover:underline">&larr; Back to Blog</a>
38
+ <a href={`/${locale}/blog`} className="text-sm text-gray-500 hover:underline">&larr; 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={`/blog/${slug}`} className="hover:underline">
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="/events" className="text-sm text-gray-500 hover:underline">&larr; Back to Events</a>
40
+ <a href={`/${locale}/events`} className="text-sm text-gray-500 hover:underline">&larr; 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={`/events/${slug}`} className="hover:underline">
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="/news" className="text-sm text-gray-500 hover:underline">&larr; Back to News</a>
39
+ <a href={`/${locale}/news`} className="text-sm text-gray-500 hover:underline">&larr; 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={`/news/${slug}`} className="hover:underline">
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="/search" className="flex gap-2 mb-10">
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" ? "/" : `/${item.page.slug}`}
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 = `/blog/${slug}`;
83
- else if (tag === "news") href = `/news/${slug}`;
84
- else if (tag === "events") href = `/events/${slug}`;
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={`/search?q=${encodeURIComponent(query)}&page=${currentPage - 1}${type ? `&type=${type}` : ""}`}
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={`/search?q=${encodeURIComponent(query)}&page=${currentPage + 1}${type ? `&type=${type}` : ""}`}
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 { getPageBySlug } from "@/lib/cms-api";
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 async function generateMetadata(): Promise<Metadata> {
7
- try {
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
- export async function Navigation() {
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: str(item.label as never),
23
- href: str(item.href as never, "/"),
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: p.slug === "index" || p.slug === "" ? "/" : `/${p.slug}`,
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="/" className="text-xl font-bold">
58
+ <a href={`/${locale}`} className="text-xl font-bold">
49
59
  Home
50
60
  </a>
51
- {links.length > 0 && (
52
- <ul className="flex gap-6 text-sm">
53
- {links.map((link) => (
54
- <li key={link.href}>
55
- <a href={link.href} className="hover:underline text-gray-700">
56
- {link.label}
57
- </a>
58
- </li>
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
- </ul>
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
+ };