Create a new Next.js App Router page with locale support and Server/Client Component decision
Creates a properly structured page in the Next.js 16 App Router with full internationalization support using next-intl.
/create-page [page-path] [--client] [--with-form] [--with-query]
--client): Only for interactive pages with hooks like useState, useReducer, useContextPlace file at: src/app/[locale]/[page-path]/page.jsx
Server Component Template:
import { getTranslations } from 'next-intl/server';
export const metadata = {
title: 'Page Title',
};
export default async function Page() {
const t = await getTranslations('PageNamespace');
return (
<div className="container mx-auto py-8">
<h1 className="text-3xl font-bold">{t('title')}</h1>
<p className="text-gray-600 mt-2">{t('description')}</p>
</div>
);
}
Client Component Template (if --client):
'use client';
import { useTranslations } from 'next-intl';
import { useState } from 'react';
export default function Page() {
const t = useTranslations('PageNamespace');
const [state, setState] = useState(null);
return (
<div className="container mx-auto py-8">
<h1 className="text-3xl font-bold">{t('title')}</h1>
</div>
);
}
Add to src/i18n/messages/en.json:
{
"PageNamespace": {
"title": "Page Title",
"description": "Page description"
}
}
Also add matching keys to:
src/i18n/messages/zh-Hans.jsonsrc/i18n/messages/vi.jsonsrc/i18n/messages/ne.jsonFor interactive elements, use components from modules:
import { Header } from '@/modules/core/components';
import { useUserData } from '@/modules/users/hooks';
src/app/[locale]/[page-path]/page.jsxgetTranslations() (server) or useTranslations() (client)@/ prefix (no relative imports)import { getTranslations } from 'next-intl/server';
import { UserCard } from '@/modules/users/components';
export default async function UsersPage() {
const t = await getTranslations('Users');
return (
<div className="space-y-6">
<h1>{t('title')}</h1>
<UserCard />
</div>
);
}
// src/app/[locale]/items/[id]/page.jsx
export async function generateStaticParams() {
return [{ id: '1' }, { id: '2' }];
}
export default async function ItemPage({ params }) {
const { id } = await params;
return <div>Item: {id}</div>;
}
../pages/)globals.css or Tailwind