@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 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
 
@@ -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, or publish status.", {
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":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9H,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACrI,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACjJ,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;IACE,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wJA0OsI;CACrJ,CACF,CAAC;AAEF,mDAAmD;AACnD,SAAS,IAAI,CAAC,EAA6C;IACzD,OAAO,KAAK,EAAE,MAAW,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;YAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,uEAAuE;AAEvE,MAAM,CAAC,IAAI,CACT,OAAO,EACP,qJAAqJ,EACrJ;IACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;CAC5D,EACD,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAC5D,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,wIAAwI,EACxI;IACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;CACnD,EACD,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAC9C,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,wDAAwD,EACxD,EAAE,EACF,IAAI,CAAC,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAC/B,CAAC;AAEF,uEAAuE;AAEvE,MAAM,CAAC,IAAI,CACT,aAAa,EACb,iFAAiF,EACjF;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAChE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IACpE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC/D,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACnG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC1E,EACD,IAAI,CAAC,UAAU,CAAC,CACjB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,WAAW,EACX,8DAA8D,EAC9D;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;CACxC,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACnC,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,kHAAkH,EAClH;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kGAAkG,CAAC;IAC7H,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACvD,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;IAC7F,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,0GAA0G,CAAC;IACnJ,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CACzE,EACD,IAAI,CAAC,WAAW,CAAC,CAClB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,qEAAqE,EACrE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IACjD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IACxD,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;IACzD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAC5E,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CACxE,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CACrD,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,sCAAsC,EACtC;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;CAClD,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CACtC,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,2FAA2F,EAC3F;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;CACrE,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CACzD,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,6CAA6C,EAC7C;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CACrD,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CACzC,CAAC;AAEF,uEAAuE;AAEvE,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,yGAAyG,EACzG;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAChE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IACpE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC/D,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CACpG,EACD,IAAI,CAAC,SAAS,CAAC,CAChB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,UAAU,EACV,mEAAmE,EACnE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;CACvC,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAClC,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,+GAA+G,EAC/G;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;CAC3C,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CACxC,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,2GAA2G,EAC3G;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACrD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACvE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACvF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IAC9D,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC1D,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CACzE,EACD,IAAI,CAAC,UAAU,CAAC,CACjB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,wEAAwE,EACxE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAChD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;IACpD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC9D,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACnF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC7D,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;IACzD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CACxE,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CACpD,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,yCAAyC,EACzC;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CACjD,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CACrC,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,oFAAoF,EACpF;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;CACrE,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CACxD,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,gDAAgD,EAChD;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;CACpD,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CACxC,CAAC;AAEF,uEAAuE;AAEvE,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,2HAA2H,EAC3H;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;IACnD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;CACvD,EACD,IAAI,CAAC,eAAe,CAAC,CACtB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,2CAA2C,EAC3C;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CAC7C,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CACxC,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,iFAAiF,EACjF;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,oFAAoF,CAAC;IAC3H,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC5E,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IACxE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;CACrD,EACD,IAAI,CAAC,gBAAgB,CAAC,CACvB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,kDAAkD,EAClD;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;IAChD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IACxE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC1D,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC5E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CACzD,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAC1D,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,mCAAmC,EACnC;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;CACvD,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAC3C,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,sEAAsE,EACtE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;CACxD,EACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAC5C,CAAC;AAEF,uEAAuE;AAEvE,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,8DAA8D,EAC9D;IACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IAC9G,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;IACnD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CAC9D,EACD,IAAI,CAAC,aAAa,CAAC,CACpB,CAAC;AAEF,uEAAuE;AAEvE,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,gKAAgK,EAChK;IACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;IAC7F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;IACtF,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAC7E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC7E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC/E,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;CACpG,EACD,IAAI,CAAC,eAAe,CAAC,CACtB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,uLAAuL,EACvL,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG;YACZ,MAAM,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;YACzH,CAAC,CAAC,WAAW;YACb,EAAE;YACF,SAAS;SACV,CAAC;QAEF,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC1D,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;oBAChB,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;wBAC7B,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;oBACjE,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAChE,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,sIAAsI,EACtI;IACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CAC/E,EACD,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IACjH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IACvH,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACvE,IAAI,CAAC,CAAC,GAAG,CAAC,oBAAoB;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACtF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC,CACJ,CAAC;AAEF,eAAe;AACf,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
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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"}
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.5.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
+ };