Skip to main content

Japanisch und Spanisch zu einer Next.js-App hinzufügen

Devin installiert next-i18next, extrahiert hartcodierte Strings in Locale-JSON-Dateien, fügt japanische und spanische Übersetzungen hinzu und überprüft das Umschalten der Sprache im Browser.
AuthorCognition
CategoryFeature-Entwicklung
1

(Optional) Umfang der Codebasis mit Ask Devin festlegen

Wenn du dir unsicher bist, wie deine Next.js-App strukturiert ist oder welche Komponenten hardcodierte Strings enthalten, verwende Ask Devin, um dies zunächst zu analysieren:Du kannst auch direkt aus Ask Devin heraus eine Devin-Session starten; alle Informationen, die Devin dabei gesammelt hat, werden dann als Kontext übernommen.
2

i18n-Einrichtung starten

Internationalisierung zu einer Next.js-App hinzuzufügen bedeutet, Locale-Routing einzurichten, Middleware zu konfigurieren, jeden hartcodierten String zu extrahieren und Übersetzungsdateien zu erstellen – alles, bevor du auch nur einen einzigen Sprachwechsel testen kannst. Devin übernimmt die gesamte Pipeline: Installation von next-i18next, Konfiguration des Next.js-Locale-Routings, Extraktion von Strings aus Dutzenden von Komponenten und Verifizierung des Ergebnisses im Browser.Verwende den /plan-Slash-Befehl zu Beginn der Session, damit Devin zuerst deine Codebasis untersucht – es wird ermitteln, ob du den Pages Router oder den App Router verwendest, die richtige i18n-Bibliothek identifizieren und seinen Ansatz skizzieren, bevor Code geschrieben wird. Überprüfe den Plan und schlage Änderungen vor, bevor Devin startet.
3

So führt Devin die Einrichtung durch

Devin arbeitet sich systematisch durch deine Next.js-Codebasis – konfiguriert die i18n-Pipeline, extrahiert Strings und erstellt Locale-Dateien. Dabei geht Devin wie folgt vor:
  1. Installiert Abhängigkeiten — Führt npm install next-i18next i18next react-i18next aus und erstellt die Konfigurationsdateien:
// next-i18next.config.js
module.exports = {
  i18n: {
    defaultLocale: 'en',
    locales: ['en', 'es', 'ja'],
  },
};
// next.config.js
const { i18n } = require('./next-i18next.config');

module.exports = {
  i18n,
  // ...Ihre bestehende Konfiguration
};
  1. Scannt jede Komponente — Liest jede Datei in components/ und pages/ und identifiziert hartcodierten Text in JSX, Attributen wie placeholder und aria-label, Template-Literalen und Fehlermeldungen
  2. Erstellt Locale-Dateien — Erzeugt strukturierte JSON-Dateien unter public/locales/:
// public/locales/en/common.json
{
  "common": {
    "save": "Save",
    "cancel": "Cancel",
    "loading": "Loading..."
  },
  "auth": {
    "login": "Log in",
    "signup": "Create account",
    "forgotPassword": "Forgot your password?"
  },
  "dashboard": {
    "welcome": "Welcome back, {{name}}",
    "items_one": "{{count}} item",
    "items_other": "{{count}} items"
  }
}
// public/locales/ja/common.json
{
  "common": {
    "save": "保存",
    "cancel": "キャンセル",
    "loading": "読み込み中..."
  },
  "auth": {
    "login": "ログイン",
    "signup": "アカウント作成",
    "forgotPassword": "パスワードをお忘れですか?"
  },
  "dashboard": {
    "welcome": "おかえりなさい、{{name}}",
    "items_one": "{{count}} 件",
    "items_other": "{{count}} 件"
  }
}
// public/locales/es/common.json
{
  "common": {
    "save": "Guardar",
    "cancel": "Cancelar",
    "loading": "Cargando..."
  },
  "auth": {
    "login": "Iniciar sesión",
    "signup": "Crear cuenta",
    "forgotPassword": "¿Olvidaste tu contraseña?"
  },
  "dashboard": {
    "welcome": "Bienvenido de nuevo, {{name}}",
    "items_one": "{{count}} elemento",
    "items_other": "{{count}} elementos"
  }
}
  1. Ersetzt Strings direkt im Code — Wrappt jede Komponente mit useTranslation('common') und ersetzt fest codierten Text durch t()-Aufrufe, inklusive Interpolation für dynamische Werte wie t('dashboard.welcome', { name: user.name })
  2. Richtet serverseitiges Laden ein — Fügt jeder Seite serverSideTranslations hinzu, damit Übersetzungen beim Rendern verfügbar sind:
