feat(i18n): extract strings from navigation, dialogs, onboarding, settings, and login

- Add useTranslation() to TopNav, BottomTabBar, FabMenu, UserMenu
- Internationalize ConfirmDialog, AuthPromptModal, ExternalLinkDialog
- Extract all onboarding flow strings (Welcome, HobbyPicker, ItemBrowser, Review, Done)
- Internationalize settings page (weight unit, currency, API keys, import/export)
- Internationalize login page and root error boundary
- All dialogs in __root.tsx use t() for UI chrome

Phase 34, Plan 02 (core navigation and global UI)
This commit is contained in:
2026-04-13 18:19:29 +02:00
parent 8c0fb31df2
commit 672b17fd13
15 changed files with 123 additions and 98 deletions

View File

@@ -1,4 +1,5 @@
import { HOBBIES } from "@/shared/hobbyConfig";
import { useTranslation } from "react-i18next";
import { HobbyCard } from "./HobbyCard";
interface OnboardingHobbyPickerProps {
@@ -12,14 +13,15 @@ export function OnboardingHobbyPicker({
onToggleHobby,
onContinue,
}: OnboardingHobbyPickerProps) {
const { t } = useTranslation("onboarding");
return (
<div className="flex flex-col items-center justify-center min-h-screen px-8">
<div className="max-w-2xl text-center">
<h1 className="text-3xl font-bold text-gray-900 mb-2">
What are you into?
{t("hobby.title")}
</h1>
<p className="text-base text-gray-500 mb-8">
Pick one or more we'll show you popular gear for each.
{t("hobby.subtitle")}
</p>
<div className="flex flex-wrap justify-center gap-4 mb-8">
{HOBBIES.map((hobby) => (
@@ -39,7 +41,7 @@ export function OnboardingHobbyPicker({
disabled={selectedHobbies.length === 0}
className="px-8 py-3 bg-gray-700 hover:bg-gray-800 disabled:opacity-50 disabled:cursor-not-allowed text-white font-medium rounded-lg transition-colors"
>
Continue
{t("hobby.continue")}
</button>
</div>
</div>