Compare commits

...

2 Commits

3 changed files with 35 additions and 24 deletions
@@ -1,19 +1,14 @@
--- ---
status: testing status: complete
phase: 05-nuxt-content-setup-renderer phase: 05-nuxt-content-setup-renderer
source: [05-01-SUMMARY.md, 05-02-SUMMARY.md] source: [05-01-SUMMARY.md, 05-02-SUMMARY.md]
started: 2026-04-21T00:00:00.000Z started: 2026-04-21T00:00:00.000Z
updated: 2026-04-21T00:00:00.000Z updated: 2026-04-21T21:30:00.000Z
--- ---
## Current Test ## Current Test
number: 3 [testing complete]
name: Images optimisées via NuxtImg
expected: |
Sur `/test`, l'image référencée dans l'article est visible (pas de 404).
L'élément DOM rendu est `<img>` avec attribut `loading="lazy"`.
awaiting: user response
## Tests ## Tests
@@ -38,22 +33,40 @@ expected: Sur `/test`, les 4 callouts `::alert{type}` sont rendus comme des boî
result: pass result: pass
### 6. Articles bilingues accessibles ### 6. Articles bilingues accessibles
expected: Les articles de test existent pour FR et EN. Naviguer vers `/blog/test-kotlin-syntax` (FR) et `/en/blog/test-kotlin-syntax` (EN) — les deux pages chargent sans 404. expected: Les articles de test existent pour FR et EN. Naviguer vers `/fr/blog/test-kotlin-syntax` (FR) et `/en/blog/test-kotlin-syntax` (EN) — les deux pages chargent sans 404.
result: [pending] result: issue
reported: "both empty page, nav and footer there but no content — Vue warn: Component <Anonymous> is missing template or render function at <RouteProvider key=\"/fr/blog/test-kotlin-syntax\">. <main> SSR renders empty: `<main class=\"flex-1\"><!--[--><!----><!--]--></main>`. Same behavior FR and EN."
severity: major
### 7. Collections @nuxt/content configurées ### 7. Collections @nuxt/content configurées
expected: Le fichier `content.config.ts` définit `blog_fr` et `blog_en`. `queryCollection('blog_fr')` retourne les articles FR. Vérifiable via le bon rendu de `/test` (qui query `blog_fr`). expected: Le fichier `content.config.ts` définit `blog_fr` et `blog_en`. `queryCollection('blog_fr')` retourne les articles FR. Vérifiable via le bon rendu de `/test` (qui query `blog_fr`).
result: [pending] result: issue
reported: "/test donne 404. Route `/test` supprimée/déplacée par commit 7cd1531 'fix(05): update test.vue path to /fr/blog prefix' — donc plus de page showcase standalone, et les routes blog prefixées elles-mêmes sont cassées (cf Test 6)."
severity: major
## Summary ## Summary
total: 7 total: 7
passed: 0 passed: 5
issues: 0 issues: 2
pending: 7 pending: 0
skipped: 0 skipped: 0
blocked: 0 blocked: 0
## Gaps ## Gaps
[none yet] - truth: "Les articles FR/EN du blog doivent se rendre au chemin `/fr/blog/test-kotlin-syntax` et `/en/blog/test-kotlin-syntax` avec le contenu markdown dans `<main>`."
status: failed
reason: "User reported: both empty page, nav and footer there but no content. Vue warn in SSR log: Component <Anonymous> is missing template or render function at <RouteProvider key=\"/fr/blog/test-kotlin-syntax\">. <main class=\"flex-1\"> rendered empty. Non-blocking i18n baseUrl warning also present but unrelated. Same behavior both locales."
severity: major
test: 6
artifacts: []
missing: []
- truth: "La page query `blog_fr` doit être routable (historiquement `/test`, depuis commit 7cd1531 déplacée sous `/fr/blog`) et rendre le contenu markdown."
status: failed
reason: "User reported: /test donne 404. Le commit 7cd1531 a migré test.vue vers le préfixe /fr/blog, mais les routes prefixées sont elles-mêmes cassées (cf gap Test 6)."
severity: major
test: 7
artifacts: []
missing: []
@@ -2,14 +2,14 @@
const { locale } = useI18n() const { locale } = useI18n()
const route = useRoute() const route = useRoute()
const slug = Array.isArray(route.params.slug) ? route.params.slug.join('/') : route.params.slug const slug = route.params.slug as string
const isFr = locale.value === 'fr' const isFr = locale.value === 'fr'
const collection = isFr ? 'blog_fr' : 'blog_en'
// blog_fr prefix = /fr/blog, blog_en prefix = /en/blog (aligned with content.config.ts)
const path = isFr ? `/fr/blog/${slug}` : `/en/blog/${slug}` const path = isFr ? `/fr/blog/${slug}` : `/en/blog/${slug}`
const { data: page } = await useAsyncData(`blog-${locale.value}-${slug}`, () => const { data: page } = await useAsyncData(`blog-${locale.value}-${slug}`, () =>
queryCollection(collection).path(path).first() isFr
? queryCollection('blog_fr').path(path).first()
: queryCollection('blog_en').path(path).first()
) )
if (!page.value) { if (!page.value) {
+3 -5
View File
@@ -34,6 +34,7 @@ export default defineNuxtConfig({
i18n: { i18n: {
strategy: 'prefix', strategy: 'prefix',
defaultLocale: 'fr', defaultLocale: 'fr',
baseUrl: 'https://killiandalcin.fr',
locales: [ locales: [
{ code: 'fr', language: 'fr-FR', file: 'fr.json' }, { code: 'fr', language: 'fr-FR', file: 'fr.json' },
{ code: 'en', language: 'en-US', file: 'en.json' }, { code: 'en', language: 'en-US', file: 'en.json' },
@@ -42,7 +43,8 @@ export default defineNuxtConfig({
detectBrowserLanguage: { detectBrowserLanguage: {
useCookie: true, useCookie: true,
cookieKey: 'i18n_redirected', cookieKey: 'i18n_redirected',
redirectOn: 'root', redirectOn: 'no prefix',
fallbackLocale: 'fr',
}, },
}, },
runtimeConfig: { runtimeConfig: {
@@ -59,10 +61,6 @@ export default defineNuxtConfig({
gtag: { gtag: {
enabled: !import.meta.dev, enabled: !import.meta.dev,
}, },
routeRules: {
'/blog': { redirect: { to: '/fr/blog', statusCode: 301 } },
'/blog/**': { redirect: { to: '/fr/blog', statusCode: 301 } },
},
content: { content: {
build: { build: {
markdown: { markdown: {