Add hand-rolled English support (/en/*) alongside the Italian site
PocketBase gains optional, manually-authored English fields on articles and categories (same record, same slug), and the frontend serves an /en counterpart of every dynamic route via thin page wrappers around shared view components — no i18n library, consistent with the project's existing minimalism stance for a two-locale site with ~20 UI strings. An article/category with no translation 404s cleanly on its own /en detail page and is filtered out of /en listings, and the header's language-switch link falls back to the English blog index rather than a dead link; resolving that requires a global route middleware, since the layout's header renders before the page content in document order and so can't react to state a page component sets during its own async setup.
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
export interface FixtureCategory {
|
||||
name: string
|
||||
slug: string
|
||||
nameEn?: string
|
||||
}
|
||||
|
||||
export interface FixtureArticle {
|
||||
@@ -13,10 +14,12 @@ export interface FixtureArticle {
|
||||
/** `null` = draft (never returned by the public API). */
|
||||
publishedAt: string | null
|
||||
authorName?: string
|
||||
titleEn?: string
|
||||
contentEn?: string
|
||||
}
|
||||
|
||||
export const FIXTURE_CATEGORIES: FixtureCategory[] = [
|
||||
{ name: 'Economia', slug: 'economia' },
|
||||
{ name: 'Economia', slug: 'economia', nameEn: 'Economy' },
|
||||
{ name: 'Attualità', slug: 'attualita' },
|
||||
]
|
||||
|
||||
@@ -28,6 +31,8 @@ export const FIXTURE_ARTICLES: FixtureArticle[] = [
|
||||
category: 'economia',
|
||||
publishedAt: '2025-01-15 10:00:00',
|
||||
authorName: 'Redazione',
|
||||
titleEn: 'Published article',
|
||||
contentEn: '# Title\n\nTest **markdown** body with [a link](https://example.com).',
|
||||
},
|
||||
{
|
||||
title: 'Articolo in bozza',
|
||||
@@ -43,5 +48,6 @@ export const FIXTURE_ARTICLES: FixtureArticle[] = [
|
||||
category: 'attualita',
|
||||
publishedAt: '2025-02-01 08:00:00',
|
||||
authorName: 'Redazione',
|
||||
// Deliberately no English translation: exercises the untranslated path.
|
||||
},
|
||||
]
|
||||
|
||||
@@ -150,6 +150,8 @@ export async function startTestPocketbase(options: StartOptions = {}): Promise<T
|
||||
category: category?.id,
|
||||
publishedAt: article.publishedAt ?? '',
|
||||
authorName: article.authorName ?? '',
|
||||
titleEn: article.titleEn ?? '',
|
||||
contentEn: article.contentEn ?? '',
|
||||
}),
|
||||
})
|
||||
articles.push((await response.json()) as TestArticle)
|
||||
|
||||
Reference in New Issue
Block a user