如何在使用 App Router 的 Next.js 應用程式中實現國際化
讓您的 React 應用程式更具可及性,並透過國際化 (i18n) 進入新市場。
隨著世界日益全球化,對於網頁開發者來說,建立能夠滿足來自不同國家和文化使用者需求的應用程式變得愈加重要。實現這一目標的關鍵方法之一是國際化(i18n),它允許您調整應用程式以支援不同的語言、貨幣和日期格式。
在本文中,我們將探討如何為您的 React Next.js 應用程式加入具備伺服器端渲染的國際化功能。 TL;DR: 在此查看完整範例。
本指南適用於使用 App Router 的 Next.js 應用程式。
如果您使用的是 Pages Router,請參考此指南。
步驟 1: 安裝一個 i18n 函式庫
要在您的 Next.js 應用程式中實現國際化,我們首先會選擇一個 i18n 函式庫。有幾個熱門的函式庫,包括 next-intl。但在本範例中,我們將使用 TacoTranslate。
TacoTranslate 使用最先進的 AI 自動將您的字串翻譯成任何語言,並且免除您管理 JSON 檔案的繁瑣工作。
讓我們透過終端機使用 npm 來安裝它:
npm install tacotranslate
步驟 2: 創建一個免費的 TacoTranslate 帳號
現在您已經安裝了模組,是時候創建您的 TacoTranslate 帳戶、一個翻譯專案,以及相關的 API 金鑰。在此創建帳戶。 它是免費的,並且 不需要您添加信用卡。
在 TacoTranslate 應用程式的使用者介面中,建立一個專案,然後導航到其 API 金鑰標籤。建立一個 read
金鑰,以及一個 read/write
金鑰。我們將把它們儲存為環境變數。 read
金鑰即為所謂的 public
金鑰,而 read/write
金鑰則為 secret
。例如,您可以將它們加入專案根目錄中的 .env
檔案。
TACOTRANSLATE_PUBLIC_API_KEY=123456
TACOTRANSLATE_SECRET_API_KEY=789010
請務必不要將秘密的 read/write
API 密鑰洩漏到客戶端生產環境。
我們還將添加兩個環境變數:TACOTRANSLATE_DEFAULT_LOCALE
和 TACOTRANSLATE_ORIGIN
。
TACOTRANSLATE_DEFAULT_LOCALE
:預設的後備語系代碼。在本例中,我們將其設為en
表示英文。TACOTRANSLATE_ORIGIN
:存放字串的「資料夾」,例如您的網站網址。在此處閱讀更多關於 origins 的資訊。
TACOTRANSLATE_DEFAULT_LOCALE=en
TACOTRANSLATE_ORIGIN=your-website-url.com
步驟 3: 設定 TacoTranslate
To integrate TacoTranslate with your application, you’ll need to create a client using the API keys from earlier. For example, create a file named /tacotranslate-client.js
.
const {default: createTacoTranslateClient} = require('tacotranslate');
const tacoTranslate = createTacoTranslateClient({
apiKey:
process.env.TACOTRANSLATE_SECRET_API_KEY ??
process.env.TACOTRANSLATE_PUBLIC_API_KEY ??
process.env.TACOTRANSLATE_API_KEY,
projectLocale:
process.env.TACOTRANSLATE_IS_PRODUCTION === 'true'
? process.env.TACOTRANSLATE_PROJECT_LOCALE
: undefined,
});
module.exports = tacoTranslate;
我們將很快自動定義 TACOTRANSLATE_API_KEY
和 TACOTRANSLATE_PROJECT_LOCALE
。
將客戶端創建在一個獨立的檔案中,方便日後再次使用。getLocales
只是一個帶有內建錯誤處理的工具函式。現在,建立一個名為 /app/[locale]/tacotranslate.tsx
的檔案,在那裡我們將實作 TacoTranslate
提供者。
'use client';
import React, {type ReactNode} from 'react';
import {
type TranslationContextProperties,
TacoTranslate as ImportedTacoTranslate,
} from 'tacotranslate/react';
import tacoTranslateClient from '@/tacotranslate-client';
export default function TacoTranslate({
locale,
origin,
localizations,
children,
}: TranslationContextProperties & {
readonly children: ReactNode;
}) {
return (
<ImportedTacoTranslate
client={tacoTranslateClient}
locale={locale}
origin={origin}
localizations={localizations}
>
{children}
</ImportedTacoTranslate>
);
}
請注意 'use client';
,這表示這是一個客戶端元件。
現在,您已經準備好上下文提供者,請創建一個名為 /app/[locale]/layout.tsx
的檔案,這是我們應用程式的根佈局。請注意,這個路徑有一個使用 Dynamic Routes 的資料夾,其中 [locale]
是動態參數。
import React, {type ReactNode} from 'react';
import {type Locale, isRightToLeftLocaleCode} from 'tacotranslate';
import './global.css';
import tacoTranslateClient from '@/tacotranslate-client';
import TacoTranslate from './tacotranslate';
export async function generateStaticParams() {
const locales = await tacoTranslateClient.getLocales();
return locales.map((locale) => ({locale}));
}
type RootLayoutParameters = {
readonly params: Promise<{locale: Locale}>;
readonly children: ReactNode;
};
export default async function RootLayout({params, children}: RootLayoutParameters) {
const {locale} = await params;
const origin = process.env.TACOTRANSLATE_ORIGIN;
const localizations = await tacoTranslateClient.getLocalizations({
locale,
origins: [origin /* , other origins to fetch */],
});
return (
<html lang={locale} dir={isRightToLeftLocaleCode(locale) ? 'rtl' : 'ltr'}>
<body>
<TacoTranslate
locale={locale}
origin={origin}
localizations={localizations}
>
{children}
</TacoTranslate>
</body>
</html>
);
}
首先要注意的是,我們使用了 Dynamic Route
參數 [locale]
來獲取該語言的翻譯。此外,generateStaticParams
確保所有你在專案中啟用的區域代碼都被預先渲染。
現在,讓我們建立第一個頁面!建立一個名為 /app/[locale]/page.tsx
的檔案。
import React from 'react';
import {Translate} from 'tacotranslate/react';
export const revalidate = 60;
export default async function Page() {
return (
<Translate string="Hello, world!" />
);
}
請注意 revalidate
變數,該變數告訴 Next.js 在 60 秒後重新建構頁面,並保持您的翻譯為最新狀態。
步驟4: 實現伺服器端渲染
TacoTranslate 支援伺服器端渲染。這大大提升了使用者體驗,因為會立即顯示已翻譯的內容,而不是先閃現未翻譯的內容。此外,我們可以跳過客戶端的網路請求,因為我們已經擁有使用者正在瀏覽頁面所需的翻譯內容。
要設定伺服器端渲染,請建立或修改 /next.config.js
:
const withTacoTranslate = require('tacotranslate/next/config').default;
const tacoTranslateClient = require('./tacotranslate-client');
module.exports = async () => {
const config = await withTacoTranslate(
{},
{
client: tacoTranslateClient,
isProduction:
process.env.TACOTRANSLATE_ENV === 'production' ||
process.env.VERCEL_ENV === 'production' ||
(!(process.env.TACOTRANSLATE_ENV || process.env.VERCEL_ENV) &&
process.env.NODE_ENV === 'production'),
}
);
// NOTE: Remove i18n from config when using the app router
return {...config, i18n: undefined};
};
修改 isProduction
檢查以適合您的設置。如果 true
,TacoTranslate 將顯示公有 API 金鑰。如果我們在本地、測試或暫存環境 (isProduction
is false
) 中,我們將使用密鑰 read/write
API 金鑰來確保發送新字串進行翻譯。
為了確保路由和重定向按預期運作,我們需要創建一個名為 /middleware.ts
的檔案。使用 Middleware,我們可以將用戶重定向到以其偏好語言呈現的頁面。
import {type NextRequest} from 'next/server';
import {middleware as tacoTranslateMiddleware} from 'tacotranslate/next';
import tacoTranslate from '@/tacotranslate-client';
export const config = {
matcher: ['/((?!api|_next|favicon.ico).*)'],
};
export async function middleware(request: NextRequest) {
return tacoTranslateMiddleware(tacoTranslate, request);
}
請務必按照 Next.js 中介軟體文件 設置 matcher
。
在客戶端,您可以修改 locale
cookie 來更改使用者偏好的語言。請參閱完整範例程式碼,了解如何操作的詳情!
步驟 5: 部署並測試!
我們完成了!當你在 Translate
組件中添加任何字串時,你的 React 應用程式將自動被翻譯。請注意,只有擁有 read/write
權限的 API 金鑰的環境才能創建新的字串進行翻譯。我們建議你設置一個封閉且安全的預備環境,在那裡可以使用這類 API 金鑰測試你的生產應用程式,並在上線前添加新字串。這樣可以防止任何人竊取你的秘密 API 金鑰,並避免因添加新的無關字串而導致翻譯專案膨脹。
請務必在我們的 GitHub 頁面查看完整範例。那裡您還會找到一個如何使用 Pages Router 的範例!如果您遇到任何問題,歡迎隨時聯繫我們,我們將非常樂意幫助您。
TacoTranslate 讓您能夠快速自動地將 React 應用程式本地化為任意語言,並支援雙向轉換。今天就開始吧!