Episode ini membahas internationalization di Gatsby: konsep multi-language routing dan terjemahan konten, implementasi dengan gatsby-plugin-react-i18next, SEO untuk halaman terlokalisasi, serta alternatif seperti gatsby-plugin-intl.

Situs yang menjangkau pengguna global butuh lebih dari sekadar menerjemahkan teks: URL, metadata, dan sitemap juga harus disesuaikan per bahasa. Gatsby mendukung ini karena setiap bahasa bisa dirender sebagai halaman statis terpisah.
Episode 11 membahas konsep internationalization di Gatsby, pola multi-language routing, implementasi dengan gatsby-plugin-react-i18next, serta SEO untuk halaman terlokalisasi.
Strategi paling umum: setiap bahasa punya copy halaman sendiri yang dirender saat build. Gatsby tidak butuh runtime i18n — semua bahasa sudah menjadi file HTML statis. Pendekatan ini cepat dan SEO-friendly karena setiap halaman punya URL permanen.
Ada dua hal yang diterjemahkan:
Struktur URL yang umum: bahasa default di akar (/blog/post), bahasa lain di prefix (/en/blog/post). Pemisahan konten per bahasa bisa dilakukan dengan source plugin yang di-set per bahasa atau memakai field bahasa di frontmatter.
Untuk konten file, susun folder per bahasa:
content/
id/
blog/
post-1.mdx
en/
blog/
post-1.mdxQuery memfilter berdasarkan bahasa, lalu slug tiap bahasa dibangun di gatsby-node.js — bahasa default tanpa prefix, bahasa lain dengan prefix.
Plugin paling populer untuk i18n UI adalah gatsby-plugin-react-i18next:
npm install gatsby-plugin-react-i18next react-i18next i18nextKonfigurasikan di gatsby-config.js:
module.exports = {
plugins: [
{
resolve: "gatsby-plugin-react-i18next",
options: {
languages: ["id", "en"],
defaultLanguage: "id",
redirect: true,
siteUrl: "https://situs-kalian.com",
},
},
],
}Options languages dan defaultLanguage menentukan bahasa yang didukung dan bahasa default. redirect: true otomatis mengarahkan / ke bahasa default saat build.
Terjemahan UI disimpan di locales/id/translation.json dan dipakai lewat hook useTranslation:
import { useTranslation } from "gatsby-plugin-react-i18next"
const Navbar = () => {
const { t, i18n } = useTranslation()
return (
<nav>
<button onClick={() => i18n.changeLanguage("en")}>
{t("beralih-bahasa")}
</button>
<span>{t("salam-pembuka")}</span>
</nav>
)
}t("salam-pembuka") mengambil string dari file terjemahan bahasa aktif. Plugin ini juga menangani URL prefixed dan menyediakan prop languages untuk navigasi antar bahasa.
Google memakai tag hreflang untuk memahami hubungan antar versi bahasa. Untuk situs statis, tag ini bisa dirender lewat Gatsby Head API:
export function Head({ pageContext }) {
const { language, languages, originalPath } = pageContext
return (
<>
<html lang={language} />
<link rel="alternate" hrefLang="x-default" href={originalPath} />
{languages.map((lang) => (
<link key={lang} rel="alternate" hrefLang={lang} href={`/${lang}${originalPath}`} />
))}
</>
)
}hrefLang="en" memberi sinyal bahasa pada Google. Pastikan juga gatsby-plugin-sitemap diubah agar menghasilkan URL per bahasa, sehingga semua versi ter-index dengan benar.
gatsby-plugin-intl adalah alternatif yang lebih sederhana — berbasis react-intl. Kekurangannya, plugin ini kurang aktif dirawat. Pilih gatsby-plugin-react-i18next untuk project baru karena didasarkan pada i18next yang ekosistemnya besar dan mendukung fitur lanjutan seperti pluralisasi dan interpolation.
Episode 11 menuntaskan internationalization: konsep banyak bahasa pada situs statis, pola routing per bahasa, implementasi UI dengan gatsby-plugin-react-i18next, dan SEO halaman terlokalisasi dengan hreflang.
Inti yang harus dibawa pulang:
gatsby-plugin-react-i18next menangani routing dan URL prefixed.useTranslation dipakai untuk mengambil string terjemahan.hreflang dan sitemap per bahasa wajib untuk SEO.Di episode 12 selanjutnya kita masuk fase networking dan security: web security dan best practices — keamanan situs statis, pengamanan third-party scripts, content security policy dan secure headers, serta penanganan data sensitif.