Skip to content

Commit ad1a6be

Browse files
committed
feat: add new frequent questions pages
1 parent 6b31c64 commit ad1a6be

File tree

204 files changed

+655
-408
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

204 files changed

+655
-408
lines changed

apps/website/next.config.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,14 @@ const nextConfig: NextConfig = {
251251
source: '/blog/:path*.md',
252252
destination: '/en/blog/raw/:path*?format=txt',
253253
},
254+
{
255+
source: '/:locale/frequent-questions/:path*.md',
256+
destination: '/:locale/frequent-questions/raw/:path*?format=txt',
257+
},
258+
{
259+
source: '/frequent-questions/:path*.md',
260+
destination: '/en/frequent-questions/raw/:path*?format=txt',
261+
},
254262
{
255263
source: '/environment/nextjs/next-with-Page-Router',
256264
destination: '/environment/nextjs/next-with-page-router',
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import { type Dictionary, t } from 'intlayer';
2+
3+
const blogContent = {
4+
key: 'blog-page',
5+
content: {
6+
contribution: {
7+
text: t({
8+
en: 'If you have an idea for improving this blog, please feel free to contribute by submitting a pull request on GitHub.',
9+
'en-GB':
10+
'If you have an idea for improving this blog, please feel free to contribute by submitting a pull request on GitHub.',
11+
fr: 'Si vous avez une idée d’amélioration pour améliorer cette blog, n’hésitez pas à contribuer en submitant une pull request sur GitHub.',
12+
es: 'Si tienes una idea para mejorar esta blogumentación, no dudes en contribuir enviando una pull request en GitHub.',
13+
de: 'Wenn Sie eine Idee haben, um diese Dokumentation zu verbessern, zögern Sie bitte nicht, durch das Einreichen eines Pull-Requests auf GitHub beizutragen.',
14+
ja: 'このドキュメントを改善するアイデアがある場合は、GitHubでプルリクエストを送信することで自由に貢献してください。',
15+
ko: '이 문서를 개선할 아이디어가 있으시면 GitHub에 풀 리퀘스트를 제출하여 자유롭게 기여해 주세요.',
16+
zh: '如果您有改善此文档的想法,请随时通过在GitHub上提交拉取请求来贡献。',
17+
it: 'Se hai un’idea per migliorare questa blogumentazione, non esitare a contribuire inviando una pull request su GitHub.',
18+
pt: 'Se você tiver uma ideia para melhorar esta blogumentação, sinta-se à vontade para contribuir enviando uma pull request no GitHub.',
19+
hi: 'अगर आपके पास इस दस्तावेज़ को सुधारने के लिए कोई विचार है, तो कृपया GitHub पर एक पुल अनुरोध सबमिट करके योगदान देने में संकोच न करें।',
20+
ar: 'إذا كان لديك فكرة لتحسين هذه الوثيقة، فلا تتردد في المساهمة من خلال تقديم طلب سحب على GitHub.',
21+
ru: 'Если у вас есть идея по улучшению этой документации, не стесняйтесь внести свой вклад, подав запрос на вытягивание на GitHub.',
22+
tr: 'Bu belgeyi geliştirmek için bir fikriniz varsa, lütfen GitHub’da bir çekme isteği göndererek katkıda bulunun.',
23+
pl: 'Jeśli masz pomysł na ulepszenie tego bloga, możesz wnieść wkład, przesyłając pull request na GitHub.',
24+
id: 'Jika Anda memiliki ide untuk meningkatkan blog ini, silakan berkontribusi dengan mengajukan pull request di GitHub.',
25+
vi: 'Nếu bạn có ý tưởng để cải thiện blog này, xin vui lòng đóng góp bằng cách gửi pull request trên GitHub.',
26+
}),
27+
button: t({
28+
en: 'GitHub link to the blog',
29+
'en-GB': 'GitHub link to the blog',
30+
fr: 'Lien GitHub du blog',
31+
es: 'Enlace de GitHub al blog',
32+
de: 'GitHub-Link zum Blog',
33+
ja: 'ブログへのGitHubリンク',
34+
ko: '블로그에 대한 GitHub 링크',
35+
zh: '博客的 GitHub 链接',
36+
it: 'Collegamento GitHub al blog',
37+
pt: 'Link do GitHub para o blog',
38+
hi: 'ब्लॉग के लिए GitHub लिंक',
39+
ar: 'رابط GitHub للمدونة',
40+
ru: 'Ссылка на блог GitHub',
41+
tr: 'Blog için GitHub bağlantısı',
42+
pl: 'Link do bloga na GitHubie',
43+
id: 'Tautan GitHub ke blog',
44+
vi: 'Liên kết GitHub tới blog',
45+
}),
46+
buttonLabel: t({
47+
en: 'Click here to contribute',
48+
'en-GB': 'Click here to contribute',
49+
fr: 'Cliquez ici pour contribuer',
50+
es: 'Haga clic aquí para contribuir',
51+
de: 'Klicken Sie hier, um beizutragen',
52+
ja: '貢献するにはここをクリックしてください',
53+
ko: '기여하려면 여기를 클릭하세요',
54+
zh: '点击这里贡献',
55+
it: 'Clicca qui per contribuire',
56+
pt: 'Clique aqui para contribuir',
57+
hi: 'योगदान देने के लिए यहाँ क्लिक करें',
58+
ar: 'انقر هنا للمساهمة',
59+
ru: 'Нажмите здесь, чтобы внести свой вклад',
60+
tr: 'Katkıda bulunmak için buraya tıklayın',
61+
pl: 'Kliknij tutaj, aby wnieść wkład',
62+
id: 'Klik di sini untuk berkontribusi',
63+
vi: 'Nhấp vào đây để đóng góp',
64+
}),
65+
},
66+
goToNextSection: {
67+
label: t({
68+
en: 'Go to next section',
69+
'en-GB': 'Go to next section',
70+
fr: 'Aller à la section suivante',
71+
es: 'Ir a la siguiente sección',
72+
de: 'Gehe zum nächsten Abschnitt',
73+
ja: '次のセクションに移動',
74+
ko: '다음 섹션으로 이동',
75+
zh: '转到下一个部分',
76+
it: 'Vai alla sezione successiva',
77+
pt: 'Ir para a próxima seção',
78+
hi: 'अगला अनुभाग पर जाएं',
79+
ar: 'اذهب إلى القسم التالي',
80+
ru: 'Перейти к следующей секции',
81+
tr: 'Sonraki bölüme git',
82+
pl: 'Przejdź do następnej sekcji',
83+
id: 'Lanjut ke bagian berikutnya',
84+
vi: 'Đi tới phần tiếp theo',
85+
}),
86+
},
87+
goToPreviousSection: {
88+
label: t({
89+
en: 'Go to previous section',
90+
'en-GB': 'Go to previous section',
91+
fr: 'Aller à la section précédente',
92+
es: 'Ir a la sección anterior',
93+
de: 'Gehe zum vorherigen Abschnitt',
94+
ja: '前のセクションに移動',
95+
ko: '이전 섹션으로 이동',
96+
zh: '转到上一个部分',
97+
it: 'Vai alla sezione precedente',
98+
pt: 'Ir para a seção anterior',
99+
hi: 'पिछला अनुभाग पर जाएं',
100+
ar: 'اذهب إلى القسم السابق',
101+
ru: 'Перейти к предыдущей секции',
102+
tr: 'Önceki bölüme git',
103+
pl: 'Przejdź do poprzedniej sekcji',
104+
id: 'Kembali ke bagian sebelumnya',
105+
vi: 'Quay lại phần trước',
106+
}),
107+
},
108+
},
109+
title: 'Blog page content',
110+
description:
111+
'Content declarations for the blog page, including navigation labels and contribution call-to-action. Used to handle multilingual support for blog-related sections.',
112+
tags: ['blog page', 'content section', 'navigation'],
113+
} satisfies Dictionary;
114+
115+
export default blogContent;
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { getBlogMetadataBySlug } from '@intlayer/docs';
2+
import { getLocalizedUrl, getMultilingualUrls, Locales } from 'intlayer';
3+
import type { Metadata } from 'next';
4+
import type { LocalPromiseParams, NextLayoutIntlayer } from 'next-intlayer';
5+
6+
export type FrequentQuestionProps = {
7+
slugs: string[];
8+
};
9+
10+
export type FrequentQuestionPageProps =
11+
LocalPromiseParams<FrequentQuestionProps>;
12+
13+
export const generateStaticParams = async () => {
14+
const blogMetadata = await getBlogMetadataBySlug([]);
15+
16+
const slugList: string[][] = blogMetadata.map((meta) => meta.slugs);
17+
18+
return slugList;
19+
};
20+
21+
export const generateMetadata = async ({
22+
params,
23+
}: FrequentQuestionPageProps): Promise<Metadata> => {
24+
const { locale, slugs } = await params;
25+
26+
const blogsData = await getBlogMetadataBySlug(
27+
['frequent-questions', ...(slugs ?? [])],
28+
locale,
29+
true
30+
);
31+
32+
const filteredBlogsData = blogsData.filter(
33+
(blog) => blog.slugs.length === slugs.length + 1
34+
);
35+
36+
if (!filteredBlogsData || filteredBlogsData.length === 0) {
37+
return {};
38+
}
39+
40+
const questionData = filteredBlogsData[0];
41+
42+
const absoluteUrl = questionData.url;
43+
const relativeUrl = questionData.relativeUrl;
44+
45+
return {
46+
title: `${questionData.title} | Intlayer`,
47+
description: questionData.description,
48+
keywords: questionData.keywords,
49+
alternates: {
50+
canonical: getLocalizedUrl(relativeUrl, Locales.ENGLISH),
51+
languages: {
52+
...getMultilingualUrls(relativeUrl),
53+
'x-default': getLocalizedUrl(relativeUrl, Locales.ENGLISH),
54+
},
55+
types: {
56+
'text/markdown': `${getLocalizedUrl(relativeUrl, locale)}.md`,
57+
},
58+
},
59+
openGraph: {
60+
url: getLocalizedUrl(absoluteUrl, locale),
61+
title: `${questionData.title} | Intlayer`,
62+
description: questionData.description,
63+
},
64+
};
65+
};
66+
67+
const FrequentQuestionLayout: NextLayoutIntlayer = ({ children }) => {
68+
return children;
69+
};
70+
71+
export default FrequentQuestionLayout;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { DocumentationRender } from '@components/DocPage/DocumentationRender';
2+
import {
3+
type FrequentQuestionKey,
4+
getFrequentQuestion,
5+
getFrequentQuestionMetadataBySlug,
6+
} from '@intlayer/docs';
7+
import { urlRenamer } from '@utils/markdown';
8+
import { redirect } from 'next/navigation';
9+
import type { LocalPromiseParams } from 'next-intlayer';
10+
import { IntlayerServerProvider } from 'next-intlayer/server';
11+
import { PagesRoutes } from '@/Routes';
12+
import type { FrequentQuestionProps } from './layout';
13+
14+
const FrequentQuestionPage = async ({
15+
params,
16+
}: LocalPromiseParams<FrequentQuestionProps>) => {
17+
const { locale, slugs } = await params;
18+
const frequentQuestionsData = await getFrequentQuestionMetadataBySlug(
19+
slugs,
20+
locale
21+
);
22+
console.log({ frequentQuestionsData });
23+
24+
const filteredBlogsData = frequentQuestionsData.filter(
25+
(blog) => blog.slugs.length === slugs.length + 1
26+
);
27+
28+
if (!filteredBlogsData || filteredBlogsData.length === 0) {
29+
return redirect(PagesRoutes.Doc);
30+
}
31+
32+
const frequentQuestionData = filteredBlogsData[0];
33+
34+
const file = await getFrequentQuestion(
35+
frequentQuestionData?.docKey as FrequentQuestionKey,
36+
locale
37+
);
38+
39+
const blogContent = urlRenamer(file, locale);
40+
41+
return (
42+
<IntlayerServerProvider locale={locale}>
43+
<div className="mx-auto max-w-2xl">
44+
<DocumentationRender>{blogContent}</DocumentationRender>
45+
</div>
46+
</IntlayerServerProvider>
47+
);
48+
};
49+
50+
export default FrequentQuestionPage;

0 commit comments

Comments
 (0)