Pelajari cara menerapkan internasionalisasi (i18n) yang mulus di aplikasi Next.js Anda untuk menjangkau audiens global. Mencakup perutean, terjemahan konten, dan praktik terbaik.
Internasionalisasi Next.js: Membangun Aplikasi Multi-bahasa untuk Audiens Global
Di dunia yang saling terhubung saat ini, membangun aplikasi yang melayani audiens global bukan lagi sebuah kemewahan – ini adalah sebuah keharusan. Next.js, sebuah kerangka kerja React yang kuat, menyediakan fitur-fitur tangguh untuk menerapkan internasionalisasi (i18n), memungkinkan Anda membuat aplikasi multi-bahasa yang memberikan pengalaman yang dilokalkan kepada pengguna di seluruh dunia. Panduan komprehensif ini akan memandu Anda melalui konsep-konsep penting, teknik, dan praktik terbaik untuk membangun aplikasi Next.js yang diinternasionalisasi.
Memahami Internasionalisasi dan Lokalisasi
Sebelum mendalami spesifik i18n Next.js, mari kita perjelas istilah-istilah kunci:
- Internasionalisasi (i18n): Proses merancang dan mengembangkan aplikasi sehingga dapat dengan mudah diadaptasi ke berbagai bahasa dan wilayah tanpa memerlukan perubahan rekayasa. Ini melibatkan abstraksi teks, pemformatan, dan elemen-elemen spesifik lokal lainnya.
- Lokalisasi (l10n): Proses mengadaptasi aplikasi ke bahasa dan wilayah tertentu. Ini termasuk menerjemahkan teks, menyesuaikan format tanggal dan waktu, simbol mata uang, dan lainnya.
Pada dasarnya, i18n mempersiapkan aplikasi Anda untuk lokalisasi. Dengan memisahkan elemen yang bergantung pada bahasa dari kode inti, Anda membuatnya lebih mudah untuk melokalkan aplikasi untuk pasar yang berbeda.
Mengapa Menerapkan Internasionalisasi di Next.js?
Menerapkan i18n di aplikasi Next.js Anda menawarkan banyak manfaat:
- Jangkauan yang Diperluas: Jangkau audiens yang lebih luas dengan menyediakan konten dalam bahasa pilihan mereka.
- Pengalaman Pengguna yang Ditingkatkan: Tawarkan pengalaman yang lebih personal dan menarik bagi pengguna di berbagai wilayah.
- SEO yang Ditingkatkan: Tingkatkan optimisasi mesin pencari (SEO) dengan menyediakan konten yang dilokalkan yang menargetkan wilayah geografis tertentu.
- Peningkatan Konversi: Tingkatkan konversi dengan menyajikan informasi dalam bahasa asli pengguna, menumbuhkan kepercayaan dan pemahaman.
- Kehadiran Merek Global: Bangun kehadiran merek global yang lebih kuat dengan menunjukkan komitmen terhadap inklusivitas dan melayani audiens yang beragam.
Fitur dan Konfigurasi i18n Next.js
Next.js menawarkan dukungan bawaan untuk i18n melalui fitur perutean dan manajemen kontennya. Berikut adalah rincian fitur-fitur penting:
1. Mengonfigurasi i18n di next.config.js
Konfigurasi inti untuk i18n berada di dalam file next.config.js
. Berikut contohnya:
/** @type {import('next').NextConfig} */
const nextConfig = {
i18n: {
locales: ['en', 'es', 'fr'], // Array berisi lokal (kode bahasa) yang didukung
defaultLocale: 'en', // Lokal default yang akan digunakan
localeDetection: true, // Mengaktifkan/menonaktifkan deteksi lokal otomatis berdasarkan pengaturan browser (opsional)
// domains: [
// {
// domain: 'example.com',
// defaultLocale: 'en',
// },
// {
// domain: 'example.es',
// defaultLocale: 'es',
// },
// ],
},
}
module.exports = nextConfig;
Penjelasan:
locales
: Sebuah array yang berisi kode bahasa (misalnya,'en'
untuk Inggris,'es'
untuk Spanyol,'fr'
untuk Prancis) dari bahasa yang didukung oleh aplikasi Anda. Pastikan untuk mengikuti kode bahasa ISO 639-1 untuk konsistensi.defaultLocale
: Bahasa default yang akan digunakan aplikasi Anda. Ini adalah bahasa yang ditampilkan jika tidak ada bahasa lain yang ditentukan di URL atau terdeteksi dari pengaturan browser pengguna. Pilih bahasa yang mewakili audiens target utama Anda.localeDetection
: Nilai boolean yang mengontrol apakah Next.js secara otomatis mendeteksi bahasa pilihan pengguna berdasarkan pengaturan browser mereka. Jika diatur ketrue
, Next.js akan mencoba mengarahkan pengguna ke versi bahasa yang sesuai dari situs Anda.domains
(opsional): Sebuah array yang memungkinkan Anda untuk mengaitkan lokal dengan domain tertentu. Ini berguna jika Anda memiliki domain terpisah untuk bahasa yang berbeda (misalnya,example.com
untuk Inggris,example.es
untuk Spanyol).
2. Perutean dengan Awalan Lokal
Next.js secara otomatis menambahkan awalan pada rute dengan lokal. Misalnya, jika Anda memiliki halaman di /about
dan lokalnya adalah 'es' (Spanyol), URL akan menjadi /es/about
. Ini memungkinkan versi bahasa yang berbeda dari halaman dan memungkinkan mesin pencari untuk mengindeks konten untuk setiap lokal. Kerangka kerja ini menangani pengalihan dan perutean untuk Anda.
3. Memanfaatkan Hook useRouter
Hook useRouter
dari next/router
menyediakan akses ke lokal saat ini dan informasi perutean lainnya.
import { useRouter } from 'next/router';
function MyComponent() {
const router = useRouter();
const { locale, locales, defaultLocale } = router;
return (
Lokal saat ini: {locale}
Lokal yang tersedia: {locales.join(', ')}
Lokal default: {defaultLocale}
);
}
export default MyComponent;
Objek router
menawarkan properti kunci berikut:
locale
: Lokal yang sedang dipilih (misalnya, 'en', 'es', 'fr').locales
: Array dari semua lokal yang didukung yang didefinisikan dinext.config.js
.defaultLocale
: Lokal default yang diatur dinext.config.js
.asPath
: Path seperti yang ditampilkan di browser, termasuk awalan lokal (misalnya,/es/about
).pathname
: Path tanpa awalan lokal (misalnya,/about
).
Strategi Terjemahan Konten
Setelah Anda mengonfigurasi aplikasi Next.js Anda untuk i18n, Anda perlu menerapkan strategi untuk menerjemahkan konten Anda. Berikut adalah beberapa pendekatan populer:
1. Menggunakan Sistem Manajemen Terjemahan (TMS) Khusus
Untuk proyek skala besar dengan banyak bahasa, TMS sangat disarankan. Opsi populer meliputi:
- Phrase: TMS berbasis cloud dengan integrasi untuk berbagai platform, termasuk Next.js. Menawarkan fitur kolaboratif dan alur kerja otomatis.
- Localize: TMS berbasis cloud lain yang mendukung berbagai format file dan menyediakan fitur manajemen terjemahan.
- Crowdin: TMS yang kuat dan sangat populer di komunitas sumber terbuka, dan terintegrasi dengan baik dengan Next.js, memungkinkan tim untuk menerjemahkan konten secara efisien.
Manfaat:
- Manajemen terjemahan terpusat.
- Fitur kolaborasi untuk penerjemah.
- Otomatisasi alur kerja terjemahan.
- Integrasi dengan alur kerja pengembangan Anda.
2. Membuat File Terjemahan JSON
Untuk proyek yang lebih kecil, menggunakan file JSON untuk menyimpan terjemahan adalah metode yang sederhana dan efektif.
Contoh Struktur Direktori:
/src
├── locales
│ ├── en.json
│ └── es.json
├── components
│ └── MyComponent.js
└── pages
└── index.js
Contoh en.json
:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Contoh es.json
:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Contoh MyComponent.js
:
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
function MyComponent() {
const { locale } = useRouter();
const t = locale === 'es' ? es : en;
return (
{t.greeting}
{t.welcomeMessage}
);
}
export default MyComponent;
Pendekatan ini memberikan fleksibilitas dan mudah untuk proyek yang lebih kecil. Umumnya mudah untuk diperbarui dan dipelihara.
3. Menggunakan Pustaka Terjemahan
Beberapa pustaka JavaScript menyederhanakan terjemahan konten dalam komponen React Anda.
next-i18next
: Pustaka populer yang dirancang khusus untuk Next.js. Ini terintegrasi dengan baik dengan kerangka kerja dan menyediakan fitur seperti rendering sisi server (SSR) dan terjemahan sisi klien.react-i18next
: Pustaka i18n serbaguna untuk React. Anda dapat menggunakannya di aplikasi Next.js Anda, meskipun mungkin memerlukan lebih banyak konfigurasi dibandingkan dengannext-i18next
.
Contoh dengan next-i18next
(Instalasi: npm install next-i18next i18next react-i18next
):
Buat file konfigurasi i18n (misalnya, i18n.js
di direktori root Anda):
// i18n.js
import { createServerSideHelpers } from 'next-i18next'
import { i18n } from './next-i18next.config'
export function initI18next(req, res, namespaces = ['common']) {
const helpers = createServerSideHelpers(
req,
res,
i18n,
namespaces
)
return helpers
}
export { appWithTranslation } from 'next-i18next'
export { i18n }
Buat konfigurasi Next.js Anda untuk next-i18next.
// next-i18next.config.js
const { i18n } = require('./next-i18next.config');
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'fr'],
},
// konfigurasi lainnya
}
module.exports = nextConfig
Tambahkan konfigurasi dan impor terjemahan ke _app.js
Anda:
import { appWithTranslation } from 'next-i18next';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
Buat folder dan isi dengan lokal untuk terjemahan Anda.
/public
└── locales
├── en
│ └── common.json
├── es
│ └── common.json
└── fr
└── common.json
Contoh en/common.json:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Menggunakan terjemahan dalam sebuah komponen:
import { useTranslation } from 'next-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return (
{t('greeting')}
{t('welcomeMessage')}
);
}
export default MyComponent;
Contoh ini menggunakan hook useTranslation
untuk mengambil terjemahan berdasarkan lokal saat ini.
Menangani Rute Dinamis dan Static Site Generation (SSG)
Internasionalisasi menjadi lebih kompleks ketika berhadapan dengan rute dinamis (misalnya, postingan blog, halaman produk) dan static site generation (SSG).
1. Rute Dinamis (misalnya, /blog/[slug])
Untuk rute dinamis, Anda perlu menghasilkan path yang benar untuk setiap lokal saat waktu build menggunakan getStaticPaths
. Fungsi ini mengembalikan sebuah array path yang harus di-pre-render oleh Next.js.
export async function getStaticPaths() {
const paths = [];
const locales = ['en', 'es', 'fr'];
const posts = await fetchPosts(); // Ambil data postingan blog
posts.forEach(post => {
locales.forEach(locale => {
paths.push({
params: {
slug: post.slug,
},
locale,
});
});
});
return {
paths,
fallback: false, // atau 'blocking' jika Anda ingin menampilkan status pemuatan
};
}
export async function getStaticProps({ params, locale }) {
const post = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Penjelasan:
getStaticPaths
: Fungsi ini melakukan iterasi melalui postingan blog Anda dan menghasilkan sebuah path untuk setiap postingan dan setiap lokal. Objekparams
berisi parameter rute (misalnya, slug dari postingan blog).locale
: Parameter ini menyediakan lokal saat ini, memungkinkan Anda untuk mengambil konten yang diterjemahkan untuk lokal tertentu.fallback
: Menentukan bagaimana Next.js menangani path yang tidak didefinisikan digetStaticPaths
.fallback: false
menghasilkan halaman 404 untuk path yang tidak terdefinisi.fallback: 'blocking'
melakukan pre-render halaman sesuai permintaan.
2. Static Site Generation (SSG) dengan getStaticProps
Di getStaticProps
, Anda dapat mengambil konten yang diterjemahkan berdasarkan parameter locale
.
export async function getStaticProps({ params, locale }) {
// Ambil konten berdasarkan lokal dan params
const { post } = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Fungsi getPostBySlug
harus mengambil konten yang diterjemahkan untuk slug dan lokal yang diberikan, yang dapat diambil dari file terjemahan Anda, database, atau CMS.
3. Server-Side Rendering (SSR) dengan getServerSideProps
Untuk konten yang perlu diambil pada saat permintaan, gunakan getServerSideProps
. Ini berguna jika konten sering berubah atau dipersonalisasi untuk setiap pengguna.
export async function getServerSideProps({ params, locale, req, res }) {
// Ambil data berdasarkan lokal dan params (misalnya, dari database)
const data = await fetchData(params.slug, locale);
return {
props: {
data,
},
};
}
Praktik Terbaik untuk Internasionalisasi Next.js
Mengikuti praktik terbaik ini akan membantu Anda membangun aplikasi multi-bahasa yang tangguh, mudah dipelihara, dan ramah pengguna:
- Rencanakan Sejak Dini: Pertimbangkan internasionalisasi sejak awal proyek Anda. Jauh lebih mudah untuk mengimplementasikannya di awal daripada menambahkannya di kemudian hari.
- Pisahkan Konten dari Kode: Simpan semua teks yang dapat diterjemahkan dalam file terpisah (misalnya, file JSON atau TMS) dan hindari melakukan hardcode teks langsung di komponen Anda.
- Gunakan Sistem Manajemen Terjemahan (TMS): Untuk proyek yang lebih besar, TMS dapat menyederhanakan proses terjemahan dan meningkatkan kolaborasi.
- Uji Secara Menyeluruh: Uji aplikasi Anda di semua bahasa yang didukung untuk memastikan terjemahan yang akurat, pemformatan yang benar, dan rendering yang tepat di berbagai browser dan perangkat. Uji di perangkat nyata, bukan hanya emulator.
- Pertimbangkan Bahasa Kanan-ke-Kiri (RTL): Jika Anda mendukung bahasa seperti Arab atau Ibrani, pastikan desain dan tata letak Anda mengakomodasi arah teks kanan-ke-kiri. Next.js tidak menangani ini secara otomatis, jadi diperlukan CSS atau solusi lain.
- Tangani Pemformatan Tanggal dan Waktu: Gunakan pustaka atau fungsi bawaan untuk memformat tanggal dan waktu sesuai dengan lokal pengguna. Moment.js dan date-fns adalah dua pustaka populer yang membantu.
- Kelola Pemformatan Angka dan Mata Uang: Format angka dan simbol mata uang dengan benar berdasarkan lokal pengguna.
- Optimalkan SEO: Gunakan tag meta spesifik bahasa (
hreflang
) untuk membantu mesin pencari mengindeks konten Anda dengan benar. Sertakan kode bahasa di URL Anda. - Prioritaskan Pengalaman Pengguna: Sediakan cara yang jelas dan intuitif bagi pengguna untuk beralih antar bahasa. Pertimbangkan untuk menawarkan deteksi bahasa otomatis berdasarkan pengaturan browser.
- Tetap Terkini: Jaga agar versi Next.js dan pustaka i18n Anda tetap terbaru untuk mendapatkan manfaat dari fitur terbaru dan patch keamanan.
- Pertimbangkan Aksesibilitas (a11y): Pastikan konten terjemahan Anda dapat diakses oleh pengguna dengan disabilitas. Sediakan teks alternatif untuk gambar dan gunakan atribut ARIA yang sesuai. Gunakan pembaca layar untuk menguji.
Pertimbangan SEO untuk Situs Web yang Diinternasionalisasi
Mengoptimalkan situs web Anda yang diinternasionalisasi untuk mesin pencari sangat penting untuk mendorong lalu lintas organik dari seluruh dunia. Berikut adalah beberapa praktik terbaik SEO utama:
- Tag
hreflang
: Terapkan taghreflang
di<head>
HTML Anda untuk memberi tahu mesin pencari tentang variasi bahasa dan regional dari konten Anda. Ini sangat penting untuk SEO. Contohnya:<link rel="alternate" hreflang="en" href="https://example.com/en/" />
dan<link rel="alternate" hreflang="es" href="https://example.com/es/" />
- URL Spesifik Bahasa: Gunakan kode bahasa di URL Anda (misalnya,
/en/about
,/es/acerca-de
). Ini dengan jelas menunjukkan bahasa konten kepada pengguna dan mesin pencari. - Konten yang Dilokalkan: Terjemahkan konten Anda secara akurat dan alami. Terjemahan mesin harus ditinjau oleh penutur asli.
- Deskripsi Meta dan Judul yang Dilokalkan: Tulis deskripsi meta dan judul yang unik dan menarik untuk setiap bahasa untuk meningkatkan rasio klik-tayang di hasil pencarian.
- Peta Situs XML: Buat dan kirimkan peta situs XML yang mencakup semua variasi bahasa dari halaman Anda.
- Tautan Internal: Gunakan tautan internal yang sesuai antara versi bahasa dari konten Anda.
- Riset Kata Kunci Spesifik Negara: Lakukan riset kata kunci di setiap bahasa untuk mengidentifikasi istilah yang dicari pengguna di setiap wilayah.
Contoh: Membangun Blog Multi-bahasa Sederhana
Mari kita buat contoh sederhana dari sebuah blog multi-bahasa menggunakan Next.js. Ini akan memberikan ilustrasi yang lebih konkret tentang bagaimana menerapkan konsep-konsep yang telah dibahas di atas.
1. Pengaturan Proyek
Buat proyek Next.js baru:
npx create-next-app my-multi-lang-blog
cd my-multi-lang-blog
2. Konfigurasi i18n (next.config.js
)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
locales: ['en', 'es', 'fr'],
defaultLocale: 'en',
},
}
module.exports = nextConfig
3. Buat File Terjemahan
Buat folder locales
di direktori root dan tambahkan file JSON berikut:
locales/en.json
:
{
"title": "Welcome to My Blog",
"postTitle": "My First Post",
"postContent": "This is the content of my first blog post."
}
locales/es.json
:
{
"title": "Bienvenido a mi Blog",
"postTitle": "Mi Primer Post",
"postContent": "Este es el contenido de mi primer publicación de blog."
}
locales/fr.json
:
{
"title": "Bienvenue sur Mon Blog",
"postTitle": "Mon Premier Article",
"postContent": "Ceci est le contenu de mon premier article de blog."
}
4. Buat Komponen Postingan Blog (misalnya, components/BlogPost.js
)
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function BlogPost() {
const router = useRouter();
const { locale } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
{translations.postTitle}
{translations.postContent}
);
}
export default BlogPost;
5. Buat Halaman Indeks (pages/index.js
)
import { useRouter } from 'next/router';
import BlogPost from '../components/BlogPost';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function HomePage() {
const router = useRouter();
const { locale, locales } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
);
}
export default HomePage;
Contoh yang disederhanakan ini menunjukkan prinsip-prinsip dasar internasionalisasi Next.js. Anda dapat mengembangkan kerangka dasar ini untuk menyertakan fitur yang lebih kompleks, seperti rute dinamis dan integrasi dengan sistem manajemen terjemahan. Pertimbangkan untuk meningkatkan tautan di atas dengan komponen Link
dan menambahkan atribut locale
yang sesuai.
6. Jalankan Aplikasi
Jalankan aplikasi dengan:
npm run dev
Sekarang Anda dapat mengakses blog Anda di http://localhost:3000
(Inggris), http://localhost:3000/es
(Spanyol), dan http://localhost:3000/fr
(Prancis). Anda akan melihat judul dan konten postingan blog diterjemahkan berdasarkan lokal yang dipilih.
Kesimpulan
Next.js menyediakan serangkaian fitur yang komprehensif untuk menerapkan internasionalisasi di aplikasi web Anda. Dengan mengikuti prinsip dan teknik yang diuraikan dalam panduan ini, Anda dapat membuat aplikasi multi-bahasa yang memberikan pengalaman yang dilokalkan kepada pengguna di seluruh dunia. Ingatlah untuk merencanakan strategi i18n Anda sejak dini, pilih metode terjemahan yang tepat untuk kebutuhan Anda, dan prioritaskan pengalaman pengguna. Dengan perencanaan dan eksekusi yang cermat, Anda dapat membangun aplikasi yang beresonansi dengan audiens global dan membuka peluang baru untuk pertumbuhan. Pembelajaran berkelanjutan, mengikuti rilis terbaru dan praktik terbaik akan memastikan bahwa Anda memanfaatkan alat dan teknologi Anda secara efektif.
Seiring kemajuan teknologi, harapkan untuk melihat lebih banyak fitur i18n canggih muncul. Kemampuan untuk menjangkau pengguna di berbagai budaya dan kelompok linguistik akan tetap menjadi prioritas utama bagi pengembang aplikasi di seluruh dunia. Oleh karena itu, menguasai dasar-dasar i18n adalah keterampilan berharga yang akan meningkatkan nilai Anda di lanskap pengembangan global saat ini.