Skip to content

Commit 381565c

Browse files
committed
[optimize] i18n SEO based on URL parameter (fix idea2app/MobX-i18n#9)
1 parent df14cd9 commit 381565c

File tree

6 files changed

+44
-21
lines changed

6 files changed

+44
-21
lines changed

models/Translation.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import {
22
loadLanguageMapFrom,
3+
parseCookie,
34
TranslationMap,
45
TranslationModel,
56
} from 'mobx-i18n';
7+
import { DataObject } from 'mobx-restful';
8+
import { NextPageContext } from 'next';
69
import { createContext } from 'react';
710

811
import zhCN from '../translation/zh-CN';
@@ -43,4 +46,27 @@ export const LanguageName: Record<LanguageCode, string> = {
4346

4447
export const I18nContext = createContext(i18n);
4548

46-
export const loadSSRLanguage = loadLanguageMapFrom.bind(null, i18nData);
49+
export const parseSSRContext = <T extends DataObject = DataObject>(
50+
{ req, query }: NextPageContext,
51+
queryKeys: (keyof T)[] = [],
52+
) => {
53+
const cookie = parseCookie(req?.headers.cookie || '') as T;
54+
55+
for (const key of queryKeys)
56+
cookie[key] =
57+
(query[key as string]?.toString().split(',')[0] as T[keyof T]) ||
58+
cookie[key];
59+
60+
return cookie;
61+
};
62+
63+
export const loadSSRLanguage = (context: NextPageContext) => {
64+
const { headers } = context.req || {},
65+
{ language } = parseSSRContext(context, ['language']);
66+
const header = {
67+
...headers,
68+
...(language ? { cookie: `language=${language}` } : {}),
69+
};
70+
71+
return loadLanguageMapFrom(i18nData, header);
72+
};

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"lodash": "^4.17.21",
3333
"mobx": "^6.13.7",
3434
"mobx-github": "^0.3.5",
35-
"mobx-i18n": "^0.7.0",
35+
"mobx-i18n": "^0.7.1",
3636
"mobx-react": "^9.2.0",
3737
"mobx-react-helper": "^0.3.6",
3838
"mobx-restful": "^2.1.0",

pages/_app.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ globalThis.addEventListener?.('unhandledrejection', ({ reason }) => {
3131
});
3232

3333
@observer
34-
export default class AppShell extends App<I18nProps> {
34+
export default class CustomApp extends App<I18nProps> {
3535
static async getInitialProps(context: AppContext) {
3636
return {
3737
...(await App.getInitialProps(context)),
38-
...(await loadSSRLanguage(context.ctx.req!.headers)),
38+
...(await loadSSRLanguage(context.ctx)),
3939
};
4040
}
4141

pages/_document.tsx

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { parseCookie } from 'mobx-i18n';
21
import Document, {
32
DocumentContext,
43
Head,
@@ -7,21 +6,19 @@ import Document, {
76
NextScript,
87
} from 'next/document';
98

10-
import type { LanguageCode } from '../models/Translation';
9+
import { LanguageCode,parseSSRContext } from '../models/Translation';
1110

12-
interface XDocumentProps {
11+
interface CustomDocumentProps {
1312
language: LanguageCode;
1413
colorScheme: 'light' | 'dark';
1514
}
1615

17-
export default class XDocument extends Document<XDocumentProps> {
16+
export default class CustomDocument extends Document<CustomDocumentProps> {
1817
static async getInitialProps(context: DocumentContext) {
19-
const props = await Document.getInitialProps(context),
20-
{ language = 'zh-CN', colorScheme = 'light' } = parseCookie(
21-
context.req?.headers.cookie || '',
22-
);
23-
24-
return { ...props, language, colorScheme };
18+
return {
19+
...(await Document.getInitialProps(context)),
20+
...parseSSRContext<CustomDocumentProps>(context, ['language']),
21+
};
2522
}
2623

2724
render() {

pages/_error.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export default class CustomError extends Error<I18nProps> {
1919

2020
return {
2121
...(await Error.getInitialProps(context)),
22-
...(await loadSSRLanguage(context.req!.headers)),
22+
...(await loadSSRLanguage(context)),
2323
};
2424
}
2525

pnpm-lock.yaml

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)