Cách triển khai quốc tế hóa trong ứng dụng Next.js sử dụng App Router
Làm cho ứng dụng React của bạn dễ tiếp cận hơn và tiếp cận các thị trường mới với quốc tế hóa (i18n).
Khi thế giới ngày càng toàn cầu hóa, việc các nhà phát triển web xây dựng các ứng dụng có thể phục vụ người dùng từ các quốc gia và văn hóa khác nhau trở nên ngày càng quan trọng. Một trong những cách chủ chốt để đạt được điều này là thông qua quốc tế hóa (i18n), cho phép bạn điều chỉnh ứng dụng của mình phù hợp với các ngôn ngữ, loại tiền tệ và định dạng ngày tháng khác nhau.
Trong bài viết này, chúng ta sẽ khám phá cách thêm quốc tế hóa vào ứng dụng React Next.js của bạn, kèm theo kết xuất phía máy chủ. TL;DR: Xem ví dụ đầy đủ tại đây.
Hướng dẫn này dành cho các ứng dụng Next.js sử dụng App Router.
Nếu bạn đang sử dụng Pages Router, vui lòng xem hướng dẫn này.
Bước 1: Cài đặt thư viện i18n
Để triển khai quốc tế hóa trong ứng dụng Next.js của bạn, đầu tiên chúng ta sẽ chọn một thư viện i18n. Có một số thư viện phổ biến, bao gồm next-intl. Tuy nhiên, trong ví dụ này, chúng ta sẽ sử dụng TacoTranslate.
TacoTranslate tự động dịch các chuỗi của bạn sang bất kỳ ngôn ngữ nào bằng công nghệ AI tiên tiến, và giúp bạn thoát khỏi việc quản lý tẻ nhạt các tệp JSON.
Hãy cài đặt nó bằng cách sử dụng npm trong terminal của bạn:
npm install tacotranslate
Bước 2: Tạo một tài khoản TacoTranslate miễn phí
Bây giờ bạn đã cài đặt module, đã đến lúc tạo tài khoản TacoTranslate của bạn, một dự án dịch thuật, và các khóa API liên quan. Tạo tài khoản tại đây. Nó miễn phí, và không yêu cầu bạn phải thêm thẻ tín dụng.
Trong giao diện ứng dụng TacoTranslate, hãy tạo một dự án và điều hướng đến tab API keys của nó. Tạo một khóa read
và một khóa read/write
. Chúng ta sẽ lưu chúng dưới dạng biến môi trường. Khóa read
là cái mà chúng ta gọi là public
và khóa read/write
là secret
. Ví dụ, bạn có thể thêm chúng vào tệp .env
ở thư mục gốc của dự án.
TACOTRANSLATE_PUBLIC_API_KEY=123456
TACOTRANSLATE_SECRET_API_KEY=789010
Hãy chắc chắn không bao giờ tiết lộ khóa API bí mật read/write
cho môi trường sản xuất phía client.
Chúng tôi cũng sẽ thêm hai biến môi trường nữa: TACOTRANSLATE_DEFAULT_LOCALE
và TACOTRANSLATE_ORIGIN
.
TACOTRANSLATE_DEFAULT_LOCALE
: Mã ngôn ngữ mặc định dự phòng. Trong ví dụ này, chúng tôi sẽ đặt làen
cho tiếng Anh.TACOTRANSLATE_ORIGIN
: “Thư mục” nơi các chuỗi của bạn sẽ được lưu trữ, chẳng hạn như URL của trang web của bạn. Đọc thêm về origins tại đây.
TACOTRANSLATE_DEFAULT_LOCALE=en
TACOTRANSLATE_ORIGIN=your-website-url.com
Bước 3: Thiết lập TacoTranslate
Để tích hợp TacoTranslate vào ứng dụng của bạn, bạn sẽ cần tạo một client sử dụng các khóa API đã tạo ở trên. Ví dụ: tạo một tệp có tên /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;
Chúng tôi sẽ tự động định nghĩa TACOTRANSLATE_API_KEY
và TACOTRANSLATE_PROJECT_LOCALE
ngay sau đây.
Tạo client trong một tệp riêng giúp dễ dàng sử dụng lại sau này. getLocales
chỉ là một hàm tiện ích với một số xử lý lỗi tích hợp sẵn. Bây giờ, hãy tạo một tệp có tên /app/[locale]/tacotranslate.tsx
, nơi chúng ta sẽ triển khai trình cung cấp 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>
);
}
Lưu ý 'use client';
cho biết đây là một thành phần phía client.
Với bộ cung cấp ngữ cảnh đã sẵn sàng, hãy tạo một tệp có tên /app/[locale]/layout.tsx
, là bố cục gốc trong ứng dụng của chúng ta. Lưu ý rằng đường dẫn này có một thư mục sử dụng Dynamic Routes, trong đó [locale]
là tham số động.
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>
);
}
Điều đầu tiên cần lưu ý ở đây là chúng ta đang sử dụng tham số Dynamic Route
[locale]
để lấy các bản dịch cho ngôn ngữ đó. Ngoài ra, generateStaticParams
đang đảm bảo tất cả các mã vùng ngôn ngữ mà bạn đã kích hoạt cho dự án của mình đều được tiền kết xuất.
Bây giờ, hãy tạo trang đầu tiên của chúng ta! Tạo một tập tin có tên /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!" />
);
}
Lưu ý biến revalidate
cho Next.js biết để xây dựng lại trang sau 60 giây, và giữ cho các bản dịch của bạn luôn được cập nhật.
Bước 4: Triển khai kết xuất phía máy chủ
TacoTranslate hỗ trợ kết xuất phía máy chủ. Điều này cải thiện đáng kể trải nghiệm người dùng bằng cách hiển thị nội dung đã dịch ngay lập tức, thay vì trước tiên là hiện một flash nội dung chưa dịch. Ngoài ra, chúng ta có thể bỏ qua các yêu cầu mạng trên phía khách, vì chúng ta đã có sẵn các bản dịch cần thiết cho trang mà người dùng đang xem.
Để thiết lập rendering phía máy chủ, tạo hoặc chỉnh sửa /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};
};
Chỉnh sửa kiểm tra isProduction
cho phù hợp với cấu hình của bạn. Nếu true
, TacoTranslate sẽ sử dụng khóa API công khai. Nếu chúng ta đang ở môi trường cục bộ, thử nghiệm hoặc staging (isProduction
is false
), chúng ta sẽ sử dụng khóa API bí mật read/write
để đảm bảo các chuỗi mới được gửi đi để dịch.
Để đảm bảo việc định tuyến và chuyển hướng hoạt động như mong đợi, chúng ta sẽ cần tạo một file có tên /middleware.ts
. Sử dụng Middleware, chúng ta có thể chuyển hướng người dùng đến các trang được trình bày bằng ngôn ngữ ưu tiên của họ.
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);
}
Hãy đảm bảo thiết lập matcher
theo đúng tài liệu về Middleware của Next.js.
Trên phía client, bạn có thể thay đổi cookie locale
để thay đổi ngôn ngữ ưu tiên của người dùng. Vui lòng xem mã ví dụ đầy đủ để biết cách thực hiện!
Bước 5: Triển khai và kiểm tra!
Chúng ta đã xong! Ứng dụng React của bạn sẽ được dịch tự động khi bạn thêm bất kỳ chuỗi nào vào một Translate
component. Lưu ý rằng chỉ có các môi trường có quyền read/write
trên khóa API mới có thể tạo các chuỗi mới để dịch. Chúng tôi khuyên bạn nên có một môi trường staging đóng và bảo mật, nơi bạn có thể kiểm thử ứng dụng sản xuất của mình với một khóa API như vậy, thêm chuỗi mới trước khi đưa lên sản xuất. Điều này sẽ ngăn chặn việc ai đó đánh cắp khóa API bí mật của bạn, và có khả năng làm phình to dự án dịch của bạn bằng cách thêm các chuỗi mới không liên quan.
Be sure to check out the complete example over at our GitHub profile. There, you’ll also find an example of how to do this using the Pages Router! If you encounter any problems, feel free to reach out, and we’ll be more than happy to help.
TacoTranslate lets you automatically localize your React applications quickly to and from over 75 languages. Get started today!