Einrichtung
Ein Tutorialprojekt einrichten
Einführung
Dies ist eine ausführlichere Schritt-für-Schritt-Anleitung zum Einrichten eines sehr einfachen Next.js-Projekts mit gt-next.
Wir führen Sie von Anfang bis Ende durch, von der Projekteinrichtung bis zur Übersetzung.
Im Verlauf dieses Tutorials steigern wir uns von einfachen zu fortgeschritteneren Konzepten.
Dieses Tutorial setzt grundlegende Kenntnisse in TypeScript, Next.js und React voraus.
Hier ist eine Liste der Themen, die wir in diesem Tutorial behandeln:
- Ein neues Next.js-Projekt einrichten
- Die <T>-Komponente verwenden, um eine App zu übersetzen
- Variable Komponenten wie <Var>,<Currency>,<DateTime>und<Num>verwenden, um dynamische Inhalte zu übersetzen
- Verzweigungskomponenten wie <Plural>und<Branch>verwenden, um bedingte Inhalte zu übersetzen
- i18n-Routing in Ihrer App verwenden
Unsere App ist eine einfache Anwendung, mit der wir den Wechselkurs zwischen Währungen prüfen können.
Wir verwenden ausschließlich Inline-Styles und die Bibliothek gt-next, um alles so minimal wie möglich zu halten.
Dieses Beispiel basiert auf dem Tutorial Currency Converter auf GeeksforGeeks.
Richten Sie Ihre Next.js-App ein
Erstellen wir zunächst eine neue Next.js-App. Das können Sie mit dem folgenden Befehl tun:
npx create-next-app@latestDies führt dich zum Einrichtungsassistenten, in dem du den Namen deiner App und die gewünschte Vorlage auswählen kannst.
Verwende für dieses Tutorial den Namen currencies und wähle „Ja“, wenn du gefragt wirst, ob du TypeScript verwenden möchtest.
Wechsle in das Projektverzeichnis, und starten wir die App!
cd currencies
npm install
npm run devDadurch wird die App unter http://localhost:3000 gestartet.
Fügen wir etwas Inhalt hinzu!
Da wir unsere App jetzt eingerichtet haben, überschreiben wir den Inhalt der App, um einen einfachen Währungsrechner anzuzeigen.
Kopiere einfach den folgenden Code in die Dateien src/app/page.tsx und src/app/layout.tsx.
Mach dir vorerst keine großen Gedanken darüber, wie das funktioniert. Der gesamte Code simuliert lediglich einen Abruf einer Währungs-API und zeigt den Wechselkurs zwischen zwei Währungen an.
"use client";
import { useEffect, useState, useCallback } from "react";
// Eine Zuordnung zwischen zwei Währungen und ihrem Wechselkurs (von -> zu)
type ExchTable = Record<string, Record<string, number>>;
const EXCH_RATES: ExchTable = {
  usd: { usd: 1, inr: 73.5, eur: 0.85, jpy: 105.45, gbp: 0.72 },
  inr: { usd: 0.014, inr: 1, eur: 0.012, jpy: 1.46, gbp: 0.01 },
  eur: { usd: 1.18, inr: 85.5, eur: 1, jpy: 123.5, gbp: 0.85 },
  jpy: { usd: 0.0095, inr: 0.68, eur: 0.0081, jpy: 1, gbp: 0.0068 },
  gbp: { usd: 1.39, inr: 99.5, eur: 1.17, jpy: 146.5, gbp: 1 },
};
// Einige Styles für den Button
const buttonStyle = {
  backgroundColor: "#007bff",
  color: "white",
  border: "none",
  padding: "10px 20px",
  cursor: "pointer",
  borderRadius: "5px",
  fontSize: "16px",
  margin: "20px",
};
/**
 * Diese Funktion simuliert eine API-Fetch-Anfrage, um den aktuellen Wechselkurs zu erhalten.
 * Wartet 1 Sekunde, bevor der Wechselkurs zurückgegeben wird.
 * @returns der Wechselkurs zwischen zwei Währungen
 */
