# Fix à faire — PWA manifest multilingue

## Problème

`app/manifest.ts` n'est supportée qu'à la racine de `app/` (file convention Next.js). Une version dans `app/[locale]/manifest.ts` est silencieusement ignorée par Next 16 — aucune route générée au build.

Conséquence : un seul manifest pour tout le site, en `defaultLocale` (`en`). Les utilisateurs `/fr/...` qui ajoutent l'app en PWA récupèrent un manifest avec `lang: "en"` et `description` en anglais.

## Workaround validé

Remplacer `app/manifest.ts` par un Route Handler à `app/manifest.webmanifest/route.ts` qui négocie la langue via :

- cookie `NEXT_LOCALE` posé par next-intl (priorité 1)
- header `Accept-Language` (priorité 2)
- fallback `defaultLocale`

Squelette :

```ts
import { cookies, headers } from "next/headers";
import { getTranslations } from "next-intl/server";
import { hasLocale, type Locale } from "next-intl";
import { site } from "@/config/site";
import { routing } from "@/i18n/routing";

export async function GET() {
  const cookieStore = await cookies();
  const hdrs = await headers();

  const fromCookie = cookieStore.get("NEXT_LOCALE")?.value;
  const fromHeader = hdrs.get("accept-language")?.split(",")[0]?.split("-")[0];
  const candidate = fromCookie ?? fromHeader ?? routing.defaultLocale;
  const locale: Locale = hasLocale(routing.locales, candidate) ? candidate : routing.defaultLocale;

  const t = await getTranslations({ locale, namespace: "LocaleLayout" });

  return Response.json(
    {
      id: "/",
      name: site.name,
      short_name: site.shortName,
      description: t("description"),
      start_url: locale === routing.defaultLocale ? "/" : `/${locale}`,
      display: "standalone",
      background_color: site.backgroundColor,
      theme_color: site.themeColor,
      lang: locale,
      icons: [{ src: "/favicon.ico", sizes: "any", type: "image/x-icon" }],
    },
    {
      headers: {
        "Content-Type": "application/manifest+json",
        "Cache-Control": "public, max-age=3600, s-maxage=86400",
        Vary: "Accept-Language, Cookie",
      },
    },
  );
}
```

Puis supprimer `src/app/manifest.ts`.

## Caveats

- Le manifest n'est plus pré-rendu statique — chaque request est dynamique. Mais `Cache-Control` + `Vary` permettent le caching edge par langue.
- Le `<link rel="manifest" href="/manifest.webmanifest">` injecté par Next ne change pas — il continue de pointer vers `/manifest.webmanifest`.
- Tester avec Chrome DevTools > Application > Manifest pour vérifier que la bonne langue est servie selon le cookie/header.

## Pourquoi pas maintenant

Le ROI est faible tant que la PWA n'est pas une priorité utilisateur. À reprendre quand on activera le mode standalone pour de vrai (icons multi-tailles, splash screens, install banner, etc.).

## Origine

Recommandation issue de l'audit SEO (Agy/Antigravity, mai 2026). Note Vercel/Gemini : les autres reviewers n'ont pas signalé ce point comme blocker.
