webapp/src/renderer/_default.page.server.tsx

71 lines
2.0 KiB
TypeScript
Raw Normal View History

2023-02-17 09:21:02 +00:00
import { generateHydrationScript, renderToString } from 'solid-js/web'
import { escapeInject, dangerouslySkipEscape } from 'vite-plugin-ssr/server'
2023-02-17 09:21:02 +00:00
import { App } from '../components/App'
import { initRouter } from '../stores/router'
import type { PageContext } from './types'
import { MetaProvider, renderTags } from '@solidjs/meta'
2023-05-01 18:32:32 +00:00
import i18next, { changeLanguage, init as initI18next } from 'i18next'
2023-02-17 09:21:02 +00:00
import ru from '../../public/locales/ru/translation.json'
import en from '../../public/locales/en/translation.json'
import type { Language } from '../context/localize'
export const passToClient = ['pageProps', 'lng', 'documentProps']
const metaTags = []
const getLng = (pageContext: PageContext): Language => {
const { urlParsed, cookies } = pageContext
if (urlParsed.search.lng) {
return urlParsed.search.lng === 'en' ? 'en' : 'ru'
}
if (cookies?.lng === 'en') {
return 'en'
}
return 'ru'
}
export const render = async (pageContext: PageContext) => {
const lng = getLng(pageContext)
if (!i18next.isInitialized) {
2023-05-01 18:32:32 +00:00
// eslint-disable-next-line import/no-named-as-default-member
await initI18next({
2023-02-17 09:21:02 +00:00
// debug: true,
supportedLngs: ['ru', 'en'],
fallbackLng: lng,
initImmediate: false,
lng,
resources: {
ru: { translation: ru },
en: { translation: en }
}
})
} else if (i18next.language !== lng) {
2023-05-01 18:32:32 +00:00
await changeLanguage(lng)
2023-02-17 09:21:02 +00:00
}
initRouter(pageContext.urlParsed.pathname, pageContext.urlParsed.search)
pageContext.lng = lng
const rootContent = renderToString(() => (
<MetaProvider tags={metaTags}>
<App {...pageContext.pageProps} />
</MetaProvider>
))
return escapeInject`<!DOCTYPE html>
<html lang="${lng}">
<head>
${dangerouslySkipEscape(renderTags(metaTags))}
${dangerouslySkipEscape(generateHydrationScript())}
</head>
<body>
<div id="root">${dangerouslySkipEscape(rootContent)}</div>
</body>
</html>`
}