วิธีการใช้งานการทำให้หลายภาษาในแอปพลิเคชัน Next.js ที่ใช้ App Router
ทำให้แอปพลิเคชัน React ของคุณเข้าถึงได้มากขึ้นและขยายตลาดใหม่ด้วยการทำให้รองรับการใช้งานหลายภาษา (i18n)
เมื่อโลกมีความเป็นสากลมากขึ้นเรื่อย ๆ การพัฒนาเว็บแอปพลิเคชันที่สามารถรองรับผู้ใช้จากประเทศและวัฒนธรรมที่แตกต่างกันจึงมีความสำคัญมากขึ้น หนึ่งในวิธีหลัก ๆ ที่จะทำได้คือการทำให้แอปพลิเคชันของคุณรองรับหลายภาษา (i18n) ซึ่งช่วยให้คุณปรับแอปพลิเคชันให้เหมาะสมกับภาษาต่าง ๆ สกุลเงิน และรูปแบบวันที่
ในบทความนี้ เราจะสำรวจวิธีการเพิ่มการรองรับหลายภาษาให้กับแอปพลิเคชัน React Next.js ของคุณ พร้อมกับการเรนเดอร์ฝั่งเซิร์ฟเวอร์ TL;DR: ดูตัวอย่างเต็มได้ที่นี่
คำแนะนำนี้สำหรับแอปพลิเคชัน Next.js ที่ใช้ App Router.
หากคุณใช้ Pages Router, โปรดดูคำแนะนำนี้แทน.
ขั้นตอนที่ 1: ติดตั้งไลบรารี i18n
ในการใช้งานการแปลหลายภาษาในแอป Next.js ของคุณ เราจะเริ่มด้วยการเลือกไลบรารี i18n มีไลบรารียอดนิยมหลายตัว รวมถึง next-intl อย่างไรก็ตาม ในตัวอย่างนี้ เราจะใช้ TacoTranslate แทน
TacoTranslate จะแปลข้อความของคุณโดยอัตโนมัติเป็นทุกภาษาโดยใช้ AI ขั้นสูง และช่วยให้คุณไม่ต้องจัดการไฟล์ JSON ที่ยุ่งยาก
มาเริ่มติดตั้งโดยใช้ npm ในเทอร์มินัลของคุณ:
npm install tacotranslate
ขั้นตอนที่ 2: สร้างบัญชี TacoTranslate ฟรี
ตอนนี้คุณได้ติดตั้งโมดูลเรียบร้อยแล้ว ถึงเวลาสร้างบัญชี TacoTranslate ของคุณ โปรเจกต์แปล และคีย์ API ที่เกี่ยวข้อง สร้างบัญชีที่นี่ ฟรี และ ไม่จำเป็นต้องเพิ่มบัตรเครดิต
ภายใน UI ของแอปพลิเคชัน TacoTranslate ให้สร้างโปรเจกต์ และไปที่แท็บ API keys ของโปรเจกต์นั้น สร้างคีย์ read
หนึ่งอัน และคีย์ read/write
หนึ่งอัน เราจะบันทึกพวกมันเป็นตัวแปรแวดล้อม คีย์ read
คือสิ่งที่เราเรียกว่า public
และคีย์ read/write
คือ secret
ตัวอย่างเช่น คุณสามารถเพิ่มคีย์เหล่านี้ในไฟล์ .env
ที่อยู่ในโฟลเดอร์ root ของโปรเจกต์ของคุณได้
TACOTRANSLATE_PUBLIC_API_KEY=123456
TACOTRANSLATE_SECRET_API_KEY=789010
โปรดระวังอย่าเผยแพร่คีย์ API ความลับ read/write
ไปยังสภาพแวดล้อมการใช้งานฝั่งไคลเอนต์ในผลิตจริงเด็ดขาด
เราจะเพิ่มตัวแปรสภาพแวดล้อมอีกสองตัว: TACOTRANSLATE_DEFAULT_LOCALE
และ TACOTRANSLATE_ORIGIN
.
TACOTRANSLATE_DEFAULT_LOCALE
: รหัส locale เริ่มต้นที่ใช้เป็นค่า fallback ในตัวอย่างนี้ เราจะตั้งเป็นen
สำหรับภาษาอังกฤษTACOTRANSLATE_ORIGIN
: “โฟลเดอร์” ที่จะเก็บสตริงของคุณ เช่น URL ของเว็บไซต์ของคุณ อ่านเพิ่มเติมเกี่ยวกับ origins ที่นี่
TACOTRANSLATE_DEFAULT_LOCALE=en
TACOTRANSLATE_ORIGIN=your-website-url.com
ขั้นตอนที่ 3: การตั้งค่า TacoTranslate
ในการผสาน TacoTranslate เข้ากับแอปพลิเคชันของคุณ คุณจะต้องสร้าง client โดยใช้ API keys ที่ได้กล่าวถึงก่อนหน้านี้ ตัวอย่างเช่น สร้างไฟล์ชื่อ /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
โดยอัตโนมัติในไม่ช้า
การสร้าง client ในไฟล์แยกออกมาต่างหากทำให้สามารถใช้งานใหม่ได้ง่ายขึ้นในภายหลัง getLocales
เป็นเพียงฟังก์ชันยูทิลิตี้ที่มีการจัดการข้อผิดพลาดในตัวอยู่แล้ว ตอนนี้ ให้สร้างไฟล์ชื่อ /app/[locale]/tacotranslate.tsx
ซึ่งเราจะทำการติดตั้ง TacoTranslate
provider
'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';
ซึ่งบ่งชี้ว่านี่คือส่วนประกอบของฝั่งไคลเอนต์
เมื่อ context provider พร้อมใช้งานแล้ว ให้สร้างไฟล์ชื่อ /app/[locale]/layout.tsx
ซึ่งเป็น root layout ในแอปพลิเคชันของเรา โปรดทราบว่าเส้นทางนี้มีโฟลเดอร์ที่ใช้ 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 รองรับการเรนเดอร์ฝั่งเซิร์ฟเวอร์ ซึ่งช่วยปรับปรุงประสบการณ์ผู้ใช้ได้อย่างมาก โดยแสดงเนื้อหาที่แปลแล้วทันที แทนที่จะเป็นการแสดงเนื้อหาที่ไม่ได้แปลก่อนชั่วครู่ นอกจากนี้ เรายังสามารถข้ามการร้องขอเครือข่ายบนฝั่งไคลเอ็นต์ได้ เพราะเราได้มีคำแปลที่ต้องการสำหรับหน้าที่ผู้ใช้กำลังดูแล้ว
ในการตั้งค่า server side rendering ให้สร้างหรือแก้ไขไฟล์ /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
) เราจะใช้กุญแจ API ลับ read/write
เพื่อให้แน่ใจว่าสตริงใหม่จะถูกส่งไปเพื่อแปล
เพื่อให้แน่ใจว่าการทำงานของ routing และการเปลี่ยนเส้นทางทำงานตามที่คาดไว้ เราจำเป็นต้องสร้างไฟล์ชื่อ /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);
}
อย่าลืมตั้งค่า matcher
ให้สอดคล้องกับ เอกสาร Next.js Middleware ด้วยนะครับ/ค่ะ
บนฝั่งไคลเอนต์ คุณสามารถแก้ไขคุกกี้ locale
เพื่อเปลี่ยนภาษาที่ผู้ใช้ต้องการได้ กรุณาดู ตัวอย่างโค้ดฉบับสมบูรณ์ เพื่อแนวทางในการทำเช่นนี้!
ขั้นตอนที่ 5: นำส่งและทดสอบ!
เราเสร็จแล้ว! แอป React ของคุณจะถูกแปลโดยอัตโนมัติเมื่อคุณเพิ่มสตริงใด ๆ ลงในคอมโพเนนต์ Translate
. โปรดทราบว่าเฉพาะสภาพแวดล้อมที่มีสิทธิ์ read/write
บน API key เท่านั้นที่สามารถสร้างสตริงใหม่เพื่อแปลได้ เราแนะนำให้มีสภาพแวดล้อม staging ที่ปิดและปลอดภัยซึ่งคุณสามารถทดสอบแอป production ของคุณด้วย API key แบบนั้น โดยเพิ่มสตริงใหม่ก่อนเปิดใช้งานจริง ซึ่งจะช่วยป้องกันไม่ให้ใครขโมย API key ลับของคุณ และป้องกันไม่ให้โปรเจกต์แปลของคุณบวมโดยการเพิ่มสตริงใหม่ที่ไม่เกี่ยวข้อง
โปรดแน่ใจว่าได้ ดูตัวอย่างครบถ้วน ที่โปรไฟล์ GitHub ของเรา ที่นั่นคุณจะพบตัวอย่างการทำเช่นนี้โดยใช้ Pages Router ด้วย! หากคุณพบปัญหาใด ๆ อย่าลังเลที่จะ ติดต่อเรา เรายินดีช่วยเหลืออย่างยิ่ง
TacoTranslate ช่วยให้คุณแปลแอป React ของคุณโดยอัตโนมัติอย่างรวดเร็วในทุกภาษา เริ่มต้นวันนี้!