// pages/dashboard.tsx
import { serverSideTranslations } from 'next-i18next/serverSideTranslations';

export const getStaticProps = async ({ locale }) => ({
  props: {
    ...(await serverSideTranslations(locale, ['common'])),
  },
});
  1. Fügt den Sprachumschalter hinzu — Erstellt ein Dropdown-Menü in der Navigationsleiste, das die Locale-Umschaltung des Next.js-Routers nutzt:
// components/LanguageSwitcher.tsx
import { useRouter } from 'next/router';

export default function LanguageSwitcher() {
  const router = useRouter();

  const switchLocale = (locale: string) => {
    router.push(router.pathname, router.asPath, { locale });
  };

  return (
    <select
      value={router.locale}
      onChange={(e) => switchLocale(e.target.value)}
    >
      <option value="en">English</option>
      <option value="es">Español</option>
      <option value="ja">日本語</option>
    </select>
  );
}
4

Testen und iterieren

Devin führt npm run dev aus, öffnet die App in seinem integrierten Browser und navigiert zwischen den Routen /en, /es und /ja, um sicherzustellen, dass alles funktioniert. Wenn etwas nicht funktioniert – eine fehlende Übersetzung, ein Layout, das überläuft, eine Route, die einen 404 zurückgibt – behebt Devin das Problem und testet automatisch erneut.Verwende jederzeit den /test-Slash-Befehl, um Devin anzuweisen, alle Tests erneut auszuführen und im Browser erneut zu verifizieren. Verwende /review vor dem finalen PR, damit Devin seinen eigenen Code auf übersehene Strings, inkonsistente Schlüsselnamen oder fehlende serverSideTranslations-Aufrufe prüft.Devin prüft:
  • Alle sichtbaren Texte sind übersetzt (keine übrig gebliebenen englischen Strings im Spanisch-/Japanisch-Modus)
  • Layouts brechen nicht mit längeren spanischen Strings oder breiteren japanischen Zeichen
  • Der Sprachumschalter wechselt zwischen allen drei Locales
  • Interpolierte Werte (Benutzernamen, Zählwerte) werden in jedem Locale korrekt ausgegeben
  • Pluralisierungsregeln funktionieren (z. B. “1 item” → “1 件” auf Japanisch, “1 elemento” auf Spanisch)
  • Das Next.js-Locale-Routing funktioniert – /ja/dashboard zeigt die japanische Version
5

Von hier aus iterieren

Sobald das grundlegende i18n-Setup steht, erweitern Sie es in einem Folgeschritt.
6

Aktualisieren Sie Ihr Repository-Setup

Diese Aufgabe installiert neue Abhängigkeiten (next-i18next, i18next, react-i18next). Nachdem der PR gemergt wurde, aktualisiere dein Repo-Setup, damit Devins Environment-Snapshot diese Pakete für zukünftige Sessions enthält:
  1. Gehe zu Settings > Devin’s Environment > Repositories
  2. Wähle dein Repo aus und klicke auf Configure
  3. Stelle unter Upkeep > Maintain dependencies sicher, dass dein Installationsbefehl (z. B. npm ci) konfiguriert ist
  4. Klicke auf Save, um den Snapshot zu aktualisieren
Du kannst auch eine Upkeep Frequency festlegen, damit Devin die Installation der Abhängigkeiten automatisch nach einem Zeitplan erneut ausführt – so bleibt der Snapshot aktuell, während sich deine package.json weiterentwickelt, und zukünftige Sessions verschwenden keine Zeit mit der Installation von Paketen beim Start.
7

Überprüfen Sie den Pull Request (PR) mithilfe von Devin Review

Sobald Devin den PR erstellt hat, nutze Devin Review, um die i18n-Änderungen zu prüfen. Devin Review kann übersehene hardcodierte Strings, inkonsistente Benennungen von Übersetzungsschlüsseln und fehlende serverSideTranslations-Aufrufe auf verschiedenen Seiten aufspüren.