Hello everyone,
I am here to find some help. I am a student and have to build a multilingual news application for my final year project.
I am trying hard to create application by myself but it is really frustrating me. After watching so many tutorials and documentation from Strapi and Next.js, i feel that i could never make the application.
I don’t want to get failed in my project. Any kind of help will be appreciated.
Regards.
Hello Ahmad ![]()
If you need inspiration, feel free to check the source code of our current demo application: FoodAdvisor. It’s an application listing restaurants, reviews, blog posts, and some landing pages. It has a multilingual system paired with Strapi i18n feature ![]()
You can create something similiar:
-
Strapi
You just need to create a “new” (news in plural) collection type with i18n activated.
Don’t forget to open the permission so that Next.js can fetch them. -
Next.js
Create a simple page that will list all your news + another that will display a singular new.
news
[slug].js
index.js
Very basic code for that without i18n managed (you would need to implement it):
// news/index.js
import { useEffect, useState } from 'react';
import Link from 'next/link';
const NewsIndex = () => {
const [news, setNews] = useState([]);
useEffect(() => {
const fetchNews = async () => {
const response = await fetch('http://localhost:1337/api/news');
const data = await response.json();
setNews(data.data);
};
fetchNews();
}, []);
return (
<div>
<h1>News</h1>
<ul>
{news.map((article) => (
<li key={article.id}>
<Link href={`/news/${article.attributes.slug}`}>
<a>{article.attributes.title}</a>
</Link>
</li>
))}
</ul>
</div>
);
};
export default NewsIndex;
// news/[slug].js
import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';
const NewsArticle = () => {
const router = useRouter();
const { slug } = router.query;
const [article, setArticle] = useState(null);
useEffect(() => {
if (!slug) return;
const fetchArticle = async () => {
const response = await fetch(`http://localhost:1337/api/news?filters[slug][$eq]=${slug}`);
const data = await response.json();
setArticle(data.data[0]);
};
fetchArticle();
}, [slug]);
if (!article) return <div>Loading...</div>;
return (
<div>
<h1>{article.attributes.title}</h1>
<p>{article.attributes.content}</p>
</div>
);
};
export default NewsArticle;
Hope it helps!