Cara mengimplementasikan internasionalisasi dalam aplikasi Next.js yang menggunakan App Router
Buat aplikasi React Anda lebih mudah diakses dan capai pasar baru dengan internasionalisasi (i18n).
Seiring dunia menjadi semakin global, menjadi semakin penting bagi pengembang web untuk membangun aplikasi yang dapat memenuhi kebutuhan pengguna dari berbagai negara dan budaya. Salah satu cara utama untuk mencapai hal ini adalah melalui internasionalisasi (i18n), yang memungkinkan Anda menyesuaikan aplikasi Anda ke berbagai bahasa, mata uang, dan format tanggal.
Dalam artikel ini, kita akan membahas cara menambahkan internasionalisasi ke aplikasi React Next.js Anda, dengan rendering sisi server. TL;DR: Lihat contoh lengkapnya di sini.
Panduan ini untuk aplikasi Next.js yang menggunakan App Router.
Jika Anda menggunakan Pages Router, lihat panduan ini sebagai gantinya.
Langkah 1: Instalasi pustaka i18n
Untuk mengimplementasikan internasionalisasi dalam aplikasi Next.js Anda, pertama-tama kita akan memilih sebuah perpustakaan i18n. Ada beberapa perpustakaan populer, termasuk next-intl. Namun, dalam contoh ini, kita akan menggunakan TacoTranslate.
TacoTranslate secara otomatis menerjemahkan string Anda ke bahasa apa pun menggunakan AI canggih, dan membebaskan Anda dari pengelolaan file JSON yang membosankan.
Mari kita pasang menggunakan npm di terminal Anda:
npm install tacotranslate
Langkah 2: Buat akun TacoTranslate gratis
Sekarang setelah Anda menginstal modulnya, saatnya untuk membuat akun TacoTranslate Anda, sebuah proyek terjemahan, dan kunci API terkait. Buat akun di sini. Ini gratis, dan tidak mengharuskan Anda menambahkan kartu kredit.
Di dalam antarmuka aplikasi TacoTranslate, buat sebuah proyek, dan navigasikan ke tab API keys-nya. Buat satu kunci read
, dan satu kunci read/write
. Kami akan menyimpannya sebagai variabel lingkungan. Kunci read
adalah yang kami sebut sebagai public
dan kunci read/write
adalah secret
. Misalnya, Anda bisa menambahkannya ke dalam file .env
di root proyek Anda.
TACOTRANSLATE_PUBLIC_API_KEY=123456
TACOTRANSLATE_SECRET_API_KEY=789010
Pastikan untuk tidak pernah membocorkan kunci API rahasia read/write
ke lingkungan produksi sisi klien.
Kami juga akan menambahkan dua variabel lingkungan lagi: TACOTRANSLATE_DEFAULT_LOCALE
dan TACOTRANSLATE_ORIGIN
.
TACOTRANSLATE_DEFAULT_LOCALE
: Kode lokal default sebagai cadangan. Dalam contoh ini, kami akan menetapkannya keen
untuk bahasa Inggris.TACOTRANSLATE_ORIGIN
: "Folder" di mana string Anda akan disimpan, seperti URL situs web Anda. Baca lebih lanjut tentang origins di sini.
TACOTRANSLATE_DEFAULT_LOCALE=en
TACOTRANSLATE_ORIGIN=your-website-url.com
Langkah 3: Menyiapkan 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;
Kami akan secara otomatis mendefinisikan TACOTRANSLATE_API_KEY
dan TACOTRANSLATE_PROJECT_LOCALE
dalam waktu dekat.
Membuat klien dalam file terpisah membuatnya mudah digunakan lagi nanti. getLocales
hanyalah fungsi utilitas dengan beberapa penanganan kesalahan bawaan. Sekarang, buat file bernama /app/[locale]/tacotranslate.tsx
, di mana kita akan mengimplementasikan penyedia 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>
);
}
Perhatikan 'use client';
yang menunjukkan bahwa ini adalah komponen klien.
Dengan penyedia konteks yang sekarang sudah siap digunakan, buatlah sebuah file bernama /app/[locale]/layout.tsx
, tata letak root dalam aplikasi kita. Perhatikan bahwa jalur ini memiliki folder yang memanfaatkan Dynamic Routes, di mana [locale]
adalah parameter dinamis.
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>
);
}
Hal pertama yang perlu dicatat di sini adalah bahwa kami menggunakan parameter Dynamic Route
[locale]
untuk mengambil terjemahan untuk bahasa tersebut. Selain itu, generateStaticParams
memastikan semua kode lokal yang telah Anda aktifkan untuk proyek Anda sudah di-pre-render.
Sekarang, mari kita buat halaman pertama kita! Buat file bernama /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!" />
);
}
Perhatikan variabel revalidate
yang memberitahu Next.js untuk membangun ulang halaman setelah 60 detik, dan menjaga terjemahan Anda tetap terbaru.
Langkah 4: Menerapkan rendering sisi server
TacoTranslate mendukung rendering sisi server. Ini sangat meningkatkan pengalaman pengguna dengan menampilkan konten yang diterjemahkan secara langsung, daripada menampilkan sekilas konten yang belum diterjemahkan terlebih dahulu. Selain itu, kita dapat melewati permintaan jaringan di sisi klien, karena kita sudah memiliki terjemahan yang kita butuhkan untuk halaman yang sedang dilihat pengguna.
Untuk mengatur server side rendering, buat atau ubah /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};
};
Ubah isProduction
periksa agar sesuai dengan pengaturan Anda. Jika true
, TacoTranslate akan menampilkan kunci API publik. Jika kita berada di lingkungan lokal, pengujian, atau pementasan (isProduction
is false
), kita akan menggunakan kunci API read/write
rahasia untuk memastikan string baru dikirim untuk diterjemahkan.
Untuk memastikan routing dan pengalihan bekerja sesuai yang diharapkan, kita perlu membuat file bernama /middleware.ts
. Dengan menggunakan Middleware, kita dapat mengalihkan pengguna ke halaman yang disajikan dalam bahasa pilihan mereka.
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);
}
Pastikan untuk mengatur matcher
sesuai dengan dokumentasi Middleware Next.js.
Di sisi klien, Anda dapat mengubah cookie locale
untuk mengganti bahasa favorit pengguna. Silakan lihat kode contoh lengkap untuk ide tentang cara melakukannya!
Langkah 5: Deploy dan uji!
Kami selesai! Aplikasi React Anda sekarang akan diterjemahkan secara otomatis ketika Anda menambahkan string apa pun ke komponen Translate
. Perlu dicatat bahwa hanya lingkungan dengan izin read/write
pada kunci API yang dapat membuat string baru untuk diterjemahkan. Kami menyarankan memiliki lingkungan staging yang tertutup dan aman di mana Anda dapat menguji aplikasi produksi Anda dengan kunci API seperti itu, menambahkan string baru sebelum diluncurkan. Ini akan mencegah siapa pun mencuri kunci API rahasia Anda, dan berpotensi membengkakkan proyek terjemahan Anda dengan menambahkan string baru yang tidak terkait.
Pastikan untuk memeriksa contoh lengkap di profil GitHub kami. Di sana, Anda juga akan menemukan contoh cara melakukannya menggunakan Pages Router ! Jika Anda mengalami masalah, jangan ragu untuk menghubungi kami, dan kami akan dengan senang hati membantu.
TacoTranslate memungkinkan Anda untuk secara otomatis melokalkan aplikasi React Anda dengan cepat ke dan dari bahasa apa pun. Mulai hari ini!