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 steigen wir von einfachen zu fortgeschrittenen Konzepten auf.
Dieses Tutorial setzt ein allgemeines Verständnis von TypeScript, Next.js und React voraus.
Hier ist eine Liste der Themen, die wir in diesem Tutorial behandeln:
- Ein neues Next.js-Projekt einrichten
- Verwendung der
<T>-Komponente, um eine App zu übersetzen - Verwendung von Variablenkomponenten wie
<Var>,<Currency>,<DateTime>und<Num>, um dynamische Inhalte zu übersetzen - Verwendung von Verzweigungskomponenten wie
<Plural>und<Branch>, um bedingte Inhalte zu übersetzen - Verwendung von i18n-Routing in Ihrer App
Unsere App ist eine einfache Anwendung, mit der wir den Wechselkurs zwischen Währungen prüfen können.
Wir verwenden ausschließlich Inline-Styling und die Bibliothek gt-next, um alles so minimal wie möglich zu halten.
Dieses Beispiel basiert auf dem Tutorial Currency Converter von GeeksforGeeks.
Richten Sie Ihre Next-App ein
Erstellen wir zunächst eine neue Next.js-App. Führen Sie dazu den folgenden Befehl aus:
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 „Yes“, wenn du gefragt wirst, ob du TypeScript verwenden möchtest.
Wechsle in das Projektverzeichnis und starte die App!
cd currencies
npm install
npm run devDamit wird die App unter http://localhost:3000 gestartet.
Fügen wir etwas Inhalt hinzu!
Jetzt, da unsere App eingerichtet ist, überschreiben wir ihren Inhalt, um einen einfachen Währungsrechner anzuzeigen.
Kopiere einfach den folgenden Code in die Datei src/app/page.tsx und in die Datei src/app/layout.tsx.
Mach dir vorerst keine allzu großen Gedanken darüber, wie das funktioniert. Dieser 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 Stile 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-Anfrage, um den aktuellen Wechselkurs abzurufen.
* 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-Aufruf bei Änderung der Ausgangs- oder Zielwährung
useEffect(() => {
// Wenn der Wechselkurs bereits vorhanden ist, 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]);
// Umrechnung aufrufen, wenn der 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>Nach</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: "Ein 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 diese Anleitung?