async function fetchExchangeRate(from: string, to: string): Promise<number> {
  await new Promise((resolve) => setTimeout(resolve, 1000));
  return EXCH_RATES[from][to];
}
function Page() {
  // Wechselkurse
  const [info, setInfo] = useState<ExchTable>({});
  const options = ["usd", "inr", "eur", "jpy", "gbp"];
  // Währungen
  const [from, setFrom] = useState("usd");
  const [to, setTo] = useState("inr");
  // Werte
  const [input, setInput] = useState(0);
  const [output, setOutput] = useState(0);
  // Funktion zur Währungsumrechnung
  const convert = useCallback(() => {
    if (info?.[from]?.[to]) {
      const rate = info[from][to];
      setOutput(input * rate);
    } else {
      setOutput(0);
    }
  }, [info, input, to, from]);
  // API aufrufen, wenn sich die Ausgangs- oder Zielwährung ändert
  useEffect(() => {
    // Wenn der Wechselkurs bereits vorhanden ist, dann umrechnen
    if (info?.[from]?.[to]) {
      convert();
      return;
    }
    // Wechselkurs abrufen
    (async () => {
      const response = await fetchExchangeRate(from, to);
      // Neue Antwort hinzufügen, ohne alte Informationen zu überschreiben
      setInfo((prevInfo) => ({
        ...prevInfo,
        [from]: {
          ...(prevInfo?.[from] || undefined),
          [to]: response,
        },
      }));
    })();
  }, [from, to, convert, info]);
  // Convert aufrufen, wenn ein Benutzer die Währung wechselt
  useEffect(() => {
    convert();
  }, [info, convert]);
  // Funktion zum Wechseln zwischen zwei Währungen
  function flip() {
    const temp = from;
    setFrom(to);
    setTo(temp);
  }
  return (
    <div style={{ margin: "0 auto", width: "50%", textAlign: "center" }}>
      <div style={{ margin: "20px 0", paddingBottom: "20px" }}>
        <h1 style={{ fontSize: "2.5em", fontWeight: "bold" }}>
          Währungsrechner
        </h1>
      </div>
      <div style={{ flex: 2, textAlign: "center", margin: "20px 0" }}>
        <h3>Betrag</h3>
        <input
          type="text"
          placeholder="Betrag eingeben"
          style={{ textAlign: "center" }}
          onChange={(e) => {
            setInput(Number(e.target.value));
          }}
        />
      </div>
      <div
        style={{ display: "flex", justifyContent: "center", margin: "20px 0" }}
      >
        <div style={{ flex: 1, textAlign: "center" }}>
          <label htmlFor="from">
            <h3>Von</h3>
          </label>
          <select
            name="from"
            id="from"
            value={from}
            onChange={(e) => setFrom(e.target.value)}
          >
            {options.map((option) => (
              <option key={option} value={option}>
                {option.toUpperCase()}
              </option>
            ))}
          </select>
        </div>
        <div style={{ flex: 1, textAlign: "center" }}>
          <button
            onClick={() => {
              flip();
            }}
            style={buttonStyle}
          >
            Tauschen
          </button>
        </div>
        <div style={{ flex: 1, textAlign: "center" }}>
          <label htmlFor="to">
            <h3>Zu</h3>
          </label>
          <select
            name="to"
            id="to"
            value={to}
            onChange={(e) => setTo(e.target.value)}
          >
            {options.map((option) => (
              <option key={option} value={option}>
                {option.toUpperCase()}
              </option>
            ))}
          </select>
        </div>
      </div>
      <div style={{ margin: "0 auto", width: "50%", textAlign: "center" }}>
        <button
          onClick={() => {
            convert();
          }}
          style={buttonStyle}
        >
          Umrechnen
        </button>
        <h2>Umgerechneter Betrag:</h2>
        <p>{input + " " + from + " = " + output.toFixed(2) + " " + to}</p>
      </div>
    </div>
  );
}
export default Page;import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
const geistSans = Geist({
  variable: "--font-geist-sans",
  subsets: ["latin"],
});
const geistMono = Geist_Mono({
  variable: "--font-geist-mono",
  subsets: ["latin"],
});
export const metadata: Metadata = {
  title: "Währungsrechner",
  description: "Einfacher Währungsrechner",
};
export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <body
        className={`${geistSans.variable} ${geistMono.variable} antialiased`}
      >
        {children}
      </body>
    </html>
  );
}Fazit
Wie ist dieser Leitfaden?

