Triển khai i18next client, server component (ok)

Step 1: Thực hiện 1 trang ở app

app\[lang]\layout.tsx

import { ReactNode } from 'react';
import LanguageSwitcher from '@/src/components/LanguageSwitcher'
interface RootLayoutProps {
  children: ReactNode;
}
export default async function RootLayout({ children }: RootLayoutProps) {
  return (
    <>
      <header className="flex justify-end p-4">
        <LanguageSwitcher />
      </header>
      {children}
    </>
  );
}

app\[lang]\page.tsx

import ClientComponent from '@/src/components/ClientComponent';
import initI18next from '@/src/lib/i18n/server';
import { fallbackLng, languages } from '@/src/lib/i18n/settings';
export default async function Page({ params }: { params: { lang: string } }) {
  const {lang} = await params;
  const glang = languages.includes(lang) ? lang : fallbackLng;
  const i18n = await initI18next(glang, 'common');
  const t = i18n.getFixedT(lang, 'common');
  console.log('Server: lang=', glang, 't(hello)=', t('hello'));
  return (
    <>
      <ClientComponent lang={glang} />
      <h1>{t('hello')}</h1>
    </>
  );
}

app\layout.tsx

src\components\ClientComponent.tsx

src\components\LanguageSwitcher.tsx

src\lib\i18n\client.ts

src\lib\i18n\server.ts

src\lib\i18n\settings.ts

next.config.ts

src\locales\en\common.json

src\locales\vi\common.json

Step 2: Thực hiện 1 trang ở pages

app\[lang]\layout.tsx

app\[lang]\page.tsx

pages\[lang]\new-page.tsx

src\components\ClientComponent.tsx

src\components\LanguageSwitcher.tsx

src\lib\i18n\client.ts

src\lib\i18n\server.ts

src\lib\i18n\settings.ts

Source code (kiểm tra đã hoạt động tốt app và pages)

file-archive
39KB

Step 3: Để tạo một ClientComponent không sử dụng 'use client' mà vẫn hỗ trợ đa ngôn ngữ (i18n)

Để tạo một ClientComponent không sử dụng 'use client' mà vẫn hỗ trợ đa ngôn ngữ (i18n), bạn cần:

  • Không sử dụng hook như useTranslation() (vì hook chỉ dùng trong client component).

  • Truyền dữ liệu dịch (t) từ server xuống dưới dạng prop.

  • Hoặc tạo một function component async (server component) mà không cần hook.

src\components\TranslatedComponent.tsx

app\[lang]\page.tsx

file-archive
39KB

Cách chuyển localhost:3000 sang localhost:3000/en

app\page.tsx

file-archive
39KB

Last updated