@@ -5,7 +5,9 @@ import { renderToPipeableStream } from "react-dom/server";
55import { RemixServer } from "@remix-run/react" ;
66import { Response } from "@remix-run/node" ; // or cloudflare/deno
77import type { EntryContext , Headers } from "@remix-run/node" ; // or cloudflare/deno
8+ import { parseAcceptLanguage } from "intl-parse-accept-language" ;
89import isbot from "isbot" ;
10+ import { LocaleContextProvider } from "./components/LocaleProvider" ;
911
1012const ABORT_DELAY = 30000 ;
1113
@@ -15,6 +17,11 @@ export default function handleRequest(
1517 responseHeaders : Headers ,
1618 remixContext : EntryContext
1719) {
20+ const acceptLanguage = request . headers . get ( "accept-language" ) ;
21+ const locales = parseAcceptLanguage ( acceptLanguage , {
22+ validate : Intl . DateTimeFormat . supportedLocalesOf ,
23+ } ) ;
24+
1825 // If the request is from a bot, we want to wait for the full
1926 // response to render before sending it to the client. This
2027 // ensures that bots can see the full page content.
@@ -23,31 +30,36 @@ export default function handleRequest(
2330 request ,
2431 responseStatusCode ,
2532 responseHeaders ,
26- remixContext
33+ remixContext ,
34+ locales
2735 ) ;
2836 }
2937
3038 return serveBrowsers (
3139 request ,
3240 responseStatusCode ,
3341 responseHeaders ,
34- remixContext
42+ remixContext ,
43+ locales
3544 ) ;
3645}
3746
3847function serveTheBots (
3948 request : Request ,
4049 responseStatusCode : number ,
4150 responseHeaders : Headers ,
42- remixContext : EntryContext
51+ remixContext : EntryContext ,
52+ locales : string [ ]
4353) {
4454 return new Promise ( ( resolve , reject ) => {
4555 const { pipe, abort } = renderToPipeableStream (
46- < RemixServer
47- context = { remixContext }
48- url = { request . url }
49- abortDelay = { ABORT_DELAY }
50- /> ,
56+ < LocaleContextProvider locales = { locales } >
57+ < RemixServer
58+ context = { remixContext }
59+ url = { request . url }
60+ abortDelay = { ABORT_DELAY }
61+ />
62+ </ LocaleContextProvider > ,
5163 {
5264 // Use onAllReady to wait for the entire document to be ready
5365 onAllReady ( ) {
@@ -74,16 +86,19 @@ function serveBrowsers(
7486 request : Request ,
7587 responseStatusCode : number ,
7688 responseHeaders : Headers ,
77- remixContext : EntryContext
89+ remixContext : EntryContext ,
90+ locales : string [ ]
7891) {
7992 return new Promise ( ( resolve , reject ) => {
8093 let didError = false ;
8194 const { pipe, abort } = renderToPipeableStream (
82- < RemixServer
83- context = { remixContext }
84- url = { request . url }
85- abortDelay = { ABORT_DELAY }
86- /> ,
95+ < LocaleContextProvider locales = { locales } >
96+ < RemixServer
97+ context = { remixContext }
98+ url = { request . url }
99+ abortDelay = { ABORT_DELAY }
100+ />
101+ </ LocaleContextProvider > ,
87102 {
88103 // use onShellReady to wait until a suspense boundary is triggered
89104 onShellReady ( ) {
0 commit comments