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)

39KB
Open

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

39KB
Open

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

app\page.tsx

39KB
Open

Last updated

Was this helpful?