Server-side i18n (Laravel/Node) — i18n

Server-side i18n (Laravel/Node) i18n di backend penting untuk email, push notification, PDF generation, error messages API, dan konten yang di-render server-sid

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)
);

Yang akan kamu pelajari