58 lines
1.4 KiB
TypeScript
58 lines
1.4 KiB
TypeScript
import { GetServerSideProps } from "next";
|
|
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
|
|
import { i18n } from "next-i18next.config";
|
|
import { getToken } from "next-auth/jwt";
|
|
import { prisma } from "../api/db";
|
|
|
|
const getServerSideProps: GetServerSideProps = async (ctx) => {
|
|
const acceptLanguageHeader = ctx.req.headers["accept-language"];
|
|
const availableLanguages = i18n.locales;
|
|
|
|
const token = await getToken({ req: ctx.req });
|
|
|
|
if (token) {
|
|
const user = await prisma.user.findUnique({
|
|
where: {
|
|
id: token.id,
|
|
},
|
|
});
|
|
|
|
if (user) {
|
|
return {
|
|
props: {
|
|
...(await serverSideTranslations(user.locale ?? "en", ["common"])),
|
|
},
|
|
};
|
|
}
|
|
}
|
|
|
|
const acceptedLanguages = acceptLanguageHeader
|
|
?.split(",")
|
|
.map((lang) => lang.split(";")[0]);
|
|
|
|
let bestMatch = acceptedLanguages?.find((lang) =>
|
|
availableLanguages.includes(lang)
|
|
);
|
|
|
|
if (!bestMatch) {
|
|
acceptedLanguages?.some((acceptedLang) => {
|
|
const partialMatch = availableLanguages.find((lang) =>
|
|
lang.startsWith(acceptedLang)
|
|
);
|
|
if (partialMatch) {
|
|
bestMatch = partialMatch;
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
|
|
return {
|
|
props: {
|
|
...(await serverSideTranslations(bestMatch ?? "en", ["common"])),
|
|
},
|
|
};
|
|
};
|
|
|
|
export default getServerSideProps;
|