Server-side i18n (Laravel/Node)
i18n di backend penting untuk email, push notification, PDF generation, error messages API, dan konten yang di-render server-side.
Laravel i18n
// Struktur file terjemahan
lang/
├── en/
│ ├── auth.php
│ ├── pagination.php
│ └── validation.php
├── id/
│ ├── auth.php
│ ├── pagination.php
│ └── validation.php
└── en.json // Single file untuk simple strings
// lang/id/auth.php
return [
"failed" => "Kredensial ini tidak cocok dengan data kami.",
"throttle" => "Terlalu banyak percobaan login. Silakan coba lagi dalam :seconds detik.",
];
// lang/id.json
{
"Welcome": "Selamat Datang",
"Hello :name": "Halo :name"
}
Menggunakan Terjemahan di Laravel
// Helper function
echo __("Welcome"); // "Selamat Datang"
echo __("Hello :name", ["name" => "Ahmad"]); // "Halo Ahmad"
// trans() — sama dengan __()
echo trans("auth.failed");
// "Kredensial ini tidak cocok dengan data kami."
// trans_choice() — pluralisasi
// lang/id/messages.php
// "apples" => "{0} Tidak ada apel|[1,5] :count apel|[6,*] Banyak apel"
echo trans_choice("messages.apples", 3); // "3 apel"
echo trans_choice("messages.apples", 10); // "Banyak apel"
// Blade template
{{ __("Welcome") }}
@lang("auth.failed")
{{ trans_choice("messages.apples", $count) }}
Detect & Set Locale
// Middleware untuk set locale dari Accept-Language header
// app/Http/Middleware/SetLocale.php
class SetLocale
{
public function handle(Request $request, Closure $next)
{
// Priority: 1) User preference, 2) Header, 3) Default
if ($user = $request->user()) {
$locale = $user->locale;
} else {
$locale = $request->getPreferredLanguage(["id", "en", "ja"]);
}
App::setLocale($locale ?? config("app.locale"));
return $next($request);
}
}
// API: Accept-Language header
// Accept-Language: id-ID,id;q=0.9,en;q=0.8
Node.js i18n (i18next)
// Server-side i18next
import i18next from "i18next";
import Backend from "i18next-fs-backend";
await i18next.use(Backend).init({
lng: "id",
fallbackLng: "en",
backend: {
loadPath: "./locales/{{lng}}/{{ns}}.json",
},
});
// Express middleware
app.use((req, res, next) => {
const lang = req.headers["accept-language"]?.split(",")[0]?.split("-")[0];
req.t = i18next.getFixedT(lang || "en");
next();
});
// Usage in route
app.get("/api/greeting", (req, res) => {
res.json({ message: req.t("greeting", { name: "Ahmad" }) });
});
Email & Notification i18n
// Laravel: set locale untuk notification
class OrderConfirmation extends Notification
{
public function toMail($notifiable)
{
return (new MailMessage)
->subject(__("orders.confirmation_subject"))
->greeting(__("Hello :name", ["name" => $notifiable->name]))
->line(__("orders.confirmation_body", [
"order_id" => $this->order->id
]));
}
}
// Set locale per user saat mengirim
$user->notify(
(new OrderConfirmation($order))->locale($user->locale)
);